From 49826ea52c056858a0ec1aac6188dcbce15b7798 Mon Sep 17 00:00:00 2001 From: Quincey Koziol Date: Thu, 25 Mar 2010 07:49:23 -0500 Subject: [svn-r18452] Description: Finish renaming cache-related files & symbols on metadata journaling branch. Metadata cache-related symbols/files with no suffix now have a '1' suffix and symbols/files with a '2' suffix now have no suffix. Tested on: Mac OS X/32 10.6.2 (amazon) w/debug, prod & parallel (h5committest not required on this branch) --- MANIFEST | 148 +- config/gnu-flags | 4 +- configure | 2 +- examples/mdj_api_example.c | 16 +- src/H5.c | 4 +- src/H5A.c | 74 +- src/H5AC.c | 5680 +++++ src/H5AC1.c | 134 +- src/H5AC2.c | 5685 ----- src/H5AC2pkg.h | 333 - src/H5AC2private.h | 393 - src/H5AC2public.h | 529 - src/H5ACpkg.h | 326 + src/H5ACprivate.h | 393 + src/H5ACpublic.h | 529 + src/H5Adeprec.c | 14 +- src/H5Atest.c | 4 +- src/H5B.c | 152 +- src/H5B2.c | 118 +- src/H5B2cache.c | 24 +- src/H5B2dbg.c | 20 +- src/H5B2int.c | 244 +- src/H5B2pkg.h | 26 +- src/H5B2stat.c | 4 +- src/H5B2test.c | 18 +- src/H5Bcache.c | 8 +- src/H5Bpkg.h | 8 +- src/H5C.c | 9609 ++++++++ src/H5C2.c | 9609 -------- src/H5C2journal.c | 8835 ------- src/H5C2pkg.h | 4924 ---- src/H5C2private.h | 1688 -- src/H5C2public.h | 62 - src/H5Cjournal.c | 8835 +++++++ src/H5Cpkg.h | 4924 ++++ src/H5Cprivate.h | 1688 ++ src/H5Cpublic.h | 62 + src/H5D.c | 28 +- src/H5Dchunk.c | 10 +- src/H5Dcontig.c | 4 +- src/H5Ddbg.c | 4 +- src/H5Ddeprec.c | 12 +- src/H5Dfill.c | 4 +- src/H5Dint.c | 24 +- src/H5Dio.c | 2 +- src/H5F.c | 108 +- src/H5FDmpiposix.c | 4 +- src/H5FS.c | 42 +- src/H5FScache.c | 14 +- src/H5FSdbg.c | 10 +- src/H5FSpkg.h | 10 +- src/H5FSsection.c | 36 +- src/H5Fmount.c | 10 +- src/H5Fpkg.h | 10 +- src/H5Fpublic.h | 6 +- src/H5Fsuper.c | 4 +- src/H5Ftest.c | 2 +- src/H5G.c | 36 +- src/H5Gdeprec.c | 52 +- src/H5Gnode.c | 76 +- src/H5Gobj.c | 4 +- src/H5Gstab.c | 18 +- src/H5Gtest.c | 46 +- src/H5HF.c | 14 +- src/H5HFcache.c | 34 +- src/H5HFdbg.c | 24 +- src/H5HFdblock.c | 30 +- src/H5HFhdr.c | 28 +- src/H5HFiblock.c | 58 +- src/H5HFiter.c | 4 +- src/H5HFman.c | 30 +- src/H5HFpkg.h | 22 +- src/H5HFsection.c | 26 +- src/H5HG.c | 46 +- src/H5HGcache.c | 8 +- src/H5HGdbg.c | 8 +- src/H5HGpkg.h | 6 +- src/H5HL.c | 70 +- src/H5HLcache.c | 12 +- src/H5HLdbg.c | 4 +- src/H5HLint.c | 2 +- src/H5HLpkg.h | 8 +- src/H5HLprivate.h | 4 +- src/H5I.c | 8 +- src/H5L.c | 58 +- src/H5Lexternal.c | 18 +- src/H5MF.c | 10 +- src/H5O.c | 140 +- src/H5Oalloc.c | 52 +- src/H5Oattribute.c | 52 +- src/H5Ocache.c | 8 +- src/H5Ochunk.c | 24 +- src/H5Ocopy.c | 16 +- src/H5Odbg.c | 4 +- src/H5Oefl.c | 6 +- src/H5Ofill.c | 6 +- src/H5Omdj_msg.c | 6 +- src/H5Omessage.c | 38 +- src/H5Opkg.h | 14 +- src/H5Oprivate.h | 8 +- src/H5Otest.c | 38 +- src/H5Pdcpl.c | 8 +- src/H5Pfapl.c | 18 +- src/H5Ppublic.h | 6 +- src/H5R.c | 14 +- src/H5Rdeprec.c | 4 +- src/H5S.c | 2 +- src/H5SM.c | 82 +- src/H5SMcache.c | 12 +- src/H5SMpkg.h | 10 +- src/H5SMtest.c | 6 +- src/H5T.c | 364 +- src/H5Tcommit.c | 14 +- src/H5Tdeprec.c | 8 +- src/H5Zscaleoffset.c | 4 +- src/H5config.h.in | 5 +- src/H5private.h | 10 +- src/Makefile.am | 8 +- src/Makefile.in | 18 +- src/hdf5.h | 2 +- test/Makefile.am | 12 +- test/Makefile.in | 94 +- test/cache.c | 29322 +++++++++++++++++++++++ test/cache1.c | 8398 +++---- test/cache1_api.c | 790 +- test/cache1_common.c | 1250 +- test/cache1_common.h | 126 +- test/cache2.c | 29322 ----------------------- test/cache2_api.c | 3633 --- test/cache2_common.c | 5876 ----- test/cache2_common.h | 978 - test/cache2_jnl_file_marking.c | 3605 --- test/cache2_journal.c | 14066 ----------- test/cache_api.c | 3633 +++ test/cache_common.c | 5876 +++++ test/cache_common.h | 978 + test/cache_jnl_file_marking.c | 3605 +++ test/cache_journal.c | 14066 +++++++++++ test/lheap.c | 6 +- test/ohdr.c | 10 +- test/testfiles/cache2_journal_bsc00_000.jnl.gz | Bin 217 -> 0 bytes test/testfiles/cache2_journal_bsc00_001.jnl.gz | Bin 237 -> 0 bytes test/testfiles/cache2_journal_bsc00_002.jnl.gz | Bin 252 -> 0 bytes test/testfiles/cache2_journal_bsc00_003.jnl.gz | Bin 309 -> 0 bytes test/testfiles/cache2_journal_bsc00_004.jnl.gz | Bin 370 -> 0 bytes test/testfiles/cache2_journal_bsc00_005.jnl.gz | Bin 466 -> 0 bytes test/testfiles/cache2_journal_bsc00_006.jnl.gz | Bin 492 -> 0 bytes test/testfiles/cache2_journal_bsc00_007.jnl.gz | Bin 672 -> 0 bytes test/testfiles/cache2_journal_bsc00_008.jnl.gz | Bin 933 -> 0 bytes test/testfiles/cache2_journal_bsc00_009.jnl.gz | Bin 1163 -> 0 bytes test/testfiles/cache2_journal_bsc00_010.jnl.gz | Bin 1389 -> 0 bytes test/testfiles/cache2_journal_bsc00_011.jnl.gz | Bin 289 -> 0 bytes test/testfiles/cache2_journal_bsc00_012.jnl.gz | Bin 339 -> 0 bytes test/testfiles/cache2_journal_bsc00_013.jnl.gz | Bin 442 -> 0 bytes test/testfiles/cache2_journal_bsc00_014.jnl.gz | Bin 614 -> 0 bytes test/testfiles/cache2_journal_bsc00_015.jnl.gz | Bin 202 -> 0 bytes test/testfiles/cache2_journal_bsc00_016.jnl.gz | Bin 227 -> 0 bytes test/testfiles/cache2_journal_bsc00_017.jnl.gz | Bin 206 -> 0 bytes test/testfiles/cache2_journal_bsc00_018.jnl.gz | Bin 225 -> 0 bytes test/testfiles/cache2_journal_bsc01_000.jnl.gz | Bin 4818 -> 0 bytes test/testfiles/cache2_journal_bsc01_001.jnl.gz | Bin 4699 -> 0 bytes test/testfiles/cache2_journal_bsc01_002.jnl.gz | Bin 4172 -> 0 bytes test/testfiles/cache2_journal_bsc01_003.jnl.gz | Bin 12769 -> 0 bytes test/testfiles/cache2_journal_bsc01_004.jnl.gz | Bin 11939 -> 0 bytes test/testfiles/cache2_journal_bsc02_000.jnl.gz | Bin 6932 -> 0 bytes test/testfiles/cache2_journal_bsc02_001.jnl.gz | Bin 12318 -> 0 bytes test/testfiles/cache2_journal_bsc02_002.jnl.gz | Bin 12468 -> 0 bytes test/testfiles/cache2_journal_bsc02_003.jnl.gz | Bin 49627 -> 0 bytes test/testfiles/cache2_journal_bsc02_004.jnl.gz | Bin 48362 -> 0 bytes test/testfiles/cache2_journal_sc00_000.jnl.gz | Bin 236 -> 0 bytes test/testfiles/cache2_journal_sc00_001.jnl.gz | Bin 249 -> 0 bytes test/testfiles/cache2_journal_sc00_002.jnl.gz | Bin 251 -> 0 bytes test/testfiles/cache2_journal_sc00_003.jnl.gz | Bin 285 -> 0 bytes test/testfiles/cache2_journal_sc00_004.jnl.gz | Bin 319 -> 0 bytes test/testfiles/cache2_journal_sc00_005.jnl.gz | Bin 377 -> 0 bytes test/testfiles/cache2_journal_sc00_006.jnl.gz | Bin 395 -> 0 bytes test/testfiles/cache2_journal_sc00_007.jnl.gz | Bin 644 -> 0 bytes test/testfiles/cache2_journal_sc00_008.jnl.gz | Bin 1025 -> 0 bytes test/testfiles/cache2_journal_sc00_009.jnl.gz | Bin 1426 -> 0 bytes test/testfiles/cache2_journal_sc00_010.jnl.gz | Bin 1818 -> 0 bytes test/testfiles/cache2_journal_sc00_011.jnl.gz | Bin 344 -> 0 bytes test/testfiles/cache2_journal_sc00_012.jnl.gz | Bin 416 -> 0 bytes test/testfiles/cache2_journal_sc00_013.jnl.gz | Bin 534 -> 0 bytes test/testfiles/cache2_journal_sc00_014.jnl.gz | Bin 780 -> 0 bytes test/testfiles/cache2_journal_sc00_015.jnl.gz | Bin 223 -> 0 bytes test/testfiles/cache2_journal_sc00_016.jnl.gz | Bin 242 -> 0 bytes test/testfiles/cache2_journal_sc00_017.jnl.gz | Bin 219 -> 0 bytes test/testfiles/cache2_journal_sc00_018.jnl.gz | Bin 222 -> 0 bytes test/testfiles/cache2_journal_sc01_000.jnl.gz | Bin 9241 -> 0 bytes test/testfiles/cache2_journal_sc01_001.jnl.gz | Bin 9221 -> 0 bytes test/testfiles/cache2_journal_sc01_002.jnl.gz | Bin 8736 -> 0 bytes test/testfiles/cache2_journal_sc01_003.jnl.gz | Bin 26010 -> 0 bytes test/testfiles/cache2_journal_sc01_004.jnl.gz | Bin 24118 -> 0 bytes test/testfiles/cache2_journal_sc02_000.jnl.gz | Bin 13042 -> 0 bytes test/testfiles/cache2_journal_sc02_001.jnl.gz | Bin 23097 -> 0 bytes test/testfiles/cache2_journal_sc02_002.jnl.gz | Bin 23462 -> 0 bytes test/testfiles/cache2_journal_sc02_003.jnl.gz | Bin 99122 -> 0 bytes test/testfiles/cache2_journal_sc02_004.jnl.gz | Bin 96402 -> 0 bytes test/testfiles/cache_journal_bsc00_000.jnl.gz | Bin 0 -> 217 bytes test/testfiles/cache_journal_bsc00_001.jnl.gz | Bin 0 -> 237 bytes test/testfiles/cache_journal_bsc00_002.jnl.gz | Bin 0 -> 252 bytes test/testfiles/cache_journal_bsc00_003.jnl.gz | Bin 0 -> 309 bytes test/testfiles/cache_journal_bsc00_004.jnl.gz | Bin 0 -> 370 bytes test/testfiles/cache_journal_bsc00_005.jnl.gz | Bin 0 -> 466 bytes test/testfiles/cache_journal_bsc00_006.jnl.gz | Bin 0 -> 492 bytes test/testfiles/cache_journal_bsc00_007.jnl.gz | Bin 0 -> 672 bytes test/testfiles/cache_journal_bsc00_008.jnl.gz | Bin 0 -> 933 bytes test/testfiles/cache_journal_bsc00_009.jnl.gz | Bin 0 -> 1163 bytes test/testfiles/cache_journal_bsc00_010.jnl.gz | Bin 0 -> 1389 bytes test/testfiles/cache_journal_bsc00_011.jnl.gz | Bin 0 -> 289 bytes test/testfiles/cache_journal_bsc00_012.jnl.gz | Bin 0 -> 339 bytes test/testfiles/cache_journal_bsc00_013.jnl.gz | Bin 0 -> 442 bytes test/testfiles/cache_journal_bsc00_014.jnl.gz | Bin 0 -> 614 bytes test/testfiles/cache_journal_bsc00_015.jnl.gz | Bin 0 -> 202 bytes test/testfiles/cache_journal_bsc00_016.jnl.gz | Bin 0 -> 227 bytes test/testfiles/cache_journal_bsc00_017.jnl.gz | Bin 0 -> 206 bytes test/testfiles/cache_journal_bsc00_018.jnl.gz | Bin 0 -> 225 bytes test/testfiles/cache_journal_bsc01_000.jnl.gz | Bin 0 -> 4818 bytes test/testfiles/cache_journal_bsc01_001.jnl.gz | Bin 0 -> 4699 bytes test/testfiles/cache_journal_bsc01_002.jnl.gz | Bin 0 -> 4172 bytes test/testfiles/cache_journal_bsc01_003.jnl.gz | Bin 0 -> 12769 bytes test/testfiles/cache_journal_bsc01_004.jnl.gz | Bin 0 -> 11939 bytes test/testfiles/cache_journal_bsc02_000.jnl.gz | Bin 0 -> 6932 bytes test/testfiles/cache_journal_bsc02_001.jnl.gz | Bin 0 -> 12318 bytes test/testfiles/cache_journal_bsc02_002.jnl.gz | Bin 0 -> 12468 bytes test/testfiles/cache_journal_bsc02_003.jnl.gz | Bin 0 -> 49627 bytes test/testfiles/cache_journal_bsc02_004.jnl.gz | Bin 0 -> 48362 bytes test/testfiles/cache_journal_sc00_000.jnl.gz | Bin 0 -> 236 bytes test/testfiles/cache_journal_sc00_001.jnl.gz | Bin 0 -> 249 bytes test/testfiles/cache_journal_sc00_002.jnl.gz | Bin 0 -> 251 bytes test/testfiles/cache_journal_sc00_003.jnl.gz | Bin 0 -> 285 bytes test/testfiles/cache_journal_sc00_004.jnl.gz | Bin 0 -> 319 bytes test/testfiles/cache_journal_sc00_005.jnl.gz | Bin 0 -> 377 bytes test/testfiles/cache_journal_sc00_006.jnl.gz | Bin 0 -> 395 bytes test/testfiles/cache_journal_sc00_007.jnl.gz | Bin 0 -> 644 bytes test/testfiles/cache_journal_sc00_008.jnl.gz | Bin 0 -> 1025 bytes test/testfiles/cache_journal_sc00_009.jnl.gz | Bin 0 -> 1426 bytes test/testfiles/cache_journal_sc00_010.jnl.gz | Bin 0 -> 1818 bytes test/testfiles/cache_journal_sc00_011.jnl.gz | Bin 0 -> 344 bytes test/testfiles/cache_journal_sc00_012.jnl.gz | Bin 0 -> 416 bytes test/testfiles/cache_journal_sc00_013.jnl.gz | Bin 0 -> 534 bytes test/testfiles/cache_journal_sc00_014.jnl.gz | Bin 0 -> 780 bytes test/testfiles/cache_journal_sc00_015.jnl.gz | Bin 0 -> 223 bytes test/testfiles/cache_journal_sc00_016.jnl.gz | Bin 0 -> 242 bytes test/testfiles/cache_journal_sc00_017.jnl.gz | Bin 0 -> 219 bytes test/testfiles/cache_journal_sc00_018.jnl.gz | Bin 0 -> 222 bytes test/testfiles/cache_journal_sc01_000.jnl.gz | Bin 0 -> 9241 bytes test/testfiles/cache_journal_sc01_001.jnl.gz | Bin 0 -> 9221 bytes test/testfiles/cache_journal_sc01_002.jnl.gz | Bin 0 -> 8736 bytes test/testfiles/cache_journal_sc01_003.jnl.gz | Bin 0 -> 26010 bytes test/testfiles/cache_journal_sc01_004.jnl.gz | Bin 0 -> 24118 bytes test/testfiles/cache_journal_sc02_000.jnl.gz | Bin 0 -> 13042 bytes test/testfiles/cache_journal_sc02_001.jnl.gz | Bin 0 -> 23097 bytes test/testfiles/cache_journal_sc02_002.jnl.gz | Bin 0 -> 23462 bytes test/testfiles/cache_journal_sc02_003.jnl.gz | Bin 0 -> 99122 bytes test/testfiles/cache_journal_sc02_004.jnl.gz | Bin 0 -> 96402 bytes test/testfiles/err_compat_1 | 4 +- test/testfiles/error_test_1 | 8 +- test/testjnlfilemarking.sh | 16 +- testpar/Makefile.am | 2 +- testpar/Makefile.in | 24 +- testpar/t_cache.c | 6114 +++++ testpar/t_cache1.c | 8 +- testpar/t_cache2.c | 6115 ----- tools/h5recover/README | 4 +- tools/h5recover/enable_journaling.c | 4 +- tools/h5recover/h5recover.c | 72 +- tools/h5recover/trecover_writer.c | 4 +- 268 files changed, 102626 insertions(+), 102636 deletions(-) create mode 100644 src/H5AC.c delete mode 100644 src/H5AC2.c delete mode 100644 src/H5AC2pkg.h delete mode 100644 src/H5AC2private.h delete mode 100644 src/H5AC2public.h create mode 100644 src/H5ACpkg.h create mode 100644 src/H5ACprivate.h create mode 100644 src/H5ACpublic.h create mode 100644 src/H5C.c delete mode 100644 src/H5C2.c delete mode 100644 src/H5C2journal.c delete mode 100644 src/H5C2pkg.h delete mode 100644 src/H5C2private.h delete mode 100644 src/H5C2public.h create mode 100644 src/H5Cjournal.c create mode 100644 src/H5Cpkg.h create mode 100644 src/H5Cprivate.h create mode 100644 src/H5Cpublic.h create mode 100644 test/cache.c delete mode 100644 test/cache2.c delete mode 100644 test/cache2_api.c delete mode 100644 test/cache2_common.c delete mode 100644 test/cache2_common.h delete mode 100644 test/cache2_jnl_file_marking.c delete mode 100644 test/cache2_journal.c create mode 100644 test/cache_api.c create mode 100644 test/cache_common.c create mode 100644 test/cache_common.h create mode 100644 test/cache_jnl_file_marking.c create mode 100644 test/cache_journal.c delete mode 100755 test/testfiles/cache2_journal_bsc00_000.jnl.gz delete mode 100755 test/testfiles/cache2_journal_bsc00_001.jnl.gz delete mode 100755 test/testfiles/cache2_journal_bsc00_002.jnl.gz delete mode 100755 test/testfiles/cache2_journal_bsc00_003.jnl.gz delete mode 100755 test/testfiles/cache2_journal_bsc00_004.jnl.gz delete mode 100755 test/testfiles/cache2_journal_bsc00_005.jnl.gz delete mode 100755 test/testfiles/cache2_journal_bsc00_006.jnl.gz delete mode 100755 test/testfiles/cache2_journal_bsc00_007.jnl.gz delete mode 100755 test/testfiles/cache2_journal_bsc00_008.jnl.gz delete mode 100755 test/testfiles/cache2_journal_bsc00_009.jnl.gz delete mode 100755 test/testfiles/cache2_journal_bsc00_010.jnl.gz delete mode 100755 test/testfiles/cache2_journal_bsc00_011.jnl.gz delete mode 100755 test/testfiles/cache2_journal_bsc00_012.jnl.gz delete mode 100755 test/testfiles/cache2_journal_bsc00_013.jnl.gz delete mode 100755 test/testfiles/cache2_journal_bsc00_014.jnl.gz delete mode 100755 test/testfiles/cache2_journal_bsc00_015.jnl.gz delete mode 100755 test/testfiles/cache2_journal_bsc00_016.jnl.gz delete mode 100755 test/testfiles/cache2_journal_bsc00_017.jnl.gz delete mode 100755 test/testfiles/cache2_journal_bsc00_018.jnl.gz delete mode 100755 test/testfiles/cache2_journal_bsc01_000.jnl.gz delete mode 100755 test/testfiles/cache2_journal_bsc01_001.jnl.gz delete mode 100755 test/testfiles/cache2_journal_bsc01_002.jnl.gz delete mode 100755 test/testfiles/cache2_journal_bsc01_003.jnl.gz delete mode 100755 test/testfiles/cache2_journal_bsc01_004.jnl.gz delete mode 100755 test/testfiles/cache2_journal_bsc02_000.jnl.gz delete mode 100755 test/testfiles/cache2_journal_bsc02_001.jnl.gz delete mode 100755 test/testfiles/cache2_journal_bsc02_002.jnl.gz delete mode 100755 test/testfiles/cache2_journal_bsc02_003.jnl.gz delete mode 100755 test/testfiles/cache2_journal_bsc02_004.jnl.gz delete mode 100755 test/testfiles/cache2_journal_sc00_000.jnl.gz delete mode 100755 test/testfiles/cache2_journal_sc00_001.jnl.gz delete mode 100755 test/testfiles/cache2_journal_sc00_002.jnl.gz delete mode 100755 test/testfiles/cache2_journal_sc00_003.jnl.gz delete mode 100755 test/testfiles/cache2_journal_sc00_004.jnl.gz delete mode 100755 test/testfiles/cache2_journal_sc00_005.jnl.gz delete mode 100755 test/testfiles/cache2_journal_sc00_006.jnl.gz delete mode 100755 test/testfiles/cache2_journal_sc00_007.jnl.gz delete mode 100755 test/testfiles/cache2_journal_sc00_008.jnl.gz delete mode 100755 test/testfiles/cache2_journal_sc00_009.jnl.gz delete mode 100755 test/testfiles/cache2_journal_sc00_010.jnl.gz delete mode 100755 test/testfiles/cache2_journal_sc00_011.jnl.gz delete mode 100755 test/testfiles/cache2_journal_sc00_012.jnl.gz delete mode 100755 test/testfiles/cache2_journal_sc00_013.jnl.gz delete mode 100755 test/testfiles/cache2_journal_sc00_014.jnl.gz delete mode 100755 test/testfiles/cache2_journal_sc00_015.jnl.gz delete mode 100755 test/testfiles/cache2_journal_sc00_016.jnl.gz delete mode 100755 test/testfiles/cache2_journal_sc00_017.jnl.gz delete mode 100755 test/testfiles/cache2_journal_sc00_018.jnl.gz delete mode 100755 test/testfiles/cache2_journal_sc01_000.jnl.gz delete mode 100755 test/testfiles/cache2_journal_sc01_001.jnl.gz delete mode 100755 test/testfiles/cache2_journal_sc01_002.jnl.gz delete mode 100755 test/testfiles/cache2_journal_sc01_003.jnl.gz delete mode 100755 test/testfiles/cache2_journal_sc01_004.jnl.gz delete mode 100755 test/testfiles/cache2_journal_sc02_000.jnl.gz delete mode 100755 test/testfiles/cache2_journal_sc02_001.jnl.gz delete mode 100755 test/testfiles/cache2_journal_sc02_002.jnl.gz delete mode 100755 test/testfiles/cache2_journal_sc02_003.jnl.gz delete mode 100755 test/testfiles/cache2_journal_sc02_004.jnl.gz create mode 100755 test/testfiles/cache_journal_bsc00_000.jnl.gz create mode 100755 test/testfiles/cache_journal_bsc00_001.jnl.gz create mode 100755 test/testfiles/cache_journal_bsc00_002.jnl.gz create mode 100755 test/testfiles/cache_journal_bsc00_003.jnl.gz create mode 100755 test/testfiles/cache_journal_bsc00_004.jnl.gz create mode 100755 test/testfiles/cache_journal_bsc00_005.jnl.gz create mode 100755 test/testfiles/cache_journal_bsc00_006.jnl.gz create mode 100755 test/testfiles/cache_journal_bsc00_007.jnl.gz create mode 100755 test/testfiles/cache_journal_bsc00_008.jnl.gz create mode 100755 test/testfiles/cache_journal_bsc00_009.jnl.gz create mode 100755 test/testfiles/cache_journal_bsc00_010.jnl.gz create mode 100755 test/testfiles/cache_journal_bsc00_011.jnl.gz create mode 100755 test/testfiles/cache_journal_bsc00_012.jnl.gz create mode 100755 test/testfiles/cache_journal_bsc00_013.jnl.gz create mode 100755 test/testfiles/cache_journal_bsc00_014.jnl.gz create mode 100755 test/testfiles/cache_journal_bsc00_015.jnl.gz create mode 100755 test/testfiles/cache_journal_bsc00_016.jnl.gz create mode 100755 test/testfiles/cache_journal_bsc00_017.jnl.gz create mode 100755 test/testfiles/cache_journal_bsc00_018.jnl.gz create mode 100755 test/testfiles/cache_journal_bsc01_000.jnl.gz create mode 100755 test/testfiles/cache_journal_bsc01_001.jnl.gz create mode 100755 test/testfiles/cache_journal_bsc01_002.jnl.gz create mode 100755 test/testfiles/cache_journal_bsc01_003.jnl.gz create mode 100755 test/testfiles/cache_journal_bsc01_004.jnl.gz create mode 100755 test/testfiles/cache_journal_bsc02_000.jnl.gz create mode 100755 test/testfiles/cache_journal_bsc02_001.jnl.gz create mode 100755 test/testfiles/cache_journal_bsc02_002.jnl.gz create mode 100755 test/testfiles/cache_journal_bsc02_003.jnl.gz create mode 100755 test/testfiles/cache_journal_bsc02_004.jnl.gz create mode 100755 test/testfiles/cache_journal_sc00_000.jnl.gz create mode 100755 test/testfiles/cache_journal_sc00_001.jnl.gz create mode 100755 test/testfiles/cache_journal_sc00_002.jnl.gz create mode 100755 test/testfiles/cache_journal_sc00_003.jnl.gz create mode 100755 test/testfiles/cache_journal_sc00_004.jnl.gz create mode 100755 test/testfiles/cache_journal_sc00_005.jnl.gz create mode 100755 test/testfiles/cache_journal_sc00_006.jnl.gz create mode 100755 test/testfiles/cache_journal_sc00_007.jnl.gz create mode 100755 test/testfiles/cache_journal_sc00_008.jnl.gz create mode 100755 test/testfiles/cache_journal_sc00_009.jnl.gz create mode 100755 test/testfiles/cache_journal_sc00_010.jnl.gz create mode 100755 test/testfiles/cache_journal_sc00_011.jnl.gz create mode 100755 test/testfiles/cache_journal_sc00_012.jnl.gz create mode 100755 test/testfiles/cache_journal_sc00_013.jnl.gz create mode 100755 test/testfiles/cache_journal_sc00_014.jnl.gz create mode 100755 test/testfiles/cache_journal_sc00_015.jnl.gz create mode 100755 test/testfiles/cache_journal_sc00_016.jnl.gz create mode 100755 test/testfiles/cache_journal_sc00_017.jnl.gz create mode 100755 test/testfiles/cache_journal_sc00_018.jnl.gz create mode 100755 test/testfiles/cache_journal_sc01_000.jnl.gz create mode 100755 test/testfiles/cache_journal_sc01_001.jnl.gz create mode 100755 test/testfiles/cache_journal_sc01_002.jnl.gz create mode 100755 test/testfiles/cache_journal_sc01_003.jnl.gz create mode 100755 test/testfiles/cache_journal_sc01_004.jnl.gz create mode 100755 test/testfiles/cache_journal_sc02_000.jnl.gz create mode 100755 test/testfiles/cache_journal_sc02_001.jnl.gz create mode 100755 test/testfiles/cache_journal_sc02_002.jnl.gz create mode 100755 test/testfiles/cache_journal_sc02_003.jnl.gz create mode 100755 test/testfiles/cache_journal_sc02_004.jnl.gz create mode 100644 testpar/t_cache.c delete mode 100644 testpar/t_cache2.c diff --git a/MANIFEST b/MANIFEST index 4086f0f..4aa430e 100644 --- a/MANIFEST +++ b/MANIFEST @@ -445,10 +445,10 @@ ./src/H5AC1pkg.h ./src/H5AC1private.h ./src/H5AC1public.h -./src/H5AC2.c -./src/H5AC2pkg.h -./src/H5AC2private.h -./src/H5AC2public.h +./src/H5AC.c +./src/H5ACpkg.h +./src/H5ACprivate.h +./src/H5ACpublic.h ./src/H5B.c ./src/H5Bcache.c ./src/H5Bpkg.h @@ -467,11 +467,11 @@ ./src/H5C1pkg.h ./src/H5C1private.h ./src/H5C1public.h -./src/H5C2.c -./src/H5C2journal.c -./src/H5C2pkg.h -./src/H5C2private.h -./src/H5C2public.h +./src/H5C.c +./src/H5Cjournal.c +./src/H5Cpkg.h +./src/H5Cprivate.h +./src/H5Cpublic.h ./src/H5CS.c ./src/H5CSprivate.h ./src/H5D.c @@ -768,15 +768,15 @@ ./test/bittests.c ./test/btree2.c ./test/cache1.c -./test/cache2.c +./test/cache.c ./test/cache1_api.c -./test/cache2_api.c +./test/cache_api.c ./test/cache1_common.c -./test/cache2_common.c +./test/cache_common.c ./test/cache1_common.h -./test/cache2_common.h -./test/cache2_jnl_file_marking.c -./test/cache2_journal.c +./test/cache_common.h +./test/cache_jnl_file_marking.c +./test/cache_journal.c ./test/cmpd_dset.c ./test/cross_read.c ./test/dangle.c @@ -895,70 +895,70 @@ ./test/testfiles/err_compat_2 ./test/testfiles/error_test_1 ./test/testfiles/error_test_2 -./test/testfiles/cache2_journal_bsc00_000.jnl.gz -./test/testfiles/cache2_journal_bsc00_001.jnl.gz -./test/testfiles/cache2_journal_bsc00_002.jnl.gz -./test/testfiles/cache2_journal_bsc00_003.jnl.gz -./test/testfiles/cache2_journal_bsc00_004.jnl.gz -./test/testfiles/cache2_journal_bsc00_005.jnl.gz -./test/testfiles/cache2_journal_bsc00_006.jnl.gz -./test/testfiles/cache2_journal_bsc00_007.jnl.gz -./test/testfiles/cache2_journal_bsc00_008.jnl.gz -./test/testfiles/cache2_journal_bsc00_009.jnl.gz -./test/testfiles/cache2_journal_bsc00_010.jnl.gz -./test/testfiles/cache2_journal_bsc00_011.jnl.gz -./test/testfiles/cache2_journal_bsc00_012.jnl.gz -./test/testfiles/cache2_journal_bsc00_013.jnl.gz -./test/testfiles/cache2_journal_bsc00_014.jnl.gz -./test/testfiles/cache2_journal_bsc00_015.jnl.gz -./test/testfiles/cache2_journal_bsc00_016.jnl.gz -./test/testfiles/cache2_journal_bsc00_017.jnl.gz -./test/testfiles/cache2_journal_bsc00_018.jnl.gz -./test/testfiles/cache2_journal_bsc01_000.jnl.gz -./test/testfiles/cache2_journal_bsc01_001.jnl.gz -./test/testfiles/cache2_journal_bsc01_002.jnl.gz -./test/testfiles/cache2_journal_bsc01_003.jnl.gz -./test/testfiles/cache2_journal_bsc01_004.jnl.gz -./test/testfiles/cache2_journal_bsc02_000.jnl.gz -./test/testfiles/cache2_journal_bsc02_001.jnl.gz -./test/testfiles/cache2_journal_bsc02_002.jnl.gz -./test/testfiles/cache2_journal_bsc02_003.jnl.gz -./test/testfiles/cache2_journal_bsc02_004.jnl.gz -./test/testfiles/cache2_journal_sc01_000.jnl.gz -./test/testfiles/cache2_journal_sc00_001.jnl.gz -./test/testfiles/cache2_journal_sc00_011.jnl.gz -./test/testfiles/cache2_journal_sc01_002.jnl.gz -./test/testfiles/cache2_journal_sc02_001.jnl.gz -./test/testfiles/cache2_journal_sc00_003.jnl.gz -./test/testfiles/cache2_journal_sc00_013.jnl.gz -./test/testfiles/cache2_journal_sc01_004.jnl.gz -./test/testfiles/cache2_journal_sc02_003.jnl.gz -./test/testfiles/cache2_journal_sc00_005.jnl.gz -./test/testfiles/cache2_journal_sc00_015.jnl.gz -./test/testfiles/cache2_journal_sc00_007.jnl.gz -./test/testfiles/cache2_journal_sc00_017.jnl.gz -./test/testfiles/cache2_journal_sc00_009.jnl.gz -./test/testfiles/cache2_journal_sc00_000.jnl.gz -./test/testfiles/cache2_journal_sc00_010.jnl.gz -./test/testfiles/cache2_journal_sc00_002.jnl.gz -./test/testfiles/cache2_journal_sc01_001.jnl.gz -./test/testfiles/cache2_journal_sc02_000.jnl.gz -./test/testfiles/cache2_journal_sc00_012.jnl.gz -./test/testfiles/cache2_journal_sc01_003.jnl.gz -./test/testfiles/cache2_journal_sc00_004.jnl.gz -./test/testfiles/cache2_journal_sc02_002.jnl.gz -./test/testfiles/cache2_journal_sc00_014.jnl.gz -./test/testfiles/cache2_journal_sc02_004.jnl.gz -./test/testfiles/cache2_journal_sc00_006.jnl.gz -./test/testfiles/cache2_journal_sc00_016.jnl.gz -./test/testfiles/cache2_journal_sc00_008.jnl.gz -./test/testfiles/cache2_journal_sc00_018.jnl.gz +./test/testfiles/cache_journal_bsc00_000.jnl.gz +./test/testfiles/cache_journal_bsc00_001.jnl.gz +./test/testfiles/cache_journal_bsc00_002.jnl.gz +./test/testfiles/cache_journal_bsc00_003.jnl.gz +./test/testfiles/cache_journal_bsc00_004.jnl.gz +./test/testfiles/cache_journal_bsc00_005.jnl.gz +./test/testfiles/cache_journal_bsc00_006.jnl.gz +./test/testfiles/cache_journal_bsc00_007.jnl.gz +./test/testfiles/cache_journal_bsc00_008.jnl.gz +./test/testfiles/cache_journal_bsc00_009.jnl.gz +./test/testfiles/cache_journal_bsc00_010.jnl.gz +./test/testfiles/cache_journal_bsc00_011.jnl.gz +./test/testfiles/cache_journal_bsc00_012.jnl.gz +./test/testfiles/cache_journal_bsc00_013.jnl.gz +./test/testfiles/cache_journal_bsc00_014.jnl.gz +./test/testfiles/cache_journal_bsc00_015.jnl.gz +./test/testfiles/cache_journal_bsc00_016.jnl.gz +./test/testfiles/cache_journal_bsc00_017.jnl.gz +./test/testfiles/cache_journal_bsc00_018.jnl.gz +./test/testfiles/cache_journal_bsc01_000.jnl.gz +./test/testfiles/cache_journal_bsc01_001.jnl.gz +./test/testfiles/cache_journal_bsc01_002.jnl.gz +./test/testfiles/cache_journal_bsc01_003.jnl.gz +./test/testfiles/cache_journal_bsc01_004.jnl.gz +./test/testfiles/cache_journal_bsc02_000.jnl.gz +./test/testfiles/cache_journal_bsc02_001.jnl.gz +./test/testfiles/cache_journal_bsc02_002.jnl.gz +./test/testfiles/cache_journal_bsc02_003.jnl.gz +./test/testfiles/cache_journal_bsc02_004.jnl.gz +./test/testfiles/cache_journal_sc01_000.jnl.gz +./test/testfiles/cache_journal_sc00_001.jnl.gz +./test/testfiles/cache_journal_sc00_011.jnl.gz +./test/testfiles/cache_journal_sc01_002.jnl.gz +./test/testfiles/cache_journal_sc02_001.jnl.gz +./test/testfiles/cache_journal_sc00_003.jnl.gz +./test/testfiles/cache_journal_sc00_013.jnl.gz +./test/testfiles/cache_journal_sc01_004.jnl.gz +./test/testfiles/cache_journal_sc02_003.jnl.gz +./test/testfiles/cache_journal_sc00_005.jnl.gz +./test/testfiles/cache_journal_sc00_015.jnl.gz +./test/testfiles/cache_journal_sc00_007.jnl.gz +./test/testfiles/cache_journal_sc00_017.jnl.gz +./test/testfiles/cache_journal_sc00_009.jnl.gz +./test/testfiles/cache_journal_sc00_000.jnl.gz +./test/testfiles/cache_journal_sc00_010.jnl.gz +./test/testfiles/cache_journal_sc00_002.jnl.gz +./test/testfiles/cache_journal_sc01_001.jnl.gz +./test/testfiles/cache_journal_sc02_000.jnl.gz +./test/testfiles/cache_journal_sc00_012.jnl.gz +./test/testfiles/cache_journal_sc01_003.jnl.gz +./test/testfiles/cache_journal_sc00_004.jnl.gz +./test/testfiles/cache_journal_sc02_002.jnl.gz +./test/testfiles/cache_journal_sc00_014.jnl.gz +./test/testfiles/cache_journal_sc02_004.jnl.gz +./test/testfiles/cache_journal_sc00_006.jnl.gz +./test/testfiles/cache_journal_sc00_016.jnl.gz +./test/testfiles/cache_journal_sc00_008.jnl.gz +./test/testfiles/cache_journal_sc00_018.jnl.gz ./testpar/COPYING ./testpar/Makefile.am ./testpar/Makefile.in ./testpar/t_cache1.c -./testpar/t_cache2.c +./testpar/t_cache.c ./testpar/t_dset.c ./testpar/t_file.c ./testpar/t_mdset.c diff --git a/config/gnu-flags b/config/gnu-flags index 0eded2b..d12e502 100644 --- a/config/gnu-flags +++ b/config/gnu-flags @@ -140,8 +140,8 @@ case "$cc_vendor-$cc_version" in esac # General - 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" - #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" + 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" # Production case "$cc_vendor-$cc_version" in diff --git a/configure b/configure index c100b29..0160833 100755 --- a/configure +++ b/configure @@ -1,5 +1,5 @@ #! /bin/sh -# From configure.in Id: configure.in 18168 2010-01-26 16:12:08Z koziol . +# From configure.in Id: configure.in 18426 2010-03-18 21:42:55Z koziol . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.64 for HDF5 1.9.8-MDJ_a2. # diff --git a/examples/mdj_api_example.c b/examples/mdj_api_example.c index c798df3..0931be8 100644 --- a/examples/mdj_api_example.c +++ b/examples/mdj_api_example.c @@ -56,7 +56,7 @@ * use H5Pset_jnl_config() to replace the default journaling * configuration with our own. See the comments in the code * for the particulars -- note that we must set the version - * field of the H5AC2_jnl_config_t struct before calling + * field of the H5AC_jnl_config_t struct before calling * H5Pget_jnl_config(). * * After setting up the FAPL, we create the file as usual. @@ -75,11 +75,11 @@ * and re-enable it via 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 struct again; we are simply re-using + * in the H5AC_jnl_config_t struct again; we are simply re-using * the configuration obtained via the H5Fget_jnl_config() call. * (If we had originally opened the file without journaling and * then wanted to enable journaling, we would have to set up the - * fields of the H5AC2_jnl_config_t struct in much the same way + * fields of the H5AC_jnl_config_t struct in much the same way * we did earlier in this example. We would also have had to * use H5Pset_libver_bounds() to set the FAPL to create the file * initially with the latest HDF5 file format format.) @@ -159,8 +159,8 @@ mdj_api_example(char * hdf5_file_name, hsize_t offset[2]; hsize_t chunk_size[2]; int data_chunk[CHUNK_SIZE][CHUNK_SIZE]; - H5AC2_jnl_config_t jnl_config_0; - H5AC2_jnl_config_t jnl_config_1; + H5AC_jnl_config_t jnl_config_0; + H5AC_jnl_config_t jnl_config_1; fprintf(stdout, "running journaling example -- this may take a while:\n"); fflush(stdout); @@ -172,7 +172,7 @@ mdj_api_example(char * hdf5_file_name, } if ( ( jnl_file_name == NULL ) || - ( strlen(jnl_file_name) > H5AC2__MAX_JOURNAL_FILE_NAME_LEN ) ) + ( strlen(jnl_file_name) > H5AC__MAX_JOURNAL_FILE_NAME_LEN ) ) { fprintf(stderr, "bad journal file name. Exiting...\n"); exit(1); @@ -213,7 +213,7 @@ mdj_api_example(char * hdf5_file_name, * illustrated here shows off the H5Pget_jnl_config() call and is less * susceptible to API definition changes. */ - jnl_config_0.version = H5AC2__CURR_JNL_CONFIG_VER; + jnl_config_0.version = H5AC__CURR_JNL_CONFIG_VER; status = H5Pget_jnl_config(fapl_id, &jnl_config_0); @@ -359,7 +359,7 @@ mdj_api_example(char * hdf5_file_name, * journaling will also cause HDF5 to close and discard the * journal file after all metadata is on disk. */ - jnl_config_1.version = H5AC2__CURR_JNL_CONFIG_VER; + jnl_config_1.version = H5AC__CURR_JNL_CONFIG_VER; status = H5Fget_jnl_config(file_id, &jnl_config_1); diff --git a/src/H5.c b/src/H5.c index 0f4c863..3ce0b2e 100644 --- a/src/H5.c +++ b/src/H5.c @@ -175,7 +175,7 @@ H5_init_library(void) HGOTO_ERROR(H5E_FUNC, H5E_CANTINIT, FAIL, "unable to initialize dataset interface") if(H5AC1_init() < 0) HGOTO_ERROR(H5E_FUNC, H5E_CANTINIT, FAIL, "unable to initialize metadata caching interface") - if(H5AC2_init() < 0) + if(H5AC_init() < 0) HGOTO_ERROR(H5E_FUNC, H5E_CANTINIT, FAIL, "unable to initialize metadata caching interface") if(H5L_init() < 0) HGOTO_ERROR(H5E_FUNC, H5E_CANTINIT, FAIL, "unable to initialize link interface") @@ -264,7 +264,7 @@ H5_term_library(void) */ if(pending == 0) { pending += DOWN(AC1); - pending += DOWN(AC2); + pending += DOWN(AC); pending += DOWN(Z); pending += DOWN(FD); pending += DOWN(P); diff --git a/src/H5A.c b/src/H5A.c index a98a344..77ed0a2 100644 --- a/src/H5A.c +++ b/src/H5A.c @@ -29,7 +29,7 @@ /***********/ #include "H5private.h" /* Generic Functions */ #include "H5Apkg.h" /* Attributes */ -#include "H5AC2private.h" /* Metadata cache */ +#include "H5ACprivate.h" /* Metadata cache */ #include "H5Opkg.h" /* Object headers */ #include "H5Eprivate.h" /* Error handling */ #include "H5FLprivate.h" /* Free Lists */ @@ -226,7 +226,7 @@ H5Acreate2(hid_t loc_id, const char *attr_name, hid_t type_id, hid_t space_id, H5S_t *space; /* Dataspace to use for attribute */ hid_t ret_value; /* Return value */ - FUNC_ENTER_API_META(H5Acreate2, loc_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Acreate2, loc_id, H5AC_dxpl_id, FAIL) H5TRACE6("i", "i*siiii", loc_id, attr_name, type_id, space_id, acpl_id, aapl_id); /* check arguments */ @@ -244,7 +244,7 @@ H5Acreate2(hid_t loc_id, const char *attr_name, hid_t type_id, hid_t space_id, HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space") /* Go do the real work for attaching the attribute to the dataset */ - if((ret_value = H5A_create(&loc, attr_name, type, space, acpl_id, H5AC2_dxpl_id)) < 0) + if((ret_value = H5A_create(&loc, attr_name, type, space, acpl_id, H5AC_dxpl_id)) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "unable to create attribute") done: @@ -297,7 +297,7 @@ H5Acreate_by_name(hid_t loc_id, const char *obj_name, const char *attr_name, H5S_t *space; /* Dataspace to use for attribute */ hid_t ret_value; /* Return value */ - FUNC_ENTER_API_META(H5Acreate_by_name, loc_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Acreate_by_name, loc_id, H5AC_dxpl_id, FAIL) H5TRACE8("i", "i*s*siiiii", loc_id, obj_name, attr_name, type_id, space_id, acpl_id, aapl_id, lapl_id); @@ -323,12 +323,12 @@ H5Acreate_by_name(hid_t loc_id, const char *obj_name, const char *attr_name, H5G_loc_reset(&obj_loc); /* Find the object's location */ - if(H5G_loc_find(&loc, obj_name, &obj_loc/*out*/, lapl_id, H5AC2_ind_dxpl_id) < 0) + if(H5G_loc_find(&loc, obj_name, &obj_loc/*out*/, lapl_id, H5AC_ind_dxpl_id) < 0) HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, FAIL, "object not found") loc_found = TRUE; /* Go do the real work for attaching the attribute to the dataset */ - if((ret_value = H5A_create(&obj_loc, attr_name, type, space, acpl_id, H5AC2_dxpl_id)) < 0) + if((ret_value = H5A_create(&obj_loc, attr_name, type, space, acpl_id, H5AC_dxpl_id)) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "unable to create attribute") done: @@ -383,7 +383,7 @@ H5A_create(const H5G_loc_t *loc, const char *name, const H5T_t *type, * name, but it's going to be hard to unwind all the special cases on * failure, so just check first, for now - QAK) */ - if((tri_ret = H5O_attr_exists(loc->oloc, name, H5AC2_ind_dxpl_id)) < 0) + if((tri_ret = H5O_attr_exists(loc->oloc, name, H5AC_ind_dxpl_id)) < 0) HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, FAIL, "error checking attributes") else if(tri_ret > 0) HGOTO_ERROR(H5E_ATTR, H5E_ALREADYEXISTS, FAIL, "attribute already exists") @@ -548,7 +548,7 @@ H5Aopen(hid_t loc_id, const char *attr_name, hid_t UNUSED aapl_id) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no attribute name") /* Read in attribute from object header */ - if(NULL == (attr = H5O_attr_open_by_name(loc.oloc, attr_name, H5AC2_ind_dxpl_id))) + if(NULL == (attr = H5O_attr_open_by_name(loc.oloc, attr_name, H5AC_ind_dxpl_id))) HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "unable to load attribute info from object header") attr->shared->initialized = TRUE; @@ -618,7 +618,7 @@ H5Aopen_by_name(hid_t loc_id, const char *obj_name, const char *attr_name, HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID") /* Open the attribute on the object header */ - if(NULL == (attr = H5A_open_by_name(&loc, obj_name, attr_name, lapl_id, H5AC2_ind_dxpl_id))) + if(NULL == (attr = H5A_open_by_name(&loc, obj_name, attr_name, lapl_id, H5AC_ind_dxpl_id))) HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "can't open attribute") /* Register the attribute and get an ID for it */ @@ -689,7 +689,7 @@ H5Aopen_by_idx(hid_t loc_id, const char *obj_name, H5_index_t idx_type, HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID") /* Open the attribute in the object header */ - if(NULL == (attr = H5A_open_by_idx(&loc, obj_name, idx_type, order, n, lapl_id, H5AC2_ind_dxpl_id))) + if(NULL == (attr = H5A_open_by_idx(&loc, obj_name, idx_type, order, n, lapl_id, H5AC_ind_dxpl_id))) HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open attribute") /* Register the attribute and get an ID for it */ @@ -917,7 +917,7 @@ H5Awrite(hid_t attr_id, hid_t dtype_id, const void *buf) const H5T_t *mem_type = NULL; herr_t ret_value; - FUNC_ENTER_API_META(H5Awrite, attr_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Awrite, attr_id, H5AC_dxpl_id, FAIL) H5TRACE3("e", "ii*x", attr_id, dtype_id, buf); /* check arguments */ @@ -929,7 +929,7 @@ H5Awrite(hid_t attr_id, hid_t dtype_id, const void *buf) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "null attribute buffer") /* Go write the actual data to the attribute */ - if((ret_value = H5A_write(attr, mem_type, buf, H5AC2_dxpl_id)) < 0) + if((ret_value = H5A_write(attr, mem_type, buf, H5AC_dxpl_id)) < 0) HGOTO_ERROR(H5E_ATTR, H5E_WRITEERROR, FAIL, "unable to write attribute") done: @@ -1087,7 +1087,7 @@ H5Aread(hid_t attr_id, hid_t dtype_id, void *buf) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "null attribute buffer") /* Go write the actual data to the attribute */ - if((ret_value = H5A_read(attr, mem_type, buf, H5AC2_dxpl_id)) < 0) + if((ret_value = H5A_read(attr, mem_type, buf, H5AC_dxpl_id)) < 0) HGOTO_ERROR(H5E_ATTR, H5E_READERROR, FAIL, "unable to read attribute") done: @@ -1496,7 +1496,7 @@ H5Aget_name_by_idx(hid_t loc_id, const char *obj_name, H5_index_t idx_type, HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID") /* Open the attribute on the object header */ - if(NULL == (attr = H5A_open_by_idx(&loc, obj_name, idx_type, order, n, lapl_id, H5AC2_ind_dxpl_id))) + if(NULL == (attr = H5A_open_by_idx(&loc, obj_name, idx_type, order, n, lapl_id, H5AC_ind_dxpl_id))) HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "can't open attribute") /* Get the length of the name */ @@ -1633,7 +1633,7 @@ H5Aget_info_by_name(hid_t loc_id, const char *obj_name, const char *attr_name, HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID") /* Open the attribute on the object header */ - if(NULL == (attr = H5A_open_by_name(&loc, obj_name, attr_name, lapl_id, H5AC2_ind_dxpl_id))) + if(NULL == (attr = H5A_open_by_name(&loc, obj_name, attr_name, lapl_id, H5AC_ind_dxpl_id))) HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "can't open attribute") /* Get the attribute information */ @@ -1695,7 +1695,7 @@ H5Aget_info_by_idx(hid_t loc_id, const char *obj_name, H5_index_t idx_type, HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID") /* Open the attribute on the object header */ - if(NULL == (attr = H5A_open_by_idx(&loc, obj_name, idx_type, order, n, lapl_id, H5AC2_ind_dxpl_id))) + if(NULL == (attr = H5A_open_by_idx(&loc, obj_name, idx_type, order, n, lapl_id, H5AC_ind_dxpl_id))) HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "can't open attribute") /* Get the attribute information */ @@ -1771,7 +1771,7 @@ H5Arename(hid_t loc_id, const char *old_name, const char *new_name) H5G_loc_t loc; /* Object location */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_API_META(H5Arename, loc_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Arename, loc_id, H5AC_dxpl_id, FAIL) H5TRACE3("e", "i*s*s", loc_id, old_name, new_name); /* check arguments */ @@ -1785,7 +1785,7 @@ H5Arename(hid_t loc_id, const char *old_name, const char *new_name) /* Avoid thrashing things if the names are the same */ if(HDstrcmp(old_name, new_name)) /* Call attribute rename routine */ - if(H5O_attr_rename(loc.oloc, H5AC2_dxpl_id, old_name, new_name) < 0) + if(H5O_attr_rename(loc.oloc, H5AC_dxpl_id, old_name, new_name) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTRENAME, FAIL, "can't rename attribute") done: @@ -1817,7 +1817,7 @@ H5Arename_by_name(hid_t loc_id, const char *obj_name, const char *old_attr_name, hbool_t loc_found = FALSE; /* Entry at 'obj_name' found */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_API_META(H5Arename_by_name, loc_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Arename_by_name, loc_id, H5AC_dxpl_id, FAIL) H5TRACE5("e", "i*s*s*si", loc_id, obj_name, old_attr_name, new_attr_name, lapl_id); @@ -1846,12 +1846,12 @@ H5Arename_by_name(hid_t loc_id, const char *obj_name, const char *old_attr_name, H5G_loc_reset(&obj_loc); /* Find the object's location */ - if(H5G_loc_find(&loc, obj_name, &obj_loc/*out*/, lapl_id, H5AC2_ind_dxpl_id) < 0) + if(H5G_loc_find(&loc, obj_name, &obj_loc/*out*/, lapl_id, H5AC_ind_dxpl_id) < 0) HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, FAIL, "object not found") loc_found = TRUE; /* Call attribute rename routine */ - if(H5O_attr_rename(obj_loc.oloc, H5AC2_dxpl_id, old_attr_name, new_attr_name) < 0) + if(H5O_attr_rename(obj_loc.oloc, H5AC_dxpl_id, old_attr_name, new_attr_name) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTRENAME, FAIL, "can't rename attribute") } /* end if */ @@ -1931,7 +1931,7 @@ H5Aiterate2(hid_t loc_id, H5_index_t idx_type, H5_iter_order_t order, /* Call attribute iteration routine */ last_attr = start_idx = (idx ? *idx : 0); - if((ret_value = H5O_attr_iterate(loc_id, H5AC2_ind_dxpl_id, idx_type, order, start_idx, &last_attr, &attr_op, op_data)) < 0) + if((ret_value = H5O_attr_iterate(loc_id, H5AC_ind_dxpl_id, idx_type, order, start_idx, &last_attr, &attr_op, op_data)) < 0) HERROR(H5E_ATTR, H5E_BADITER, "error iterating over attributes"); /* Set the last attribute information */ @@ -2029,12 +2029,12 @@ H5Aiterate_by_name(hid_t loc_id, const char *obj_name, H5_index_t idx_type, H5G_loc_reset(&obj_loc); /* Find the object's location */ - if(H5G_loc_find(&loc, obj_name, &obj_loc/*out*/, lapl_id, H5AC2_ind_dxpl_id) < 0) + if(H5G_loc_find(&loc, obj_name, &obj_loc/*out*/, lapl_id, H5AC_ind_dxpl_id) < 0) HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, FAIL, "object not found") loc_found = TRUE; /* Open the object */ - if((obj_loc_id = H5O_open_by_loc(&obj_loc, H5AC2_ind_dxpl_id)) < 0) + if((obj_loc_id = H5O_open_by_loc(&obj_loc, H5AC_ind_dxpl_id)) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open object") /* Build attribute operator info */ @@ -2043,7 +2043,7 @@ H5Aiterate_by_name(hid_t loc_id, const char *obj_name, H5_index_t idx_type, /* Call attribute iteration routine */ last_attr = start_idx = (idx ? *idx : 0); - if((ret_value = H5O_attr_iterate(obj_loc_id, H5AC2_ind_dxpl_id, idx_type, order, start_idx, &last_attr, &attr_op, op_data)) < 0) + if((ret_value = H5O_attr_iterate(obj_loc_id, H5AC_ind_dxpl_id, idx_type, order, start_idx, &last_attr, &attr_op, op_data)) < 0) HERROR(H5E_ATTR, H5E_BADITER, "error iterating over attributes"); /* Set the last attribute information */ @@ -2083,7 +2083,7 @@ H5Adelete(hid_t loc_id, const char *name) H5G_loc_t loc; /* Object location */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_API_META(H5Adelete, loc_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Adelete, loc_id, H5AC_dxpl_id, FAIL) H5TRACE2("e", "i*s", loc_id, name); /* check arguments */ @@ -2095,7 +2095,7 @@ H5Adelete(hid_t loc_id, const char *name) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name") /* Delete the attribute from the location */ - if(H5O_attr_remove(loc.oloc, name, H5AC2_dxpl_id) < 0) + if(H5O_attr_remove(loc.oloc, name, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTDELETE, FAIL, "unable to delete attribute") done: @@ -2130,7 +2130,7 @@ H5Adelete_by_name(hid_t loc_id, const char *obj_name, const char *attr_name, hbool_t loc_found = FALSE; /* Entry at 'obj_name' found */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_API_META(H5Adelete_by_name, loc_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Adelete_by_name, loc_id, H5AC_dxpl_id, FAIL) H5TRACE4("e", "i*s*si", loc_id, obj_name, attr_name, lapl_id); /* check arguments */ @@ -2154,12 +2154,12 @@ H5Adelete_by_name(hid_t loc_id, const char *obj_name, const char *attr_name, H5G_loc_reset(&obj_loc); /* Find the object's location */ - if(H5G_loc_find(&loc, obj_name, &obj_loc/*out*/, lapl_id, H5AC2_ind_dxpl_id) < 0) + if(H5G_loc_find(&loc, obj_name, &obj_loc/*out*/, lapl_id, H5AC_ind_dxpl_id) < 0) HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, FAIL, "object not found") loc_found = TRUE; /* Delete the attribute from the location */ - if(H5O_attr_remove(obj_loc.oloc, attr_name, H5AC2_dxpl_id) < 0) + if(H5O_attr_remove(obj_loc.oloc, attr_name, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTDELETE, FAIL, "unable to delete attribute") done: @@ -2206,7 +2206,7 @@ H5Adelete_by_idx(hid_t loc_id, const char *obj_name, H5_index_t idx_type, hbool_t loc_found = FALSE; /* Entry at 'obj_name' found */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_API_META(H5Adelete_by_idx, loc_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Adelete_by_idx, loc_id, H5AC_dxpl_id, FAIL) H5TRACE6("e", "i*sIiIohi", loc_id, obj_name, idx_type, order, n, lapl_id); /* check arguments */ @@ -2232,12 +2232,12 @@ H5Adelete_by_idx(hid_t loc_id, const char *obj_name, H5_index_t idx_type, H5G_loc_reset(&obj_loc); /* Find the object's location */ - if(H5G_loc_find(&loc, obj_name, &obj_loc/*out*/, lapl_id, H5AC2_dxpl_id) < 0) + if(H5G_loc_find(&loc, obj_name, &obj_loc/*out*/, lapl_id, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, FAIL, "object not found") loc_found = TRUE; /* Delete the attribute from the location */ - if(H5O_attr_remove_by_idx(obj_loc.oloc, idx_type, order, n, H5AC2_dxpl_id) < 0) + if(H5O_attr_remove_by_idx(obj_loc.oloc, idx_type, order, n, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTDELETE, FAIL, "unable to delete attribute") done: @@ -2269,7 +2269,7 @@ H5Aclose(hid_t attr_id) { herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_API_META(H5Aclose, attr_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Aclose, attr_id, H5AC_dxpl_id, FAIL) H5TRACE1("e", "i", attr_id); /* check arguments */ @@ -2551,7 +2551,7 @@ H5Aexists(hid_t obj_id, const char *attr_name) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no attribute name") /* Check if the attribute exists */ - if((ret_value = H5O_attr_exists(loc.oloc, attr_name, H5AC2_ind_dxpl_id)) < 0) + if((ret_value = H5O_attr_exists(loc.oloc, attr_name, H5AC_ind_dxpl_id)) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "unable to determine if attribute exists") done: @@ -2607,12 +2607,12 @@ H5Aexists_by_name(hid_t loc_id, const char *obj_name, const char *attr_name, H5G_loc_reset(&obj_loc); /* Find the object's location */ - if(H5G_loc_find(&loc, obj_name, &obj_loc/*out*/, lapl_id, H5AC2_ind_dxpl_id) < 0) + if(H5G_loc_find(&loc, obj_name, &obj_loc/*out*/, lapl_id, H5AC_ind_dxpl_id) < 0) HGOTO_ERROR(H5E_ATTR, H5E_NOTFOUND, FAIL, "object not found") loc_found = TRUE; /* Check if the attribute exists */ - if((ret_value = H5O_attr_exists(obj_loc.oloc, attr_name, H5AC2_ind_dxpl_id)) < 0) + if((ret_value = H5O_attr_exists(obj_loc.oloc, attr_name, H5AC_ind_dxpl_id)) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "unable to determine if attribute exists") done: diff --git a/src/H5AC.c b/src/H5AC.c new file mode 100644 index 0000000..5b3f0e7 --- /dev/null +++ b/src/H5AC.c @@ -0,0 +1,5680 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * Copyright by the Board of Trustees of the University of Illinois. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/*------------------------------------------------------------------------- + * + * Created: H5AC.c + * Jul 9 1997 + * Robb Matzke + * + * Purpose: Functions in this file implement a cache for + * things which exist on disk. All "things" associated + * with a particular HDF file share the same cache; each + * HDF file has it's own cache. + * + * Modifications: + * + * Robb Matzke, 4 Aug 1997 + * Added calls to H5E. + * + * Quincey Koziol, 22 Apr 2000 + * Turned on "H5AC_SORT_BY_ADDR" + * + * John Mainzer, 5/19/04 + * Complete redesign and rewrite. See the header comments for + * H5AC_t for an overview of what is going on. + * + * John Mainzer, 6/4/04 + * Factored the new cache code into a separate file (H5C.c) to + * facilitate re-use. Re-worked this file again to use H5C. + * + *------------------------------------------------------------------------- + */ + +#include + +#define H5AC_PACKAGE /*suppress error about including H5ACpkg */ +#define H5C_PACKAGE /*suppress error about including H5Cpkg */ +#define H5F_PACKAGE /*suppress error about including H5Fpkg */ + +/* Interface initialization */ +#define H5_INTERFACE_INIT_FUNC H5AC_init_interface + +#ifdef H5_HAVE_PARALLEL +#include +#endif /* H5_HAVE_PARALLEL */ + +#include "H5private.h" /* Generic Functions */ +#include "H5ACpkg.h" /* Metadata cache */ +#include "H5Cpkg.h" /* Cache */ +#include "H5Dprivate.h" /* Dataset functions */ +#include "H5Eprivate.h" /* Error handling */ +#include "H5Fpkg.h" /* Files */ +#include "H5FDprivate.h" /* File drivers */ +#include "H5FLprivate.h" /* Free Lists */ +#include "H5Iprivate.h" /* IDs */ +#include "H5MMprivate.h" /* Memory management */ +#include "H5Pprivate.h" /* Property lists */ + + +#ifdef H5_HAVE_PARALLEL + +/* Declare a free list to manage the H5AC_aux_t struct */ +H5FL_DEFINE_STATIC(H5AC_aux_t); + +#endif /* H5_HAVE_PARALLEL */ + +/**************************************************************************** + * + * structure H5AC_slist_entry_t + * + * The dirty entry list maintained via the d_slist_ptr field of H5AC_aux_t + * and the cleaned entry list maintained via the c_slist_ptr field of + * H5AC_aux_t are just lists of the file offsets of the dirty/cleaned + * entries. Unfortunately, the slist code makes us define a dynamically + * allocated structure to store these offsets in. This structure serves + * that purpose. Its fields are as follows: + * + * magic: Unsigned 32 bit integer always set to + * H5AC__H5AC_SLIST_ENTRY_T_MAGIC. This field is used to + * validate pointers to instances of H5AC_slist_entry_t. + * + * addr: file offset of a metadata entry. Entries are added to this + * list (if they aren't there already) when they are marked + * dirty in an unprotect, inserted, or renamed. They are + * removed when they appear in a clean entries broadcast. + * + ****************************************************************************/ + +#ifdef H5_HAVE_PARALLEL + +#define H5AC__H5AC_SLIST_ENTRY_T_MAGIC 0x00D0A02 + +typedef struct H5AC_slist_entry_t +{ + uint32_t magic; + + haddr_t addr; +} H5AC_slist_entry_t; + +/* Declare a free list to manage the H5AC_slist_entry_t struct */ +H5FL_DEFINE_STATIC(H5AC_slist_entry_t); + +#endif /* H5_HAVE_PARALLEL */ + + +/* + * Private file-scope variables. + */ + +/* Default dataset transfer property list for metadata I/O calls */ +/* (Collective set, "block before metadata write" set and "library internal" set) */ +/* (Global variable definition, declaration is in H5ACprivate.h also) */ +hid_t H5AC_dxpl_id=(-1); + +/* Private dataset transfer property list for metadata I/O calls */ +/* (Collective set and "library internal" set) */ +/* (Static variable definition) */ +static hid_t H5AC_noblock_dxpl_id=(-1); + +/* Dataset transfer property list for independent metadata I/O calls */ +/* (just "library internal" set - i.e. independent transfer mode) */ +/* (Global variable definition, declaration is in H5ACprivate.h also) */ +hid_t H5AC_ind_dxpl_id=(-1); + + +/* + * Private file-scope function declarations: + */ + +static herr_t H5AC_check_if_write_permitted(const H5F_t *f, + hid_t dxpl_id, + hbool_t * write_permitted_ptr); + +#ifdef H5_HAVE_PARALLEL +static herr_t H5AC_broadcast_clean_list(H5AC_t * cache_ptr); +#endif /* JRM */ + +static herr_t H5AC_ext_config_2_int_config( + H5AC_cache_config_t * ext_conf_ptr, + H5C_auto_size_ctl_t * int_conf_ptr); + +#ifdef H5_HAVE_PARALLEL +static herr_t H5AC_log_deleted_entry(H5AC_t * cache_ptr, + H5AC_info_t * entry_ptr, + haddr_t addr, + unsigned int flags); + +static herr_t H5AC_log_dirtied_entry(const H5AC_info_t * entry_ptr, + haddr_t addr, + hbool_t size_changed, + size_t new_size); + +static herr_t H5AC_log_flushed_entry(H5C_t * cache_ptr, + haddr_t addr, + hbool_t was_dirty, + unsigned flags, + int type_id); + +#if 0 /* this is useful debugging code -- JRM */ +static herr_t H5AC_log_flushed_entry_dummy(H5C_t * cache_ptr, + haddr_t addr, + hbool_t was_dirty, + unsigned flags, + int type_id); +#endif /* JRM */ + +static herr_t H5AC_log_inserted_entry(H5F_t * f, + H5AC_t * cache_ptr, + H5AC_info_t * entry_ptr, + const H5AC_class_t * type, + haddr_t addr, + size_t size); + +static herr_t H5AC_propagate_flushed_and_still_clean_entries_list(H5F_t * f, + hid_t dxpl_id, + H5AC_t * cache_ptr, + hbool_t do_barrier); + +static herr_t H5AC_receive_and_apply_clean_list(H5F_t * f, + hid_t dxpl_id, + H5AC_t * cache_ptr); + +static herr_t H5AC_log_renamed_entry(H5F_t * f, + haddr_t old_addr, + haddr_t new_addr); +#endif /* H5_HAVE_PARALLEL */ + +static herr_t H5AC_set_cache_config(H5AC_t * cache_ptr, + H5AC_cache_config_t *config_ptr); + + +/*------------------------------------------------------------------------- + * Function: H5AC_init + * + * Purpose: Initialize the interface from some other layer. + * + * Return: Success: non-negative + * + * Failure: negative + * + * Programmer: Quincey Koziol + * Saturday, January 18, 2003 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +herr_t +H5AC_init(void) +{ + herr_t ret_value=SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5AC_init, FAIL) + /* FUNC_ENTER() does all the work */ + +done: + FUNC_LEAVE_NOAPI(ret_value) +} + + +/*------------------------------------------------------------------------- + * Function: H5AC_init_interface + * + * Purpose: Initialize interface-specific information + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: Quincey Koziol + * Thursday, July 18, 2002 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +static herr_t +H5AC_init_interface(void) +{ +#ifdef H5_HAVE_PARALLEL + H5P_genclass_t *xfer_pclass; /* Dataset transfer property list class object */ + H5P_genplist_t *xfer_plist; /* Dataset transfer property list object */ + unsigned block_before_meta_write; /* "block before meta write" property value */ + unsigned library_internal=1; /* "library internal" property value */ + H5FD_mpio_xfer_t xfer_mode; /* I/O transfer mode property value */ + herr_t ret_value=SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI_NOINIT(H5AC_init_interface) + + /* Sanity check */ + HDassert(H5P_CLS_DATASET_XFER_g!=(-1)); + + /* Get the dataset transfer property list class object */ + if (NULL == (xfer_pclass = H5I_object(H5P_CLS_DATASET_XFER_g))) + HGOTO_ERROR(H5E_CACHE, H5E_BADATOM, FAIL, "can't get property list class") + + /* Get an ID for the blocking, collective H5AC dxpl */ + if ((H5AC_dxpl_id=H5P_create_id(xfer_pclass)) < 0) + HGOTO_ERROR(H5E_CACHE, H5E_CANTCREATE, FAIL, "unable to register property list") + + /* Get the property list object */ + if (NULL == (xfer_plist = H5I_object(H5AC_dxpl_id))) + HGOTO_ERROR(H5E_CACHE, H5E_BADATOM, FAIL, "can't get new property list object") + + /* Insert 'block before metadata write' property */ + block_before_meta_write=1; + if(H5P_insert(xfer_plist,H5AC_BLOCK_BEFORE_META_WRITE_NAME,H5AC_BLOCK_BEFORE_META_WRITE_SIZE,&block_before_meta_write,NULL,NULL,NULL,NULL,NULL,NULL)<0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't insert metadata cache dxpl property") + + /* Insert 'library internal' property */ + if(H5P_insert(xfer_plist,H5AC_LIBRARY_INTERNAL_NAME,H5AC_LIBRARY_INTERNAL_SIZE,&library_internal,NULL,NULL,NULL,NULL,NULL,NULL)<0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't insert metadata cache dxpl property") + + /* Set the transfer mode */ + xfer_mode=H5FD_MPIO_COLLECTIVE; + if (H5P_set(xfer_plist,H5D_XFER_IO_XFER_MODE_NAME,&xfer_mode)<0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set value") + + /* Get an ID for the non-blocking, collective H5AC dxpl */ + if ((H5AC_noblock_dxpl_id=H5P_create_id(xfer_pclass)) < 0) + HGOTO_ERROR(H5E_CACHE, H5E_CANTCREATE, FAIL, "unable to register property list") + + /* Get the property list object */ + if (NULL == (xfer_plist = H5I_object(H5AC_noblock_dxpl_id))) + HGOTO_ERROR(H5E_CACHE, H5E_BADATOM, FAIL, "can't get new property list object") + + /* Insert 'block before metadata write' property */ + block_before_meta_write=0; + if(H5P_insert(xfer_plist,H5AC_BLOCK_BEFORE_META_WRITE_NAME,H5AC_BLOCK_BEFORE_META_WRITE_SIZE,&block_before_meta_write,NULL,NULL,NULL,NULL,NULL,NULL)<0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't insert metadata cache dxpl property") + + /* Insert 'library internal' property */ + if(H5P_insert(xfer_plist,H5AC_LIBRARY_INTERNAL_NAME,H5AC_LIBRARY_INTERNAL_SIZE,&library_internal,NULL,NULL,NULL,NULL,NULL,NULL)<0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't insert metadata cache dxpl property") + + /* Set the transfer mode */ + xfer_mode=H5FD_MPIO_COLLECTIVE; + if (H5P_set(xfer_plist,H5D_XFER_IO_XFER_MODE_NAME,&xfer_mode)<0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set value") + + /* Get an ID for the non-blocking, independent H5AC dxpl */ + if ((H5AC_ind_dxpl_id=H5P_create_id(xfer_pclass)) < 0) + HGOTO_ERROR(H5E_CACHE, H5E_CANTCREATE, FAIL, "unable to register property list") + + /* Get the property list object */ + if (NULL == (xfer_plist = H5I_object(H5AC_ind_dxpl_id))) + HGOTO_ERROR(H5E_CACHE, H5E_BADATOM, FAIL, "can't get new property list object") + + /* Insert 'block before metadata write' property */ + block_before_meta_write=0; + if(H5P_insert(xfer_plist,H5AC_BLOCK_BEFORE_META_WRITE_NAME,H5AC_BLOCK_BEFORE_META_WRITE_SIZE,&block_before_meta_write,NULL,NULL,NULL,NULL,NULL,NULL)<0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't insert metadata cache dxpl property") + + /* Insert 'library internal' property */ + if(H5P_insert(xfer_plist,H5AC_LIBRARY_INTERNAL_NAME,H5AC_LIBRARY_INTERNAL_SIZE,&library_internal,NULL,NULL,NULL,NULL,NULL,NULL)<0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't insert metadata cache dxpl property") + + /* Set the transfer mode */ + xfer_mode=H5FD_MPIO_INDEPENDENT; + if (H5P_set(xfer_plist,H5D_XFER_IO_XFER_MODE_NAME,&xfer_mode)<0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set value") + +done: + FUNC_LEAVE_NOAPI(ret_value) + +#else /* H5_HAVE_PARALLEL */ + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5AC_init_interface) + + /* Sanity check */ + assert(H5P_LST_DATASET_XFER_g!=(-1)); + + H5AC_dxpl_id=H5P_DATASET_XFER_DEFAULT; + H5AC_noblock_dxpl_id=H5P_DATASET_XFER_DEFAULT; + H5AC_ind_dxpl_id=H5P_DATASET_XFER_DEFAULT; + + FUNC_LEAVE_NOAPI(SUCCEED) +#endif /* H5_HAVE_PARALLEL */ +} /* end H5AC_init_interface() */ + + +/*------------------------------------------------------------------------- + * Function: H5AC_term_interface + * + * Purpose: Terminate this interface. + * + * Return: Success: Positive if anything was done that might + * affect other interfaces; zero otherwise. + * + * Failure: Negative. + * + * Programmer: Quincey Koziol + * Thursday, July 18, 2002 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +int +H5AC_term_interface(void) +{ + int n=0; + + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5AC_term_interface) + + if (H5_interface_initialize_g) { +#ifdef H5_HAVE_PARALLEL + if(H5AC_dxpl_id>0 || H5AC_noblock_dxpl_id>0 || H5AC_ind_dxpl_id>0) { + /* Indicate more work to do */ + n = 1; /* H5I */ + + /* Close H5AC dxpl */ + if (H5I_dec_ref(H5AC_dxpl_id) < 0 || + H5I_dec_ref(H5AC_noblock_dxpl_id) < 0 || + H5I_dec_ref(H5AC_ind_dxpl_id) < 0) + H5E_clear_stack(NULL); /*ignore error*/ + else { + /* Reset static IDs */ + H5AC_dxpl_id=(-1); + H5AC_noblock_dxpl_id=(-1); + H5AC_ind_dxpl_id=(-1); + + /* Reset interface initialization flag */ + H5_interface_initialize_g = 0; + } /* end else */ + } /* end if */ + else +#else /* H5_HAVE_PARALLEL */ + /* Reset static IDs */ + H5AC_dxpl_id=(-1); + H5AC_noblock_dxpl_id=(-1); + H5AC_ind_dxpl_id=(-1); +#endif /* H5_HAVE_PARALLEL */ + /* Reset interface initialization flag */ + H5_interface_initialize_g = 0; + } /* end if */ + + FUNC_LEAVE_NOAPI(n) +} /* end H5AC_term_interface() */ + + +/*------------------------------------------------------------------------- + * Function: H5AC_create + * + * Purpose: Initialize the cache just after a file is opened. The + * SIZE_HINT is the number of cache slots desired. If you + * pass an invalid value then H5AC_NSLOTS is used. You can + * turn off caching by using 1 for the SIZE_HINT value. + * + * Return: Success: Number of slots actually used. + * + * Failure: Negative + * + * Programmer: Robb Matzke + * matzke@llnl.gov + * Jul 9 1997 + * + * Modifications: + * + * Complete re-design and re-write to support the re-designed + * metadata cache. + * + * At present, the size_hint is ignored, and the + * max_cache_size and min_clean_size fields are hard + * coded. This should be fixed, but a parameter + * list change will be required, so I will leave it + * for now. + * + * Since no-one seems to care, the function now returns + * one on success. + * JRM - 4/28/04 + * + * Reworked the function again after abstracting its guts to + * the similar function in H5C.c. The function is now a + * wrapper for H5C_create(). + * JRM - 6/4/04 + * + * Deleted the old size_hint parameter and added the + * max_cache_size, and min_clean_size parameters. + * + * JRM - 3/10/05 + * + * Deleted the max_cache_size, and min_clean_size parameters, + * and added the config_ptr parameter. Added code to + * validate the resize configuration before we do anything. + * + * JRM - 3/24/05 + * + * Changed the type of config_ptr from H5AC_auto_size_ctl_t * + * to H5AC_cache_config_t *. Propagated associated changes + * through the function. + * JRM - 4/7/05 + * + * Added code allocating and initializing the auxilary + * structure (an instance of H5AC_aux_t), and linking it + * to the instance of H5C_t created by H5C_create(). At + * present, the auxilary structure is only used in PHDF5. + * + * JRM - 6/28/05 + * + * Added code to set the prefix if required. + * + * JRM - 1/20/06 + * + * Added code to initialize the new write_done field. + * + * JRM - 5/11/06 + * + * Reworked code to conform with changes in the cache + * API. + * JRM - 10/18/07 + * + * Added the dxpl_id parameter, and updated for parameter + * list changes in H5C_create(). + * JRM - 3/26/08 + * + * Updated code for the removal of the f, dxpl_id, and + * journal_recovered parameters for H5C_create(). + * + * JRM 7/10/08 + * + *------------------------------------------------------------------------- + */ + +static const char * H5AC_entry_type_names[H5AC_NTYPES] = +{ + "B-tree nodes", + "symbol table nodes", + "local heap prefixes", + "local heap data blocks", + "global heaps", + "object headers", + "object header chunks", + "v2 B-tree headers", + "v2 B-tree internal nodes", + "v2 B-tree leaf nodes", + "fractal heap headers", + "fractal heap direct blocks", + "fractal heap indirect blocks", + "free space headers", + "free space sections", + "shared OH message master table", + "shared OH message index", + "test entry" /* for testing only -- not used for actual files */ +}; + +herr_t +H5AC_create(H5F_t * f, + H5AC_cache_config_t *config_ptr) +{ + herr_t ret_value = SUCCEED; /* Return value */ + herr_t result; +#ifdef H5_HAVE_PARALLEL + char prefix[H5C__PREFIX_LEN] = ""; + MPI_Comm mpi_comm = MPI_COMM_NULL; + int mpi_rank = -1; + int mpi_size = -1; + H5AC_aux_t * aux_ptr = NULL; +#endif /* H5_HAVE_PARALLEL */ + + FUNC_ENTER_NOAPI(H5AC_create, FAIL) + + HDassert(f); + HDassert(NULL == f->shared->cache); + HDassert(config_ptr != NULL); + HDcompile_assert(NELMTS(H5AC_entry_type_names) == H5AC_NTYPES); + HDcompile_assert(H5C__MAX_NUM_TYPE_IDS == H5AC_NTYPES); + + result = H5AC_validate_config(config_ptr); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Bad cache configuration"); + } + +#ifdef H5_HAVE_PARALLEL + if ( IS_H5FD_MPI(f) ) { + + if ( (mpi_comm = H5F_mpi_get_comm(f)) == MPI_COMM_NULL ) { + + HGOTO_ERROR(H5E_VFL, H5E_CANTGET, FAIL, \ + "can't get MPI communicator") + } + + if ( (mpi_rank = H5F_mpi_get_rank(f)) < 0 ) { + + HGOTO_ERROR(H5E_VFL, H5E_CANTGET, FAIL, "can't get mpi rank") + } + + if ( (mpi_size = H5F_mpi_get_size(f)) < 0 ) { + + HGOTO_ERROR(H5E_VFL, H5E_CANTGET, FAIL, "can't get mpi size") + } + + /* There is no point in setting up the auxilary structure if size + * is less than or equal to 1, as there will never be any processes + * to broadcast the clean lists to. + */ + if ( mpi_size > 1 ) { + + if ( NULL == (aux_ptr = H5FL_CALLOC(H5AC_aux_t)) ) { + + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \ + "Can't allocate H5AC auxilary structure.") + + } else { + + aux_ptr->magic = H5AC__H5AC_AUX_T_MAGIC; + aux_ptr->mpi_comm = mpi_comm; + aux_ptr->mpi_rank = mpi_rank; + aux_ptr->mpi_size = mpi_size; + aux_ptr->write_permitted = FALSE; + aux_ptr->dirty_bytes_threshold = + H5AC__DEFAULT_DIRTY_BYTES_THRESHOLD; + aux_ptr->dirty_bytes = 0; +#if H5AC_DEBUG_DIRTY_BYTES_CREATION + aux_ptr->dirty_bytes_propagations = 0; + aux_ptr->unprotect_dirty_bytes = 0; + aux_ptr->unprotect_dirty_bytes_updates = 0; + aux_ptr->insert_dirty_bytes = 0; + aux_ptr->insert_dirty_bytes_updates = 0; + aux_ptr->rename_dirty_bytes = 0; + aux_ptr->rename_dirty_bytes_updates = 0; +#endif /* H5AC_DEBUG_DIRTY_BYTES_CREATION */ + aux_ptr->d_slist_ptr = NULL; + aux_ptr->d_slist_len = 0; + aux_ptr->c_slist_ptr = NULL; + aux_ptr->c_slist_len = 0; + aux_ptr->write_done = NULL; + + sprintf(prefix, "%d:", mpi_rank); + } + + if ( mpi_rank == 0 ) { + + aux_ptr->d_slist_ptr = + H5SL_create(H5SL_TYPE_HADDR,0.5,(size_t)16); + + if ( aux_ptr->d_slist_ptr == NULL ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTCREATE, FAIL, + "can't create dirtied entry list.") + } + + aux_ptr->c_slist_ptr = + H5SL_create(H5SL_TYPE_HADDR,0.5,(size_t)16); + + if ( aux_ptr->c_slist_ptr == NULL ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTCREATE, FAIL, + "can't create cleaned entry list.") + } + } + } + + if ( aux_ptr != NULL ) { + + if ( aux_ptr->mpi_rank == 0 ) { + + f->shared->cache = H5C_create(H5AC__DEFAULT_MAX_CACHE_SIZE, + H5AC__DEFAULT_MIN_CLEAN_SIZE, + (H5AC_NTYPES - 1), + (const char **)H5AC_entry_type_names, + H5AC_check_if_write_permitted, + TRUE, + H5AC_log_flushed_entry, + (void *)aux_ptr); + + } else { + + f->shared->cache = H5C_create(H5AC__DEFAULT_MAX_CACHE_SIZE, + H5AC__DEFAULT_MIN_CLEAN_SIZE, + (H5AC_NTYPES - 1), + (const char **)H5AC_entry_type_names, + NULL, + FALSE, +#if 0 /* this is useful debugging code -- keep it for a while */ /* JRM */ + H5AC_log_flushed_entry_dummy, +#else /* JRM */ + NULL, +#endif /* JRM */ + (void *)aux_ptr); + } + + } else { + + f->shared->cache = H5C_create(H5AC__DEFAULT_MAX_CACHE_SIZE, + H5AC__DEFAULT_MIN_CLEAN_SIZE, + (H5AC_NTYPES - 1), + (const char **)H5AC_entry_type_names, + H5AC_check_if_write_permitted, + TRUE, + NULL, + NULL); + } + } else { +#endif /* H5_HAVE_PARALLEL */ + /* The default max cache size and min clean size will frequently be + * overwritten shortly by the subsequent set resize config call. + * -- JRM + */ + + f->shared->cache = H5C_create(H5AC__DEFAULT_MAX_CACHE_SIZE, + H5AC__DEFAULT_MIN_CLEAN_SIZE, + (H5AC_NTYPES - 1), + (const char **)H5AC_entry_type_names, + H5AC_check_if_write_permitted, + TRUE, + NULL, + NULL); +#ifdef H5_HAVE_PARALLEL + } +#endif /* H5_HAVE_PARALLEL */ + + if ( NULL == f->shared->cache ) { + + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed") + + } +#ifdef H5_HAVE_PARALLEL + else if ( aux_ptr != NULL ) { + + result = H5C_set_prefix(f->shared->cache, prefix); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \ + "H5C_set_prefix() failed") + } + } +#endif /* H5_HAVE_PARALLEL */ + + result = H5AC_set_cache_config(f->shared->cache, config_ptr); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \ + "auto resize configuration failed") + } + +done: + +#ifdef H5_HAVE_PARALLEL + + /* if there is a failure, try to tidy up the auxilary structure */ + + if ( ret_value != SUCCEED ) { + + if ( aux_ptr != NULL ) { + + if ( aux_ptr->d_slist_ptr != NULL ) { + + H5SL_close(aux_ptr->d_slist_ptr); + } + + if ( aux_ptr->c_slist_ptr != NULL ) { + + H5SL_close(aux_ptr->c_slist_ptr); + } + + aux_ptr->magic = 0; + H5FL_FREE(H5AC_aux_t, aux_ptr); + aux_ptr = NULL; + } + } +#endif /* H5_HAVE_PARALLEL */ + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5AC_create() */ + + +/*------------------------------------------------------------------------- + * Function: H5AC_dest + * + * Purpose: Flushes all data to disk and destroys the cache. + * This function fails if any object are protected since the + * resulting file might not be consistent. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: Robb Matzke + * matzke@llnl.gov + * Jul 9 1997 + * + * Modifications: + * + * Complete re-design and re-write to support the re-designed + * metadata cache. + * JRM - 5/12/04 + * + * Abstracted the guts of the function to H5C_dest() in H5C.c, + * and then re-wrote the function as a wrapper for H5C_dest(). + * + * JRM - 6/7/04 + * + * Added code to free the auxiliary structure and its + * associated slist if present. + * JRM - 6/28/05 + * + * Added code to close the trace file if it is present. + * + * JRM - 6/8/06 + * + * JRM - 10/18/07 + * Modified code in support of revised cache API needed + * to permit journaling. + * + *------------------------------------------------------------------------- + */ +herr_t +H5AC_dest(H5F_t *f, hid_t dxpl_id) +{ + H5AC_t *cache = NULL; + herr_t ret_value=SUCCEED; /* Return value */ +#ifdef H5_HAVE_PARALLEL + H5AC_aux_t * aux_ptr = NULL; +#endif /* H5_HAVE_PARALLEL */ + + FUNC_ENTER_NOAPI(H5AC_dest, FAIL) + + assert(f); + assert(f->shared->cache); + cache = f->shared->cache; +#ifdef H5_HAVE_PARALLEL + aux_ptr = cache->aux_ptr; + + if ( aux_ptr != NULL ) { + + HDassert ( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC ); + } +#endif /* H5_HAVE_PARALLEL */ + +#if H5AC__TRACE_FILE_ENABLED + if ( H5AC_close_trace_file(cache) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5AC_close_trace_file() failed.") + } +#endif /* H5AC__TRACE_FILE_ENABLED */ + + if ( H5C_dest(f, dxpl_id) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTFREE, FAIL, "can't destroy cache") + } + + f->shared->cache = NULL; + +#ifdef H5_HAVE_PARALLEL + if ( aux_ptr != NULL ) { + + if ( aux_ptr->d_slist_ptr != NULL ) { + + H5SL_close(aux_ptr->d_slist_ptr); + } + + if ( aux_ptr->c_slist_ptr != NULL ) { + + H5SL_close(aux_ptr->c_slist_ptr); + } + + aux_ptr->magic = 0; + H5FL_FREE(H5AC_aux_t, aux_ptr); + aux_ptr = NULL; + } +#endif /* H5_HAVE_PARALLEL */ + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5AC_dest() */ + + +/*------------------------------------------------------------------------- + * Function: H5AC_begin_transaction() + * + * Purpose: Mark the beginning of a transaction. + * + * This function is just a wrapper for H5C_begin_transaction(). + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: John Mainzer + * 4/12/08 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +herr_t +H5AC_begin_transaction(hid_t id, + hbool_t * do_transaction_ptr, + H5O_loc_t * id_oloc_ptr, + hbool_t * id_oloc_open_ptr, + hbool_t * transaction_begun_ptr, + uint64_t * trans_num_ptr, + const char * api_call_name) +{ + herr_t result; + H5G_loc_t id_loc; + H5F_t * f = NULL; + H5AC_t * cache_ptr = NULL; + herr_t ret_value = SUCCEED; /* Return value */ +#if H5AC__TRACE_FILE_ENABLED + char trace[256] = ""; + FILE * trace_file_ptr = NULL; +#endif /* H5AC__TRACE_FILE_ENABLED */ + + FUNC_ENTER_NOAPI(H5AC_begin_transaction, FAIL) + + HDassert( do_transaction_ptr != NULL ); + HDassert( id_oloc_ptr != NULL ); + HDassert( id_oloc_open_ptr != NULL ); + HDassert( transaction_begun_ptr != NULL ); + HDassert( trans_num_ptr != NULL ); + HDassert( api_call_name != NULL ); + +#if H5AC__TRACE_FILE_ENABLED + /* For the begin transaction call, only the transaction number and the + * api call name. Write the return value to catch occult errors. + */ + if ( ( cache_ptr != NULL ) && + ( H5C_get_trace_file_ptr(cache_ptr, &trace_file_ptr) >= 0 ) && + ( trace_file_ptr != NULL ) ) { + + sprintf(trace, "H5AC_begin_transaction %s", api_call_name); + } +#endif /* H5AC__TRACE_FILE_ENABLED */ + + *id_oloc_open_ptr = FALSE; + *transaction_begun_ptr = FALSE; + + switch ( H5I_get_type(id) ) + { + case H5I_DATASPACE: + case H5I_ERROR_CLASS: + case H5I_ERROR_MSG: + case H5I_ERROR_STACK: + case H5I_GENPROP_CLS: + case H5I_GENPROP_LST: + *do_transaction_ptr = FALSE; + break; + + case H5I_DATATYPE: + { + H5T_t *dt = H5I_object(id); + if( ( dt == NULL ) || ( ! H5T_committed(dt) ) ) { + *do_transaction_ptr = FALSE; + } + } + break; + + case H5I_BADID: + *do_transaction_ptr = FALSE; + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, \ + "H5I_get_type() reports bad id") + break; + + default: + *do_transaction_ptr = TRUE; + } + + if ( *do_transaction_ptr ) { + + if ((H5G_loc((id), &id_loc) < 0) || (id_loc.oloc == NULL)) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "H5G_loc() failed"); + } + + *id_oloc_ptr = *(id_loc.oloc); + + if ( H5O_open(id_oloc_ptr) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, "H5O_open() failed."); + } + + *id_oloc_open_ptr = TRUE; + + f = id_oloc_ptr->file; + + if ( ( f == NULL ) || + ( f->shared == NULL ) || + ( f->shared->cache == NULL ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, "can't get cache_ptr."); + } + + cache_ptr = f->shared->cache; + + result = H5C_begin_transaction(cache_ptr, trans_num_ptr, api_call_name); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_begin_transaction() failed.") + } + + *transaction_begun_ptr = TRUE; + } + +done: + +#if H5AC__TRACE_FILE_ENABLED + if ( trace_file_ptr != NULL ) { + + HDfprintf(trace_file_ptr, "%s %llu %d\n", trace, + *trans_num_ptr, (int)ret_value); + } +#endif /* H5AC__TRACE_FILE_ENABLED */ + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5AC_begin_transaction() */ + + +/*------------------------------------------------------------------------- + * Function: H5AC_check_for_journaling() + * + * Purpose: Check the newly opened file for ongoing journaling. + * Fail if it exists and the journal recovered flag is + * not set. + * + * This function is just a wrapper for + * H5C_check_for_journaling(). + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: John Mainzer + * 7/4/08 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +herr_t +H5AC_check_for_journaling(H5F_t * f, + hid_t dxpl_id, + H5C_t * cache_ptr, + hbool_t journal_recovered) +{ + herr_t result; + herr_t ret_value = SUCCEED; /* Return value */ +#if H5AC__TRACE_FILE_ENABLED + char trace[256] = ""; + FILE * trace_file_ptr = NULL; +#endif /* H5AC__TRACE_FILE_ENABLED */ + + FUNC_ENTER_NOAPI(H5AC_check_for_journaling, FAIL) + + HDassert( f ); + HDassert( cache_ptr ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + +#if H5AC__TRACE_FILE_ENABLED + /* For the end transaction call, only the journal_recovered + * parameter is really needed. Write the return value to catch + * occult errors. + */ + if ( ( cache_ptr != NULL ) && + ( H5C_get_trace_file_ptr(cache_ptr, &trace_file_ptr) >= 0 ) && + ( trace_file_ptr != NULL ) ) { + + sprintf(trace, "H5AC_check_for_journaling %d ", + (int)journal_recovered); + } +#endif /* H5AC__TRACE_FILE_ENABLED */ + + /* test to see if there is a metadata journal that must be recovered + * before we can access the file. Do this at the end of file open, + * as the data we need for the check is not available at cache creation + * time. + */ + + result = H5C_check_for_journaling(f, dxpl_id, cache_ptr, + journal_recovered); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTCREATE, FAIL, \ + "H5C_check_for_journaling() reports failure.") + } + +done: + +#if H5AC__TRACE_FILE_ENABLED + if ( trace_file_ptr != NULL ) { + + HDfprintf(trace_file_ptr, "%s %d\n", trace, (int)ret_value); + } +#endif /* H5AC__TRACE_FILE_ENABLED */ + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5AC_check_for_journaling() */ + + +/*------------------------------------------------------------------------- + * Function: H5AC_deregister_mdjsc_callback() + * + * Purpose: Deregister a metadata journaling status change callback. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: John Mainzer + * 8/15/08 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +herr_t +H5AC_deregister_mdjsc_callback(H5F_t * file_ptr, + int32_t idx) +{ + herr_t result; + herr_t ret_value = SUCCEED; /* Return value */ + H5C_t * cache_ptr = NULL; +#if H5AC__TRACE_FILE_ENABLED + char trace[256] = ""; + FILE * trace_file_ptr = NULL; +#endif /* H5AC__TRACE_FILE_ENABLED */ + + FUNC_ENTER_NOAPI(H5AC_deregister_mdjsc_callback, FAIL) + + if ( ( file_ptr == NULL ) || + ( ( cache_ptr = file_ptr->shared->cache ) == NULL ) ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ + "Invalid parameter(s) on entry."); + } + +#if H5AC__TRACE_FILE_ENABLED + /* For the deregister metadata journaling status change callback + * call, only the idx is really needed. Write the return value to + * catch occult errors. + */ + if ( ( cache_ptr != NULL ) + && + ( H5C_get_trace_file_ptr((H5C_t *)cache_ptr, &trace_file_ptr) >= 0 ) + && + ( trace_file_ptr != NULL ) ) { + + sprintf(trace, "H5AC_deregister_mdjsc_callback %d ", idx); + } +#endif /* H5AC__TRACE_FILE_ENABLED */ + + result = H5C_deregister_mdjsc_callback(cache_ptr, idx); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_deregister_mdjsc_callback() failed."); + } + +done: + +#if H5AC__TRACE_FILE_ENABLED + if ( trace_file_ptr != NULL ) { + + HDfprintf(trace_file_ptr, "%s %d\n", trace, (int)ret_value); + } +#endif /* H5AC__TRACE_FILE_ENABLED */ + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5AC_deregister_mdjsc_callback() */ + + +/*------------------------------------------------------------------------- + * Function: H5AC_end_transaction() + * + * Purpose: Mark the end of a transaction. + * + * This function is just a wrapper for H5C_end_transaction(). + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: John Mainzer + * 4/12/08 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +herr_t +H5AC_end_transaction(hbool_t do_transaction, + H5O_loc_t * id_oloc_ptr, + hbool_t id_oloc_open, + hbool_t transaction_begun, + hid_t dxpl_id, + uint64_t trans_num, + const char * api_call_name) +{ + herr_t result; + herr_t ret_value=SUCCEED; /* Return value */ + H5F_t * f = NULL; + H5AC_t * cache_ptr = NULL; +#if H5AC__TRACE_FILE_ENABLED + char trace[256] = ""; + FILE * trace_file_ptr = NULL; +#endif /* H5AC__TRACE_FILE_ENABLED */ + + FUNC_ENTER_NOAPI(H5AC_end_transaction, FAIL) + + HDassert( id_oloc_ptr != NULL ); + HDassert( api_call_name != NULL ); + +#if H5AC__TRACE_FILE_ENABLED + /* For the end transaction call, only the transaction number and the + * api call name are really needed. Write the return value to catch + * occult errors. + */ + if ( ( cache_ptr != NULL ) && + ( H5C_get_trace_file_ptr(cache_ptr, &trace_file_ptr) >= 0 ) && + ( trace_file_ptr != NULL ) ) { + + sprintf(trace, "H5AC_end_transaction %s %llu", + api_call_name, trans_num); + } +#endif /* H5AC__TRACE_FILE_ENABLED */ + + if ( do_transaction ) { + + if ( transaction_begun ) { + + f = id_oloc_ptr->file; + + if ( ( f == NULL ) || + ( f->shared == NULL ) || + ( f->shared->cache == NULL ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "can't get cache_ptr."); + } + + cache_ptr = f->shared->cache; + + result = H5C_end_transaction(f, dxpl_id, cache_ptr, + trans_num, api_call_name); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_end_transaction() failed.") + } + } + + if ( id_oloc_open ) { + + result = H5O_close(id_oloc_ptr); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5O_close() failed."); + } + } + } + +done: + +#if H5AC__TRACE_FILE_ENABLED + if ( trace_file_ptr != NULL ) { + + HDfprintf(trace_file_ptr, "%s %d\n", trace, (int)ret_value); + } +#endif /* H5AC__TRACE_FILE_ENABLED */ + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5AC_end_transaction() */ + + +/*------------------------------------------------------------------------- + * Function: H5AC_register_mdjsc_callback() + * + * Purpose: Register a metadata journaling status change callback, + * and return the index assigned to the callback in *idx_ptr. + * + * If config_ptr is not NULL, return the current metadata + * journaling configuration in *config_ptr. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: John Mainzer + * 8/15/08 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +herr_t +H5AC_register_mdjsc_callback(const H5F_t * file_ptr, + H5C_mdj_status_change_func_t fcn_ptr, + void * data_ptr, + int32_t * idx_ptr, + H5C_mdj_config_t * config_ptr) +{ + herr_t result; + herr_t ret_value=SUCCEED; /* Return value */ + H5C_t * cache_ptr; +#if H5AC__TRACE_FILE_ENABLED + char trace[256] = ""; + FILE * trace_file_ptr = NULL; +#endif /* H5AC__TRACE_FILE_ENABLED */ + + FUNC_ENTER_NOAPI(H5AC_register_mdjsc_callback, FAIL) + + if ( ( file_ptr == NULL ) || + ( ( cache_ptr = file_ptr->shared->cache ) == NULL ) || + ( fcn_ptr == NULL ) || + ( idx_ptr == NULL ) ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ + "Invalid parameter(s) on entry."); + } + +#if H5AC__TRACE_FILE_ENABLED + /* For the register metadata journaling status change callback + * call, fnc_ptr, data_ptr, and the returned idx are all that + * are needed. Write the return value to catch occult errors. + */ + if ( ( cache_ptr != NULL ) && + ( H5C_get_trace_file_ptr(cache_ptr, &trace_file_ptr) >= 0 ) && + ( trace_file_ptr != NULL ) ) { + + sprintf(trace, "H5AC_register_mdjsc_callback 0x%lx 0x%lx ", + (unsigned long)(fcn_ptr), (unsigned long)(data_ptr)); + } +#endif /* H5AC__TRACE_FILE_ENABLED */ + + result = H5C_register_mdjsc_callback(cache_ptr, + fcn_ptr, + data_ptr, + idx_ptr); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_register_mdjsc_callback() failed."); + } + + if ( config_ptr != NULL ) { + + result = H5C_get_journal_config((H5C_t *)cache_ptr, config_ptr); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_get_journal_config() failed."); + } + } + +done: + +#if H5AC__TRACE_FILE_ENABLED + if ( trace_file_ptr != NULL ) { + + HDfprintf(trace_file_ptr, "%s %d %d\n", + trace, *idx_ptr, (int)ret_value); + } +#endif /* H5AC__TRACE_FILE_ENABLED */ + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5AC_register_mdjsc_callback() */ + + +/*------------------------------------------------------------------------- + * Function: H5AC_expunge_entry + * + * Purpose: Expunge the target entry from the cache without writing it + * to disk even if it is dirty. The entry must not be either + * pinned or protected. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: John Mainzer + * 6/30/06 + * + * Modifications: + * + * JRM - 10/18/07 + * Modified code in support of revised cache API needed + * to permit journaling. + * + *------------------------------------------------------------------------- + */ +herr_t +H5AC_expunge_entry(H5F_t *f, + hid_t dxpl_id, + const H5AC_class_t *type, + haddr_t addr) +{ + herr_t result; + herr_t ret_value=SUCCEED; /* Return value */ + H5AC_t * cache_ptr = NULL; +#if H5AC__TRACE_FILE_ENABLED + char trace[128] = ""; + FILE * trace_file_ptr = NULL; +#endif /* H5AC__TRACE_FILE_ENABLED */ + + FUNC_ENTER_NOAPI(H5AC_expunge_entry, FAIL) + + HDassert(f); + HDassert(f->shared); + HDassert(f->shared->cache); + HDassert(type); + HDassert(H5F_addr_defined(addr)); + + cache_ptr = f->shared->cache; + +#if H5AC__TRACE_FILE_ENABLED + /* For the expunge entry call, only the addr, and type id are really + * necessary in the trace file. Write the return value to catch occult + * errors. + */ + if ( ( cache_ptr != NULL ) && + ( H5C_get_trace_file_ptr(cache_ptr, &trace_file_ptr) >= 0 ) && + ( trace_file_ptr != NULL ) ) { + + sprintf(trace, "H5AC_expunge_entry 0x%lx %d", + (unsigned long)addr, + (int)(type->id)); + } +#endif /* H5AC__TRACE_FILE_ENABLED */ + + result = H5C_expunge_entry(f, + dxpl_id, + type, + addr); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTEXPUNGE, FAIL, \ + "H5C_expunge_entry() failed.") + } + +done: + +#if H5AC__TRACE_FILE_ENABLED + if ( trace_file_ptr != NULL ) { + + HDfprintf(trace_file_ptr, "%s %d\n", trace, (int)ret_value); + } +#endif /* H5AC__TRACE_FILE_ENABLED */ + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5AC_expunge_entry() */ + + +/*------------------------------------------------------------------------- + * Function: H5AC_flush + * + * Purpose: Flush (and possibly destroy) the metadata cache associated + * with the specified file. + * + * This is a re-write of an earlier version of the function + * which was reputedly capable of flushing (and destroying + * if requested) individual entries, individual entries if + * they match the supplied type, all entries of a given type, + * as well as all entries in the cache. + * + * As only this last capability is actually used at present, + * I have not implemented the other capabilities in this + * version of the function. + * + * The type and addr parameters are retained to avoid source + * code changed, but values other than NULL and HADDR_UNDEF + * respectively are errors. If all goes well, they should + * be removed, and the function renamed to something more + * descriptive -- perhaps H5AC_flush_cache. + * + * If the cache contains protected entries, the function will + * fail, as protected entries cannot be flushed. However + * all unprotected entries should be flushed before the + * function returns failure. + * + * For historical purposes, the original version of the + * purpose section is reproduced below: + * + * ============ Original Version of "Purpose:" ============ + * + * Flushes (and destroys if DESTROY is non-zero) the specified + * entry from the cache. If the entry TYPE is CACHE_FREE and + * ADDR is HADDR_UNDEF then all types of entries are + * flushed. If TYPE is CACHE_FREE and ADDR is defined then + * whatever is cached at ADDR is flushed. Otherwise the thing + * at ADDR is flushed if it is the correct type. + * + * If there are protected objects they will not be flushed. + * However, an attempt will be made to flush all non-protected + * items before this function returns failure. + * + * Return: Non-negative on success/Negative on failure if there was a + * request to flush all items and something was protected. + * + * Programmer: Robb Matzke + * matzke@llnl.gov + * Jul 9 1997 + * + * Modifications: + * Robb Matzke, 1999-07-27 + * The ADDR argument is passed by value. + * + * Complete re-write. See above for details. -- JRM 5/11/04 + * + * Abstracted the guts of the function to H5C_flush_cache() + * in H5C.c, and then re-wrote the function as a wrapper for + * H5C_flush_cache(). + * + * JRM - 6/7/04 + * + * JRM - 7/5/05 + * Modified function as part of a fix for a cache coherency + * bug in PHDF5. See the header comments on the H5AC_aux_t + * structure for details. + * + * JRM -- 5/11/06 + * Added call to the write_done callback. + * + * JRM -- 6/6/06 + * Added trace file support. + * + * JRM - 10/18/07 + * Modified code in support of revised cache API needed + * to permit journaling. + * + *------------------------------------------------------------------------- + */ +herr_t +H5AC_flush(H5F_t *f, hid_t dxpl_id, unsigned flags) +{ + herr_t status; + herr_t ret_value = SUCCEED; /* Return value */ +#ifdef H5_HAVE_PARALLEL + H5AC_aux_t * aux_ptr = NULL; + int mpi_code; +#endif /* H5_HAVE_PARALLEL */ +#if H5AC__TRACE_FILE_ENABLED + char trace[128] = ""; + FILE * trace_file_ptr = NULL; +#endif /* H5AC__TRACE_FILE_ENABLED */ + + + FUNC_ENTER_NOAPI(H5AC_flush, FAIL) + + HDassert(f); + HDassert(f->shared); + HDassert(f->shared->cache); + +#if H5AC__TRACE_FILE_ENABLED + /* For the flush, only the flags are really necessary in the trace file. + * Write the result to catch occult errors. + */ + if ( ( f != NULL ) && + ( f->shared != NULL ) && + ( f->shared->cache != NULL ) && + ( H5C_get_trace_file_ptr(f->shared->cache, &trace_file_ptr) >= 0) && + ( trace_file_ptr != NULL ) ) { + + sprintf(trace, "H5AC_flush 0x%x", flags); + } +#endif /* H5AC__TRACE_FILE_ENABLED */ + +#ifdef H5_HAVE_PARALLEL + aux_ptr = f->shared->cache->aux_ptr; + + if ( aux_ptr != NULL ) { + +#if H5AC_DEBUG_DIRTY_BYTES_CREATION + HDfprintf(stdout, + "%d::H5AC_flush: (u/uu/i/iu/r/ru) = %d/%d/%d/%d/%d/%d\n", + (int)(aux_ptr->mpi_rank), + (int)(aux_ptr->unprotect_dirty_bytes), + (int)(aux_ptr->unprotect_dirty_bytes_updates), + (int)(aux_ptr->insert_dirty_bytes), + (int)(aux_ptr->insert_dirty_bytes_updates), + (int)(aux_ptr->rename_dirty_bytes), + (int)(aux_ptr->rename_dirty_bytes_updates)); +#endif /* H5AC_DEBUG_DIRTY_BYTES_CREATION */ + + /* to prevent "messages from the future" we must synchronize all + * processes before we start the flush. Hence the following + * barrier. + */ + if ( MPI_SUCCESS != (mpi_code = MPI_Barrier(aux_ptr->mpi_comm)) ) { + + HMPI_GOTO_ERROR(FAIL, "MPI_Barrier failed", mpi_code) + } + + /* if the clear only flag is set, this flush will not involve any + * disk I/O. In such cases, it is not necessary to let process 0 + * flush first. + */ + if ( ( aux_ptr->mpi_rank == 0 ) && + ( (flags & H5AC__FLUSH_CLEAR_ONLY_FLAG) == 0 ) ) { + + unsigned init_flush_flags = H5AC__NO_FLAGS_SET; + + if ( ( (flags & H5AC__FLUSH_MARKED_ENTRIES_FLAG) != 0 ) && + ( (flags & H5AC__FLUSH_INVALIDATE_FLAG) == 0 ) ) { + + init_flush_flags |= H5AC__FLUSH_MARKED_ENTRIES_FLAG; + } + + aux_ptr->write_permitted = TRUE; + + status = H5C_flush_cache(f, + dxpl_id, + init_flush_flags); + + aux_ptr->write_permitted = FALSE; + + if ( status < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't flush.") + } + + if ( aux_ptr->write_done != NULL ) { + + (aux_ptr->write_done)(); + } + + } /* end if ( aux_ptr->mpi_rank == 0 ) */ + + status = H5AC_propagate_flushed_and_still_clean_entries_list(f, + H5AC_noblock_dxpl_id, + f->shared->cache, + FALSE); + } /* end if ( aux_ptr != NULL ) */ +#endif /* H5_HAVE_PARALLEL */ + + status = H5C_flush_cache(f, + dxpl_id, + flags); + + if ( status < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't flush entry.") + } + +done: + +#if H5AC__TRACE_FILE_ENABLED + if ( trace_file_ptr != NULL ) { + + HDfprintf(trace_file_ptr, "%s %d\n", trace, (int)ret_value); + } +#endif /* H5AC__TRACE_FILE_ENABLED */ + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5AC_flush() */ + + +/*------------------------------------------------------------------------- + * Function: H5AC_get_entry_status + * + * Purpose: Given a file address, determine whether the metadata + * cache contains an entry at that location. If it does, + * also determine whether the entry is dirty, protected, + * pinned, etc. and return that information to the caller + * in *status_ptr. + * + * If the specified entry doesn't exist, set *status_ptr + * to zero. + * + * On error, the value of *status_ptr is undefined. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: John Mainzer + * 4/27/06 + * + * Modifications: + * + * JRM - 10/18/07 + * Modified code in support of revised cache API needed + * to permit journaling. + * + *------------------------------------------------------------------------- + */ + +herr_t +H5AC_get_entry_status(H5F_t * f, + haddr_t addr, + unsigned * status_ptr) +{ + herr_t ret_value = SUCCEED; /* Return value */ + herr_t result; + hbool_t in_cache; + hbool_t is_dirty; + hbool_t is_protected; + hbool_t is_pinned; + size_t entry_size; + unsigned status = 0; + + FUNC_ENTER_NOAPI(H5AC_get_entry_status, FAIL) + + if ( ( f == NULL ) || + ( f->shared == NULL ) || + ( f->shared->cache == NULL ) || + ( f->shared->cache->magic != H5C__H5C_T_MAGIC ) || + ( ! H5F_addr_defined(addr) ) || + ( status_ptr == NULL ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad param(s) on entry.") + } + + result = H5C_get_entry_status(f, addr, &entry_size, &in_cache, + &is_dirty, &is_protected, &is_pinned); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_get_entry_status() failed.") + } + + if ( in_cache ) { + + status |= H5AC_ES__IN_CACHE; + + if ( is_dirty ) + status |= H5AC_ES__IS_DIRTY; + + if ( is_protected ) + status |= H5AC_ES__IS_PROTECTED; + + if ( is_pinned ) + status |= H5AC_ES__IS_PINNED; + } + + *status_ptr = status; + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5AC_get_entry_status() */ + + +/*------------------------------------------------------------------------- + * Function: H5AC_set + * + * Purpose: Adds the specified thing to the cache. The thing need not + * exist on disk yet, but it must have an address and disk + * space reserved. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: Robb Matzke + * matzke@llnl.gov + * Jul 9 1997 + * + * Modifications: + * Robb Matzke, 1999-07-27 + * The ADDR argument is passed by value. + * + * Bill Wendling, 2003-09-16 + * Added automatic "flush" if the FPHDF5 driver is being + * used. This'll write the metadata to the SAP where other, + * lesser processes can grab it. + * + * JRM - 5/13/04 + * Complete re-write for the new metadata cache. The new + * code is functionally almost identical to the old, although + * the sanity check for a protected entry is now an assert + * at the beginning of the function. + * + * JRM - 6/7/04 + * Abstracted the guts of the function to H5C_insert_entry() + * in H5C.c, and then re-wrote the function as a wrapper for + * H5C_insert_entry(). + * + * JRM - 1/6/05 + * Added the flags parameter. At present, this parameter is + * only used to set the new flush_marker field on the new + * entry. Since this doesn't apply to the SAP code, no change + * is needed there. Thus the only change to the body of the + * code is to pass the flags parameter through to + * H5C_insert_entry(). + * + * JRM - 6/6/05 + * Added code to force newly inserted entries to be dirty + * in the flexible parallel case. The normal case is handled + * in H5C.c. This is part of a series of changes directed at + * moving management of the dirty flag on cache entries into + * the cache code. + * + * JRM - 7/5/05 + * Added code to track dirty byte generation, and to trigger + * clean entry list propagation when it exceeds a user + * specified threshold. Note that this code only applies in + * the PHDF5 case. It should have no effect on either the + * serial or FPHSD5 cases. + * + * JRM - 6/6/06 + * Added trace file support. + * + * JRM - 10/18/07 + * Modified code in support of revised cache API needed + * to permit journaling. + * + *------------------------------------------------------------------------- + */ + +herr_t +H5AC_set(H5F_t *f, hid_t dxpl_id, const H5AC_class_t *type, haddr_t addr, size_t len, void *thing, unsigned int flags) +{ + herr_t result; + H5AC_info_t *info; + herr_t ret_value=SUCCEED; /* Return value */ +#ifdef H5_HAVE_PARALLEL + H5AC_aux_t * aux_ptr = NULL; +#endif /* H5_HAVE_PARALLEL */ +#if H5AC__TRACE_FILE_ENABLED + char trace[128] = ""; + size_t trace_entry_size = 0; + FILE * trace_file_ptr = NULL; +#endif /* H5AC__TRACE_FILE_ENABLED */ + + FUNC_ENTER_NOAPI(H5AC_set, FAIL) + + HDassert(f); + HDassert(f->shared); + HDassert(f->shared->cache); + HDassert(type); + HDassert(type->serialize); + HDassert(H5F_addr_defined(addr)); + HDassert(thing); + +#if H5AC__TRACE_FILE_ENABLED + /* For the insert, only the addr, size, type id and flags are really + * necessary in the trace file. Write the result to catch occult + * errors. + * + * Note that some data is not available right now -- put what we can + * in the trace buffer now, and fill in the rest at the end. + */ + if ( ( f != NULL ) && + ( f->shared != NULL ) && + ( f->shared->cache != NULL ) && + ( H5C_get_trace_file_ptr(f->shared->cache, &trace_file_ptr) >= 0) && + ( trace_file_ptr != NULL ) ) { + + sprintf(trace, "H5AC_set 0x%lx %ld %d 0x%x", + (unsigned long)addr, + (long)len, + type->id, + flags); + } +#endif /* H5AC__TRACE_FILE_ENABLED */ + + /* Get local copy of this information */ + info = (H5AC_info_t *)thing; + + info->addr = addr; + info->type = type; + info->is_protected = FALSE; + +#ifdef H5_HAVE_PARALLEL + if ( NULL != (aux_ptr = f->shared->cache->aux_ptr) ) { + + result = H5AC_log_inserted_entry(f, + f->shared->cache, + (H5AC_info_t *)thing, + type, + addr, + len); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTINS, FAIL, \ + "H5AC_log_inserted_entry() failed.") + } + } +#endif /* H5_HAVE_PARALLEL */ + + result = H5C_insert_entry(f, + dxpl_id, + type, + addr, + len, + thing, + flags); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTINS, FAIL, "H5C_insert_entry() failed") + } + +#if H5AC__TRACE_FILE_ENABLED + if ( trace_file_ptr != NULL ) { + + /* make note of the entry size */ + trace_entry_size = ((H5C_cache_entry_t *)thing)->size; + } +#endif /* H5AC__TRACE_FILE_ENABLED */ + +#ifdef H5_HAVE_PARALLEL + if ( ( aux_ptr != NULL ) && + ( aux_ptr->dirty_bytes >= aux_ptr->dirty_bytes_threshold ) ) { + + result = H5AC_propagate_flushed_and_still_clean_entries_list(f, + H5AC_noblock_dxpl_id, + f->shared->cache, + TRUE); + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \ + "Can't propagate clean entries list.") + } + } +#endif /* H5_HAVE_PARALLEL */ + +done: + +#if H5AC__TRACE_FILE_ENABLED + if ( trace_file_ptr != NULL ) { + + HDfprintf(trace_file_ptr, "%s %d %d\n", trace, + (int)trace_entry_size, + (int)ret_value); + } +#endif /* H5AC__TRACE_FILE_ENABLED */ + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5AC_set() */ + + +/*------------------------------------------------------------------------- + * Function: H5AC_mark_pinned_entry_dirty + * + * Purpose: Mark a pinned entry as dirty. The target entry MUST be + * be pinned, and MUST be unprotected. + * + * If the entry has changed size, the function updates + * data structures for the size change. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: John Mainzer + * 4/11/06 + * + *------------------------------------------------------------------------- + */ +herr_t +H5AC_mark_pinned_entry_dirty(void * thing, + hbool_t size_changed, + size_t new_size) +{ +#if H5AC__TRACE_FILE_ENABLED + char trace[128] = ""; + FILE * trace_file_ptr = NULL; +#endif /* H5AC__TRACE_FILE_ENABLED */ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5AC_mark_pinned_entry_dirty, FAIL) + + /* Sanity check */ + HDassert(thing); + +#if H5AC__TRACE_FILE_ENABLED + /* For the mark pinned entry dirty call, only the addr, size_changed, + * and new_size are really necessary in the trace file. Write the result + * to catch occult errors. + */ + if((H5C_get_trace_file_ptr_from_entry(thing, &trace_file_ptr) >= 0) && + (NULL != trace_file_ptr)) + sprintf(trace, "%s 0x%lx %d %d", FUNC, + (unsigned long)(((H5C_cache_entry_t *)thing)->addr), + (int)size_changed, + (int)new_size); +#endif /* H5AC__TRACE_FILE_ENABLED */ + +#ifdef H5_HAVE_PARALLEL +{ + H5AC_info_t *entry_ptr = (H5AC_info_t *)thing; + H5C_t *cache_ptr = entry_ptr->cache_ptr; + + HDassert(cache_ptr); + HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC); + + if((!entry_ptr->is_dirty) && (NULL != cache_ptr->aux_ptr)) { + /* Check for usage errors */ + if(!entry_ptr->is_pinned) + HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKDIRTY, FAIL, "Entry isn't pinned??") + if(entry_ptr->is_protected) + HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKDIRTY, FAIL, "Entry is protected??") + + if(H5AC_log_dirtied_entry(entry_ptr, entry_ptr->addr, size_changed, new_size) < 0) + HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKDIRTY, FAIL, "can't log dirtied entry") + } /* end if */ +} +#endif /* H5_HAVE_PARALLEL */ + + if(H5C_mark_pinned_entry_dirty(thing, size_changed, new_size) < 0) + HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKDIRTY, FAIL, "can't mark pinned entry dirty") + +done: +#if H5AC__TRACE_FILE_ENABLED + if(trace_file_ptr) + HDfprintf(trace_file_ptr, "%s %d\n", trace, (int)ret_value); +#endif /* H5AC__TRACE_FILE_ENABLED */ + + FUNC_LEAVE_NOAPI(ret_value) +} /* H5AC_mark_pinned_entry_dirty() */ + + +/*------------------------------------------------------------------------- + * Function: H5AC_mark_pinned_or_protected_entry_dirty + * + * Purpose: Mark a pinned or protected entry as dirty. The target + * entry MUST be either pinned, protected, or both. + * + * Unlike H5AC_mark_pinned_entry_dirty(), this function does + * not support size changes. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: John Mainzer + * 5/16/06 + * + *------------------------------------------------------------------------- + */ +herr_t +H5AC_mark_pinned_or_protected_entry_dirty(void *thing) +{ +#if H5AC__TRACE_FILE_ENABLED + char trace[128] = ""; + FILE * trace_file_ptr = NULL; +#endif /* H5AC__TRACE_FILE_ENABLED */ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5AC_mark_pinned_or_protected_entry_dirty, FAIL) + + /* Sanity check */ + HDassert(thing); + +#if H5AC__TRACE_FILE_ENABLED + /* For the mark pinned or protected entry dirty call, only the addr + * is really necessary in the trace file. Write the result to catch + * occult errors. + */ + if((H5C_get_trace_file_ptr_from_entry(thing, &trace_file_ptr) >= 0) && + (NULL != trace_file_ptr)) + sprintf(trace, "%s 0x%lx", FUNC, + (unsigned long)(((H5C_cache_entry_t *)thing)->addr)); +#endif /* H5AC__TRACE_FILE_ENABLED */ + +#ifdef H5_HAVE_PARALLEL +{ + H5AC_info_t *entry_ptr = (H5AC_info_t *)thing; + H5C_t *cache_ptr = entry_ptr->cache_ptr; + + HDassert(cache_ptr); + HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC); + + if((!entry_ptr->is_dirty) && (!entry_ptr->is_protected) && + (entry_ptr->is_pinned) && (NULL != cache_ptr->aux_ptr)) { + if(H5AC_log_dirtied_entry(entry_ptr, entry_ptr->addr, FALSE, 0) < 0) + HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKDIRTY, FAIL, "can't log dirtied entry") + } /* end if */ +} +#endif /* H5_HAVE_PARALLEL */ + + if(H5C_mark_pinned_or_protected_entry_dirty(thing) < 0) + HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKDIRTY, FAIL, "can't mark pinned or protected entry dirty") + +done: +#if H5AC__TRACE_FILE_ENABLED + if(trace_file_ptr) + HDfprintf(trace_file_ptr, "%s %d\n", trace, (int)ret_value); +#endif /* H5AC__TRACE_FILE_ENABLED */ + + FUNC_LEAVE_NOAPI(ret_value) +} /* H5AC_mark_pinned_entry_dirty() */ + + +/*------------------------------------------------------------------------- + * Function: H5AC_rename + * + * Purpose: Use this function to notify the cache that an object's + * file address changed. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: Robb Matzke + * matzke@llnl.gov + * Jul 9 1997 + * + * Modifications: + * Robb Matzke, 1999-07-27 + * The OLD_ADDR and NEW_ADDR arguments are passed by value. + * + * JRM 5/17/04 + * Complete rewrite for the new meta-data cache. + * + * JRM - 6/7/04 + * Abstracted the guts of the function to H5C_rename_entry() + * in H5C.c, and then re-wrote the function as a wrapper for + * H5C_rename_entry(). + * + * JRM - 7/5/05 + * Added code to track dirty byte generation, and to trigger + * clean entry list propagation when it exceeds a user + * specified threshold. Note that this code only applies in + * the PHDF5 case. It should have no effect on either the + * serial or FPHSD5 cases. + * + * Note that this code presumes that the renamed entry will + * be present in all caches -- which it must be at present. + * To maintain this invarient, only rename entries immediately + * after you unprotect them. + * + * JRM - 6/6/06 + * Added trace file support. + * + * JRM - 10/18/07 + * Modified code in support of revised cache API needed + * to permit journaling. + * + *------------------------------------------------------------------------- + */ +herr_t +H5AC_rename(H5F_t *f, const H5AC_class_t *type, haddr_t old_addr, haddr_t new_addr) +{ + herr_t result; + herr_t ret_value=SUCCEED; /* Return value */ +#ifdef H5_HAVE_PARALLEL + H5AC_aux_t * aux_ptr = NULL; +#endif /* H5_HAVE_PARALLEL */ +#if H5AC__TRACE_FILE_ENABLED + char trace[128] = ""; + FILE * trace_file_ptr = NULL; +#endif /* H5AC__TRACE_FILE_ENABLED */ + + FUNC_ENTER_NOAPI(H5AC_rename, FAIL) + + HDassert(f); + HDassert(f->shared->cache); + HDassert(type); + HDassert(H5F_addr_defined(old_addr)); + HDassert(H5F_addr_defined(new_addr)); + HDassert(H5F_addr_ne(old_addr, new_addr)); + +#if H5AC__TRACE_FILE_ENABLED + /* For the rename call, only the old addr and new addr are really + * necessary in the trace file. Include the type id so we don't have to + * look it up. Also write the result to catch occult errors. + */ + if ( ( f != NULL ) && + ( f->shared != NULL ) && + ( f->shared->cache != NULL ) && + ( H5C_get_trace_file_ptr(f->shared->cache, &trace_file_ptr) >= 0) && + ( trace_file_ptr != NULL ) ) { + + sprintf(trace, "H5AC_rename 0x%lx 0x%lx %d", + (unsigned long)old_addr, + (unsigned long)new_addr, + (int)(type->id)); + } +#endif /* H5AC__TRACE_FILE_ENABLED */ + +#ifdef H5_HAVE_PARALLEL + if ( NULL != (aux_ptr = f->shared->cache->aux_ptr) ) { + + result = H5AC_log_renamed_entry(f, + old_addr, + new_addr); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \ + "H5AC_log_renamed_entry() failed.") + } + } +#endif /* H5_HAVE_PARALLEL */ + + result = H5C_rename_entry(f->shared->cache, + type, + old_addr, + new_addr); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTRENAME, FAIL, \ + "H5C_rename_entry() failed.") + } + +#ifdef H5_HAVE_PARALLEL + if ( ( aux_ptr != NULL ) && + ( aux_ptr->dirty_bytes >= aux_ptr->dirty_bytes_threshold ) ) { + + result = H5AC_propagate_flushed_and_still_clean_entries_list(f, + H5AC_noblock_dxpl_id, + f->shared->cache, + TRUE); + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \ + "Can't propagate clean entries list.") + } + } +#endif /* H5_HAVE_PARALLEL */ + +done: + +#if H5AC__TRACE_FILE_ENABLED + if ( trace_file_ptr != NULL ) { + + HDfprintf(trace_file_ptr, "%s %d\n", trace, (int)ret_value); + } +#endif /* H5AC__TRACE_FILE_ENABLED */ + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5AC_rename() */ + + +/*------------------------------------------------------------------------- + * Function: H5AC_pin_protected_entry() + * + * Purpose: Pin a protected cache entry. The entry must be protected + * at the time of call, and must be unpinned. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: John Mainzer + * 4/27/06 + * + *------------------------------------------------------------------------- + */ +herr_t +H5AC_pin_protected_entry(void *thing) +{ +#if H5AC__TRACE_FILE_ENABLED + char trace[128] = ""; + FILE * trace_file_ptr = NULL; +#endif /* H5AC__TRACE_FILE_ENABLED */ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5AC_pin_protected_entry, FAIL) + +#if H5AC__TRACE_FILE_ENABLED + /* For the pin protected entry call, only the addr is really necessary + * in the trace file. Also write the result to catch occult errors. + */ + if((H5C_get_trace_file_ptr_from_entry(thing, &trace_file_ptr) >= 0) && + (NULL != trace_file_ptr)) + sprintf(trace, "%s 0x%lx", FUNC, + (unsigned long)(((H5C_cache_entry_t *)thing)->addr)); +#endif /* H5AC__TRACE_FILE_ENABLED */ + + if(H5C_pin_protected_entry(thing) < 0) + HGOTO_ERROR(H5E_CACHE, H5E_CANTPIN, FAIL, "can't unpin entry") + +done: +#if H5AC__TRACE_FILE_ENABLED + if(trace_file_ptr) + HDfprintf(trace_file_ptr, "%s %d\n", trace, (int)ret_value); +#endif /* H5AC__TRACE_FILE_ENABLED */ + + FUNC_LEAVE_NOAPI(ret_value) +} /* H5AC_pin_protected_entry() */ + + +/*------------------------------------------------------------------------- + * Function: H5AC_protect + * + * Purpose: If the target entry is not in the cache, load it. If + * necessary, attempt to evict one or more entries to keep + * the cache within its maximum size. + * + * Mark the target entry as protected, and return its address + * to the caller. The caller must call H5AC_unprotect() when + * finished with the entry. + * + * While it is protected, the entry may not be either evicted + * or flushed -- nor may it be accessed by another call to + * H5AC_protect. Any attempt to do so will result in a failure. + * + * This comment is a re-write of the original Purpose: section. + * For historical interest, the original version is reproduced + * below: + * + * Original Purpose section: + * + * Similar to H5AC_find() except the object is removed from + * the cache and given to the caller, preventing other parts + * of the program from modifying the protected object or + * preempting it from the cache. + * + * The caller must call H5AC_unprotect() when finished with + * the pointer. + * + * Return: Success: Ptr to the object. + * + * Failure: NULL + * + * Programmer: Robb Matzke + * matzke@llnl.gov + * Sep 2 1997 + * + * Modifications: + * Robb Matzke, 1999-07-27 + * The ADDR argument is passed by value. + * + * Bill Wendling, 2003-09-10 + * Added parameter to indicate whether this is a READ or + * WRITE type of protect. + * + * JRM -- 5/17/04 + * Complete re-write for the new client cache. See revised + * Purpose section above. + * + * JRM - 6/7/04 + * Abstracted the guts of the function to H5C_protect() + * in H5C.c, and then re-wrote the function as a wrapper for + * H5C_protect(). + * + * JRM - 6/6/06 + * Added trace file support. + * + * JRM - 3/18/07 + * Modified code to support the new flags parameter for + * H5C_protect(). For now, that means passing in the + * H5C_READ_ONLY_FLAG if rw == H5AC_READ. + * + * Also updated the trace file output to save the + * rw parameter, since we are now doing something with it. + * + * JRM - 10/18/07 + * Modified code in support of revised cache API needed + * to permit journaling. + * + *------------------------------------------------------------------------- + */ +void * +H5AC_protect(H5F_t *f, + hid_t dxpl_id, + const H5AC_class_t *type, + haddr_t addr, + size_t len, + void *udata, + H5AC_protect_t rw) +{ + /* char * fcn_name = "H5AC_protect"; */ + unsigned protect_flags = H5C__NO_FLAGS_SET; + void * thing = (void *)NULL; + void * ret_value; /* Return value */ +#if H5AC__TRACE_FILE_ENABLED + char trace[128] = ""; + size_t trace_entry_size = 0; + FILE * trace_file_ptr = NULL; +#endif /* H5AC__TRACE_FILE_ENABLED */ + + FUNC_ENTER_NOAPI(H5AC_protect, NULL) + + /* check args */ + HDassert(f); + HDassert(f->shared); + HDassert(f->shared->cache); + HDassert(type); + HDassert(type->serialize); + HDassert(H5F_addr_defined(addr)); + + /* Check for invalid access request */ + if(0 == (f->intent & H5F_ACC_RDWR) && rw == H5AC_WRITE) + HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, NULL, "no write intent on file") + +#if H5AC__TRACE_FILE_ENABLED + /* For the protect call, only the addr and type id is really necessary + * in the trace file. Include the size of the entry protected as a + * sanity check. Also indicate whether the call was successful to + * catch occult errors. + */ + if ( ( f != NULL ) && + ( f->shared != NULL ) && + ( f->shared->cache != NULL ) && + ( H5C_get_trace_file_ptr(f->shared->cache, &trace_file_ptr) >= 0) && + ( trace_file_ptr != NULL ) ) { + + char * rw_string; + + if ( rw == H5AC_WRITE ) { + + rw_string = "H5AC_WRITE"; + + } else if ( rw == H5AC_READ ) { + + rw_string = "H5AC_READ"; + + } else { + + rw_string = "???"; + } + + sprintf(trace, "H5AC_protect 0x%lx %ld %d %s", + (unsigned long)addr, + (long)len, + (int)(type->id), + rw_string); + } +#endif /* H5AC__TRACE_FILE_ENABLED */ + + if ( rw == H5AC_READ ) { + + protect_flags |= H5C__READ_ONLY_FLAG; + } + + thing = H5C_protect(f, + dxpl_id, + type, + addr, + len, + udata, + protect_flags); + + if ( thing == NULL ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, "H5C_protect() failed.") + } + +#if H5AC__TRACE_FILE_ENABLED + if ( trace_file_ptr != NULL ) { + + /* make note of the entry size */ + trace_entry_size = ((H5C_cache_entry_t *)thing)->size; + } +#endif /* H5AC__TRACE_FILE_ENABLED */ + + /* Set return value */ + ret_value = thing; + +done: + +#if H5AC__TRACE_FILE_ENABLED + if ( trace_file_ptr != NULL ) { + + HDfprintf(trace_file_ptr, "%s %d %d\n", trace, + (int)trace_entry_size, + (int)(ret_value != NULL)); + } +#endif /* H5AC__TRACE_FILE_ENABLED */ + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5AC_protect() */ + + +/*------------------------------------------------------------------------- + * Function: H5AC_resize_pinned_entry + * + * Purpose: Resize a pinned entry. The target entry MUST be + * be pinned, and MUST not be unprotected. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: John Mainzer + * 7/5/06 + * + *------------------------------------------------------------------------- + */ +herr_t +H5AC_resize_pinned_entry(void *thing, size_t new_size) +{ +#if H5AC__TRACE_FILE_ENABLED + char trace[128] = ""; + FILE * trace_file_ptr = NULL; +#endif /* H5AC__TRACE_FILE_ENABLED */ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5AC_resize_pinned_entry, FAIL) + + /* Sanity check */ + HDassert(thing); + +#if H5AC__TRACE_FILE_ENABLED + /* For the resize pinned entry call, only the addr, and new_size are + * really necessary in the trace file. Write the result to catch + * occult errors. + */ + if((H5C_get_trace_file_ptr_from_entry(thing, &trace_file_ptr) >= 0) && + (NULL != trace_file_ptr)) + sprintf(trace, "%s 0x%lx %d", FUNC, + (unsigned long)(((H5C_cache_entry_t *)thing)->addr), + (int)new_size); +#endif /* H5AC__TRACE_FILE_ENABLED */ + +#ifdef H5_HAVE_PARALLEL +{ + H5AC_info_t * entry_ptr = (H5AC_info_t *)thing; + H5C_t *cache_ptr = entry_ptr->cache_ptr; + + HDassert(cache_ptr); + HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC); + + if((!entry_ptr->is_dirty) && (NULL != cache_ptr->aux_ptr)) { + /* Check for usage errors */ + if(!entry_ptr->is_pinned) + HGOTO_ERROR(H5E_CACHE, H5E_CANTRESIZE, FAIL, "Entry isn't pinned??") + if(entry_ptr->is_protected) + HGOTO_ERROR(H5E_CACHE, H5E_CANTRESIZE, FAIL, "Entry is protected??") + + if(H5AC_log_dirtied_entry(entry_ptr, entry_ptr->addr, TRUE, new_size) < 0) + HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKDIRTY, FAIL, "can't log entry") + } /* end if */ +} +#endif /* H5_HAVE_PARALLEL */ + + if(H5C_resize_pinned_entry(thing, new_size) < 0 ) + HGOTO_ERROR(H5E_CACHE, H5E_CANTRESIZE, FAIL, "can't resize entry") + +done: +#if H5AC__TRACE_FILE_ENABLED + if(trace_file_ptr) + HDfprintf(trace_file_ptr, "%s %d\n", trace, (int)ret_value); +#endif /* H5AC__TRACE_FILE_ENABLED */ + + FUNC_LEAVE_NOAPI(ret_value) +} /* H5AC_resize_pinned_entry() */ + + +/*------------------------------------------------------------------------- + * Function: H5AC_unpin_entry() + * + * Purpose: Unpin a cache entry. The entry must be unprotected at + * the time of call, and must be pinned. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: John Mainzer + * 4/11/06 + * + *------------------------------------------------------------------------- + */ +herr_t +H5AC_unpin_entry(void *thing) +{ +#if H5AC__TRACE_FILE_ENABLED + char trace[128] = ""; + FILE * trace_file_ptr = NULL; +#endif /* H5AC__TRACE_FILE_ENABLED */ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5AC_unpin_entry, FAIL) + + /* Sanity check */ + HDassert(thing); + +#if H5AC__TRACE_FILE_ENABLED + /* For the unpin entry call, only the addr is really necessary + * in the trace file. Also write the result to catch occult errors. + */ + if((H5C_get_trace_file_ptr_from_entry(thing, &trace_file_ptr) >= 0) && + (NULL != trace_file_ptr)) + sprintf(trace, "%s 0x%lx", FUNC, + (unsigned long)(((H5C_cache_entry_t *)thing)->addr)); +#endif /* H5AC__TRACE_FILE_ENABLED */ + + if(H5C_unpin_entry(thing) < 0) + HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPIN, FAIL, "can't unpin entry") + +done: +#if H5AC__TRACE_FILE_ENABLED + if(trace_file_ptr) + HDfprintf(trace_file_ptr, "%s %d\n", trace, (int)ret_value); +#endif /* H5AC__TRACE_FILE_ENABLED */ + + FUNC_LEAVE_NOAPI(ret_value) +} /* H5AC_unpin_entry() */ + + +/*------------------------------------------------------------------------- + * Function: H5AC_unprotect + * + * Purpose: Undo an H5AC_protect() call -- specifically, mark the + * entry as unprotected, remove it from the protected list, + * and give it back to the replacement policy. + * + * The TYPE and ADDR arguments must be the same as those in + * the corresponding call to H5AC_protect() and the THING + * argument must be the value returned by that call to + * H5AC_protect(). + * + * If the deleted flag is TRUE, simply remove the target entry + * from the cache, clear it, and free it without writing it to + * disk. + * + * This verion of the function is a complete re-write to + * use the new metadata cache. While there isn't all that + * much difference between the old and new Purpose sections, + * the original version is given below. + * + * Original purpose section: + * + * This function should be called to undo the effect of + * H5AC_protect(). The TYPE and ADDR arguments should be the + * same as the corresponding call to H5AC_protect() and the + * THING argument should be the value returned by H5AC_protect(). + * If the DELETED flag is set, then this object has been deleted + * from the file and should not be returned to the cache. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: Robb Matzke + * matzke@llnl.gov + * Sep 2 1997 + * + * Modifications: + * Robb Matzke, 1999-07-27 + * The ADDR argument is passed by value. + * + * Quincey Koziol, 2003-03-19 + * Added "deleted" argument + * + * Bill Wendling, 2003-09-18 + * If this is an FPHDF5 driver and the data is dirty, + * perform a "flush" that writes the data to the SAP. + * + * John Mainzer 5/19/04 + * Complete re-write for the new metadata cache. + * + * JRM - 6/7/04 + * Abstracted the guts of the function to H5C_unprotect() + * in H5C.c, and then re-wrote the function as a wrapper for + * H5C_unprotect(). + * + * JRM - 1/6/05 + * Replaced the deleted parameter with the new flags parameter. + * Since the deleted parameter is not used by the FPHDF5 code, + * the only change in the body is to replace the deleted + * parameter with the flags parameter in the call to + * H5C_unprotect(). + * + * JRM - 6/6/05 + * Added the dirtied flag and supporting code. This is + * part of a collection of changes directed at moving + * management of cache entry dirty flags into the H5C code. + * + * JRM - 7/5/05 + * Added code to track dirty byte generation, and to trigger + * clean entry list propagation when it exceeds a user + * specified threshold. Note that this code only applies in + * the PHDF5 case. It should have no effect on either the + * serial or FPHSD5 cases. + * + * JRM - 9/8/05 + * Added code to track entry size changes. This is necessary + * as it can effect dirty byte creation counts, thereby + * throwing the caches out of sync in the PHDF5 case. + * + * JRM - 5/16/06 + * Added code to use the new dirtied field in + * H5C_cache_entry_t in the test to see if the entry has + * been dirtied. + * + * JRM - 6/7/06 + * Added support for the trace file. + * + * JRM - 10/18/07 + * Modified code in support of revised cache API needed + * to permit journaling. + * + * Note that the H5AC__SIZE_CHANGED_FLAG must now be set if + * the size of the entry has changed. + * + *------------------------------------------------------------------------- + */ + +herr_t +H5AC_unprotect(H5F_t *f, hid_t dxpl_id, const H5AC_class_t *type, + haddr_t addr, size_t new_size, void *thing, unsigned flags) +{ + herr_t result; + hbool_t size_changed = FALSE; + hbool_t dirtied; +#ifdef H5_HAVE_PARALLEL + H5AC_aux_t * aux_ptr = NULL; +#endif /* H5_HAVE_PARALLEL */ +#if H5AC__TRACE_FILE_ENABLED + char trace[128] = ""; + unsigned trace_flags = 0; + FILE * trace_file_ptr = NULL; +#endif /* H5AC__TRACE_FILE_ENABLED */ + herr_t ret_value=SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5AC_unprotect, FAIL) + + HDassert(f); + HDassert(f->shared); + HDassert(f->shared->cache); + HDassert(type); + HDassert(type->deserialize); + HDassert(H5F_addr_defined(addr)); + HDassert(thing); + HDassert( ((H5AC_info_t *)thing)->addr == addr ); + HDassert( ((H5AC_info_t *)thing)->type == type ); + +#if H5AC__TRACE_FILE_ENABLED + /* For the unprotect call, only the addr, type id, flags, and possible + * new size are really necessary in the trace file. Write the return + * value to catch occult errors. + */ + if ( ( f != NULL ) && + ( f->shared != NULL ) && + ( f->shared->cache != NULL ) && + ( H5C_get_trace_file_ptr(f->shared->cache, &trace_file_ptr) >= 0) && + ( trace_file_ptr != NULL ) ) { + + sprintf(trace, "H5AC_unprotect 0x%lx %d", + (unsigned long)addr, + (int)(type->id)); + + trace_flags = flags; + } +#endif /* H5AC__TRACE_FILE_ENABLED */ + + dirtied = ( ( (flags & H5AC__DIRTIED_FLAG) == H5AC__DIRTIED_FLAG ) || + ( ((H5AC_info_t *)thing)->dirtied ) ); + + size_changed = ( (flags & H5AC__SIZE_CHANGED_FLAG) == + H5AC__SIZE_CHANGED_FLAG ); + +#ifdef H5_HAVE_PARALLEL + if ( ( dirtied ) && ( ((H5AC_info_t *)thing)->is_dirty == FALSE ) && + ( NULL != (aux_ptr = f->shared->cache->aux_ptr) ) ) { + + if(H5AC_log_dirtied_entry(thing, addr, size_changed, new_size) < 0) + HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "can't log entry") + } + + if ( ( (flags & H5C__DELETED_FLAG) != 0 ) && + ( NULL != (aux_ptr = f->shared->cache->aux_ptr) ) && + ( aux_ptr->mpi_rank == 0 ) ) { + + result = H5AC_log_deleted_entry(f->shared->cache, + (H5AC_info_t *)thing, + addr, + flags); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \ + "H5AC_log_deleted_entry() failed.") + } + } +#endif /* H5_HAVE_PARALLEL */ + + result = H5C_unprotect(f, + dxpl_id, + type, + addr, + thing, + flags, + new_size); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \ + "H5C_unprotect() failed.") + } + +#ifdef H5_HAVE_PARALLEL + if ( ( aux_ptr != NULL ) && + ( aux_ptr->dirty_bytes >= aux_ptr->dirty_bytes_threshold ) ) { + + result = H5AC_propagate_flushed_and_still_clean_entries_list(f, + H5AC_noblock_dxpl_id, + f->shared->cache, + TRUE); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \ + "Can't propagate clean entries list.") + } + } +#endif /* H5_HAVE_PARALLEL */ + +done: + +#if H5AC__TRACE_FILE_ENABLED + if ( trace_file_ptr != NULL ) { + + HDfprintf(trace_file_ptr, "%s %d %x %d\n", + trace, + (int)new_size, + (unsigned)flags, + (int)ret_value); + } +#endif /* H5AC__TRACE_FILE_ENABLED */ + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5AC_unprotect() */ + + +/*------------------------------------------------------------------------- + * Function: HA5C_set_write_done_callback + * + * Purpose: Set the value of the write_done callback. This callback + * is used to improve performance of the parallel test bed + * for the cache. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: John Mainzer + * 5/11/06 + * + * Modifications: + * + * JRM - 10/18/07 + * Modified code in support of revised cache API needed + * to permit journaling. + * + *------------------------------------------------------------------------- + */ + +#ifdef H5_HAVE_PARALLEL +herr_t +H5AC_set_write_done_callback(H5C_t * cache_ptr, + void (* write_done)(void)) +{ + herr_t ret_value = SUCCEED; /* Return value */ + H5AC_aux_t * aux_ptr = NULL; + + FUNC_ENTER_NOAPI(H5AC_set_write_done_callback, FAIL) + + /* This would normally be an assert, but we need to use an HGOTO_ERROR + * call to shut up the compiler. + */ + if ( ( ! cache_ptr ) || ( cache_ptr->magic != H5C__H5C_T_MAGIC ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr") + } + + aux_ptr = cache_ptr->aux_ptr; + + HDassert( aux_ptr != NULL ); + HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC ); + + aux_ptr->write_done = write_done; + +done: + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5AC_set_write_done_callback() */ +#endif /* H5_HAVE_PARALLEL */ + + +/*------------------------------------------------------------------------- + * Function: H5AC_stats + * + * Purpose: Prints statistics about the cache. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: Robb Matzke + * Thursday, October 30, 1997 + * + * Modifications: + * John Mainzer 5/19/04 + * Re-write to support the new metadata cache. + * + * JRM - 6/7/04 + * Abstracted the guts of the function to H5C_stats() + * in H5C.c, and then re-wrote the function as a wrapper for + * H5C_stats(). + * + * JRM - 10/18/07 + * Modified code in support of revised cache API needed + * to permit journaling. + * + *------------------------------------------------------------------------- + */ +herr_t +H5AC_stats(const H5F_t *f) +{ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5AC_stats, FAIL) + + HDassert(f); + HDassert(f->shared); + HDassert(f->shared->cache); + + /* at present, this can't fail */ + (void)H5C_stats(f->shared->cache, f->name, FALSE); + +done: + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5AC_stats() */ + + +/*------------------------------------------------------------------------- + * Function: H5AC_get_cache_auto_resize_config + * + * Purpose: Wrapper function for H5C_get_cache_auto_resize_config(). + * + * Return: SUCCEED on success, and FAIL on failure. + * + * Programmer: John Mainzer + * 3/10/05 + * + * Modifications: + * + * JRM - 4/6/05 + * Reworked for the addition of struct H5AC_cache_config_t. + * + * JRM - 10/25/05 + * Added support for the new dirty_bytes_threshold field of + * both H5AC_cache_config_t and H5AC_aux_t. + * + * JRM - 6/8/06 + * Added support for the new trace file related fields. + * + * JRM - 7/28/07 + * Added support for the new evictions enabled related fields. + * + * Observe that H5AC_get_cache_auto_resize_config() and + * H5AC_set_cache_auto_resize_config() are becoming generic + * metadata cache configuration routines as they gain + * switches for functions that are only tenuously related + * to auto resize configuration. + * + * JRM - 10/18/07 + * Modified code in support of revised cache API needed + * to permit journaling. + * + * JRM - 1/2/08 + * Added support for the new flash cache increment related + * fields. + * + * JRM -- 4/12/08 + * Added support for the new journaling control fields. + * + * JRM - 8/1/08 + * Removed support for the new journaling control fields. + * This functionality is now handled through the + * H5AC_jnl_config_t structure and the related calls. + * + *------------------------------------------------------------------------- + */ + +herr_t +H5AC_get_cache_auto_resize_config(const H5AC_t * cache_ptr, + H5AC_cache_config_t *config_ptr) +{ + herr_t result; + herr_t ret_value = SUCCEED; /* Return value */ + hbool_t evictions_enabled; + H5C_auto_size_ctl_t internal_config; + + FUNC_ENTER_NOAPI(H5AC_get_cache_auto_resize_config, FAIL) + + if ( ( cache_ptr == NULL ) + || +#ifdef H5_HAVE_PARALLEL + ( ( cache_ptr->aux_ptr != NULL ) + && + ( ((H5AC_aux_t *)(cache_ptr->aux_ptr))->magic + != + H5AC__H5AC_AUX_T_MAGIC + ) + ) + || +#endif /* H5_HAVE_PARALLEL */ + ( config_ptr == NULL ) + || + ( config_ptr->version != H5AC__CURR_CACHE_CONFIG_VERSION ) + ) + { + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "Bad cache_ptr or config_ptr on entry.") + + } + + result = H5C_get_cache_auto_resize_config((const H5C_t *)cache_ptr, + &internal_config); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_get_cache_auto_resize_config() failed.") + } + + result = H5C_get_evictions_enabled((const H5C_t *)cache_ptr, + &evictions_enabled); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_get_resize_enabled() failed.") + } + + if ( internal_config.rpt_fcn == NULL ) { + + config_ptr->rpt_fcn_enabled = FALSE; + + } else { + + config_ptr->rpt_fcn_enabled = TRUE; + } + + config_ptr->open_trace_file = FALSE; + config_ptr->close_trace_file = FALSE; + config_ptr->trace_file_name[0] = '\0'; + config_ptr->evictions_enabled = evictions_enabled; + config_ptr->set_initial_size = internal_config.set_initial_size; + config_ptr->initial_size = internal_config.initial_size; + config_ptr->min_clean_fraction = internal_config.min_clean_fraction; + config_ptr->max_size = internal_config.max_size; + config_ptr->min_size = internal_config.min_size; + config_ptr->epoch_length = (long)(internal_config.epoch_length); + config_ptr->incr_mode = internal_config.incr_mode; + config_ptr->lower_hr_threshold = internal_config.lower_hr_threshold; + config_ptr->increment = internal_config.increment; + config_ptr->apply_max_increment = internal_config.apply_max_increment; + config_ptr->max_increment = internal_config.max_increment; + config_ptr->flash_incr_mode = internal_config.flash_incr_mode; + config_ptr->flash_multiple = internal_config.flash_multiple; + config_ptr->flash_threshold = internal_config.flash_threshold; + config_ptr->decr_mode = internal_config.decr_mode; + config_ptr->upper_hr_threshold = internal_config.upper_hr_threshold; + config_ptr->decrement = internal_config.decrement; + config_ptr->apply_max_decrement = internal_config.apply_max_decrement; + config_ptr->max_decrement = internal_config.max_decrement; + config_ptr->epochs_before_eviction = + (int)(internal_config.epochs_before_eviction); + config_ptr->apply_empty_reserve = internal_config.apply_empty_reserve; + config_ptr->empty_reserve = internal_config.empty_reserve; + +#ifdef H5_HAVE_PARALLEL + if ( cache_ptr->aux_ptr != NULL ) { + + config_ptr->dirty_bytes_threshold = + ((H5AC_aux_t *)(cache_ptr->aux_ptr))->dirty_bytes_threshold; + + } else { +#endif /* H5_HAVE_PARALLEL */ + + config_ptr->dirty_bytes_threshold = H5AC__DEFAULT_DIRTY_BYTES_THRESHOLD; + +#ifdef H5_HAVE_PARALLEL + } +#endif /* H5_HAVE_PARALLEL */ + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5AC_get_cache_auto_resize_config() */ + + +/*------------------------------------------------------------------------- + * Function: H5AC_get_jnl_config + * + * Purpose: Get the current journaling configuration and load it into + * the supplied instance of H5AC_jnl_config_t. + * + * For the moment, the only journaling we do is metadata + * journaling, so in effect this function is a wrapper + * function for H5C_get_journal_config(). + * + * Return: SUCCEED on success, and FAIL on failure. + * + * Programmer: John Mainzer + * 7/31/08 + * + * Modifications: + * + * JRM -- 8/14/08 + * Reworked for change in argument list to + * H5C_get_journal_config(). + * + *------------------------------------------------------------------------- + */ + +herr_t +H5AC_get_jnl_config(H5AC_t * cache_ptr, + H5AC_jnl_config_t * config_ptr) +{ + herr_t result; + herr_t ret_value = SUCCEED; /* Return value */ + H5C_mdj_config_t internal_config; + + FUNC_ENTER_NOAPI(H5AC_get_jnl_config, FAIL) + + if ( ( cache_ptr == NULL ) + || +#ifdef H5_HAVE_PARALLEL + ( ( cache_ptr->aux_ptr != NULL ) + && + ( ((H5AC_aux_t *)(cache_ptr->aux_ptr))->magic + != + H5AC__H5AC_AUX_T_MAGIC + ) + ) + || +#endif /* H5_HAVE_PARALLEL */ + ( config_ptr == NULL ) + || + ( config_ptr->version != H5AC__CURR_CACHE_CONFIG_VERSION ) + ) + { + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "Bad cache_ptr or config_ptr on entry.") + + } + + /* get the current journal configuration. Start by setting defaults, + * which will be changed shortly if journaling is enabled. + */ + + config_ptr->enable_journaling = FALSE; + config_ptr->journal_file_path[0] = '\0'; + config_ptr->journal_recovered = FALSE; + config_ptr->jbrb_buf_size = 4096; + config_ptr->jbrb_num_bufs = 1; + config_ptr->jbrb_use_aio = FALSE; + config_ptr->jbrb_human_readable = FALSE; + + result = H5C_get_journal_config(cache_ptr, &internal_config); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_get_journal_config() failed.") + } + + if ( internal_config.enable_journaling ) { + + config_ptr->enable_journaling = internal_config.enable_journaling; + HDstrncpy(&(config_ptr->journal_file_path[0]), + internal_config.journal_file_path, + H5AC__MAX_JOURNAL_FILE_NAME_LEN); + config_ptr->journal_file_path[H5AC__MAX_JOURNAL_FILE_NAME_LEN] = '\0'; + config_ptr->jbrb_buf_size = internal_config.jbrb_buf_size; + config_ptr->jbrb_num_bufs = internal_config.jbrb_num_bufs; + config_ptr->jbrb_use_aio = internal_config.jbrb_use_aio; + config_ptr->jbrb_human_readable = internal_config.jbrb_human_readable; + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5AC_get_jnl_config() */ + + +/*------------------------------------------------------------------------- + * Function: H5AC_get_cache_size + * + * Purpose: Wrapper function for H5C_get_cache_size(). + * + * Return: SUCCEED on success, and FAIL on failure. + * + * Programmer: John Mainzer + * 3/11/05 + * + * Modifications: + * + * JRM - 10/18/07 + * Modified code in support of revised cache API needed + * to permit journaling. + * + *------------------------------------------------------------------------- + */ + +herr_t +H5AC_get_cache_size(H5AC_t * cache_ptr, + size_t * max_size_ptr, + size_t * min_clean_size_ptr, + size_t * cur_size_ptr, + int32_t * cur_num_entries_ptr) +{ + herr_t result; + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5AC_get_cache_size, FAIL) + + result = H5C_get_cache_size((H5C_t *)cache_ptr, + max_size_ptr, + min_clean_size_ptr, + cur_size_ptr, + cur_num_entries_ptr); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_get_cache_size() failed.") + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5AC_get_cache_size() */ + + +/*------------------------------------------------------------------------- + * Function: H5AC_get_cache_hit_rate + * + * Purpose: Wrapper function for H5C_get_cache_hit_rate(). + * + * Return: SUCCEED on success, and FAIL on failure. + * + * Programmer: John Mainzer + * 3/10/05 + * + * Modifications: + * + * JRM - 10/18/07 + * Modified code in support of revised cache API needed + * to permit journaling. + * + *------------------------------------------------------------------------- + */ + +herr_t +H5AC_get_cache_hit_rate(H5AC_t * cache_ptr, + double * hit_rate_ptr) + +{ + herr_t result; + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5AC_get_cache_hit_rate, FAIL) + + result = H5C_get_cache_hit_rate((H5C_t *)cache_ptr, hit_rate_ptr); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_get_cache_hit_rate() failed.") + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5AC_get_cache_hit_rate() */ + + +/*------------------------------------------------------------------------- + * + * Function: H5AC_reset_cache_hit_rate_stats() + * + * Purpose: Wrapper function for H5C_reset_cache_hit_rate_stats(). + * + * Return: SUCCEED on success, and FAIL on failure. + * + * Programmer: John Mainzer, 3/10/05 + * + * Modifications: + * + * JRM - 10/18/07 + * Modified code in support of revised cache API needed + * to permit journaling. + * + *------------------------------------------------------------------------- + */ + +herr_t +H5AC_reset_cache_hit_rate_stats(H5AC_t * cache_ptr) +{ + herr_t result; + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5AC_reset_cache_hit_rate_stats, FAIL) + + result = H5C_reset_cache_hit_rate_stats((H5C_t *)cache_ptr); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_reset_cache_hit_rate_stats() failed.") + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5AC_reset_cache_hit_rate_stats() */ + + +/*------------------------------------------------------------------------- + * Function: H5AC_set_cache_auto_resize_config + * + * Purpose: Wrapper function for H5C_set_cache_auto_resize_config(). + * + * Return: SUCCEED on success, and FAIL on failure. + * + * Programmer: John Mainzer + * 3/10/05 + * + * Modifications: + * + * John Mainzer -- 4/6/05 + * Updated for the addition of H5AC_cache_config_t. + * + * John Mainzer -- 10/25/05 + * Added support for the new dirty_bytes_threshold field of + * both H5AC_cache_config_t and H5AC_aux_t. + * + * John Mainzer -- 6/7/06 + * Added trace file support. + * + * John Mainzer -- 7/28/07 + * Added support for the new evictions enabled related fields. + * + * Observe that H5AC_get_cache_auto_resize_config() and + * H5AC_set_cache_auto_resize_config() are becoming generic + * metadata cache configuration routines as they gain + * switches for functions that are only tenuously related + * to auto resize configuration. + * + * JRM - 10/18/07 + * Modified code in support of revised cache API needed + * to permit journaling. + * + * John Mainzer -- 1/3/07 + * Updated trace file code to record the new flash cache + * size increase related fields. + * + * John Mainzer -- 4/13/08 + * Added code to allow control of metadata journaling. + * This required the addition of the dxpl_id parameter. + * + * John Mainzer -- 8/1/08 + * Pulled journaling configuration back out of the + * function, and teh dxpl_id parameter with it. + * + *------------------------------------------------------------------------- + */ + +herr_t +H5AC_set_cache_auto_resize_config(H5AC_t * cache_ptr, + H5AC_cache_config_t *config_ptr) +{ + herr_t result; + herr_t ret_value = SUCCEED; /* Return value */ +#if H5AC__TRACE_FILE_ENABLED + H5AC_cache_config_t trace_config = H5AC__DEFAULT_CACHE_CONFIG; + FILE * trace_file_ptr = NULL; +#endif /* H5AC__TRACE_FILE_ENABLED */ + + FUNC_ENTER_NOAPI(H5AC_set_cache_auto_resize_config, FAIL) + + HDassert( cache_ptr ); + +#if H5AC__TRACE_FILE_ENABLED + /* Make note of the new configuration. Don't look up the trace file + * pointer, as that may change before we use it. + */ + if ( config_ptr != NULL ) { + + trace_config = *config_ptr; + + } +#endif /* H5AC__TRACE_FILE_ENABLED */ + + if ( ( cache_ptr == NULL ) +#ifdef H5_HAVE_PARALLEL + || + ( ( cache_ptr->aux_ptr != NULL ) + && + ( + ((H5AC_aux_t *)(cache_ptr->aux_ptr))->magic + != + H5AC__H5AC_AUX_T_MAGIC + ) + ) +#endif /* H5_HAVE_PARALLEL */ + ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "bad cache_ptr on entry.") + } + + result = H5AC_validate_config(config_ptr); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Bad cache configuration"); + } + + + result = H5AC_set_cache_config(cache_ptr, config_ptr); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5AC_set_cache_config() failed.") + } + +done: + +#if H5AC__TRACE_FILE_ENABLED + /* For the set cache auto resize config call, only the contents + * of the config is necessary in the trace file. Write the return + * value to catch occult errors. + */ + if ( ( cache_ptr != NULL ) && + ( H5C_get_trace_file_ptr(cache_ptr, &trace_file_ptr) >= 0 ) && + ( trace_file_ptr != NULL ) ) { + + HDfprintf(trace_file_ptr, + "%s %d %d %d %d \"%s\" %d %d %d %f %d %d %ld %d %f %f %d %d %d %f %f %d %f %f %d %d %d %d %f %d %d\n", + "H5AC_set_cache_auto_resize_config", + trace_config.version, + (int)(trace_config.rpt_fcn_enabled), + (int)(trace_config.open_trace_file), + (int)(trace_config.close_trace_file), + trace_config.trace_file_name, + (int)(trace_config.evictions_enabled), + (int)(trace_config.set_initial_size), + (int)(trace_config.initial_size), + trace_config.min_clean_fraction, + (int)(trace_config.max_size), + (int)(trace_config.min_size), + trace_config.epoch_length, + (int)(trace_config.incr_mode), + trace_config.lower_hr_threshold, + trace_config.increment, + (int)(trace_config.apply_max_increment), + (int)(trace_config.max_increment), + (int)(trace_config.flash_incr_mode), + trace_config.flash_multiple, + trace_config.flash_threshold, + (int)(trace_config.decr_mode), + trace_config.upper_hr_threshold, + trace_config.decrement, + (int)(trace_config.apply_max_decrement), + (int)(trace_config.max_decrement), + trace_config.epochs_before_eviction, + (int)(trace_config.apply_empty_reserve), + trace_config.empty_reserve, + trace_config.dirty_bytes_threshold, + (int)ret_value); + } +#endif /* H5AC__TRACE_FILE_ENABLED */ + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5AC_set_cache_auto_resize_config() */ + + +/*------------------------------------------------------------------------- + * Function: H5AC_set_jnl_config + * + * Purpose: Manage changes in journaling configuration. + * + * At present, metadata journaling is the only journaling we + * do, so this function can be thought of as a wrapper for + * H5C_begin_journaling() and H5C_end_journaling(). + * + * Return: SUCCEED on success, and FAIL on failure. + * + * Programmer: John Mainzer + * 7/31/08 + * + * Modifications: + * + * JRM -- 8/14/08 + * Revised code for the use of the H5C_mdj_config_t + * structure in H5C_get_journal_config() and + * H5C_begin_journaling(). + * + * Per Quincey's request, also added code to + * throw an error if journaling is requested when + * it is already enabled, or if the end of journaling + * is requested when it is already disabled. + * + * Note that this required the addition of the + * initializing parameter, which allows us to + * avoid generating an error on startup. + * + *------------------------------------------------------------------------- + */ +herr_t +H5AC_set_jnl_config(H5F_t * f, + hid_t dxpl_id, + const H5AC_jnl_config_t *config_ptr, + hbool_t initializing) +{ + /* const char * fcn_name = "H5AC_set_jnl_config"; */ + H5AC_t * cache_ptr; + herr_t result; + H5C_mdj_config_t internal_config; +#if H5AC__TRACE_FILE_ENABLED + H5AC_jnl_config_t trace_config = H5AC__DEFAULT_JNL_CONFIG; + FILE * trace_file_ptr = NULL; +#endif /* H5AC__TRACE_FILE_ENABLED */ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5AC_set_jnl_config, FAIL) + + HDassert( f ); + HDassert( f->shared ); + HDassert( f->shared->cache ); + + cache_ptr = (H5AC_t *)f->shared->cache; + +#if H5AC__TRACE_FILE_ENABLED + /* Make note of the new configuration. + */ + trace_config = *config_ptr; +#endif /* H5AC__TRACE_FILE_ENABLED */ + + if ( ( cache_ptr == NULL ) +#ifdef H5_HAVE_PARALLEL + || + ( ( cache_ptr->aux_ptr != NULL ) + && + ( + ((H5AC_aux_t *)(cache_ptr->aux_ptr))->magic + != + H5AC__H5AC_AUX_T_MAGIC + ) + ) +#endif /* H5_HAVE_PARALLEL */ + ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "bad cache_ptr on entry.") + } + + result = H5AC_validate_jnl_config(config_ptr); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ + "Bad journaling configuration"); + } + + result = H5C_get_journal_config((H5C_t *)cache_ptr, &internal_config); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_get_journal_config() failed.") + } + + if ( config_ptr->enable_journaling != internal_config.enable_journaling ) { + + /* we have work to do -- start or stop journaling as requested */ + + if ( config_ptr->enable_journaling ) { + + internal_config.enable_journaling = config_ptr->enable_journaling; + + HDstrncpy(internal_config.journal_file_path, + &(config_ptr->journal_file_path[0]), + H5C__MAX_JOURNAL_FILE_NAME_LEN); + internal_config.journal_file_path[H5AC__MAX_JOURNAL_FILE_NAME_LEN] + = '\0'; + + internal_config.jbrb_buf_size = config_ptr->jbrb_buf_size; + internal_config.jbrb_num_bufs = config_ptr->jbrb_num_bufs; + internal_config.jbrb_use_aio = config_ptr->jbrb_use_aio; + internal_config.jbrb_human_readable = + config_ptr->jbrb_human_readable; + + result = H5C_begin_journaling(f, + dxpl_id, + cache_ptr, + &internal_config); + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_begin_journaling() failed.") + } + } else { + + result = H5C_end_journaling(f, dxpl_id, cache_ptr); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_end_journaling() failed.") + } + } + } else if ( ! initializing ) { + + if ( config_ptr->enable_journaling ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "journaling already enabled.") + + } else { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "journaling already disabled.") + + } + } + +done: + +#if H5AC__TRACE_FILE_ENABLED + /* For the set cache journaling config call, only the fields + * of the config that pretain to journaling are necessary in + * the trace file. Write the return value to catch occult errors. + */ + if ( ( cache_ptr != NULL ) && + ( H5C_get_trace_file_ptr(cache_ptr, &trace_file_ptr) >= 0 ) && + ( trace_file_ptr != NULL ) ) { + + HDfprintf(trace_file_ptr, + "%s %d %d \"%s\" %d %d %d %d %d %d\n", + "H5AC_set_jnl_config", + trace_config.version, + (int)(config_ptr->enable_journaling), + config_ptr->journal_file_path, + (int)(config_ptr->journal_recovered), + (int)(config_ptr->jbrb_buf_size), + config_ptr->jbrb_num_bufs, + (int)(config_ptr->jbrb_use_aio), + (int)(config_ptr->jbrb_human_readable), + (int)ret_value); + } +#endif /* H5AC__TRACE_FILE_ENABLED */ + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5AC_set_jnl_config() */ + + +/*------------------------------------------------------------------------- + * Function: H5AC_set_cache_config + * + * Purpose: Handle all configuration switches in an instance of + * H5AC_cache_config_t. + * + * Return: SUCCEED on success, and FAIL on failure. + * + * Programmer: John Mainzer + * 7/7/08 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +herr_t +H5AC_set_cache_config(H5AC_t * cache_ptr, + H5AC_cache_config_t *config_ptr) +{ + /* const char * fcn_name = "H5AC_set_cache_config"; */ + herr_t result; + herr_t ret_value = SUCCEED; /* Return value */ + H5C_auto_size_ctl_t internal_config; + + FUNC_ENTER_NOAPI(H5AC_set_cache_config, FAIL) + + if ( ( cache_ptr == NULL ) +#ifdef H5_HAVE_PARALLEL + || + ( ( cache_ptr->aux_ptr != NULL ) + && + ( + ((H5AC_aux_t *)(cache_ptr->aux_ptr))->magic + != + H5AC__H5AC_AUX_T_MAGIC + ) + ) +#endif /* H5_HAVE_PARALLEL */ + ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "bad cache_ptr on entry.") + } + + result = H5AC_validate_config(config_ptr); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Bad cache configuration"); + } + + if ( config_ptr->open_trace_file ) { + + FILE * file_ptr = NULL; + + if ( H5C_get_trace_file_ptr(cache_ptr, &file_ptr) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_get_trace_file_ptr() failed.") + } + + if ( ( ! ( config_ptr->close_trace_file ) ) && + ( file_ptr != NULL ) ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ + "Trace file already open.") + } + } + + if ( + ( + config_ptr->dirty_bytes_threshold + < + H5AC__MIN_DIRTY_BYTES_THRESHOLD + ) + || + ( + config_ptr->dirty_bytes_threshold + > + H5AC__MAX_DIRTY_BYTES_THRESHOLD + ) + ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, + "config_ptr->dirty_bytes_threshold out of range.") + } + + if ( config_ptr->close_trace_file ) { + + if ( H5AC_close_trace_file(cache_ptr) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5AC_close_trace_file() failed.") + } + } + + if ( config_ptr->open_trace_file ) { + + if ( H5AC_open_trace_file(cache_ptr, config_ptr->trace_file_name) < 0 ) + { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ + "H5AC_open_trace_file() failed.") + } + } + + if ( H5AC_ext_config_2_int_config(config_ptr, &internal_config) != + SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5AC_ext_config_2_int_config() failed.") + } + + result = H5C_set_cache_auto_resize_config(cache_ptr, + &internal_config); + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_set_cache_auto_resize_config() failed.") + } + + + result = H5C_set_evictions_enabled(cache_ptr, + config_ptr->evictions_enabled); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_set_evictions_enabled() failed.") + } + +#ifdef H5_HAVE_PARALLEL + if ( cache_ptr->aux_ptr != NULL ) { + + ((H5AC_aux_t *)(cache_ptr->aux_ptr))->dirty_bytes_threshold = + config_ptr->dirty_bytes_threshold; + } +#endif /* H5_HAVE_PARALLEL */ + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5AC_set_cache_config() */ + + +/*------------------------------------------------------------------------- + * Function: H5AC_validate_config() + * + * Purpose: Run a sanity check on the contents of the supplied + * instance of H5AC_cache_config_t. + * + * Do nothing and return SUCCEED if no errors are detected, + * and flag an error and return FAIL otherwise. + * + * At present, this function operates by packing the data + * from the instance of H5AC_cache_config_t into an instance + * of H5C_auto_size_ctl_t, and then calling + * H5C_validate_resize_config(). As H5AC_cache_config_t and + * H5C_auto_size_ctl_t diverge, we may have to change this. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: John Mainzer + * 4/6/05 + * + * Modifications: + * + * - Added code testing the trace file configuration fields. + * These tests are not comprehensive, as many errors cannot + * be caught until the directives contained in these fields + * are applied. + * JRM - 5/15/06 + * + * - Added code testing the evictions enabled field. At + * present this consists of verifying that if + * evictions_enabled is FALSE, then automatic cache + * resizing in disabled. + * + * JRM - 7/28/07 + * + * Modified code in support of revised cache API needed + * to permit journaling. + * JRM - 10/18/07 + * + * Pulled journaling related code out of this function. + * + * JRM - 8/1/08 + * + *------------------------------------------------------------------------- + */ +herr_t +H5AC_validate_config(H5AC_cache_config_t * config_ptr) +{ + herr_t result; + int name_len; + H5C_auto_size_ctl_t internal_config; + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5AC_validate_config, FAIL) + + if ( config_ptr == NULL ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "NULL config_ptr on entry.") + } + + if ( config_ptr->version != H5AC__CURR_CACHE_CONFIG_VERSION ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Unknown config version.") + } + + if ( ( config_ptr->rpt_fcn_enabled != TRUE ) && + ( config_ptr->rpt_fcn_enabled != FALSE ) ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ + "config_ptr->rpt_fcn_enabled must be either TRUE or FALSE.") + } + + if ( ( config_ptr->open_trace_file != TRUE ) && + ( config_ptr->open_trace_file != FALSE ) ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ + "config_ptr->open_trace_file must be either TRUE or FALSE.") + } + + if ( ( config_ptr->close_trace_file != TRUE ) && + ( config_ptr->close_trace_file != FALSE ) ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ + "config_ptr->close_trace_file must be either TRUE or FALSE.") + } + + /* don't bother to test trace_file_name unless open_trace_file is TRUE */ + if ( config_ptr->open_trace_file ) { + + /* Can't really test the trace_file_name field without trying to + * open the file, so we will content ourselves with a couple of + * sanity checks on the length of the file name. + */ + name_len = HDstrlen(config_ptr->trace_file_name); + + if ( name_len == 0 ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ + "config_ptr->trace_file_name is empty.") + + } else if ( name_len > H5AC__MAX_TRACE_FILE_NAME_LEN ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ + "config_ptr->trace_file_name too long.") + } + } + + if ( ( config_ptr->evictions_enabled != TRUE ) && + ( config_ptr->evictions_enabled != FALSE ) ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ + "config_ptr->evictions_enabled must be either TRUE or FALSE.") + } + + if ( ( config_ptr->evictions_enabled == FALSE ) && + ( ( config_ptr->incr_mode != H5C_incr__off ) || + ( config_ptr->flash_incr_mode != H5C_flash_incr__off ) || + ( config_ptr->decr_mode != H5C_decr__off ) ) ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ + "Can't disable evictions while auto-resize is enabled.") + } + + if ( config_ptr->dirty_bytes_threshold < H5AC__MIN_DIRTY_BYTES_THRESHOLD ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, + "dirty_bytes_threshold too small.") + } else + if ( config_ptr->dirty_bytes_threshold > H5AC__MAX_DIRTY_BYTES_THRESHOLD ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, + "dirty_bytes_threshold too big.") + } + + if ( H5AC_ext_config_2_int_config(config_ptr, &internal_config) != + SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5AC_ext_config_2_int_config() failed.") + } + + result = H5C_validate_resize_config(&internal_config, + H5C_RESIZE_CFG__VALIDATE_ALL); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "error(s) in new config.") + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5AC_validate_config() */ + + +/*------------------------------------------------------------------------- + * Function: H5AC_validate_jnl_config() + * + * Purpose: Run a sanity check on the contents of the supplied + * instance of H5AC_jnl_config_t. + * + * Do nothing and return SUCCEED if no errors are detected, + * and flag an error and return FAIL otherwise. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: John Mainzer + * 7/31/08 + * + * Modifications: + * + * - None. + * + *------------------------------------------------------------------------- + */ +herr_t +H5AC_validate_jnl_config(const H5AC_jnl_config_t *config_ptr) +{ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5AC_validate_jnl_config, FAIL) + + if(config_ptr == NULL) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "NULL config_ptr on entry.") + + if ( config_ptr->version != H5AC__CURR_JNL_CONFIG_VER ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Unknown config version.") + } + + if ( ( config_ptr->enable_journaling != TRUE ) && + ( config_ptr->enable_journaling != FALSE ) ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ + "config_ptr->enable_journaling must be either TRUE or FALSE.") + } + + if ( ( config_ptr->journal_recovered != TRUE ) && + ( config_ptr->journal_recovered != FALSE ) ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ + "config_ptr->journal_recovered must be either TRUE or FALSE.") + } + + if ( ( config_ptr->enable_journaling ) && + ( config_ptr->journal_recovered ) ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ + "enable_journaling and journal_recovered can't both be TRUE.") + } + + /* don't test journal_file_path unless enable_journaling is TRUE */ + if ( config_ptr->enable_journaling ) { + size_t name_len; + + /* Check for NULL journal file path string */ + if(NULL == config_ptr->journal_file_path) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "config_ptr->journal_file_path is NULL.") + + /* Can't really test the journal_file_path field without trying to + * open the file, so we will content ourselves with a couple of + * sanity checks on the length of the file name. + */ + name_len = HDstrlen(config_ptr->journal_file_path); + + if ( name_len == 0 ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ + "config_ptr->journal_file_path is empty.") + + } else if ( name_len > H5AC__MAX_JOURNAL_FILE_NAME_LEN ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ + "config_ptr->journal_file_path too long.") + } + } + + if ( ( config_ptr->jbrb_buf_size < H5AC__MIN_JBRB_BUF_SIZE ) || + ( config_ptr->jbrb_buf_size > H5AC__MAX_JBRB_BUF_SIZE ) ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ + "config_ptr->jbrb_buf_size out of range.") + } + + if ( ( config_ptr->jbrb_num_bufs < H5AC__MIN_JBRB_NUM_BUFS ) || + ( config_ptr->jbrb_num_bufs > H5AC__MAX_JBRB_NUM_BUFS ) ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ + "config_ptr->jbrb_num_bufs out of range.") + } + + if ( ( config_ptr->jbrb_use_aio != FALSE ) && + ( config_ptr->jbrb_use_aio != TRUE ) ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ + "config_ptr->jbrb_use_aio must be either TRUE or FALSE.") + } + + if ( ( config_ptr->jbrb_human_readable != FALSE ) && + ( config_ptr->jbrb_human_readable != TRUE ) ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ + "config_ptr->jbrb_human_readable must be either TRUE or FALSE.") + } + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* H5AC_validate_jnl_config() */ + + +/*------------------------------------------------------------------------- + * Function: H5AC_validate_jnl_config_ver() + * + * Purpose: Return true if the supplied H5AC_jnl_config_t version + * number is valid, and FALSE otherwise. + * + * Return: TRUE if the version number is valid, and FALSE otherwise. + * + * Programmer: John Mainzer + * 8/13/08 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ +hbool_t +H5AC_validate_jnl_config_ver(int version_num) +{ + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5AC_validate_jnl_config_ver) + + FUNC_LEAVE_NOAPI(version_num == H5AC__CURR_JNL_CONFIG_VER) +} /* H5AC_validate_jnl_config_ver() */ + + +/*------------------------------------------------------------------------- + * Function: H5AC_validate_cache_config_ver() + * + * Purpose: Return true if the supplied H5AC_cache_config_t version + * number is valid, and FALSE otherwise. + * + * Return: TRUE if the version number is valid, and FALSE otherwise. + * + * Programmer: John Mainzer + * 8/13/08 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ +hbool_t +H5AC_validate_cache_config_ver(int version_num) +{ + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5AC_validate_cache_config_ver) + + FUNC_LEAVE_NOAPI(version_num == H5AC__CURR_CACHE_CONFIG_VERSION) +} /* H5AC_validate_cache_config_ver() */ + + +/*------------------------------------------------------------------------- + * Function: H5AC_close_trace_file() + * + * Purpose: If a trace file is open, stop logging calls to the cache, + * and close the file. + * + * Note that the function does nothing if there is no trace + * file. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: John Mainzer + * 6/2/06 + * + * Modifications: + * + * Modified code in support of revised cache API needed + * to permit journaling. + * JRM - 10/18/07 + * + *------------------------------------------------------------------------- + */ + +herr_t +H5AC_close_trace_file(H5AC_t * cache_ptr) + +{ + herr_t ret_value = SUCCEED; /* Return value */ + FILE * trace_file_ptr = NULL; + + FUNC_ENTER_NOAPI(H5AC_close_trace_file, FAIL) + + if ( cache_ptr == NULL ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "NULL cache_ptr on entry.") + } + + if ( H5C_get_trace_file_ptr(cache_ptr, &trace_file_ptr) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_get_trace_file_ptr() failed.") + } + + if ( trace_file_ptr != NULL ) { + + if ( H5C_set_trace_file_ptr(cache_ptr, NULL) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_set_trace_file_ptr() failed.") + } + + if ( HDfclose(trace_file_ptr) != 0 ) { + + HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, \ + "can't close metadata cache trace file") + } + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5AC_close_trace_file() */ + + +/*------------------------------------------------------------------------- + * Function: H5AC_open_trace_file() + * + * Purpose: Open a trace file, and start logging calls to the cache. + * + * This logging is done at the H5C level, and will only take + * place if H5C_TRACE_FILE_ENABLED (defined in H5Cprivate.h) + * is TRUE. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: John Mainzer + * 6/1/06 + * + * Modifications: + * + * Modified code in support of revised cache API needed + * to permit journaling. + * JRM - 10/18/07 + * + *------------------------------------------------------------------------- + */ + +herr_t +H5AC_open_trace_file(H5AC_t * cache_ptr, + const char * trace_file_name) +{ + herr_t ret_value = SUCCEED; /* Return value */ + char file_name[H5AC__MAX_TRACE_FILE_NAME_LEN + H5C__PREFIX_LEN + 2]; + FILE * file_ptr = NULL; +#ifdef H5_HAVE_PARALLEL + H5AC_aux_t * aux_ptr = NULL; +#endif /* H5_HAVE_PARALLEL */ + + FUNC_ENTER_NOAPI(H5AC_open_trace_file, FAIL) + + HDassert(cache_ptr); + + if ( cache_ptr == NULL ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "cache_ptr NULL on entry.") + } + + if ( trace_file_name == NULL ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ + "NULL trace_file_name on entry.") + } + + if ( HDstrlen(trace_file_name) > H5AC__MAX_TRACE_FILE_NAME_LEN ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "trace file name too long.") + } + + if ( H5C_get_trace_file_ptr(cache_ptr, &file_ptr) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_get_trace_file_ptr() failed.") + } + + if ( file_ptr != NULL ) { + + HGOTO_ERROR(H5E_FILE, H5E_FILEOPEN, FAIL, "trace file already open.") + } + +#ifdef H5_HAVE_PARALLEL + + aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr); + + if ( cache_ptr->aux_ptr == NULL ) { + + sprintf(file_name, "%s", trace_file_name); + + } else { + + if ( aux_ptr->magic != H5AC__H5AC_AUX_T_MAGIC ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad aux_ptr->magic.") + } + + sprintf(file_name, "%s.%d", trace_file_name, aux_ptr->mpi_rank); + + } + + if ( HDstrlen(file_name) > + H5AC__MAX_TRACE_FILE_NAME_LEN + H5C__PREFIX_LEN + 1 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "cooked trace file name too long.") + } + +#else /* H5_HAVE_PARALLEL */ + + sprintf(file_name, "%s", trace_file_name); + +#endif /* H5_HAVE_PARALLEL */ + + if ( (file_ptr = HDfopen(file_name, "w")) == NULL ) { + + /* trace file open failed */ + HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "trace file open failed.") + } + + HDfprintf(file_ptr, "### HDF5 metadata cache trace file version 2 ###\n"); + + if ( H5C_set_trace_file_ptr(cache_ptr, file_ptr) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_set_trace_file_ptr() failed.") + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5AC_open_trace_file() */ + + +/*************************************************************************/ +/**************************** Private Functions: *************************/ +/*************************************************************************/ + +/*------------------------------------------------------------------------- + * + * Function: H5AC_broadcast_clean_list() + * + * Purpose: Broadcast the contents of the process 0 cleaned entry + * slist. In passing, also remove all entries from said + * list, and also remove any matching entries from the dirtied + * slist. + * + * This function must only be called by the process with + * MPI_rank 0. + * + * Return SUCCEED on success, and FAIL on failure. + * + * Return: Non-negative on success/Negative on failure. + * + * Programmer: John Mainzer, 7/1/05 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +#ifdef H5_HAVE_PARALLEL +static herr_t +H5AC_broadcast_clean_list(H5AC_t * cache_ptr) +{ + herr_t ret_value = SUCCEED; /* Return value */ + haddr_t addr; + H5AC_aux_t * aux_ptr = NULL; + H5SL_node_t * slist_node_ptr = NULL; + H5AC_slist_entry_t * slist_entry_ptr = NULL; + MPI_Offset * buf_ptr = NULL; + size_t buf_size; + int i = 0; + int mpi_result; + int num_entries; + + FUNC_ENTER_NOAPI(H5AC_broadcast_clean_list, FAIL) + + HDassert( cache_ptr != NULL ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + + aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr); + + HDassert( aux_ptr != NULL ); + HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC ); + HDassert( aux_ptr->mpi_rank == 0 ); + HDassert( aux_ptr->c_slist_ptr != NULL ); + HDassert( H5SL_count(aux_ptr->c_slist_ptr) == + (size_t)(aux_ptr->c_slist_len) ); + + + /* First broadcast the number of entries in the list so that the + * receives can set up a buffer to receive them. If there aren't + * any, we are done. + */ + num_entries = aux_ptr->c_slist_len; + + mpi_result = MPI_Bcast(&num_entries, 1, MPI_INT, 0, aux_ptr->mpi_comm); + + if ( mpi_result != MPI_SUCCESS ) { + + HMPI_GOTO_ERROR(FAIL, "MPI_Bcast failed 1", mpi_result) + + } + + if ( num_entries > 0 ) + { + /* allocate a buffer to store the list of entry base addresses in */ + + buf_size = sizeof(MPI_Offset) * (size_t)num_entries; + + buf_ptr = (MPI_Offset *)H5MM_malloc(buf_size); + + if ( buf_ptr == NULL ) { + + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \ + "memory allocation failed for clean entry buffer") + } + + /* now load the entry base addresses into the buffer, emptying the + * cleaned entry list in passing + */ + + while ( NULL != (slist_node_ptr = H5SL_first(aux_ptr->c_slist_ptr) ) ) + { + slist_entry_ptr = H5SL_item(slist_node_ptr); + + HDassert(slist_entry_ptr->magic == H5AC__H5AC_SLIST_ENTRY_T_MAGIC); + + HDassert( i < num_entries ); + + addr = slist_entry_ptr->addr; + + if ( H5FD_mpi_haddr_to_MPIOff(addr, &(buf_ptr[i])) < 0 ) { + + HGOTO_ERROR(H5E_INTERNAL, H5E_BADRANGE, FAIL, \ + "can't convert from haddr to MPI off") + } + + i++; + + /* now remove the entry from the cleaned entry list */ + if ( H5SL_remove(aux_ptr->c_slist_ptr, (void *)(&addr)) + != slist_entry_ptr ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTDELETE, FAIL, \ + "Can't delete entry from cleaned entry slist.") + } + + slist_entry_ptr->magic = 0; + H5FL_FREE(H5AC_slist_entry_t, slist_entry_ptr); + slist_entry_ptr = NULL; + + aux_ptr->c_slist_len -= 1; + + HDassert( aux_ptr->c_slist_len >= 0 ); + + /* and also remove the matching entry from the dirtied list + * if it exists. + */ + if ( (slist_entry_ptr = H5SL_search(aux_ptr->d_slist_ptr, + (void *)(&addr))) != NULL ) { + + HDassert( slist_entry_ptr->magic == + H5AC__H5AC_SLIST_ENTRY_T_MAGIC ); + HDassert( slist_entry_ptr->addr == addr ); + + if ( H5SL_remove(aux_ptr->d_slist_ptr, (void *)(&addr)) + != slist_entry_ptr ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTDELETE, FAIL, \ + "Can't delete entry from dirty entry slist.") + } + + slist_entry_ptr->magic = 0; + H5FL_FREE(H5AC_slist_entry_t, slist_entry_ptr); + slist_entry_ptr = NULL; + + aux_ptr->d_slist_len -= 1; + + HDassert( aux_ptr->d_slist_len >= 0 ); + } + + } /* while */ + + + /* Now broadcast the list of cleaned entries -- if there is one. + * + * The peculiar structure of the following call to MPI_Bcast is + * due to MPI's (?) failure to believe in the MPI_Offset type. + * Thus the element type is MPI_BYTE, with size equal to the + * buf_size computed above. + */ + + mpi_result = MPI_Bcast((void *)buf_ptr, (int)buf_size, MPI_BYTE, 0, + aux_ptr->mpi_comm); + + if ( mpi_result != MPI_SUCCESS ) { + + HMPI_GOTO_ERROR(FAIL, "MPI_Bcast failed 2", mpi_result) + } + } + +done: + + if ( buf_ptr != NULL ) { + + buf_ptr = (MPI_Offset *)H5MM_xfree((void *)buf_ptr); + } + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5AC_broadcast_clean_list() */ +#endif /* H5_HAVE_PARALLEL */ + + +/*------------------------------------------------------------------------- + * + * Function: H5AC_check_if_write_permitted + * + * Purpose: Determine if a write is permitted under the current + * circumstances, and set *write_permitted_ptr accordingly. + * As a general rule it is, but when we are running in parallel + * mode with collective I/O, we must ensure that a read cannot + * cause a write. + * + * In the event of failure, the value of *write_permitted_ptr + * is undefined. + * + * Return: Non-negative on success/Negative on failure. + * + * Programmer: John Mainzer, 5/15/04 + * + * Modifications: + * + * John Mainzer, 9/23/05 + * Rewrote function to return the value of the + * write_permitted field in aux structure if the structure + * exists and mpi_rank is 0. + * + * If the aux structure exists, but mpi_rank isn't 0, the + * function now returns FALSE. + * + * In all other cases, the function returns TRUE. + * + *------------------------------------------------------------------------- + */ + +#ifdef H5_HAVE_PARALLEL +static herr_t +H5AC_check_if_write_permitted(const H5F_t *f, + hid_t UNUSED dxpl_id, + hbool_t * write_permitted_ptr) +#else /* H5_HAVE_PARALLEL */ +static herr_t +H5AC_check_if_write_permitted(const H5F_t UNUSED * f, + hid_t UNUSED dxpl_id, + hbool_t * write_permitted_ptr) +#endif /* H5_HAVE_PARALLEL */ +{ + hbool_t write_permitted = TRUE; + herr_t ret_value = SUCCEED; /* Return value */ +#ifdef H5_HAVE_PARALLEL + H5AC_aux_t * aux_ptr = NULL; +#endif /* H5_HAVE_PARALLEL */ + + + FUNC_ENTER_NOAPI(H5AC_check_if_write_permitted, FAIL) + +#ifdef H5_HAVE_PARALLEL + HDassert( f != NULL ); + HDassert( f->shared != NULL ); + HDassert( f->shared->cache != NULL ); + + aux_ptr = (H5AC_aux_t *)(f->shared->cache->aux_ptr); + + if ( aux_ptr != NULL ) { + + HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC ); + + if ( aux_ptr->mpi_rank == 0 ) { + + write_permitted = aux_ptr->write_permitted; + + } else { + + write_permitted = FALSE; + } + } +#endif /* H5_HAVE_PARALLEL */ + + *write_permitted_ptr = write_permitted; + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5AC_check_if_write_permitted() */ + + +/*------------------------------------------------------------------------- + * Function: H5AC_ext_config_2_int_config() + * + * Purpose: Utility function to translate an instance of + * H5AC_cache_config_t to an instance of H5C_auto_size_ctl_t. + * + * Places translation in *int_conf_ptr and returns SUCCEED + * if successful. Returns FAIL on failure. + * + * Does only minimal sanity checking. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: John Mainzer + * 1/26/06 + * + * Modifications: + * + * Updated function for flash cache increment fields. + * + * JRM -- 1/2/08 + * + * + *------------------------------------------------------------------------- + */ + +herr_t +H5AC_ext_config_2_int_config(H5AC_cache_config_t * ext_conf_ptr, + H5C_auto_size_ctl_t * int_conf_ptr) +{ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5AC_ext_config_2_int_config, FAIL) + + if ( ( ext_conf_ptr == NULL ) || + ( ext_conf_ptr->version != H5AC__CURR_CACHE_CONFIG_VERSION ) || + ( int_conf_ptr == NULL ) ) { + + } + + int_conf_ptr->version = H5C__CURR_AUTO_SIZE_CTL_VER; + + if ( ext_conf_ptr->rpt_fcn_enabled ) { + + int_conf_ptr->rpt_fcn = H5C_def_auto_resize_rpt_fcn; + + } else { + + int_conf_ptr->rpt_fcn = NULL; + } + + int_conf_ptr->set_initial_size = ext_conf_ptr->set_initial_size; + int_conf_ptr->initial_size = ext_conf_ptr->initial_size; + int_conf_ptr->min_clean_fraction = ext_conf_ptr->min_clean_fraction; + int_conf_ptr->max_size = ext_conf_ptr->max_size; + int_conf_ptr->min_size = ext_conf_ptr->min_size; + int_conf_ptr->epoch_length = + (int64_t)(ext_conf_ptr->epoch_length); + + int_conf_ptr->incr_mode = ext_conf_ptr->incr_mode; + int_conf_ptr->lower_hr_threshold = ext_conf_ptr->lower_hr_threshold; + int_conf_ptr->increment = ext_conf_ptr->increment; + int_conf_ptr->apply_max_increment = ext_conf_ptr->apply_max_increment; + int_conf_ptr->max_increment = ext_conf_ptr->max_increment; + int_conf_ptr->flash_incr_mode = ext_conf_ptr->flash_incr_mode; + int_conf_ptr->flash_multiple = ext_conf_ptr->flash_multiple; + int_conf_ptr->flash_threshold = ext_conf_ptr->flash_threshold; + + + int_conf_ptr->decr_mode = ext_conf_ptr->decr_mode; + int_conf_ptr->upper_hr_threshold = ext_conf_ptr->upper_hr_threshold; + int_conf_ptr->decrement = ext_conf_ptr->decrement; + int_conf_ptr->apply_max_decrement = ext_conf_ptr->apply_max_decrement; + int_conf_ptr->max_decrement = ext_conf_ptr->max_decrement; + int_conf_ptr->epochs_before_eviction = + (int32_t)(ext_conf_ptr->epochs_before_eviction); + int_conf_ptr->apply_empty_reserve = ext_conf_ptr->apply_empty_reserve; + int_conf_ptr->empty_reserve = ext_conf_ptr->empty_reserve; + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5AC_ext_config_2_int_config() */ + + +/*------------------------------------------------------------------------- + * + * Function: H5AC_log_deleted_entry() + * + * Purpose: Log an entry for which H5C__DELETED_FLAG has been set. + * + * If mpi_rank is 0, we must make sure that the entry doesn't + * appear in the cleaned or dirty entry lists. Otherwise, + * we have nothing to do. + * + * Return SUCCEED on success, and FAIL on failure. + * + * Return: Non-negative on success/Negative on failure. + * + * Programmer: John Mainzer, 6/29/05 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +#ifdef H5_HAVE_PARALLEL +static herr_t +H5AC_log_deleted_entry(H5AC_t * cache_ptr, + H5AC_info_t * entry_ptr, + haddr_t addr, + unsigned int flags) +{ + herr_t ret_value = SUCCEED; /* Return value */ + H5AC_aux_t * aux_ptr = NULL; + H5AC_slist_entry_t * slist_entry_ptr = NULL; + + FUNC_ENTER_NOAPI(H5AC_log_deleted_entry, FAIL) + + HDassert( cache_ptr != NULL ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + + aux_ptr = cache_ptr->aux_ptr; + + HDassert( aux_ptr != NULL ); + HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC ); + + HDassert( entry_ptr != NULL ); + HDassert( entry_ptr->addr == addr ); + + HDassert( (flags & H5C__DELETED_FLAG) != 0 ); + + if ( aux_ptr->mpi_rank == 0 ) { + + HDassert( aux_ptr->d_slist_ptr != NULL ); + HDassert( aux_ptr->c_slist_ptr != NULL ); + + /* if the entry appears in the dirtied entry slist, remove it. */ + if ( (slist_entry_ptr = H5SL_search(aux_ptr->d_slist_ptr, + (void *)(&addr))) != NULL ) { + + HDassert( slist_entry_ptr->magic == + H5AC__H5AC_SLIST_ENTRY_T_MAGIC ); + HDassert( slist_entry_ptr->addr == addr ); + + if ( H5SL_remove(aux_ptr->d_slist_ptr, (void *)(&addr)) + != slist_entry_ptr ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTDELETE, FAIL, \ + "Can't delete entry from dirty entry slist.") + } + + slist_entry_ptr->magic = 0; + H5FL_FREE(H5AC_slist_entry_t, slist_entry_ptr); + slist_entry_ptr = NULL; + + aux_ptr->d_slist_len -= 1; + + HDassert( aux_ptr->d_slist_len >= 0 ); + } + + /* if the entry appears in the cleaned entry slist, remove it. */ + if ( (slist_entry_ptr = H5SL_search(aux_ptr->c_slist_ptr, + (void *)(&addr))) != NULL ) { + + HDassert( slist_entry_ptr->magic == + H5AC__H5AC_SLIST_ENTRY_T_MAGIC ); + HDassert( slist_entry_ptr->addr == addr ); + + if ( H5SL_remove(aux_ptr->c_slist_ptr, (void *)(&addr)) + != slist_entry_ptr ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTDELETE, FAIL, \ + "Can't delete entry from cleaned entry slist.") + } + + slist_entry_ptr->magic = 0; + H5FL_FREE(H5AC_slist_entry_t, slist_entry_ptr); + slist_entry_ptr = NULL; + + aux_ptr->c_slist_len -= 1; + + HDassert( aux_ptr->c_slist_len >= 0 ); + } + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5AC_log_deleted_entry() */ +#endif /* H5_HAVE_PARALLEL */ + + +/*------------------------------------------------------------------------- + * + * Function: H5AC_log_dirtied_entry() + * + * Purpose: Update the dirty_bytes count for a newly dirtied entry. + * + * If mpi_rank isnt 0, this simply means adding the size + * of the entries to the dirty_bytes count. + * + * If mpi_rank is 0, we must first check to see if the entry + * appears in the dirty entries slist. If it is, do nothing. + * If it isn't, add the size to th dirty_bytes count, add the + * entry to the dirty entries slist, and remove it from the + * cleaned list (if it is present there). + * + * Return SUCCEED on success, and FAIL on failure. + * + * Return: Non-negative on success/Negative on failure. + * + * Programmer: John Mainzer, 6/29/05 + * + *------------------------------------------------------------------------- + */ + +#ifdef H5_HAVE_PARALLEL +static herr_t +H5AC_log_dirtied_entry(const H5AC_info_t * entry_ptr, + haddr_t addr, + hbool_t size_changed, + size_t new_size) +{ + size_t entry_size; + H5AC_t * cache_ptr; + H5AC_aux_t * aux_ptr; + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5AC_log_dirtied_entry, FAIL) + + HDassert( entry_ptr ); + HDassert( entry_ptr->addr == addr ); + HDassert( entry_ptr->is_dirty == FALSE ); + + cache_ptr = entry_ptr->cache_ptr; + + HDassert( cache_ptr != NULL ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + + aux_ptr = cache_ptr->aux_ptr; + + HDassert( aux_ptr != NULL ); + HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC ); + + if ( size_changed ) { + + entry_size = new_size; + + } else { + + entry_size = entry_ptr->size; + } + + if ( aux_ptr->mpi_rank == 0 ) { + H5AC_slist_entry_t * slist_entry_ptr; + + HDassert( aux_ptr->d_slist_ptr != NULL ); + HDassert( aux_ptr->c_slist_ptr != NULL ); + + if ( H5SL_search(aux_ptr->d_slist_ptr, (void *)(&addr)) == NULL ) { + + /* insert the address of the entry in the dirty entry list, and + * add its size to the dirty_bytes count. + */ + if ( NULL == (slist_entry_ptr = H5FL_CALLOC(H5AC_slist_entry_t)) ) { + + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \ + "Can't allocate dirty slist entry .") + } + + slist_entry_ptr->magic = H5AC__H5AC_SLIST_ENTRY_T_MAGIC; + slist_entry_ptr->addr = addr; + + if ( H5SL_insert(aux_ptr->d_slist_ptr, slist_entry_ptr, + &(slist_entry_ptr->addr)) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTINSERT, FAIL, \ + "can't insert entry into dirty entry slist.") + } + + aux_ptr->d_slist_len += 1; + aux_ptr->dirty_bytes += entry_size; +#if H5AC_DEBUG_DIRTY_BYTES_CREATION + aux_ptr->unprotect_dirty_bytes += entry_size; + aux_ptr->unprotect_dirty_bytes_updates += 1; +#endif /* H5AC_DEBUG_DIRTY_BYTES_CREATION */ + } + + if ( H5SL_search(aux_ptr->c_slist_ptr, (void *)(&addr)) != NULL ) { + + /* the entry is dirty. If it exists on the cleaned entries list, + * remove it. + */ + if ( (slist_entry_ptr = H5SL_search(aux_ptr->c_slist_ptr, + (void *)(&addr))) != NULL ) { + + HDassert( slist_entry_ptr->magic == + H5AC__H5AC_SLIST_ENTRY_T_MAGIC ); + HDassert( slist_entry_ptr->addr == addr ); + + if ( H5SL_remove(aux_ptr->c_slist_ptr, (void *)(&addr)) + != slist_entry_ptr ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTDELETE, FAIL, \ + "Can't delete entry from clean entry slist.") + } + + slist_entry_ptr->magic = 0; + H5FL_FREE(H5AC_slist_entry_t, slist_entry_ptr); + slist_entry_ptr = NULL; + + aux_ptr->c_slist_len -= 1; + + HDassert( aux_ptr->c_slist_len >= 0 ); + } + } + } else { + + aux_ptr->dirty_bytes += entry_size; +#if H5AC_DEBUG_DIRTY_BYTES_CREATION + aux_ptr->unprotect_dirty_bytes += entry_size; + aux_ptr->unprotect_dirty_bytes_updates += 1; +#endif /* H5AC_DEBUG_DIRTY_BYTES_CREATION */ + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5AC_log_dirtied_entry() */ +#endif /* H5_HAVE_PARALLEL */ + + +/*------------------------------------------------------------------------- + * + * Function: H5AC_log_flushed_entry() + * + * Purpose: Update the clean entry slist for the flush of an entry -- + * specifically, if the entry has been cleared, remove it + * from both the cleaned and dirtied lists if it is present. + * Otherwise, if the entry was dirty, insert the indicated + * entry address in the clean slist if it isn't there already. + * + * This function is only used in PHDF5, and should only + * be called for the process with mpi rank 0. + * + * Return SUCCEED on success, and FAIL on failure. + * + * Return: Non-negative on success/Negative on failure. + * + * Programmer: John Mainzer, 6/29/05 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +#ifdef H5_HAVE_PARALLEL +#if 0 /* This is useful debugging code. -- JRM */ +static herr_t +H5AC_log_flushed_entry_dummy(H5C_t * cache_ptr, + haddr_t addr, + hbool_t was_dirty, + unsigned flags, + int type_id) +{ + herr_t ret_value = SUCCEED; /* Return value */ + H5AC_aux_t * aux_ptr = NULL; + + FUNC_ENTER_NOAPI(H5AC_log_flushed_entry_dummy, FAIL) + + aux_ptr = cache_ptr->aux_ptr; + + if ( ( was_dirty ) && ( (flags & H5C__FLUSH_CLEAR_ONLY_FLAG) == 0 ) ) { + + HDfprintf(stdout, + "%d:H5AC_log_flushed_entry(): addr = %d, flags = %x, was_dirty = %d, type_id = %d\n", + (int)(aux_ptr->mpi_rank), (int)addr, flags, (int)was_dirty, type_id); + } +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5AC_log_flushed_entry_dummy() */ +#endif /* JRM */ + +static herr_t +H5AC_log_flushed_entry(H5C_t * cache_ptr, + haddr_t addr, + hbool_t was_dirty, + unsigned flags, + int UNUSED type_id) +{ + herr_t ret_value = SUCCEED; /* Return value */ + hbool_t cleared; + H5AC_aux_t * aux_ptr; + H5AC_slist_entry_t * slist_entry_ptr = NULL; + + + FUNC_ENTER_NOAPI(H5AC_log_flushed_entry, FAIL) + + HDassert( cache_ptr != NULL ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + + aux_ptr = cache_ptr->aux_ptr; + + HDassert( aux_ptr != NULL ); + HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC ); + HDassert( aux_ptr->mpi_rank == 0 ); + HDassert( aux_ptr->c_slist_ptr != NULL ); + + cleared = ( (flags & H5C__FLUSH_CLEAR_ONLY_FLAG) != 0 ); + + if ( cleared ) { + + /* If the entry has been cleared, must remove it from both the + * cleaned list and the dirtied list. + */ + + if ( (slist_entry_ptr = H5SL_search(aux_ptr->c_slist_ptr, + (void *)(&addr))) != NULL ) { + + HDassert( slist_entry_ptr->magic == H5AC__H5AC_SLIST_ENTRY_T_MAGIC); + HDassert( slist_entry_ptr->addr == addr ); + + if ( H5SL_remove(aux_ptr->c_slist_ptr, (void *)(&addr)) + != slist_entry_ptr ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTDELETE, FAIL, \ + "Can't delete entry from clean entry slist.") + } + + slist_entry_ptr->magic = 0; + H5FL_FREE(H5AC_slist_entry_t, slist_entry_ptr); + slist_entry_ptr = NULL; + + aux_ptr->c_slist_len -= 1; + + HDassert( aux_ptr->c_slist_len >= 0 ); + } + + if ( (slist_entry_ptr = H5SL_search(aux_ptr->d_slist_ptr, + (void *)(&addr))) != NULL ) { + + HDassert( slist_entry_ptr->magic == H5AC__H5AC_SLIST_ENTRY_T_MAGIC); + HDassert( slist_entry_ptr->addr == addr ); + + if ( H5SL_remove(aux_ptr->d_slist_ptr, (void *)(&addr)) + != slist_entry_ptr ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTDELETE, FAIL, \ + "Can't delete entry from dirty entry slist.") + } + + slist_entry_ptr->magic = 0; + H5FL_FREE(H5AC_slist_entry_t, slist_entry_ptr); + slist_entry_ptr = NULL; + + aux_ptr->d_slist_len -= 1; + + HDassert( aux_ptr->d_slist_len >= 0 ); + } + } else if ( was_dirty ) { + + if ( H5SL_search(aux_ptr->c_slist_ptr, (void *)(&addr)) == NULL ) { + + /* insert the address of the entry in the clean entry list. */ + + if ( NULL == (slist_entry_ptr = H5FL_CALLOC(H5AC_slist_entry_t)) ) { + + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \ + "Can't allocate clean slist entry .") + } + + slist_entry_ptr->magic = H5AC__H5AC_SLIST_ENTRY_T_MAGIC; + slist_entry_ptr->addr = addr; + + if ( H5SL_insert(aux_ptr->c_slist_ptr, slist_entry_ptr, + &(slist_entry_ptr->addr)) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTINSERT, FAIL, \ + "can't insert entry into clean entry slist.") + } + + aux_ptr->c_slist_len += 1; + } + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5AC_log_flushed_entry() */ +#endif /* H5_HAVE_PARALLEL */ + + +/*------------------------------------------------------------------------- + * + * Function: H5AC_log_inserted_entry() + * + * Purpose: Update the dirty_bytes count for a newly inserted entry. + * + * If mpi_rank isnt 0, this simply means adding the size + * of the entry to the dirty_bytes count. + * + * If mpi_rank is 0, we must also add the entry to the + * dirty entries slist. + * + * Return SUCCEED on success, and FAIL on failure. + * + * Return: Non-negative on success/Negative on failure. + * + * Programmer: John Mainzer, 6/30/05 + * + * Modifications: + * + * JRM -- 10/24/07 + * Added the size parameter. + * + *------------------------------------------------------------------------- + */ + +#ifdef H5_HAVE_PARALLEL +static herr_t +H5AC_log_inserted_entry(H5F_t * f, + H5AC_t * cache_ptr, + H5AC_info_t * entry_ptr, + const H5AC_class_t * type, + haddr_t addr, + size_t size) +{ + herr_t ret_value = SUCCEED; /* Return value */ + H5AC_aux_t * aux_ptr = NULL; + H5AC_slist_entry_t * slist_entry_ptr = NULL; + + FUNC_ENTER_NOAPI(H5AC_log_inserted_entry, FAIL) + + HDassert( cache_ptr != NULL ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + + aux_ptr = cache_ptr->aux_ptr; + + HDassert( aux_ptr != NULL ); + HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC ); + + HDassert( entry_ptr != NULL ); + HDassert( entry_ptr->addr == addr ); + HDassert( entry_ptr->type == type ); + + if ( aux_ptr->mpi_rank == 0 ) { + + HDassert( aux_ptr->d_slist_ptr != NULL ); + HDassert( aux_ptr->c_slist_ptr != NULL ); + + if ( H5SL_search(aux_ptr->d_slist_ptr, (void *)(&addr)) == NULL ) { + + /* insert the address of the entry in the dirty entry list, and + * add its size to the dirty_bytes count. + */ + if ( NULL == (slist_entry_ptr = H5FL_CALLOC(H5AC_slist_entry_t)) ) { + + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \ + "Can't allocate dirty slist entry .") + } + + slist_entry_ptr->magic = H5AC__H5AC_SLIST_ENTRY_T_MAGIC; + slist_entry_ptr->addr = addr; + + if ( H5SL_insert(aux_ptr->d_slist_ptr, slist_entry_ptr, + &(slist_entry_ptr->addr)) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTINSERT, FAIL, \ + "can't insert entry into dirty entry slist.") + } + + aux_ptr->d_slist_len += 1; + + } else { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "Inserted entry already in dirty slist.") + } + + if ( H5SL_search(aux_ptr->c_slist_ptr, (void *)(&addr)) != NULL ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "Inserted entry in clean slist.") + } + } + + aux_ptr->dirty_bytes += size; + +#if H5AC_DEBUG_DIRTY_BYTES_CREATION + aux_ptr->insert_dirty_bytes += size; + aux_ptr->insert_dirty_bytes_updates += 1; +#endif /* H5AC_DEBUG_DIRTY_BYTES_CREATION */ + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5AC_log_inserted_entry() */ +#endif /* H5_HAVE_PARALLEL */ + + +/*------------------------------------------------------------------------- + * + * Function: H5AC_log_renamed_entry() + * + * Purpose: Update the dirty_bytes count for a renamed entry. + * + * WARNING + * + * At present, the way that the rename call is used ensures + * that the renamed entry is present in all caches by + * renaming in a collective operation and immediately after + * unprotecting the target entry. + * + * This function uses this invarient, and will cause arcane + * failures if it is not met. If maintaining this invarient + * becomes impossible, we will have to rework this function + * extensively, and likely include a bit of IPC for + * synchronization. A better option might be to subsume + * rename in the unprotect operation. + * + * Given that the target entry is in all caches, the function + * proceeds as follows: + * + * For processes with mpi rank other 0, it simply checks to + * see if the entry was dirty prior to the rename, and adds + * the entries size to the dirty bytes count. + * + * In the process with mpi rank 0, the function first checks + * to see if the entry was dirty prior to the rename. If it + * was, and if the entry doesn't appear in the dirtied list + * under its old address, it adds the entry's size to the + * dirty bytes count. + * + * The rank 0 process then removes any references to the + * entry under its old address from the cleands and dirtied + * lists, and inserts an entry in the dirtied list under the + * new address. + * + * Return SUCCEED on success, and FAIL on failure. + * + * Return: Non-negative on success/Negative on failure. + * + * Programmer: John Mainzer, 6/30/05 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +#ifdef H5_HAVE_PARALLEL +static herr_t +H5AC_log_renamed_entry(H5F_t * f, + haddr_t old_addr, + haddr_t new_addr) +{ + herr_t ret_value = SUCCEED; /* Return value */ + H5AC_t * cache_ptr; + hbool_t entry_in_cache; + hbool_t entry_dirty; + size_t entry_size; + H5AC_aux_t * aux_ptr = NULL; + H5AC_slist_entry_t * slist_entry_ptr = NULL; + + FUNC_ENTER_NOAPI(H5AC_log_renamed_entry, FAIL) + + HDassert( f != NULL ); + HDassert( f->shared != NULL ); + + cache_ptr = (H5AC_t *)f->shared->cache; + + HDassert( cache_ptr != NULL ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + + aux_ptr = cache_ptr->aux_ptr; + + HDassert( aux_ptr != NULL ); + HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC ); + + /* get entry status, size, etc here */ + if ( H5C_get_entry_status(f, old_addr, &entry_size, &entry_in_cache, + &entry_dirty, NULL, NULL) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't get entry status.") + + } else if ( ! entry_in_cache ) { + + HDassert( entry_in_cache ); + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "entry not in cache.") + } + + if ( aux_ptr->mpi_rank == 0 ) { + + HDassert( aux_ptr->d_slist_ptr != NULL ); + HDassert( aux_ptr->c_slist_ptr != NULL ); + + /* if the entry appears in the cleaned entry slist, under its old + * address, remove it. + */ + if ( (slist_entry_ptr = H5SL_search(aux_ptr->c_slist_ptr, + (void *)(&old_addr))) != NULL ) { + + HDassert( slist_entry_ptr->magic == + H5AC__H5AC_SLIST_ENTRY_T_MAGIC ); + HDassert( slist_entry_ptr->addr == old_addr ); + + if ( H5SL_remove(aux_ptr->c_slist_ptr, (void *)(&old_addr)) + != slist_entry_ptr ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTDELETE, FAIL, \ + "Can't delete entry from cleaned entry slist.") + } + + slist_entry_ptr->magic = 0; + H5FL_FREE(H5AC_slist_entry_t, slist_entry_ptr); + slist_entry_ptr = NULL; + + aux_ptr->c_slist_len -= 1; + + HDassert( aux_ptr->c_slist_len >= 0 ); + } + + /* if the entry appears in the dirtied entry slist under its old + * address, remove it, but don't free it. Set addr to new_addr. + */ + if ( (slist_entry_ptr = H5SL_search(aux_ptr->d_slist_ptr, + (void *)(&old_addr))) != NULL ) { + + HDassert( slist_entry_ptr->magic == + H5AC__H5AC_SLIST_ENTRY_T_MAGIC ); + HDassert( slist_entry_ptr->addr == old_addr ); + + if ( H5SL_remove(aux_ptr->d_slist_ptr, (void *)(&old_addr)) + != slist_entry_ptr ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTDELETE, FAIL, \ + "Can't delete entry from dirty entry slist.") + } + + slist_entry_ptr->addr = new_addr; + + aux_ptr->d_slist_len -= 1; + + HDassert( aux_ptr->d_slist_len >= 0 ); + + } else { + + /* otherwise, allocate a new entry that is ready + * for insertion, and increment dirty_bytes. + * + * Note that the fact that the entry wasn't in the dirtied + * list under its old address implies that it must have + * been clean to start with. + */ + + HDassert( !entry_dirty ); + + if ( NULL == (slist_entry_ptr = H5FL_CALLOC(H5AC_slist_entry_t)) ) { + + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \ + "Can't allocate dirty slist entry .") + } + + slist_entry_ptr->magic = H5AC__H5AC_SLIST_ENTRY_T_MAGIC; + slist_entry_ptr->addr = new_addr; + + aux_ptr->dirty_bytes += entry_size; + +#if H5AC_DEBUG_DIRTY_BYTES_CREATION + aux_ptr->rename_dirty_bytes += entry_size; + aux_ptr->rename_dirty_bytes_updates += 1; +#endif /* H5AC_DEBUG_DIRTY_BYTES_CREATION */ + } + + /* verify that there is no entry at new_addr in the dirty slist */ + if ( H5SL_search(aux_ptr->d_slist_ptr, (void *)(&new_addr)) != NULL ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "dirty slist already contains entry at new_addr.") + } + + /* insert / reinsert the entry in the dirty slist */ + if ( H5SL_insert(aux_ptr->d_slist_ptr, slist_entry_ptr, + &(slist_entry_ptr->addr)) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTINSERT, FAIL, \ + "can't insert entry into dirty entry slist.") + } + + aux_ptr->d_slist_len += 1; + + } else if ( ! entry_dirty ) { + + aux_ptr->dirty_bytes += entry_size; + +#if H5AC_DEBUG_DIRTY_BYTES_CREATION + aux_ptr->rename_dirty_bytes += entry_size; + aux_ptr->rename_dirty_bytes_updates += 1; +#endif /* H5AC_DEBUG_DIRTY_BYTES_CREATION */ + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5AC_log_renamed_entry() */ +#endif /* H5_HAVE_PARALLEL */ + + +/*------------------------------------------------------------------------- + * Function: H5AC_propagate_flushed_and_still_clean_entries_list + * + * Purpose: In PHDF5, only the metadata cache with mpi rank 0 is allowed + * to write to file. All other metadata caches on processes + * with rank greater than 0 must retain dirty entries until + * they are notified that the entry is now clean. + * + * This function is the main routine for that proceedure. + * It must be called simultaniously on all processes that + * have the relevant file open. To this end, there must + * be a barrier immediately prior to this call. + * + * Typicaly, this will be done one of two ways: + * + * 1) Dirty byte creation exceeds some user specified value. + * + * While metadata reads may occur independently, all + * operations writing metadata must be collective. Thus + * all metadata caches see the same sequence of operations, + * and therefore the same dirty data creation. + * + * This fact is used to synchronize the caches for purposes + * of propagating the list of flushed and still clean + * entries, by simply calling this function from all + * caches whenever some user specified threshold on dirty + * data is exceeded. + * + * 2) Under direct user control -- this operation must be + * collective. + * + * The operations to be managed by this function are as + * follows: + * + * For the process with mpi rank 0: + * + * 1) Enable writes, flush the cache to its min clean size, + * and then disable writes again. + * + * 2) Load the contents of the flushed and still clean entries + * list (c_slist_ptr) into a buffer, and broadcast that + * buffer to all the other caches. + * + * 3) Clear the flushed and still clean entries list + * (c_slist_ptr). + * + * + * For all processes with mpi rank greater than 0: + * + * 1) Receive the flushed and still clean entries list broadcast + * + * 2) Mark the specified entries as clean. + * + * + * For all processes: + * + * 1) Reset the dirtied bytes count to 0. + * + * Return: Success: non-negative + * + * Failure: negative + * + * Programmer: John Mainzer + * July 5, 2005 + * + * Modifications: + * + * JRM -- 5/11/06 + * Added code to call the write_done callback. + * + *------------------------------------------------------------------------- + */ + +#ifdef H5_HAVE_PARALLEL +herr_t +H5AC_propagate_flushed_and_still_clean_entries_list(H5F_t * f, + hid_t dxpl_id, + H5AC_t * cache_ptr, + hbool_t do_barrier) +{ + herr_t ret_value = SUCCEED; /* Return value */ + herr_t result; + int mpi_code; + H5AC_aux_t * aux_ptr = NULL; + + FUNC_ENTER_NOAPI(H5AC_propagate_flushed_and_still_clean_entries_list, FAIL) + + HDassert( cache_ptr != NULL ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + + aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr); + + HDassert( aux_ptr != NULL ); + HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC ); + +#if H5AC_DEBUG_DIRTY_BYTES_CREATION + HDfprintf(stdout, + "%d:H5AC_propagate...:%d: (u/uu/i/iu/r/ru) = %d/%d/%d/%d/%d/%d\n", + (int)(aux_ptr->mpi_rank), + (int)(aux_ptr->dirty_bytes_propagations), + (int)(aux_ptr->unprotect_dirty_bytes), + (int)(aux_ptr->unprotect_dirty_bytes_updates), + (int)(aux_ptr->insert_dirty_bytes), + (int)(aux_ptr->insert_dirty_bytes_updates), + (int)(aux_ptr->rename_dirty_bytes), + (int)(aux_ptr->rename_dirty_bytes_updates)); +#endif /* H5AC_DEBUG_DIRTY_BYTES_CREATION */ + + if ( do_barrier ) { + + /* to prevent "messages from the future" we must synchronize all + * processes before we start the flush. This synchronization may + * already be done -- hence the do_barrier parameter. + */ + + if ( MPI_SUCCESS != (mpi_code = MPI_Barrier(aux_ptr->mpi_comm)) ) { + + HMPI_GOTO_ERROR(FAIL, "MPI_Barrier failed", mpi_code) + } + } + + if ( aux_ptr->mpi_rank == 0 ) { + + aux_ptr->write_permitted = TRUE; + + result = H5C_flush_to_min_clean(f, dxpl_id); + + aux_ptr->write_permitted = FALSE; + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_flush_to_min_clean() failed.") + } + + if ( aux_ptr->write_done != NULL ) { + + (aux_ptr->write_done)(); + } + + if ( H5AC_broadcast_clean_list(cache_ptr) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "Can't broadcast clean slist.") + } + + HDassert( aux_ptr->c_slist_len == 0 ); + + } else { + + if ( H5AC_receive_and_apply_clean_list(f, dxpl_id, + cache_ptr) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "Can't receive and/or process clean slist broadcast.") + } + } + + aux_ptr->dirty_bytes = 0; +#if H5AC_DEBUG_DIRTY_BYTES_CREATION + aux_ptr->dirty_bytes_propagations += 1; + aux_ptr->unprotect_dirty_bytes = 0; + aux_ptr->unprotect_dirty_bytes_updates = 0; + aux_ptr->insert_dirty_bytes = 0; + aux_ptr->insert_dirty_bytes_updates = 0; + aux_ptr->rename_dirty_bytes = 0; + aux_ptr->rename_dirty_bytes_updates = 0; +#endif /* H5AC_DEBUG_DIRTY_BYTES_CREATION */ + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5AC_propagate_flushed_and_still_clean_entries_list() */ +#endif /* H5_HAVE_PARALLEL */ + + +/*------------------------------------------------------------------------- + * + * Function: H5AC_receive_and_apply_clean_list() + * + * Purpose: Receive the list of cleaned entries from process 0, + * and mark the specified entries as clean. + * + * This function must only be called by the process with + * MPI_rank greater than 0. + * + * Return SUCCEED on success, and FAIL on failure. + * + * Return: Non-negative on success/Negative on failure. + * + * Programmer: John Mainzer, 7/4/05 + * + * Modifications: + * + * JRM --10/24/07 + * Reworked parameter list in support of the revised cache + * API. + * + *------------------------------------------------------------------------- + */ + +#ifdef H5_HAVE_PARALLEL +static herr_t +H5AC_receive_and_apply_clean_list(H5F_t * f, + hid_t dxpl_id, + H5AC_t * cache_ptr) +{ + herr_t ret_value = SUCCEED; /* Return value */ + H5AC_aux_t * aux_ptr = NULL; + haddr_t * haddr_buf_ptr = NULL; + MPI_Offset * MPI_Offset_buf_ptr = NULL; + size_t buf_size; + int i = 0; + int mpi_result; + int num_entries; + + FUNC_ENTER_NOAPI(H5AC_receive_and_apply_clean_list, FAIL) + + HDassert( cache_ptr != NULL ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + + aux_ptr = (H5AC_aux_t *)(cache_ptr->aux_ptr); + + HDassert( aux_ptr != NULL ); + HDassert( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC ); + HDassert( aux_ptr->mpi_rank != 0 ); + + /* First receive the number of entries in the list so that we + * can set up a buffer to receive them. If there aren't + * any, we are done. + */ + mpi_result = MPI_Bcast(&num_entries, 1, MPI_INT, 0, aux_ptr->mpi_comm); + + if ( mpi_result != MPI_SUCCESS ) { + + HMPI_GOTO_ERROR(FAIL, "MPI_Bcast failed 1", mpi_result) + } + + if ( num_entries > 0 ) + { + /* allocate a buffers to store the list of entry base addresses in */ + + buf_size = sizeof(MPI_Offset) * (size_t)num_entries; + + MPI_Offset_buf_ptr = (MPI_Offset *)H5MM_malloc(buf_size); + + if ( MPI_Offset_buf_ptr == NULL ) { + + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \ + "memory allocation failed for receive buffer") + } + + haddr_buf_ptr = (haddr_t *)H5MM_malloc(sizeof(haddr_t) * + (size_t)num_entries); + + if ( haddr_buf_ptr == NULL ) { + + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \ + "memory allocation failed for haddr buffer") + } + + + /* Now receive the list of cleaned entries + * + * The peculiar structure of the following call to MPI_Bcast is + * due to MPI's (?) failure to believe in the MPI_Offset type. + * Thus the element type is MPI_BYTE, with size equal to the + * buf_size computed above. + */ + + mpi_result = MPI_Bcast((void *)MPI_Offset_buf_ptr, (int)buf_size, + MPI_BYTE, 0, aux_ptr->mpi_comm); + + if ( mpi_result != MPI_SUCCESS ) { + + HMPI_GOTO_ERROR(FAIL, "MPI_Bcast failed 2", mpi_result) + } + + + /* translate the MPI_Offsets to haddr_t */ + i = 0; + while ( i < num_entries ) + { + haddr_buf_ptr[i] = H5FD_mpi_MPIOff_to_haddr(MPI_Offset_buf_ptr[i]); + + if ( haddr_buf_ptr[i] == HADDR_UNDEF ) { + + HGOTO_ERROR(H5E_INTERNAL, H5E_BADRANGE, FAIL, \ + "can't convert MPI off to haddr") + } + + i++; + } + + + /* mark the indicated entries as clean */ + if ( H5C_mark_entries_as_clean(f, dxpl_id, + (int32_t)num_entries, + &(haddr_buf_ptr[0])) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "Can't mark entries clean.") + + } + } + +done: + + if ( MPI_Offset_buf_ptr != NULL ) { + + MPI_Offset_buf_ptr = + (MPI_Offset *)H5MM_xfree((void *)MPI_Offset_buf_ptr); + } + + if ( haddr_buf_ptr != NULL ) { + + haddr_buf_ptr = (haddr_t *)H5MM_xfree((void *)haddr_buf_ptr); + } + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5AC_receive_and_apply_clean_list() */ + +#endif /* H5_HAVE_PARALLEL */ + diff --git a/src/H5AC1.c b/src/H5AC1.c index e9ea106..99dffd6 100644 --- a/src/H5AC1.c +++ b/src/H5AC1.c @@ -511,7 +511,7 @@ H5AC1_create(const H5F_t *f, FUNC_ENTER_NOAPI(H5AC1_create, FAIL) HDassert(f); - HDassert(NULL == f->shared->cache); + HDassert(NULL == f->shared->cache1); HDassert(config_ptr != NULL); HDcompile_assert(NELMTS(H5AC1_entry_type_names) == H5AC1_NTYPES); HDcompile_assert(H5C1__MAX_NUM_TYPE_IDS == H5AC1_NTYPES); @@ -607,7 +607,7 @@ H5AC1_create(const H5F_t *f, if ( aux_ptr->mpi_rank == 0 ) { - f->shared->cache = H5C1_create(H5AC1__DEFAULT_MAX_CACHE_SIZE, + f->shared->cache1 = H5C1_create(H5AC1__DEFAULT_MAX_CACHE_SIZE, H5AC1__DEFAULT_MIN_CLEAN_SIZE, (H5AC1_NTYPES - 1), (const char **)H5AC1_entry_type_names, @@ -618,7 +618,7 @@ H5AC1_create(const H5F_t *f, } else { - f->shared->cache = H5C1_create(H5AC1__DEFAULT_MAX_CACHE_SIZE, + f->shared->cache1 = H5C1_create(H5AC1__DEFAULT_MAX_CACHE_SIZE, H5AC1__DEFAULT_MIN_CLEAN_SIZE, (H5AC1_NTYPES - 1), (const char **)H5AC1_entry_type_names, @@ -634,7 +634,7 @@ H5AC1_create(const H5F_t *f, } else { - f->shared->cache = H5C1_create(H5AC1__DEFAULT_MAX_CACHE_SIZE, + f->shared->cache1 = H5C1_create(H5AC1__DEFAULT_MAX_CACHE_SIZE, H5AC1__DEFAULT_MIN_CLEAN_SIZE, (H5AC1_NTYPES - 1), (const char **)H5AC1_entry_type_names, @@ -649,7 +649,7 @@ H5AC1_create(const H5F_t *f, * overwritten shortly by the subsequent set resize config call. * -- JRM */ - f->shared->cache = H5C1_create(H5AC1__DEFAULT_MAX_CACHE_SIZE, + f->shared->cache1 = H5C1_create(H5AC1__DEFAULT_MAX_CACHE_SIZE, H5AC1__DEFAULT_MIN_CLEAN_SIZE, (H5AC1_NTYPES - 1), (const char **)H5AC1_entry_type_names, @@ -661,7 +661,7 @@ H5AC1_create(const H5F_t *f, } #endif /* H5_HAVE_PARALLEL */ - if ( NULL == f->shared->cache ) { + if ( NULL == f->shared->cache1 ) { HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed") @@ -669,7 +669,7 @@ H5AC1_create(const H5F_t *f, #ifdef H5_HAVE_PARALLEL else if ( aux_ptr != NULL ) { - result = H5C1_set_prefix(f->shared->cache, prefix); + result = H5C1_set_prefix(f->shared->cache1, prefix); if ( result != SUCCEED ) { @@ -679,7 +679,7 @@ H5AC1_create(const H5F_t *f, } #endif /* H5_HAVE_PARALLEL */ - result = H5AC1_set_cache_auto_resize_config(f->shared->cache, config_ptr); + result = H5AC1_set_cache_auto_resize_config(f->shared->cache1, config_ptr); if ( result != SUCCEED ) { @@ -765,8 +765,8 @@ H5AC1_dest(H5F_t *f, hid_t dxpl_id) FUNC_ENTER_NOAPI(H5AC1_dest, FAIL) assert(f); - assert(f->shared->cache); - cache = f->shared->cache; + assert(f->shared->cache1); + cache = f->shared->cache1; #ifdef H5_HAVE_PARALLEL aux_ptr = cache->aux_ptr; @@ -789,7 +789,7 @@ H5AC1_dest(H5F_t *f, hid_t dxpl_id) HGOTO_ERROR(H5E_CACHE, H5E_CANTFREE, FAIL, "can't destroy cache") } - f->shared->cache = NULL; + f->shared->cache1 = NULL; #ifdef H5_HAVE_PARALLEL if ( aux_ptr != NULL ) { @@ -853,13 +853,13 @@ H5AC1_expunge_entry(H5F_t *f, HDassert(f); HDassert(f->shared); - HDassert(f->shared->cache); + HDassert(f->shared->cache1); HDassert(type); HDassert(type->clear); HDassert(type->dest); HDassert(H5F_addr_defined(addr)); - cache_ptr = f->shared->cache; + cache_ptr = f->shared->cache1; #if H5AC1__TRACE_FILE_ENABLED /* For the expunge entry call, only the addr, and type id are really @@ -996,7 +996,7 @@ H5AC1_flush(H5F_t *f, hid_t dxpl_id, unsigned flags) FUNC_ENTER_NOAPI(H5AC1_flush, FAIL) HDassert(f); - HDassert(f->shared->cache); + HDassert(f->shared->cache1); #if H5AC1__TRACE_FILE_ENABLED /* For the flush, only the flags are really necessary in the trace file. @@ -1004,8 +1004,8 @@ H5AC1_flush(H5F_t *f, hid_t dxpl_id, unsigned flags) */ if ( ( f != NULL ) && ( f->shared != NULL ) && - ( f->shared->cache != NULL ) && - ( H5C1_get_trace_file_ptr(f->shared->cache, &trace_file_ptr) >= 0 ) && + ( f->shared->cache1 != NULL ) && + ( H5C1_get_trace_file_ptr(f->shared->cache1, &trace_file_ptr) >= 0 ) && ( trace_file_ptr != NULL ) ) { sprintf(trace, "H5AC1_flush 0x%x", flags); @@ -1013,7 +1013,7 @@ H5AC1_flush(H5F_t *f, hid_t dxpl_id, unsigned flags) #endif /* H5AC1__TRACE_FILE_ENABLED */ #ifdef H5_HAVE_PARALLEL - aux_ptr = f->shared->cache->aux_ptr; + aux_ptr = f->shared->cache1->aux_ptr; if ( aux_ptr != NULL ) { @@ -1058,7 +1058,7 @@ H5AC1_flush(H5F_t *f, hid_t dxpl_id, unsigned flags) status = H5C1_flush_cache(f, H5AC1_noblock_dxpl_id, H5AC1_noblock_dxpl_id, - f->shared->cache, + f->shared->cache1, init_flush_flags); aux_ptr->write_permitted = FALSE; @@ -1077,7 +1077,7 @@ H5AC1_flush(H5F_t *f, hid_t dxpl_id, unsigned flags) status = H5AC1_propagate_flushed_and_still_clean_entries_list(f, H5AC1_noblock_dxpl_id, - f->shared->cache, + f->shared->cache1, FALSE); } /* end if ( aux_ptr != NULL ) */ #endif /* H5_HAVE_PARALLEL */ @@ -1085,7 +1085,7 @@ H5AC1_flush(H5F_t *f, hid_t dxpl_id, unsigned flags) status = H5C1_flush_cache(f, dxpl_id, H5AC1_noblock_dxpl_id, - f->shared->cache, + f->shared->cache1, flags); if ( status < 0 ) { @@ -1138,7 +1138,7 @@ H5AC1_get_entry_status(H5F_t * f, haddr_t addr, unsigned * status_ptr) { - H5C1_t *cache_ptr = f->shared->cache; + H5C1_t *cache_ptr = f->shared->cache1; herr_t ret_value = SUCCEED; /* Return value */ herr_t result; hbool_t in_cache; @@ -1270,7 +1270,7 @@ H5AC1_set(H5F_t *f, hid_t dxpl_id, const H5AC1_class_t *type, haddr_t addr, void FUNC_ENTER_NOAPI(H5AC1_set, FAIL) HDassert(f); - HDassert(f->shared->cache); + HDassert(f->shared->cache1); HDassert(type); HDassert(type->flush); HDassert(type->size); @@ -1287,8 +1287,8 @@ H5AC1_set(H5F_t *f, hid_t dxpl_id, const H5AC1_class_t *type, haddr_t addr, void */ if ( ( f != NULL ) && ( f->shared != NULL ) && - ( f->shared->cache != NULL ) && - ( H5C1_get_trace_file_ptr(f->shared->cache, &trace_file_ptr) >= 0 ) && + ( f->shared->cache1 != NULL ) && + ( H5C1_get_trace_file_ptr(f->shared->cache1, &trace_file_ptr) >= 0 ) && ( trace_file_ptr != NULL ) ) { sprintf(trace, "H5AC1_set 0x%lx %d 0x%x", @@ -1299,7 +1299,7 @@ H5AC1_set(H5F_t *f, hid_t dxpl_id, const H5AC1_class_t *type, haddr_t addr, void #endif /* H5AC1__TRACE_FILE_ENABLED */ /* Get local copy of this information */ - cache = f->shared->cache; + cache = f->shared->cache1; info = (H5AC1_info_t *)thing; info->addr = addr; @@ -1307,10 +1307,10 @@ H5AC1_set(H5F_t *f, hid_t dxpl_id, const H5AC1_class_t *type, haddr_t addr, void info->is_protected = FALSE; #ifdef H5_HAVE_PARALLEL - if ( NULL != (aux_ptr = f->shared->cache->aux_ptr) ) { + if ( NULL != (aux_ptr = f->shared->cache1->aux_ptr) ) { result = H5AC1_log_inserted_entry(f, - f->shared->cache, + f->shared->cache1, (H5AC1_info_t *)thing, type, addr); @@ -1351,7 +1351,7 @@ H5AC1_set(H5F_t *f, hid_t dxpl_id, const H5AC1_class_t *type, haddr_t addr, void result = H5AC1_propagate_flushed_and_still_clean_entries_list(f, H5AC1_noblock_dxpl_id, - f->shared->cache, + f->shared->cache1, TRUE); if ( result < 0 ) { @@ -1403,7 +1403,7 @@ H5AC1_mark_pinned_entry_dirty(H5F_t * f, hbool_t size_changed, size_t new_size) { - H5C1_t *cache_ptr = f->shared->cache; + H5C1_t *cache_ptr = f->shared->cache1; herr_t result; herr_t ret_value = SUCCEED; /* Return value */ #if H5AC1__TRACE_FILE_ENABLED @@ -1420,8 +1420,8 @@ H5AC1_mark_pinned_entry_dirty(H5F_t * f, */ if ( ( f != NULL ) && ( f->shared != NULL ) && - ( f->shared->cache != NULL ) && - ( H5C1_get_trace_file_ptr(f->shared->cache, &trace_file_ptr) >= 0 ) && + ( f->shared->cache1 != NULL ) && + ( H5C1_get_trace_file_ptr(f->shared->cache1, &trace_file_ptr) >= 0 ) && ( trace_file_ptr != NULL ) ) { sprintf(trace, "H5AC1_mark_pinned_entry_dirty 0x%lx %d %d", @@ -1521,7 +1521,7 @@ herr_t H5AC1_mark_pinned_or_protected_entry_dirty(H5F_t * f, void * thing) { - H5C1_t * cache_ptr = f->shared->cache; + H5C1_t * cache_ptr = f->shared->cache1; #ifdef H5_HAVE_PARALLEL H5AC1_info_t * info_ptr; #endif /* H5_HAVE_PARALLEL */ @@ -1541,8 +1541,8 @@ H5AC1_mark_pinned_or_protected_entry_dirty(H5F_t * f, */ if ( ( f != NULL ) && ( f->shared != NULL ) && - ( f->shared->cache != NULL ) && - ( H5C1_get_trace_file_ptr(f->shared->cache, &trace_file_ptr) >= 0 ) && + ( f->shared->cache1 != NULL ) && + ( H5C1_get_trace_file_ptr(f->shared->cache1, &trace_file_ptr) >= 0 ) && ( trace_file_ptr != NULL ) ) { sprintf(trace, "H5AC1_mark_pinned_or_protected_entry_dirty %lx", @@ -1657,7 +1657,7 @@ H5AC1_rename(H5F_t *f, const H5AC1_class_t *type, haddr_t old_addr, haddr_t new_ FUNC_ENTER_NOAPI(H5AC1_rename, FAIL) HDassert(f); - HDassert(f->shared->cache); + HDassert(f->shared->cache1); HDassert(type); HDassert(H5F_addr_defined(old_addr)); HDassert(H5F_addr_defined(new_addr)); @@ -1670,8 +1670,8 @@ H5AC1_rename(H5F_t *f, const H5AC1_class_t *type, haddr_t old_addr, haddr_t new_ */ if ( ( f != NULL ) && ( f->shared != NULL ) && - ( f->shared->cache != NULL ) && - ( H5C1_get_trace_file_ptr(f->shared->cache, &trace_file_ptr) >= 0 ) && + ( f->shared->cache1 != NULL ) && + ( H5C1_get_trace_file_ptr(f->shared->cache1, &trace_file_ptr) >= 0 ) && ( trace_file_ptr != NULL ) ) { sprintf(trace, "H5AC1_rename %lx %lx %d", @@ -1682,9 +1682,9 @@ H5AC1_rename(H5F_t *f, const H5AC1_class_t *type, haddr_t old_addr, haddr_t new_ #endif /* H5AC1__TRACE_FILE_ENABLED */ #ifdef H5_HAVE_PARALLEL - if ( NULL != (aux_ptr = f->shared->cache->aux_ptr) ) { + if ( NULL != (aux_ptr = f->shared->cache1->aux_ptr) ) { - result = H5AC1_log_renamed_entry(f->shared->cache, + result = H5AC1_log_renamed_entry(f->shared->cache1, old_addr, new_addr); @@ -1696,7 +1696,7 @@ H5AC1_rename(H5F_t *f, const H5AC1_class_t *type, haddr_t old_addr, haddr_t new_ } #endif /* H5_HAVE_PARALLEL */ - result = H5C1_rename_entry(f->shared->cache, + result = H5C1_rename_entry(f->shared->cache1, type, old_addr, new_addr); @@ -1713,7 +1713,7 @@ H5AC1_rename(H5F_t *f, const H5AC1_class_t *type, haddr_t old_addr, haddr_t new_ result = H5AC1_propagate_flushed_and_still_clean_entries_list(f, H5AC1_noblock_dxpl_id, - f->shared->cache, + f->shared->cache1, TRUE); if ( result < 0 ) { @@ -1758,7 +1758,7 @@ herr_t H5AC1_pin_protected_entry(H5F_t * f, void * thing) { - H5C1_t *cache_ptr = f->shared->cache; + H5C1_t *cache_ptr = f->shared->cache1; herr_t result; herr_t ret_value = SUCCEED; /* Return value */ #if H5AC1__TRACE_FILE_ENABLED @@ -1774,8 +1774,8 @@ H5AC1_pin_protected_entry(H5F_t * f, */ if ( ( f != NULL ) && ( f->shared != NULL ) && - ( f->shared->cache != NULL ) && - ( H5C1_get_trace_file_ptr(f->shared->cache, &trace_file_ptr) >= 0 ) && + ( f->shared->cache1 != NULL ) && + ( H5C1_get_trace_file_ptr(f->shared->cache1, &trace_file_ptr) >= 0 ) && ( trace_file_ptr != NULL ) ) { sprintf(trace, "H5AC1_pin_protected_entry %lx", @@ -1896,7 +1896,7 @@ H5AC1_protect(H5F_t *f, /* check args */ HDassert(f); HDassert(f->shared); - HDassert(f->shared->cache); + HDassert(f->shared->cache1); HDassert(type); HDassert(type->flush); HDassert(type->load); @@ -1914,8 +1914,8 @@ H5AC1_protect(H5F_t *f, */ if ( ( f != NULL ) && ( f->shared != NULL ) && - ( f->shared->cache != NULL ) && - ( H5C1_get_trace_file_ptr(f->shared->cache, &trace_file_ptr) >= 0 ) && + ( f->shared->cache1 != NULL ) && + ( H5C1_get_trace_file_ptr(f->shared->cache1, &trace_file_ptr) >= 0 ) && ( trace_file_ptr != NULL ) ) { char * rw_string; @@ -1948,7 +1948,7 @@ H5AC1_protect(H5F_t *f, thing = H5C1_protect(f, dxpl_id, H5AC1_noblock_dxpl_id, - f->shared->cache, + f->shared->cache1, type, addr, udata1, @@ -2009,7 +2009,7 @@ H5AC1_resize_pinned_entry(H5F_t * f, void * thing, size_t new_size) { - H5C1_t *cache_ptr = f->shared->cache; + H5C1_t *cache_ptr = f->shared->cache1; herr_t result; herr_t ret_value = SUCCEED; /* Return value */ #if H5AC1__TRACE_FILE_ENABLED @@ -2026,8 +2026,8 @@ H5AC1_resize_pinned_entry(H5F_t * f, */ if ( ( f != NULL ) && ( f->shared != NULL ) && - ( f->shared->cache != NULL ) && - ( H5C1_get_trace_file_ptr(f->shared->cache, &trace_file_ptr) >= 0 ) && + ( f->shared->cache1 != NULL ) && + ( H5C1_get_trace_file_ptr(f->shared->cache1, &trace_file_ptr) >= 0 ) && ( trace_file_ptr != NULL ) ) { sprintf(trace, "H5AC1_resize_pinned_entry 0x%lx %d", @@ -2120,7 +2120,7 @@ herr_t H5AC1_unpin_entry(H5F_t * f, void * thing) { - H5C1_t *cache_ptr = f->shared->cache; + H5C1_t *cache_ptr = f->shared->cache1; herr_t result; herr_t ret_value = SUCCEED; /* Return value */ #if H5AC1__TRACE_FILE_ENABLED @@ -2136,8 +2136,8 @@ H5AC1_unpin_entry(H5F_t * f, */ if ( ( f != NULL ) && ( f->shared != NULL ) && - ( f->shared->cache != NULL ) && - ( H5C1_get_trace_file_ptr(f->shared->cache, &trace_file_ptr) >= 0 ) && + ( f->shared->cache1 != NULL ) && + ( H5C1_get_trace_file_ptr(f->shared->cache1, &trace_file_ptr) >= 0 ) && ( trace_file_ptr != NULL ) ) { sprintf(trace, "H5AC1_unpin_entry %lx", @@ -2277,7 +2277,7 @@ H5AC1_unprotect(H5F_t *f, hid_t dxpl_id, const H5AC1_class_t *type, haddr_t addr FUNC_ENTER_NOAPI(H5AC1_unprotect, FAIL) HDassert(f); - HDassert(f->shared->cache); + HDassert(f->shared->cache1); HDassert(type); HDassert(type->clear); HDassert(type->flush); @@ -2293,8 +2293,8 @@ H5AC1_unprotect(H5F_t *f, hid_t dxpl_id, const H5AC1_class_t *type, haddr_t addr */ if ( ( f != NULL ) && ( f->shared != NULL ) && - ( f->shared->cache != NULL ) && - ( H5C1_get_trace_file_ptr(f->shared->cache, &trace_file_ptr) >= 0 ) && + ( f->shared->cache1 != NULL ) && + ( H5C1_get_trace_file_ptr(f->shared->cache1, &trace_file_ptr) >= 0 ) && ( trace_file_ptr != NULL ) ) { sprintf(trace, "H5AC1_unprotect %lx %d", @@ -2329,9 +2329,9 @@ H5AC1_unprotect(H5F_t *f, hid_t dxpl_id, const H5AC1_class_t *type, haddr_t addr #ifdef H5_HAVE_PARALLEL if ( ( dirtied ) && ( ((H5AC1_info_t *)thing)->is_dirty == FALSE ) && - ( NULL != (aux_ptr = f->shared->cache->aux_ptr) ) ) { + ( NULL != (aux_ptr = f->shared->cache1->aux_ptr) ) ) { - result = H5AC1_log_dirtied_entry(f->shared->cache, + result = H5AC1_log_dirtied_entry(f->shared->cache1, (H5AC1_info_t *)thing, addr, size_changed, @@ -2345,10 +2345,10 @@ H5AC1_unprotect(H5F_t *f, hid_t dxpl_id, const H5AC1_class_t *type, haddr_t addr } if ( ( (flags & H5C1__DELETED_FLAG) != 0 ) && - ( NULL != (aux_ptr = f->shared->cache->aux_ptr) ) && + ( NULL != (aux_ptr = f->shared->cache1->aux_ptr) ) && ( aux_ptr->mpi_rank == 0 ) ) { - result = H5AC1_log_deleted_entry(f->shared->cache, + result = H5AC1_log_deleted_entry(f->shared->cache1, (H5AC1_info_t *)thing, addr, flags); @@ -2364,7 +2364,7 @@ H5AC1_unprotect(H5F_t *f, hid_t dxpl_id, const H5AC1_class_t *type, haddr_t addr result = H5C1_unprotect(f, dxpl_id, H5AC1_noblock_dxpl_id, - f->shared->cache, + f->shared->cache1, type, addr, thing, @@ -2383,7 +2383,7 @@ H5AC1_unprotect(H5F_t *f, hid_t dxpl_id, const H5AC1_class_t *type, haddr_t addr result = H5AC1_propagate_flushed_and_still_clean_entries_list(f, H5AC1_noblock_dxpl_id, - f->shared->cache, + f->shared->cache1, TRUE); if ( result < 0 ) { @@ -2490,10 +2490,10 @@ H5AC1_stats(const H5F_t *f) FUNC_ENTER_NOAPI(H5AC1_stats, FAIL) HDassert(f); - HDassert(f->shared->cache); + HDassert(f->shared->cache1); /* at present, this can't fail */ - (void)H5C1_stats(f->shared->cache, f->name, FALSE); + (void)H5C1_stats(f->shared->cache1, f->name, FALSE); done: FUNC_LEAVE_NOAPI(ret_value) @@ -3573,9 +3573,9 @@ H5AC1_check_if_write_permitted(const H5F_t UNUSED * f, #ifdef H5_HAVE_PARALLEL HDassert( f != NULL ); HDassert( f->shared != NULL ); - HDassert( f->shared->cache != NULL ); + HDassert( f->shared->cache1 != NULL ); - aux_ptr = (H5AC1_aux_t *)(f->shared->cache->aux_ptr); + aux_ptr = (H5AC1_aux_t *)(f->shared->cache1->aux_ptr); if ( aux_ptr != NULL ) { diff --git a/src/H5AC2.c b/src/H5AC2.c deleted file mode 100644 index 9a3947e..0000000 --- a/src/H5AC2.c +++ /dev/null @@ -1,5685 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * Copyright by the Board of Trustees of the University of Illinois. * - * All rights reserved. * - * * - * This file is part of HDF5. The full HDF5 copyright notice, including * - * terms governing use, modification, and redistribution, is contained in * - * the files COPYING and Copyright.html. COPYING can be found at the root * - * of the source code distribution tree; Copyright.html can be found at the * - * root level of an installed copy of the electronic HDF5 document set and * - * is linked from the top-level documents page. It can also be found at * - * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * - * access to either file, you may request a copy from help@hdfgroup.org. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/*------------------------------------------------------------------------- - * - * Created: H5AC2.c - * Jul 9 1997 - * Robb Matzke - * - * Purpose: Functions in this file implement a cache for - * things which exist on disk. All "things" associated - * with a particular HDF file share the same cache; each - * HDF file has it's own cache. - * - * Modifications: - * - * Robb Matzke, 4 Aug 1997 - * Added calls to H5E. - * - * Quincey Koziol, 22 Apr 2000 - * Turned on "H5AC2_SORT_BY_ADDR" - * - * John Mainzer, 5/19/04 - * Complete redesign and rewrite. See the header comments for - * H5AC2_t for an overview of what is going on. - * - * John Mainzer, 6/4/04 - * Factored the new cache code into a separate file (H5C.c) to - * facilitate re-use. Re-worked this file again to use H5C. - * - * John Mainzer, 10/18/07 - * Copied H5AC2.c to H5AC22.c and reworked to use H5C2 instead of H5C. - * All this is in support of cache API modifications needed for - * journaling. - * - *------------------------------------------------------------------------- - */ - -#include - -#define H5AC2_PACKAGE /*suppress error about including H5AC2pkg */ -#define H5C2_PACKAGE /*suppress error about including H5C2pkg */ -#define H5F_PACKAGE /*suppress error about including H5Fpkg */ - -/* Interface initialization */ -#define H5_INTERFACE_INIT_FUNC H5AC2_init_interface - -#ifdef H5_HAVE_PARALLEL -#include -#endif /* H5_HAVE_PARALLEL */ - -#include "H5private.h" /* Generic Functions */ -#include "H5AC2pkg.h" /* Metadata cache */ -#include "H5C2pkg.h" /* Cache */ -#include "H5Dprivate.h" /* Dataset functions */ -#include "H5Eprivate.h" /* Error handling */ -#include "H5Fpkg.h" /* Files */ -#include "H5FDprivate.h" /* File drivers */ -#include "H5FLprivate.h" /* Free Lists */ -#include "H5Iprivate.h" /* IDs */ -#include "H5MMprivate.h" /* Memory management */ -#include "H5Pprivate.h" /* Property lists */ - - -#ifdef H5_HAVE_PARALLEL - -/* Declare a free list to manage the H5AC2_aux_t struct */ -H5FL_DEFINE_STATIC(H5AC2_aux_t); - -#endif /* H5_HAVE_PARALLEL */ - -/**************************************************************************** - * - * structure H5AC2_slist_entry_t - * - * The dirty entry list maintained via the d_slist_ptr field of H5AC2_aux_t - * and the cleaned entry list maintained via the c_slist_ptr field of - * H5AC2_aux_t are just lists of the file offsets of the dirty/cleaned - * entries. Unfortunately, the slist code makes us define a dynamically - * allocated structure to store these offsets in. This structure serves - * that purpose. Its fields are as follows: - * - * magic: Unsigned 32 bit integer always set to - * H5AC2__H5AC2_SLIST_ENTRY_T_MAGIC. This field is used to - * validate pointers to instances of H5AC2_slist_entry_t. - * - * addr: file offset of a metadata entry. Entries are added to this - * list (if they aren't there already) when they are marked - * dirty in an unprotect, inserted, or renamed. They are - * removed when they appear in a clean entries broadcast. - * - ****************************************************************************/ - -#ifdef H5_HAVE_PARALLEL - -#define H5AC2__H5AC2_SLIST_ENTRY_T_MAGIC 0x00D0A02 - -typedef struct H5AC2_slist_entry_t -{ - uint32_t magic; - - haddr_t addr; -} H5AC2_slist_entry_t; - -/* Declare a free list to manage the H5AC2_slist_entry_t struct */ -H5FL_DEFINE_STATIC(H5AC2_slist_entry_t); - -#endif /* H5_HAVE_PARALLEL */ - - -/* - * Private file-scope variables. - */ - -/* Default dataset transfer property list for metadata I/O calls */ -/* (Collective set, "block before metadata write" set and "library internal" set) */ -/* (Global variable definition, declaration is in H5AC2private.h also) */ -hid_t H5AC2_dxpl_id=(-1); - -/* Private dataset transfer property list for metadata I/O calls */ -/* (Collective set and "library internal" set) */ -/* (Static variable definition) */ -static hid_t H5AC2_noblock_dxpl_id=(-1); - -/* Dataset transfer property list for independent metadata I/O calls */ -/* (just "library internal" set - i.e. independent transfer mode) */ -/* (Global variable definition, declaration is in H5AC2private.h also) */ -hid_t H5AC2_ind_dxpl_id=(-1); - - -/* - * Private file-scope function declarations: - */ - -static herr_t H5AC2_check_if_write_permitted(const H5F_t *f, - hid_t dxpl_id, - hbool_t * write_permitted_ptr); - -#ifdef H5_HAVE_PARALLEL -static herr_t H5AC2_broadcast_clean_list(H5AC2_t * cache_ptr); -#endif /* JRM */ - -static herr_t H5AC2_ext_config_2_int_config( - H5AC2_cache_config_t * ext_conf_ptr, - H5C2_auto_size_ctl_t * int_conf_ptr); - -#ifdef H5_HAVE_PARALLEL -static herr_t H5AC2_log_deleted_entry(H5AC2_t * cache_ptr, - H5AC2_info_t * entry_ptr, - haddr_t addr, - unsigned int flags); - -static herr_t H5AC2_log_dirtied_entry(const H5AC2_info_t * entry_ptr, - haddr_t addr, - hbool_t size_changed, - size_t new_size); - -static herr_t H5AC2_log_flushed_entry(H5C2_t * cache_ptr, - haddr_t addr, - hbool_t was_dirty, - unsigned flags, - int type_id); - -#if 0 /* this is useful debugging code -- JRM */ -static herr_t H5AC2_log_flushed_entry_dummy(H5C2_t * cache_ptr, - haddr_t addr, - hbool_t was_dirty, - unsigned flags, - int type_id); -#endif /* JRM */ - -static herr_t H5AC2_log_inserted_entry(H5F_t * f, - H5AC2_t * cache_ptr, - H5AC2_info_t * entry_ptr, - const H5AC2_class_t * type, - haddr_t addr, - size_t size); - -static herr_t H5AC2_propagate_flushed_and_still_clean_entries_list(H5F_t * f, - hid_t dxpl_id, - H5AC2_t * cache_ptr, - hbool_t do_barrier); - -static herr_t H5AC2_receive_and_apply_clean_list(H5F_t * f, - hid_t dxpl_id, - H5AC2_t * cache_ptr); - -static herr_t H5AC2_log_renamed_entry(H5F_t * f, - haddr_t old_addr, - haddr_t new_addr); -#endif /* H5_HAVE_PARALLEL */ - -static herr_t H5AC2_set_cache_config(H5AC2_t * cache_ptr, - H5AC2_cache_config_t *config_ptr); - - -/*------------------------------------------------------------------------- - * Function: H5AC2_init - * - * Purpose: Initialize the interface from some other layer. - * - * Return: Success: non-negative - * - * Failure: negative - * - * Programmer: Quincey Koziol - * Saturday, January 18, 2003 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -herr_t -H5AC2_init(void) -{ - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5AC2_init, FAIL) - /* FUNC_ENTER() does all the work */ - -done: - FUNC_LEAVE_NOAPI(ret_value) -} - - -/*------------------------------------------------------------------------- - * Function: H5AC2_init_interface - * - * Purpose: Initialize interface-specific information - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: Quincey Koziol - * Thursday, July 18, 2002 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -static herr_t -H5AC2_init_interface(void) -{ -#ifdef H5_HAVE_PARALLEL - H5P_genclass_t *xfer_pclass; /* Dataset transfer property list class object */ - H5P_genplist_t *xfer_plist; /* Dataset transfer property list object */ - unsigned block_before_meta_write; /* "block before meta write" property value */ - unsigned library_internal=1; /* "library internal" property value */ - H5FD_mpio_xfer_t xfer_mode; /* I/O transfer mode property value */ - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI_NOINIT(H5AC2_init_interface) - - /* Sanity check */ - HDassert(H5P_CLS_DATASET_XFER_g!=(-1)); - - /* Get the dataset transfer property list class object */ - if (NULL == (xfer_pclass = H5I_object(H5P_CLS_DATASET_XFER_g))) - HGOTO_ERROR(H5E_CACHE, H5E_BADATOM, FAIL, "can't get property list class") - - /* Get an ID for the blocking, collective H5AC2 dxpl */ - if ((H5AC2_dxpl_id=H5P_create_id(xfer_pclass)) < 0) - HGOTO_ERROR(H5E_CACHE, H5E_CANTCREATE, FAIL, "unable to register property list") - - /* Get the property list object */ - if (NULL == (xfer_plist = H5I_object(H5AC2_dxpl_id))) - HGOTO_ERROR(H5E_CACHE, H5E_BADATOM, FAIL, "can't get new property list object") - - /* Insert 'block before metadata write' property */ - block_before_meta_write=1; - if(H5P_insert(xfer_plist,H5AC2_BLOCK_BEFORE_META_WRITE_NAME,H5AC2_BLOCK_BEFORE_META_WRITE_SIZE,&block_before_meta_write,NULL,NULL,NULL,NULL,NULL,NULL)<0) - HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't insert metadata cache dxpl property") - - /* Insert 'library internal' property */ - if(H5P_insert(xfer_plist,H5AC2_LIBRARY_INTERNAL_NAME,H5AC2_LIBRARY_INTERNAL_SIZE,&library_internal,NULL,NULL,NULL,NULL,NULL,NULL)<0) - HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't insert metadata cache dxpl property") - - /* Set the transfer mode */ - xfer_mode=H5FD_MPIO_COLLECTIVE; - if (H5P_set(xfer_plist,H5D_XFER_IO_XFER_MODE_NAME,&xfer_mode)<0) - HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set value") - - /* Get an ID for the non-blocking, collective H5AC2 dxpl */ - if ((H5AC2_noblock_dxpl_id=H5P_create_id(xfer_pclass)) < 0) - HGOTO_ERROR(H5E_CACHE, H5E_CANTCREATE, FAIL, "unable to register property list") - - /* Get the property list object */ - if (NULL == (xfer_plist = H5I_object(H5AC2_noblock_dxpl_id))) - HGOTO_ERROR(H5E_CACHE, H5E_BADATOM, FAIL, "can't get new property list object") - - /* Insert 'block before metadata write' property */ - block_before_meta_write=0; - if(H5P_insert(xfer_plist,H5AC2_BLOCK_BEFORE_META_WRITE_NAME,H5AC2_BLOCK_BEFORE_META_WRITE_SIZE,&block_before_meta_write,NULL,NULL,NULL,NULL,NULL,NULL)<0) - HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't insert metadata cache dxpl property") - - /* Insert 'library internal' property */ - if(H5P_insert(xfer_plist,H5AC2_LIBRARY_INTERNAL_NAME,H5AC2_LIBRARY_INTERNAL_SIZE,&library_internal,NULL,NULL,NULL,NULL,NULL,NULL)<0) - HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't insert metadata cache dxpl property") - - /* Set the transfer mode */ - xfer_mode=H5FD_MPIO_COLLECTIVE; - if (H5P_set(xfer_plist,H5D_XFER_IO_XFER_MODE_NAME,&xfer_mode)<0) - HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set value") - - /* Get an ID for the non-blocking, independent H5AC2 dxpl */ - if ((H5AC2_ind_dxpl_id=H5P_create_id(xfer_pclass)) < 0) - HGOTO_ERROR(H5E_CACHE, H5E_CANTCREATE, FAIL, "unable to register property list") - - /* Get the property list object */ - if (NULL == (xfer_plist = H5I_object(H5AC2_ind_dxpl_id))) - HGOTO_ERROR(H5E_CACHE, H5E_BADATOM, FAIL, "can't get new property list object") - - /* Insert 'block before metadata write' property */ - block_before_meta_write=0; - if(H5P_insert(xfer_plist,H5AC2_BLOCK_BEFORE_META_WRITE_NAME,H5AC2_BLOCK_BEFORE_META_WRITE_SIZE,&block_before_meta_write,NULL,NULL,NULL,NULL,NULL,NULL)<0) - HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't insert metadata cache dxpl property") - - /* Insert 'library internal' property */ - if(H5P_insert(xfer_plist,H5AC2_LIBRARY_INTERNAL_NAME,H5AC2_LIBRARY_INTERNAL_SIZE,&library_internal,NULL,NULL,NULL,NULL,NULL,NULL)<0) - HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't insert metadata cache dxpl property") - - /* Set the transfer mode */ - xfer_mode=H5FD_MPIO_INDEPENDENT; - if (H5P_set(xfer_plist,H5D_XFER_IO_XFER_MODE_NAME,&xfer_mode)<0) - HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set value") - -done: - FUNC_LEAVE_NOAPI(ret_value) - -#else /* H5_HAVE_PARALLEL */ - FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5AC2_init_interface) - - /* Sanity check */ - assert(H5P_LST_DATASET_XFER_g!=(-1)); - - H5AC2_dxpl_id=H5P_DATASET_XFER_DEFAULT; - H5AC2_noblock_dxpl_id=H5P_DATASET_XFER_DEFAULT; - H5AC2_ind_dxpl_id=H5P_DATASET_XFER_DEFAULT; - - FUNC_LEAVE_NOAPI(SUCCEED) -#endif /* H5_HAVE_PARALLEL */ -} /* end H5AC2_init_interface() */ - - -/*------------------------------------------------------------------------- - * Function: H5AC2_term_interface - * - * Purpose: Terminate this interface. - * - * Return: Success: Positive if anything was done that might - * affect other interfaces; zero otherwise. - * - * Failure: Negative. - * - * Programmer: Quincey Koziol - * Thursday, July 18, 2002 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -int -H5AC2_term_interface(void) -{ - int n=0; - - FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5AC2_term_interface) - - if (H5_interface_initialize_g) { -#ifdef H5_HAVE_PARALLEL - if(H5AC2_dxpl_id>0 || H5AC2_noblock_dxpl_id>0 || H5AC2_ind_dxpl_id>0) { - /* Indicate more work to do */ - n = 1; /* H5I */ - - /* Close H5AC2 dxpl */ - if (H5I_dec_ref(H5AC2_dxpl_id) < 0 || - H5I_dec_ref(H5AC2_noblock_dxpl_id) < 0 || - H5I_dec_ref(H5AC2_ind_dxpl_id) < 0) - H5E_clear_stack(NULL); /*ignore error*/ - else { - /* Reset static IDs */ - H5AC2_dxpl_id=(-1); - H5AC2_noblock_dxpl_id=(-1); - H5AC2_ind_dxpl_id=(-1); - - /* Reset interface initialization flag */ - H5_interface_initialize_g = 0; - } /* end else */ - } /* end if */ - else -#else /* H5_HAVE_PARALLEL */ - /* Reset static IDs */ - H5AC2_dxpl_id=(-1); - H5AC2_noblock_dxpl_id=(-1); - H5AC2_ind_dxpl_id=(-1); -#endif /* H5_HAVE_PARALLEL */ - /* Reset interface initialization flag */ - H5_interface_initialize_g = 0; - } /* end if */ - - FUNC_LEAVE_NOAPI(n) -} /* end H5AC2_term_interface() */ - - -/*------------------------------------------------------------------------- - * Function: H5AC2_create - * - * Purpose: Initialize the cache just after a file is opened. The - * SIZE_HINT is the number of cache slots desired. If you - * pass an invalid value then H5AC2_NSLOTS is used. You can - * turn off caching by using 1 for the SIZE_HINT value. - * - * Return: Success: Number of slots actually used. - * - * Failure: Negative - * - * Programmer: Robb Matzke - * matzke@llnl.gov - * Jul 9 1997 - * - * Modifications: - * - * Complete re-design and re-write to support the re-designed - * metadata cache. - * - * At present, the size_hint is ignored, and the - * max_cache_size and min_clean_size fields are hard - * coded. This should be fixed, but a parameter - * list change will be required, so I will leave it - * for now. - * - * Since no-one seems to care, the function now returns - * one on success. - * JRM - 4/28/04 - * - * Reworked the function again after abstracting its guts to - * the similar function in H5C2.c. The function is now a - * wrapper for H5C2_create(). - * JRM - 6/4/04 - * - * Deleted the old size_hint parameter and added the - * max_cache_size, and min_clean_size parameters. - * - * JRM - 3/10/05 - * - * Deleted the max_cache_size, and min_clean_size parameters, - * and added the config_ptr parameter. Added code to - * validate the resize configuration before we do anything. - * - * JRM - 3/24/05 - * - * Changed the type of config_ptr from H5AC2_auto_size_ctl_t * - * to H5AC2_cache_config_t *. Propagated associated changes - * through the function. - * JRM - 4/7/05 - * - * Added code allocating and initializing the auxilary - * structure (an instance of H5AC2_aux_t), and linking it - * to the instance of H5C2_t created by H5C2_create(). At - * present, the auxilary structure is only used in PHDF5. - * - * JRM - 6/28/05 - * - * Added code to set the prefix if required. - * - * JRM - 1/20/06 - * - * Added code to initialize the new write_done field. - * - * JRM - 5/11/06 - * - * Reworked code to conform with changes in the cache - * API. - * JRM - 10/18/07 - * - * Added the dxpl_id parameter, and updated for parameter - * list changes in H5C2_create(). - * JRM - 3/26/08 - * - * Updated code for the removal of the f, dxpl_id, and - * journal_recovered parameters for H5C2_create(). - * - * JRM 7/10/08 - * - *------------------------------------------------------------------------- - */ - -static const char * H5AC2_entry_type_names[H5AC2_NTYPES] = -{ - "B-tree nodes", - "symbol table nodes", - "local heap prefixes", - "local heap data blocks", - "global heaps", - "object headers", - "object header chunks", - "v2 B-tree headers", - "v2 B-tree internal nodes", - "v2 B-tree leaf nodes", - "fractal heap headers", - "fractal heap direct blocks", - "fractal heap indirect blocks", - "free space headers", - "free space sections", - "shared OH message master table", - "shared OH message index", - "test entry" /* for testing only -- not used for actual files */ -}; - -herr_t -H5AC2_create(H5F_t * f, - H5AC2_cache_config_t *config_ptr) -{ - herr_t ret_value = SUCCEED; /* Return value */ - herr_t result; -#ifdef H5_HAVE_PARALLEL - char prefix[H5C2__PREFIX_LEN] = ""; - MPI_Comm mpi_comm = MPI_COMM_NULL; - int mpi_rank = -1; - int mpi_size = -1; - H5AC2_aux_t * aux_ptr = NULL; -#endif /* H5_HAVE_PARALLEL */ - - FUNC_ENTER_NOAPI(H5AC2_create, FAIL) - - HDassert(f); - HDassert(NULL == f->shared->cache2); - HDassert(config_ptr != NULL); - HDcompile_assert(NELMTS(H5AC2_entry_type_names) == H5AC2_NTYPES); - HDcompile_assert(H5C2__MAX_NUM_TYPE_IDS == H5AC2_NTYPES); - - result = H5AC2_validate_config(config_ptr); - - if ( result != SUCCEED ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Bad cache configuration"); - } - -#ifdef H5_HAVE_PARALLEL - if ( IS_H5FD_MPI(f) ) { - - if ( (mpi_comm = H5F_mpi_get_comm(f)) == MPI_COMM_NULL ) { - - HGOTO_ERROR(H5E_VFL, H5E_CANTGET, FAIL, \ - "can't get MPI communicator") - } - - if ( (mpi_rank = H5F_mpi_get_rank(f)) < 0 ) { - - HGOTO_ERROR(H5E_VFL, H5E_CANTGET, FAIL, "can't get mpi rank") - } - - if ( (mpi_size = H5F_mpi_get_size(f)) < 0 ) { - - HGOTO_ERROR(H5E_VFL, H5E_CANTGET, FAIL, "can't get mpi size") - } - - /* There is no point in setting up the auxilary structure if size - * is less than or equal to 1, as there will never be any processes - * to broadcast the clean lists to. - */ - if ( mpi_size > 1 ) { - - if ( NULL == (aux_ptr = H5FL_CALLOC(H5AC2_aux_t)) ) { - - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \ - "Can't allocate H5AC2 auxilary structure.") - - } else { - - aux_ptr->magic = H5AC2__H5AC2_AUX_T_MAGIC; - aux_ptr->mpi_comm = mpi_comm; - aux_ptr->mpi_rank = mpi_rank; - aux_ptr->mpi_size = mpi_size; - aux_ptr->write_permitted = FALSE; - aux_ptr->dirty_bytes_threshold = - H5AC2__DEFAULT_DIRTY_BYTES_THRESHOLD; - aux_ptr->dirty_bytes = 0; -#if H5AC2_DEBUG_DIRTY_BYTES_CREATION - aux_ptr->dirty_bytes_propagations = 0; - aux_ptr->unprotect_dirty_bytes = 0; - aux_ptr->unprotect_dirty_bytes_updates = 0; - aux_ptr->insert_dirty_bytes = 0; - aux_ptr->insert_dirty_bytes_updates = 0; - aux_ptr->rename_dirty_bytes = 0; - aux_ptr->rename_dirty_bytes_updates = 0; -#endif /* H5AC2_DEBUG_DIRTY_BYTES_CREATION */ - aux_ptr->d_slist_ptr = NULL; - aux_ptr->d_slist_len = 0; - aux_ptr->c_slist_ptr = NULL; - aux_ptr->c_slist_len = 0; - aux_ptr->write_done = NULL; - - sprintf(prefix, "%d:", mpi_rank); - } - - if ( mpi_rank == 0 ) { - - aux_ptr->d_slist_ptr = - H5SL_create(H5SL_TYPE_HADDR,0.5,(size_t)16); - - if ( aux_ptr->d_slist_ptr == NULL ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTCREATE, FAIL, - "can't create dirtied entry list.") - } - - aux_ptr->c_slist_ptr = - H5SL_create(H5SL_TYPE_HADDR,0.5,(size_t)16); - - if ( aux_ptr->c_slist_ptr == NULL ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTCREATE, FAIL, - "can't create cleaned entry list.") - } - } - } - - if ( aux_ptr != NULL ) { - - if ( aux_ptr->mpi_rank == 0 ) { - - f->shared->cache2 = H5C2_create(H5AC2__DEFAULT_MAX_CACHE_SIZE, - H5AC2__DEFAULT_MIN_CLEAN_SIZE, - (H5AC2_NTYPES - 1), - (const char **)H5AC2_entry_type_names, - H5AC2_check_if_write_permitted, - TRUE, - H5AC2_log_flushed_entry, - (void *)aux_ptr); - - } else { - - f->shared->cache2 = H5C2_create(H5AC2__DEFAULT_MAX_CACHE_SIZE, - H5AC2__DEFAULT_MIN_CLEAN_SIZE, - (H5AC2_NTYPES - 1), - (const char **)H5AC2_entry_type_names, - NULL, - FALSE, -#if 0 /* this is useful debugging code -- keep it for a while */ /* JRM */ - H5AC2_log_flushed_entry_dummy, -#else /* JRM */ - NULL, -#endif /* JRM */ - (void *)aux_ptr); - } - - } else { - - f->shared->cache2 = H5C2_create(H5AC2__DEFAULT_MAX_CACHE_SIZE, - H5AC2__DEFAULT_MIN_CLEAN_SIZE, - (H5AC2_NTYPES - 1), - (const char **)H5AC2_entry_type_names, - H5AC2_check_if_write_permitted, - TRUE, - NULL, - NULL); - } - } else { -#endif /* H5_HAVE_PARALLEL */ - /* The default max cache size and min clean size will frequently be - * overwritten shortly by the subsequent set resize config call. - * -- JRM - */ - - f->shared->cache2 = H5C2_create(H5AC2__DEFAULT_MAX_CACHE_SIZE, - H5AC2__DEFAULT_MIN_CLEAN_SIZE, - (H5AC2_NTYPES - 1), - (const char **)H5AC2_entry_type_names, - H5AC2_check_if_write_permitted, - TRUE, - NULL, - NULL); -#ifdef H5_HAVE_PARALLEL - } -#endif /* H5_HAVE_PARALLEL */ - - if ( NULL == f->shared->cache2 ) { - - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed") - - } -#ifdef H5_HAVE_PARALLEL - else if ( aux_ptr != NULL ) { - - result = H5C2_set_prefix(f->shared->cache2, prefix); - - if ( result != SUCCEED ) { - - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \ - "H5C2_set_prefix() failed") - } - } -#endif /* H5_HAVE_PARALLEL */ - - result = H5AC2_set_cache_config(f->shared->cache2, config_ptr); - - if ( result != SUCCEED ) { - - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \ - "auto resize configuration failed") - } - -done: - -#ifdef H5_HAVE_PARALLEL - - /* if there is a failure, try to tidy up the auxilary structure */ - - if ( ret_value != SUCCEED ) { - - if ( aux_ptr != NULL ) { - - if ( aux_ptr->d_slist_ptr != NULL ) { - - H5SL_close(aux_ptr->d_slist_ptr); - } - - if ( aux_ptr->c_slist_ptr != NULL ) { - - H5SL_close(aux_ptr->c_slist_ptr); - } - - aux_ptr->magic = 0; - H5FL_FREE(H5AC2_aux_t, aux_ptr); - aux_ptr = NULL; - } - } -#endif /* H5_HAVE_PARALLEL */ - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5AC2_create() */ - - -/*------------------------------------------------------------------------- - * Function: H5AC2_dest - * - * Purpose: Flushes all data to disk and destroys the cache. - * This function fails if any object are protected since the - * resulting file might not be consistent. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: Robb Matzke - * matzke@llnl.gov - * Jul 9 1997 - * - * Modifications: - * - * Complete re-design and re-write to support the re-designed - * metadata cache. - * JRM - 5/12/04 - * - * Abstracted the guts of the function to H5C2_dest() in H5C.c, - * and then re-wrote the function as a wrapper for H5C2_dest(). - * - * JRM - 6/7/04 - * - * Added code to free the auxiliary structure and its - * associated slist if present. - * JRM - 6/28/05 - * - * Added code to close the trace file if it is present. - * - * JRM - 6/8/06 - * - * JRM - 10/18/07 - * Modified code in support of revised cache API needed - * to permit journaling. - * - *------------------------------------------------------------------------- - */ -herr_t -H5AC2_dest(H5F_t *f, hid_t dxpl_id) -{ - H5AC2_t *cache = NULL; - herr_t ret_value=SUCCEED; /* Return value */ -#ifdef H5_HAVE_PARALLEL - H5AC2_aux_t * aux_ptr = NULL; -#endif /* H5_HAVE_PARALLEL */ - - FUNC_ENTER_NOAPI(H5AC2_dest, FAIL) - - assert(f); - assert(f->shared->cache2); - cache = f->shared->cache2; -#ifdef H5_HAVE_PARALLEL - aux_ptr = cache->aux_ptr; - - if ( aux_ptr != NULL ) { - - HDassert ( aux_ptr->magic == H5AC2__H5AC2_AUX_T_MAGIC ); - } -#endif /* H5_HAVE_PARALLEL */ - -#if H5AC2__TRACE_FILE_ENABLED - if ( H5AC2_close_trace_file(cache) < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "H5AC2_close_trace_file() failed.") - } -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - if ( H5C2_dest(f, dxpl_id) < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTFREE, FAIL, "can't destroy cache") - } - - f->shared->cache2 = NULL; - -#ifdef H5_HAVE_PARALLEL - if ( aux_ptr != NULL ) { - - if ( aux_ptr->d_slist_ptr != NULL ) { - - H5SL_close(aux_ptr->d_slist_ptr); - } - - if ( aux_ptr->c_slist_ptr != NULL ) { - - H5SL_close(aux_ptr->c_slist_ptr); - } - - aux_ptr->magic = 0; - H5FL_FREE(H5AC2_aux_t, aux_ptr); - aux_ptr = NULL; - } -#endif /* H5_HAVE_PARALLEL */ - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5AC2_dest() */ - - -/*------------------------------------------------------------------------- - * Function: H5AC2_begin_transaction() - * - * Purpose: Mark the beginning of a transaction. - * - * This function is just a wrapper for H5C2_begin_transaction(). - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: John Mainzer - * 4/12/08 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -herr_t -H5AC2_begin_transaction(hid_t id, - hbool_t * do_transaction_ptr, - H5O_loc_t * id_oloc_ptr, - hbool_t * id_oloc_open_ptr, - hbool_t * transaction_begun_ptr, - uint64_t * trans_num_ptr, - const char * api_call_name) -{ - herr_t result; - H5G_loc_t id_loc; - H5F_t * f = NULL; - H5AC2_t * cache_ptr = NULL; - herr_t ret_value = SUCCEED; /* Return value */ -#if H5AC2__TRACE_FILE_ENABLED - char trace[256] = ""; - FILE * trace_file_ptr = NULL; -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - FUNC_ENTER_NOAPI(H5AC2_begin_transaction, FAIL) - - HDassert( do_transaction_ptr != NULL ); - HDassert( id_oloc_ptr != NULL ); - HDassert( id_oloc_open_ptr != NULL ); - HDassert( transaction_begun_ptr != NULL ); - HDassert( trans_num_ptr != NULL ); - HDassert( api_call_name != NULL ); - -#if H5AC2__TRACE_FILE_ENABLED - /* For the begin transaction call, only the transaction number and the - * api call name. Write the return value to catch occult errors. - */ - if ( ( cache_ptr != NULL ) && - ( H5C2_get_trace_file_ptr(cache_ptr, &trace_file_ptr) >= 0 ) && - ( trace_file_ptr != NULL ) ) { - - sprintf(trace, "H5AC2_begin_transaction %s", api_call_name); - } -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - *id_oloc_open_ptr = FALSE; - *transaction_begun_ptr = FALSE; - - switch ( H5I_get_type(id) ) - { - case H5I_DATASPACE: - case H5I_ERROR_CLASS: - case H5I_ERROR_MSG: - case H5I_ERROR_STACK: - case H5I_GENPROP_CLS: - case H5I_GENPROP_LST: - *do_transaction_ptr = FALSE; - break; - - case H5I_DATATYPE: - { - H5T_t *dt = H5I_object(id); - if( ( dt == NULL ) || ( ! H5T_committed(dt) ) ) { - *do_transaction_ptr = FALSE; - } - } - break; - - case H5I_BADID: - *do_transaction_ptr = FALSE; - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, \ - "H5I_get_type() reports bad id") - break; - - default: - *do_transaction_ptr = TRUE; - } - - if ( *do_transaction_ptr ) { - - if ((H5G_loc((id), &id_loc) < 0) || (id_loc.oloc == NULL)) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "H5G_loc() failed"); - } - - *id_oloc_ptr = *(id_loc.oloc); - - if ( H5O_open(id_oloc_ptr) < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, "H5O_open() failed."); - } - - *id_oloc_open_ptr = TRUE; - - f = id_oloc_ptr->file; - - if ( ( f == NULL ) || - ( f->shared == NULL ) || - ( f->shared->cache2 == NULL ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, "can't get cache_ptr."); - } - - cache_ptr = f->shared->cache2; - - result = H5C2_begin_transaction(cache_ptr, trans_num_ptr, api_call_name); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_begin_transaction() failed.") - } - - *transaction_begun_ptr = TRUE; - } - -done: - -#if H5AC2__TRACE_FILE_ENABLED - if ( trace_file_ptr != NULL ) { - - HDfprintf(trace_file_ptr, "%s %llu %d\n", trace, - *trans_num_ptr, (int)ret_value); - } -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5AC2_begin_transaction() */ - - -/*------------------------------------------------------------------------- - * Function: H5AC2_check_for_journaling() - * - * Purpose: Check the newly opened file for ongoing journaling. - * Fail if it exists and the journal recovered flag is - * not set. - * - * This function is just a wrapper for - * H5C2_check_for_journaling(). - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: John Mainzer - * 7/4/08 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -herr_t -H5AC2_check_for_journaling(H5F_t * f, - hid_t dxpl_id, - H5C2_t * cache_ptr, - hbool_t journal_recovered) -{ - herr_t result; - herr_t ret_value = SUCCEED; /* Return value */ -#if H5AC2__TRACE_FILE_ENABLED - char trace[256] = ""; - FILE * trace_file_ptr = NULL; -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - FUNC_ENTER_NOAPI(H5AC2_check_for_journaling, FAIL) - - HDassert( f ); - HDassert( cache_ptr ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - -#if H5AC2__TRACE_FILE_ENABLED - /* For the end transaction call, only the journal_recovered - * parameter is really needed. Write the return value to catch - * occult errors. - */ - if ( ( cache_ptr != NULL ) && - ( H5C2_get_trace_file_ptr(cache_ptr, &trace_file_ptr) >= 0 ) && - ( trace_file_ptr != NULL ) ) { - - sprintf(trace, "H5AC2_check_for_journaling %d ", - (int)journal_recovered); - } -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - /* test to see if there is a metadata journal that must be recovered - * before we can access the file. Do this at the end of file open, - * as the data we need for the check is not available at cache creation - * time. - */ - - result = H5C2_check_for_journaling(f, dxpl_id, cache_ptr, - journal_recovered); - - if ( result != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTCREATE, FAIL, \ - "H5C2_check_for_journaling() reports failure.") - } - -done: - -#if H5AC2__TRACE_FILE_ENABLED - if ( trace_file_ptr != NULL ) { - - HDfprintf(trace_file_ptr, "%s %d\n", trace, (int)ret_value); - } -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5AC2_check_for_journaling() */ - - -/*------------------------------------------------------------------------- - * Function: H5AC2_deregister_mdjsc_callback() - * - * Purpose: Deregister a metadata journaling status change callback. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: John Mainzer - * 8/15/08 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -herr_t -H5AC2_deregister_mdjsc_callback(H5F_t * file_ptr, - int32_t idx) -{ - herr_t result; - herr_t ret_value = SUCCEED; /* Return value */ - H5C2_t * cache_ptr = NULL; -#if H5AC2__TRACE_FILE_ENABLED - char trace[256] = ""; - FILE * trace_file_ptr = NULL; -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - FUNC_ENTER_NOAPI(H5AC2_deregister_mdjsc_callback, FAIL) - - if ( ( file_ptr == NULL ) || - ( ( cache_ptr = file_ptr->shared->cache2 ) == NULL ) ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ - "Invalid parameter(s) on entry."); - } - -#if H5AC2__TRACE_FILE_ENABLED - /* For the deregister metadata journaling status change callback - * call, only the idx is really needed. Write the return value to - * catch occult errors. - */ - if ( ( cache_ptr != NULL ) - && - ( H5C2_get_trace_file_ptr((H5C2_t *)cache_ptr, &trace_file_ptr) >= 0 ) - && - ( trace_file_ptr != NULL ) ) { - - sprintf(trace, "H5AC2_deregister_mdjsc_callback %d ", idx); - } -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - result = H5C2_deregister_mdjsc_callback(cache_ptr, idx); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_deregister_mdjsc_callback() failed."); - } - -done: - -#if H5AC2__TRACE_FILE_ENABLED - if ( trace_file_ptr != NULL ) { - - HDfprintf(trace_file_ptr, "%s %d\n", trace, (int)ret_value); - } -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5AC2_deregister_mdjsc_callback() */ - - -/*------------------------------------------------------------------------- - * Function: H5AC2_end_transaction() - * - * Purpose: Mark the end of a transaction. - * - * This function is just a wrapper for H5C2_end_transaction(). - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: John Mainzer - * 4/12/08 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -herr_t -H5AC2_end_transaction(hbool_t do_transaction, - H5O_loc_t * id_oloc_ptr, - hbool_t id_oloc_open, - hbool_t transaction_begun, - hid_t dxpl_id, - uint64_t trans_num, - const char * api_call_name) -{ - herr_t result; - herr_t ret_value=SUCCEED; /* Return value */ - H5F_t * f = NULL; - H5AC2_t * cache_ptr = NULL; -#if H5AC2__TRACE_FILE_ENABLED - char trace[256] = ""; - FILE * trace_file_ptr = NULL; -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - FUNC_ENTER_NOAPI(H5AC2_end_transaction, FAIL) - - HDassert( id_oloc_ptr != NULL ); - HDassert( api_call_name != NULL ); - -#if H5AC2__TRACE_FILE_ENABLED - /* For the end transaction call, only the transaction number and the - * api call name are really needed. Write the return value to catch - * occult errors. - */ - if ( ( cache_ptr != NULL ) && - ( H5C2_get_trace_file_ptr(cache_ptr, &trace_file_ptr) >= 0 ) && - ( trace_file_ptr != NULL ) ) { - - sprintf(trace, "H5AC2_end_transaction %s %llu", - api_call_name, trans_num); - } -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - if ( do_transaction ) { - - if ( transaction_begun ) { - - f = id_oloc_ptr->file; - - if ( ( f == NULL ) || - ( f->shared == NULL ) || - ( f->shared->cache2 == NULL ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "can't get cache_ptr."); - } - - cache_ptr = f->shared->cache2; - - result = H5C2_end_transaction(f, dxpl_id, cache_ptr, - trans_num, api_call_name); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_end_transaction() failed.") - } - } - - if ( id_oloc_open ) { - - result = H5O_close(id_oloc_ptr); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5O_close() failed."); - } - } - } - -done: - -#if H5AC2__TRACE_FILE_ENABLED - if ( trace_file_ptr != NULL ) { - - HDfprintf(trace_file_ptr, "%s %d\n", trace, (int)ret_value); - } -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5AC2_end_transaction() */ - - -/*------------------------------------------------------------------------- - * Function: H5AC2_register_mdjsc_callback() - * - * Purpose: Register a metadata journaling status change callback, - * and return the index assigned to the callback in *idx_ptr. - * - * If config_ptr is not NULL, return the current metadata - * journaling configuration in *config_ptr. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: John Mainzer - * 8/15/08 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -herr_t -H5AC2_register_mdjsc_callback(const H5F_t * file_ptr, - H5C2_mdj_status_change_func_t fcn_ptr, - void * data_ptr, - int32_t * idx_ptr, - H5C2_mdj_config_t * config_ptr) -{ - herr_t result; - herr_t ret_value=SUCCEED; /* Return value */ - H5C2_t * cache_ptr; -#if H5AC2__TRACE_FILE_ENABLED - char trace[256] = ""; - FILE * trace_file_ptr = NULL; -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - FUNC_ENTER_NOAPI(H5AC2_register_mdjsc_callback, FAIL) - - if ( ( file_ptr == NULL ) || - ( ( cache_ptr = file_ptr->shared->cache2 ) == NULL ) || - ( fcn_ptr == NULL ) || - ( idx_ptr == NULL ) ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ - "Invalid parameter(s) on entry."); - } - -#if H5AC2__TRACE_FILE_ENABLED - /* For the register metadata journaling status change callback - * call, fnc_ptr, data_ptr, and the returned idx are all that - * are needed. Write the return value to catch occult errors. - */ - if ( ( cache_ptr != NULL ) && - ( H5C2_get_trace_file_ptr(cache_ptr, &trace_file_ptr) >= 0 ) && - ( trace_file_ptr != NULL ) ) { - - sprintf(trace, "H5AC2_register_mdjsc_callback 0x%lx 0x%lx ", - (unsigned long)(fcn_ptr), (unsigned long)(data_ptr)); - } -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - result = H5C2_register_mdjsc_callback(cache_ptr, - fcn_ptr, - data_ptr, - idx_ptr); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_register_mdjsc_callback() failed."); - } - - if ( config_ptr != NULL ) { - - result = H5C2_get_journal_config((H5C2_t *)cache_ptr, config_ptr); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_get_journal_config() failed."); - } - } - -done: - -#if H5AC2__TRACE_FILE_ENABLED - if ( trace_file_ptr != NULL ) { - - HDfprintf(trace_file_ptr, "%s %d %d\n", - trace, *idx_ptr, (int)ret_value); - } -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5AC2_register_mdjsc_callback() */ - - -/*------------------------------------------------------------------------- - * Function: H5AC2_expunge_entry - * - * Purpose: Expunge the target entry from the cache without writing it - * to disk even if it is dirty. The entry must not be either - * pinned or protected. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: John Mainzer - * 6/30/06 - * - * Modifications: - * - * JRM - 10/18/07 - * Modified code in support of revised cache API needed - * to permit journaling. - * - *------------------------------------------------------------------------- - */ -herr_t -H5AC2_expunge_entry(H5F_t *f, - hid_t dxpl_id, - const H5AC2_class_t *type, - haddr_t addr) -{ - herr_t result; - herr_t ret_value=SUCCEED; /* Return value */ - H5AC2_t * cache_ptr = NULL; -#if H5AC2__TRACE_FILE_ENABLED - char trace[128] = ""; - FILE * trace_file_ptr = NULL; -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - FUNC_ENTER_NOAPI(H5AC2_expunge_entry, FAIL) - - HDassert(f); - HDassert(f->shared); - HDassert(f->shared->cache2); - HDassert(type); - HDassert(H5F_addr_defined(addr)); - - cache_ptr = f->shared->cache2; - -#if H5AC2__TRACE_FILE_ENABLED - /* For the expunge entry call, only the addr, and type id are really - * necessary in the trace file. Write the return value to catch occult - * errors. - */ - if ( ( cache_ptr != NULL ) && - ( H5C2_get_trace_file_ptr(cache_ptr, &trace_file_ptr) >= 0 ) && - ( trace_file_ptr != NULL ) ) { - - sprintf(trace, "H5AC2_expunge_entry 0x%lx %d", - (unsigned long)addr, - (int)(type->id)); - } -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - result = H5C2_expunge_entry(f, - dxpl_id, - type, - addr); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTEXPUNGE, FAIL, \ - "H5C2_expunge_entry() failed.") - } - -done: - -#if H5AC2__TRACE_FILE_ENABLED - if ( trace_file_ptr != NULL ) { - - HDfprintf(trace_file_ptr, "%s %d\n", trace, (int)ret_value); - } -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5AC2_expunge_entry() */ - - -/*------------------------------------------------------------------------- - * Function: H5AC2_flush - * - * Purpose: Flush (and possibly destroy) the metadata cache associated - * with the specified file. - * - * This is a re-write of an earlier version of the function - * which was reputedly capable of flushing (and destroying - * if requested) individual entries, individual entries if - * they match the supplied type, all entries of a given type, - * as well as all entries in the cache. - * - * As only this last capability is actually used at present, - * I have not implemented the other capabilities in this - * version of the function. - * - * The type and addr parameters are retained to avoid source - * code changed, but values other than NULL and HADDR_UNDEF - * respectively are errors. If all goes well, they should - * be removed, and the function renamed to something more - * descriptive -- perhaps H5AC2_flush_cache. - * - * If the cache contains protected entries, the function will - * fail, as protected entries cannot be flushed. However - * all unprotected entries should be flushed before the - * function returns failure. - * - * For historical purposes, the original version of the - * purpose section is reproduced below: - * - * ============ Original Version of "Purpose:" ============ - * - * Flushes (and destroys if DESTROY is non-zero) the specified - * entry from the cache. If the entry TYPE is CACHE_FREE and - * ADDR is HADDR_UNDEF then all types of entries are - * flushed. If TYPE is CACHE_FREE and ADDR is defined then - * whatever is cached at ADDR is flushed. Otherwise the thing - * at ADDR is flushed if it is the correct type. - * - * If there are protected objects they will not be flushed. - * However, an attempt will be made to flush all non-protected - * items before this function returns failure. - * - * Return: Non-negative on success/Negative on failure if there was a - * request to flush all items and something was protected. - * - * Programmer: Robb Matzke - * matzke@llnl.gov - * Jul 9 1997 - * - * Modifications: - * Robb Matzke, 1999-07-27 - * The ADDR argument is passed by value. - * - * Complete re-write. See above for details. -- JRM 5/11/04 - * - * Abstracted the guts of the function to H5C2_flush_cache() - * in H5C.c, and then re-wrote the function as a wrapper for - * H5C2_flush_cache(). - * - * JRM - 6/7/04 - * - * JRM - 7/5/05 - * Modified function as part of a fix for a cache coherency - * bug in PHDF5. See the header comments on the H5AC2_aux_t - * structure for details. - * - * JRM -- 5/11/06 - * Added call to the write_done callback. - * - * JRM -- 6/6/06 - * Added trace file support. - * - * JRM - 10/18/07 - * Modified code in support of revised cache API needed - * to permit journaling. - * - *------------------------------------------------------------------------- - */ -herr_t -H5AC2_flush(H5F_t *f, hid_t dxpl_id, unsigned flags) -{ - herr_t status; - herr_t ret_value = SUCCEED; /* Return value */ -#ifdef H5_HAVE_PARALLEL - H5AC2_aux_t * aux_ptr = NULL; - int mpi_code; -#endif /* H5_HAVE_PARALLEL */ -#if H5AC2__TRACE_FILE_ENABLED - char trace[128] = ""; - FILE * trace_file_ptr = NULL; -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - - FUNC_ENTER_NOAPI(H5AC2_flush, FAIL) - - HDassert(f); - HDassert(f->shared); - HDassert(f->shared->cache2); - -#if H5AC2__TRACE_FILE_ENABLED - /* For the flush, only the flags are really necessary in the trace file. - * Write the result to catch occult errors. - */ - if ( ( f != NULL ) && - ( f->shared != NULL ) && - ( f->shared->cache2 != NULL ) && - ( H5C2_get_trace_file_ptr(f->shared->cache2, &trace_file_ptr) >= 0) && - ( trace_file_ptr != NULL ) ) { - - sprintf(trace, "H5AC2_flush 0x%x", flags); - } -#endif /* H5AC2__TRACE_FILE_ENABLED */ - -#ifdef H5_HAVE_PARALLEL - aux_ptr = f->shared->cache2->aux_ptr; - - if ( aux_ptr != NULL ) { - -#if H5AC2_DEBUG_DIRTY_BYTES_CREATION - HDfprintf(stdout, - "%d::H5AC2_flush: (u/uu/i/iu/r/ru) = %d/%d/%d/%d/%d/%d\n", - (int)(aux_ptr->mpi_rank), - (int)(aux_ptr->unprotect_dirty_bytes), - (int)(aux_ptr->unprotect_dirty_bytes_updates), - (int)(aux_ptr->insert_dirty_bytes), - (int)(aux_ptr->insert_dirty_bytes_updates), - (int)(aux_ptr->rename_dirty_bytes), - (int)(aux_ptr->rename_dirty_bytes_updates)); -#endif /* H5AC2_DEBUG_DIRTY_BYTES_CREATION */ - - /* to prevent "messages from the future" we must synchronize all - * processes before we start the flush. Hence the following - * barrier. - */ - if ( MPI_SUCCESS != (mpi_code = MPI_Barrier(aux_ptr->mpi_comm)) ) { - - HMPI_GOTO_ERROR(FAIL, "MPI_Barrier failed", mpi_code) - } - - /* if the clear only flag is set, this flush will not involve any - * disk I/O. In such cases, it is not necessary to let process 0 - * flush first. - */ - if ( ( aux_ptr->mpi_rank == 0 ) && - ( (flags & H5AC2__FLUSH_CLEAR_ONLY_FLAG) == 0 ) ) { - - unsigned init_flush_flags = H5AC2__NO_FLAGS_SET; - - if ( ( (flags & H5AC2__FLUSH_MARKED_ENTRIES_FLAG) != 0 ) && - ( (flags & H5AC2__FLUSH_INVALIDATE_FLAG) == 0 ) ) { - - init_flush_flags |= H5AC2__FLUSH_MARKED_ENTRIES_FLAG; - } - - aux_ptr->write_permitted = TRUE; - - status = H5C2_flush_cache(f, - dxpl_id, - init_flush_flags); - - aux_ptr->write_permitted = FALSE; - - if ( status < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't flush.") - } - - if ( aux_ptr->write_done != NULL ) { - - (aux_ptr->write_done)(); - } - - } /* end if ( aux_ptr->mpi_rank == 0 ) */ - - status = H5AC2_propagate_flushed_and_still_clean_entries_list(f, - H5AC2_noblock_dxpl_id, - f->shared->cache2, - FALSE); - } /* end if ( aux_ptr != NULL ) */ -#endif /* H5_HAVE_PARALLEL */ - - status = H5C2_flush_cache(f, - dxpl_id, - flags); - - if ( status < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "Can't flush entry.") - } - -done: - -#if H5AC2__TRACE_FILE_ENABLED - if ( trace_file_ptr != NULL ) { - - HDfprintf(trace_file_ptr, "%s %d\n", trace, (int)ret_value); - } -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5AC2_flush() */ - - -/*------------------------------------------------------------------------- - * Function: H5AC2_get_entry_status - * - * Purpose: Given a file address, determine whether the metadata - * cache contains an entry at that location. If it does, - * also determine whether the entry is dirty, protected, - * pinned, etc. and return that information to the caller - * in *status_ptr. - * - * If the specified entry doesn't exist, set *status_ptr - * to zero. - * - * On error, the value of *status_ptr is undefined. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: John Mainzer - * 4/27/06 - * - * Modifications: - * - * JRM - 10/18/07 - * Modified code in support of revised cache API needed - * to permit journaling. - * - *------------------------------------------------------------------------- - */ - -herr_t -H5AC2_get_entry_status(H5F_t * f, - haddr_t addr, - unsigned * status_ptr) -{ - herr_t ret_value = SUCCEED; /* Return value */ - herr_t result; - hbool_t in_cache; - hbool_t is_dirty; - hbool_t is_protected; - hbool_t is_pinned; - size_t entry_size; - unsigned status = 0; - - FUNC_ENTER_NOAPI(H5AC2_get_entry_status, FAIL) - - if ( ( f == NULL ) || - ( f->shared == NULL ) || - ( f->shared->cache2 == NULL ) || - ( f->shared->cache2->magic != H5C2__H5C2_T_MAGIC ) || - ( ! H5F_addr_defined(addr) ) || - ( status_ptr == NULL ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad param(s) on entry.") - } - - result = H5C2_get_entry_status(f, addr, &entry_size, &in_cache, - &is_dirty, &is_protected, &is_pinned); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "H5C2_get_entry_status() failed.") - } - - if ( in_cache ) { - - status |= H5AC2_ES__IN_CACHE; - - if ( is_dirty ) - status |= H5AC2_ES__IS_DIRTY; - - if ( is_protected ) - status |= H5AC2_ES__IS_PROTECTED; - - if ( is_pinned ) - status |= H5AC2_ES__IS_PINNED; - } - - *status_ptr = status; - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5AC2_get_entry_status() */ - - -/*------------------------------------------------------------------------- - * Function: H5AC2_set - * - * Purpose: Adds the specified thing to the cache. The thing need not - * exist on disk yet, but it must have an address and disk - * space reserved. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: Robb Matzke - * matzke@llnl.gov - * Jul 9 1997 - * - * Modifications: - * Robb Matzke, 1999-07-27 - * The ADDR argument is passed by value. - * - * Bill Wendling, 2003-09-16 - * Added automatic "flush" if the FPHDF5 driver is being - * used. This'll write the metadata to the SAP where other, - * lesser processes can grab it. - * - * JRM - 5/13/04 - * Complete re-write for the new metadata cache. The new - * code is functionally almost identical to the old, although - * the sanity check for a protected entry is now an assert - * at the beginning of the function. - * - * JRM - 6/7/04 - * Abstracted the guts of the function to H5C2_insert_entry() - * in H5C.c, and then re-wrote the function as a wrapper for - * H5C2_insert_entry(). - * - * JRM - 1/6/05 - * Added the flags parameter. At present, this parameter is - * only used to set the new flush_marker field on the new - * entry. Since this doesn't apply to the SAP code, no change - * is needed there. Thus the only change to the body of the - * code is to pass the flags parameter through to - * H5C2_insert_entry(). - * - * JRM - 6/6/05 - * Added code to force newly inserted entries to be dirty - * in the flexible parallel case. The normal case is handled - * in H5C.c. This is part of a series of changes directed at - * moving management of the dirty flag on cache entries into - * the cache code. - * - * JRM - 7/5/05 - * Added code to track dirty byte generation, and to trigger - * clean entry list propagation when it exceeds a user - * specified threshold. Note that this code only applies in - * the PHDF5 case. It should have no effect on either the - * serial or FPHSD5 cases. - * - * JRM - 6/6/06 - * Added trace file support. - * - * JRM - 10/18/07 - * Modified code in support of revised cache API needed - * to permit journaling. - * - *------------------------------------------------------------------------- - */ - -herr_t -H5AC2_set(H5F_t *f, hid_t dxpl_id, const H5AC2_class_t *type, haddr_t addr, size_t len, void *thing, unsigned int flags) -{ - herr_t result; - H5AC2_info_t *info; - herr_t ret_value=SUCCEED; /* Return value */ -#ifdef H5_HAVE_PARALLEL - H5AC2_aux_t * aux_ptr = NULL; -#endif /* H5_HAVE_PARALLEL */ -#if H5AC2__TRACE_FILE_ENABLED - char trace[128] = ""; - size_t trace_entry_size = 0; - FILE * trace_file_ptr = NULL; -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - FUNC_ENTER_NOAPI(H5AC2_set, FAIL) - - HDassert(f); - HDassert(f->shared); - HDassert(f->shared->cache2); - HDassert(type); - HDassert(type->serialize); - HDassert(H5F_addr_defined(addr)); - HDassert(thing); - -#if H5AC2__TRACE_FILE_ENABLED - /* For the insert, only the addr, size, type id and flags are really - * necessary in the trace file. Write the result to catch occult - * errors. - * - * Note that some data is not available right now -- put what we can - * in the trace buffer now, and fill in the rest at the end. - */ - if ( ( f != NULL ) && - ( f->shared != NULL ) && - ( f->shared->cache2 != NULL ) && - ( H5C2_get_trace_file_ptr(f->shared->cache2, &trace_file_ptr) >= 0) && - ( trace_file_ptr != NULL ) ) { - - sprintf(trace, "H5AC2_set 0x%lx %ld %d 0x%x", - (unsigned long)addr, - (long)len, - type->id, - flags); - } -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - /* Get local copy of this information */ - info = (H5AC2_info_t *)thing; - - info->addr = addr; - info->type = type; - info->is_protected = FALSE; - -#ifdef H5_HAVE_PARALLEL - if ( NULL != (aux_ptr = f->shared->cache2->aux_ptr) ) { - - result = H5AC2_log_inserted_entry(f, - f->shared->cache2, - (H5AC2_info_t *)thing, - type, - addr, - len); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTINS, FAIL, \ - "H5AC2_log_inserted_entry() failed.") - } - } -#endif /* H5_HAVE_PARALLEL */ - - result = H5C2_insert_entry(f, - dxpl_id, - type, - addr, - len, - thing, - flags); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTINS, FAIL, "H5C2_insert_entry() failed") - } - -#if H5AC2__TRACE_FILE_ENABLED - if ( trace_file_ptr != NULL ) { - - /* make note of the entry size */ - trace_entry_size = ((H5C2_cache_entry_t *)thing)->size; - } -#endif /* H5AC2__TRACE_FILE_ENABLED */ - -#ifdef H5_HAVE_PARALLEL - if ( ( aux_ptr != NULL ) && - ( aux_ptr->dirty_bytes >= aux_ptr->dirty_bytes_threshold ) ) { - - result = H5AC2_propagate_flushed_and_still_clean_entries_list(f, - H5AC2_noblock_dxpl_id, - f->shared->cache2, - TRUE); - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \ - "Can't propagate clean entries list.") - } - } -#endif /* H5_HAVE_PARALLEL */ - -done: - -#if H5AC2__TRACE_FILE_ENABLED - if ( trace_file_ptr != NULL ) { - - HDfprintf(trace_file_ptr, "%s %d %d\n", trace, - (int)trace_entry_size, - (int)ret_value); - } -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5AC2_set() */ - - -/*------------------------------------------------------------------------- - * Function: H5AC2_mark_pinned_entry_dirty - * - * Purpose: Mark a pinned entry as dirty. The target entry MUST be - * be pinned, and MUST be unprotected. - * - * If the entry has changed size, the function updates - * data structures for the size change. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: John Mainzer - * 4/11/06 - * - *------------------------------------------------------------------------- - */ -herr_t -H5AC2_mark_pinned_entry_dirty(void * thing, - hbool_t size_changed, - size_t new_size) -{ -#if H5AC2__TRACE_FILE_ENABLED - char trace[128] = ""; - FILE * trace_file_ptr = NULL; -#endif /* H5AC2__TRACE_FILE_ENABLED */ - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5AC2_mark_pinned_entry_dirty, FAIL) - - /* Sanity check */ - HDassert(thing); - -#if H5AC2__TRACE_FILE_ENABLED - /* For the mark pinned entry dirty call, only the addr, size_changed, - * and new_size are really necessary in the trace file. Write the result - * to catch occult errors. - */ - if((H5C2_get_trace_file_ptr_from_entry(thing, &trace_file_ptr) >= 0) && - (NULL != trace_file_ptr)) - sprintf(trace, "%s 0x%lx %d %d", FUNC, - (unsigned long)(((H5C2_cache_entry_t *)thing)->addr), - (int)size_changed, - (int)new_size); -#endif /* H5AC2__TRACE_FILE_ENABLED */ - -#ifdef H5_HAVE_PARALLEL -{ - H5AC2_info_t *entry_ptr = (H5AC2_info_t *)thing; - H5C2_t *cache_ptr = entry_ptr->cache_ptr; - - HDassert(cache_ptr); - HDassert(cache_ptr->magic == H5C2__H5C2_T_MAGIC); - - if((!entry_ptr->is_dirty) && (NULL != cache_ptr->aux_ptr)) { - /* Check for usage errors */ - if(!entry_ptr->is_pinned) - HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKDIRTY, FAIL, "Entry isn't pinned??") - if(entry_ptr->is_protected) - HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKDIRTY, FAIL, "Entry is protected??") - - if(H5AC2_log_dirtied_entry(entry_ptr, entry_ptr->addr, size_changed, new_size) < 0) - HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKDIRTY, FAIL, "can't log dirtied entry") - } /* end if */ -} -#endif /* H5_HAVE_PARALLEL */ - - if(H5C2_mark_pinned_entry_dirty(thing, size_changed, new_size) < 0) - HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKDIRTY, FAIL, "can't mark pinned entry dirty") - -done: -#if H5AC2__TRACE_FILE_ENABLED - if(trace_file_ptr) - HDfprintf(trace_file_ptr, "%s %d\n", trace, (int)ret_value); -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - FUNC_LEAVE_NOAPI(ret_value) -} /* H5AC2_mark_pinned_entry_dirty() */ - - -/*------------------------------------------------------------------------- - * Function: H5AC2_mark_pinned_or_protected_entry_dirty - * - * Purpose: Mark a pinned or protected entry as dirty. The target - * entry MUST be either pinned, protected, or both. - * - * Unlike H5AC2_mark_pinned_entry_dirty(), this function does - * not support size changes. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: John Mainzer - * 5/16/06 - * - *------------------------------------------------------------------------- - */ -herr_t -H5AC2_mark_pinned_or_protected_entry_dirty(void *thing) -{ -#if H5AC2__TRACE_FILE_ENABLED - char trace[128] = ""; - FILE * trace_file_ptr = NULL; -#endif /* H5AC2__TRACE_FILE_ENABLED */ - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5AC2_mark_pinned_or_protected_entry_dirty, FAIL) - - /* Sanity check */ - HDassert(thing); - -#if H5AC2__TRACE_FILE_ENABLED - /* For the mark pinned or protected entry dirty call, only the addr - * is really necessary in the trace file. Write the result to catch - * occult errors. - */ - if((H5C2_get_trace_file_ptr_from_entry(thing, &trace_file_ptr) >= 0) && - (NULL != trace_file_ptr)) - sprintf(trace, "%s 0x%lx", FUNC, - (unsigned long)(((H5C2_cache_entry_t *)thing)->addr)); -#endif /* H5AC2__TRACE_FILE_ENABLED */ - -#ifdef H5_HAVE_PARALLEL -{ - H5AC2_info_t *entry_ptr = (H5AC2_info_t *)thing; - H5C2_t *cache_ptr = entry_ptr->cache_ptr; - - HDassert(cache_ptr); - HDassert(cache_ptr->magic == H5C2__H5C2_T_MAGIC); - - if((!entry_ptr->is_dirty) && (!entry_ptr->is_protected) && - (entry_ptr->is_pinned) && (NULL != cache_ptr->aux_ptr)) { - if(H5AC2_log_dirtied_entry(entry_ptr, entry_ptr->addr, FALSE, 0) < 0) - HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKDIRTY, FAIL, "can't log dirtied entry") - } /* end if */ -} -#endif /* H5_HAVE_PARALLEL */ - - if(H5C2_mark_pinned_or_protected_entry_dirty(thing) < 0) - HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKDIRTY, FAIL, "can't mark pinned or protected entry dirty") - -done: -#if H5AC2__TRACE_FILE_ENABLED - if(trace_file_ptr) - HDfprintf(trace_file_ptr, "%s %d\n", trace, (int)ret_value); -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - FUNC_LEAVE_NOAPI(ret_value) -} /* H5AC2_mark_pinned_entry_dirty() */ - - -/*------------------------------------------------------------------------- - * Function: H5AC2_rename - * - * Purpose: Use this function to notify the cache that an object's - * file address changed. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: Robb Matzke - * matzke@llnl.gov - * Jul 9 1997 - * - * Modifications: - * Robb Matzke, 1999-07-27 - * The OLD_ADDR and NEW_ADDR arguments are passed by value. - * - * JRM 5/17/04 - * Complete rewrite for the new meta-data cache. - * - * JRM - 6/7/04 - * Abstracted the guts of the function to H5C2_rename_entry() - * in H5C.c, and then re-wrote the function as a wrapper for - * H5C2_rename_entry(). - * - * JRM - 7/5/05 - * Added code to track dirty byte generation, and to trigger - * clean entry list propagation when it exceeds a user - * specified threshold. Note that this code only applies in - * the PHDF5 case. It should have no effect on either the - * serial or FPHSD5 cases. - * - * Note that this code presumes that the renamed entry will - * be present in all caches -- which it must be at present. - * To maintain this invarient, only rename entries immediately - * after you unprotect them. - * - * JRM - 6/6/06 - * Added trace file support. - * - * JRM - 10/18/07 - * Modified code in support of revised cache API needed - * to permit journaling. - * - *------------------------------------------------------------------------- - */ -herr_t -H5AC2_rename(H5F_t *f, const H5AC2_class_t *type, haddr_t old_addr, haddr_t new_addr) -{ - herr_t result; - herr_t ret_value=SUCCEED; /* Return value */ -#ifdef H5_HAVE_PARALLEL - H5AC2_aux_t * aux_ptr = NULL; -#endif /* H5_HAVE_PARALLEL */ -#if H5AC2__TRACE_FILE_ENABLED - char trace[128] = ""; - FILE * trace_file_ptr = NULL; -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - FUNC_ENTER_NOAPI(H5AC2_rename, FAIL) - - HDassert(f); - HDassert(f->shared->cache2); - HDassert(type); - HDassert(H5F_addr_defined(old_addr)); - HDassert(H5F_addr_defined(new_addr)); - HDassert(H5F_addr_ne(old_addr, new_addr)); - -#if H5AC2__TRACE_FILE_ENABLED - /* For the rename call, only the old addr and new addr are really - * necessary in the trace file. Include the type id so we don't have to - * look it up. Also write the result to catch occult errors. - */ - if ( ( f != NULL ) && - ( f->shared != NULL ) && - ( f->shared->cache2 != NULL ) && - ( H5C2_get_trace_file_ptr(f->shared->cache2, &trace_file_ptr) >= 0) && - ( trace_file_ptr != NULL ) ) { - - sprintf(trace, "H5AC2_rename 0x%lx 0x%lx %d", - (unsigned long)old_addr, - (unsigned long)new_addr, - (int)(type->id)); - } -#endif /* H5AC2__TRACE_FILE_ENABLED */ - -#ifdef H5_HAVE_PARALLEL - if ( NULL != (aux_ptr = f->shared->cache2->aux_ptr) ) { - - result = H5AC2_log_renamed_entry(f, - old_addr, - new_addr); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \ - "H5AC2_log_renamed_entry() failed.") - } - } -#endif /* H5_HAVE_PARALLEL */ - - result = H5C2_rename_entry(f->shared->cache2, - type, - old_addr, - new_addr); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTRENAME, FAIL, \ - "H5C2_rename_entry() failed.") - } - -#ifdef H5_HAVE_PARALLEL - if ( ( aux_ptr != NULL ) && - ( aux_ptr->dirty_bytes >= aux_ptr->dirty_bytes_threshold ) ) { - - result = H5AC2_propagate_flushed_and_still_clean_entries_list(f, - H5AC2_noblock_dxpl_id, - f->shared->cache2, - TRUE); - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \ - "Can't propagate clean entries list.") - } - } -#endif /* H5_HAVE_PARALLEL */ - -done: - -#if H5AC2__TRACE_FILE_ENABLED - if ( trace_file_ptr != NULL ) { - - HDfprintf(trace_file_ptr, "%s %d\n", trace, (int)ret_value); - } -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5AC2_rename() */ - - -/*------------------------------------------------------------------------- - * Function: H5AC2_pin_protected_entry() - * - * Purpose: Pin a protected cache entry. The entry must be protected - * at the time of call, and must be unpinned. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: John Mainzer - * 4/27/06 - * - *------------------------------------------------------------------------- - */ -herr_t -H5AC2_pin_protected_entry(void *thing) -{ -#if H5AC2__TRACE_FILE_ENABLED - char trace[128] = ""; - FILE * trace_file_ptr = NULL; -#endif /* H5AC2__TRACE_FILE_ENABLED */ - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5AC2_pin_protected_entry, FAIL) - -#if H5AC2__TRACE_FILE_ENABLED - /* For the pin protected entry call, only the addr is really necessary - * in the trace file. Also write the result to catch occult errors. - */ - if((H5C2_get_trace_file_ptr_from_entry(thing, &trace_file_ptr) >= 0) && - (NULL != trace_file_ptr)) - sprintf(trace, "%s 0x%lx", FUNC, - (unsigned long)(((H5C2_cache_entry_t *)thing)->addr)); -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - if(H5C2_pin_protected_entry(thing) < 0) - HGOTO_ERROR(H5E_CACHE, H5E_CANTPIN, FAIL, "can't unpin entry") - -done: -#if H5AC2__TRACE_FILE_ENABLED - if(trace_file_ptr) - HDfprintf(trace_file_ptr, "%s %d\n", trace, (int)ret_value); -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - FUNC_LEAVE_NOAPI(ret_value) -} /* H5AC2_pin_protected_entry() */ - - -/*------------------------------------------------------------------------- - * Function: H5AC2_protect - * - * Purpose: If the target entry is not in the cache, load it. If - * necessary, attempt to evict one or more entries to keep - * the cache within its maximum size. - * - * Mark the target entry as protected, and return its address - * to the caller. The caller must call H5AC2_unprotect() when - * finished with the entry. - * - * While it is protected, the entry may not be either evicted - * or flushed -- nor may it be accessed by another call to - * H5AC2_protect. Any attempt to do so will result in a failure. - * - * This comment is a re-write of the original Purpose: section. - * For historical interest, the original version is reproduced - * below: - * - * Original Purpose section: - * - * Similar to H5AC2_find() except the object is removed from - * the cache and given to the caller, preventing other parts - * of the program from modifying the protected object or - * preempting it from the cache. - * - * The caller must call H5AC2_unprotect() when finished with - * the pointer. - * - * Return: Success: Ptr to the object. - * - * Failure: NULL - * - * Programmer: Robb Matzke - * matzke@llnl.gov - * Sep 2 1997 - * - * Modifications: - * Robb Matzke, 1999-07-27 - * The ADDR argument is passed by value. - * - * Bill Wendling, 2003-09-10 - * Added parameter to indicate whether this is a READ or - * WRITE type of protect. - * - * JRM -- 5/17/04 - * Complete re-write for the new client cache. See revised - * Purpose section above. - * - * JRM - 6/7/04 - * Abstracted the guts of the function to H5C2_protect() - * in H5C2.c, and then re-wrote the function as a wrapper for - * H5C2_protect(). - * - * JRM - 6/6/06 - * Added trace file support. - * - * JRM - 3/18/07 - * Modified code to support the new flags parameter for - * H5C2_protect(). For now, that means passing in the - * H5C2_READ_ONLY_FLAG if rw == H5AC2_READ. - * - * Also updated the trace file output to save the - * rw parameter, since we are now doing something with it. - * - * JRM - 10/18/07 - * Modified code in support of revised cache API needed - * to permit journaling. - * - *------------------------------------------------------------------------- - */ -void * -H5AC2_protect(H5F_t *f, - hid_t dxpl_id, - const H5AC2_class_t *type, - haddr_t addr, - size_t len, - void *udata, - H5AC2_protect_t rw) -{ - /* char * fcn_name = "H5AC2_protect"; */ - unsigned protect_flags = H5C2__NO_FLAGS_SET; - void * thing = (void *)NULL; - void * ret_value; /* Return value */ -#if H5AC2__TRACE_FILE_ENABLED - char trace[128] = ""; - size_t trace_entry_size = 0; - FILE * trace_file_ptr = NULL; -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - FUNC_ENTER_NOAPI(H5AC2_protect, NULL) - - /* check args */ - HDassert(f); - HDassert(f->shared); - HDassert(f->shared->cache2); - HDassert(type); - HDassert(type->serialize); - HDassert(H5F_addr_defined(addr)); - - /* Check for invalid access request */ - if(0 == (f->intent & H5F_ACC_RDWR) && rw == H5AC2_WRITE) - HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, NULL, "no write intent on file") - -#if H5AC2__TRACE_FILE_ENABLED - /* For the protect call, only the addr and type id is really necessary - * in the trace file. Include the size of the entry protected as a - * sanity check. Also indicate whether the call was successful to - * catch occult errors. - */ - if ( ( f != NULL ) && - ( f->shared != NULL ) && - ( f->shared->cache2 != NULL ) && - ( H5C2_get_trace_file_ptr(f->shared->cache2, &trace_file_ptr) >= 0) && - ( trace_file_ptr != NULL ) ) { - - char * rw_string; - - if ( rw == H5AC2_WRITE ) { - - rw_string = "H5AC2_WRITE"; - - } else if ( rw == H5AC2_READ ) { - - rw_string = "H5AC2_READ"; - - } else { - - rw_string = "???"; - } - - sprintf(trace, "H5AC2_protect 0x%lx %ld %d %s", - (unsigned long)addr, - (long)len, - (int)(type->id), - rw_string); - } -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - if ( rw == H5AC2_READ ) { - - protect_flags |= H5C2__READ_ONLY_FLAG; - } - - thing = H5C2_protect(f, - dxpl_id, - type, - addr, - len, - udata, - protect_flags); - - if ( thing == NULL ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, "H5C2_protect() failed.") - } - -#if H5AC2__TRACE_FILE_ENABLED - if ( trace_file_ptr != NULL ) { - - /* make note of the entry size */ - trace_entry_size = ((H5C2_cache_entry_t *)thing)->size; - } -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - /* Set return value */ - ret_value = thing; - -done: - -#if H5AC2__TRACE_FILE_ENABLED - if ( trace_file_ptr != NULL ) { - - HDfprintf(trace_file_ptr, "%s %d %d\n", trace, - (int)trace_entry_size, - (int)(ret_value != NULL)); - } -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5AC2_protect() */ - - -/*------------------------------------------------------------------------- - * Function: H5AC2_resize_pinned_entry - * - * Purpose: Resize a pinned entry. The target entry MUST be - * be pinned, and MUST not be unprotected. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: John Mainzer - * 7/5/06 - * - *------------------------------------------------------------------------- - */ -herr_t -H5AC2_resize_pinned_entry(void *thing, size_t new_size) -{ -#if H5AC2__TRACE_FILE_ENABLED - char trace[128] = ""; - FILE * trace_file_ptr = NULL; -#endif /* H5AC2__TRACE_FILE_ENABLED */ - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5AC2_resize_pinned_entry, FAIL) - - /* Sanity check */ - HDassert(thing); - -#if H5AC2__TRACE_FILE_ENABLED - /* For the resize pinned entry call, only the addr, and new_size are - * really necessary in the trace file. Write the result to catch - * occult errors. - */ - if((H5C2_get_trace_file_ptr_from_entry(thing, &trace_file_ptr) >= 0) && - (NULL != trace_file_ptr)) - sprintf(trace, "%s 0x%lx %d", FUNC, - (unsigned long)(((H5C2_cache_entry_t *)thing)->addr), - (int)new_size); -#endif /* H5AC2__TRACE_FILE_ENABLED */ - -#ifdef H5_HAVE_PARALLEL -{ - H5AC2_info_t * entry_ptr = (H5AC2_info_t *)thing; - H5C2_t *cache_ptr = entry_ptr->cache_ptr; - - HDassert(cache_ptr); - HDassert(cache_ptr->magic == H5C2__H5C2_T_MAGIC); - - if((!entry_ptr->is_dirty) && (NULL != cache_ptr->aux_ptr)) { - /* Check for usage errors */ - if(!entry_ptr->is_pinned) - HGOTO_ERROR(H5E_CACHE, H5E_CANTRESIZE, FAIL, "Entry isn't pinned??") - if(entry_ptr->is_protected) - HGOTO_ERROR(H5E_CACHE, H5E_CANTRESIZE, FAIL, "Entry is protected??") - - if(H5AC2_log_dirtied_entry(entry_ptr, entry_ptr->addr, TRUE, new_size) < 0) - HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKDIRTY, FAIL, "can't log entry") - } /* end if */ -} -#endif /* H5_HAVE_PARALLEL */ - - if(H5C2_resize_pinned_entry(thing, new_size) < 0 ) - HGOTO_ERROR(H5E_CACHE, H5E_CANTRESIZE, FAIL, "can't resize entry") - -done: -#if H5AC2__TRACE_FILE_ENABLED - if(trace_file_ptr) - HDfprintf(trace_file_ptr, "%s %d\n", trace, (int)ret_value); -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - FUNC_LEAVE_NOAPI(ret_value) -} /* H5AC2_resize_pinned_entry() */ - - -/*------------------------------------------------------------------------- - * Function: H5AC2_unpin_entry() - * - * Purpose: Unpin a cache entry. The entry must be unprotected at - * the time of call, and must be pinned. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: John Mainzer - * 4/11/06 - * - *------------------------------------------------------------------------- - */ -herr_t -H5AC2_unpin_entry(void *thing) -{ -#if H5AC2__TRACE_FILE_ENABLED - char trace[128] = ""; - FILE * trace_file_ptr = NULL; -#endif /* H5AC2__TRACE_FILE_ENABLED */ - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5AC2_unpin_entry, FAIL) - - /* Sanity check */ - HDassert(thing); - -#if H5AC2__TRACE_FILE_ENABLED - /* For the unpin entry call, only the addr is really necessary - * in the trace file. Also write the result to catch occult errors. - */ - if((H5C2_get_trace_file_ptr_from_entry(thing, &trace_file_ptr) >= 0) && - (NULL != trace_file_ptr)) - sprintf(trace, "%s 0x%lx", FUNC, - (unsigned long)(((H5C2_cache_entry_t *)thing)->addr)); -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - if(H5C2_unpin_entry(thing) < 0) - HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPIN, FAIL, "can't unpin entry") - -done: -#if H5AC2__TRACE_FILE_ENABLED - if(trace_file_ptr) - HDfprintf(trace_file_ptr, "%s %d\n", trace, (int)ret_value); -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - FUNC_LEAVE_NOAPI(ret_value) -} /* H5AC2_unpin_entry() */ - - -/*------------------------------------------------------------------------- - * Function: H5AC2_unprotect - * - * Purpose: Undo an H5AC2_protect() call -- specifically, mark the - * entry as unprotected, remove it from the protected list, - * and give it back to the replacement policy. - * - * The TYPE and ADDR arguments must be the same as those in - * the corresponding call to H5AC2_protect() and the THING - * argument must be the value returned by that call to - * H5AC2_protect(). - * - * If the deleted flag is TRUE, simply remove the target entry - * from the cache, clear it, and free it without writing it to - * disk. - * - * This verion of the function is a complete re-write to - * use the new metadata cache. While there isn't all that - * much difference between the old and new Purpose sections, - * the original version is given below. - * - * Original purpose section: - * - * This function should be called to undo the effect of - * H5AC2_protect(). The TYPE and ADDR arguments should be the - * same as the corresponding call to H5AC2_protect() and the - * THING argument should be the value returned by H5AC2_protect(). - * If the DELETED flag is set, then this object has been deleted - * from the file and should not be returned to the cache. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: Robb Matzke - * matzke@llnl.gov - * Sep 2 1997 - * - * Modifications: - * Robb Matzke, 1999-07-27 - * The ADDR argument is passed by value. - * - * Quincey Koziol, 2003-03-19 - * Added "deleted" argument - * - * Bill Wendling, 2003-09-18 - * If this is an FPHDF5 driver and the data is dirty, - * perform a "flush" that writes the data to the SAP. - * - * John Mainzer 5/19/04 - * Complete re-write for the new metadata cache. - * - * JRM - 6/7/04 - * Abstracted the guts of the function to H5C2_unprotect() - * in H5C.c, and then re-wrote the function as a wrapper for - * H5C2_unprotect(). - * - * JRM - 1/6/05 - * Replaced the deleted parameter with the new flags parameter. - * Since the deleted parameter is not used by the FPHDF5 code, - * the only change in the body is to replace the deleted - * parameter with the flags parameter in the call to - * H5C2_unprotect(). - * - * JRM - 6/6/05 - * Added the dirtied flag and supporting code. This is - * part of a collection of changes directed at moving - * management of cache entry dirty flags into the H5C code. - * - * JRM - 7/5/05 - * Added code to track dirty byte generation, and to trigger - * clean entry list propagation when it exceeds a user - * specified threshold. Note that this code only applies in - * the PHDF5 case. It should have no effect on either the - * serial or FPHSD5 cases. - * - * JRM - 9/8/05 - * Added code to track entry size changes. This is necessary - * as it can effect dirty byte creation counts, thereby - * throwing the caches out of sync in the PHDF5 case. - * - * JRM - 5/16/06 - * Added code to use the new dirtied field in - * H5C2_cache_entry_t in the test to see if the entry has - * been dirtied. - * - * JRM - 6/7/06 - * Added support for the trace file. - * - * JRM - 10/18/07 - * Modified code in support of revised cache API needed - * to permit journaling. - * - * Note that the H5AC2__SIZE_CHANGED_FLAG must now be set if - * the size of the entry has changed. - * - *------------------------------------------------------------------------- - */ - -herr_t -H5AC2_unprotect(H5F_t *f, hid_t dxpl_id, const H5AC2_class_t *type, - haddr_t addr, size_t new_size, void *thing, unsigned flags) -{ - herr_t result; - hbool_t size_changed = FALSE; - hbool_t dirtied; -#ifdef H5_HAVE_PARALLEL - H5AC2_aux_t * aux_ptr = NULL; -#endif /* H5_HAVE_PARALLEL */ -#if H5AC2__TRACE_FILE_ENABLED - char trace[128] = ""; - unsigned trace_flags = 0; - FILE * trace_file_ptr = NULL; -#endif /* H5AC2__TRACE_FILE_ENABLED */ - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5AC2_unprotect, FAIL) - - HDassert(f); - HDassert(f->shared); - HDassert(f->shared->cache2); - HDassert(type); - HDassert(type->deserialize); - HDassert(H5F_addr_defined(addr)); - HDassert(thing); - HDassert( ((H5AC2_info_t *)thing)->addr == addr ); - HDassert( ((H5AC2_info_t *)thing)->type == type ); - -#if H5AC2__TRACE_FILE_ENABLED - /* For the unprotect call, only the addr, type id, flags, and possible - * new size are really necessary in the trace file. Write the return - * value to catch occult errors. - */ - if ( ( f != NULL ) && - ( f->shared != NULL ) && - ( f->shared->cache2 != NULL ) && - ( H5C2_get_trace_file_ptr(f->shared->cache2, &trace_file_ptr) >= 0) && - ( trace_file_ptr != NULL ) ) { - - sprintf(trace, "H5AC2_unprotect 0x%lx %d", - (unsigned long)addr, - (int)(type->id)); - - trace_flags = flags; - } -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - dirtied = ( ( (flags & H5AC2__DIRTIED_FLAG) == H5AC2__DIRTIED_FLAG ) || - ( ((H5AC2_info_t *)thing)->dirtied ) ); - - size_changed = ( (flags & H5AC2__SIZE_CHANGED_FLAG) == - H5AC2__SIZE_CHANGED_FLAG ); - -#ifdef H5_HAVE_PARALLEL - if ( ( dirtied ) && ( ((H5AC2_info_t *)thing)->is_dirty == FALSE ) && - ( NULL != (aux_ptr = f->shared->cache2->aux_ptr) ) ) { - - if(H5AC2_log_dirtied_entry(thing, addr, size_changed, new_size) < 0) - HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "can't log entry") - } - - if ( ( (flags & H5C2__DELETED_FLAG) != 0 ) && - ( NULL != (aux_ptr = f->shared->cache2->aux_ptr) ) && - ( aux_ptr->mpi_rank == 0 ) ) { - - result = H5AC2_log_deleted_entry(f->shared->cache2, - (H5AC2_info_t *)thing, - addr, - flags); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \ - "H5AC2_log_deleted_entry() failed.") - } - } -#endif /* H5_HAVE_PARALLEL */ - - result = H5C2_unprotect(f, - dxpl_id, - type, - addr, - thing, - flags, - new_size); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \ - "H5C2_unprotect() failed.") - } - -#ifdef H5_HAVE_PARALLEL - if ( ( aux_ptr != NULL ) && - ( aux_ptr->dirty_bytes >= aux_ptr->dirty_bytes_threshold ) ) { - - result = H5AC2_propagate_flushed_and_still_clean_entries_list(f, - H5AC2_noblock_dxpl_id, - f->shared->cache2, - TRUE); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \ - "Can't propagate clean entries list.") - } - } -#endif /* H5_HAVE_PARALLEL */ - -done: - -#if H5AC2__TRACE_FILE_ENABLED - if ( trace_file_ptr != NULL ) { - - HDfprintf(trace_file_ptr, "%s %d %x %d\n", - trace, - (int)new_size, - (unsigned)flags, - (int)ret_value); - } -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5AC2_unprotect() */ - - -/*------------------------------------------------------------------------- - * Function: HA5C_set_write_done_callback - * - * Purpose: Set the value of the write_done callback. This callback - * is used to improve performance of the parallel test bed - * for the cache. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: John Mainzer - * 5/11/06 - * - * Modifications: - * - * JRM - 10/18/07 - * Modified code in support of revised cache API needed - * to permit journaling. - * - *------------------------------------------------------------------------- - */ - -#ifdef H5_HAVE_PARALLEL -herr_t -H5AC2_set_write_done_callback(H5C2_t * cache_ptr, - void (* write_done)(void)) -{ - herr_t ret_value = SUCCEED; /* Return value */ - H5AC2_aux_t * aux_ptr = NULL; - - FUNC_ENTER_NOAPI(H5AC2_set_write_done_callback, FAIL) - - /* This would normally be an assert, but we need to use an HGOTO_ERROR - * call to shut up the compiler. - */ - if ( ( ! cache_ptr ) || ( cache_ptr->magic != H5C2__H5C2_T_MAGIC ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr") - } - - aux_ptr = cache_ptr->aux_ptr; - - HDassert( aux_ptr != NULL ); - HDassert( aux_ptr->magic == H5AC2__H5AC2_AUX_T_MAGIC ); - - aux_ptr->write_done = write_done; - -done: - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5AC2_set_write_done_callback() */ -#endif /* H5_HAVE_PARALLEL */ - - -/*------------------------------------------------------------------------- - * Function: H5AC2_stats - * - * Purpose: Prints statistics about the cache. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: Robb Matzke - * Thursday, October 30, 1997 - * - * Modifications: - * John Mainzer 5/19/04 - * Re-write to support the new metadata cache. - * - * JRM - 6/7/04 - * Abstracted the guts of the function to H5C2_stats() - * in H5C.c, and then re-wrote the function as a wrapper for - * H5C2_stats(). - * - * JRM - 10/18/07 - * Modified code in support of revised cache API needed - * to permit journaling. - * - *------------------------------------------------------------------------- - */ -herr_t -H5AC2_stats(const H5F_t *f) -{ - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5AC2_stats, FAIL) - - HDassert(f); - HDassert(f->shared); - HDassert(f->shared->cache2); - - /* at present, this can't fail */ - (void)H5C2_stats(f->shared->cache2, f->name, FALSE); - -done: - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5AC2_stats() */ - - -/*------------------------------------------------------------------------- - * Function: H5AC2_get_cache_auto_resize_config - * - * Purpose: Wrapper function for H5C2_get_cache_auto_resize_config(). - * - * Return: SUCCEED on success, and FAIL on failure. - * - * Programmer: John Mainzer - * 3/10/05 - * - * Modifications: - * - * JRM - 4/6/05 - * Reworked for the addition of struct H5AC2_cache_config_t. - * - * JRM - 10/25/05 - * Added support for the new dirty_bytes_threshold field of - * both H5AC2_cache_config_t and H5AC2_aux_t. - * - * JRM - 6/8/06 - * Added support for the new trace file related fields. - * - * JRM - 7/28/07 - * Added support for the new evictions enabled related fields. - * - * Observe that H5AC2_get_cache_auto_resize_config() and - * H5AC2_set_cache_auto_resize_config() are becoming generic - * metadata cache configuration routines as they gain - * switches for functions that are only tenuously related - * to auto resize configuration. - * - * JRM - 10/18/07 - * Modified code in support of revised cache API needed - * to permit journaling. - * - * JRM - 1/2/08 - * Added support for the new flash cache increment related - * fields. - * - * JRM -- 4/12/08 - * Added support for the new journaling control fields. - * - * JRM - 8/1/08 - * Removed support for the new journaling control fields. - * This functionality is now handled through the - * H5AC2_jnl_config_t structure and the related calls. - * - *------------------------------------------------------------------------- - */ - -herr_t -H5AC2_get_cache_auto_resize_config(const H5AC2_t * cache_ptr, - H5AC2_cache_config_t *config_ptr) -{ - herr_t result; - herr_t ret_value = SUCCEED; /* Return value */ - hbool_t evictions_enabled; - H5C2_auto_size_ctl_t internal_config; - - FUNC_ENTER_NOAPI(H5AC2_get_cache_auto_resize_config, FAIL) - - if ( ( cache_ptr == NULL ) - || -#ifdef H5_HAVE_PARALLEL - ( ( cache_ptr->aux_ptr != NULL ) - && - ( ((H5AC2_aux_t *)(cache_ptr->aux_ptr))->magic - != - H5AC2__H5AC2_AUX_T_MAGIC - ) - ) - || -#endif /* H5_HAVE_PARALLEL */ - ( config_ptr == NULL ) - || - ( config_ptr->version != H5AC2__CURR_CACHE_CONFIG_VERSION ) - ) - { - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "Bad cache_ptr or config_ptr on entry.") - - } - - result = H5C2_get_cache_auto_resize_config((const H5C2_t *)cache_ptr, - &internal_config); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "H5C2_get_cache_auto_resize_config() failed.") - } - - result = H5C2_get_evictions_enabled((const H5C2_t *)cache_ptr, - &evictions_enabled); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "H5C2_get_resize_enabled() failed.") - } - - if ( internal_config.rpt_fcn == NULL ) { - - config_ptr->rpt_fcn_enabled = FALSE; - - } else { - - config_ptr->rpt_fcn_enabled = TRUE; - } - - config_ptr->open_trace_file = FALSE; - config_ptr->close_trace_file = FALSE; - config_ptr->trace_file_name[0] = '\0'; - config_ptr->evictions_enabled = evictions_enabled; - config_ptr->set_initial_size = internal_config.set_initial_size; - config_ptr->initial_size = internal_config.initial_size; - config_ptr->min_clean_fraction = internal_config.min_clean_fraction; - config_ptr->max_size = internal_config.max_size; - config_ptr->min_size = internal_config.min_size; - config_ptr->epoch_length = (long)(internal_config.epoch_length); - config_ptr->incr_mode = internal_config.incr_mode; - config_ptr->lower_hr_threshold = internal_config.lower_hr_threshold; - config_ptr->increment = internal_config.increment; - config_ptr->apply_max_increment = internal_config.apply_max_increment; - config_ptr->max_increment = internal_config.max_increment; - config_ptr->flash_incr_mode = internal_config.flash_incr_mode; - config_ptr->flash_multiple = internal_config.flash_multiple; - config_ptr->flash_threshold = internal_config.flash_threshold; - config_ptr->decr_mode = internal_config.decr_mode; - config_ptr->upper_hr_threshold = internal_config.upper_hr_threshold; - config_ptr->decrement = internal_config.decrement; - config_ptr->apply_max_decrement = internal_config.apply_max_decrement; - config_ptr->max_decrement = internal_config.max_decrement; - config_ptr->epochs_before_eviction = - (int)(internal_config.epochs_before_eviction); - config_ptr->apply_empty_reserve = internal_config.apply_empty_reserve; - config_ptr->empty_reserve = internal_config.empty_reserve; - -#ifdef H5_HAVE_PARALLEL - if ( cache_ptr->aux_ptr != NULL ) { - - config_ptr->dirty_bytes_threshold = - ((H5AC2_aux_t *)(cache_ptr->aux_ptr))->dirty_bytes_threshold; - - } else { -#endif /* H5_HAVE_PARALLEL */ - - config_ptr->dirty_bytes_threshold = H5AC2__DEFAULT_DIRTY_BYTES_THRESHOLD; - -#ifdef H5_HAVE_PARALLEL - } -#endif /* H5_HAVE_PARALLEL */ - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5AC2_get_cache_auto_resize_config() */ - - -/*------------------------------------------------------------------------- - * Function: H5AC2_get_jnl_config - * - * Purpose: Get the current journaling configuration and load it into - * the supplied instance of H5AC2_jnl_config_t. - * - * For the moment, the only journaling we do is metadata - * journaling, so in effect this function is a wrapper - * function for H5C2_get_journal_config(). - * - * Return: SUCCEED on success, and FAIL on failure. - * - * Programmer: John Mainzer - * 7/31/08 - * - * Modifications: - * - * JRM -- 8/14/08 - * Reworked for change in argument list to - * H5C2_get_journal_config(). - * - *------------------------------------------------------------------------- - */ - -herr_t -H5AC2_get_jnl_config(H5AC2_t * cache_ptr, - H5AC2_jnl_config_t * config_ptr) -{ - herr_t result; - herr_t ret_value = SUCCEED; /* Return value */ - H5C2_mdj_config_t internal_config; - - FUNC_ENTER_NOAPI(H5AC2_get_jnl_config, FAIL) - - if ( ( cache_ptr == NULL ) - || -#ifdef H5_HAVE_PARALLEL - ( ( cache_ptr->aux_ptr != NULL ) - && - ( ((H5AC2_aux_t *)(cache_ptr->aux_ptr))->magic - != - H5AC2__H5AC2_AUX_T_MAGIC - ) - ) - || -#endif /* H5_HAVE_PARALLEL */ - ( config_ptr == NULL ) - || - ( config_ptr->version != H5AC2__CURR_CACHE_CONFIG_VERSION ) - ) - { - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "Bad cache_ptr or config_ptr on entry.") - - } - - /* get the current journal configuration. Start by setting defaults, - * which will be changed shortly if journaling is enabled. - */ - - config_ptr->enable_journaling = FALSE; - config_ptr->journal_file_path[0] = '\0'; - config_ptr->journal_recovered = FALSE; - config_ptr->jbrb_buf_size = 4096; - config_ptr->jbrb_num_bufs = 1; - config_ptr->jbrb_use_aio = FALSE; - config_ptr->jbrb_human_readable = FALSE; - - result = H5C2_get_journal_config(cache_ptr, &internal_config); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "H5C2_get_journal_config() failed.") - } - - if ( internal_config.enable_journaling ) { - - config_ptr->enable_journaling = internal_config.enable_journaling; - HDstrncpy(&(config_ptr->journal_file_path[0]), - internal_config.journal_file_path, - H5AC2__MAX_JOURNAL_FILE_NAME_LEN); - config_ptr->journal_file_path[H5AC2__MAX_JOURNAL_FILE_NAME_LEN] = '\0'; - config_ptr->jbrb_buf_size = internal_config.jbrb_buf_size; - config_ptr->jbrb_num_bufs = internal_config.jbrb_num_bufs; - config_ptr->jbrb_use_aio = internal_config.jbrb_use_aio; - config_ptr->jbrb_human_readable = internal_config.jbrb_human_readable; - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5AC2_get_jnl_config() */ - - -/*------------------------------------------------------------------------- - * Function: H5AC2_get_cache_size - * - * Purpose: Wrapper function for H5C2_get_cache_size(). - * - * Return: SUCCEED on success, and FAIL on failure. - * - * Programmer: John Mainzer - * 3/11/05 - * - * Modifications: - * - * JRM - 10/18/07 - * Modified code in support of revised cache API needed - * to permit journaling. - * - *------------------------------------------------------------------------- - */ - -herr_t -H5AC2_get_cache_size(H5AC2_t * cache_ptr, - size_t * max_size_ptr, - size_t * min_clean_size_ptr, - size_t * cur_size_ptr, - int32_t * cur_num_entries_ptr) -{ - herr_t result; - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5AC2_get_cache_size, FAIL) - - result = H5C2_get_cache_size((H5C2_t *)cache_ptr, - max_size_ptr, - min_clean_size_ptr, - cur_size_ptr, - cur_num_entries_ptr); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "H5C2_get_cache_size() failed.") - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5AC2_get_cache_size() */ - - -/*------------------------------------------------------------------------- - * Function: H5AC2_get_cache_hit_rate - * - * Purpose: Wrapper function for H5C2_get_cache_hit_rate(). - * - * Return: SUCCEED on success, and FAIL on failure. - * - * Programmer: John Mainzer - * 3/10/05 - * - * Modifications: - * - * JRM - 10/18/07 - * Modified code in support of revised cache API needed - * to permit journaling. - * - *------------------------------------------------------------------------- - */ - -herr_t -H5AC2_get_cache_hit_rate(H5AC2_t * cache_ptr, - double * hit_rate_ptr) - -{ - herr_t result; - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5AC2_get_cache_hit_rate, FAIL) - - result = H5C2_get_cache_hit_rate((H5C2_t *)cache_ptr, hit_rate_ptr); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "H5C2_get_cache_hit_rate() failed.") - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5AC2_get_cache_hit_rate() */ - - -/*------------------------------------------------------------------------- - * - * Function: H5AC2_reset_cache_hit_rate_stats() - * - * Purpose: Wrapper function for H5C2_reset_cache_hit_rate_stats(). - * - * Return: SUCCEED on success, and FAIL on failure. - * - * Programmer: John Mainzer, 3/10/05 - * - * Modifications: - * - * JRM - 10/18/07 - * Modified code in support of revised cache API needed - * to permit journaling. - * - *------------------------------------------------------------------------- - */ - -herr_t -H5AC2_reset_cache_hit_rate_stats(H5AC2_t * cache_ptr) -{ - herr_t result; - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5AC2_reset_cache_hit_rate_stats, FAIL) - - result = H5C2_reset_cache_hit_rate_stats((H5C2_t *)cache_ptr); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "H5C2_reset_cache_hit_rate_stats() failed.") - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5AC2_reset_cache_hit_rate_stats() */ - - -/*------------------------------------------------------------------------- - * Function: H5AC2_set_cache_auto_resize_config - * - * Purpose: Wrapper function for H5C2_set_cache_auto_resize_config(). - * - * Return: SUCCEED on success, and FAIL on failure. - * - * Programmer: John Mainzer - * 3/10/05 - * - * Modifications: - * - * John Mainzer -- 4/6/05 - * Updated for the addition of H5AC2_cache_config_t. - * - * John Mainzer -- 10/25/05 - * Added support for the new dirty_bytes_threshold field of - * both H5AC2_cache_config_t and H5AC2_aux_t. - * - * John Mainzer -- 6/7/06 - * Added trace file support. - * - * John Mainzer -- 7/28/07 - * Added support for the new evictions enabled related fields. - * - * Observe that H5AC2_get_cache_auto_resize_config() and - * H5AC2_set_cache_auto_resize_config() are becoming generic - * metadata cache configuration routines as they gain - * switches for functions that are only tenuously related - * to auto resize configuration. - * - * JRM - 10/18/07 - * Modified code in support of revised cache API needed - * to permit journaling. - * - * John Mainzer -- 1/3/07 - * Updated trace file code to record the new flash cache - * size increase related fields. - * - * John Mainzer -- 4/13/08 - * Added code to allow control of metadata journaling. - * This required the addition of the dxpl_id parameter. - * - * John Mainzer -- 8/1/08 - * Pulled journaling configuration back out of the - * function, and teh dxpl_id parameter with it. - * - *------------------------------------------------------------------------- - */ - -herr_t -H5AC2_set_cache_auto_resize_config(H5AC2_t * cache_ptr, - H5AC2_cache_config_t *config_ptr) -{ - herr_t result; - herr_t ret_value = SUCCEED; /* Return value */ -#if H5AC2__TRACE_FILE_ENABLED - H5AC2_cache_config_t trace_config = H5AC2__DEFAULT_CACHE_CONFIG; - FILE * trace_file_ptr = NULL; -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - FUNC_ENTER_NOAPI(H5AC2_set_cache_auto_resize_config, FAIL) - - HDassert( cache_ptr ); - -#if H5AC2__TRACE_FILE_ENABLED - /* Make note of the new configuration. Don't look up the trace file - * pointer, as that may change before we use it. - */ - if ( config_ptr != NULL ) { - - trace_config = *config_ptr; - - } -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - if ( ( cache_ptr == NULL ) -#ifdef H5_HAVE_PARALLEL - || - ( ( cache_ptr->aux_ptr != NULL ) - && - ( - ((H5AC2_aux_t *)(cache_ptr->aux_ptr))->magic - != - H5AC2__H5AC2_AUX_T_MAGIC - ) - ) -#endif /* H5_HAVE_PARALLEL */ - ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "bad cache_ptr on entry.") - } - - result = H5AC2_validate_config(config_ptr); - - if ( result != SUCCEED ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Bad cache configuration"); - } - - - result = H5AC2_set_cache_config(cache_ptr, config_ptr); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "H5AC2_set_cache_config() failed.") - } - -done: - -#if H5AC2__TRACE_FILE_ENABLED - /* For the set cache auto resize config call, only the contents - * of the config is necessary in the trace file. Write the return - * value to catch occult errors. - */ - if ( ( cache_ptr != NULL ) && - ( H5C2_get_trace_file_ptr(cache_ptr, &trace_file_ptr) >= 0 ) && - ( trace_file_ptr != NULL ) ) { - - HDfprintf(trace_file_ptr, - "%s %d %d %d %d \"%s\" %d %d %d %f %d %d %ld %d %f %f %d %d %d %f %f %d %f %f %d %d %d %d %f %d %d\n", - "H5AC2_set_cache_auto_resize_config", - trace_config.version, - (int)(trace_config.rpt_fcn_enabled), - (int)(trace_config.open_trace_file), - (int)(trace_config.close_trace_file), - trace_config.trace_file_name, - (int)(trace_config.evictions_enabled), - (int)(trace_config.set_initial_size), - (int)(trace_config.initial_size), - trace_config.min_clean_fraction, - (int)(trace_config.max_size), - (int)(trace_config.min_size), - trace_config.epoch_length, - (int)(trace_config.incr_mode), - trace_config.lower_hr_threshold, - trace_config.increment, - (int)(trace_config.apply_max_increment), - (int)(trace_config.max_increment), - (int)(trace_config.flash_incr_mode), - trace_config.flash_multiple, - trace_config.flash_threshold, - (int)(trace_config.decr_mode), - trace_config.upper_hr_threshold, - trace_config.decrement, - (int)(trace_config.apply_max_decrement), - (int)(trace_config.max_decrement), - trace_config.epochs_before_eviction, - (int)(trace_config.apply_empty_reserve), - trace_config.empty_reserve, - trace_config.dirty_bytes_threshold, - (int)ret_value); - } -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5AC2_set_cache_auto_resize_config() */ - - -/*------------------------------------------------------------------------- - * Function: H5AC2_set_jnl_config - * - * Purpose: Manage changes in journaling configuration. - * - * At present, metadata journaling is the only journaling we - * do, so this function can be thought of as a wrapper for - * H5C2_begin_journaling() and H5C2_end_journaling(). - * - * Return: SUCCEED on success, and FAIL on failure. - * - * Programmer: John Mainzer - * 7/31/08 - * - * Modifications: - * - * JRM -- 8/14/08 - * Revised code for the use of the H5C2_mdj_config_t - * structure in H5C2_get_journal_config() and - * H5C2_begin_journaling(). - * - * Per Quincey's request, also added code to - * throw an error if journaling is requested when - * it is already enabled, or if the end of journaling - * is requested when it is already disabled. - * - * Note that this required the addition of the - * initializing parameter, which allows us to - * avoid generating an error on startup. - * - *------------------------------------------------------------------------- - */ -herr_t -H5AC2_set_jnl_config(H5F_t * f, - hid_t dxpl_id, - const H5AC2_jnl_config_t *config_ptr, - hbool_t initializing) -{ - /* const char * fcn_name = "H5AC2_set_jnl_config"; */ - H5AC2_t * cache_ptr; - herr_t result; - H5C2_mdj_config_t internal_config; -#if H5AC2__TRACE_FILE_ENABLED - H5AC2_jnl_config_t trace_config = H5AC2__DEFAULT_JNL_CONFIG; - FILE * trace_file_ptr = NULL; -#endif /* H5AC2__TRACE_FILE_ENABLED */ - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5AC2_set_jnl_config, FAIL) - - HDassert( f ); - HDassert( f->shared ); - HDassert( f->shared->cache2 ); - - cache_ptr = (H5AC2_t *)f->shared->cache2; - -#if H5AC2__TRACE_FILE_ENABLED - /* Make note of the new configuration. - */ - trace_config = *config_ptr; -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - if ( ( cache_ptr == NULL ) -#ifdef H5_HAVE_PARALLEL - || - ( ( cache_ptr->aux_ptr != NULL ) - && - ( - ((H5AC2_aux_t *)(cache_ptr->aux_ptr))->magic - != - H5AC2__H5AC2_AUX_T_MAGIC - ) - ) -#endif /* H5_HAVE_PARALLEL */ - ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "bad cache_ptr on entry.") - } - - result = H5AC2_validate_jnl_config(config_ptr); - - if ( result != SUCCEED ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ - "Bad journaling configuration"); - } - - result = H5C2_get_journal_config((H5C2_t *)cache_ptr, &internal_config); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "H5C2_get_journal_config() failed.") - } - - if ( config_ptr->enable_journaling != internal_config.enable_journaling ) { - - /* we have work to do -- start or stop journaling as requested */ - - if ( config_ptr->enable_journaling ) { - - internal_config.enable_journaling = config_ptr->enable_journaling; - - HDstrncpy(internal_config.journal_file_path, - &(config_ptr->journal_file_path[0]), - H5C2__MAX_JOURNAL_FILE_NAME_LEN); - internal_config.journal_file_path[H5AC2__MAX_JOURNAL_FILE_NAME_LEN] - = '\0'; - - internal_config.jbrb_buf_size = config_ptr->jbrb_buf_size; - internal_config.jbrb_num_bufs = config_ptr->jbrb_num_bufs; - internal_config.jbrb_use_aio = config_ptr->jbrb_use_aio; - internal_config.jbrb_human_readable = - config_ptr->jbrb_human_readable; - - result = H5C2_begin_journaling(f, - dxpl_id, - cache_ptr, - &internal_config); - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_begin_journaling() failed.") - } - } else { - - result = H5C2_end_journaling(f, dxpl_id, cache_ptr); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_end_journaling() failed.") - } - } - } else if ( ! initializing ) { - - if ( config_ptr->enable_journaling ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "journaling already enabled.") - - } else { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "journaling already disabled.") - - } - } - -done: - -#if H5AC2__TRACE_FILE_ENABLED - /* For the set cache journaling config call, only the fields - * of the config that pretain to journaling are necessary in - * the trace file. Write the return value to catch occult errors. - */ - if ( ( cache_ptr != NULL ) && - ( H5C2_get_trace_file_ptr(cache_ptr, &trace_file_ptr) >= 0 ) && - ( trace_file_ptr != NULL ) ) { - - HDfprintf(trace_file_ptr, - "%s %d %d \"%s\" %d %d %d %d %d %d\n", - "H5AC2_set_jnl_config", - trace_config.version, - (int)(config_ptr->enable_journaling), - config_ptr->journal_file_path, - (int)(config_ptr->journal_recovered), - (int)(config_ptr->jbrb_buf_size), - config_ptr->jbrb_num_bufs, - (int)(config_ptr->jbrb_use_aio), - (int)(config_ptr->jbrb_human_readable), - (int)ret_value); - } -#endif /* H5AC2__TRACE_FILE_ENABLED */ - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5AC2_set_jnl_config() */ - - -/*------------------------------------------------------------------------- - * Function: H5AC2_set_cache_config - * - * Purpose: Handle all configuration switches in an instance of - * H5AC2_cache_config_t. - * - * Return: SUCCEED on success, and FAIL on failure. - * - * Programmer: John Mainzer - * 7/7/08 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -herr_t -H5AC2_set_cache_config(H5AC2_t * cache_ptr, - H5AC2_cache_config_t *config_ptr) -{ - /* const char * fcn_name = "H5AC2_set_cache_config"; */ - herr_t result; - herr_t ret_value = SUCCEED; /* Return value */ - H5C2_auto_size_ctl_t internal_config; - - FUNC_ENTER_NOAPI(H5AC2_set_cache_config, FAIL) - - if ( ( cache_ptr == NULL ) -#ifdef H5_HAVE_PARALLEL - || - ( ( cache_ptr->aux_ptr != NULL ) - && - ( - ((H5AC2_aux_t *)(cache_ptr->aux_ptr))->magic - != - H5AC2__H5AC2_AUX_T_MAGIC - ) - ) -#endif /* H5_HAVE_PARALLEL */ - ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "bad cache_ptr on entry.") - } - - result = H5AC2_validate_config(config_ptr); - - if ( result != SUCCEED ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Bad cache configuration"); - } - - if ( config_ptr->open_trace_file ) { - - FILE * file_ptr = NULL; - - if ( H5C2_get_trace_file_ptr(cache_ptr, &file_ptr) < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "H5C2_get_trace_file_ptr() failed.") - } - - if ( ( ! ( config_ptr->close_trace_file ) ) && - ( file_ptr != NULL ) ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ - "Trace file already open.") - } - } - - if ( - ( - config_ptr->dirty_bytes_threshold - < - H5AC2__MIN_DIRTY_BYTES_THRESHOLD - ) - || - ( - config_ptr->dirty_bytes_threshold - > - H5AC2__MAX_DIRTY_BYTES_THRESHOLD - ) - ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, - "config_ptr->dirty_bytes_threshold out of range.") - } - - if ( config_ptr->close_trace_file ) { - - if ( H5AC2_close_trace_file(cache_ptr) < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "H5AC2_close_trace_file() failed.") - } - } - - if ( config_ptr->open_trace_file ) { - - if ( H5AC2_open_trace_file(cache_ptr, config_ptr->trace_file_name) < 0 ) - { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ - "H5AC2_open_trace_file() failed.") - } - } - - if ( H5AC2_ext_config_2_int_config(config_ptr, &internal_config) != - SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "H5AC2_ext_config_2_int_config() failed.") - } - - result = H5C2_set_cache_auto_resize_config(cache_ptr, - &internal_config); - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "H5C2_set_cache_auto_resize_config() failed.") - } - - - result = H5C2_set_evictions_enabled(cache_ptr, - config_ptr->evictions_enabled); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "H5C2_set_evictions_enabled() failed.") - } - -#ifdef H5_HAVE_PARALLEL - if ( cache_ptr->aux_ptr != NULL ) { - - ((H5AC2_aux_t *)(cache_ptr->aux_ptr))->dirty_bytes_threshold = - config_ptr->dirty_bytes_threshold; - } -#endif /* H5_HAVE_PARALLEL */ - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5AC2_set_cache_config() */ - - -/*------------------------------------------------------------------------- - * Function: H5AC2_validate_config() - * - * Purpose: Run a sanity check on the contents of the supplied - * instance of H5AC2_cache_config_t. - * - * Do nothing and return SUCCEED if no errors are detected, - * and flag an error and return FAIL otherwise. - * - * At present, this function operates by packing the data - * from the instance of H5AC2_cache_config_t into an instance - * of H5C2_auto_size_ctl_t, and then calling - * H5C2_validate_resize_config(). As H5AC2_cache_config_t and - * H5C2_auto_size_ctl_t diverge, we may have to change this. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: John Mainzer - * 4/6/05 - * - * Modifications: - * - * - Added code testing the trace file configuration fields. - * These tests are not comprehensive, as many errors cannot - * be caught until the directives contained in these fields - * are applied. - * JRM - 5/15/06 - * - * - Added code testing the evictions enabled field. At - * present this consists of verifying that if - * evictions_enabled is FALSE, then automatic cache - * resizing in disabled. - * - * JRM - 7/28/07 - * - * Modified code in support of revised cache API needed - * to permit journaling. - * JRM - 10/18/07 - * - * Pulled journaling related code out of this function. - * - * JRM - 8/1/08 - * - *------------------------------------------------------------------------- - */ -herr_t -H5AC2_validate_config(H5AC2_cache_config_t * config_ptr) -{ - herr_t result; - int name_len; - H5C2_auto_size_ctl_t internal_config; - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5AC2_validate_config, FAIL) - - if ( config_ptr == NULL ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "NULL config_ptr on entry.") - } - - if ( config_ptr->version != H5AC2__CURR_CACHE_CONFIG_VERSION ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Unknown config version.") - } - - if ( ( config_ptr->rpt_fcn_enabled != TRUE ) && - ( config_ptr->rpt_fcn_enabled != FALSE ) ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ - "config_ptr->rpt_fcn_enabled must be either TRUE or FALSE.") - } - - if ( ( config_ptr->open_trace_file != TRUE ) && - ( config_ptr->open_trace_file != FALSE ) ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ - "config_ptr->open_trace_file must be either TRUE or FALSE.") - } - - if ( ( config_ptr->close_trace_file != TRUE ) && - ( config_ptr->close_trace_file != FALSE ) ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ - "config_ptr->close_trace_file must be either TRUE or FALSE.") - } - - /* don't bother to test trace_file_name unless open_trace_file is TRUE */ - if ( config_ptr->open_trace_file ) { - - /* Can't really test the trace_file_name field without trying to - * open the file, so we will content ourselves with a couple of - * sanity checks on the length of the file name. - */ - name_len = HDstrlen(config_ptr->trace_file_name); - - if ( name_len == 0 ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ - "config_ptr->trace_file_name is empty.") - - } else if ( name_len > H5AC2__MAX_TRACE_FILE_NAME_LEN ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ - "config_ptr->trace_file_name too long.") - } - } - - if ( ( config_ptr->evictions_enabled != TRUE ) && - ( config_ptr->evictions_enabled != FALSE ) ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ - "config_ptr->evictions_enabled must be either TRUE or FALSE.") - } - - if ( ( config_ptr->evictions_enabled == FALSE ) && - ( ( config_ptr->incr_mode != H5C2_incr__off ) || - ( config_ptr->flash_incr_mode != H5C2_flash_incr__off ) || - ( config_ptr->decr_mode != H5C2_decr__off ) ) ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ - "Can't disable evictions while auto-resize is enabled.") - } - - if ( config_ptr->dirty_bytes_threshold < H5AC2__MIN_DIRTY_BYTES_THRESHOLD ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, - "dirty_bytes_threshold too small.") - } else - if ( config_ptr->dirty_bytes_threshold > H5AC2__MAX_DIRTY_BYTES_THRESHOLD ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, - "dirty_bytes_threshold too big.") - } - - if ( H5AC2_ext_config_2_int_config(config_ptr, &internal_config) != - SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "H5AC2_ext_config_2_int_config() failed.") - } - - result = H5C2_validate_resize_config(&internal_config, - H5C2_RESIZE_CFG__VALIDATE_ALL); - - if ( result != SUCCEED ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "error(s) in new config.") - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5AC2_validate_config() */ - - -/*------------------------------------------------------------------------- - * Function: H5AC2_validate_jnl_config() - * - * Purpose: Run a sanity check on the contents of the supplied - * instance of H5AC2_jnl_config_t. - * - * Do nothing and return SUCCEED if no errors are detected, - * and flag an error and return FAIL otherwise. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: John Mainzer - * 7/31/08 - * - * Modifications: - * - * - None. - * - *------------------------------------------------------------------------- - */ -herr_t -H5AC2_validate_jnl_config(const H5AC2_jnl_config_t *config_ptr) -{ - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5AC2_validate_jnl_config, FAIL) - - if(config_ptr == NULL) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "NULL config_ptr on entry.") - - if ( config_ptr->version != H5AC2__CURR_JNL_CONFIG_VER ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Unknown config version.") - } - - if ( ( config_ptr->enable_journaling != TRUE ) && - ( config_ptr->enable_journaling != FALSE ) ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ - "config_ptr->enable_journaling must be either TRUE or FALSE.") - } - - if ( ( config_ptr->journal_recovered != TRUE ) && - ( config_ptr->journal_recovered != FALSE ) ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ - "config_ptr->journal_recovered must be either TRUE or FALSE.") - } - - if ( ( config_ptr->enable_journaling ) && - ( config_ptr->journal_recovered ) ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ - "enable_journaling and journal_recovered can't both be TRUE.") - } - - /* don't test journal_file_path unless enable_journaling is TRUE */ - if ( config_ptr->enable_journaling ) { - size_t name_len; - - /* Check for NULL journal file path string */ - if(NULL == config_ptr->journal_file_path) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "config_ptr->journal_file_path is NULL.") - - /* Can't really test the journal_file_path field without trying to - * open the file, so we will content ourselves with a couple of - * sanity checks on the length of the file name. - */ - name_len = HDstrlen(config_ptr->journal_file_path); - - if ( name_len == 0 ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ - "config_ptr->journal_file_path is empty.") - - } else if ( name_len > H5AC2__MAX_JOURNAL_FILE_NAME_LEN ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ - "config_ptr->journal_file_path too long.") - } - } - - if ( ( config_ptr->jbrb_buf_size < H5AC2__MIN_JBRB_BUF_SIZE ) || - ( config_ptr->jbrb_buf_size > H5AC2__MAX_JBRB_BUF_SIZE ) ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ - "config_ptr->jbrb_buf_size out of range.") - } - - if ( ( config_ptr->jbrb_num_bufs < H5AC2__MIN_JBRB_NUM_BUFS ) || - ( config_ptr->jbrb_num_bufs > H5AC2__MAX_JBRB_NUM_BUFS ) ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ - "config_ptr->jbrb_num_bufs out of range.") - } - - if ( ( config_ptr->jbrb_use_aio != FALSE ) && - ( config_ptr->jbrb_use_aio != TRUE ) ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ - "config_ptr->jbrb_use_aio must be either TRUE or FALSE.") - } - - if ( ( config_ptr->jbrb_human_readable != FALSE ) && - ( config_ptr->jbrb_human_readable != TRUE ) ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ - "config_ptr->jbrb_human_readable must be either TRUE or FALSE.") - } - -done: - FUNC_LEAVE_NOAPI(ret_value) -} /* H5AC2_validate_jnl_config() */ - - -/*------------------------------------------------------------------------- - * Function: H5AC2_validate_jnl_config_ver() - * - * Purpose: Return true if the supplied H5AC2_jnl_config_t version - * number is valid, and FALSE otherwise. - * - * Return: TRUE if the version number is valid, and FALSE otherwise. - * - * Programmer: John Mainzer - * 8/13/08 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ -hbool_t -H5AC2_validate_jnl_config_ver(int version_num) -{ - FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5AC2_validate_jnl_config_ver) - - FUNC_LEAVE_NOAPI(version_num == H5AC2__CURR_JNL_CONFIG_VER) -} /* H5AC2_validate_jnl_config_ver() */ - - -/*------------------------------------------------------------------------- - * Function: H5AC2_validate_cache_config_ver() - * - * Purpose: Return true if the supplied H5AC2_cache_config_t version - * number is valid, and FALSE otherwise. - * - * Return: TRUE if the version number is valid, and FALSE otherwise. - * - * Programmer: John Mainzer - * 8/13/08 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ -hbool_t -H5AC2_validate_cache_config_ver(int version_num) -{ - FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5AC2_validate_cache_config_ver) - - FUNC_LEAVE_NOAPI(version_num == H5AC2__CURR_CACHE_CONFIG_VERSION) -} /* H5AC2_validate_cache_config_ver() */ - - -/*------------------------------------------------------------------------- - * Function: H5AC2_close_trace_file() - * - * Purpose: If a trace file is open, stop logging calls to the cache, - * and close the file. - * - * Note that the function does nothing if there is no trace - * file. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: John Mainzer - * 6/2/06 - * - * Modifications: - * - * Modified code in support of revised cache API needed - * to permit journaling. - * JRM - 10/18/07 - * - *------------------------------------------------------------------------- - */ - -herr_t -H5AC2_close_trace_file(H5AC2_t * cache_ptr) - -{ - herr_t ret_value = SUCCEED; /* Return value */ - FILE * trace_file_ptr = NULL; - - FUNC_ENTER_NOAPI(H5AC2_close_trace_file, FAIL) - - if ( cache_ptr == NULL ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "NULL cache_ptr on entry.") - } - - if ( H5C2_get_trace_file_ptr(cache_ptr, &trace_file_ptr) < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "H5C2_get_trace_file_ptr() failed.") - } - - if ( trace_file_ptr != NULL ) { - - if ( H5C2_set_trace_file_ptr(cache_ptr, NULL) < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "H5C2_set_trace_file_ptr() failed.") - } - - if ( HDfclose(trace_file_ptr) != 0 ) { - - HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, \ - "can't close metadata cache trace file") - } - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5AC2_close_trace_file() */ - - -/*------------------------------------------------------------------------- - * Function: H5AC2_open_trace_file() - * - * Purpose: Open a trace file, and start logging calls to the cache. - * - * This logging is done at the H5C2 level, and will only take - * place if H5C2_TRACE_FILE_ENABLED (defined in H5C2private.h) - * is TRUE. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: John Mainzer - * 6/1/06 - * - * Modifications: - * - * Modified code in support of revised cache API needed - * to permit journaling. - * JRM - 10/18/07 - * - *------------------------------------------------------------------------- - */ - -herr_t -H5AC2_open_trace_file(H5AC2_t * cache_ptr, - const char * trace_file_name) -{ - herr_t ret_value = SUCCEED; /* Return value */ - char file_name[H5AC2__MAX_TRACE_FILE_NAME_LEN + H5C2__PREFIX_LEN + 2]; - FILE * file_ptr = NULL; -#ifdef H5_HAVE_PARALLEL - H5AC2_aux_t * aux_ptr = NULL; -#endif /* H5_HAVE_PARALLEL */ - - FUNC_ENTER_NOAPI(H5AC2_open_trace_file, FAIL) - - HDassert(cache_ptr); - - if ( cache_ptr == NULL ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "cache_ptr NULL on entry.") - } - - if ( trace_file_name == NULL ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ - "NULL trace_file_name on entry.") - } - - if ( HDstrlen(trace_file_name) > H5AC2__MAX_TRACE_FILE_NAME_LEN ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "trace file name too long.") - } - - if ( H5C2_get_trace_file_ptr(cache_ptr, &file_ptr) < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "H5C2_get_trace_file_ptr() failed.") - } - - if ( file_ptr != NULL ) { - - HGOTO_ERROR(H5E_FILE, H5E_FILEOPEN, FAIL, "trace file already open.") - } - -#ifdef H5_HAVE_PARALLEL - - aux_ptr = (H5AC2_aux_t *)(cache_ptr->aux_ptr); - - if ( cache_ptr->aux_ptr == NULL ) { - - sprintf(file_name, "%s", trace_file_name); - - } else { - - if ( aux_ptr->magic != H5AC2__H5AC2_AUX_T_MAGIC ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad aux_ptr->magic.") - } - - sprintf(file_name, "%s.%d", trace_file_name, aux_ptr->mpi_rank); - - } - - if ( HDstrlen(file_name) > - H5AC2__MAX_TRACE_FILE_NAME_LEN + H5C2__PREFIX_LEN + 1 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "cooked trace file name too long.") - } - -#else /* H5_HAVE_PARALLEL */ - - sprintf(file_name, "%s", trace_file_name); - -#endif /* H5_HAVE_PARALLEL */ - - if ( (file_ptr = HDfopen(file_name, "w")) == NULL ) { - - /* trace file open failed */ - HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "trace file open failed.") - } - - HDfprintf(file_ptr, "### HDF5 metadata cache trace file version 2 ###\n"); - - if ( H5C2_set_trace_file_ptr(cache_ptr, file_ptr) < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "H5C2_set_trace_file_ptr() failed.") - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5AC2_open_trace_file() */ - - -/*************************************************************************/ -/**************************** Private Functions: *************************/ -/*************************************************************************/ - -/*------------------------------------------------------------------------- - * - * Function: H5AC2_broadcast_clean_list() - * - * Purpose: Broadcast the contents of the process 0 cleaned entry - * slist. In passing, also remove all entries from said - * list, and also remove any matching entries from the dirtied - * slist. - * - * This function must only be called by the process with - * MPI_rank 0. - * - * Return SUCCEED on success, and FAIL on failure. - * - * Return: Non-negative on success/Negative on failure. - * - * Programmer: John Mainzer, 7/1/05 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -#ifdef H5_HAVE_PARALLEL -static herr_t -H5AC2_broadcast_clean_list(H5AC2_t * cache_ptr) -{ - herr_t ret_value = SUCCEED; /* Return value */ - haddr_t addr; - H5AC2_aux_t * aux_ptr = NULL; - H5SL_node_t * slist_node_ptr = NULL; - H5AC2_slist_entry_t * slist_entry_ptr = NULL; - MPI_Offset * buf_ptr = NULL; - size_t buf_size; - int i = 0; - int mpi_result; - int num_entries; - - FUNC_ENTER_NOAPI(H5AC2_broadcast_clean_list, FAIL) - - HDassert( cache_ptr != NULL ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - - aux_ptr = (H5AC2_aux_t *)(cache_ptr->aux_ptr); - - HDassert( aux_ptr != NULL ); - HDassert( aux_ptr->magic == H5AC2__H5AC2_AUX_T_MAGIC ); - HDassert( aux_ptr->mpi_rank == 0 ); - HDassert( aux_ptr->c_slist_ptr != NULL ); - HDassert( H5SL_count(aux_ptr->c_slist_ptr) == - (size_t)(aux_ptr->c_slist_len) ); - - - /* First broadcast the number of entries in the list so that the - * receives can set up a buffer to receive them. If there aren't - * any, we are done. - */ - num_entries = aux_ptr->c_slist_len; - - mpi_result = MPI_Bcast(&num_entries, 1, MPI_INT, 0, aux_ptr->mpi_comm); - - if ( mpi_result != MPI_SUCCESS ) { - - HMPI_GOTO_ERROR(FAIL, "MPI_Bcast failed 1", mpi_result) - - } - - if ( num_entries > 0 ) - { - /* allocate a buffer to store the list of entry base addresses in */ - - buf_size = sizeof(MPI_Offset) * (size_t)num_entries; - - buf_ptr = (MPI_Offset *)H5MM_malloc(buf_size); - - if ( buf_ptr == NULL ) { - - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \ - "memory allocation failed for clean entry buffer") - } - - /* now load the entry base addresses into the buffer, emptying the - * cleaned entry list in passing - */ - - while ( NULL != (slist_node_ptr = H5SL_first(aux_ptr->c_slist_ptr) ) ) - { - slist_entry_ptr = H5SL_item(slist_node_ptr); - - HDassert(slist_entry_ptr->magic == H5AC2__H5AC2_SLIST_ENTRY_T_MAGIC); - - HDassert( i < num_entries ); - - addr = slist_entry_ptr->addr; - - if ( H5FD_mpi_haddr_to_MPIOff(addr, &(buf_ptr[i])) < 0 ) { - - HGOTO_ERROR(H5E_INTERNAL, H5E_BADRANGE, FAIL, \ - "can't convert from haddr to MPI off") - } - - i++; - - /* now remove the entry from the cleaned entry list */ - if ( H5SL_remove(aux_ptr->c_slist_ptr, (void *)(&addr)) - != slist_entry_ptr ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTDELETE, FAIL, \ - "Can't delete entry from cleaned entry slist.") - } - - slist_entry_ptr->magic = 0; - H5FL_FREE(H5AC2_slist_entry_t, slist_entry_ptr); - slist_entry_ptr = NULL; - - aux_ptr->c_slist_len -= 1; - - HDassert( aux_ptr->c_slist_len >= 0 ); - - /* and also remove the matching entry from the dirtied list - * if it exists. - */ - if ( (slist_entry_ptr = H5SL_search(aux_ptr->d_slist_ptr, - (void *)(&addr))) != NULL ) { - - HDassert( slist_entry_ptr->magic == - H5AC2__H5AC2_SLIST_ENTRY_T_MAGIC ); - HDassert( slist_entry_ptr->addr == addr ); - - if ( H5SL_remove(aux_ptr->d_slist_ptr, (void *)(&addr)) - != slist_entry_ptr ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTDELETE, FAIL, \ - "Can't delete entry from dirty entry slist.") - } - - slist_entry_ptr->magic = 0; - H5FL_FREE(H5AC2_slist_entry_t, slist_entry_ptr); - slist_entry_ptr = NULL; - - aux_ptr->d_slist_len -= 1; - - HDassert( aux_ptr->d_slist_len >= 0 ); - } - - } /* while */ - - - /* Now broadcast the list of cleaned entries -- if there is one. - * - * The peculiar structure of the following call to MPI_Bcast is - * due to MPI's (?) failure to believe in the MPI_Offset type. - * Thus the element type is MPI_BYTE, with size equal to the - * buf_size computed above. - */ - - mpi_result = MPI_Bcast((void *)buf_ptr, (int)buf_size, MPI_BYTE, 0, - aux_ptr->mpi_comm); - - if ( mpi_result != MPI_SUCCESS ) { - - HMPI_GOTO_ERROR(FAIL, "MPI_Bcast failed 2", mpi_result) - } - } - -done: - - if ( buf_ptr != NULL ) { - - buf_ptr = (MPI_Offset *)H5MM_xfree((void *)buf_ptr); - } - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5AC2_broadcast_clean_list() */ -#endif /* H5_HAVE_PARALLEL */ - - -/*------------------------------------------------------------------------- - * - * Function: H5AC2_check_if_write_permitted - * - * Purpose: Determine if a write is permitted under the current - * circumstances, and set *write_permitted_ptr accordingly. - * As a general rule it is, but when we are running in parallel - * mode with collective I/O, we must ensure that a read cannot - * cause a write. - * - * In the event of failure, the value of *write_permitted_ptr - * is undefined. - * - * Return: Non-negative on success/Negative on failure. - * - * Programmer: John Mainzer, 5/15/04 - * - * Modifications: - * - * John Mainzer, 9/23/05 - * Rewrote function to return the value of the - * write_permitted field in aux structure if the structure - * exists and mpi_rank is 0. - * - * If the aux structure exists, but mpi_rank isn't 0, the - * function now returns FALSE. - * - * In all other cases, the function returns TRUE. - * - *------------------------------------------------------------------------- - */ - -#ifdef H5_HAVE_PARALLEL -static herr_t -H5AC2_check_if_write_permitted(const H5F_t *f, - hid_t UNUSED dxpl_id, - hbool_t * write_permitted_ptr) -#else /* H5_HAVE_PARALLEL */ -static herr_t -H5AC2_check_if_write_permitted(const H5F_t UNUSED * f, - hid_t UNUSED dxpl_id, - hbool_t * write_permitted_ptr) -#endif /* H5_HAVE_PARALLEL */ -{ - hbool_t write_permitted = TRUE; - herr_t ret_value = SUCCEED; /* Return value */ -#ifdef H5_HAVE_PARALLEL - H5AC2_aux_t * aux_ptr = NULL; -#endif /* H5_HAVE_PARALLEL */ - - - FUNC_ENTER_NOAPI(H5AC2_check_if_write_permitted, FAIL) - -#ifdef H5_HAVE_PARALLEL - HDassert( f != NULL ); - HDassert( f->shared != NULL ); - HDassert( f->shared->cache2 != NULL ); - - aux_ptr = (H5AC2_aux_t *)(f->shared->cache2->aux_ptr); - - if ( aux_ptr != NULL ) { - - HDassert( aux_ptr->magic == H5AC2__H5AC2_AUX_T_MAGIC ); - - if ( aux_ptr->mpi_rank == 0 ) { - - write_permitted = aux_ptr->write_permitted; - - } else { - - write_permitted = FALSE; - } - } -#endif /* H5_HAVE_PARALLEL */ - - *write_permitted_ptr = write_permitted; - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5AC2_check_if_write_permitted() */ - - -/*------------------------------------------------------------------------- - * Function: H5AC2_ext_config_2_int_config() - * - * Purpose: Utility function to translate an instance of - * H5AC2_cache_config_t to an instance of H5C2_auto_size_ctl_t. - * - * Places translation in *int_conf_ptr and returns SUCCEED - * if successful. Returns FAIL on failure. - * - * Does only minimal sanity checking. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: John Mainzer - * 1/26/06 - * - * Modifications: - * - * Updated function for flash cache increment fields. - * - * JRM -- 1/2/08 - * - * - *------------------------------------------------------------------------- - */ - -herr_t -H5AC2_ext_config_2_int_config(H5AC2_cache_config_t * ext_conf_ptr, - H5C2_auto_size_ctl_t * int_conf_ptr) -{ - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5AC2_ext_config_2_int_config, FAIL) - - if ( ( ext_conf_ptr == NULL ) || - ( ext_conf_ptr->version != H5AC2__CURR_CACHE_CONFIG_VERSION ) || - ( int_conf_ptr == NULL ) ) { - - } - - int_conf_ptr->version = H5C2__CURR_AUTO_SIZE_CTL_VER; - - if ( ext_conf_ptr->rpt_fcn_enabled ) { - - int_conf_ptr->rpt_fcn = H5C2_def_auto_resize_rpt_fcn; - - } else { - - int_conf_ptr->rpt_fcn = NULL; - } - - int_conf_ptr->set_initial_size = ext_conf_ptr->set_initial_size; - int_conf_ptr->initial_size = ext_conf_ptr->initial_size; - int_conf_ptr->min_clean_fraction = ext_conf_ptr->min_clean_fraction; - int_conf_ptr->max_size = ext_conf_ptr->max_size; - int_conf_ptr->min_size = ext_conf_ptr->min_size; - int_conf_ptr->epoch_length = - (int64_t)(ext_conf_ptr->epoch_length); - - int_conf_ptr->incr_mode = ext_conf_ptr->incr_mode; - int_conf_ptr->lower_hr_threshold = ext_conf_ptr->lower_hr_threshold; - int_conf_ptr->increment = ext_conf_ptr->increment; - int_conf_ptr->apply_max_increment = ext_conf_ptr->apply_max_increment; - int_conf_ptr->max_increment = ext_conf_ptr->max_increment; - int_conf_ptr->flash_incr_mode = ext_conf_ptr->flash_incr_mode; - int_conf_ptr->flash_multiple = ext_conf_ptr->flash_multiple; - int_conf_ptr->flash_threshold = ext_conf_ptr->flash_threshold; - - - int_conf_ptr->decr_mode = ext_conf_ptr->decr_mode; - int_conf_ptr->upper_hr_threshold = ext_conf_ptr->upper_hr_threshold; - int_conf_ptr->decrement = ext_conf_ptr->decrement; - int_conf_ptr->apply_max_decrement = ext_conf_ptr->apply_max_decrement; - int_conf_ptr->max_decrement = ext_conf_ptr->max_decrement; - int_conf_ptr->epochs_before_eviction = - (int32_t)(ext_conf_ptr->epochs_before_eviction); - int_conf_ptr->apply_empty_reserve = ext_conf_ptr->apply_empty_reserve; - int_conf_ptr->empty_reserve = ext_conf_ptr->empty_reserve; - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5AC2_ext_config_2_int_config() */ - - -/*------------------------------------------------------------------------- - * - * Function: H5AC2_log_deleted_entry() - * - * Purpose: Log an entry for which H5C2__DELETED_FLAG has been set. - * - * If mpi_rank is 0, we must make sure that the entry doesn't - * appear in the cleaned or dirty entry lists. Otherwise, - * we have nothing to do. - * - * Return SUCCEED on success, and FAIL on failure. - * - * Return: Non-negative on success/Negative on failure. - * - * Programmer: John Mainzer, 6/29/05 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -#ifdef H5_HAVE_PARALLEL -static herr_t -H5AC2_log_deleted_entry(H5AC2_t * cache_ptr, - H5AC2_info_t * entry_ptr, - haddr_t addr, - unsigned int flags) -{ - herr_t ret_value = SUCCEED; /* Return value */ - H5AC2_aux_t * aux_ptr = NULL; - H5AC2_slist_entry_t * slist_entry_ptr = NULL; - - FUNC_ENTER_NOAPI(H5AC2_log_deleted_entry, FAIL) - - HDassert( cache_ptr != NULL ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - - aux_ptr = cache_ptr->aux_ptr; - - HDassert( aux_ptr != NULL ); - HDassert( aux_ptr->magic == H5AC2__H5AC2_AUX_T_MAGIC ); - - HDassert( entry_ptr != NULL ); - HDassert( entry_ptr->addr == addr ); - - HDassert( (flags & H5C2__DELETED_FLAG) != 0 ); - - if ( aux_ptr->mpi_rank == 0 ) { - - HDassert( aux_ptr->d_slist_ptr != NULL ); - HDassert( aux_ptr->c_slist_ptr != NULL ); - - /* if the entry appears in the dirtied entry slist, remove it. */ - if ( (slist_entry_ptr = H5SL_search(aux_ptr->d_slist_ptr, - (void *)(&addr))) != NULL ) { - - HDassert( slist_entry_ptr->magic == - H5AC2__H5AC2_SLIST_ENTRY_T_MAGIC ); - HDassert( slist_entry_ptr->addr == addr ); - - if ( H5SL_remove(aux_ptr->d_slist_ptr, (void *)(&addr)) - != slist_entry_ptr ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTDELETE, FAIL, \ - "Can't delete entry from dirty entry slist.") - } - - slist_entry_ptr->magic = 0; - H5FL_FREE(H5AC2_slist_entry_t, slist_entry_ptr); - slist_entry_ptr = NULL; - - aux_ptr->d_slist_len -= 1; - - HDassert( aux_ptr->d_slist_len >= 0 ); - } - - /* if the entry appears in the cleaned entry slist, remove it. */ - if ( (slist_entry_ptr = H5SL_search(aux_ptr->c_slist_ptr, - (void *)(&addr))) != NULL ) { - - HDassert( slist_entry_ptr->magic == - H5AC2__H5AC2_SLIST_ENTRY_T_MAGIC ); - HDassert( slist_entry_ptr->addr == addr ); - - if ( H5SL_remove(aux_ptr->c_slist_ptr, (void *)(&addr)) - != slist_entry_ptr ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTDELETE, FAIL, \ - "Can't delete entry from cleaned entry slist.") - } - - slist_entry_ptr->magic = 0; - H5FL_FREE(H5AC2_slist_entry_t, slist_entry_ptr); - slist_entry_ptr = NULL; - - aux_ptr->c_slist_len -= 1; - - HDassert( aux_ptr->c_slist_len >= 0 ); - } - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5AC2_log_deleted_entry() */ -#endif /* H5_HAVE_PARALLEL */ - - -/*------------------------------------------------------------------------- - * - * Function: H5AC2_log_dirtied_entry() - * - * Purpose: Update the dirty_bytes count for a newly dirtied entry. - * - * If mpi_rank isnt 0, this simply means adding the size - * of the entries to the dirty_bytes count. - * - * If mpi_rank is 0, we must first check to see if the entry - * appears in the dirty entries slist. If it is, do nothing. - * If it isn't, add the size to th dirty_bytes count, add the - * entry to the dirty entries slist, and remove it from the - * cleaned list (if it is present there). - * - * Return SUCCEED on success, and FAIL on failure. - * - * Return: Non-negative on success/Negative on failure. - * - * Programmer: John Mainzer, 6/29/05 - * - *------------------------------------------------------------------------- - */ - -#ifdef H5_HAVE_PARALLEL -static herr_t -H5AC2_log_dirtied_entry(const H5AC2_info_t * entry_ptr, - haddr_t addr, - hbool_t size_changed, - size_t new_size) -{ - size_t entry_size; - H5AC2_t * cache_ptr; - H5AC2_aux_t * aux_ptr; - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5AC2_log_dirtied_entry, FAIL) - - HDassert( entry_ptr ); - HDassert( entry_ptr->addr == addr ); - HDassert( entry_ptr->is_dirty == FALSE ); - - cache_ptr = entry_ptr->cache_ptr; - - HDassert( cache_ptr != NULL ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - - aux_ptr = cache_ptr->aux_ptr; - - HDassert( aux_ptr != NULL ); - HDassert( aux_ptr->magic == H5AC2__H5AC2_AUX_T_MAGIC ); - - if ( size_changed ) { - - entry_size = new_size; - - } else { - - entry_size = entry_ptr->size; - } - - if ( aux_ptr->mpi_rank == 0 ) { - H5AC2_slist_entry_t * slist_entry_ptr; - - HDassert( aux_ptr->d_slist_ptr != NULL ); - HDassert( aux_ptr->c_slist_ptr != NULL ); - - if ( H5SL_search(aux_ptr->d_slist_ptr, (void *)(&addr)) == NULL ) { - - /* insert the address of the entry in the dirty entry list, and - * add its size to the dirty_bytes count. - */ - if ( NULL == (slist_entry_ptr = H5FL_CALLOC(H5AC2_slist_entry_t)) ) { - - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \ - "Can't allocate dirty slist entry .") - } - - slist_entry_ptr->magic = H5AC2__H5AC2_SLIST_ENTRY_T_MAGIC; - slist_entry_ptr->addr = addr; - - if ( H5SL_insert(aux_ptr->d_slist_ptr, slist_entry_ptr, - &(slist_entry_ptr->addr)) < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTINSERT, FAIL, \ - "can't insert entry into dirty entry slist.") - } - - aux_ptr->d_slist_len += 1; - aux_ptr->dirty_bytes += entry_size; -#if H5AC2_DEBUG_DIRTY_BYTES_CREATION - aux_ptr->unprotect_dirty_bytes += entry_size; - aux_ptr->unprotect_dirty_bytes_updates += 1; -#endif /* H5AC2_DEBUG_DIRTY_BYTES_CREATION */ - } - - if ( H5SL_search(aux_ptr->c_slist_ptr, (void *)(&addr)) != NULL ) { - - /* the entry is dirty. If it exists on the cleaned entries list, - * remove it. - */ - if ( (slist_entry_ptr = H5SL_search(aux_ptr->c_slist_ptr, - (void *)(&addr))) != NULL ) { - - HDassert( slist_entry_ptr->magic == - H5AC2__H5AC2_SLIST_ENTRY_T_MAGIC ); - HDassert( slist_entry_ptr->addr == addr ); - - if ( H5SL_remove(aux_ptr->c_slist_ptr, (void *)(&addr)) - != slist_entry_ptr ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTDELETE, FAIL, \ - "Can't delete entry from clean entry slist.") - } - - slist_entry_ptr->magic = 0; - H5FL_FREE(H5AC2_slist_entry_t, slist_entry_ptr); - slist_entry_ptr = NULL; - - aux_ptr->c_slist_len -= 1; - - HDassert( aux_ptr->c_slist_len >= 0 ); - } - } - } else { - - aux_ptr->dirty_bytes += entry_size; -#if H5AC2_DEBUG_DIRTY_BYTES_CREATION - aux_ptr->unprotect_dirty_bytes += entry_size; - aux_ptr->unprotect_dirty_bytes_updates += 1; -#endif /* H5AC2_DEBUG_DIRTY_BYTES_CREATION */ - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5AC2_log_dirtied_entry() */ -#endif /* H5_HAVE_PARALLEL */ - - -/*------------------------------------------------------------------------- - * - * Function: H5AC2_log_flushed_entry() - * - * Purpose: Update the clean entry slist for the flush of an entry -- - * specifically, if the entry has been cleared, remove it - * from both the cleaned and dirtied lists if it is present. - * Otherwise, if the entry was dirty, insert the indicated - * entry address in the clean slist if it isn't there already. - * - * This function is only used in PHDF5, and should only - * be called for the process with mpi rank 0. - * - * Return SUCCEED on success, and FAIL on failure. - * - * Return: Non-negative on success/Negative on failure. - * - * Programmer: John Mainzer, 6/29/05 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -#ifdef H5_HAVE_PARALLEL -#if 0 /* This is useful debugging code. -- JRM */ -static herr_t -H5AC2_log_flushed_entry_dummy(H5C2_t * cache_ptr, - haddr_t addr, - hbool_t was_dirty, - unsigned flags, - int type_id) -{ - herr_t ret_value = SUCCEED; /* Return value */ - H5AC2_aux_t * aux_ptr = NULL; - - FUNC_ENTER_NOAPI(H5AC2_log_flushed_entry_dummy, FAIL) - - aux_ptr = cache_ptr->aux_ptr; - - if ( ( was_dirty ) && ( (flags & H5C2__FLUSH_CLEAR_ONLY_FLAG) == 0 ) ) { - - HDfprintf(stdout, - "%d:H5AC2_log_flushed_entry(): addr = %d, flags = %x, was_dirty = %d, type_id = %d\n", - (int)(aux_ptr->mpi_rank), (int)addr, flags, (int)was_dirty, type_id); - } -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5AC2_log_flushed_entry_dummy() */ -#endif /* JRM */ - -static herr_t -H5AC2_log_flushed_entry(H5C2_t * cache_ptr, - haddr_t addr, - hbool_t was_dirty, - unsigned flags, - int UNUSED type_id) -{ - herr_t ret_value = SUCCEED; /* Return value */ - hbool_t cleared; - H5AC2_aux_t * aux_ptr; - H5AC2_slist_entry_t * slist_entry_ptr = NULL; - - - FUNC_ENTER_NOAPI(H5AC2_log_flushed_entry, FAIL) - - HDassert( cache_ptr != NULL ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - - aux_ptr = cache_ptr->aux_ptr; - - HDassert( aux_ptr != NULL ); - HDassert( aux_ptr->magic == H5AC2__H5AC2_AUX_T_MAGIC ); - HDassert( aux_ptr->mpi_rank == 0 ); - HDassert( aux_ptr->c_slist_ptr != NULL ); - - cleared = ( (flags & H5C2__FLUSH_CLEAR_ONLY_FLAG) != 0 ); - - if ( cleared ) { - - /* If the entry has been cleared, must remove it from both the - * cleaned list and the dirtied list. - */ - - if ( (slist_entry_ptr = H5SL_search(aux_ptr->c_slist_ptr, - (void *)(&addr))) != NULL ) { - - HDassert( slist_entry_ptr->magic == H5AC2__H5AC2_SLIST_ENTRY_T_MAGIC); - HDassert( slist_entry_ptr->addr == addr ); - - if ( H5SL_remove(aux_ptr->c_slist_ptr, (void *)(&addr)) - != slist_entry_ptr ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTDELETE, FAIL, \ - "Can't delete entry from clean entry slist.") - } - - slist_entry_ptr->magic = 0; - H5FL_FREE(H5AC2_slist_entry_t, slist_entry_ptr); - slist_entry_ptr = NULL; - - aux_ptr->c_slist_len -= 1; - - HDassert( aux_ptr->c_slist_len >= 0 ); - } - - if ( (slist_entry_ptr = H5SL_search(aux_ptr->d_slist_ptr, - (void *)(&addr))) != NULL ) { - - HDassert( slist_entry_ptr->magic == H5AC2__H5AC2_SLIST_ENTRY_T_MAGIC); - HDassert( slist_entry_ptr->addr == addr ); - - if ( H5SL_remove(aux_ptr->d_slist_ptr, (void *)(&addr)) - != slist_entry_ptr ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTDELETE, FAIL, \ - "Can't delete entry from dirty entry slist.") - } - - slist_entry_ptr->magic = 0; - H5FL_FREE(H5AC2_slist_entry_t, slist_entry_ptr); - slist_entry_ptr = NULL; - - aux_ptr->d_slist_len -= 1; - - HDassert( aux_ptr->d_slist_len >= 0 ); - } - } else if ( was_dirty ) { - - if ( H5SL_search(aux_ptr->c_slist_ptr, (void *)(&addr)) == NULL ) { - - /* insert the address of the entry in the clean entry list. */ - - if ( NULL == (slist_entry_ptr = H5FL_CALLOC(H5AC2_slist_entry_t)) ) { - - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \ - "Can't allocate clean slist entry .") - } - - slist_entry_ptr->magic = H5AC2__H5AC2_SLIST_ENTRY_T_MAGIC; - slist_entry_ptr->addr = addr; - - if ( H5SL_insert(aux_ptr->c_slist_ptr, slist_entry_ptr, - &(slist_entry_ptr->addr)) < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTINSERT, FAIL, \ - "can't insert entry into clean entry slist.") - } - - aux_ptr->c_slist_len += 1; - } - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5AC2_log_flushed_entry() */ -#endif /* H5_HAVE_PARALLEL */ - - -/*------------------------------------------------------------------------- - * - * Function: H5AC2_log_inserted_entry() - * - * Purpose: Update the dirty_bytes count for a newly inserted entry. - * - * If mpi_rank isnt 0, this simply means adding the size - * of the entry to the dirty_bytes count. - * - * If mpi_rank is 0, we must also add the entry to the - * dirty entries slist. - * - * Return SUCCEED on success, and FAIL on failure. - * - * Return: Non-negative on success/Negative on failure. - * - * Programmer: John Mainzer, 6/30/05 - * - * Modifications: - * - * JRM -- 10/24/07 - * Added the size parameter. - * - *------------------------------------------------------------------------- - */ - -#ifdef H5_HAVE_PARALLEL -static herr_t -H5AC2_log_inserted_entry(H5F_t * f, - H5AC2_t * cache_ptr, - H5AC2_info_t * entry_ptr, - const H5AC2_class_t * type, - haddr_t addr, - size_t size) -{ - herr_t ret_value = SUCCEED; /* Return value */ - H5AC2_aux_t * aux_ptr = NULL; - H5AC2_slist_entry_t * slist_entry_ptr = NULL; - - FUNC_ENTER_NOAPI(H5AC2_log_inserted_entry, FAIL) - - HDassert( cache_ptr != NULL ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - - aux_ptr = cache_ptr->aux_ptr; - - HDassert( aux_ptr != NULL ); - HDassert( aux_ptr->magic == H5AC2__H5AC2_AUX_T_MAGIC ); - - HDassert( entry_ptr != NULL ); - HDassert( entry_ptr->addr == addr ); - HDassert( entry_ptr->type == type ); - - if ( aux_ptr->mpi_rank == 0 ) { - - HDassert( aux_ptr->d_slist_ptr != NULL ); - HDassert( aux_ptr->c_slist_ptr != NULL ); - - if ( H5SL_search(aux_ptr->d_slist_ptr, (void *)(&addr)) == NULL ) { - - /* insert the address of the entry in the dirty entry list, and - * add its size to the dirty_bytes count. - */ - if ( NULL == (slist_entry_ptr = H5FL_CALLOC(H5AC2_slist_entry_t)) ) { - - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \ - "Can't allocate dirty slist entry .") - } - - slist_entry_ptr->magic = H5AC2__H5AC2_SLIST_ENTRY_T_MAGIC; - slist_entry_ptr->addr = addr; - - if ( H5SL_insert(aux_ptr->d_slist_ptr, slist_entry_ptr, - &(slist_entry_ptr->addr)) < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTINSERT, FAIL, \ - "can't insert entry into dirty entry slist.") - } - - aux_ptr->d_slist_len += 1; - - } else { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "Inserted entry already in dirty slist.") - } - - if ( H5SL_search(aux_ptr->c_slist_ptr, (void *)(&addr)) != NULL ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "Inserted entry in clean slist.") - } - } - - aux_ptr->dirty_bytes += size; - -#if H5AC2_DEBUG_DIRTY_BYTES_CREATION - aux_ptr->insert_dirty_bytes += size; - aux_ptr->insert_dirty_bytes_updates += 1; -#endif /* H5AC2_DEBUG_DIRTY_BYTES_CREATION */ - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5AC2_log_inserted_entry() */ -#endif /* H5_HAVE_PARALLEL */ - - -/*------------------------------------------------------------------------- - * - * Function: H5AC2_log_renamed_entry() - * - * Purpose: Update the dirty_bytes count for a renamed entry. - * - * WARNING - * - * At present, the way that the rename call is used ensures - * that the renamed entry is present in all caches by - * renaming in a collective operation and immediately after - * unprotecting the target entry. - * - * This function uses this invarient, and will cause arcane - * failures if it is not met. If maintaining this invarient - * becomes impossible, we will have to rework this function - * extensively, and likely include a bit of IPC for - * synchronization. A better option might be to subsume - * rename in the unprotect operation. - * - * Given that the target entry is in all caches, the function - * proceeds as follows: - * - * For processes with mpi rank other 0, it simply checks to - * see if the entry was dirty prior to the rename, and adds - * the entries size to the dirty bytes count. - * - * In the process with mpi rank 0, the function first checks - * to see if the entry was dirty prior to the rename. If it - * was, and if the entry doesn't appear in the dirtied list - * under its old address, it adds the entry's size to the - * dirty bytes count. - * - * The rank 0 process then removes any references to the - * entry under its old address from the cleands and dirtied - * lists, and inserts an entry in the dirtied list under the - * new address. - * - * Return SUCCEED on success, and FAIL on failure. - * - * Return: Non-negative on success/Negative on failure. - * - * Programmer: John Mainzer, 6/30/05 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -#ifdef H5_HAVE_PARALLEL -static herr_t -H5AC2_log_renamed_entry(H5F_t * f, - haddr_t old_addr, - haddr_t new_addr) -{ - herr_t ret_value = SUCCEED; /* Return value */ - H5AC2_t * cache_ptr; - hbool_t entry_in_cache; - hbool_t entry_dirty; - size_t entry_size; - H5AC2_aux_t * aux_ptr = NULL; - H5AC2_slist_entry_t * slist_entry_ptr = NULL; - - FUNC_ENTER_NOAPI(H5AC2_log_renamed_entry, FAIL) - - HDassert( f != NULL ); - HDassert( f->shared != NULL ); - - cache_ptr = (H5AC2_t *)f->shared->cache2; - - HDassert( cache_ptr != NULL ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - - aux_ptr = cache_ptr->aux_ptr; - - HDassert( aux_ptr != NULL ); - HDassert( aux_ptr->magic == H5AC2__H5AC2_AUX_T_MAGIC ); - - /* get entry status, size, etc here */ - if ( H5C2_get_entry_status(f, old_addr, &entry_size, &entry_in_cache, - &entry_dirty, NULL, NULL) < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't get entry status.") - - } else if ( ! entry_in_cache ) { - - HDassert( entry_in_cache ); - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "entry not in cache.") - } - - if ( aux_ptr->mpi_rank == 0 ) { - - HDassert( aux_ptr->d_slist_ptr != NULL ); - HDassert( aux_ptr->c_slist_ptr != NULL ); - - /* if the entry appears in the cleaned entry slist, under its old - * address, remove it. - */ - if ( (slist_entry_ptr = H5SL_search(aux_ptr->c_slist_ptr, - (void *)(&old_addr))) != NULL ) { - - HDassert( slist_entry_ptr->magic == - H5AC2__H5AC2_SLIST_ENTRY_T_MAGIC ); - HDassert( slist_entry_ptr->addr == old_addr ); - - if ( H5SL_remove(aux_ptr->c_slist_ptr, (void *)(&old_addr)) - != slist_entry_ptr ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTDELETE, FAIL, \ - "Can't delete entry from cleaned entry slist.") - } - - slist_entry_ptr->magic = 0; - H5FL_FREE(H5AC2_slist_entry_t, slist_entry_ptr); - slist_entry_ptr = NULL; - - aux_ptr->c_slist_len -= 1; - - HDassert( aux_ptr->c_slist_len >= 0 ); - } - - /* if the entry appears in the dirtied entry slist under its old - * address, remove it, but don't free it. Set addr to new_addr. - */ - if ( (slist_entry_ptr = H5SL_search(aux_ptr->d_slist_ptr, - (void *)(&old_addr))) != NULL ) { - - HDassert( slist_entry_ptr->magic == - H5AC2__H5AC2_SLIST_ENTRY_T_MAGIC ); - HDassert( slist_entry_ptr->addr == old_addr ); - - if ( H5SL_remove(aux_ptr->d_slist_ptr, (void *)(&old_addr)) - != slist_entry_ptr ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTDELETE, FAIL, \ - "Can't delete entry from dirty entry slist.") - } - - slist_entry_ptr->addr = new_addr; - - aux_ptr->d_slist_len -= 1; - - HDassert( aux_ptr->d_slist_len >= 0 ); - - } else { - - /* otherwise, allocate a new entry that is ready - * for insertion, and increment dirty_bytes. - * - * Note that the fact that the entry wasn't in the dirtied - * list under its old address implies that it must have - * been clean to start with. - */ - - HDassert( !entry_dirty ); - - if ( NULL == (slist_entry_ptr = H5FL_CALLOC(H5AC2_slist_entry_t)) ) { - - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \ - "Can't allocate dirty slist entry .") - } - - slist_entry_ptr->magic = H5AC2__H5AC2_SLIST_ENTRY_T_MAGIC; - slist_entry_ptr->addr = new_addr; - - aux_ptr->dirty_bytes += entry_size; - -#if H5AC2_DEBUG_DIRTY_BYTES_CREATION - aux_ptr->rename_dirty_bytes += entry_size; - aux_ptr->rename_dirty_bytes_updates += 1; -#endif /* H5AC2_DEBUG_DIRTY_BYTES_CREATION */ - } - - /* verify that there is no entry at new_addr in the dirty slist */ - if ( H5SL_search(aux_ptr->d_slist_ptr, (void *)(&new_addr)) != NULL ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "dirty slist already contains entry at new_addr.") - } - - /* insert / reinsert the entry in the dirty slist */ - if ( H5SL_insert(aux_ptr->d_slist_ptr, slist_entry_ptr, - &(slist_entry_ptr->addr)) < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTINSERT, FAIL, \ - "can't insert entry into dirty entry slist.") - } - - aux_ptr->d_slist_len += 1; - - } else if ( ! entry_dirty ) { - - aux_ptr->dirty_bytes += entry_size; - -#if H5AC2_DEBUG_DIRTY_BYTES_CREATION - aux_ptr->rename_dirty_bytes += entry_size; - aux_ptr->rename_dirty_bytes_updates += 1; -#endif /* H5AC2_DEBUG_DIRTY_BYTES_CREATION */ - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5AC2_log_renamed_entry() */ -#endif /* H5_HAVE_PARALLEL */ - - -/*------------------------------------------------------------------------- - * Function: H5AC2_propagate_flushed_and_still_clean_entries_list - * - * Purpose: In PHDF5, only the metadata cache with mpi rank 0 is allowed - * to write to file. All other metadata caches on processes - * with rank greater than 0 must retain dirty entries until - * they are notified that the entry is now clean. - * - * This function is the main routine for that proceedure. - * It must be called simultaniously on all processes that - * have the relevant file open. To this end, there must - * be a barrier immediately prior to this call. - * - * Typicaly, this will be done one of two ways: - * - * 1) Dirty byte creation exceeds some user specified value. - * - * While metadata reads may occur independently, all - * operations writing metadata must be collective. Thus - * all metadata caches see the same sequence of operations, - * and therefore the same dirty data creation. - * - * This fact is used to synchronize the caches for purposes - * of propagating the list of flushed and still clean - * entries, by simply calling this function from all - * caches whenever some user specified threshold on dirty - * data is exceeded. - * - * 2) Under direct user control -- this operation must be - * collective. - * - * The operations to be managed by this function are as - * follows: - * - * For the process with mpi rank 0: - * - * 1) Enable writes, flush the cache to its min clean size, - * and then disable writes again. - * - * 2) Load the contents of the flushed and still clean entries - * list (c_slist_ptr) into a buffer, and broadcast that - * buffer to all the other caches. - * - * 3) Clear the flushed and still clean entries list - * (c_slist_ptr). - * - * - * For all processes with mpi rank greater than 0: - * - * 1) Receive the flushed and still clean entries list broadcast - * - * 2) Mark the specified entries as clean. - * - * - * For all processes: - * - * 1) Reset the dirtied bytes count to 0. - * - * Return: Success: non-negative - * - * Failure: negative - * - * Programmer: John Mainzer - * July 5, 2005 - * - * Modifications: - * - * JRM -- 5/11/06 - * Added code to call the write_done callback. - * - *------------------------------------------------------------------------- - */ - -#ifdef H5_HAVE_PARALLEL -herr_t -H5AC2_propagate_flushed_and_still_clean_entries_list(H5F_t * f, - hid_t dxpl_id, - H5AC2_t * cache_ptr, - hbool_t do_barrier) -{ - herr_t ret_value = SUCCEED; /* Return value */ - herr_t result; - int mpi_code; - H5AC2_aux_t * aux_ptr = NULL; - - FUNC_ENTER_NOAPI(H5AC2_propagate_flushed_and_still_clean_entries_list, FAIL) - - HDassert( cache_ptr != NULL ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - - aux_ptr = (H5AC2_aux_t *)(cache_ptr->aux_ptr); - - HDassert( aux_ptr != NULL ); - HDassert( aux_ptr->magic == H5AC2__H5AC2_AUX_T_MAGIC ); - -#if H5AC2_DEBUG_DIRTY_BYTES_CREATION - HDfprintf(stdout, - "%d:H5AC2_propagate...:%d: (u/uu/i/iu/r/ru) = %d/%d/%d/%d/%d/%d\n", - (int)(aux_ptr->mpi_rank), - (int)(aux_ptr->dirty_bytes_propagations), - (int)(aux_ptr->unprotect_dirty_bytes), - (int)(aux_ptr->unprotect_dirty_bytes_updates), - (int)(aux_ptr->insert_dirty_bytes), - (int)(aux_ptr->insert_dirty_bytes_updates), - (int)(aux_ptr->rename_dirty_bytes), - (int)(aux_ptr->rename_dirty_bytes_updates)); -#endif /* H5AC2_DEBUG_DIRTY_BYTES_CREATION */ - - if ( do_barrier ) { - - /* to prevent "messages from the future" we must synchronize all - * processes before we start the flush. This synchronization may - * already be done -- hence the do_barrier parameter. - */ - - if ( MPI_SUCCESS != (mpi_code = MPI_Barrier(aux_ptr->mpi_comm)) ) { - - HMPI_GOTO_ERROR(FAIL, "MPI_Barrier failed", mpi_code) - } - } - - if ( aux_ptr->mpi_rank == 0 ) { - - aux_ptr->write_permitted = TRUE; - - result = H5C2_flush_to_min_clean(f, dxpl_id); - - aux_ptr->write_permitted = FALSE; - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "H5C2_flush_to_min_clean() failed.") - } - - if ( aux_ptr->write_done != NULL ) { - - (aux_ptr->write_done)(); - } - - if ( H5AC2_broadcast_clean_list(cache_ptr) < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "Can't broadcast clean slist.") - } - - HDassert( aux_ptr->c_slist_len == 0 ); - - } else { - - if ( H5AC2_receive_and_apply_clean_list(f, dxpl_id, - cache_ptr) < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "Can't receive and/or process clean slist broadcast.") - } - } - - aux_ptr->dirty_bytes = 0; -#if H5AC2_DEBUG_DIRTY_BYTES_CREATION - aux_ptr->dirty_bytes_propagations += 1; - aux_ptr->unprotect_dirty_bytes = 0; - aux_ptr->unprotect_dirty_bytes_updates = 0; - aux_ptr->insert_dirty_bytes = 0; - aux_ptr->insert_dirty_bytes_updates = 0; - aux_ptr->rename_dirty_bytes = 0; - aux_ptr->rename_dirty_bytes_updates = 0; -#endif /* H5AC2_DEBUG_DIRTY_BYTES_CREATION */ - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5AC2_propagate_flushed_and_still_clean_entries_list() */ -#endif /* H5_HAVE_PARALLEL */ - - -/*------------------------------------------------------------------------- - * - * Function: H5AC2_receive_and_apply_clean_list() - * - * Purpose: Receive the list of cleaned entries from process 0, - * and mark the specified entries as clean. - * - * This function must only be called by the process with - * MPI_rank greater than 0. - * - * Return SUCCEED on success, and FAIL on failure. - * - * Return: Non-negative on success/Negative on failure. - * - * Programmer: John Mainzer, 7/4/05 - * - * Modifications: - * - * JRM --10/24/07 - * Reworked parameter list in support of the revised cache - * API. - * - *------------------------------------------------------------------------- - */ - -#ifdef H5_HAVE_PARALLEL -static herr_t -H5AC2_receive_and_apply_clean_list(H5F_t * f, - hid_t dxpl_id, - H5AC2_t * cache_ptr) -{ - herr_t ret_value = SUCCEED; /* Return value */ - H5AC2_aux_t * aux_ptr = NULL; - haddr_t * haddr_buf_ptr = NULL; - MPI_Offset * MPI_Offset_buf_ptr = NULL; - size_t buf_size; - int i = 0; - int mpi_result; - int num_entries; - - FUNC_ENTER_NOAPI(H5AC2_receive_and_apply_clean_list, FAIL) - - HDassert( cache_ptr != NULL ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - - aux_ptr = (H5AC2_aux_t *)(cache_ptr->aux_ptr); - - HDassert( aux_ptr != NULL ); - HDassert( aux_ptr->magic == H5AC2__H5AC2_AUX_T_MAGIC ); - HDassert( aux_ptr->mpi_rank != 0 ); - - /* First receive the number of entries in the list so that we - * can set up a buffer to receive them. If there aren't - * any, we are done. - */ - mpi_result = MPI_Bcast(&num_entries, 1, MPI_INT, 0, aux_ptr->mpi_comm); - - if ( mpi_result != MPI_SUCCESS ) { - - HMPI_GOTO_ERROR(FAIL, "MPI_Bcast failed 1", mpi_result) - } - - if ( num_entries > 0 ) - { - /* allocate a buffers to store the list of entry base addresses in */ - - buf_size = sizeof(MPI_Offset) * (size_t)num_entries; - - MPI_Offset_buf_ptr = (MPI_Offset *)H5MM_malloc(buf_size); - - if ( MPI_Offset_buf_ptr == NULL ) { - - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \ - "memory allocation failed for receive buffer") - } - - haddr_buf_ptr = (haddr_t *)H5MM_malloc(sizeof(haddr_t) * - (size_t)num_entries); - - if ( haddr_buf_ptr == NULL ) { - - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \ - "memory allocation failed for haddr buffer") - } - - - /* Now receive the list of cleaned entries - * - * The peculiar structure of the following call to MPI_Bcast is - * due to MPI's (?) failure to believe in the MPI_Offset type. - * Thus the element type is MPI_BYTE, with size equal to the - * buf_size computed above. - */ - - mpi_result = MPI_Bcast((void *)MPI_Offset_buf_ptr, (int)buf_size, - MPI_BYTE, 0, aux_ptr->mpi_comm); - - if ( mpi_result != MPI_SUCCESS ) { - - HMPI_GOTO_ERROR(FAIL, "MPI_Bcast failed 2", mpi_result) - } - - - /* translate the MPI_Offsets to haddr_t */ - i = 0; - while ( i < num_entries ) - { - haddr_buf_ptr[i] = H5FD_mpi_MPIOff_to_haddr(MPI_Offset_buf_ptr[i]); - - if ( haddr_buf_ptr[i] == HADDR_UNDEF ) { - - HGOTO_ERROR(H5E_INTERNAL, H5E_BADRANGE, FAIL, \ - "can't convert MPI off to haddr") - } - - i++; - } - - - /* mark the indicated entries as clean */ - if ( H5C2_mark_entries_as_clean(f, dxpl_id, - (int32_t)num_entries, - &(haddr_buf_ptr[0])) < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "Can't mark entries clean.") - - } - } - -done: - - if ( MPI_Offset_buf_ptr != NULL ) { - - MPI_Offset_buf_ptr = - (MPI_Offset *)H5MM_xfree((void *)MPI_Offset_buf_ptr); - } - - if ( haddr_buf_ptr != NULL ) { - - haddr_buf_ptr = (haddr_t *)H5MM_xfree((void *)haddr_buf_ptr); - } - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5AC2_receive_and_apply_clean_list() */ - -#endif /* H5_HAVE_PARALLEL */ - diff --git a/src/H5AC2pkg.h b/src/H5AC2pkg.h deleted file mode 100644 index 0899f70..0000000 --- a/src/H5AC2pkg.h +++ /dev/null @@ -1,333 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * Copyright by the Board of Trustees of the University of Illinois. * - * All rights reserved. * - * * - * This file is part of HDF5. The full HDF5 copyright notice, including * - * terms governing use, modification, and redistribution, is contained in * - * the files COPYING and Copyright.html. COPYING can be found at the root * - * of the source code distribution tree; Copyright.html can be found at the * - * root level of an installed copy of the electronic HDF5 document set and * - * is linked from the top-level documents page. It can also be found at * - * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * - * access to either file, you may request a copy from help@hdfgroup.org. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* - * Programmer: John Mainzer -- 4/19/06 - * - * Purpose: This file contains declarations which are normally visible - * only within the H5AC2 package (just H5AC2.c at present). - * - * Source files outside the H5AC package should include - * H5ACprivate.h instead. - * - * The one exception to this rule is testpar/t_cache.c. The - * test code is easier to write if it can look at H5AC2_aux_t. - * Indeed, this is the main reason why this file was created. - * - * Modifications: - * - * JRM - 10/18/07 - * Copied H5ACpkg.h to H5AC2pkg.h and reworked - * to use H5C2 instead of H5C. All this is in support - * of cache API modifications needed for journaling. - * - */ - -#ifndef H5AC2_PACKAGE -#error "Do not include this file outside the H5AC2 package!" -#endif - -#ifndef _H5AC2pkg_H -#define _H5AC2pkg_H - -/* Get package's private header */ -#include "H5AC2private.h" /* Metadata cache */ - - -/* Get needed headers */ -#include "H5C2private.h" /* Cache */ -#include "H5SLprivate.h" /* Skip lists */ - - -#define H5AC2_DEBUG_DIRTY_BYTES_CREATION 0 - -/*------------------------------------------------------------------------- - * It is a bit difficult to set ranges of allowable values on the - * dirty_bytes_threshold field of H5AC2_aux_t. The following are - * probably broader than they should be. - *------------------------------------------------------------------------- - */ - -#define H5AC2__MIN_DIRTY_BYTES_THRESHOLD (int32_t) \ - (H5C2__MIN_MAX_CACHE_SIZE / 2) -#define H5AC2__DEFAULT_DIRTY_BYTES_THRESHOLD (256 * 1024) -#define H5AC2__MAX_DIRTY_BYTES_THRESHOLD (int32_t) \ - (H5C2__MAX_MAX_CACHE_SIZE / 4) - -/**************************************************************************** - * - * structure H5AC2_aux_t - * - * While H5AC2 has become a wrapper for the cache implemented in H5C2.c, there - * are some features of the metadata cache that are specific to it, and which - * therefore do not belong in the more generic H5C2 cache code. - * - * In particular, there is the matter of synchronizing writes from the - * metadata cache to disk in the PHDF5 case. - * - * Prior to this update, the presumption was that all metadata caches would - * write the same data at the same time since all operations modifying - * metadata must be performed collectively. Given this assumption, it was - * safe to allow only the writes from process 0 to actually make it to disk, - * while metadata writes from all other processes were discarded. - * - * Unfortunately, this presumption is in error as operations that read - * metadata need not be collective, but can change the location of dirty - * entries in the metadata cache LRU lists. This can result in the same - * metadata write operation triggering writes from the metadata caches on - * some processes, but not all (causing a hang), or in different sets of - * entries being written from different caches (potentially resulting in - * metadata corruption in the file). - * - * To deal with this issue, I decided to apply a paradigm shift to the way - * metadata is written to disk. - * - * With this set of changes, only the metadata cache on process 0 is able - * to write metadata to disk, although metadata caches on all other - * processes can read metadata from disk as before. - * - * To keep all the other caches from getting plugged up with dirty metadata, - * process 0 periodically broadcasts a list of entries that it has flushed - * since that last notice, and which are currently clean. The other caches - * mark these entries as clean as well, which allows them to evict the - * entries as needed. - * - * One obvious problem in this approach is synchronizing the broadcasts - * and receptions, as different caches may see different amounts of - * activity. - * - * The current solution is for the caches to track the number of bytes - * of newly generated dirty metadata, and to broadcast and receive - * whenever this value exceeds some user specified threshold. - * - * Maintaining this count is easy for all processes not on process 0 -- - * all that is necessary is to add the size of the entry to the total - * whenever there is an insertion, a rename of a previously clean entry, - * or whever a previously clean entry is marked dirty in an unprotect. - * - * On process 0, we have to be careful not to count dirty bytes twice. - * If an entry is marked dirty, flushed, and marked dirty again, all - * within a single reporting period, it only th first marking should - * be added to the dirty bytes generated tally, as that is all that - * the other processes will see. - * - * At present, this structure exists to maintain the fields needed to - * implement the above scheme, and thus is only used in the parallel - * case. However, other uses may arise in the future. - * - * Instance of this structure are associated with metadata caches via - * the aux_ptr field of H5C2_t (see H5C2pkg.h). The H5AC2 code is - * responsible for allocating, maintaining, and discarding instances - * of H5AC2_aux_t. - * - * The remainder of this header comments documents the individual fields - * of the structure. - * - * JRM - 6/27/05 - * - * magic: Unsigned 32 bit integer always set to - * H5AC2__H5AC2_AUX_T_MAGIC. This field is used to validate - * pointers to instances of H5AC2_aux_t. - * - * mpi_comm: MPI communicator associated with the file for which the - * cache has been created. - * - * mpi_rank: MPI rank of this process within mpi_comm. - * - * mpi_size: Number of processes in mpi_comm. - * - * write_permitted: Boolean flag used to control whether the cache - * is permitted to write to file. - * - * dirty_bytes_threshold: Integer field containing the dirty bytes - * generation threashold. Whenever dirty byte creation - * exceeds this value, the metadata cache on process 0 - * broadcasts a list of the entries it has flushed since - * the last broadcast (or since the beginning of execution) - * and which are currently clean (if they are still in the - * cache) - * - * Similarly, metadata caches on processes other than process - * 0 will attempt to receive a list of clean entries whenever - * the threshold is exceeded. - * - * dirty_bytes: Integer field containing the number of bytes of dirty - * metadata generated since the beginning of the computation, - * or (more typically) since the last clean entries list - * broadcast. This field is reset to zero after each such - * broadcast. - * - * dirty_bytes_propagations: This field only exists when the - * H5AC2_DEBUG_DIRTY_BYTES_CREATION #define is TRUE. - * - * It is used to track the number of times the cleaned list - * has been propagated from process 0 to the other - * processes. - * - * unprotect_dirty_bytes: This field only exists when the - * H5AC2_DEBUG_DIRTY_BYTES_CREATION #define is TRUE. - * - * It is used to track the number of dirty bytes created - * via unprotect operations since the last time the cleaned - * list was propagated. - * - * unprotect_dirty_bytes_updates: This field only exists when the - * H5AC2_DEBUG_DIRTY_BYTES_CREATION #define is TRUE. - * - * It is used to track the number of times dirty bytes have - * been created via unprotect operations since the last time - * the cleaned list was propagated. - * - * insert_dirty_bytes: This field only exists when the - * H5AC2_DEBUG_DIRTY_BYTES_CREATION #define is TRUE. - * - * It is used to track the number of dirty bytes created - * via insert operations since the last time the cleaned - * list was propagated. - * - * insert_dirty_bytes_updates: This field only exists when the - * H5AC2_DEBUG_DIRTY_BYTES_CREATION #define is TRUE. - * - * It is used to track the number of times dirty bytes have - * been created via insert operations since the last time - * the cleaned list was propagated. - * - * rename_dirty_bytes: This field only exists when the - * H5AC2_DEBUG_DIRTY_BYTES_CREATION #define is TRUE. - * - * It is used to track the number of dirty bytes created - * via rename operations since the last time the cleaned - * list was propagated. - * - * rename_dirty_bytes_updates: This field only exists when the - * H5AC2_DEBUG_DIRTY_BYTES_CREATION #define is TRUE. - * - * It is used to track the number of times dirty bytes have - * been created via rename operations since the last time - * the cleaned list was propagated. - * - * d_slist_ptr: Pointer to an instance of H5SL_t used to maintain a list - * of entries that have been dirtied since the last time they - * were listed in a clean entries broadcast. This list is - * only maintained by the metadata cache on process 0 -- it - * it used to maintain a view of the dirty entries as seen - * by the other caches, so as to keep the dirty bytes count - * in synchronization with them. - * - * Thus on process 0, the dirty_bytes count is incremented - * only if either - * - * 1) an entry is inserted in the metadata cache, or - * - * 2) a previously clean entry is renamed, and it does not - * already appear in the dirty entry list, or - * - * 3) a previously clean entry is unprotected with the - * dirtied flag set and the entry does not already appear - * in the dirty entry list. - * - * Entries are added to the dirty entry list whever they cause - * the dirty bytes count to be increased. They are removed - * when they appear in a clean entries broadcast. Note that - * renames must be reflected in the dirty entry list. - * - * To reitterate, this field is only used on process 0 -- it - * should be NULL on all other processes. - * - * d_slist_len: Integer field containing the number of entries in the - * dirty entry list. This field should always contain the - * value 0 on all processes other than process 0. It exists - * primarily for sanity checking. - * - * c_slist_ptr: Pointer to an instance of H5SL_t used to maintain a list - * of entries that were dirty, have been flushed - * to disk since the last clean entries broadcast, and are - * still clean. Since only process 0 can write to disk, this - * list only exists on process 0. - * - * In essence, this slist is used to assemble the contents of - * the next clean entries broadcast. The list emptied after - * each broadcast. - * - * c_slist_len: Integer field containing the number of entries in the clean - * entries list (*c_slist_ptr). This field should always - * contain the value 0 on all processes other than process 0. - * It exists primarily for sanity checking. - * - * write_done: In the parallel test bed, it is necessary to ensure that - * all writes to the server process from cache 0 complete - * before it enters the barrier call with the other caches. - * - * The write_done callback allows t_cache to do this without - * requiring an ACK on each write. Since these ACKs greatly - * increase the run time on some platforms, this is a - * significant optimization. - * - * This field must be set to NULL when the callback is not - * needed. - * - ****************************************************************************/ - -#ifdef H5_HAVE_PARALLEL - -#define H5AC2__H5AC2_AUX_T_MAGIC (unsigned)0x00D0A02 - -typedef struct H5AC2_aux_t -{ - uint32_t magic; - - MPI_Comm mpi_comm; - - int mpi_rank; - - int mpi_size; - - hbool_t write_permitted; - - int32_t dirty_bytes_threshold; - - int32_t dirty_bytes; - -#if H5AC2_DEBUG_DIRTY_BYTES_CREATION - - int32_t dirty_bytes_propagations; - - int32_t unprotect_dirty_bytes; - int32_t unprotect_dirty_bytes_updates; - - int32_t insert_dirty_bytes; - int32_t insert_dirty_bytes_updates; - - int32_t rename_dirty_bytes; - int32_t rename_dirty_bytes_updates; - -#endif /* H5AC2_DEBUG_DIRTY_BYTES_CREATION */ - - H5SL_t * d_slist_ptr; - - int32_t d_slist_len; - - H5SL_t * c_slist_ptr; - - int32_t c_slist_len; - - void (* write_done)(void); - -} H5AC2_aux_t; /* struct H5AC2_aux_t */ - -#endif /* H5_HAVE_PARALLEL */ - -#endif /* _H5AC2pkg_H */ - diff --git a/src/H5AC2private.h b/src/H5AC2private.h deleted file mode 100644 index abd12ed..0000000 --- a/src/H5AC2private.h +++ /dev/null @@ -1,393 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * Copyright by the Board of Trustees of the University of Illinois. * - * All rights reserved. * - * * - * This file is part of HDF5. The full HDF5 copyright notice, including * - * terms governing use, modification, and redistribution, is contained in * - * the files COPYING and Copyright.html. COPYING can be found at the root * - * of the source code distribution tree; Copyright.html can be found at the * - * root level of an installed copy of the electronic HDF5 document set and * - * is linked from the top-level documents page. It can also be found at * - * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * - * access to either file, you may request a copy from help@hdfgroup.org. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/*------------------------------------------------------------------------- - * - * Created: H5AC2private.h - * Jul 9 1997 - * Robb Matzke - * - * Purpose: Constants and typedefs available to the rest of the - * library. - * - * Modifications: JRM - 6/4/04 - * Complete re-write for a new caching algorithm - * located in H5C.c - * - * JRM - 10/18/07 - * Copied H5ACprivate.h to H5AC2private.h and reworked - * to use H5C2 instead of H5C. All this is in support - * of cache API modifications needed for journaling. - * - *------------------------------------------------------------------------- - */ - -#ifndef _H5AC2private_H -#define _H5AC2private_H - -#include "H5AC2public.h" /*public prototypes */ - -/* Pivate headers needed by this header */ -#include "H5private.h" /* Generic Functions */ -#include "H5C2private.h" /* Cache */ -#include "H5Fprivate.h" /* File access */ - -#ifdef H5_METADATA_TRACE_FILE -#define H5AC2__TRACE_FILE_ENABLED 1 -#else /* H5_METADATA_TRACE_FILE */ -#define H5AC2__TRACE_FILE_ENABLED 0 -#endif /* H5_METADATA_TRACE_FILE */ - -/* Types of metadata objects cached */ -typedef enum { - H5AC2_BT_ID = 0, /*B-tree nodes */ - H5AC2_SNODE_ID, /*symbol table nodes */ - H5AC2_LHEAP_PRFX_ID, /*local heap prefix */ - H5AC2_LHEAP_DBLK_ID, /*local heap data block */ - H5AC2_GHEAP_ID, /*global heap */ - H5AC2_OHDR_ID, /*object header */ - H5AC2_OHDR_CHK_ID, /*object header chunk */ - H5AC2_BT2_HDR_ID, /*v2 B-tree header */ - H5AC2_BT2_INT_ID, /*v2 B-tree internal node */ - H5AC2_BT2_LEAF_ID, /*v2 B-tree leaf node */ - H5AC2_FHEAP_HDR_ID, /*fractal heap header */ - H5AC2_FHEAP_DBLOCK_ID,/*fractal heap direct block */ - H5AC2_FHEAP_IBLOCK_ID,/*fractal heap indirect block */ - H5AC2_FSPACE_HDR_ID, /*free space header */ - H5AC2_FSPACE_SINFO_ID,/*free space sections */ - H5AC2_SOHM_TABLE_ID, /*shared object header message master table */ - H5AC2_SOHM_LIST_ID, /*shared message index stored as a list */ - H5AC2_TEST_ID, /*test entry -- not used for actual files */ - H5AC2_NTYPES /* Number of types, must be last */ -} H5AC2_type_t; - -/* H5AC2_DUMP_STATS_ON_CLOSE should always be FALSE when - * H5C2_COLLECT_CACHE_STATS is FALSE. - * - * When H5C2_COLLECT_CACHE_STATS is TRUE, H5AC2_DUMP_STATS_ON_CLOSE must - * be FALSE for "make check" to succeed, but may be set to TRUE at other - * times for debugging purposes. - * - * Hence the following, somewhat odd set of #defines. - */ -#if H5C2_COLLECT_CACHE_STATS - -#define H5AC2_DUMP_STATS_ON_CLOSE 0 - -#else /* H5C2_COLLECT_CACHE_STATS */ - -#define H5AC2_DUMP_STATS_ON_CLOSE 0 - -#endif /* H5C2_COLLECT_CACHE_STATS */ - -/* Default max metadata cache size and min clean size are give here. - * At present, these are the same as those given in H5C2private.h. - */ - -#define H5AC2__DEFAULT_MAX_CACHE_SIZE H5C2__DEFAULT_MAX_CACHE_SIZE -#define H5AC2__DEFAULT_MIN_CLEAN_SIZE H5C2__DEFAULT_MIN_CLEAN_SIZE - - -/* - * Class methods pertaining to caching. Each type of cached object will - * have a constant variable with permanent life-span that describes how - * to cache the object. That variable will be of type H5AC2_class_t and - * have the following required fields... - * - * LOAD: Loads an object from disk to memory. The function - * should allocate some data structure and return it. - * - * FLUSH: Writes some data structure back to disk. It would be - * wise for the data structure to include dirty flags to - * indicate whether it really needs to be written. This - * function is also responsible for freeing memory allocated - * by the LOAD method if the DEST argument is non-zero (by - * calling the DEST method). - * - * DEST: Just frees memory allocated by the LOAD method. - * - * CLEAR: Just marks object as non-dirty. - * - * SIZE: Report the size (on disk) of the specified cache object. - * Note that the space allocated on disk may not be contiguous. - */ - -#define H5AC2__SERIALIZE_RESIZED_FLAG H5C2__SERIALIZE_RESIZED_FLAG -#define H5AC2__SERIALIZE_RENAMED_FLAG H5C2__SERIALIZE_RENAMED_FLAG - -typedef H5C2_deserialize_func_t H5AC2_deserialize_func_t; -typedef H5C2_image_len_func_t H5AC2_image_len_func_t; -typedef H5C2_serialize_func_t H5AC2_serialize_func_t; -typedef H5C2_free_icr_func_t H5AC2_free_icr_func_t; -typedef H5C2_clear_dirty_bits_func_t H5AC2_clear_dirty_bits_func_t; - -typedef H5C2_class_t H5AC2_class_t; - - - -typedef H5C2_cache_entry_t H5AC2_info_t; - - -/*===----------------------------------------------------------------------=== - * Protect Types - *===----------------------------------------------------------------------=== - * - * These are for the wrapper functions to H5AC2_protect. They specify what - * type of operation you're planning on doing to the metadata. The - * Flexible Parallel HDF5 locking can then act accordingly. - */ - -typedef enum H5AC2_protect_t { - H5AC2_WRITE, /* Protect object for writing */ - H5AC2_READ /* Protect object for reading */ -} H5AC2_protect_t; - - -/* Typedef for metadata cache (defined in H5C2pkg.h) */ -typedef H5C2_t H5AC2_t; - -/* Metadata specific properties for FAPL */ -/* (Only used for parallel I/O) */ -#ifdef H5_HAVE_PARALLEL -/* Definitions for "block before metadata write" property */ -#define H5AC2_BLOCK_BEFORE_META_WRITE_NAME "H5AC2_block_before_meta_write" -#define H5AC2_BLOCK_BEFORE_META_WRITE_SIZE sizeof(unsigned) -#define H5AC2_BLOCK_BEFORE_META_WRITE_DEF 0 - -/* Definitions for "library internal" property */ -#define H5AC2_LIBRARY_INTERNAL_NAME "H5AC2_library_internal" -#define H5AC2_LIBRARY_INTERNAL_SIZE sizeof(unsigned) -#define H5AC2_LIBRARY_INTERNAL_DEF 0 -#endif /* H5_HAVE_PARALLEL */ - -/* Dataset transfer property list for flush calls */ -/* (Collective set, "block before metadata write" set and "library internal" set) */ -/* (Global variable declaration, definition is in H5AC2.c) */ -extern hid_t H5AC2_dxpl_id; - -/* Dataset transfer property list for independent metadata I/O calls */ -/* (just "library internal" set - i.e. independent transfer mode) */ -/* (Global variable declaration, definition is in H5AC2.c) */ -extern hid_t H5AC2_ind_dxpl_id; - - -/* Cache config field limit #defines */ - -#define H5AC2__MIN_JBRB_BUF_SIZE H5C2__MIN_JBRB_BUF_SIZE -#define H5AC2__MAX_JBRB_BUF_SIZE H5C2__MAX_JBRB_BUF_SIZE - -#define H5AC2__MIN_JBRB_NUM_BUFS H5C2__MIN_JBRB_NUM_BUFS -#define H5AC2__MAX_JBRB_NUM_BUFS H5C2__MAX_JBRB_NUM_BUFS - - -/* Default cache configuration. */ - -#define H5AC2__DEFAULT_CACHE_CONFIG \ -{ \ - /* int version = */ \ - H5AC2__CURR_CACHE_CONFIG_VERSION, \ - /* hbool_t rpt_fcn_enabled = */ FALSE, \ - /* hbool_t open_trace_file = */ FALSE, \ - /* hbool_t close_trace_file = */ FALSE, \ - /* char trace_file_name[] = */ "", \ - /* hbool_t evictions_enabled = */ TRUE, \ - /* hbool_t set_initial_size = */ TRUE, \ - /* size_t initial_size = */ ( 1 * 1024 * 1024 ), \ - /* double min_clean_fraction = */ 0.5, \ - /* size_t max_size = */ (16 * 1024 * 1024 ), \ - /* size_t min_size = */ ( 1 * 1024 * 1024 ), \ - /* long int epoch_length = */ 50000, \ - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, \ - /* double lower_hr_threshold = */ 0.9, \ - /* double increment = */ 2.0, \ - /* hbool_t apply_max_increment = */ TRUE, \ - /* size_t max_increment = */ (4 * 1024 * 1024), \ - /* enum H5C2_cache_flash_incr_mode */ \ - /* flash_incr_mode = */ H5C2_flash_incr__add_space, \ - /* double flash_multiple = */ 1.0, \ - /* double flash_threshold = */ 0.25, \ - /* enum H5C2_cache_decr_mode decr_mode = */ \ - H5C2_decr__age_out_with_threshold, \ - /* double upper_hr_threshold = */ 0.999, \ - /* double decrement = */ 0.9, \ - /* hbool_t apply_max_decrement = */ TRUE, \ - /* size_t max_decrement = */ (1 * 1024 * 1024), \ - /* int epochs_before_eviction = */ 3, \ - /* hbool_t apply_empty_reserve = */ TRUE, \ - /* double empty_reserve = */ 0.1, \ - /* int dirty_bytes_threshold = */ (256 * 1024) \ -} - - -/* Default journal configuration. */ - -#define H5AC2__DEFAULT_JNL_CONFIG \ -{ \ - /* int version = */ H5AC2__CURR_JNL_CONFIG_VER, \ - /* hbool_t enable_journaling = */ FALSE, \ - /* char journal_file_path[] = */ "", \ - /* hbool_t journal_recovered = */ FALSE, \ - /* size_t jbrb_buf_size = */ (8 * 1024), \ - /* int jbrb_num_bufs = */ 2, \ - /* hbool_t jbrb_use_aio = */ FALSE, \ - /* hbool_t jbrb_human_readable = */ TRUE \ -} - - -/* - * Library prototypes. - */ - -/* #defines of flags used in the flags parameters in some of the - * following function calls. Note that they are just copies of - * the equivalent flags from H5C2private.h. - */ - -#define H5AC2__NO_FLAGS_SET H5C2__NO_FLAGS_SET -#define H5AC2__SET_FLUSH_MARKER_FLAG H5C2__SET_FLUSH_MARKER_FLAG -#define H5AC2__DELETED_FLAG H5C2__DELETED_FLAG -#define H5AC2__DIRTIED_FLAG H5C2__DIRTIED_FLAG -#define H5AC2__SIZE_CHANGED_FLAG H5C2__SIZE_CHANGED_FLAG -#define H5AC2__PIN_ENTRY_FLAG H5C2__PIN_ENTRY_FLAG -#define H5AC2__UNPIN_ENTRY_FLAG H5C2__UNPIN_ENTRY_FLAG -#define H5AC2__FLUSH_INVALIDATE_FLAG H5C2__FLUSH_INVALIDATE_FLAG -#define H5AC2__FLUSH_CLEAR_ONLY_FLAG H5C2__FLUSH_CLEAR_ONLY_FLAG -#define H5AC2__FLUSH_MARKED_ENTRIES_FLAG H5C2__FLUSH_MARKED_ENTRIES_FLAG -#define H5AC2__FLUSH_IGNORE_PROTECTED_FLAG H5C2__FLUSH_IGNORE_PROTECTED_FLAG - - -/* #defines of flags used to report entry status in the - * H5AC2_get_entry_status() call. - */ - -#define H5AC2_ES__IN_CACHE 0x0001 -#define H5AC2_ES__IS_DIRTY 0x0002 -#define H5AC2_ES__IS_PROTECTED 0x0004 -#define H5AC2_ES__IS_PINNED 0x0008 - - -/* Forward declaration of structs used below */ -struct H5O_loc_t; /* Defined in H5Oprivate.h */ - -/* external function declarations: */ - -H5_DLL herr_t H5AC2_init(void); - -H5_DLL herr_t H5AC2_check_for_journaling(H5F_t * f, - hid_t dxpl_id, - H5C2_t * cache_ptr, - hbool_t journal_recovered); - -H5_DLL herr_t H5AC2_deregister_mdjsc_callback(H5F_t * file_ptr, - int32_t idx); - -H5_DLL herr_t H5AC2_create(H5F_t *f, - H5AC2_cache_config_t *config_ptr); - -H5_DLL herr_t H5AC2_begin_transaction(hid_t id, - hbool_t * do_transaction_ptr, - struct H5O_loc_t * id_oloc_ptr, - hbool_t * id_oloc_open_ptr, - hbool_t * transaction_begun_ptr, - uint64_t * trans_num_ptr, - const char * api_call_name); - -H5_DLL herr_t H5AC2_end_transaction(hbool_t do_transaction, - struct H5O_loc_t * id_oloc_ptr, - hbool_t id_oloc_open, - hbool_t transaction_begun, - hid_t dxpl_id, - uint64_t trans_num, - const char * api_call_name); - -H5_DLL herr_t H5AC2_get_entry_status(H5F_t * f, haddr_t addr, - unsigned * status_ptr); - -H5_DLL herr_t H5AC2_set(H5F_t *f, hid_t dxpl_id, const H5AC2_class_t *type, - haddr_t addr, size_t len, void *thing, - unsigned int flags); -H5_DLL herr_t H5AC2_pin_protected_entry(void * thing); -H5_DLL void * H5AC2_protect(H5F_t *f, hid_t dxpl_id, const H5AC2_class_t *type, - haddr_t addr, size_t len, void *udata, - H5AC2_protect_t rw); -H5_DLL herr_t H5AC2_resize_pinned_entry(void * thing, - size_t new_size); -H5_DLL herr_t H5AC2_unpin_entry(void * thing); -H5_DLL herr_t H5AC2_unprotect(H5F_t *f, hid_t dxpl_id, - const H5AC2_class_t *type, haddr_t addr, - size_t new_size, void *thing, unsigned flags); -H5_DLL herr_t H5AC2_flush(H5F_t *f, hid_t dxpl_id, unsigned flags); -H5_DLL herr_t H5AC2_mark_pinned_entry_dirty(void * thing, - hbool_t size_changed, - size_t new_size); -H5_DLL herr_t H5AC2_mark_pinned_or_protected_entry_dirty(void * thing); -H5_DLL herr_t H5AC2_rename(H5F_t *f, const H5AC2_class_t *type, - haddr_t old_addr, haddr_t new_addr); - -H5_DLL herr_t H5AC2_dest(H5F_t *f, hid_t dxpl_id); - -H5_DLL herr_t H5AC2_expunge_entry(H5F_t *f, hid_t dxpl_id, - const H5AC2_class_t *type, haddr_t addr); - -H5_DLL herr_t H5AC2_set_write_done_callback(H5C2_t * cache_ptr, - void (* write_done)(void)); -H5_DLL herr_t H5AC2_stats(const H5F_t *f); - -H5_DLL herr_t H5AC2_get_cache_auto_resize_config(const H5AC2_t * cache_ptr, - H5AC2_cache_config_t *config_ptr); - -H5_DLL herr_t H5AC2_get_cache_size(H5AC2_t * cache_ptr, - size_t * max_size_ptr, - size_t * min_clean_size_ptr, - size_t * cur_size_ptr, - int32_t * cur_num_entries_ptr); - -H5_DLL herr_t H5AC2_get_cache_hit_rate(H5AC2_t * cache_ptr, - double * hit_rate_ptr); - -H5_DLL herr_t H5AC2_get_jnl_config(H5AC2_t * cache_ptr, - H5AC2_jnl_config_t * config_ptr); - -H5_DLL herr_t H5AC2_register_mdjsc_callback(const H5F_t * file_ptr, - H5C2_mdj_status_change_func_t fcn_ptr, - void * data_ptr, - int32_t * idx_ptr, - H5C2_mdj_config_t * config_ptr); - -H5_DLL herr_t H5AC2_reset_cache_hit_rate_stats(H5AC2_t * cache_ptr); - -H5_DLL herr_t H5AC2_set_cache_auto_resize_config(H5C2_t * cache_ptr, - H5AC2_cache_config_t *config_ptr); - -H5_DLL herr_t H5AC2_set_jnl_config(H5F_t * f, - hid_t dxpl_id, - const H5AC2_jnl_config_t *config_ptr, - hbool_t initializing); - -H5_DLL herr_t H5AC2_validate_config(H5AC2_cache_config_t * config_ptr); - -H5_DLL herr_t H5AC2_validate_jnl_config(const H5AC2_jnl_config_t *config_ptr); - -H5_DLL hbool_t H5AC2_validate_jnl_config_ver(int version_num); - -H5_DLL hbool_t H5AC2_validate_cache_config_ver(int version_num); - -H5_DLL herr_t H5AC2_close_trace_file(H5AC2_t * cache_ptr); - -H5_DLL herr_t H5AC2_open_trace_file(H5AC2_t * cache_ptr, - const char * trace_file_name); - -#endif /* !_H5AC2private_H */ - diff --git a/src/H5AC2public.h b/src/H5AC2public.h deleted file mode 100644 index ac96b46..0000000 --- a/src/H5AC2public.h +++ /dev/null @@ -1,529 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * Copyright by the Board of Trustees of the University of Illinois. * - * All rights reserved. * - * * - * This file is part of HDF5. The full HDF5 copyright notice, including * - * terms governing use, modification, and redistribution, is contained in * - * the files COPYING and Copyright.html. COPYING can be found at the root * - * of the source code distribution tree; Copyright.html can be found at the * - * root level of an installed copy of the electronic HDF5 document set and * - * is linked from the top-level documents page. It can also be found at * - * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * - * access to either file, you may request a copy from help@hdfgroup.org. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/*------------------------------------------------------------------------- - * - * Created: H5AC2public.h - * Jul 10 1997 - * Robb Matzke - * - * Purpose: Public include file for cache functions. - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -#ifndef _H5AC2public_H -#define _H5AC2public_H - -/* Public headers needed by this file */ -#include "H5public.h" -#include "H5C2public.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/**************************************************************************** - * - * structure H5AC2_cache_config_t - * - * H5AC2_cache_config_t is a public structure intended for use in public APIs. - * At least in its initial incarnation, it is basicaly a copy of struct - * H5C2_auto_size_ctl_t, minus the report_fcn field, and plus the - * dirty_bytes_threshold field. - * - * The report_fcn field is omitted, as including it would require us to - * make H5C2_t structure public. - * - * The dirty_bytes_threshold field does not appear in H5C2_auto_size_ctl_t, - * as synchronization between caches on different processes is handled at - * the H5AC2 level, not at the level of H5C2. Note however that there is - * considerable interaction between this value and the other fields in this - * structure. - * - * Similarly, the open_trace_file, close_trace_file, and trace_file_name - * fields do not appear in H5C2_auto_size_ctl_t, as most trace file - * issues are handled at the H5AC2 level. The one exception is storage of - * the pointer to the trace file, which is handled by H5C2. - * - * The structure is in H5AC2public.h as we may wish to allow different - * configuration options for metadata and raw data caches. - * - * The fields of the structure are discussed individually below: - * - * version: Integer field containing the version number of this version - * of the H5AC2_cache_config_t structure. Any instance of - * H5AC2_cache_config_t passed to the cache must have a known - * version number, or an error will be flagged. - * - * rpt_fcn_enabled: Boolean field used to enable and disable the default - * reporting function. This function is invoked every time the - * automatic cache resize code is run, and reports on its activities. - * - * This is a debugging function, and should normally be turned off. - * - * open_trace_file: Boolean field indicating whether the trace_file_name - * field should be used to open a trace file for the cache. - * - * The trace file is a debuging feature that allow the capture of - * top level metadata cache requests for purposes of debugging and/or - * optimization. This field should normally be set to FALSE, as - * trace file collection imposes considerable overhead. - * - * This field should only be set to TRUE when the trace_file_name - * contains the full path of the desired trace file, and either - * there is no open trace file on the cache, or the close_trace_file - * field is also TRUE. - * - * close_trace_file: Boolean field indicating whether the current trace - * file (if any) should be closed. - * - * See the above comments on the open_trace_file field. This field - * should be set to FALSE unless there is an open trace file on the - * cache that you wish to close. - * - * trace_file_name: Full path of the trace file to be opened if the - * open_trace_file field is TRUE. - * - * In the parallel case, an ascii representation of the mpi rank of - * the process will be appended to the file name to yield a unique - * trace file name for each process. - * - * The length of the path must not exceed H5AC2__MAX_TRACE_FILE_NAME_LEN - * characters. - * - * evictions_enabled: Boolean field used to either report the current - * evictions enabled status of the cache, or to set the cache's - * evictions enabled status. - * - * In general, the metadata cache should always be allowed to - * evict entries. However, in some cases it is advantageous to - * disable evictions briefly, and thereby postpone metadata - * writes. However, this must be done with care, as the cache - * can grow quickly. If you do this, re-enable evictions as - * soon as possible and monitor cache size. - * - * At present, evictions can only be disabled if automatic - * cache resizing is also disabled (that is, ( incr_mode == - * H5C2_incr__off ) && ( decr_mode == H5C2_decr__off )). There - * is no logical reason why this should be so, but it simplifies - * implementation and testing, and I can't think of any reason - * why it would be desireable. If you can think of one, I'll - * revisit the issue. - * - * set_initial_size: Boolean flag indicating whether the size of the - * initial size of the cache is to be set to the value given in - * the initial_size field. If set_initial_size is FALSE, the - * initial_size field is ignored. - * - * initial_size: If enabled, this field contain the size the cache is - * to be set to upon receipt of this structure. Needless to say, - * initial_size must lie in the closed interval [min_size, max_size]. - * - * min_clean_fraction: double in the range 0 to 1 indicating the fraction - * of the cache that is to be kept clean. This field is only used - * in parallel mode. Typical values are 0.1 to 0.5. - * - * max_size: Maximum size to which the cache can be adjusted. The - * supplied value must fall in the closed interval - * [MIN_MAX_CACHE_SIZE, MAX_MAX_CACHE_SIZE]. Also, max_size must - * be greater than or equal to min_size. - * - * min_size: Minimum size to which the cache can be adjusted. The - * supplied value must fall in the closed interval - * [H5C2__MIN_MAX_CACHE_SIZE, H5C2__MAX_MAX_CACHE_SIZE]. Also, min_size - * must be less than or equal to max_size. - * - * epoch_length: Number of accesses on the cache over which to collect - * hit rate stats before running the automatic cache resize code, - * if it is enabled. - * - * At the end of an epoch, we discard prior hit rate data and start - * collecting afresh. The epoch_length must lie in the closed - * interval [H5C2__MIN_AR_EPOCH_LENGTH, H5C2__MAX_AR_EPOCH_LENGTH]. - * - * - * Cache size increase control fields: - * - * incr_mode: Instance of the H5C2_cache_incr_mode enumerated type whose - * value indicates how we determine whether the cache size should be - * increased. At present there are two possible values: - * - * H5C2_incr__off: Don't attempt to increase the size of the cache - * automatically. - * - * When this increment mode is selected, the remaining fields - * in the cache size increase section ar ignored. - * - * H5C2_incr__threshold: Attempt to increase the size of the cache - * whenever the average hit rate over the last epoch drops - * below the value supplied in the lower_hr_threshold - * field. - * - * Note that this attempt will fail if the cache is already - * at its maximum size, or if the cache is not already using - * all available space. - * - * Note that you must set decr_mode to H5C2_incr__off if you - * disable metadata cache entry evictions. - * - * lower_hr_threshold: Lower hit rate threshold. If the increment mode - * (incr_mode) is H5C2_incr__threshold and the hit rate drops below the - * value supplied in this field in an epoch, increment the cache size by - * size_increment. Note that cache size may not be incremented above - * max_size, and that the increment may be further restricted by the - * max_increment field if it is enabled. - * - * When enabled, this field must contain a value in the range [0.0, 1.0]. - * Depending on the incr_mode selected, it may also have to be less than - * upper_hr_threshold. - * - * increment: Double containing the multiplier used to derive the new - * cache size from the old if a cache size increment is triggered. - * The increment must be greater than 1.0, and should not exceed 2.0. - * - * The new cache size is obtained my multiplying the current max cache - * size by the increment, and then clamping to max_size and to stay - * within the max_increment as necessary. - * - * apply_max_increment: Boolean flag indicating whether the max_increment - * field should be used to limit the maximum cache size increment. - * - * max_increment: If enabled by the apply_max_increment field described - * above, this field contains the maximum number of bytes by which the - * cache size can be increased in a single re-size. - * - * flash_incr_mode: Instance of the H5C2_cache_flash_incr_mode enumerated - * type whose value indicates whether and by which algorithm we should - * make flash increases in the size of the cache to accomodate insertion - * of large entries and large increases in the size of a single entry. - * - * The addition of the flash increment mode was occasioned by performance - * problems that appear when a local heap is increased to a size in excess - * of the current cache size. While the existing re-size code dealt with - * this eventually, performance was very bad for the remainder of the - * epoch. - * - * At present, there are two possible values for the flash_incr_mode: - * - * H5C2_flash_incr__off: Don't perform flash increases in the size of - * the cache. - * - * H5C2_flash_incr__add_space: Let x be either the size of a newly - * newly inserted entry, or the number of bytes by which the - * size of an existing entry has been increased. - * - * If - * x > flash_threshold * current max cache size, - * - * increase the current maximum cache size by x * flash_multiple - * less any free space in the cache, and star a new epoch. For - * now at least, pay no attention to the maximum increment. - * - * In both of the above cases, the flash increment pays no attention to - * the maximum increment (at least in this first incarnation), but DOES - * stay within max_size. - * - * With a little thought, it should be obvious that the above flash - * 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 - * the max cache size to at least double to maintain acceptable - * performance, however the above flash increment algorithm will not be - * triggered. - * - * Hopefully, the add space algorithms detailed above will be sufficient - * for the performance problems encountered to date. However, we should - * expect to revisit the issue. - * - * flash_multiple: Double containing the multiple described above in the - * H5C2_flash_incr__add_space section of the discussion of the - * flash_incr_mode section. This field is ignored unless flash_incr_mode - * is H5C2_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_incr_mode is - * H5C2_flash_incr__add_space. - * - * - * Cache size decrease control fields: - * - * decr_mode: Instance of the H5C2_cache_decr_mode enumerated type whose - * value indicates how we determine whether the cache size should be - * decreased. At present there are four possibilities. - * - * H5C2_decr__off: Don't attempt to decrease the size of the cache - * automatically. - * - * When this increment mode is selected, the remaining fields - * in the cache size decrease section are ignored. - * - * H5C2_decr__threshold: Attempt to decrease the size of the cache - * whenever the average hit rate over the last epoch rises - * above the value supplied in the upper_hr_threshold - * field. - * - * H5C2_decr__age_out: At the end of each epoch, search the cache for - * entries that have not been accessed for at least the number - * of epochs specified in the epochs_before_eviction field, and - * evict these entries. Conceptually, the maximum cache size - * is then decreased to match the new actual cache size. However, - * this reduction may be modified by the min_size, the - * max_decrement, and/or the empty_reserve. - * - * H5C2_decr__age_out_with_threshold: Same as age_out, but we only - * attempt to reduce the cache size when the hit rate observed - * over the last epoch exceeds the value provided in the - * upper_hr_threshold field. - * - * Note that you must set decr_mode to H5C2_decr__off if you - * disable metadata cache entry evictions. - * - * upper_hr_threshold: Upper hit rate threshold. The use of this field - * varies according to the current decr_mode: - * - * H5C2_decr__off or H5C2_decr__age_out: The value of this field is - * ignored. - * - * H5C2_decr__threshold: If the hit rate exceeds this threshold in any - * epoch, attempt to decrement the cache size by size_decrement. - * - * Note that cache size may not be decremented below min_size. - * - * Note also that if the upper_threshold is 1.0, the cache size - * will never be reduced. - * - * H5C2_decr__age_out_with_threshold: If the hit rate exceeds this - * threshold in any epoch, attempt to reduce the cache size - * by evicting entries that have not been accessed for more - * than the specified number of epochs. - * - * decrement: This field is only used when the decr_mode is - * H5C2_decr__threshold. - * - * The field is a double containing the multiplier used to derive the - * new cache size from the old if a cache size decrement is triggered. - * The decrement must be in the range 0.0 (in which case the cache will - * try to contract to its minimum size) to 1.0 (in which case the - * cache will never shrink). - * - * apply_max_decrement: Boolean flag used to determine whether decrements - * in cache size are to be limited by the max_decrement field. - * - * max_decrement: Maximum number of bytes by which the cache size can be - * decreased in a single re-size. Note that decrements may also be - * restricted by the min_size of the cache, and (in age out modes) by - * the empty_reserve field. - * - * epochs_before_eviction: Integer field used in H5C2_decr__age_out and - * H5C2_decr__age_out_with_threshold decrement modes. - * - * This field contains the number of epochs an entry must remain - * unaccessed before it is evicted in an attempt to reduce the - * cache size. If applicable, this field must lie in the range - * [1, H5C2__MAX_EPOCH_MARKERS]. - * - * apply_empty_reserve: Boolean field controlling whether the empty_reserve - * field is to be used in computing the new cache size when the - * decr_mode is H5C2_decr__age_out or H5C2_decr__age_out_with_threshold. - * - * empty_reserve: To avoid a constant racheting down of cache size by small - * amounts in the H5C2_decr__age_out and H5C2_decr__age_out_with_threshold - * modes, this field allows one to require that any cache size - * reductions leave the specified fraction of unused space in the cache. - * - * The value of this field must be in the range [0.0, 1.0]. I would - * expect typical values to be in the range of 0.01 to 0.1. - * - * - * Parallel Configuration Fields: - * - * In PHDF5, all operations that modify metadata must be executed collectively. - * We used to think that this was enough to ensure consistency across the - * metadata caches, but since we allow processes to read metadata individually, - * the order of dirty entries in the LRU list can vary across processes, - * which can result in inconsistencies between the caches. - * - * To prevent this, only the metadata cache on process 0 is allowed to write - * to file, and then only after synchronizing with the other caches. After - * it writes entries to file, it sends the base addresses of the now clean - * entries to the other caches, so they can mark these entries clean as well. - * - * The different caches know when to synchronize caches by counting the - * number of bytes of dirty metadata created by the collective operations - * modifying metadata. Whenever this count exceeds a user specified - * threshold (see below), process 0 flushes down to its minimum clean size, - * and then sends the list of newly cleaned entries to the other caches. - * - * dirty_bytes_threshold: Threshold of dirty byte creation used to - * synchronize updates between caches. (See above for outline and - * motivation.) - * - * This value MUST be consistant across all processes accessing the - * file. This field is ignored unless HDF5 has been compiled for - * parallel. - * - ****************************************************************************/ - -#define H5AC2__CURR_CACHE_CONFIG_VERSION 1 -#define H5AC2__MAX_TRACE_FILE_NAME_LEN 1024 - -typedef struct H5AC2_cache_config_t -{ - /* general configuration fields: */ - int version; - - hbool_t rpt_fcn_enabled; - - hbool_t open_trace_file; - hbool_t close_trace_file; - char trace_file_name[H5AC2__MAX_TRACE_FILE_NAME_LEN+1]; - - hbool_t evictions_enabled; - - hbool_t set_initial_size; - size_t initial_size; - - double min_clean_fraction; - - size_t max_size; - size_t min_size; - - long int epoch_length; - - - /* size increase control fields: */ - enum H5C2_cache_incr_mode incr_mode; - - double lower_hr_threshold; - - double increment; - - hbool_t apply_max_increment; - size_t max_increment; - - enum H5C2_cache_flash_incr_mode flash_incr_mode; - double flash_multiple; - double flash_threshold; - - - /* size decrease control fields: */ - enum H5C2_cache_decr_mode decr_mode; - - double upper_hr_threshold; - - double decrement; - - hbool_t apply_max_decrement; - size_t max_decrement; - - int epochs_before_eviction; - - hbool_t apply_empty_reserve; - double empty_reserve; - - - /* parallel configuration fields: */ - int dirty_bytes_threshold; - -} H5AC2_cache_config_t; - - -/**************************************************************************** - * - * structure H5AC2_jnl_config_t - * - * H5AC2_jnl_config_t is a public structure intended for use in public APIs. - * At least in its initial incarnation, it is intended to package all the - * data needed to configure metadata journaling. In the future, we may - * use it to package configuration data for other types of journaling as well. - * - * The fields of the structure are discussed individually below. Note - * that the fields with the "jbrb_" prefix are used to configure the - * journal buffer ring buffer -- a ring buffer of buffers used to buffer - * output of journal messages. - * - * version: Integer field containing the version number of this version - * of the H5AC2_jnl_config_t structure. Any instance of - * H5AC2_cache_config_t passed to the cache must have a known - * version number, or an error will be flagged. - * - * enable_journaling: Boolean flag that is set to TRUE if journaling is - * to be enabled, and to FALSE otherwise. - * - * When the cache configuration is reported, this field is TRUE iff - * journaling is enabled. - * - * journal_file_path: Full path of the file to be used to store the - * metadata journal. This field is only defined if enable_journaling - * is TRUE. - * - * At present, the length of the journal file path is restricted to - * no more than H5AC2__MAX_JOURNAL_FILE_NAME_LEN. - * - * journal_recovered: Boolean flag use to indicate that we are opening - * a journaled file that was not closed correctly, and on which the - * journal recovery tool has been run. - * - * Unless you are the writer of a new journal recovery tool, you - * should always set this field to FALSE. - * - * jbrb_buf_size: size_t containing the size of each individual buffer - * in the journal buffer ring buffer. This size should be chosen - * to be some multiple of the block size used by the file system - * on which the journal file will be written. - * - * jbrb_num_bufs: Integer containing the number of buffers in the journal - * buffer ring buffer. If synchronous I/O is used, one or two buffers - * is sufficient. If asynchronous I/O is used, the number of buffers - * should be sufficiently large that a write on buffer is likely to - * complete before that buffer is needed again. - * - * jbrb_use_aio: Boolean flag indicating whether we should use - * asynchronous I/O for journal entry writes. - * - * jbrb_human_readable: Boolean flag which determines whether the journal - * file will be written in human readable form. In general, this - * field should be set to false, as the human readable journal - * file is at least twice a large as the machine readable version. - * - ****************************************************************************/ - -#define H5AC2__CURR_JNL_CONFIG_VER 1 -#define H5AC2__MAX_JOURNAL_FILE_NAME_LEN 1024 - -typedef struct H5AC2_jnl_config_t -{ - int version; - - /* metadata journaling configuration fields: */ - hbool_t enable_journaling; - char journal_file_path[H5AC2__MAX_JOURNAL_FILE_NAME_LEN + 1]; - hbool_t journal_recovered; - size_t jbrb_buf_size; - int jbrb_num_bufs; - hbool_t jbrb_use_aio; - hbool_t jbrb_human_readable; - -} H5AC2_jnl_config_t; - - -#ifdef __cplusplus -} -#endif -#endif diff --git a/src/H5ACpkg.h b/src/H5ACpkg.h new file mode 100644 index 0000000..30102a8 --- /dev/null +++ b/src/H5ACpkg.h @@ -0,0 +1,326 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * Copyright by the Board of Trustees of the University of Illinois. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * Programmer: John Mainzer -- 4/19/06 + * + * Purpose: This file contains declarations which are normally visible + * only within the H5AC package (just H5AC.c at present). + * + * Source files outside the H5AC package should include + * H5ACprivate.h instead. + * + * The one exception to this rule is testpar/t_cache.c. The + * test code is easier to write if it can look at H5AC_aux_t. + * Indeed, this is the main reason why this file was created. + * + */ + +#ifndef H5AC_PACKAGE +#error "Do not include this file outside the H5AC package!" +#endif + +#ifndef _H5ACpkg_H +#define _H5ACpkg_H + +/* Get package's private header */ +#include "H5ACprivate.h" /* Metadata cache */ + + +/* Get needed headers */ +#include "H5Cprivate.h" /* Cache */ +#include "H5SLprivate.h" /* Skip lists */ + + +#define H5AC_DEBUG_DIRTY_BYTES_CREATION 0 + +/*------------------------------------------------------------------------- + * It is a bit difficult to set ranges of allowable values on the + * dirty_bytes_threshold field of H5AC_aux_t. The following are + * probably broader than they should be. + *------------------------------------------------------------------------- + */ + +#define H5AC__MIN_DIRTY_BYTES_THRESHOLD (int32_t) \ + (H5C__MIN_MAX_CACHE_SIZE / 2) +#define H5AC__DEFAULT_DIRTY_BYTES_THRESHOLD (256 * 1024) +#define H5AC__MAX_DIRTY_BYTES_THRESHOLD (int32_t) \ + (H5C__MAX_MAX_CACHE_SIZE / 4) + +/**************************************************************************** + * + * structure H5AC_aux_t + * + * While H5AC has become a wrapper for the cache implemented in H5C.c, there + * are some features of the metadata cache that are specific to it, and which + * therefore do not belong in the more generic H5C cache code. + * + * In particular, there is the matter of synchronizing writes from the + * metadata cache to disk in the PHDF5 case. + * + * Prior to this update, the presumption was that all metadata caches would + * write the same data at the same time since all operations modifying + * metadata must be performed collectively. Given this assumption, it was + * safe to allow only the writes from process 0 to actually make it to disk, + * while metadata writes from all other processes were discarded. + * + * Unfortunately, this presumption is in error as operations that read + * metadata need not be collective, but can change the location of dirty + * entries in the metadata cache LRU lists. This can result in the same + * metadata write operation triggering writes from the metadata caches on + * some processes, but not all (causing a hang), or in different sets of + * entries being written from different caches (potentially resulting in + * metadata corruption in the file). + * + * To deal with this issue, I decided to apply a paradigm shift to the way + * metadata is written to disk. + * + * With this set of changes, only the metadata cache on process 0 is able + * to write metadata to disk, although metadata caches on all other + * processes can read metadata from disk as before. + * + * To keep all the other caches from getting plugged up with dirty metadata, + * process 0 periodically broadcasts a list of entries that it has flushed + * since that last notice, and which are currently clean. The other caches + * mark these entries as clean as well, which allows them to evict the + * entries as needed. + * + * One obvious problem in this approach is synchronizing the broadcasts + * and receptions, as different caches may see different amounts of + * activity. + * + * The current solution is for the caches to track the number of bytes + * of newly generated dirty metadata, and to broadcast and receive + * whenever this value exceeds some user specified threshold. + * + * Maintaining this count is easy for all processes not on process 0 -- + * all that is necessary is to add the size of the entry to the total + * whenever there is an insertion, a rename of a previously clean entry, + * or whever a previously clean entry is marked dirty in an unprotect. + * + * On process 0, we have to be careful not to count dirty bytes twice. + * If an entry is marked dirty, flushed, and marked dirty again, all + * within a single reporting period, it only th first marking should + * be added to the dirty bytes generated tally, as that is all that + * the other processes will see. + * + * At present, this structure exists to maintain the fields needed to + * implement the above scheme, and thus is only used in the parallel + * case. However, other uses may arise in the future. + * + * Instance of this structure are associated with metadata caches via + * the aux_ptr field of H5C_t (see H5Cpkg.h). The H5AC code is + * responsible for allocating, maintaining, and discarding instances + * of H5AC_aux_t. + * + * The remainder of this header comments documents the individual fields + * of the structure. + * + * JRM - 6/27/05 + * + * magic: Unsigned 32 bit integer always set to + * H5AC__H5AC_AUX_T_MAGIC. This field is used to validate + * pointers to instances of H5AC_aux_t. + * + * mpi_comm: MPI communicator associated with the file for which the + * cache has been created. + * + * mpi_rank: MPI rank of this process within mpi_comm. + * + * mpi_size: Number of processes in mpi_comm. + * + * write_permitted: Boolean flag used to control whether the cache + * is permitted to write to file. + * + * dirty_bytes_threshold: Integer field containing the dirty bytes + * generation threashold. Whenever dirty byte creation + * exceeds this value, the metadata cache on process 0 + * broadcasts a list of the entries it has flushed since + * the last broadcast (or since the beginning of execution) + * and which are currently clean (if they are still in the + * cache) + * + * Similarly, metadata caches on processes other than process + * 0 will attempt to receive a list of clean entries whenever + * the threshold is exceeded. + * + * dirty_bytes: Integer field containing the number of bytes of dirty + * metadata generated since the beginning of the computation, + * or (more typically) since the last clean entries list + * broadcast. This field is reset to zero after each such + * broadcast. + * + * dirty_bytes_propagations: This field only exists when the + * H5AC_DEBUG_DIRTY_BYTES_CREATION #define is TRUE. + * + * It is used to track the number of times the cleaned list + * has been propagated from process 0 to the other + * processes. + * + * unprotect_dirty_bytes: This field only exists when the + * H5AC_DEBUG_DIRTY_BYTES_CREATION #define is TRUE. + * + * It is used to track the number of dirty bytes created + * via unprotect operations since the last time the cleaned + * list was propagated. + * + * unprotect_dirty_bytes_updates: This field only exists when the + * H5AC_DEBUG_DIRTY_BYTES_CREATION #define is TRUE. + * + * It is used to track the number of times dirty bytes have + * been created via unprotect operations since the last time + * the cleaned list was propagated. + * + * insert_dirty_bytes: This field only exists when the + * H5AC_DEBUG_DIRTY_BYTES_CREATION #define is TRUE. + * + * It is used to track the number of dirty bytes created + * via insert operations since the last time the cleaned + * list was propagated. + * + * insert_dirty_bytes_updates: This field only exists when the + * H5AC_DEBUG_DIRTY_BYTES_CREATION #define is TRUE. + * + * It is used to track the number of times dirty bytes have + * been created via insert operations since the last time + * the cleaned list was propagated. + * + * rename_dirty_bytes: This field only exists when the + * H5AC_DEBUG_DIRTY_BYTES_CREATION #define is TRUE. + * + * It is used to track the number of dirty bytes created + * via rename operations since the last time the cleaned + * list was propagated. + * + * rename_dirty_bytes_updates: This field only exists when the + * H5AC_DEBUG_DIRTY_BYTES_CREATION #define is TRUE. + * + * It is used to track the number of times dirty bytes have + * been created via rename operations since the last time + * the cleaned list was propagated. + * + * d_slist_ptr: Pointer to an instance of H5SL_t used to maintain a list + * of entries that have been dirtied since the last time they + * were listed in a clean entries broadcast. This list is + * only maintained by the metadata cache on process 0 -- it + * it used to maintain a view of the dirty entries as seen + * by the other caches, so as to keep the dirty bytes count + * in synchronization with them. + * + * Thus on process 0, the dirty_bytes count is incremented + * only if either + * + * 1) an entry is inserted in the metadata cache, or + * + * 2) a previously clean entry is renamed, and it does not + * already appear in the dirty entry list, or + * + * 3) a previously clean entry is unprotected with the + * dirtied flag set and the entry does not already appear + * in the dirty entry list. + * + * Entries are added to the dirty entry list whever they cause + * the dirty bytes count to be increased. They are removed + * when they appear in a clean entries broadcast. Note that + * renames must be reflected in the dirty entry list. + * + * To reitterate, this field is only used on process 0 -- it + * should be NULL on all other processes. + * + * d_slist_len: Integer field containing the number of entries in the + * dirty entry list. This field should always contain the + * value 0 on all processes other than process 0. It exists + * primarily for sanity checking. + * + * c_slist_ptr: Pointer to an instance of H5SL_t used to maintain a list + * of entries that were dirty, have been flushed + * to disk since the last clean entries broadcast, and are + * still clean. Since only process 0 can write to disk, this + * list only exists on process 0. + * + * In essence, this slist is used to assemble the contents of + * the next clean entries broadcast. The list emptied after + * each broadcast. + * + * c_slist_len: Integer field containing the number of entries in the clean + * entries list (*c_slist_ptr). This field should always + * contain the value 0 on all processes other than process 0. + * It exists primarily for sanity checking. + * + * write_done: In the parallel test bed, it is necessary to ensure that + * all writes to the server process from cache 0 complete + * before it enters the barrier call with the other caches. + * + * The write_done callback allows t_cache to do this without + * requiring an ACK on each write. Since these ACKs greatly + * increase the run time on some platforms, this is a + * significant optimization. + * + * This field must be set to NULL when the callback is not + * needed. + * + ****************************************************************************/ + +#ifdef H5_HAVE_PARALLEL + +#define H5AC__H5AC_AUX_T_MAGIC (unsigned)0x00D0A02 + +typedef struct H5AC_aux_t +{ + uint32_t magic; + + MPI_Comm mpi_comm; + + int mpi_rank; + + int mpi_size; + + hbool_t write_permitted; + + int32_t dirty_bytes_threshold; + + int32_t dirty_bytes; + +#if H5AC_DEBUG_DIRTY_BYTES_CREATION + + int32_t dirty_bytes_propagations; + + int32_t unprotect_dirty_bytes; + int32_t unprotect_dirty_bytes_updates; + + int32_t insert_dirty_bytes; + int32_t insert_dirty_bytes_updates; + + int32_t rename_dirty_bytes; + int32_t rename_dirty_bytes_updates; + +#endif /* H5AC_DEBUG_DIRTY_BYTES_CREATION */ + + H5SL_t * d_slist_ptr; + + int32_t d_slist_len; + + H5SL_t * c_slist_ptr; + + int32_t c_slist_len; + + void (* write_done)(void); + +} H5AC_aux_t; /* struct H5AC_aux_t */ + +#endif /* H5_HAVE_PARALLEL */ + +#endif /* _H5ACpkg_H */ + diff --git a/src/H5ACprivate.h b/src/H5ACprivate.h new file mode 100644 index 0000000..0365317 --- /dev/null +++ b/src/H5ACprivate.h @@ -0,0 +1,393 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * Copyright by the Board of Trustees of the University of Illinois. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/*------------------------------------------------------------------------- + * + * Created: H5ACprivate.h + * Jul 9 1997 + * Robb Matzke + * + * Purpose: Constants and typedefs available to the rest of the + * library. + * + * Modifications: JRM - 6/4/04 + * Complete re-write for a new caching algorithm + * located in H5C.c + * + * JRM - 10/18/07 + * Copied H5ACprivate.h to H5ACprivate.h and reworked + * to use H5C instead of H5C. All this is in support + * of cache API modifications needed for journaling. + * + *------------------------------------------------------------------------- + */ + +#ifndef _H5ACprivate_H +#define _H5ACprivate_H + +#include "H5ACpublic.h" /*public prototypes */ + +/* Pivate headers needed by this header */ +#include "H5private.h" /* Generic Functions */ +#include "H5Cprivate.h" /* Cache */ +#include "H5Fprivate.h" /* File access */ + +#ifdef H5_METADATA_TRACE_FILE +#define H5AC__TRACE_FILE_ENABLED 1 +#else /* H5_METADATA_TRACE_FILE */ +#define H5AC__TRACE_FILE_ENABLED 0 +#endif /* H5_METADATA_TRACE_FILE */ + +/* Types of metadata objects cached */ +typedef enum { + H5AC_BT_ID = 0, /*B-tree nodes */ + H5AC_SNODE_ID, /*symbol table nodes */ + H5AC_LHEAP_PRFX_ID, /*local heap prefix */ + H5AC_LHEAP_DBLK_ID, /*local heap data block */ + H5AC_GHEAP_ID, /*global heap */ + H5AC_OHDR_ID, /*object header */ + H5AC_OHDR_CHK_ID, /*object header chunk */ + H5AC_BT2_HDR_ID, /*v2 B-tree header */ + H5AC_BT2_INT_ID, /*v2 B-tree internal node */ + H5AC_BT2_LEAF_ID, /*v2 B-tree leaf node */ + H5AC_FHEAP_HDR_ID, /*fractal heap header */ + H5AC_FHEAP_DBLOCK_ID,/*fractal heap direct block */ + H5AC_FHEAP_IBLOCK_ID,/*fractal heap indirect block */ + H5AC_FSPACE_HDR_ID, /*free space header */ + H5AC_FSPACE_SINFO_ID,/*free space sections */ + H5AC_SOHM_TABLE_ID, /*shared object header message master table */ + H5AC_SOHM_LIST_ID, /*shared message index stored as a list */ + H5AC_TEST_ID, /*test entry -- not used for actual files */ + H5AC_NTYPES /* Number of types, must be last */ +} H5AC_type_t; + +/* H5AC_DUMP_STATS_ON_CLOSE should always be FALSE when + * H5C_COLLECT_CACHE_STATS is FALSE. + * + * When H5C_COLLECT_CACHE_STATS is TRUE, H5AC_DUMP_STATS_ON_CLOSE must + * be FALSE for "make check" to succeed, but may be set to TRUE at other + * times for debugging purposes. + * + * Hence the following, somewhat odd set of #defines. + */ +#if H5C_COLLECT_CACHE_STATS + +#define H5AC_DUMP_STATS_ON_CLOSE 0 + +#else /* H5C_COLLECT_CACHE_STATS */ + +#define H5AC_DUMP_STATS_ON_CLOSE 0 + +#endif /* H5C_COLLECT_CACHE_STATS */ + +/* Default max metadata cache size and min clean size are give here. + * At present, these are the same as those given in H5Cprivate.h. + */ + +#define H5AC__DEFAULT_MAX_CACHE_SIZE H5C__DEFAULT_MAX_CACHE_SIZE +#define H5AC__DEFAULT_MIN_CLEAN_SIZE H5C__DEFAULT_MIN_CLEAN_SIZE + + +/* + * Class methods pertaining to caching. Each type of cached object will + * have a constant variable with permanent life-span that describes how + * to cache the object. That variable will be of type H5AC_class_t and + * have the following required fields... + * + * LOAD: Loads an object from disk to memory. The function + * should allocate some data structure and return it. + * + * FLUSH: Writes some data structure back to disk. It would be + * wise for the data structure to include dirty flags to + * indicate whether it really needs to be written. This + * function is also responsible for freeing memory allocated + * by the LOAD method if the DEST argument is non-zero (by + * calling the DEST method). + * + * DEST: Just frees memory allocated by the LOAD method. + * + * CLEAR: Just marks object as non-dirty. + * + * SIZE: Report the size (on disk) of the specified cache object. + * Note that the space allocated on disk may not be contiguous. + */ + +#define H5AC__SERIALIZE_RESIZED_FLAG H5C__SERIALIZE_RESIZED_FLAG +#define H5AC__SERIALIZE_RENAMED_FLAG H5C__SERIALIZE_RENAMED_FLAG + +typedef H5C_deserialize_func_t H5AC_deserialize_func_t; +typedef H5C_image_len_func_t H5AC_image_len_func_t; +typedef H5C_serialize_func_t H5AC_serialize_func_t; +typedef H5C_free_icr_func_t H5AC_free_icr_func_t; +typedef H5C_clear_dirty_bits_func_t H5AC_clear_dirty_bits_func_t; + +typedef H5C_class_t H5AC_class_t; + + + +typedef H5C_cache_entry_t H5AC_info_t; + + +/*===----------------------------------------------------------------------=== + * Protect Types + *===----------------------------------------------------------------------=== + * + * These are for the wrapper functions to H5AC_protect. They specify what + * type of operation you're planning on doing to the metadata. The + * Flexible Parallel HDF5 locking can then act accordingly. + */ + +typedef enum H5AC_protect_t { + H5AC_WRITE, /* Protect object for writing */ + H5AC_READ /* Protect object for reading */ +} H5AC_protect_t; + + +/* Typedef for metadata cache (defined in H5Cpkg.h) */ +typedef H5C_t H5AC_t; + +/* Metadata specific properties for FAPL */ +/* (Only used for parallel I/O) */ +#ifdef H5_HAVE_PARALLEL +/* Definitions for "block before metadata write" property */ +#define H5AC_BLOCK_BEFORE_META_WRITE_NAME "H5AC_block_before_meta_write" +#define H5AC_BLOCK_BEFORE_META_WRITE_SIZE sizeof(unsigned) +#define H5AC_BLOCK_BEFORE_META_WRITE_DEF 0 + +/* Definitions for "library internal" property */ +#define H5AC_LIBRARY_INTERNAL_NAME "H5AC_library_internal" +#define H5AC_LIBRARY_INTERNAL_SIZE sizeof(unsigned) +#define H5AC_LIBRARY_INTERNAL_DEF 0 +#endif /* H5_HAVE_PARALLEL */ + +/* Dataset transfer property list for flush calls */ +/* (Collective set, "block before metadata write" set and "library internal" set) */ +/* (Global variable declaration, definition is in H5AC.c) */ +extern hid_t H5AC_dxpl_id; + +/* Dataset transfer property list for independent metadata I/O calls */ +/* (just "library internal" set - i.e. independent transfer mode) */ +/* (Global variable declaration, definition is in H5AC.c) */ +extern hid_t H5AC_ind_dxpl_id; + + +/* Cache config field limit #defines */ + +#define H5AC__MIN_JBRB_BUF_SIZE H5C__MIN_JBRB_BUF_SIZE +#define H5AC__MAX_JBRB_BUF_SIZE H5C__MAX_JBRB_BUF_SIZE + +#define H5AC__MIN_JBRB_NUM_BUFS H5C__MIN_JBRB_NUM_BUFS +#define H5AC__MAX_JBRB_NUM_BUFS H5C__MAX_JBRB_NUM_BUFS + + +/* Default cache configuration. */ + +#define H5AC__DEFAULT_CACHE_CONFIG \ +{ \ + /* int version = */ \ + H5AC__CURR_CACHE_CONFIG_VERSION, \ + /* hbool_t rpt_fcn_enabled = */ FALSE, \ + /* hbool_t open_trace_file = */ FALSE, \ + /* hbool_t close_trace_file = */ FALSE, \ + /* char trace_file_name[] = */ "", \ + /* hbool_t evictions_enabled = */ TRUE, \ + /* hbool_t set_initial_size = */ TRUE, \ + /* size_t initial_size = */ ( 1 * 1024 * 1024 ), \ + /* double min_clean_fraction = */ 0.5, \ + /* size_t max_size = */ (16 * 1024 * 1024 ), \ + /* size_t min_size = */ ( 1 * 1024 * 1024 ), \ + /* long int epoch_length = */ 50000, \ + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, \ + /* double lower_hr_threshold = */ 0.9, \ + /* double increment = */ 2.0, \ + /* hbool_t apply_max_increment = */ TRUE, \ + /* size_t max_increment = */ (4 * 1024 * 1024), \ + /* enum H5C_cache_flash_incr_mode */ \ + /* flash_incr_mode = */ H5C_flash_incr__add_space, \ + /* double flash_multiple = */ 1.0, \ + /* double flash_threshold = */ 0.25, \ + /* enum H5C_cache_decr_mode decr_mode = */ \ + H5C_decr__age_out_with_threshold, \ + /* double upper_hr_threshold = */ 0.999, \ + /* double decrement = */ 0.9, \ + /* hbool_t apply_max_decrement = */ TRUE, \ + /* size_t max_decrement = */ (1 * 1024 * 1024), \ + /* int epochs_before_eviction = */ 3, \ + /* hbool_t apply_empty_reserve = */ TRUE, \ + /* double empty_reserve = */ 0.1, \ + /* int dirty_bytes_threshold = */ (256 * 1024) \ +} + + +/* Default journal configuration. */ + +#define H5AC__DEFAULT_JNL_CONFIG \ +{ \ + /* int version = */ H5AC__CURR_JNL_CONFIG_VER, \ + /* hbool_t enable_journaling = */ FALSE, \ + /* char journal_file_path[] = */ "", \ + /* hbool_t journal_recovered = */ FALSE, \ + /* size_t jbrb_buf_size = */ (8 * 1024), \ + /* int jbrb_num_bufs = */ 2, \ + /* hbool_t jbrb_use_aio = */ FALSE, \ + /* hbool_t jbrb_human_readable = */ TRUE \ +} + + +/* + * Library prototypes. + */ + +/* #defines of flags used in the flags parameters in some of the + * following function calls. Note that they are just copies of + * the equivalent flags from H5Cprivate.h. + */ + +#define H5AC__NO_FLAGS_SET H5C__NO_FLAGS_SET +#define H5AC__SET_FLUSH_MARKER_FLAG H5C__SET_FLUSH_MARKER_FLAG +#define H5AC__DELETED_FLAG H5C__DELETED_FLAG +#define H5AC__DIRTIED_FLAG H5C__DIRTIED_FLAG +#define H5AC__SIZE_CHANGED_FLAG H5C__SIZE_CHANGED_FLAG +#define H5AC__PIN_ENTRY_FLAG H5C__PIN_ENTRY_FLAG +#define H5AC__UNPIN_ENTRY_FLAG H5C__UNPIN_ENTRY_FLAG +#define H5AC__FLUSH_INVALIDATE_FLAG H5C__FLUSH_INVALIDATE_FLAG +#define H5AC__FLUSH_CLEAR_ONLY_FLAG H5C__FLUSH_CLEAR_ONLY_FLAG +#define H5AC__FLUSH_MARKED_ENTRIES_FLAG H5C__FLUSH_MARKED_ENTRIES_FLAG +#define H5AC__FLUSH_IGNORE_PROTECTED_FLAG H5C__FLUSH_IGNORE_PROTECTED_FLAG + + +/* #defines of flags used to report entry status in the + * H5AC_get_entry_status() call. + */ + +#define H5AC_ES__IN_CACHE 0x0001 +#define H5AC_ES__IS_DIRTY 0x0002 +#define H5AC_ES__IS_PROTECTED 0x0004 +#define H5AC_ES__IS_PINNED 0x0008 + + +/* Forward declaration of structs used below */ +struct H5O_loc_t; /* Defined in H5Oprivate.h */ + +/* external function declarations: */ + +H5_DLL herr_t H5AC_init(void); + +H5_DLL herr_t H5AC_check_for_journaling(H5F_t * f, + hid_t dxpl_id, + H5C_t * cache_ptr, + hbool_t journal_recovered); + +H5_DLL herr_t H5AC_deregister_mdjsc_callback(H5F_t * file_ptr, + int32_t idx); + +H5_DLL herr_t H5AC_create(H5F_t *f, + H5AC_cache_config_t *config_ptr); + +H5_DLL herr_t H5AC_begin_transaction(hid_t id, + hbool_t * do_transaction_ptr, + struct H5O_loc_t * id_oloc_ptr, + hbool_t * id_oloc_open_ptr, + hbool_t * transaction_begun_ptr, + uint64_t * trans_num_ptr, + const char * api_call_name); + +H5_DLL herr_t H5AC_end_transaction(hbool_t do_transaction, + struct H5O_loc_t * id_oloc_ptr, + hbool_t id_oloc_open, + hbool_t transaction_begun, + hid_t dxpl_id, + uint64_t trans_num, + const char * api_call_name); + +H5_DLL herr_t H5AC_get_entry_status(H5F_t * f, haddr_t addr, + unsigned * status_ptr); + +H5_DLL herr_t H5AC_set(H5F_t *f, hid_t dxpl_id, const H5AC_class_t *type, + haddr_t addr, size_t len, void *thing, + unsigned int flags); +H5_DLL herr_t H5AC_pin_protected_entry(void * thing); +H5_DLL void * H5AC_protect(H5F_t *f, hid_t dxpl_id, const H5AC_class_t *type, + haddr_t addr, size_t len, void *udata, + H5AC_protect_t rw); +H5_DLL herr_t H5AC_resize_pinned_entry(void * thing, + size_t new_size); +H5_DLL herr_t H5AC_unpin_entry(void * thing); +H5_DLL herr_t H5AC_unprotect(H5F_t *f, hid_t dxpl_id, + const H5AC_class_t *type, haddr_t addr, + size_t new_size, void *thing, unsigned flags); +H5_DLL herr_t H5AC_flush(H5F_t *f, hid_t dxpl_id, unsigned flags); +H5_DLL herr_t H5AC_mark_pinned_entry_dirty(void * thing, + hbool_t size_changed, + size_t new_size); +H5_DLL herr_t H5AC_mark_pinned_or_protected_entry_dirty(void * thing); +H5_DLL herr_t H5AC_rename(H5F_t *f, const H5AC_class_t *type, + haddr_t old_addr, haddr_t new_addr); + +H5_DLL herr_t H5AC_dest(H5F_t *f, hid_t dxpl_id); + +H5_DLL herr_t H5AC_expunge_entry(H5F_t *f, hid_t dxpl_id, + const H5AC_class_t *type, haddr_t addr); + +H5_DLL herr_t H5AC_set_write_done_callback(H5C_t * cache_ptr, + void (* write_done)(void)); +H5_DLL herr_t H5AC_stats(const H5F_t *f); + +H5_DLL herr_t H5AC_get_cache_auto_resize_config(const H5AC_t * cache_ptr, + H5AC_cache_config_t *config_ptr); + +H5_DLL herr_t H5AC_get_cache_size(H5AC_t * cache_ptr, + size_t * max_size_ptr, + size_t * min_clean_size_ptr, + size_t * cur_size_ptr, + int32_t * cur_num_entries_ptr); + +H5_DLL herr_t H5AC_get_cache_hit_rate(H5AC_t * cache_ptr, + double * hit_rate_ptr); + +H5_DLL herr_t H5AC_get_jnl_config(H5AC_t * cache_ptr, + H5AC_jnl_config_t * config_ptr); + +H5_DLL herr_t H5AC_register_mdjsc_callback(const H5F_t * file_ptr, + H5C_mdj_status_change_func_t fcn_ptr, + void * data_ptr, + int32_t * idx_ptr, + H5C_mdj_config_t * config_ptr); + +H5_DLL herr_t H5AC_reset_cache_hit_rate_stats(H5AC_t * cache_ptr); + +H5_DLL herr_t H5AC_set_cache_auto_resize_config(H5C_t * cache_ptr, + H5AC_cache_config_t *config_ptr); + +H5_DLL herr_t H5AC_set_jnl_config(H5F_t * f, + hid_t dxpl_id, + const H5AC_jnl_config_t *config_ptr, + hbool_t initializing); + +H5_DLL herr_t H5AC_validate_config(H5AC_cache_config_t * config_ptr); + +H5_DLL herr_t H5AC_validate_jnl_config(const H5AC_jnl_config_t *config_ptr); + +H5_DLL hbool_t H5AC_validate_jnl_config_ver(int version_num); + +H5_DLL hbool_t H5AC_validate_cache_config_ver(int version_num); + +H5_DLL herr_t H5AC_close_trace_file(H5AC_t * cache_ptr); + +H5_DLL herr_t H5AC_open_trace_file(H5AC_t * cache_ptr, + const char * trace_file_name); + +#endif /* !_H5ACprivate_H */ + diff --git a/src/H5ACpublic.h b/src/H5ACpublic.h new file mode 100644 index 0000000..e09e658 --- /dev/null +++ b/src/H5ACpublic.h @@ -0,0 +1,529 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * Copyright by the Board of Trustees of the University of Illinois. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/*------------------------------------------------------------------------- + * + * Created: H5ACpublic.h + * Jul 10 1997 + * Robb Matzke + * + * Purpose: Public include file for cache functions. + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +#ifndef _H5ACpublic_H +#define _H5ACpublic_H + +/* Public headers needed by this file */ +#include "H5public.h" +#include "H5Cpublic.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/**************************************************************************** + * + * structure H5AC_cache_config_t + * + * H5AC_cache_config_t is a public structure intended for use in public APIs. + * At least in its initial incarnation, it is basicaly a copy of struct + * H5C_auto_size_ctl_t, minus the report_fcn field, and plus the + * dirty_bytes_threshold field. + * + * The report_fcn field is omitted, as including it would require us to + * make H5C_t structure public. + * + * The dirty_bytes_threshold field does not appear in H5C_auto_size_ctl_t, + * as synchronization between caches on different processes is handled at + * the H5AC level, not at the level of H5C. Note however that there is + * considerable interaction between this value and the other fields in this + * structure. + * + * Similarly, the open_trace_file, close_trace_file, and trace_file_name + * fields do not appear in H5C_auto_size_ctl_t, as most trace file + * issues are handled at the H5AC level. The one exception is storage of + * the pointer to the trace file, which is handled by H5C. + * + * The structure is in H5ACpublic.h as we may wish to allow different + * configuration options for metadata and raw data caches. + * + * The fields of the structure are discussed individually below: + * + * version: Integer field containing the version number of this version + * of the H5AC_cache_config_t structure. Any instance of + * H5AC_cache_config_t passed to the cache must have a known + * version number, or an error will be flagged. + * + * rpt_fcn_enabled: Boolean field used to enable and disable the default + * reporting function. This function is invoked every time the + * automatic cache resize code is run, and reports on its activities. + * + * This is a debugging function, and should normally be turned off. + * + * open_trace_file: Boolean field indicating whether the trace_file_name + * field should be used to open a trace file for the cache. + * + * The trace file is a debuging feature that allow the capture of + * top level metadata cache requests for purposes of debugging and/or + * optimization. This field should normally be set to FALSE, as + * trace file collection imposes considerable overhead. + * + * This field should only be set to TRUE when the trace_file_name + * contains the full path of the desired trace file, and either + * there is no open trace file on the cache, or the close_trace_file + * field is also TRUE. + * + * close_trace_file: Boolean field indicating whether the current trace + * file (if any) should be closed. + * + * See the above comments on the open_trace_file field. This field + * should be set to FALSE unless there is an open trace file on the + * cache that you wish to close. + * + * trace_file_name: Full path of the trace file to be opened if the + * open_trace_file field is TRUE. + * + * In the parallel case, an ascii representation of the mpi rank of + * the process will be appended to the file name to yield a unique + * trace file name for each process. + * + * The length of the path must not exceed H5AC__MAX_TRACE_FILE_NAME_LEN + * characters. + * + * evictions_enabled: Boolean field used to either report the current + * evictions enabled status of the cache, or to set the cache's + * evictions enabled status. + * + * In general, the metadata cache should always be allowed to + * evict entries. However, in some cases it is advantageous to + * disable evictions briefly, and thereby postpone metadata + * writes. However, this must be done with care, as the cache + * can grow quickly. If you do this, re-enable evictions as + * soon as possible and monitor cache size. + * + * At present, evictions can only be disabled if automatic + * cache resizing is also disabled (that is, ( incr_mode == + * H5C_incr__off ) && ( decr_mode == H5C_decr__off )). There + * is no logical reason why this should be so, but it simplifies + * implementation and testing, and I can't think of any reason + * why it would be desireable. If you can think of one, I'll + * revisit the issue. + * + * set_initial_size: Boolean flag indicating whether the size of the + * initial size of the cache is to be set to the value given in + * the initial_size field. If set_initial_size is FALSE, the + * initial_size field is ignored. + * + * initial_size: If enabled, this field contain the size the cache is + * to be set to upon receipt of this structure. Needless to say, + * initial_size must lie in the closed interval [min_size, max_size]. + * + * min_clean_fraction: double in the range 0 to 1 indicating the fraction + * of the cache that is to be kept clean. This field is only used + * in parallel mode. Typical values are 0.1 to 0.5. + * + * max_size: Maximum size to which the cache can be adjusted. The + * supplied value must fall in the closed interval + * [MIN_MAX_CACHE_SIZE, MAX_MAX_CACHE_SIZE]. Also, max_size must + * be greater than or equal to min_size. + * + * min_size: Minimum size to which the cache can be adjusted. The + * supplied value must fall in the closed interval + * [H5C__MIN_MAX_CACHE_SIZE, H5C__MAX_MAX_CACHE_SIZE]. Also, min_size + * must be less than or equal to max_size. + * + * epoch_length: Number of accesses on the cache over which to collect + * hit rate stats before running the automatic cache resize code, + * if it is enabled. + * + * At the end of an epoch, we discard prior hit rate data and start + * collecting afresh. The epoch_length must lie in the closed + * interval [H5C__MIN_AR_EPOCH_LENGTH, H5C__MAX_AR_EPOCH_LENGTH]. + * + * + * Cache size increase control fields: + * + * incr_mode: Instance of the H5C_cache_incr_mode enumerated type whose + * value indicates how we determine whether the cache size should be + * increased. At present there are two possible values: + * + * H5C_incr__off: Don't attempt to increase the size of the cache + * automatically. + * + * When this increment mode is selected, the remaining fields + * in the cache size increase section ar ignored. + * + * H5C_incr__threshold: Attempt to increase the size of the cache + * whenever the average hit rate over the last epoch drops + * below the value supplied in the lower_hr_threshold + * field. + * + * Note that this attempt will fail if the cache is already + * at its maximum size, or if the cache is not already using + * all available space. + * + * Note that you must set decr_mode to H5C_incr__off if you + * disable metadata cache entry evictions. + * + * lower_hr_threshold: Lower hit rate threshold. If the increment mode + * (incr_mode) is H5C_incr__threshold and the hit rate drops below the + * value supplied in this field in an epoch, increment the cache size by + * size_increment. Note that cache size may not be incremented above + * max_size, and that the increment may be further restricted by the + * max_increment field if it is enabled. + * + * When enabled, this field must contain a value in the range [0.0, 1.0]. + * Depending on the incr_mode selected, it may also have to be less than + * upper_hr_threshold. + * + * increment: Double containing the multiplier used to derive the new + * cache size from the old if a cache size increment is triggered. + * The increment must be greater than 1.0, and should not exceed 2.0. + * + * The new cache size is obtained my multiplying the current max cache + * size by the increment, and then clamping to max_size and to stay + * within the max_increment as necessary. + * + * apply_max_increment: Boolean flag indicating whether the max_increment + * field should be used to limit the maximum cache size increment. + * + * max_increment: If enabled by the apply_max_increment field described + * above, this field contains the maximum number of bytes by which the + * cache size can be increased in a single re-size. + * + * flash_incr_mode: Instance of the H5C_cache_flash_incr_mode enumerated + * type whose value indicates whether and by which algorithm we should + * make flash increases in the size of the cache to accomodate insertion + * of large entries and large increases in the size of a single entry. + * + * The addition of the flash increment mode was occasioned by performance + * problems that appear when a local heap is increased to a size in excess + * of the current cache size. While the existing re-size code dealt with + * this eventually, performance was very bad for the remainder of the + * epoch. + * + * At present, there are two possible values for the flash_incr_mode: + * + * H5C_flash_incr__off: Don't perform flash increases in the size of + * the cache. + * + * H5C_flash_incr__add_space: Let x be either the size of a newly + * newly inserted entry, or the number of bytes by which the + * size of an existing entry has been increased. + * + * If + * x > flash_threshold * current max cache size, + * + * increase the current maximum cache size by x * flash_multiple + * less any free space in the cache, and star a new epoch. For + * now at least, pay no attention to the maximum increment. + * + * In both of the above cases, the flash increment pays no attention to + * the maximum increment (at least in this first incarnation), but DOES + * stay within max_size. + * + * With a little thought, it should be obvious that the above flash + * 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 + * the max cache size to at least double to maintain acceptable + * performance, however the above flash increment algorithm will not be + * triggered. + * + * Hopefully, the add space algorithms detailed above will be sufficient + * for the performance problems encountered to date. However, we should + * expect to revisit the issue. + * + * flash_multiple: Double containing the multiple described above in the + * H5C_flash_incr__add_space section of the discussion of the + * 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_incr_mode is + * H5C_flash_incr__add_space. + * + * + * Cache size decrease control fields: + * + * decr_mode: Instance of the H5C_cache_decr_mode enumerated type whose + * value indicates how we determine whether the cache size should be + * decreased. At present there are four possibilities. + * + * H5C_decr__off: Don't attempt to decrease the size of the cache + * automatically. + * + * When this increment mode is selected, the remaining fields + * in the cache size decrease section are ignored. + * + * H5C_decr__threshold: Attempt to decrease the size of the cache + * whenever the average hit rate over the last epoch rises + * above the value supplied in the upper_hr_threshold + * field. + * + * H5C_decr__age_out: At the end of each epoch, search the cache for + * entries that have not been accessed for at least the number + * of epochs specified in the epochs_before_eviction field, and + * evict these entries. Conceptually, the maximum cache size + * is then decreased to match the new actual cache size. However, + * this reduction may be modified by the min_size, the + * max_decrement, and/or the empty_reserve. + * + * H5C_decr__age_out_with_threshold: Same as age_out, but we only + * attempt to reduce the cache size when the hit rate observed + * over the last epoch exceeds the value provided in the + * upper_hr_threshold field. + * + * Note that you must set decr_mode to H5C_decr__off if you + * disable metadata cache entry evictions. + * + * upper_hr_threshold: Upper hit rate threshold. The use of this field + * varies according to the current decr_mode: + * + * H5C_decr__off or H5C_decr__age_out: The value of this field is + * ignored. + * + * H5C_decr__threshold: If the hit rate exceeds this threshold in any + * epoch, attempt to decrement the cache size by size_decrement. + * + * Note that cache size may not be decremented below min_size. + * + * Note also that if the upper_threshold is 1.0, the cache size + * will never be reduced. + * + * H5C_decr__age_out_with_threshold: If the hit rate exceeds this + * threshold in any epoch, attempt to reduce the cache size + * by evicting entries that have not been accessed for more + * than the specified number of epochs. + * + * decrement: This field is only used when the decr_mode is + * H5C_decr__threshold. + * + * The field is a double containing the multiplier used to derive the + * new cache size from the old if a cache size decrement is triggered. + * The decrement must be in the range 0.0 (in which case the cache will + * try to contract to its minimum size) to 1.0 (in which case the + * cache will never shrink). + * + * apply_max_decrement: Boolean flag used to determine whether decrements + * in cache size are to be limited by the max_decrement field. + * + * max_decrement: Maximum number of bytes by which the cache size can be + * decreased in a single re-size. Note that decrements may also be + * restricted by the min_size of the cache, and (in age out modes) by + * the empty_reserve field. + * + * epochs_before_eviction: Integer field used in H5C_decr__age_out and + * H5C_decr__age_out_with_threshold decrement modes. + * + * This field contains the number of epochs an entry must remain + * unaccessed before it is evicted in an attempt to reduce the + * cache size. If applicable, this field must lie in the range + * [1, H5C__MAX_EPOCH_MARKERS]. + * + * apply_empty_reserve: Boolean field controlling whether the empty_reserve + * field is to be used in computing the new cache size when the + * decr_mode is H5C_decr__age_out or H5C_decr__age_out_with_threshold. + * + * empty_reserve: To avoid a constant racheting down of cache size by small + * amounts in the H5C_decr__age_out and H5C_decr__age_out_with_threshold + * modes, this field allows one to require that any cache size + * reductions leave the specified fraction of unused space in the cache. + * + * The value of this field must be in the range [0.0, 1.0]. I would + * expect typical values to be in the range of 0.01 to 0.1. + * + * + * Parallel Configuration Fields: + * + * In PHDF5, all operations that modify metadata must be executed collectively. + * We used to think that this was enough to ensure consistency across the + * metadata caches, but since we allow processes to read metadata individually, + * the order of dirty entries in the LRU list can vary across processes, + * which can result in inconsistencies between the caches. + * + * To prevent this, only the metadata cache on process 0 is allowed to write + * to file, and then only after synchronizing with the other caches. After + * it writes entries to file, it sends the base addresses of the now clean + * entries to the other caches, so they can mark these entries clean as well. + * + * The different caches know when to synchronize caches by counting the + * number of bytes of dirty metadata created by the collective operations + * modifying metadata. Whenever this count exceeds a user specified + * threshold (see below), process 0 flushes down to its minimum clean size, + * and then sends the list of newly cleaned entries to the other caches. + * + * dirty_bytes_threshold: Threshold of dirty byte creation used to + * synchronize updates between caches. (See above for outline and + * motivation.) + * + * This value MUST be consistant across all processes accessing the + * file. This field is ignored unless HDF5 has been compiled for + * parallel. + * + ****************************************************************************/ + +#define H5AC__CURR_CACHE_CONFIG_VERSION 1 +#define H5AC__MAX_TRACE_FILE_NAME_LEN 1024 + +typedef struct H5AC_cache_config_t +{ + /* general configuration fields: */ + int version; + + hbool_t rpt_fcn_enabled; + + hbool_t open_trace_file; + hbool_t close_trace_file; + char trace_file_name[H5AC__MAX_TRACE_FILE_NAME_LEN+1]; + + hbool_t evictions_enabled; + + hbool_t set_initial_size; + size_t initial_size; + + double min_clean_fraction; + + size_t max_size; + size_t min_size; + + long int epoch_length; + + + /* size increase control fields: */ + enum H5C_cache_incr_mode incr_mode; + + double lower_hr_threshold; + + double increment; + + hbool_t apply_max_increment; + size_t max_increment; + + enum H5C_cache_flash_incr_mode flash_incr_mode; + double flash_multiple; + double flash_threshold; + + + /* size decrease control fields: */ + enum H5C_cache_decr_mode decr_mode; + + double upper_hr_threshold; + + double decrement; + + hbool_t apply_max_decrement; + size_t max_decrement; + + int epochs_before_eviction; + + hbool_t apply_empty_reserve; + double empty_reserve; + + + /* parallel configuration fields: */ + int dirty_bytes_threshold; + +} H5AC_cache_config_t; + + +/**************************************************************************** + * + * structure H5AC_jnl_config_t + * + * H5AC_jnl_config_t is a public structure intended for use in public APIs. + * At least in its initial incarnation, it is intended to package all the + * data needed to configure metadata journaling. In the future, we may + * use it to package configuration data for other types of journaling as well. + * + * The fields of the structure are discussed individually below. Note + * that the fields with the "jbrb_" prefix are used to configure the + * journal buffer ring buffer -- a ring buffer of buffers used to buffer + * output of journal messages. + * + * version: Integer field containing the version number of this version + * of the H5AC_jnl_config_t structure. Any instance of + * H5AC_cache_config_t passed to the cache must have a known + * version number, or an error will be flagged. + * + * enable_journaling: Boolean flag that is set to TRUE if journaling is + * to be enabled, and to FALSE otherwise. + * + * When the cache configuration is reported, this field is TRUE iff + * journaling is enabled. + * + * journal_file_path: Full path of the file to be used to store the + * metadata journal. This field is only defined if enable_journaling + * is TRUE. + * + * At present, the length of the journal file path is restricted to + * no more than H5AC__MAX_JOURNAL_FILE_NAME_LEN. + * + * journal_recovered: Boolean flag use to indicate that we are opening + * a journaled file that was not closed correctly, and on which the + * journal recovery tool has been run. + * + * Unless you are the writer of a new journal recovery tool, you + * should always set this field to FALSE. + * + * jbrb_buf_size: size_t containing the size of each individual buffer + * in the journal buffer ring buffer. This size should be chosen + * to be some multiple of the block size used by the file system + * on which the journal file will be written. + * + * jbrb_num_bufs: Integer containing the number of buffers in the journal + * buffer ring buffer. If synchronous I/O is used, one or two buffers + * is sufficient. If asynchronous I/O is used, the number of buffers + * should be sufficiently large that a write on buffer is likely to + * complete before that buffer is needed again. + * + * jbrb_use_aio: Boolean flag indicating whether we should use + * asynchronous I/O for journal entry writes. + * + * jbrb_human_readable: Boolean flag which determines whether the journal + * file will be written in human readable form. In general, this + * field should be set to false, as the human readable journal + * file is at least twice a large as the machine readable version. + * + ****************************************************************************/ + +#define H5AC__CURR_JNL_CONFIG_VER 1 +#define H5AC__MAX_JOURNAL_FILE_NAME_LEN 1024 + +typedef struct H5AC_jnl_config_t +{ + int version; + + /* metadata journaling configuration fields: */ + hbool_t enable_journaling; + char journal_file_path[H5AC__MAX_JOURNAL_FILE_NAME_LEN + 1]; + hbool_t journal_recovered; + size_t jbrb_buf_size; + int jbrb_num_bufs; + hbool_t jbrb_use_aio; + hbool_t jbrb_human_readable; + +} H5AC_jnl_config_t; + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/H5Adeprec.c b/src/H5Adeprec.c index 5a591df..2c0f7cc 100644 --- a/src/H5Adeprec.c +++ b/src/H5Adeprec.c @@ -43,7 +43,7 @@ /***********/ #include "H5private.h" /* Generic Functions */ #include "H5Apkg.h" /* Attributes */ -#include "H5AC2private.h" /* Metadata cache */ +#include "H5ACprivate.h" /* Metadata cache */ #include "H5Dprivate.h" /* Datasets */ #include "H5Eprivate.h" /* Error handling */ #include "H5Iprivate.h" /* IDs */ @@ -144,7 +144,7 @@ H5Acreate1(hid_t loc_id, const char *name, hid_t type_id, hid_t space_id, H5S_t *space; /* Dataspace to use for attribute */ hid_t ret_value; /* Return value */ - FUNC_ENTER_API_META(H5Acreate1, loc_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Acreate1, loc_id, H5AC_dxpl_id, FAIL) H5TRACE5("i", "i*siii", loc_id, name, type_id, space_id, plist_id); /* check arguments */ @@ -162,7 +162,7 @@ H5Acreate1(hid_t loc_id, const char *name, hid_t type_id, hid_t space_id, HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a data space") /* Go do the real work for attaching the attribute to the dataset */ - if((ret_value = H5A_create(&loc, name, type, space, plist_id, H5AC2_dxpl_id)) < 0) + if((ret_value = H5A_create(&loc, name, type, space, plist_id, H5AC_dxpl_id)) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "unable to create attribute") done: @@ -211,7 +211,7 @@ H5Aopen_name(hid_t loc_id, const char *name) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name") /* Open the attribute on the object header */ - if(NULL == (attr = H5A_open_by_name(&loc, ".", name, H5P_LINK_ACCESS_DEFAULT, H5AC2_ind_dxpl_id))) + if(NULL == (attr = H5A_open_by_name(&loc, ".", name, H5P_LINK_ACCESS_DEFAULT, H5AC_ind_dxpl_id))) HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "can't open attribute") /* Register the attribute and get an ID for it */ @@ -267,7 +267,7 @@ H5Aopen_idx(hid_t loc_id, unsigned idx) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location") /* Open the attribute in the object header */ - if(NULL == (attr = H5A_open_by_idx(&loc, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)idx, H5P_LINK_ACCESS_DEFAULT, H5AC2_ind_dxpl_id))) + if(NULL == (attr = H5A_open_by_idx(&loc, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)idx, H5P_LINK_ACCESS_DEFAULT, H5AC_ind_dxpl_id))) HGOTO_ERROR(H5E_ATTR, H5E_CANTOPENOBJ, FAIL, "unable to open attribute") /* Register the attribute and get an ID for it */ @@ -340,7 +340,7 @@ H5Aget_num_attrs(hid_t loc_id) } /*lint !e788 All appropriate cases are covered */ /* Look up the # of attributes for the object */ - if((ret_value = H5O_attr_count(loc, H5AC2_ind_dxpl_id)) < 0) + if((ret_value = H5O_attr_count(loc, H5AC_ind_dxpl_id)) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTCOUNT, FAIL, "can't get attribute count for object") done: @@ -406,7 +406,7 @@ H5Aiterate1(hid_t loc_id, unsigned *attr_num, H5A_operator1_t op, void *op_data) /* Call attribute iteration routine */ last_attr = start_idx = (hsize_t)(attr_num ? *attr_num : 0); - if((ret_value = H5O_attr_iterate(loc_id, H5AC2_ind_dxpl_id, H5_INDEX_CRT_ORDER, H5_ITER_INC, start_idx, &last_attr, &attr_op, op_data)) < 0) + if((ret_value = H5O_attr_iterate(loc_id, H5AC_ind_dxpl_id, H5_INDEX_CRT_ORDER, H5_ITER_INC, start_idx, &last_attr, &attr_op, op_data)) < 0) HERROR(H5E_ATTR, H5E_BADITER, "error iterating over attributes"); /* Set the last attribute information */ diff --git a/src/H5Atest.c b/src/H5Atest.c index 9864cc5..1fbaa42 100644 --- a/src/H5Atest.c +++ b/src/H5Atest.c @@ -37,7 +37,7 @@ /***********/ #include "H5private.h" /* Generic Functions */ #include "H5Apkg.h" /* Attributes */ -#include "H5AC2private.h" /* Metadata cache */ +#include "H5ACprivate.h" /* Metadata cache */ #include "H5Eprivate.h" /* Error handling */ #include "H5Iprivate.h" /* IDs */ #include "H5SMprivate.h" /* Shared object header messages */ @@ -140,7 +140,7 @@ H5A_get_shared_rc_test(hid_t attr_id, hsize_t *ref_count) HDassert(H5O_msg_is_shared(H5O_ATTR_ID, attr)); /* Retrieve ref count for shared or shareable attribute */ - if(H5SM_get_refcount(attr->shared->oloc.file, H5AC2_ind_dxpl_id, H5O_ATTR_ID, + if(H5SM_get_refcount(attr->shared->oloc.file, H5AC_ind_dxpl_id, H5O_ATTR_ID, &attr->sh_loc, ref_count) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTGET, FAIL, "can't retrieve shared message ref count") diff --git a/src/H5B.c b/src/H5B.c index 94d9938..0f32f0c 100644 --- a/src/H5B.c +++ b/src/H5B.c @@ -229,7 +229,7 @@ H5B_create(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, void *udata, */ if(NULL == (bt = H5FL_MALLOC(H5B_t))) HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, FAIL, "memory allocation failed for B-tree root node") - HDmemset(&bt->cache_info, 0, sizeof(H5AC2_info_t)); + HDmemset(&bt->cache_info, 0, sizeof(H5AC_info_t)); bt->level = 0; bt->left = HADDR_UNDEF; bt->right = HADDR_UNDEF; @@ -248,7 +248,7 @@ H5B_create(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, void *udata, /* * Cache the new B-tree node. */ - if(H5AC2_set(f, dxpl_id, H5AC2_BT, *addr_p, shared->sizeof_rnode, bt, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_set(f, dxpl_id, H5AC_BT, *addr_p, shared->sizeof_rnode, bt, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, FAIL, "can't add B-tree root node to cache") #ifdef H5B_DEBUG H5B_assert(f, dxpl_id, *addr_p, shared->type, udata); @@ -327,7 +327,7 @@ H5B_find(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr, void *u cache_udata.f = f; cache_udata.type = type; cache_udata.rc_shared = rc_shared; - if(NULL == (bt = (H5B_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT, addr, shared->sizeof_rnode, &cache_udata, H5AC2_READ))) + if(NULL == (bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, shared->sizeof_rnode, &cache_udata, H5AC_READ))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree node") rt = bt->nchildren; @@ -380,7 +380,7 @@ H5B_find(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr, void *u } done: - if(bt && H5AC2_unprotect(f, dxpl_id, H5AC2_BT, addr, (size_t)0, bt, H5AC2__NO_FLAGS_SET) < 0) + if(bt && H5AC_unprotect(f, dxpl_id, H5AC_BT, addr, (size_t)0, bt, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release node") FUNC_LEAVE_NOAPI(ret_value) @@ -416,7 +416,7 @@ H5B_split(H5F_t *f, hid_t dxpl_id, H5B_t *old_bt, unsigned *old_bt_flags, H5P_genplist_t *dx_plist; /* Data transfer property list */ H5B_shared_t *shared; /* Pointer to shared B-tree info */ H5B_cache_ud_t cache_udata; /* User-data for metadata cache callback */ - unsigned new_bt_flags = H5AC2__NO_FLAGS_SET; + unsigned new_bt_flags = H5AC__NO_FLAGS_SET; H5B_t *new_bt = NULL; unsigned nleft, nright; /* Number of keys in left & right halves */ double split_ratios[3]; /* B-tree split ratios */ @@ -498,7 +498,7 @@ H5B_split(H5F_t *f, hid_t dxpl_id, H5B_t *old_bt, unsigned *old_bt_flags, cache_udata.f = f; cache_udata.type = shared->type; cache_udata.rc_shared = old_bt->rc_shared; - if(NULL == (new_bt = (H5B_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT, *new_addr_p, shared->sizeof_rnode, &cache_udata, H5AC2_WRITE))) + if(NULL == (new_bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, *new_addr_p, shared->sizeof_rnode, &cache_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree") new_bt->level = old_bt->level; @@ -513,7 +513,7 @@ H5B_split(H5F_t *f, hid_t dxpl_id, H5B_t *old_bt, unsigned *old_bt_flags, * dirty again. * -- JRM */ - new_bt_flags |= H5AC2__DIRTIED_FLAG; + new_bt_flags |= H5AC__DIRTIED_FLAG; HDmemcpy(new_bt->native, old_bt->native + nleft * shared->type->sizeof_nkey, (nright + 1) * shared->type->sizeof_nkey); @@ -526,7 +526,7 @@ H5B_split(H5F_t *f, hid_t dxpl_id, H5B_t *old_bt, unsigned *old_bt_flags, /* * Truncate the old node. */ - *old_bt_flags |= H5AC2__DIRTIED_FLAG; + *old_bt_flags |= H5AC__DIRTIED_FLAG; old_bt->nchildren = nleft; /* @@ -542,19 +542,19 @@ H5B_split(H5F_t *f, hid_t dxpl_id, H5B_t *old_bt, unsigned *old_bt_flags, cache_udata2.f = f; cache_udata2.type = shared->type; cache_udata2.rc_shared = old_bt->rc_shared; - if(NULL == (tmp_bt = (H5B_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT, old_bt->right, shared->sizeof_rnode, &cache_udata2, H5AC2_WRITE))) + if(NULL == (tmp_bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, old_bt->right, shared->sizeof_rnode, &cache_udata2, H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load right sibling") tmp_bt->left = *new_addr_p; - if(H5AC2_unprotect(f, dxpl_id, H5AC2_BT, old_bt->right, (size_t)0, tmp_bt, H5AC2__DIRTIED_FLAG) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_BT, old_bt->right, (size_t)0, tmp_bt, H5AC__DIRTIED_FLAG) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node") } /* end if */ old_bt->right = *new_addr_p; done: - if(new_bt && H5AC2_unprotect(f, dxpl_id, H5AC2_BT, *new_addr_p, (size_t)0, new_bt, new_bt_flags) < 0) + if(new_bt && H5AC_unprotect(f, dxpl_id, H5AC_BT, *new_addr_p, (size_t)0, new_bt, new_bt_flags) < 0) HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node") FUNC_LEAVE_NOAPI(ret_value) @@ -623,7 +623,7 @@ H5B_insert(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr, cache_udata.f = f; cache_udata.type = type; cache_udata.rc_shared = rc_shared; - if(NULL == (bt = (H5B_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT, addr, shared->sizeof_rnode, &cache_udata, H5AC2_READ))) + if(NULL == (bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, shared->sizeof_rnode, &cache_udata, H5AC_READ))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to locate root of B-tree") level = bt->level; @@ -631,18 +631,18 @@ H5B_insert(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr, if(!lt_key_changed) HDmemcpy(lt_key, H5B_NKEY(bt,shared,0), type->sizeof_nkey); - if(H5AC2_unprotect(f, dxpl_id, H5AC2_BT, addr, (size_t)0, bt, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_BT, addr, (size_t)0, bt, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release new child") bt = NULL; /* the new node */ - if(NULL == (bt = (H5B_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT, child, shared->sizeof_rnode, &cache_udata, H5AC2_READ))) + if(NULL == (bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, child, shared->sizeof_rnode, &cache_udata, H5AC_READ))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load new node") if(!rt_key_changed) HDmemcpy(rt_key, H5B_NKEY(bt,shared,bt->nchildren), type->sizeof_nkey); - if(H5AC2_unprotect(f, dxpl_id, H5AC2_BT, child, (size_t)0, bt, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_BT, child, (size_t)0, bt, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release new child") bt = NULL; @@ -656,12 +656,12 @@ H5B_insert(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr, HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, FAIL, "unable to allocate file space to move root") /* update the new child's left pointer */ - if(NULL == (bt = (H5B_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT, child, shared->sizeof_rnode, &cache_udata, H5AC2_WRITE))) + if(NULL == (bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, child, shared->sizeof_rnode, &cache_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load new child") bt->left = old_root; - if(H5AC2_unprotect(f, dxpl_id, H5AC2_BT, child, (size_t)0, bt, H5AC2__DIRTIED_FLAG) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_BT, child, (size_t)0, bt, H5AC__DIRTIED_FLAG) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release new child") bt = NULL; /* Make certain future references will be caught */ @@ -670,7 +670,7 @@ H5B_insert(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr, * at the new location -QAK */ /* Bring the old root into the cache if it's not already */ - if(NULL == (bt = (H5B_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT, addr, shared->sizeof_rnode, &cache_udata, H5AC2_WRITE))) + if(NULL == (bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, shared->sizeof_rnode, &cache_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load new child") /* Make certain the old root info is marked as dirty before moving it, */ @@ -680,18 +680,18 @@ H5B_insert(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr, if(NULL == (new_bt = H5B_copy(bt))) { HCOMMON_ERROR(H5E_BTREE, H5E_CANTCOPY, "unable to copy old root"); - if(H5AC2_unprotect(f, dxpl_id, H5AC2_BT, addr, (size_t)0, bt, H5AC2__DIRTIED_FLAG) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_BT, addr, (size_t)0, bt, H5AC__DIRTIED_FLAG) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release new child") HGOTO_DONE(FAIL) } /* end if */ - if(H5AC2_unprotect(f, dxpl_id, H5AC2_BT, addr, (size_t)0, bt, H5AC2__DIRTIED_FLAG) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_BT, addr, (size_t)0, bt, H5AC__DIRTIED_FLAG) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release new child") bt = NULL; /* Make certain future references will be caught */ /* Move the location of the old root on the disk */ - if(H5AC2_rename(f, H5AC2_BT, addr, old_root) < 0) + if(H5AC_rename(f, H5AC_BT, addr, old_root) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTSPLIT, FAIL, "unable to move B-tree root node") /* clear the old root info at the old address (we already copied it) */ @@ -711,7 +711,7 @@ H5B_insert(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr, HDmemcpy(H5B_NKEY(new_bt,shared,2), rt_key, shared->type->sizeof_nkey); /* Insert the modified copy of the old root into the file again */ - if(H5AC2_set(f, dxpl_id, H5AC2_BT, addr, shared->sizeof_rnode, new_bt, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_set(f, dxpl_id, H5AC_BT, addr, shared->sizeof_rnode, new_bt, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTFLUSH, FAIL, "unable to flush old B-tree root node") #ifdef H5B_DEBUG @@ -789,7 +789,7 @@ H5B_insert_child(H5B_t *bt, unsigned *bt_flags, unsigned idx, bt->nchildren += 1; /* Mark node as dirty */ - *bt_flags |= H5AC2__DIRTIED_FLAG; + *bt_flags |= H5AC__DIRTIED_FLAG; FUNC_LEAVE_NOAPI(SUCCEED) } @@ -833,7 +833,7 @@ H5B_insert_helper(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type uint8_t *rt_key, hbool_t *rt_key_changed, haddr_t *new_node_p/*out*/) { - unsigned bt_flags = H5AC2__NO_FLAGS_SET, twin_flags = H5AC2__NO_FLAGS_SET; + unsigned bt_flags = H5AC__NO_FLAGS_SET, twin_flags = H5AC__NO_FLAGS_SET; H5B_t *bt = NULL, *twin = NULL; H5RC_t *rc_shared; /* Ref-counted shared info */ H5B_shared_t *shared; /* Pointer to shared B-tree info */ @@ -878,7 +878,7 @@ H5B_insert_helper(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type cache_udata.f = f; cache_udata.type = type; cache_udata.rc_shared = rc_shared; - if(NULL == (bt = (H5B_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT, addr, shared->sizeof_rnode, &cache_udata, H5AC2_WRITE))) + if(NULL == (bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, shared->sizeof_rnode, &cache_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, H5B_INS_ERROR, "unable to load node") rt = bt->nchildren; @@ -900,7 +900,7 @@ H5B_insert_helper(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type H5B_NKEY(bt, shared, 1), bt->child + 0/*out*/) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, H5B_INS_ERROR, "unable to create leaf node") bt->nchildren = 1; - bt_flags |= H5AC2__DIRTIED_FLAG; + bt_flags |= H5AC__DIRTIED_FLAG; idx = 0; if(type->follow_min) { @@ -1011,14 +1011,14 @@ H5B_insert_helper(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type * Update the left and right keys of the current node. */ if(*lt_key_changed) { - bt_flags |= H5AC2__DIRTIED_FLAG; + bt_flags |= H5AC__DIRTIED_FLAG; if(idx > 0) *lt_key_changed = FALSE; else HDmemcpy(lt_key, H5B_NKEY(bt, shared, idx), type->sizeof_nkey); } /* end if */ if(*rt_key_changed) { - bt_flags |= H5AC2__DIRTIED_FLAG; + bt_flags |= H5AC__DIRTIED_FLAG; if(idx + 1 < bt->nchildren) *rt_key_changed = FALSE; else @@ -1029,7 +1029,7 @@ H5B_insert_helper(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type * The insertion simply changed the address for the child. */ bt->child[idx] = child_addr; - bt_flags |= H5AC2__DIRTIED_FLAG; + bt_flags |= H5AC__DIRTIED_FLAG; ret_value = H5B_INS_NOOP; } else if(H5B_INS_LEFT == my_ins || H5B_INS_RIGHT == my_ins) { hbool_t *tmp_bt_flags_ptr = NULL; @@ -1041,7 +1041,7 @@ H5B_insert_helper(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type if(bt->nchildren == shared->two_k) { if(H5B_split(f, dxpl_id, bt, &bt_flags, addr, idx, udata, new_node_p/*out*/) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTSPLIT, H5B_INS_ERROR, "unable to split node") - if(NULL == (twin = (H5B_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT, *new_node_p, shared->sizeof_rnode, &cache_udata, H5AC2_WRITE))) + if(NULL == (twin = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, *new_node_p, shared->sizeof_rnode, &cache_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, H5B_INS_ERROR, "unable to load node") if(idx < bt->nchildren) { tmp_bt = bt; @@ -1084,8 +1084,8 @@ H5B_insert_helper(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type done: { - herr_t e1 = (bt && H5AC2_unprotect(f, dxpl_id, H5AC2_BT, addr, (size_t)0, bt, bt_flags) < 0); - herr_t e2 = (twin && H5AC2_unprotect(f, dxpl_id, H5AC2_BT, *new_node_p, (size_t)0, twin, twin_flags) < 0); + herr_t e1 = (bt && H5AC_unprotect(f, dxpl_id, H5AC_BT, addr, (size_t)0, bt, bt_flags) < 0); + herr_t e2 = (twin && H5AC_unprotect(f, dxpl_id, H5AC_BT, *new_node_p, (size_t)0, twin, twin_flags) < 0); if(e1 || e2) /*use vars to prevent short-circuit of side effects */ HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, H5B_INS_ERROR, "unable to release node(s)") } @@ -1141,14 +1141,14 @@ H5B_iterate_helper(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t add cache_udata.f = f; cache_udata.type = type; cache_udata.rc_shared = rc_shared; - if(NULL == (bt = (H5B_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT, addr, shared->sizeof_rnode, &cache_udata, H5AC2_READ))) + if(NULL == (bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, shared->sizeof_rnode, &cache_udata, H5AC_READ))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, H5_ITER_ERROR, "unable to load B-tree node") if(bt->level > 0) { haddr_t left_child = bt->child[0]; /* Address of left-most child in node */ /* Release current node */ - if(H5AC2_unprotect(f, dxpl_id, H5AC2_BT, addr, (size_t)0, bt, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_BT, addr, (size_t)0, bt, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, H5_ITER_ERROR, "unable to release B-tree node") bt = NULL; @@ -1175,7 +1175,7 @@ H5B_iterate_helper(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t add HDmemcpy(child, bt->child, (nchildren * sizeof(haddr_t))); /* Release current node */ - if(H5AC2_unprotect(f, dxpl_id, H5AC2_BT, addr, (size_t)0, bt, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_BT, addr, (size_t)0, bt, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, H5_ITER_ERROR, "unable to release B-tree node") bt = NULL; @@ -1205,7 +1205,7 @@ H5B_iterate_helper(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t add if(H5F_addr_defined(next_addr)) { /* Protect the next node to the right */ addr = next_addr; - if(NULL == (bt = (H5B_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT, addr, shared->sizeof_rnode, &cache_udata, H5AC2_READ))) + if(NULL == (bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, shared->sizeof_rnode, &cache_udata, H5AC_READ))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, H5_ITER_ERROR, "B-tree node") /* Cache information from this node */ @@ -1217,7 +1217,7 @@ H5B_iterate_helper(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t add HDmemcpy(child, bt->child, nchildren * sizeof(haddr_t)); /* Unprotect node */ - if(H5AC2_unprotect(f, dxpl_id, H5AC2_BT, addr, (size_t)0, bt, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_BT, addr, (size_t)0, bt, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, H5_ITER_ERROR, "unable to release B-tree node") bt = NULL; } /* end if */ @@ -1229,7 +1229,7 @@ H5B_iterate_helper(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t add } /* end else */ done: - if(bt && H5AC2_unprotect(f, dxpl_id, H5AC2_BT, addr, (size_t)0, bt, H5AC2__NO_FLAGS_SET) < 0) + if(bt && H5AC_unprotect(f, dxpl_id, H5AC_BT, addr, (size_t)0, bt, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, H5_ITER_ERROR, "unable to release B-tree node") if(native) (void)H5FL_BLK_FREE(native_block, native); @@ -1310,7 +1310,7 @@ H5B_remove_helper(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type uint8_t *rt_key/*out*/, hbool_t *rt_key_changed/*out*/) { H5B_t *bt = NULL, *sibling = NULL; - unsigned bt_flags = H5AC2__NO_FLAGS_SET; + unsigned bt_flags = H5AC__NO_FLAGS_SET; H5RC_t *rc_shared; /* Ref-counted shared info */ H5B_shared_t *shared; /* Pointer to shared B-tree info */ H5B_cache_ud_t cache_udata; /* User-data for metadata cache callback */ @@ -1342,7 +1342,7 @@ H5B_remove_helper(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type cache_udata.f = f; cache_udata.type = type; cache_udata.rc_shared = rc_shared; - if(NULL == (bt = (H5B_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT, addr, shared->sizeof_rnode, &cache_udata, H5AC2_WRITE))) + if(NULL == (bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, shared->sizeof_rnode, &cache_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, H5B_INS_ERROR, "unable to load B-tree node") rt = bt->nchildren; @@ -1398,7 +1398,7 @@ H5B_remove_helper(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type * our right key and indicate that it changed. */ if(*lt_key_changed) { - bt_flags |= H5AC2__DIRTIED_FLAG; + bt_flags |= H5AC__DIRTIED_FLAG; if(idx > 0) /* Don't propagate change out of this B-tree node */ @@ -1407,7 +1407,7 @@ H5B_remove_helper(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type HDmemcpy(lt_key, H5B_NKEY(bt, shared, idx), type->sizeof_nkey); } /* end if */ if(*rt_key_changed) { - bt_flags |= H5AC2__DIRTIED_FLAG; + bt_flags |= H5AC__DIRTIED_FLAG; if(idx + 1 < bt->nchildren) { /* Don't propagate change out of this B-tree node */ *rt_key_changed = FALSE; @@ -1421,13 +1421,13 @@ H5B_remove_helper(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type */ if(ret_value != H5B_INS_REMOVE && level > 0) { if(H5F_addr_defined(bt->right)) { - if(NULL == (sibling = (H5B_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT, bt->right, shared->sizeof_rnode, &cache_udata, H5AC2_WRITE))) + if(NULL == (sibling = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, bt->right, shared->sizeof_rnode, &cache_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, H5B_INS_ERROR, "unable to unlink node from tree") /* Make certain the native key for the right sibling is set up */ HDmemcpy(H5B_NKEY(sibling, shared, 0), H5B_NKEY(bt, shared, idx + 1), type->sizeof_nkey); - if(H5AC2_unprotect(f, dxpl_id, H5AC2_BT, bt->right, (size_t)0, sibling, H5AC2__DIRTIED_FLAG) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_BT, bt->right, (size_t)0, sibling, H5AC__DIRTIED_FLAG) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, H5B_INS_ERROR, "unable to release node from tree") sibling = NULL; /* Make certain future references will be caught */ } /* end if */ @@ -1445,21 +1445,21 @@ H5B_remove_helper(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type * keys and the subtree pointer. Free this node (unless it's the * root node) and return H5B_INS_REMOVE. */ - bt_flags |= H5AC2__DIRTIED_FLAG; + bt_flags |= H5AC__DIRTIED_FLAG; bt->nchildren = 0; if(level > 0) { if(H5F_addr_defined(bt->left)) { - if(NULL == (sibling = (H5B_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT, bt->left, shared->sizeof_rnode, &cache_udata, H5AC2_WRITE))) + if(NULL == (sibling = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, bt->left, shared->sizeof_rnode, &cache_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, H5B_INS_ERROR, "unable to load node from tree") sibling->right = bt->right; - if(H5AC2_unprotect(f, dxpl_id, H5AC2_BT, bt->left, (size_t)0, sibling, H5AC2__DIRTIED_FLAG) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_BT, bt->left, (size_t)0, sibling, H5AC__DIRTIED_FLAG) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, H5B_INS_ERROR, "unable to release node from tree") sibling = NULL; /* Make certain future references will be caught */ } /* end if */ if(H5F_addr_defined(bt->right)) { - if(NULL == (sibling = (H5B_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT, bt->right, shared->sizeof_rnode, &cache_udata, H5AC2_WRITE))) + if(NULL == (sibling = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, bt->right, shared->sizeof_rnode, &cache_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, H5B_INS_ERROR, "unable to unlink node from tree") /* Copy left-most key from deleted node to left-most key in it's right neighbor */ @@ -1467,7 +1467,7 @@ H5B_remove_helper(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type sibling->left = bt->left; - if(H5AC2_unprotect(f, dxpl_id, H5AC2_BT, bt->right, (size_t)0, sibling, H5AC2__DIRTIED_FLAG) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_BT, bt->right, (size_t)0, sibling, H5AC__DIRTIED_FLAG) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, H5B_INS_ERROR, "unable to release node from tree") sibling = NULL; /* Make certain future references will be caught */ } /* end if */ @@ -1475,13 +1475,13 @@ H5B_remove_helper(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type bt->right = HADDR_UNDEF; H5_CHECK_OVERFLOW(shared->sizeof_rnode, size_t, hsize_t); if(H5MF_xfree(f, H5FD_MEM_BTREE, dxpl_id, addr, (hsize_t)shared->sizeof_rnode) < 0 - || H5AC2_unprotect(f, dxpl_id, H5AC2_BT, addr, (size_t)0, bt, bt_flags | H5AC2__DELETED_FLAG) < 0) { + || H5AC_unprotect(f, dxpl_id, H5AC_BT, addr, (size_t)0, bt, bt_flags | H5AC__DELETED_FLAG) < 0) { bt = NULL; - bt_flags = H5AC2__NO_FLAGS_SET; + bt_flags = H5AC__NO_FLAGS_SET; HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, H5B_INS_ERROR, "unable to free B-tree node") } /* end if */ bt = NULL; - bt_flags = H5AC2__NO_FLAGS_SET; + bt_flags = H5AC__NO_FLAGS_SET; } /* end if */ } else if(H5B_INS_REMOVE == ret_value && 0 == idx) { /* @@ -1491,7 +1491,7 @@ H5B_remove_helper(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type * key into lt_key and notify the caller that the left key has * changed. Return H5B_INS_NOOP. */ - bt_flags |= H5AC2__DIRTIED_FLAG; + bt_flags |= H5AC__DIRTIED_FLAG; bt->nchildren -= 1; HDmemmove(bt->native, @@ -1510,7 +1510,7 @@ H5B_remove_helper(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type * freed). We copy the new right-most key into rt_key and notify the * caller that the right key has changed. Return H5B_INS_NOOP. */ - bt_flags |= H5AC2__DIRTIED_FLAG; + bt_flags |= H5AC__DIRTIED_FLAG; bt->nchildren -= 1; HDmemcpy(rt_key, H5B_NKEY(bt, shared, bt->nchildren), type->sizeof_nkey); *rt_key_changed = TRUE; @@ -1521,12 +1521,12 @@ H5B_remove_helper(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type */ if(level > 0) { if(H5F_addr_defined(bt->right)) { - if(NULL == (sibling = (H5B_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT, bt->right, shared->sizeof_rnode, &cache_udata, H5AC2_WRITE))) + if(NULL == (sibling = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, bt->right, shared->sizeof_rnode, &cache_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, H5B_INS_ERROR, "unable to unlink node from tree") HDmemcpy(H5B_NKEY(sibling, shared, 0), H5B_NKEY(bt, shared, bt->nchildren), type->sizeof_nkey); - if(H5AC2_unprotect(f, dxpl_id, H5AC2_BT, bt->right, (size_t)0, sibling, H5AC2__DIRTIED_FLAG) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_BT, bt->right, (size_t)0, sibling, H5AC__DIRTIED_FLAG) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, H5B_INS_ERROR, "unable to release node from tree") sibling = NULL; /* Make certain future references will be caught */ } /* end if */ @@ -1541,7 +1541,7 @@ H5B_remove_helper(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type * the right are shifted left by one place. The subtree has already * been freed). Return H5B_INS_NOOP. */ - bt_flags |= H5AC2__DIRTIED_FLAG; + bt_flags |= H5AC__DIRTIED_FLAG; bt->nchildren -= 1; HDmemmove(bt->native + idx * type->sizeof_nkey, @@ -1555,7 +1555,7 @@ H5B_remove_helper(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type ret_value = H5B_INS_NOOP; done: - if(bt && H5AC2_unprotect(f, dxpl_id, H5AC2_BT, addr, (size_t)0, bt, bt_flags) < 0) + if(bt && H5AC_unprotect(f, dxpl_id, H5AC_BT, addr, (size_t)0, bt, bt_flags) < 0) HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, H5B_INS_ERROR, "unable to release node") FUNC_LEAVE_NOAPI(ret_value) @@ -1587,7 +1587,7 @@ H5B_remove(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr, void uint8_t *rt_key = (uint8_t*)_rt_key; /*right key*/ hbool_t lt_key_changed = FALSE; /*left key changed?*/ hbool_t rt_key_changed = FALSE; /*right key changed?*/ - unsigned bt_flags = H5AC2__NO_FLAGS_SET; + unsigned bt_flags = H5AC__NO_FLAGS_SET; H5B_t *bt = NULL; /*btree node */ H5RC_t *rc_shared; /* Ref-counted shared info */ H5B_shared_t *shared; /* Pointer to shared B-tree info */ @@ -1620,15 +1620,15 @@ H5B_remove(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr, void cache_udata.f = f; cache_udata.type = type; cache_udata.rc_shared = rc_shared; - if(NULL == (bt = (H5B_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT, addr, shared->sizeof_rnode, &cache_udata, H5AC2_WRITE))) + if(NULL == (bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, shared->sizeof_rnode, &cache_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree root node") if(0 == bt->nchildren && 0 != bt->level) { bt->level = 0; - bt_flags |= H5AC2__DIRTIED_FLAG; + bt_flags |= H5AC__DIRTIED_FLAG; } /* end if */ - if(H5AC2_unprotect(f, dxpl_id, H5AC2_BT, addr, (size_t)0, bt, bt_flags) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_BT, addr, (size_t)0, bt, bt_flags) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release node") bt = NULL; /* Make certain future references will be caught */ @@ -1680,7 +1680,7 @@ H5B_delete(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr, void cache_udata.f = f; cache_udata.type = type; cache_udata.rc_shared = rc_shared; - if(NULL == (bt = (H5B_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT, addr, shared->sizeof_rnode, &cache_udata, H5AC2_WRITE))) + if(NULL == (bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, shared->sizeof_rnode, &cache_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree node") /* Iterate over all children in tree, deleting them */ @@ -1712,7 +1712,7 @@ H5B_delete(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t addr, void HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to free B-tree node") done: - if(bt && H5AC2_unprotect(f, dxpl_id, H5AC2_BT, addr, (size_t)0, bt, H5AC2__DELETED_FLAG) < 0) + if(bt && H5AC_unprotect(f, dxpl_id, H5AC_BT, addr, (size_t)0, bt, H5AC__DELETED_FLAG) < 0) HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node in cache") FUNC_LEAVE_NOAPI(ret_value) @@ -1856,7 +1856,7 @@ H5B_copy(const H5B_t *old_bt) HDmemcpy(new_node, old_bt, sizeof(H5B_t)); /* Reset cache info */ - HDmemset(&new_node->cache_info, 0, sizeof(H5AC2_info_t)); + HDmemset(&new_node->cache_info, 0, sizeof(H5AC_info_t)); if(NULL == (new_node->native = H5FL_BLK_MALLOC(native_block, shared->sizeof_keys)) || NULL == (new_node->child = H5FL_SEQ_MALLOC(haddr_t, (size_t)shared->two_k))) @@ -1937,7 +1937,7 @@ H5B_get_info_helper(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t ad cache_udata.f = f; cache_udata.type = type; cache_udata.rc_shared = rc_shared; - if(NULL == (bt = (H5B_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT, addr, shared->sizeof_rnode, &cache_udata, H5AC2_READ))) + if(NULL == (bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, shared->sizeof_rnode, &cache_udata, H5AC_READ))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree node") /* Cache information from this node */ @@ -1950,7 +1950,7 @@ H5B_get_info_helper(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t ad info_udata->bt_info->num_nodes++; /* Release current node */ - if(H5AC2_unprotect(f, dxpl_id, H5AC2_BT, addr, (size_t)0, bt, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_BT, addr, (size_t)0, bt, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node") bt = NULL; @@ -1961,7 +1961,7 @@ H5B_get_info_helper(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t ad while(H5F_addr_defined(next_addr)) { /* Protect the next node to the right */ addr = next_addr; - if(NULL == (bt = (H5B_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT, addr, shared->sizeof_rnode, &cache_udata, H5AC2_READ))) + if(NULL == (bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, shared->sizeof_rnode, &cache_udata, H5AC_READ))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "B-tree node") /* Cache information from this node */ @@ -1972,7 +1972,7 @@ H5B_get_info_helper(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t ad info_udata->bt_info->num_nodes++; /* Unprotect node */ - if(H5AC2_unprotect(f, dxpl_id, H5AC2_BT, addr, (size_t)0, bt, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_BT, addr, (size_t)0, bt, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node") bt = NULL; } /* end while */ @@ -1985,7 +1985,7 @@ H5B_get_info_helper(H5F_t *f, hid_t dxpl_id, const H5B_class_t *type, haddr_t ad } /* end if */ done: - if(bt && H5AC2_unprotect(f, dxpl_id, H5AC2_BT, addr, (size_t)0, bt, H5AC2__NO_FLAGS_SET) < 0) + if(bt && H5AC_unprotect(f, dxpl_id, H5AC_BT, addr, (size_t)0, bt, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node") FUNC_LEAVE_NOAPI(ret_value) @@ -2124,7 +2124,7 @@ H5B_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, int f cache_udata.f = f; cache_udata.type = type; cache_udata.rc_shared = rc_shared; - if(NULL == (bt = (H5B_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT, addr, shared->sizeof_rnode, &cache_udata, H5AC2_READ))) + if(NULL == (bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, shared->sizeof_rnode, &cache_udata, H5AC_READ))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree node") /* @@ -2186,7 +2186,7 @@ H5B_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, int f } /* end for */ done: - if(bt && H5AC2_unprotect(f, dxpl_id, H5AC2_BT, addr, (size_t)0, bt, H5AC2__NO_FLAGS_SET) < 0) + if(bt && H5AC_unprotect(f, dxpl_id, H5AC_BT, addr, (size_t)0, bt, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node") FUNC_LEAVE_NOAPI(ret_value) @@ -2244,7 +2244,7 @@ H5B_assert(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type, void cache_udata.f = f; cache_udata.type = type; cache_udata.rc_shared = rc_shared; - bt = (H5B_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT, addr, shared->sizeof_rnode, &cache_udata, H5AC2_READ); + bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, addr, shared->sizeof_rnode, &cache_udata, H5AC_READ); HDassert(bt); shared=(H5B_shared_t *)H5RC_GET_OBJ(bt->rc_shared); HDassert(shared); @@ -2254,7 +2254,7 @@ H5B_assert(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type, void cur->level = bt->level; head = tail = cur; - status = H5AC2_unprotect(f, dxpl_id, H5AC2_BT, addr, (size_t)0, bt, H5AC2__NO_FLAGS_SET); + status = H5AC_unprotect(f, dxpl_id, H5AC_BT, addr, (size_t)0, bt, H5AC__NO_FLAGS_SET); HDassert(status >= 0); bt = NULL; /* Make certain future references will be caught */ @@ -2265,7 +2265,7 @@ H5B_assert(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type, void * test. */ for(ncell = 0; cur; ncell++) { - bt = (H5B_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT, cur->addr, shared->sizeof_rnode, &cache_udata, H5AC2_READ); + bt = (H5B_t *)H5AC_protect(f, dxpl_id, H5AC_BT, cur->addr, shared->sizeof_rnode, &cache_udata, H5AC_READ); HDassert(bt); /* Check node header */ @@ -2305,7 +2305,7 @@ H5B_assert(H5F_t *f, hid_t dxpl_id, haddr_t addr, const H5B_class_t *type, void } /* end if */ /* Release node */ - status = H5AC2_unprotect(f, dxpl_id, H5AC2_BT, cur->addr, (size_t)0, bt, H5AC2__NO_FLAGS_SET); + status = H5AC_unprotect(f, dxpl_id, H5AC_BT, cur->addr, (size_t)0, bt, H5AC__NO_FLAGS_SET); HDassert(status >= 0); bt = NULL; /* Make certain future references will be caught */ diff --git a/src/H5B2.c b/src/H5B2.c index 6e6962d..c2114eb 100644 --- a/src/H5B2.c +++ b/src/H5B2.c @@ -123,7 +123,7 @@ H5B2_create(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for B-tree header") /* Assign internal information */ - HDmemset(&bt2->cache_info, 0, sizeof(H5AC2_info_t)); + HDmemset(&bt2->cache_info, 0, sizeof(H5AC_info_t)); bt2->root.addr = HADDR_UNDEF; bt2->root.node_nrec = 0; bt2->root.all_nrec = 0; @@ -137,7 +137,7 @@ H5B2_create(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "file allocation failed for B-tree header") /* Cache the new B-tree node */ - if(H5AC2_set(f, dxpl_id, H5AC2_BT2_HDR, *addr_p, (size_t)H5B2_HEADER_SIZE(f), bt2, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_set(f, dxpl_id, H5AC_BT2_HDR, *addr_p, (size_t)H5B2_HEADER_SIZE(f), bt2, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, FAIL, "can't add B-tree header to cache") done: @@ -168,7 +168,7 @@ H5B2_insert(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t addr, void *udata) { H5B2_t *bt2 = NULL; /* Pointer to the B-tree header */ - unsigned bt2_flags = H5AC2__NO_FLAGS_SET; /* Metadata cache flags for B-tree header */ + unsigned bt2_flags = H5AC__NO_FLAGS_SET; /* Metadata cache flags for B-tree header */ H5B2_shared_t *shared; /* Pointer to B-tree's shared information */ H5B2_hdr_cache_ud_t cache_udata; /* User-data for callback */ herr_t ret_value = SUCCEED; @@ -184,7 +184,7 @@ H5B2_insert(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t addr, cache_udata.type = type; /* Look up the b-tree header */ - if(NULL == (bt2 = (H5B2_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT2_HDR, addr, (size_t)H5B2_HEADER_SIZE(f), &cache_udata, H5AC2_WRITE))) + if(NULL == (bt2 = (H5B2_t *)H5AC_protect(f, dxpl_id, H5AC_BT2_HDR, addr, (size_t)H5B2_HEADER_SIZE(f), &cache_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree header") /* Get the pointer to the shared B-tree info */ @@ -198,7 +198,7 @@ H5B2_insert(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t addr, HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, FAIL, "unable to create root node") /* Mark B-tree header as dirty, since we updated the address of the root node */ - bt2_flags |= H5AC2__DIRTIED_FLAG; + bt2_flags |= H5AC__DIRTIED_FLAG; } /* end if */ /* Check if we need to split the root node (equiv. to a 1->2 node split) */ else if(bt2->root.node_nrec == shared->node_info[shared->depth].split_nrec) { @@ -218,11 +218,11 @@ H5B2_insert(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t addr, } /* end else */ /* Mark parent node as dirty */ - bt2_flags |= H5AC2__DIRTIED_FLAG; + bt2_flags |= H5AC__DIRTIED_FLAG; done: /* Release the B-tree header info */ - if(bt2 && H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_HDR, addr, (size_t)0, bt2, bt2_flags) < 0) + if(bt2 && H5AC_unprotect(f, dxpl_id, H5AC_BT2_HDR, addr, (size_t)0, bt2, bt2_flags) < 0) HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree header info") FUNC_LEAVE_NOAPI(ret_value) @@ -271,7 +271,7 @@ H5B2_iterate(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t addr, cache_udata.type = type; /* Look up the B-tree header */ - if(NULL == (bt2 = (H5B2_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT2_HDR, addr, (size_t)H5B2_HEADER_SIZE(f), &cache_udata, H5AC2_READ))) + if(NULL == (bt2 = (H5B2_t *)H5AC_protect(f, dxpl_id, H5AC_BT2_HDR, addr, (size_t)H5B2_HEADER_SIZE(f), &cache_udata, H5AC_READ))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree header") /* Safely grab pointer to reference counted shared B-tree info, so we can release the B-tree header if necessary */ @@ -290,7 +290,7 @@ H5B2_iterate(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t addr, depth = shared->depth; /* Release header */ - if(H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_HDR, addr, (size_t)0, bt2, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_BT2_HDR, addr, (size_t)0, bt2, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree header info") bt2 = NULL; @@ -360,7 +360,7 @@ H5B2_find(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t addr, cache_udata.type = type; /* Look up the B-tree header */ - if(NULL == (bt2 = (H5B2_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT2_HDR, addr, (size_t)H5B2_HEADER_SIZE(f), &cache_udata, H5AC2_READ))) + if(NULL == (bt2 = (H5B2_t *)H5AC_protect(f, dxpl_id, H5AC_BT2_HDR, addr, (size_t)H5B2_HEADER_SIZE(f), &cache_udata, H5AC_READ))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree header") /* Safely grab pointer to reference counted shared B-tree info, so we can release the B-tree header if necessary */ @@ -379,7 +379,7 @@ H5B2_find(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t addr, depth = shared->depth; /* Release header */ - if(H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_HDR, addr, (size_t)0, bt2, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_BT2_HDR, addr, (size_t)0, bt2, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree header info") bt2 = NULL; @@ -394,7 +394,7 @@ H5B2_find(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t addr, H5B2_node_ptr_t next_node_ptr; /* Node pointer info for next node */ /* Lock B-tree current node */ - if(NULL == (internal = H5B2_protect_internal(f, dxpl_id, bt2_shared, curr_node_ptr.addr, curr_node_ptr.node_nrec, depth, H5AC2_READ))) + if(NULL == (internal = H5B2_protect_internal(f, dxpl_id, bt2_shared, curr_node_ptr.addr, curr_node_ptr.node_nrec, depth, H5AC_READ))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree internal node") /* Locate node pointer for child */ @@ -407,7 +407,7 @@ H5B2_find(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t addr, next_node_ptr=internal->node_ptrs[idx]; /* Unlock current node */ - if(H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_INT, curr_node_ptr.addr, (size_t)0, internal, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_BT2_INT, curr_node_ptr.addr, (size_t)0, internal, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node") /* Set pointer to next node to load */ @@ -417,14 +417,14 @@ H5B2_find(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t addr, /* Make callback for current record */ if(op && (op)(H5B2_INT_NREC(internal, shared, idx), op_data) < 0) { /* Unlock current node */ - if (H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_INT, curr_node_ptr.addr, (size_t)0, internal, H5AC2__NO_FLAGS_SET) < 0) + if (H5AC_unprotect(f, dxpl_id, H5AC_BT2_INT, curr_node_ptr.addr, (size_t)0, internal, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node") HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "'found' callback failed for B-tree find operation") } /* end if */ /* Unlock current node */ - if(H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_INT, curr_node_ptr.addr, (size_t)0, internal, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_BT2_INT, curr_node_ptr.addr, (size_t)0, internal, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node") HGOTO_DONE(SUCCEED); @@ -442,7 +442,7 @@ H5B2_find(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t addr, cache_leaf_udata.bt2_shared = bt2_shared; /* Lock B-tree leaf node */ - if(NULL == (leaf = (H5B2_leaf_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT2_LEAF, curr_node_ptr.addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC2_READ))) + if(NULL == (leaf = (H5B2_leaf_t *)H5AC_protect(f, dxpl_id, H5AC_BT2_LEAF, curr_node_ptr.addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC_READ))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree internal node") /* Locate record */ @@ -450,7 +450,7 @@ H5B2_find(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t addr, if(cmp != 0) { /* Unlock leaf node */ - if(H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_LEAF, curr_node_ptr.addr, (size_t)0, leaf, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_BT2_LEAF, curr_node_ptr.addr, (size_t)0, leaf, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node") /* Note: don't push error on stack, leave that to next higher level, @@ -467,7 +467,7 @@ H5B2_find(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t addr, /* Make callback for current record */ if(op && (op)(H5B2_LEAF_NREC(leaf, shared, idx), op_data) < 0) { /* Unlock current node */ - if(H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_LEAF, curr_node_ptr.addr, (size_t)0, leaf, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_BT2_LEAF, curr_node_ptr.addr, (size_t)0, leaf, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node") HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "'found' callback failed for B-tree find operation") @@ -475,7 +475,7 @@ H5B2_find(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t addr, } /* end else */ /* Unlock current node */ - if(H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_LEAF, curr_node_ptr.addr, (size_t)0, leaf, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_BT2_LEAF, curr_node_ptr.addr, (size_t)0, leaf, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node") } /* end block */ @@ -532,7 +532,7 @@ H5B2_index(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t addr, cache_udata.type = type; /* Look up the B-tree header */ - if(NULL == (bt2 = (H5B2_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT2_HDR, addr, (size_t)H5B2_HEADER_SIZE(f), &cache_udata, H5AC2_READ))) + if(NULL == (bt2 = (H5B2_t *)H5AC_protect(f, dxpl_id, H5AC_BT2_HDR, addr, (size_t)H5B2_HEADER_SIZE(f), &cache_udata, H5AC_READ))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree header") /* Safely grab pointer to reference counted shared B-tree info, so we can release the B-tree header if necessary */ @@ -551,7 +551,7 @@ H5B2_index(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t addr, depth = shared->depth; /* Release header */ - if(H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_HDR, addr, (size_t)0, bt2, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_BT2_HDR, addr, (size_t)0, bt2, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree header info") bt2 = NULL; @@ -574,7 +574,7 @@ H5B2_index(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t addr, unsigned u; /* Local index variable */ /* Lock B-tree current node */ - if(NULL == (internal = H5B2_protect_internal(f, dxpl_id, bt2_shared, curr_node_ptr.addr, curr_node_ptr.node_nrec, depth, H5AC2_READ))) + if(NULL == (internal = H5B2_protect_internal(f, dxpl_id, bt2_shared, curr_node_ptr.addr, curr_node_ptr.node_nrec, depth, H5AC_READ))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree internal node") /* Search for record with correct index */ @@ -585,7 +585,7 @@ H5B2_index(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t addr, next_node_ptr = internal->node_ptrs[u]; /* Unlock current node */ - if(H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_INT, curr_node_ptr.addr, (size_t)0, internal, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_BT2_INT, curr_node_ptr.addr, (size_t)0, internal, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node") /* Set pointer to next node to load */ @@ -600,14 +600,14 @@ H5B2_index(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t addr, /* Make callback for current record */ if((op)(H5B2_INT_NREC(internal, shared, u), op_data) < 0) { /* Unlock current node */ - if(H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_INT, curr_node_ptr.addr, (size_t)0, internal, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_BT2_INT, curr_node_ptr.addr, (size_t)0, internal, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node") HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "'found' callback failed for B-tree find operation") } /* end if */ /* Unlock current node */ - if(H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_INT, curr_node_ptr.addr, (size_t)0, internal, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_BT2_INT, curr_node_ptr.addr, (size_t)0, internal, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node") HGOTO_DONE(SUCCEED); @@ -627,7 +627,7 @@ H5B2_index(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t addr, next_node_ptr = internal->node_ptrs[u]; /* Unlock current node */ - if(H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_INT, curr_node_ptr.addr, (size_t)0, internal, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_BT2_INT, curr_node_ptr.addr, (size_t)0, internal, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node") /* Set pointer to next node to load */ @@ -650,7 +650,7 @@ H5B2_index(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t addr, cache_leaf_udata.bt2_shared = bt2_shared; /* Lock B-tree leaf node */ - if(NULL == (leaf = (H5B2_leaf_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT2_LEAF, curr_node_ptr.addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC2_READ))) + if(NULL == (leaf = (H5B2_leaf_t *)H5AC_protect(f, dxpl_id, H5AC_BT2_LEAF, curr_node_ptr.addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC_READ))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree internal node") /* Sanity check index */ @@ -659,14 +659,14 @@ H5B2_index(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t addr, /* Make callback for correct record */ if((op)(H5B2_LEAF_NREC(leaf, shared, idx), op_data) < 0) { /* Unlock current node */ - if(H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_LEAF, curr_node_ptr.addr, (size_t)0, leaf, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_BT2_LEAF, curr_node_ptr.addr, (size_t)0, leaf, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node") HGOTO_ERROR(H5E_BTREE, H5E_NOTFOUND, FAIL, "'found' callback failed for B-tree find operation") } /* end if */ /* Unlock current node */ - if(H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_LEAF, curr_node_ptr.addr, (size_t)0, leaf, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_BT2_LEAF, curr_node_ptr.addr, (size_t)0, leaf, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node") } /* end block */ @@ -697,7 +697,7 @@ H5B2_remove(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t addr, void *udata, H5B2_remove_t op, void *op_data) { H5B2_t *bt2 = NULL; /* Pointer to the B-tree header */ - unsigned bt2_flags = H5AC2__NO_FLAGS_SET; + unsigned bt2_flags = H5AC__NO_FLAGS_SET; H5B2_shared_t *shared; /* Pointer to B-tree's shared information */ H5B2_hdr_cache_ud_t cache_udata; /* User-data for callback */ herr_t ret_value = SUCCEED; @@ -713,7 +713,7 @@ H5B2_remove(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t addr, cache_udata.type = type; /* Look up the b-tree header */ - if(NULL == (bt2 = (H5B2_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT2_HDR, addr, (size_t)H5B2_HEADER_SIZE(f), &cache_udata, H5AC2_WRITE))) + if(NULL == (bt2 = (H5B2_t *)H5AC_protect(f, dxpl_id, H5AC_BT2_HDR, addr, (size_t)H5B2_HEADER_SIZE(f), &cache_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree header") /* Get the pointer to the shared B-tree info */ @@ -754,11 +754,11 @@ H5B2_remove(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t addr, bt2->root.all_nrec--; /* Mark parent node as dirty */ - bt2_flags |= H5AC2__DIRTIED_FLAG; + bt2_flags |= H5AC__DIRTIED_FLAG; done: /* Release the B-tree header info */ - if (bt2 && H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_HDR, addr, (size_t)0, bt2, bt2_flags) < 0) + if (bt2 && H5AC_unprotect(f, dxpl_id, H5AC_BT2_HDR, addr, (size_t)0, bt2, bt2_flags) < 0) HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree header info") FUNC_LEAVE_NOAPI(ret_value) @@ -784,7 +784,7 @@ H5B2_remove_by_idx(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, void *op_data) { H5B2_t *bt2 = NULL; /* Pointer to the B-tree header */ - unsigned bt2_flags = H5AC2__NO_FLAGS_SET; + unsigned bt2_flags = H5AC__NO_FLAGS_SET; H5B2_shared_t *shared; /* Pointer to B-tree's shared information */ H5B2_hdr_cache_ud_t cache_udata; /* User-data for callback */ herr_t ret_value = SUCCEED; @@ -800,7 +800,7 @@ H5B2_remove_by_idx(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, cache_udata.type = type; /* Look up the b-tree header */ - if(NULL == (bt2 = (H5B2_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT2_HDR, addr, (size_t)H5B2_HEADER_SIZE(f), &cache_udata, H5AC2_WRITE))) + if(NULL == (bt2 = (H5B2_t *)H5AC_protect(f, dxpl_id, H5AC_BT2_HDR, addr, (size_t)H5B2_HEADER_SIZE(f), &cache_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree header") /* Get the pointer to the shared B-tree info */ @@ -849,11 +849,11 @@ H5B2_remove_by_idx(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, bt2->root.all_nrec--; /* Mark parent node as dirty */ - bt2_flags |= H5AC2__DIRTIED_FLAG; + bt2_flags |= H5AC__DIRTIED_FLAG; done: /* Release the B-tree header info */ - if (bt2 && H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_HDR, addr, (size_t)0, bt2, bt2_flags) < 0) + if (bt2 && H5AC_unprotect(f, dxpl_id, H5AC_BT2_HDR, addr, (size_t)0, bt2, bt2_flags) < 0) HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree header info") FUNC_LEAVE_NOAPI(ret_value) @@ -893,7 +893,7 @@ H5B2_get_nrec(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t addr, cache_udata.type = type; /* Look up the B-tree header */ - if (NULL == (bt2 = (H5B2_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT2_HDR, addr, (size_t)H5B2_HEADER_SIZE(f), &cache_udata, H5AC2_READ))) + if (NULL == (bt2 = (H5B2_t *)H5AC_protect(f, dxpl_id, H5AC_BT2_HDR, addr, (size_t)H5B2_HEADER_SIZE(f), &cache_udata, H5AC_READ))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree header") /* Get B-tree number of records */ @@ -901,7 +901,7 @@ H5B2_get_nrec(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t addr, done: /* Release B-tree header node */ - if (bt2 && H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_HDR, addr, (size_t)0, bt2, H5AC2__NO_FLAGS_SET) < 0) + if (bt2 && H5AC_unprotect(f, dxpl_id, H5AC_BT2_HDR, addr, (size_t)0, bt2, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree header info") FUNC_LEAVE_NOAPI(ret_value) @@ -954,7 +954,7 @@ H5B2_neighbor(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t addr, cache_udata.type = type; /* Look up the B-tree header */ - if(NULL == (bt2 = (H5B2_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT2_HDR, addr, (size_t)H5B2_HEADER_SIZE(f), &cache_udata, H5AC2_READ))) + if(NULL == (bt2 = (H5B2_t *)H5AC_protect(f, dxpl_id, H5AC_BT2_HDR, addr, (size_t)H5B2_HEADER_SIZE(f), &cache_udata, H5AC_READ))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree header") /* Get the pointer to the shared B-tree info */ @@ -977,7 +977,7 @@ H5B2_neighbor(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t addr, done: /* Release the B-tree header info */ - if (bt2 && H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_HDR, addr, (size_t)0, bt2, H5AC2__NO_FLAGS_SET) < 0) + if (bt2 && H5AC_unprotect(f, dxpl_id, H5AC_BT2_HDR, addr, (size_t)0, bt2, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree header info") FUNC_LEAVE_NOAPI(ret_value) @@ -1026,7 +1026,7 @@ H5B2_delete(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t addr, cache_udata.type = type; /* Look up the B-tree header */ - if(NULL == (bt2 = (H5B2_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT2_HDR, addr, (size_t)H5B2_HEADER_SIZE(f), &cache_udata, H5AC2_WRITE))) + if(NULL == (bt2 = (H5B2_t *)H5AC_protect(f, dxpl_id, H5AC_BT2_HDR, addr, (size_t)H5B2_HEADER_SIZE(f), &cache_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree header") /* Get the pointer to the shared B-tree info */ @@ -1044,7 +1044,7 @@ H5B2_delete(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t addr, done: /* Release the B-tree header info */ - if(bt2 && H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_HDR, addr, (size_t)0, bt2, H5AC2__DELETED_FLAG) < 0) + if(bt2 && H5AC_unprotect(f, dxpl_id, H5AC_BT2_HDR, addr, (size_t)0, bt2, H5AC__DELETED_FLAG) < 0) HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to delete B-tree header info") FUNC_LEAVE_NOAPI(ret_value) @@ -1099,7 +1099,7 @@ H5B2_modify(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t addr, cache_udata.type = type; /* Look up the B-tree header */ - if(NULL == (bt2 = (H5B2_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT2_HDR, addr, (size_t)H5B2_HEADER_SIZE(f), &cache_udata, H5AC2_READ))) + if(NULL == (bt2 = (H5B2_t *)H5AC_protect(f, dxpl_id, H5AC_BT2_HDR, addr, (size_t)H5B2_HEADER_SIZE(f), &cache_udata, H5AC_READ))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree header") /* Safely grab pointer to reference counted shared B-tree info, so we can release the B-tree header if necessary */ @@ -1119,7 +1119,7 @@ H5B2_modify(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t addr, depth = shared->depth; /* Release header */ - if(H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_HDR, addr, (size_t)0, bt2, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_BT2_HDR, addr, (size_t)0, bt2, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree header info") bt2 = NULL; @@ -1130,12 +1130,12 @@ H5B2_modify(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t addr, /* Walk down B-tree to find record or leaf node where record is located */ cmp = -1; while(depth > 0 && cmp != 0) { - unsigned internal_flags = H5AC2__NO_FLAGS_SET; + unsigned internal_flags = H5AC__NO_FLAGS_SET; H5B2_internal_t *internal; /* Pointer to internal node in B-tree */ H5B2_node_ptr_t next_node_ptr; /* Node pointer info for next node */ /* Lock B-tree current node */ - if(NULL == (internal = H5B2_protect_internal(f, dxpl_id, bt2_shared, curr_node_ptr.addr, curr_node_ptr.node_nrec, depth, H5AC2_WRITE))) + if(NULL == (internal = H5B2_protect_internal(f, dxpl_id, bt2_shared, curr_node_ptr.addr, curr_node_ptr.node_nrec, depth, H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree internal node") /* Locate node pointer for child */ @@ -1148,7 +1148,7 @@ H5B2_modify(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t addr, next_node_ptr=internal->node_ptrs[idx]; /* Unlock current node */ - if (H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_INT, curr_node_ptr.addr, (size_t)0, internal, H5AC2__NO_FLAGS_SET) < 0) + if (H5AC_unprotect(f, dxpl_id, H5AC_BT2_INT, curr_node_ptr.addr, (size_t)0, internal, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node") /* Set pointer to next node to load */ @@ -1163,17 +1163,17 @@ H5B2_modify(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t addr, HDassert(changed==FALSE); /* Unlock current node */ - if (H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_INT, curr_node_ptr.addr, (size_t)0, internal, H5AC2__NO_FLAGS_SET) < 0) + if (H5AC_unprotect(f, dxpl_id, H5AC_BT2_INT, curr_node_ptr.addr, (size_t)0, internal, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node") HGOTO_ERROR(H5E_BTREE, H5E_CANTMODIFY, FAIL, "'modify' callback failed for B-tree find operation") } /* end if */ /* Mark the node as dirty if it changed */ - internal_flags |= changed ? H5AC2__DIRTIED_FLAG : 0; + internal_flags |= changed ? H5AC__DIRTIED_FLAG : 0; /* Unlock current node */ - if (H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_INT, curr_node_ptr.addr,(size_t)0, internal, internal_flags) < 0) + if (H5AC_unprotect(f, dxpl_id, H5AC_BT2_INT, curr_node_ptr.addr,(size_t)0, internal, internal_flags) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node") HGOTO_DONE(SUCCEED); @@ -1184,7 +1184,7 @@ H5B2_modify(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t addr, } /* end while */ { - unsigned leaf_flags = H5AC2__NO_FLAGS_SET; + unsigned leaf_flags = H5AC__NO_FLAGS_SET; H5B2_leaf_t *leaf; /* Pointer to leaf node in B-tree */ hbool_t changed = FALSE;/* Whether the 'modify' callback changed the record */ @@ -1193,7 +1193,7 @@ H5B2_modify(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t addr, cache_leaf_udata.bt2_shared = bt2_shared; /* Lock B-tree leaf node */ - if (NULL == (leaf = (H5B2_leaf_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT2_LEAF, curr_node_ptr.addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC2_WRITE))) + if (NULL == (leaf = (H5B2_leaf_t *)H5AC_protect(f, dxpl_id, H5AC_BT2_LEAF, curr_node_ptr.addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree internal node") /* Locate record */ @@ -1201,7 +1201,7 @@ H5B2_modify(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t addr, if(cmp != 0) { /* Unlock leaf node */ - if (H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_LEAF, curr_node_ptr.addr, (size_t)0, leaf, H5AC2__NO_FLAGS_SET) < 0) + if (H5AC_unprotect(f, dxpl_id, H5AC_BT2_LEAF, curr_node_ptr.addr, (size_t)0, leaf, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node") /* Note: don't push error on stack, leave that to next higher level, @@ -1221,7 +1221,7 @@ H5B2_modify(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t addr, HDassert(changed==FALSE); /* Unlock current node */ - if (H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_LEAF, curr_node_ptr.addr, (size_t)0, leaf, H5AC2__NO_FLAGS_SET) < 0) + if (H5AC_unprotect(f, dxpl_id, H5AC_BT2_LEAF, curr_node_ptr.addr, (size_t)0, leaf, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node") HGOTO_ERROR(H5E_BTREE, H5E_CANTMODIFY, FAIL, "'modify' callback failed for B-tree find operation") @@ -1229,10 +1229,10 @@ H5B2_modify(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t addr, } /* end else */ /* Mark the node as dirty if it changed */ - leaf_flags |= (changed ? H5AC2__DIRTIED_FLAG : 0); + leaf_flags |= (changed ? H5AC__DIRTIED_FLAG : 0); /* Unlock current node */ - if (H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_LEAF, curr_node_ptr.addr, (size_t)0, leaf, leaf_flags) < 0) + if (H5AC_unprotect(f, dxpl_id, H5AC_BT2_LEAF, curr_node_ptr.addr, (size_t)0, leaf, leaf_flags) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node") } @@ -1282,7 +1282,7 @@ H5B2_iterate_size(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t add cache_udata.type = type; /* Look up the B-tree header */ - if(NULL == (bt2 = (H5B2_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT2_HDR, addr, (size_t)H5B2_HEADER_SIZE(f), &cache_udata, H5AC2_READ))) + if(NULL == (bt2 = (H5B2_t *)H5AC_protect(f, dxpl_id, H5AC_BT2_HDR, addr, (size_t)H5B2_HEADER_SIZE(f), &cache_udata, H5AC_READ))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree header") /* Safely grab pointer to reference counted shared B-tree info, so we can release the B-tree header if necessary */ @@ -1304,7 +1304,7 @@ H5B2_iterate_size(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr_t add depth = shared->depth; /* Release header */ - if(H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_HDR, addr, (size_t)0, bt2, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_BT2_HDR, addr, (size_t)0, bt2, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree header info") bt2 = NULL; diff --git a/src/H5B2cache.c b/src/H5B2cache.c index 85b0db7..aac486c 100644 --- a/src/H5B2cache.c +++ b/src/H5B2cache.c @@ -89,9 +89,9 @@ static herr_t H5B2_cache_leaf_free_icr(haddr_t addr, size_t len, void *thing); /* Package Variables */ /*********************/ -/* H5B2 inherits cache-like properties from H5AC2 */ -const H5AC2_class_t H5AC2_BT2_HDR[1] = {{ - H5AC2_BT2_HDR_ID, +/* H5B2 inherits cache-like properties from H5AC */ +const H5AC_class_t H5AC_BT2_HDR[1] = {{ + H5AC_BT2_HDR_ID, "v2 b-tree header", H5FD_MEM_BTREE, H5B2_cache_hdr_deserialize, @@ -101,9 +101,9 @@ const H5AC2_class_t H5AC2_BT2_HDR[1] = {{ NULL, }}; -/* H5B2 inherits cache-like properties from H5AC2 */ -const H5AC2_class_t H5AC2_BT2_INT[1] = {{ - H5AC2_BT2_INT_ID, +/* H5B2 inherits cache-like properties from H5AC */ +const H5AC_class_t H5AC_BT2_INT[1] = {{ + H5AC_BT2_INT_ID, "v2 b-tree internal node", H5FD_MEM_BTREE, H5B2_cache_internal_deserialize, @@ -113,9 +113,9 @@ const H5AC2_class_t H5AC2_BT2_INT[1] = {{ NULL, }}; -/* H5B2 inherits cache-like properties from H5AC2 */ -const H5AC2_class_t H5AC2_BT2_LEAF[1] = {{ - H5AC2_BT2_LEAF_ID, +/* H5B2 inherits cache-like properties from H5AC */ +const H5AC_class_t H5AC_BT2_LEAF[1] = {{ + H5AC_BT2_LEAF_ID, "v2 b-tree leaf node", H5FD_MEM_BTREE, H5B2_cache_leaf_deserialize, @@ -175,7 +175,7 @@ H5B2_cache_hdr_deserialize(haddr_t UNUSED addr, size_t UNUSED len, /* Allocate space for the B-tree data structure */ if(NULL == (bt2 = H5FL_MALLOC(H5B2_t))) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed") - HDmemset(&bt2->cache_info, 0, sizeof(H5AC2_info_t)); + HDmemset(&bt2->cache_info, 0, sizeof(H5AC_info_t)); /* Compute the size of the serialized B-tree header on disk */ size = H5B2_HEADER_SIZE(udata->f); @@ -398,7 +398,7 @@ H5B2_cache_internal_deserialize(haddr_t UNUSED addr, size_t UNUSED len, /* Allocate new internal node and reset cache info */ if(NULL == (internal = H5FL_MALLOC(H5B2_internal_t))) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed") - HDmemset(&internal->cache_info, 0, sizeof(H5AC2_info_t)); + HDmemset(&internal->cache_info, 0, sizeof(H5AC_info_t)); /* Share common B-tree information */ internal->shared = udata->bt2_shared; @@ -646,7 +646,7 @@ H5B2_cache_leaf_deserialize(haddr_t UNUSED addr, size_t UNUSED len, if(NULL == (leaf = H5FL_MALLOC(H5B2_leaf_t))) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed") - HDmemset(&leaf->cache_info, 0, sizeof(H5AC2_info_t)); + HDmemset(&leaf->cache_info, 0, sizeof(H5AC_info_t)); /* Share common B-tree information */ leaf->shared = udata->bt2_shared; diff --git a/src/H5B2dbg.c b/src/H5B2dbg.c index 121c463..72c92ba 100644 --- a/src/H5B2dbg.c +++ b/src/H5B2dbg.c @@ -115,7 +115,7 @@ H5B2_hdr_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, /* * Load the B-tree header. */ - if(NULL == (bt2 = (H5B2_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT2_HDR, addr, (size_t)H5B2_HEADER_SIZE(f), &cache_udata, H5AC2_READ))) + if(NULL == (bt2 = (H5B2_t *)H5AC_protect(f, dxpl_id, H5AC_BT2_HDR, addr, (size_t)H5B2_HEADER_SIZE(f), &cache_udata, H5AC_READ))) HGOTO_ERROR(H5E_BTREE, H5E_CANTLOAD, FAIL, "unable to load B-tree header") /* Get the pointer to the shared B-tree info */ @@ -179,7 +179,7 @@ H5B2_hdr_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, } /* end for */ done: - if(bt2 && H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_HDR, addr, (size_t)0, bt2, H5AC2__NO_FLAGS_SET) < 0) + if(bt2 && H5AC_unprotect(f, dxpl_id, H5AC_BT2_HDR, addr, (size_t)0, bt2, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_BTREE, H5E_PROTECT, FAIL, "unable to release B-tree header") FUNC_LEAVE_NOAPI(ret_value) @@ -231,7 +231,7 @@ H5B2_int_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, /* * Load the B-tree header. */ - if(NULL == (bt2 = (H5B2_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT2_HDR, hdr_addr, (size_t)H5B2_HEADER_SIZE(f), &cache_udata, H5AC2_READ))) + if(NULL == (bt2 = (H5B2_t *)H5AC_protect(f, dxpl_id, H5AC_BT2_HDR, hdr_addr, (size_t)H5B2_HEADER_SIZE(f), &cache_udata, H5AC_READ))) HGOTO_ERROR(H5E_BTREE, H5E_CANTLOAD, FAIL, "unable to load B-tree header") /* Get the pointer to the shared B-tree info */ @@ -241,11 +241,11 @@ H5B2_int_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, /* * Load the B-tree internal node */ - if(NULL == (internal = H5B2_protect_internal(f, dxpl_id, bt2->shared, addr, nrec, depth, H5AC2_READ))) + if(NULL == (internal = H5B2_protect_internal(f, dxpl_id, bt2->shared, addr, nrec, depth, H5AC_READ))) HGOTO_ERROR(H5E_BTREE, H5E_CANTLOAD, FAIL, "unable to load B-tree internal node") /* Release the B-tree header */ - if(H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_HDR, hdr_addr, (size_t)0, bt2, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_BT2_HDR, hdr_addr, (size_t)0, bt2, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_BTREE, H5E_PROTECT, FAIL, "unable to release B-tree header") bt2 = NULL; @@ -312,7 +312,7 @@ H5B2_int_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, internal->node_ptrs[u].addr); done: - if(internal && H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_INT, addr, (size_t)0, internal, H5AC2__NO_FLAGS_SET) < 0) + if(internal && H5AC_unprotect(f, dxpl_id, H5AC_BT2_INT, addr, (size_t)0, internal, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_BTREE, H5E_PROTECT, FAIL, "unable to release B-tree internal node") FUNC_LEAVE_NOAPI(ret_value) @@ -364,7 +364,7 @@ H5B2_leaf_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, /* * Load the B-tree header. */ - if(NULL == (bt2 = (H5B2_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT2_HDR, hdr_addr, (size_t)H5B2_HEADER_SIZE(f), &cache_udata, H5AC2_READ))) + if(NULL == (bt2 = (H5B2_t *)H5AC_protect(f, dxpl_id, H5AC_BT2_HDR, hdr_addr, (size_t)H5B2_HEADER_SIZE(f), &cache_udata, H5AC_READ))) HGOTO_ERROR(H5E_BTREE, H5E_CANTLOAD, FAIL, "unable to load B-tree header") /* Get the pointer to the shared B-tree info */ @@ -374,11 +374,11 @@ H5B2_leaf_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, /* * Load the B-tree leaf node */ - if(NULL == (leaf = (H5B2_leaf_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT2_LEAF, addr, (size_t)shared->node_size, &cache_udata, H5AC2_READ))) + if(NULL == (leaf = (H5B2_leaf_t *)H5AC_protect(f, dxpl_id, H5AC_BT2_LEAF, addr, (size_t)shared->node_size, &cache_udata, H5AC_READ))) HGOTO_ERROR(H5E_BTREE, H5E_CANTLOAD, FAIL, "unable to load B-tree leaf node") /* Release the B-tree header */ - if(H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_HDR, hdr_addr, (size_t)0, bt2, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_BT2_HDR, hdr_addr, (size_t)0, bt2, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_BTREE, H5E_PROTECT, FAIL, "unable to release B-tree header") bt2 = NULL; @@ -426,7 +426,7 @@ H5B2_leaf_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, } /* end for */ done: - if(leaf && H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_LEAF, addr, (size_t)0, leaf, H5AC2__NO_FLAGS_SET) < 0) + if(leaf && H5AC_unprotect(f, dxpl_id, H5AC_BT2_LEAF, addr, (size_t)0, leaf, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_BTREE, H5E_PROTECT, FAIL, "unable to release B-tree leaf node") FUNC_LEAVE_NOAPI(ret_value) diff --git a/src/H5B2int.c b/src/H5B2int.c index d991347..c9eb628 100644 --- a/src/H5B2int.c +++ b/src/H5B2int.c @@ -368,7 +368,7 @@ H5B2_split1(H5F_t *f, hid_t dxpl_id, unsigned depth, H5B2_node_ptr_t *curr_node_ unsigned *parent_cache_info_flags_ptr, H5B2_internal_t *internal, unsigned *internal_flags_ptr, unsigned idx) { - const H5AC2_class_t *child_class; /* Pointer to child node's class info */ + const H5AC_class_t *child_class; /* Pointer to child node's class info */ haddr_t left_addr, right_addr; /* Addresses of left & right child nodes */ void *left_child, *right_child; /* Pointers to child nodes */ unsigned *left_nrec, *right_nrec; /* Pointers to child # of records */ @@ -407,14 +407,14 @@ H5B2_split1(H5F_t *f, hid_t dxpl_id, unsigned depth, H5B2_node_ptr_t *curr_node_ HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, FAIL, "unable to create new internal node") /* Setup information for unlocking child nodes */ - child_class = H5AC2_BT2_INT; + child_class = H5AC_BT2_INT; left_addr = internal->node_ptrs[idx].addr; right_addr = internal->node_ptrs[idx + 1].addr; /* Protect both leafs */ - if(NULL == (left_int = H5B2_protect_internal(f, dxpl_id, internal->shared, left_addr, internal->node_ptrs[idx].node_nrec, (depth - 1), H5AC2_WRITE))) + if(NULL == (left_int = H5B2_protect_internal(f, dxpl_id, internal->shared, left_addr, internal->node_ptrs[idx].node_nrec, (depth - 1), H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree internal node") - if(NULL == (right_int = H5B2_protect_internal(f, dxpl_id, internal->shared, right_addr, internal->node_ptrs[idx + 1].node_nrec, (depth - 1), H5AC2_WRITE))) + if(NULL == (right_int = H5B2_protect_internal(f, dxpl_id, internal->shared, right_addr, internal->node_ptrs[idx + 1].node_nrec, (depth - 1), H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree internal node") /* More setup for child nodes */ @@ -436,7 +436,7 @@ H5B2_split1(H5F_t *f, hid_t dxpl_id, unsigned depth, H5B2_node_ptr_t *curr_node_ HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, FAIL, "unable to create new leaf node") /* Setup information for unlocking child nodes */ - child_class = H5AC2_BT2_LEAF; + child_class = H5AC_BT2_LEAF; left_addr = internal->node_ptrs[idx].addr; right_addr = internal->node_ptrs[idx + 1].addr; @@ -445,12 +445,12 @@ H5B2_split1(H5F_t *f, hid_t dxpl_id, unsigned depth, H5B2_node_ptr_t *curr_node_ cache_leaf_udata.bt2_shared = internal->shared; /* Protect both leafs */ - if(NULL == (left_leaf = (H5B2_leaf_t *)H5AC2_protect(f, dxpl_id, child_class, left_addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC2_WRITE))) + if(NULL == (left_leaf = (H5B2_leaf_t *)H5AC_protect(f, dxpl_id, child_class, left_addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree leaf node") cache_leaf_udata.nrec = &(internal->node_ptrs[idx + 1].node_nrec); - if(NULL == (right_leaf = (H5B2_leaf_t *)H5AC2_protect(f, dxpl_id, child_class, right_addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC2_WRITE))) + if(NULL == (right_leaf = (H5B2_leaf_t *)H5AC_protect(f, dxpl_id, child_class, right_addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree leaf node") /* More setup for child nodes */ @@ -512,13 +512,13 @@ H5B2_split1(H5F_t *f, hid_t dxpl_id, unsigned depth, H5B2_node_ptr_t *curr_node_ internal->nrec++; /* Mark parent as dirty */ - *internal_flags_ptr |= H5AC2__DIRTIED_FLAG; + *internal_flags_ptr |= H5AC__DIRTIED_FLAG; /* Update grandparent info */ curr_node_ptr->node_nrec++; /* Mark grandparent as dirty */ - *parent_cache_info_flags_ptr |= H5AC2__DIRTIED_FLAG; + *parent_cache_info_flags_ptr |= H5AC__DIRTIED_FLAG; #ifdef H5B2_DEBUG H5B2_assert_internal((hsize_t)0,shared,internal); @@ -533,9 +533,9 @@ H5B2_split1(H5F_t *f, hid_t dxpl_id, unsigned depth, H5B2_node_ptr_t *curr_node_ #endif /* H5B2_DEBUG */ /* Release child nodes (marked as dirty) */ - if(H5AC2_unprotect(f, dxpl_id, child_class, left_addr, (size_t)0, left_child, H5AC2__DIRTIED_FLAG) < 0) + if(H5AC_unprotect(f, dxpl_id, child_class, left_addr, (size_t)0, left_child, H5AC__DIRTIED_FLAG) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree leaf node") - if(H5AC2_unprotect(f, dxpl_id, child_class, right_addr, (size_t)0, right_child, H5AC2__DIRTIED_FLAG) < 0) + if(H5AC_unprotect(f, dxpl_id, child_class, right_addr, (size_t)0, right_child, H5AC__DIRTIED_FLAG) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree leaf node") done: @@ -563,7 +563,7 @@ H5B2_split_root(H5F_t *f, hid_t dxpl_id, H5B2_t *bt2, unsigned *bt2_flags_ptr) { H5B2_internal_t *new_root; /* Pointer to new root node */ H5B2_shared_t *shared; /* Pointer to B-tree's shared information */ - unsigned new_root_flags = H5AC2__NO_FLAGS_SET; /* Cache flags for new root node */ + unsigned new_root_flags = H5AC__NO_FLAGS_SET; /* Cache flags for new root node */ H5B2_node_ptr_t old_root_ptr; /* Old node pointer to root node in B-tree */ size_t sz_max_nrec; /* Temporary variable for range checking */ unsigned u_max_nrec_size; /* Temporary variable for range checking */ @@ -609,7 +609,7 @@ H5B2_split_root(H5F_t *f, hid_t dxpl_id, H5B2_t *bt2, unsigned *bt2_flags_ptr) HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, FAIL, "unable to create new internal node") /* Protect new root node */ - if(NULL == (new_root = H5B2_protect_internal(f, dxpl_id, bt2->shared, bt2->root.addr, bt2->root.node_nrec, shared->depth, H5AC2_WRITE))) + if(NULL == (new_root = H5B2_protect_internal(f, dxpl_id, bt2->shared, bt2->root.addr, bt2->root.node_nrec, shared->depth, H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree internal node") /* Set first node pointer in root node to old root node pointer info */ @@ -620,7 +620,7 @@ H5B2_split_root(H5F_t *f, hid_t dxpl_id, H5B2_t *bt2, unsigned *bt2_flags_ptr) HGOTO_ERROR(H5E_BTREE, H5E_CANTSPLIT, FAIL, "unable to split old root node") /* Release new root node (marked as dirty) */ - if(H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_INT, bt2->root.addr, (size_t)0, new_root, new_root_flags) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_BT2_INT, bt2->root.addr, (size_t)0, new_root, new_root_flags) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree internal node") done: @@ -646,7 +646,7 @@ done: static herr_t H5B2_redistribute2(H5F_t *f, hid_t dxpl_id, unsigned depth, H5B2_internal_t *internal, unsigned idx) { - const H5AC2_class_t *child_class; /* Pointer to child node's class info */ + const H5AC_class_t *child_class; /* Pointer to child node's class info */ haddr_t left_addr, right_addr; /* Addresses of left & right child nodes */ void *left_child, *right_child; /* Pointers to child nodes */ unsigned *left_nrec, *right_nrec; /* Pointers to child # of records */ @@ -672,14 +672,14 @@ H5B2_redistribute2(H5F_t *f, hid_t dxpl_id, unsigned depth, H5B2_internal_t *int H5B2_internal_t *right_internal; /* Pointer to right internal node */ /* Setup information for unlocking child nodes */ - child_class = H5AC2_BT2_INT; + child_class = H5AC_BT2_INT; left_addr = internal->node_ptrs[idx].addr; right_addr = internal->node_ptrs[idx+1].addr; /* Lock left & right B-tree child nodes */ - if (NULL == (left_internal = H5B2_protect_internal(f, dxpl_id, internal->shared, left_addr, internal->node_ptrs[idx].node_nrec, (depth - 1), H5AC2_WRITE))) + if (NULL == (left_internal = H5B2_protect_internal(f, dxpl_id, internal->shared, left_addr, internal->node_ptrs[idx].node_nrec, (depth - 1), H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree leaf node") - if (NULL == (right_internal = H5B2_protect_internal(f, dxpl_id, internal->shared, right_addr, internal->node_ptrs[idx+1].node_nrec, (depth - 1), H5AC2_WRITE))) + if (NULL == (right_internal = H5B2_protect_internal(f, dxpl_id, internal->shared, right_addr, internal->node_ptrs[idx+1].node_nrec, (depth - 1), H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree leaf node") /* More setup for child nodes */ @@ -697,7 +697,7 @@ H5B2_redistribute2(H5F_t *f, hid_t dxpl_id, unsigned depth, H5B2_internal_t *int H5B2_leaf_t *right_leaf; /* Pointer to right leaf node */ /* Setup information for unlocking child nodes */ - child_class = H5AC2_BT2_LEAF; + child_class = H5AC_BT2_LEAF; left_addr = internal->node_ptrs[idx].addr; right_addr = internal->node_ptrs[idx+1].addr; @@ -706,12 +706,12 @@ H5B2_redistribute2(H5F_t *f, hid_t dxpl_id, unsigned depth, H5B2_internal_t *int cache_leaf_udata.bt2_shared = internal->shared; /* Lock left & right B-tree child nodes */ - if (NULL == (left_leaf = (H5B2_leaf_t *)H5AC2_protect(f, dxpl_id, child_class, left_addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC2_WRITE))) + if (NULL == (left_leaf = (H5B2_leaf_t *)H5AC_protect(f, dxpl_id, child_class, left_addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree leaf node") cache_leaf_udata.nrec = &(internal->node_ptrs[idx + 1].node_nrec); - if (NULL == (right_leaf = (H5B2_leaf_t *)H5AC2_protect(f, dxpl_id, child_class, right_addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC2_WRITE))) + if (NULL == (right_leaf = (H5B2_leaf_t *)H5AC_protect(f, dxpl_id, child_class, right_addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree leaf node") /* More setup for child nodes */ @@ -848,9 +848,9 @@ H5B2_redistribute2(H5F_t *f, hid_t dxpl_id, unsigned depth, H5B2_internal_t *int #endif /* H5B2_DEBUG */ /* Release child nodes (marked as dirty) */ - if (H5AC2_unprotect(f, dxpl_id, child_class, left_addr, (size_t)0, left_child, H5AC2__DIRTIED_FLAG) < 0) + if (H5AC_unprotect(f, dxpl_id, child_class, left_addr, (size_t)0, left_child, H5AC__DIRTIED_FLAG) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree child node") - if (H5AC2_unprotect(f, dxpl_id, child_class, right_addr, (size_t)0, right_child, H5AC2__DIRTIED_FLAG) < 0) + if (H5AC_unprotect(f, dxpl_id, child_class, right_addr, (size_t)0, right_child, H5AC__DIRTIED_FLAG) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree child node") done: @@ -877,7 +877,7 @@ static herr_t H5B2_redistribute3(H5F_t *f, hid_t dxpl_id, unsigned depth, H5B2_internal_t *internal, unsigned *internal_flags_ptr, unsigned idx) { - const H5AC2_class_t *child_class; /* Pointer to child node's class info */ + const H5AC_class_t *child_class; /* Pointer to child node's class info */ haddr_t left_addr, right_addr; /* Addresses of left & right child nodes */ haddr_t middle_addr; /* Address of middle child node */ void *left_child, *right_child; /* Pointers to child nodes */ @@ -911,17 +911,17 @@ H5B2_redistribute3(H5F_t *f, hid_t dxpl_id, unsigned depth, H5B2_internal_t *right_internal; /* Pointer to right internal node */ /* Setup information for unlocking child nodes */ - child_class = H5AC2_BT2_INT; + child_class = H5AC_BT2_INT; left_addr = internal->node_ptrs[idx-1].addr; middle_addr = internal->node_ptrs[idx].addr; right_addr = internal->node_ptrs[idx+1].addr; /* Lock B-tree child nodes */ - if (NULL == (left_internal = H5B2_protect_internal(f, dxpl_id, internal->shared, left_addr, internal->node_ptrs[idx-1].node_nrec, (depth - 1), H5AC2_WRITE))) + if (NULL == (left_internal = H5B2_protect_internal(f, dxpl_id, internal->shared, left_addr, internal->node_ptrs[idx-1].node_nrec, (depth - 1), H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree internal node") - if (NULL == (middle_internal = H5B2_protect_internal(f, dxpl_id, internal->shared, middle_addr, internal->node_ptrs[idx].node_nrec, (depth - 1), H5AC2_WRITE))) + if (NULL == (middle_internal = H5B2_protect_internal(f, dxpl_id, internal->shared, middle_addr, internal->node_ptrs[idx].node_nrec, (depth - 1), H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree internal node") - if (NULL == (right_internal = H5B2_protect_internal(f, dxpl_id, internal->shared, right_addr, internal->node_ptrs[idx+1].node_nrec, (depth - 1), H5AC2_WRITE))) + if (NULL == (right_internal = H5B2_protect_internal(f, dxpl_id, internal->shared, right_addr, internal->node_ptrs[idx+1].node_nrec, (depth - 1), H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree internal node") /* More setup for child nodes */ @@ -944,7 +944,7 @@ H5B2_redistribute3(H5F_t *f, hid_t dxpl_id, unsigned depth, H5B2_leaf_t *right_leaf; /* Pointer to right leaf node */ /* Setup information for unlocking child nodes */ - child_class = H5AC2_BT2_LEAF; + child_class = H5AC_BT2_LEAF; left_addr = internal->node_ptrs[idx-1].addr; middle_addr = internal->node_ptrs[idx].addr; right_addr = internal->node_ptrs[idx+1].addr; @@ -954,17 +954,17 @@ H5B2_redistribute3(H5F_t *f, hid_t dxpl_id, unsigned depth, cache_leaf_udata.bt2_shared = internal->shared; /* Lock B-tree child nodes */ - if (NULL == (left_leaf = (H5B2_leaf_t *)H5AC2_protect(f, dxpl_id, child_class, left_addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC2_WRITE))) + if (NULL == (left_leaf = (H5B2_leaf_t *)H5AC_protect(f, dxpl_id, child_class, left_addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree leaf node") cache_leaf_udata.nrec = &(internal->node_ptrs[idx].node_nrec); - if (NULL == (middle_leaf = (H5B2_leaf_t *)H5AC2_protect(f, dxpl_id, child_class, middle_addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC2_WRITE))) + if (NULL == (middle_leaf = (H5B2_leaf_t *)H5AC_protect(f, dxpl_id, child_class, middle_addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree leaf node") cache_leaf_udata.nrec = &(internal->node_ptrs[idx+1].node_nrec); - if (NULL == (right_leaf = (H5B2_leaf_t *)H5AC2_protect(f, dxpl_id, child_class, right_addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC2_WRITE))) + if (NULL == (right_leaf = (H5B2_leaf_t *)H5AC_protect(f, dxpl_id, child_class, right_addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree leaf node") /* More setup for child nodes */ @@ -1173,7 +1173,7 @@ H5B2_redistribute3(H5F_t *f, hid_t dxpl_id, unsigned depth, } /* end else */ /* Mark parent as dirty */ - *internal_flags_ptr |= H5AC2__DIRTIED_FLAG; + *internal_flags_ptr |= H5AC__DIRTIED_FLAG; #ifdef QAK { @@ -1231,11 +1231,11 @@ H5B2_redistribute3(H5F_t *f, hid_t dxpl_id, unsigned depth, #endif /* H5B2_DEBUG */ /* Unlock child nodes (marked as dirty) */ - if (H5AC2_unprotect(f, dxpl_id, child_class, left_addr, (size_t)0, left_child, H5AC2__DIRTIED_FLAG) < 0) + if (H5AC_unprotect(f, dxpl_id, child_class, left_addr, (size_t)0, left_child, H5AC__DIRTIED_FLAG) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree child node") - if (H5AC2_unprotect(f, dxpl_id, child_class, middle_addr, (size_t)0, middle_child, H5AC2__DIRTIED_FLAG) < 0) + if (H5AC_unprotect(f, dxpl_id, child_class, middle_addr, (size_t)0, middle_child, H5AC__DIRTIED_FLAG) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree child node") - if (H5AC2_unprotect(f, dxpl_id, child_class, right_addr, (size_t)0, right_child, H5AC2__DIRTIED_FLAG) < 0) + if (H5AC_unprotect(f, dxpl_id, child_class, right_addr, (size_t)0, right_child, H5AC__DIRTIED_FLAG) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree child node") done: @@ -1263,7 +1263,7 @@ H5B2_merge2(H5F_t *f, hid_t dxpl_id, unsigned depth, H5B2_node_ptr_t *curr_node_ptr, unsigned *parent_cache_info_flags_ptr, H5B2_internal_t *internal, unsigned *internal_flags_ptr, unsigned idx) { - const H5AC2_class_t *child_class; /* Pointer to child node's class info */ + const H5AC_class_t *child_class; /* Pointer to child node's class info */ haddr_t left_addr, right_addr; /* Addresses of left & right child nodes */ void *left_child, *right_child; /* Pointers to left & right child nodes */ unsigned *left_nrec, *right_nrec; /* Pointers to left & right child # of records */ @@ -1291,14 +1291,14 @@ H5B2_merge2(H5F_t *f, hid_t dxpl_id, unsigned depth, H5B2_internal_t *right_internal; /* Pointer to right internal node */ /* Setup information for unlocking child nodes */ - child_class = H5AC2_BT2_INT; + child_class = H5AC_BT2_INT; left_addr = internal->node_ptrs[idx].addr; right_addr = internal->node_ptrs[idx+1].addr; /* Lock left & right B-tree child nodes */ - if(NULL == (left_internal = H5B2_protect_internal(f, dxpl_id, internal->shared, left_addr, internal->node_ptrs[idx].node_nrec, (depth - 1), H5AC2_WRITE))) + if(NULL == (left_internal = H5B2_protect_internal(f, dxpl_id, internal->shared, left_addr, internal->node_ptrs[idx].node_nrec, (depth - 1), H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree internal node") - if(NULL == (right_internal = H5B2_protect_internal(f, dxpl_id, internal->shared, right_addr, internal->node_ptrs[idx+1].node_nrec, (depth - 1), H5AC2_WRITE))) + if(NULL == (right_internal = H5B2_protect_internal(f, dxpl_id, internal->shared, right_addr, internal->node_ptrs[idx+1].node_nrec, (depth - 1), H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree internal node") /* More setup for accessing child node information */ @@ -1316,7 +1316,7 @@ H5B2_merge2(H5F_t *f, hid_t dxpl_id, unsigned depth, H5B2_leaf_t *right_leaf; /* Pointer to right leaf node */ /* Setup information for unlocking child nodes */ - child_class = H5AC2_BT2_LEAF; + child_class = H5AC_BT2_LEAF; left_addr = internal->node_ptrs[idx].addr; right_addr = internal->node_ptrs[idx+1].addr; @@ -1325,12 +1325,12 @@ H5B2_merge2(H5F_t *f, hid_t dxpl_id, unsigned depth, cache_leaf_udata.bt2_shared = internal->shared; /* Lock left & right B-tree child nodes */ - if(NULL == (left_leaf = (H5B2_leaf_t *)H5AC2_protect(f, dxpl_id, child_class, left_addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC2_WRITE))) + if(NULL == (left_leaf = (H5B2_leaf_t *)H5AC_protect(f, dxpl_id, child_class, left_addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree leaf node") cache_leaf_udata.nrec = &(internal->node_ptrs[idx+1].node_nrec); - if(NULL == (right_leaf = (H5B2_leaf_t *)H5AC2_protect(f, dxpl_id, child_class, right_addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC2_WRITE))) + if(NULL == (right_leaf = (H5B2_leaf_t *)H5AC_protect(f, dxpl_id, child_class, right_addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree leaf node") /* More setup for accessing child node information */ @@ -1374,13 +1374,13 @@ H5B2_merge2(H5F_t *f, hid_t dxpl_id, unsigned depth, internal->nrec--; /* Mark parent as dirty */ - *internal_flags_ptr |= H5AC2__DIRTIED_FLAG; + *internal_flags_ptr |= H5AC__DIRTIED_FLAG; /* Update grandparent info */ curr_node_ptr->node_nrec--; /* Mark grandparent as dirty */ - *parent_cache_info_flags_ptr |= H5AC2__DIRTIED_FLAG; + *parent_cache_info_flags_ptr |= H5AC__DIRTIED_FLAG; #ifdef H5B2_DEBUG H5B2_assert_internal((hsize_t)0,shared,internal); @@ -1391,13 +1391,13 @@ H5B2_merge2(H5F_t *f, hid_t dxpl_id, unsigned depth, #endif /* H5B2_DEBUG */ /* Unlock left node (marked as dirty) */ - if(H5AC2_unprotect(f, dxpl_id, child_class, left_addr, (size_t)0, left_child, H5AC2__DIRTIED_FLAG) < 0) + if(H5AC_unprotect(f, dxpl_id, child_class, left_addr, (size_t)0, left_child, H5AC__DIRTIED_FLAG) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree child node") /* Delete right node & remove from cache (marked as dirty) */ if(H5MF_xfree(f, H5FD_MEM_BTREE, dxpl_id, right_addr, (hsize_t)shared->node_size) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to free B-tree leaf node") - if(H5AC2_unprotect(f, dxpl_id, child_class, right_addr, (size_t)0, right_child, H5AC2__DIRTIED_FLAG|H5AC2__DELETED_FLAG) < 0) + if(H5AC_unprotect(f, dxpl_id, child_class, right_addr, (size_t)0, right_child, H5AC__DIRTIED_FLAG|H5AC__DELETED_FLAG) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree child node") done: @@ -1425,7 +1425,7 @@ H5B2_merge3(H5F_t *f, hid_t dxpl_id, unsigned depth, H5B2_node_ptr_t *curr_node_ptr, unsigned *parent_cache_info_flags_ptr, H5B2_internal_t *internal, unsigned *internal_flags_ptr, unsigned idx) { - const H5AC2_class_t *child_class; /* Pointer to child node's class info */ + const H5AC_class_t *child_class; /* Pointer to child node's class info */ haddr_t left_addr, right_addr; /* Addresses of left & right child nodes */ haddr_t middle_addr; /* Address of middle child node */ void *left_child, *right_child; /* Pointers to left & right child nodes */ @@ -1460,17 +1460,17 @@ H5B2_merge3(H5F_t *f, hid_t dxpl_id, unsigned depth, H5B2_internal_t *right_internal; /* Pointer to right internal node */ /* Setup information for unlocking child nodes */ - child_class = H5AC2_BT2_INT; + child_class = H5AC_BT2_INT; left_addr = internal->node_ptrs[idx-1].addr; middle_addr = internal->node_ptrs[idx].addr; right_addr = internal->node_ptrs[idx+1].addr; /* Lock B-tree child nodes */ - if (NULL == (left_internal = H5B2_protect_internal(f, dxpl_id, internal->shared, left_addr, internal->node_ptrs[idx-1].node_nrec, (depth - 1), H5AC2_WRITE))) + if (NULL == (left_internal = H5B2_protect_internal(f, dxpl_id, internal->shared, left_addr, internal->node_ptrs[idx-1].node_nrec, (depth - 1), H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree internal node") - if (NULL == (middle_internal = H5B2_protect_internal(f, dxpl_id, internal->shared, middle_addr, internal->node_ptrs[idx].node_nrec, (depth - 1), H5AC2_WRITE))) + if (NULL == (middle_internal = H5B2_protect_internal(f, dxpl_id, internal->shared, middle_addr, internal->node_ptrs[idx].node_nrec, (depth - 1), H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree internal node") - if (NULL == (right_internal = H5B2_protect_internal(f, dxpl_id, internal->shared, right_addr, internal->node_ptrs[idx+1].node_nrec, (depth - 1), H5AC2_WRITE))) + if (NULL == (right_internal = H5B2_protect_internal(f, dxpl_id, internal->shared, right_addr, internal->node_ptrs[idx+1].node_nrec, (depth - 1), H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree internal node") /* More setup for accessing child node information */ @@ -1493,7 +1493,7 @@ H5B2_merge3(H5F_t *f, hid_t dxpl_id, unsigned depth, H5B2_leaf_t *right_leaf; /* Pointer to right leaf node */ /* Setup information for unlocking child nodes */ - child_class = H5AC2_BT2_LEAF; + child_class = H5AC_BT2_LEAF; left_addr = internal->node_ptrs[idx-1].addr; middle_addr = internal->node_ptrs[idx].addr; right_addr = internal->node_ptrs[idx+1].addr; @@ -1503,17 +1503,17 @@ H5B2_merge3(H5F_t *f, hid_t dxpl_id, unsigned depth, cache_leaf_udata.bt2_shared = internal->shared; /* Lock B-tree child nodes */ - if (NULL == (left_leaf = (H5B2_leaf_t *)H5AC2_protect(f, dxpl_id, child_class, left_addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC2_WRITE))) + if (NULL == (left_leaf = (H5B2_leaf_t *)H5AC_protect(f, dxpl_id, child_class, left_addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree leaf node") cache_leaf_udata.nrec = &(internal->node_ptrs[idx].node_nrec); - if (NULL == (middle_leaf = (H5B2_leaf_t *)H5AC2_protect(f, dxpl_id, child_class, middle_addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC2_WRITE))) + if (NULL == (middle_leaf = (H5B2_leaf_t *)H5AC_protect(f, dxpl_id, child_class, middle_addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree leaf node") cache_leaf_udata.nrec = &(internal->node_ptrs[idx+1].node_nrec); - if (NULL == (right_leaf = (H5B2_leaf_t *)H5AC2_protect(f, dxpl_id, child_class, right_addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC2_WRITE))) + if (NULL == (right_leaf = (H5B2_leaf_t *)H5AC_protect(f, dxpl_id, child_class, right_addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree leaf node") /* More setup for accessing child node information */ @@ -1603,13 +1603,13 @@ H5B2_merge3(H5F_t *f, hid_t dxpl_id, unsigned depth, internal->nrec--; /* Mark parent as dirty */ - *internal_flags_ptr |= H5AC2__DIRTIED_FLAG; + *internal_flags_ptr |= H5AC__DIRTIED_FLAG; /* Update grandparent info */ curr_node_ptr->node_nrec--; /* Mark grandparent as dirty */ - *parent_cache_info_flags_ptr |= H5AC2__DIRTIED_FLAG; + *parent_cache_info_flags_ptr |= H5AC__DIRTIED_FLAG; #ifdef H5B2_DEBUG H5B2_assert_internal((hsize_t)0,shared,internal); @@ -1624,15 +1624,15 @@ H5B2_merge3(H5F_t *f, hid_t dxpl_id, unsigned depth, #endif /* H5B2_DEBUG */ /* Unlock left & middle nodes (marked as dirty) */ - if (H5AC2_unprotect(f, dxpl_id, child_class, left_addr, (size_t)0, left_child, H5AC2__DIRTIED_FLAG) < 0) + if (H5AC_unprotect(f, dxpl_id, child_class, left_addr, (size_t)0, left_child, H5AC__DIRTIED_FLAG) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree child node") - if (H5AC2_unprotect(f, dxpl_id, child_class, middle_addr, (size_t)0, middle_child, H5AC2__DIRTIED_FLAG) < 0) + if (H5AC_unprotect(f, dxpl_id, child_class, middle_addr, (size_t)0, middle_child, H5AC__DIRTIED_FLAG) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree child node") /* Delete right node & remove from cache (marked as dirty) */ if (H5MF_xfree(f, H5FD_MEM_BTREE, dxpl_id, right_addr, (hsize_t)shared->node_size) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to free B-tree leaf node") - if (H5AC2_unprotect(f, dxpl_id, child_class, right_addr, (size_t)0, right_child, H5AC2__DIRTIED_FLAG|H5AC2__DELETED_FLAG) < 0) + if (H5AC_unprotect(f, dxpl_id, child_class, right_addr, (size_t)0, right_child, H5AC__DIRTIED_FLAG|H5AC__DELETED_FLAG) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree child node") done: @@ -1660,7 +1660,7 @@ H5B2_swap_leaf(H5F_t *f, hid_t dxpl_id, unsigned depth, H5B2_internal_t *internal, unsigned *internal_flags_ptr, unsigned idx, void *swap_loc) { - const H5AC2_class_t *child_class; /* Pointer to child node's class info */ + const H5AC_class_t *child_class; /* Pointer to child node's class info */ haddr_t child_addr; /* Address of child node */ void *child; /* Pointer to child node */ uint8_t *child_native; /* Pointer to child's native records */ @@ -1684,11 +1684,11 @@ H5B2_swap_leaf(H5F_t *f, hid_t dxpl_id, unsigned depth, H5B2_internal_t *child_internal; /* Pointer to internal node */ /* Setup information for unlocking child node */ - child_class = H5AC2_BT2_INT; + child_class = H5AC_BT2_INT; child_addr = internal->node_ptrs[idx].addr; /* Lock B-tree child nodes */ - if(NULL == (child_internal = H5B2_protect_internal(f, dxpl_id, internal->shared, child_addr, internal->node_ptrs[idx].node_nrec, (depth - 1), H5AC2_WRITE))) + if(NULL == (child_internal = H5B2_protect_internal(f, dxpl_id, internal->shared, child_addr, internal->node_ptrs[idx].node_nrec, (depth - 1), H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree internal node") /* More setup for accessing child node information */ @@ -1699,7 +1699,7 @@ H5B2_swap_leaf(H5F_t *f, hid_t dxpl_id, unsigned depth, H5B2_leaf_t *child_leaf; /* Pointer to leaf node */ /* Setup information for unlocking child nodes */ - child_class = H5AC2_BT2_LEAF; + child_class = H5AC_BT2_LEAF; child_addr = internal->node_ptrs[idx].addr; cache_leaf_udata.f = f; @@ -1707,7 +1707,7 @@ H5B2_swap_leaf(H5F_t *f, hid_t dxpl_id, unsigned depth, cache_leaf_udata.bt2_shared = internal->shared; /* Lock B-tree child node */ - if (NULL == (child_leaf = (H5B2_leaf_t *)H5AC2_protect(f, dxpl_id, child_class, child_addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC2_WRITE))) + if (NULL == (child_leaf = (H5B2_leaf_t *)H5AC_protect(f, dxpl_id, child_class, child_addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree leaf node") /* More setup for accessing child node information */ @@ -1721,7 +1721,7 @@ H5B2_swap_leaf(H5F_t *f, hid_t dxpl_id, unsigned depth, HDmemcpy(swap_loc, shared->page, shared->type->nrec_size); /* Mark parent as dirty */ - *internal_flags_ptr |= H5AC2__DIRTIED_FLAG; + *internal_flags_ptr |= H5AC__DIRTIED_FLAG; #ifdef H5B2_DEBUG H5B2_assert_internal((hsize_t)0,shared,internal); @@ -1732,7 +1732,7 @@ H5B2_swap_leaf(H5F_t *f, hid_t dxpl_id, unsigned depth, #endif /* H5B2_DEBUG */ /* Unlock child node */ - if (H5AC2_unprotect(f, dxpl_id, child_class, child_addr, (size_t)0, child, H5AC2__DIRTIED_FLAG) < 0) + if (H5AC_unprotect(f, dxpl_id, child_class, child_addr, (size_t)0, child, H5AC__DIRTIED_FLAG) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree child node") done: @@ -1781,7 +1781,7 @@ H5B2_insert_leaf(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, HDassert(shared); /* Lock current B-tree node */ - if (NULL == (leaf = (H5B2_leaf_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT2_LEAF, curr_node_ptr->addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC2_WRITE))) + if (NULL == (leaf = (H5B2_leaf_t *)H5AC_protect(f, dxpl_id, H5AC_BT2_LEAF, curr_node_ptr->addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree leaf node") /* Must have a leaf node with enough space to insert a record now */ @@ -1819,7 +1819,7 @@ H5B2_insert_leaf(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, done: /* Release the B-tree leaf node (marked as dirty) */ - if(leaf && H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_LEAF, curr_node_ptr->addr, (size_t)0, leaf, H5AC2__DIRTIED_FLAG) < 0) + if(leaf && H5AC_unprotect(f, dxpl_id, H5AC_BT2_LEAF, curr_node_ptr->addr, (size_t)0, leaf, H5AC__DIRTIED_FLAG) < 0) HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release leaf B-tree node") FUNC_LEAVE_NOAPI(ret_value) @@ -1845,7 +1845,7 @@ H5B2_insert_internal(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, H5B2_node_ptr_t *curr_node_ptr, void *udata) { H5B2_internal_t *internal; /* Pointer to internal node */ - unsigned internal_flags = H5AC2__NO_FLAGS_SET; + unsigned internal_flags = H5AC__NO_FLAGS_SET; H5B2_shared_t *shared; /* Pointer to B-tree's shared information */ unsigned idx; /* Location of record which matches key */ herr_t ret_value = SUCCEED; @@ -1861,7 +1861,7 @@ H5B2_insert_internal(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, HDassert(H5F_addr_defined(curr_node_ptr->addr)); /* Lock current B-tree node */ - if(NULL == (internal = H5B2_protect_internal(f, dxpl_id, bt2_shared, curr_node_ptr->addr, curr_node_ptr->node_nrec, depth, H5AC2_WRITE))) + if(NULL == (internal = H5B2_protect_internal(f, dxpl_id, bt2_shared, curr_node_ptr->addr, curr_node_ptr->node_nrec, depth, H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree internal node") /* Get the pointer to the shared B-tree info */ @@ -1955,11 +1955,11 @@ H5B2_insert_internal(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, curr_node_ptr->all_nrec++; /* Mark node as dirty */ - internal_flags |= H5AC2__DIRTIED_FLAG; + internal_flags |= H5AC__DIRTIED_FLAG; done: /* Release the B-tree internal node */ - if (internal && H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_INT, curr_node_ptr->addr, (size_t)0, internal, internal_flags) < 0) + if (internal && H5AC_unprotect(f, dxpl_id, H5AC_BT2_INT, curr_node_ptr->addr, (size_t)0, internal, internal_flags) < 0) HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release internal B-tree node") FUNC_LEAVE_NOAPI(ret_value) @@ -1999,7 +1999,7 @@ H5B2_create_leaf(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, H5B2_node_ptr_t *n HGOTO_ERROR (H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for B-tree leaf info") /* Set metadata cache info */ - HDmemset(&leaf->cache_info, 0, sizeof(H5AC2_info_t)); + HDmemset(&leaf->cache_info, 0, sizeof(H5AC_info_t)); /* Share common B-tree information */ leaf->shared = bt2_shared; @@ -2024,7 +2024,7 @@ HDmemset(leaf->leaf_native, 0, shared->type->nrec_size * shared->node_info[0].ma HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "file allocation failed for B-tree leaf node") /* Cache the new B-tree node */ - if(H5AC2_set(f, dxpl_id, H5AC2_BT2_LEAF, node_ptr->addr, (size_t)shared->node_size, leaf, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_set(f, dxpl_id, H5AC_BT2_LEAF, node_ptr->addr, (size_t)shared->node_size, leaf, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, FAIL, "can't add B-tree leaf to cache") done: @@ -2072,7 +2072,7 @@ H5B2_create_internal(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for B-tree internal info") /* Set metadata cache info */ - HDmemset(&internal->cache_info, 0, sizeof(H5AC2_info_t)); + HDmemset(&internal->cache_info, 0, sizeof(H5AC_info_t)); /* Share common B-tree information */ internal->shared = bt2_shared; @@ -2105,7 +2105,7 @@ HDmemset(internal->node_ptrs, 0, sizeof(H5B2_node_ptr_t) * (shared->node_info[de HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "file allocation failed for B-tree internal node") /* Cache the new B-tree node */ - if(H5AC2_set(f, dxpl_id, H5AC2_BT2_INT, node_ptr->addr, (size_t)shared->node_size, internal, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_set(f, dxpl_id, H5AC_BT2_INT, node_ptr->addr, (size_t)shared->node_size, internal, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTINIT, FAIL, "can't add B-tree internal node to cache") done: @@ -2133,7 +2133,7 @@ done: */ H5B2_internal_t * H5B2_protect_internal(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, haddr_t addr, - unsigned nrec, unsigned depth, H5AC2_protect_t rw) + unsigned nrec, unsigned depth, H5AC_protect_t rw) { H5B2_internal_cache_ud_t udata; /* User data to pass through to cache 'deserialize' callback */ H5B2_shared_t *shared; /* B-tree's shared info */ @@ -2158,7 +2158,7 @@ H5B2_protect_internal(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, haddr_t addr, HDassert(shared); /* Protect the internal node */ - if(NULL == (ret_value = (H5B2_internal_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT2_INT, addr, (size_t)shared->node_size, &udata, rw))) + if(NULL == (ret_value = (H5B2_internal_t *)H5AC_protect(f, dxpl_id, H5AC_BT2_INT, addr, (size_t)shared->node_size, &udata, rw))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, NULL, "unable to load B-tree internal node") done: @@ -2188,7 +2188,7 @@ H5B2_iterate_node(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, unsigned depth, const H5B2_node_ptr_t *curr_node, H5B2_operator_t op, void *op_data) { H5B2_shared_t *shared; /* Pointer to B-tree's shared information */ - const H5AC2_class_t *curr_node_class = NULL; /* Pointer to current node's class info */ + const H5AC_class_t *curr_node_class = NULL; /* Pointer to current node's class info */ void *node = NULL; /* Pointers to current node */ uint8_t *node_native; /* Pointers to node's native records */ uint8_t *native = NULL; /* Pointers to copy of node's native records */ @@ -2214,11 +2214,11 @@ H5B2_iterate_node(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, unsigned depth, H5B2_internal_t *internal; /* Pointer to internal node */ /* Lock the current B-tree node */ - if(NULL == (internal = H5B2_protect_internal(f, dxpl_id, bt2_shared, curr_node->addr, curr_node->node_nrec, depth, H5AC2_READ))) + if(NULL == (internal = H5B2_protect_internal(f, dxpl_id, bt2_shared, curr_node->addr, curr_node->node_nrec, depth, H5AC_READ))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree internal node") /* Set up information about current node */ - curr_node_class = H5AC2_BT2_INT; + curr_node_class = H5AC_BT2_INT; node = internal; node_native = internal->int_native; @@ -2237,11 +2237,11 @@ H5B2_iterate_node(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, unsigned depth, cache_leaf_udata.bt2_shared = bt2_shared; /* Lock the current B-tree node */ - if (NULL == (leaf = (H5B2_leaf_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT2_LEAF, curr_node->addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC2_READ))) + if (NULL == (leaf = (H5B2_leaf_t *)H5AC_protect(f, dxpl_id, H5AC_BT2_LEAF, curr_node->addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC_READ))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree leaf node") /* Set up information about current node */ - curr_node_class = H5AC2_BT2_LEAF; + curr_node_class = H5AC_BT2_LEAF; node = leaf; node_native = leaf->leaf_native; } /* end else */ @@ -2254,7 +2254,7 @@ H5B2_iterate_node(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, unsigned depth, HDmemcpy(native, node_native, (shared->type->nrec_size * curr_node->node_nrec)); /* Unlock the node */ - if(H5AC2_unprotect(f, dxpl_id, curr_node_class, curr_node->addr, (size_t)0, node, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_unprotect(f, dxpl_id, curr_node_class, curr_node->addr, (size_t)0, node, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node") node = NULL; @@ -2310,7 +2310,7 @@ H5B2_remove_leaf(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, { H5B2_leaf_t *leaf; /* Pointer to leaf node */ haddr_t leaf_addr = HADDR_UNDEF; /* Leaf address on disk */ - unsigned leaf_flags = H5AC2__NO_FLAGS_SET; /* Flags for unprotecting leaf node */ + unsigned leaf_flags = H5AC__NO_FLAGS_SET; /* Flags for unprotecting leaf node */ H5B2_shared_t *shared; /* Pointer to B-tree's shared information */ unsigned idx; /* Location of record which matches key */ H5B2_leaf_cache_ud_t cache_leaf_udata; /* User-data for callback */ @@ -2334,7 +2334,7 @@ H5B2_remove_leaf(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, /* Lock current B-tree node */ leaf_addr = curr_node_ptr->addr; - if(NULL == (leaf = (H5B2_leaf_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT2_LEAF, leaf_addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC2_WRITE))) + if(NULL == (leaf = (H5B2_leaf_t *)H5AC_protect(f, dxpl_id, H5AC_BT2_LEAF, leaf_addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree leaf node") /* Sanity check number of records */ @@ -2354,7 +2354,7 @@ H5B2_remove_leaf(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, leaf->nrec--; /* Mark leaf node as dirty also */ - leaf_flags |= H5AC2__DIRTIED_FLAG; + leaf_flags |= H5AC__DIRTIED_FLAG; if(leaf->nrec > 0) { /* Pack record out of leaf */ @@ -2367,7 +2367,7 @@ H5B2_remove_leaf(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to free B-tree leaf node") /* Let the cache know that the object is deleted */ - leaf_flags |= H5AC2__DELETED_FLAG; + leaf_flags |= H5AC__DELETED_FLAG; /* Reset address of parent node pointer */ curr_node_ptr->addr = HADDR_UNDEF; @@ -2378,7 +2378,7 @@ H5B2_remove_leaf(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, done: /* Release the B-tree leaf node */ - if(leaf && H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_LEAF, leaf_addr, (size_t)0, leaf, leaf_flags) < 0) + if(leaf && H5AC_unprotect(f, dxpl_id, H5AC_BT2_LEAF, leaf_addr, (size_t)0, leaf, leaf_flags) < 0) HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release leaf B-tree node") FUNC_LEAVE_NOAPI(ret_value) @@ -2401,15 +2401,15 @@ done: herr_t H5B2_remove_internal(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, hbool_t *depth_decreased, void *swap_loc, unsigned depth, - H5AC2_info_t *parent_cache_info, unsigned *parent_cache_info_flags_ptr, + H5AC_info_t *parent_cache_info, unsigned *parent_cache_info_flags_ptr, H5B2_node_ptr_t *curr_node_ptr, void *udata, H5B2_remove_t op, void *op_data) { - H5AC2_info_t *new_cache_info; /* Pointer to new cache info */ + H5AC_info_t *new_cache_info; /* Pointer to new cache info */ unsigned *new_cache_info_flags_ptr = NULL; H5B2_node_ptr_t *new_node_ptr; /* Pointer to new node pointer */ H5B2_internal_t *internal; /* Pointer to internal node */ - unsigned internal_flags = H5AC2__NO_FLAGS_SET; + unsigned internal_flags = H5AC__NO_FLAGS_SET; haddr_t internal_addr; /* Address of internal node */ H5B2_shared_t *shared; /* Pointer to B-tree's shared information */ size_t merge_nrec; /* Number of records to merge node at */ @@ -2429,7 +2429,7 @@ H5B2_remove_internal(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, /* Lock current B-tree node */ internal_addr = curr_node_ptr->addr; - if(NULL == (internal = H5B2_protect_internal(f, dxpl_id, bt2_shared, internal_addr, curr_node_ptr->node_nrec, depth, H5AC2_WRITE))) + if(NULL == (internal = H5B2_protect_internal(f, dxpl_id, bt2_shared, internal_addr, curr_node_ptr->node_nrec, depth, H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree internal node") /* Get the pointer to the shared B-tree info */ @@ -2454,7 +2454,7 @@ H5B2_remove_internal(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to free B-tree leaf node") /* Let the cache know that the object is deleted */ - internal_flags |= H5AC2__DELETED_FLAG; + internal_flags |= H5AC__DELETED_FLAG; /* Reset information in header's root node pointer */ curr_node_ptr->addr = internal->node_ptrs[0].addr; @@ -2583,7 +2583,7 @@ H5B2_remove_internal(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, new_node_ptr->all_nrec--; /* Mark node as dirty */ - internal_flags |= H5AC2__DIRTIED_FLAG; + internal_flags |= H5AC__DIRTIED_FLAG; #ifdef H5B2_DEBUG H5B2_assert_internal((!collapsed_root ? (curr_node_ptr->all_nrec-1) : new_node_ptr->all_nrec),shared,internal); @@ -2591,7 +2591,7 @@ H5B2_remove_internal(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, done: /* Release the B-tree internal node */ - if(internal && H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_INT, internal_addr, (size_t)0, internal, internal_flags) < 0) + if(internal && H5AC_unprotect(f, dxpl_id, H5AC_BT2_INT, internal_addr, (size_t)0, internal, internal_flags) < 0) HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release internal B-tree node") FUNC_LEAVE_NOAPI(ret_value) @@ -2619,7 +2619,7 @@ H5B2_remove_leaf_by_idx(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, { H5B2_leaf_t *leaf; /* Pointer to leaf node */ haddr_t leaf_addr = HADDR_UNDEF; /* Leaf address on disk */ - unsigned leaf_flags = H5AC2__NO_FLAGS_SET; /* Flags for unprotecting leaf node */ + unsigned leaf_flags = H5AC__NO_FLAGS_SET; /* Flags for unprotecting leaf node */ H5B2_shared_t *shared; /* Pointer to B-tree's shared information */ H5B2_leaf_cache_ud_t cache_leaf_udata; /* User-data for callback */ herr_t ret_value = SUCCEED; @@ -2642,7 +2642,7 @@ H5B2_remove_leaf_by_idx(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, /* Lock B-tree leaf node */ leaf_addr = curr_node_ptr->addr; - if(NULL == (leaf = (H5B2_leaf_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT2_LEAF, leaf_addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC2_WRITE))) + if(NULL == (leaf = (H5B2_leaf_t *)H5AC_protect(f, dxpl_id, H5AC_BT2_LEAF, leaf_addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree leaf node") /* Sanity check number of records */ @@ -2659,7 +2659,7 @@ H5B2_remove_leaf_by_idx(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, leaf->nrec--; /* Mark leaf node as dirty also */ - leaf_flags |= H5AC2__DIRTIED_FLAG; + leaf_flags |= H5AC__DIRTIED_FLAG; if(leaf->nrec > 0) { /* Pack record out of leaf */ @@ -2672,7 +2672,7 @@ H5B2_remove_leaf_by_idx(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to free B-tree leaf node") /* Let the cache know that the object is deleted */ - leaf_flags |= H5AC2__DELETED_FLAG; + leaf_flags |= H5AC__DELETED_FLAG; /* Reset address of parent node pointer */ curr_node_ptr->addr = HADDR_UNDEF; @@ -2683,7 +2683,7 @@ H5B2_remove_leaf_by_idx(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, done: /* Release the B-tree leaf node */ - if(leaf && H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_LEAF, leaf_addr, (size_t)0, leaf, leaf_flags) < 0) + if(leaf && H5AC_unprotect(f, dxpl_id, H5AC_BT2_LEAF, leaf_addr, (size_t)0, leaf, leaf_flags) < 0) HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release leaf B-tree node") FUNC_LEAVE_NOAPI(ret_value) @@ -2707,15 +2707,15 @@ done: herr_t H5B2_remove_internal_by_idx(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, hbool_t *depth_decreased, void *swap_loc, unsigned depth, - H5AC2_info_t *parent_cache_info, unsigned *parent_cache_info_flags_ptr, + H5AC_info_t *parent_cache_info, unsigned *parent_cache_info_flags_ptr, H5B2_node_ptr_t *curr_node_ptr, hsize_t n, H5B2_remove_t op, void *op_data) { - H5AC2_info_t *new_cache_info; /* Pointer to new cache info */ + H5AC_info_t *new_cache_info; /* Pointer to new cache info */ unsigned *new_cache_info_flags_ptr = NULL; H5B2_node_ptr_t *new_node_ptr; /* Pointer to new node pointer */ H5B2_internal_t *internal; /* Pointer to internal node */ - unsigned internal_flags = H5AC2__NO_FLAGS_SET; + unsigned internal_flags = H5AC__NO_FLAGS_SET; haddr_t internal_addr; /* Address of internal node */ H5B2_shared_t *shared; /* Pointer to B-tree's shared information */ size_t merge_nrec; /* Number of records to merge node at */ @@ -2735,7 +2735,7 @@ H5B2_remove_internal_by_idx(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, /* Lock current B-tree node */ internal_addr = curr_node_ptr->addr; - if(NULL == (internal = H5B2_protect_internal(f, dxpl_id, bt2_shared, internal_addr, curr_node_ptr->node_nrec, depth, H5AC2_WRITE))) + if(NULL == (internal = H5B2_protect_internal(f, dxpl_id, bt2_shared, internal_addr, curr_node_ptr->node_nrec, depth, H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree internal node") HDassert(internal->nrec == curr_node_ptr->node_nrec); @@ -2763,7 +2763,7 @@ H5B2_remove_internal_by_idx(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, HGOTO_ERROR(H5E_BTREE, H5E_CANTFREE, FAIL, "unable to free B-tree leaf node") /* Let the cache know that the object is deleted */ - internal_flags |= H5AC2__DELETED_FLAG; + internal_flags |= H5AC__DELETED_FLAG; /* Reset information in header's root node pointer */ curr_node_ptr->addr = internal->node_ptrs[0].addr; @@ -2944,7 +2944,7 @@ H5B2_remove_internal_by_idx(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, new_node_ptr->all_nrec--; /* Mark node as dirty */ - internal_flags |= H5AC2__DIRTIED_FLAG; + internal_flags |= H5AC__DIRTIED_FLAG; #ifdef H5B2_DEBUG H5B2_assert_internal((!collapsed_root ? (curr_node_ptr->all_nrec-1) : new_node_ptr->all_nrec),shared,internal); @@ -2952,7 +2952,7 @@ H5B2_remove_internal_by_idx(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, done: /* Release the B-tree internal node */ - if(internal && H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_INT, internal_addr, (size_t)0, internal, internal_flags) < 0) + if(internal && H5AC_unprotect(f, dxpl_id, H5AC_BT2_INT, internal_addr, (size_t)0, internal, internal_flags) < 0) HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release internal B-tree node") FUNC_LEAVE_NOAPI(ret_value) @@ -3015,7 +3015,7 @@ H5B2_neighbor_leaf(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, HDassert(shared); /* Lock current B-tree node */ - if (NULL == (leaf = (H5B2_leaf_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT2_LEAF, curr_node_ptr->addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC2_READ))) + if (NULL == (leaf = (H5B2_leaf_t *)H5AC_protect(f, dxpl_id, H5AC_BT2_LEAF, curr_node_ptr->addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC_READ))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree leaf node") /* Locate node pointer for child */ @@ -3049,7 +3049,7 @@ H5B2_neighbor_leaf(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, done: /* Release the B-tree internal node */ - if (leaf && H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_LEAF, curr_node_ptr->addr, (size_t)0, leaf, H5AC2__NO_FLAGS_SET) < 0) + if (leaf && H5AC_unprotect(f, dxpl_id, H5AC_BT2_LEAF, curr_node_ptr->addr, (size_t)0, leaf, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree leaf node") FUNC_LEAVE_NOAPI(ret_value) @@ -3104,7 +3104,7 @@ H5B2_neighbor_internal(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, HDassert(op); /* Lock current B-tree node */ - if(NULL == (internal = H5B2_protect_internal(f, dxpl_id, bt2_shared, curr_node_ptr->addr, curr_node_ptr->node_nrec, depth, H5AC2_READ))) + if(NULL == (internal = H5B2_protect_internal(f, dxpl_id, bt2_shared, curr_node_ptr->addr, curr_node_ptr->node_nrec, depth, H5AC_READ))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree internal node") /* Get the pointer to the shared B-tree info */ @@ -3140,7 +3140,7 @@ H5B2_neighbor_internal(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, done: /* Release the B-tree internal node */ - if (internal && H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_INT, curr_node_ptr->addr, (size_t)0, internal, H5AC2__NO_FLAGS_SET) < 0) + if (internal && H5AC_unprotect(f, dxpl_id, H5AC_BT2_INT, curr_node_ptr->addr, (size_t)0, internal, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release internal B-tree node") FUNC_LEAVE_NOAPI(ret_value) @@ -3166,7 +3166,7 @@ H5B2_delete_node(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, unsigned depth, const H5B2_node_ptr_t *curr_node, H5B2_remove_t op, void *op_data) { H5B2_shared_t *shared; /* Pointer to B-tree's shared information */ - const H5AC2_class_t *curr_node_class=NULL; /* Pointer to current node's class info */ + const H5AC_class_t *curr_node_class=NULL; /* Pointer to current node's class info */ void *node=NULL; /* Pointers to current node */ uint8_t *native; /* Pointers to node's native records */ H5B2_leaf_cache_ud_t cache_leaf_udata; /* User-data for callback */ @@ -3188,11 +3188,11 @@ H5B2_delete_node(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, unsigned depth, unsigned u; /* Local index */ /* Lock the current B-tree node */ - if (NULL == (internal = H5B2_protect_internal(f, dxpl_id, bt2_shared, curr_node->addr, curr_node->node_nrec, depth, H5AC2_WRITE))) + if (NULL == (internal = H5B2_protect_internal(f, dxpl_id, bt2_shared, curr_node->addr, curr_node->node_nrec, depth, H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree internal node") /* Set up information about current node */ - curr_node_class = H5AC2_BT2_INT; + curr_node_class = H5AC_BT2_INT; node = internal; native = internal->int_native; @@ -3209,11 +3209,11 @@ H5B2_delete_node(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, unsigned depth, cache_leaf_udata.bt2_shared = bt2_shared; /* Lock the current B-tree node */ - if (NULL == (leaf = (H5B2_leaf_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT2_LEAF, curr_node->addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC2_WRITE))) + if (NULL == (leaf = (H5B2_leaf_t *)H5AC_protect(f, dxpl_id, H5AC_BT2_LEAF, curr_node->addr, (size_t)shared->node_size, &cache_leaf_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree leaf node") /* Set up information about current node */ - curr_node_class = H5AC2_BT2_LEAF; + curr_node_class = H5AC_BT2_LEAF; node = leaf; native = leaf->leaf_native; } /* end else */ @@ -3237,7 +3237,7 @@ H5B2_delete_node(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, unsigned depth, done: /* Unlock & delete current node */ if(node) - if(H5AC2_unprotect(f, dxpl_id, curr_node_class, curr_node->addr, (size_t)0, node, H5AC2__DELETED_FLAG) < 0) + if(H5AC_unprotect(f, dxpl_id, curr_node_class, curr_node->addr, (size_t)0, node, H5AC__DELETED_FLAG) < 0) HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node") FUNC_LEAVE_NOAPI(ret_value) @@ -3279,7 +3279,7 @@ H5B2_iterate_size_node(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, unsigned dep HDassert(shared); /* Lock the current B-tree node */ - if(NULL == (internal = H5B2_protect_internal(f, dxpl_id, bt2_shared, curr_node->addr, curr_node->node_nrec, depth, H5AC2_READ))) + if(NULL == (internal = H5B2_protect_internal(f, dxpl_id, bt2_shared, curr_node->addr, curr_node->node_nrec, depth, H5AC_READ))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree internal node") /* Recursively descend into child nodes, if we are above the "twig" level in the B-tree */ @@ -3298,7 +3298,7 @@ H5B2_iterate_size_node(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, unsigned dep *btree_size += shared->node_size; done: - if(internal && H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_INT, curr_node->addr, (size_t)0, internal, H5AC2__NO_FLAGS_SET) < 0) + if(internal && H5AC_unprotect(f, dxpl_id, H5AC_BT2_INT, curr_node->addr, (size_t)0, internal, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node") FUNC_LEAVE_NOAPI(ret_value) diff --git a/src/H5B2pkg.h b/src/H5B2pkg.h index 3a2cbcd..95c10e3 100644 --- a/src/H5B2pkg.h +++ b/src/H5B2pkg.h @@ -32,7 +32,7 @@ #include "H5B2private.h" /* Other private headers needed by this file */ -#include "H5AC2private.h" /* Metadata cache */ +#include "H5ACprivate.h" /* Metadata cache */ #include "H5FLprivate.h" /* Free Lists */ #include "H5RCprivate.h" /* Reference counted object functions */ @@ -184,7 +184,7 @@ typedef struct H5B2_shared_t { /* The B-tree information */ typedef struct H5B2_t { /* Information for H5AC cache functions, _must_ be first field in structure */ - H5AC2_info_t cache_info; + H5AC_info_t cache_info; /* Internal B-tree information */ H5B2_node_ptr_t root; /* Node pointer to root node in B-tree */ @@ -194,7 +194,7 @@ typedef struct H5B2_t { /* B-tree leaf node information */ typedef struct H5B2_leaf_t { /* Information for H5AC cache functions, _must_ be first field in structure */ - H5AC2_info_t cache_info; + H5AC_info_t cache_info; /* Internal B-tree information */ H5RC_t *shared; /* Ref-counted shared info */ @@ -205,7 +205,7 @@ typedef struct H5B2_leaf_t { /* B-tree internal node information */ typedef struct H5B2_internal_t { /* Information for H5AC cache functions, _must_ be first field in structure */ - H5AC2_info_t cache_info; + H5AC_info_t cache_info; /* Internal B-tree information */ H5RC_t *shared; /* Ref-counted shared info */ @@ -235,14 +235,14 @@ typedef struct { /* Package Private Variables */ /*****************************/ -/* H5B2 header inherits cache-like properties from H5AC2 */ -H5_DLLVAR const H5AC2_class_t H5AC2_BT2_HDR[1]; +/* H5B2 header inherits cache-like properties from H5AC */ +H5_DLLVAR const H5AC_class_t H5AC_BT2_HDR[1]; -/* H5B2 internal node inherits cache-like properties from H5AC2 */ -H5_DLLVAR const H5AC2_class_t H5AC2_BT2_INT[1]; +/* H5B2 internal node inherits cache-like properties from H5AC */ +H5_DLLVAR const H5AC_class_t H5AC_BT2_INT[1]; -/* H5B2 leaf node inherits cache-like properties from H5AC2 */ -H5_DLLVAR const H5AC2_class_t H5AC2_BT2_LEAF[1]; +/* H5B2 leaf node inherits cache-like properties from H5AC */ +H5_DLLVAR const H5AC_class_t H5AC_BT2_LEAF[1]; /* Declare a free list to manage the H5B2_t struct */ H5FL_EXTERN(H5B2_t); @@ -271,7 +271,7 @@ H5_DLL herr_t H5B2_shared_init(H5F_t *f, H5B2_t *bt2, const H5B2_class_t *type, /* Routines for operating on internal nodes */ H5_DLL H5B2_internal_t *H5B2_protect_internal(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, haddr_t addr, unsigned nrec, unsigned depth, - H5AC2_protect_t rw); + H5AC_protect_t rw); /* Routines for allocating nodes */ H5_DLL herr_t H5B2_split_root(H5F_t *f, hid_t dxpl_id, H5B2_t *bt2, @@ -305,14 +305,14 @@ H5_DLL herr_t H5B2_neighbor_leaf(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, /* Routines for removing records */ H5_DLL herr_t H5B2_remove_internal(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, - hbool_t *depth_decreased, void *swap_loc, unsigned depth, H5AC2_info_t *parent_cache_info, + hbool_t *depth_decreased, void *swap_loc, unsigned depth, H5AC_info_t *parent_cache_info, hbool_t * parent_cache_info_dirtied_ptr, H5B2_node_ptr_t *curr_node_ptr, void *udata, H5B2_remove_t op, void *op_data); H5_DLL herr_t H5B2_remove_leaf(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, H5B2_node_ptr_t *curr_node_ptr, void *udata, H5B2_remove_t op, void *op_data); H5_DLL herr_t H5B2_remove_internal_by_idx(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, - hbool_t *depth_decreased, void *swap_loc, unsigned depth, H5AC2_info_t *parent_cache_info, + hbool_t *depth_decreased, void *swap_loc, unsigned depth, H5AC_info_t *parent_cache_info, hbool_t * parent_cache_info_dirtied_ptr, H5B2_node_ptr_t *curr_node_ptr, hsize_t idx, H5B2_remove_t op, void *op_data); H5_DLL herr_t H5B2_remove_leaf_by_idx(H5F_t *f, hid_t dxpl_id, H5RC_t *bt2_shared, diff --git a/src/H5B2stat.c b/src/H5B2stat.c index 4f3f53b..ee9d784 100644 --- a/src/H5B2stat.c +++ b/src/H5B2stat.c @@ -103,7 +103,7 @@ H5B2_stat_info(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, cache_udata.type = type; /* Look up the B-tree header */ - if(NULL == (bt2 = (H5B2_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT2_HDR, addr, (size_t)H5B2_HEADER_SIZE(f), &cache_udata, H5AC2_READ))) + if(NULL == (bt2 = (H5B2_t *)H5AC_protect(f, dxpl_id, H5AC_BT2_HDR, addr, (size_t)H5B2_HEADER_SIZE(f), &cache_udata, H5AC_READ))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree header") /* Get pointer to reference counted shared B-tree info */ @@ -115,7 +115,7 @@ H5B2_stat_info(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, done: /* Release B-tree header node */ - if(bt2 && H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_HDR, addr, (size_t)0, bt2, H5AC2__NO_FLAGS_SET) < 0) + if(bt2 && H5AC_unprotect(f, dxpl_id, H5AC_BT2_HDR, addr, (size_t)0, bt2, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree header info") FUNC_LEAVE_NOAPI(ret_value) diff --git a/src/H5B2test.c b/src/H5B2test.c index 8cc6e54..f697d30 100644 --- a/src/H5B2test.c +++ b/src/H5B2test.c @@ -273,7 +273,7 @@ H5B2_get_root_addr_test(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, cache_udata.type = type; /* Look up the B-tree header */ - if(NULL == (bt2 = (H5B2_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT2_HDR, addr, (size_t)H5B2_HEADER_SIZE(f), &cache_udata, H5AC2_READ))) + if(NULL == (bt2 = (H5B2_t *)H5AC_protect(f, dxpl_id, H5AC_BT2_HDR, addr, (size_t)H5B2_HEADER_SIZE(f), &cache_udata, H5AC_READ))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree header") /* Get B-tree root addr */ @@ -281,7 +281,7 @@ H5B2_get_root_addr_test(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, done: /* Release B-tree header node */ - if(bt2 && H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_HDR, addr, (size_t)0, bt2, H5AC2__NO_FLAGS_SET) < 0) + if(bt2 && H5AC_unprotect(f, dxpl_id, H5AC_BT2_HDR, addr, (size_t)0, bt2, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree header info") FUNC_LEAVE_NOAPI(ret_value) @@ -327,7 +327,7 @@ H5B2_get_node_info_test(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr cache_udata.type = type; /* Look up the B-tree header */ - if (NULL == (bt2 = (H5B2_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT2_HDR, addr, (size_t)H5B2_HEADER_SIZE(f), &cache_udata, H5AC2_READ))) + if (NULL == (bt2 = (H5B2_t *)H5AC_protect(f, dxpl_id, H5AC_BT2_HDR, addr, (size_t)H5B2_HEADER_SIZE(f), &cache_udata, H5AC_READ))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree header") /* Safely grab pointer to reference counted shared B-tree info, so we can release the B-tree header if necessary */ @@ -346,7 +346,7 @@ H5B2_get_node_info_test(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr depth = shared->depth; /* Release header */ - if(H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_HDR, addr, (size_t)0, bt2, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_BT2_HDR, addr, (size_t)0, bt2, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree header info") bt2 = NULL; @@ -361,7 +361,7 @@ H5B2_get_node_info_test(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr H5B2_node_ptr_t next_node_ptr; /* Node pointer info for next node */ /* Lock B-tree current node */ - if(NULL == (internal = H5B2_protect_internal(f, dxpl_id, bt2_shared, curr_node_ptr.addr, curr_node_ptr.node_nrec, depth, H5AC2_READ))) + if(NULL == (internal = H5B2_protect_internal(f, dxpl_id, bt2_shared, curr_node_ptr.addr, curr_node_ptr.node_nrec, depth, H5AC_READ))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree internal node") /* Locate node pointer for child */ @@ -374,7 +374,7 @@ H5B2_get_node_info_test(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr next_node_ptr = internal->node_ptrs[idx]; /* Unlock current node */ - if(H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_INT, curr_node_ptr.addr, (size_t)0, internal, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_BT2_INT, curr_node_ptr.addr, (size_t)0, internal, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node") /* Set pointer to next node to load */ @@ -382,7 +382,7 @@ H5B2_get_node_info_test(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr } /* end if */ else { /* Unlock current node */ - if(H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_INT, curr_node_ptr.addr, (size_t)0, internal, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_BT2_INT, curr_node_ptr.addr, (size_t)0, internal, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node") /* Fill in information about the node */ @@ -401,14 +401,14 @@ H5B2_get_node_info_test(H5F_t *f, hid_t dxpl_id, const H5B2_class_t *type, haddr H5B2_leaf_t *leaf; /* Pointer to leaf node in B-tree */ /* Lock B-tree leaf node */ - if(NULL == (leaf = (H5B2_leaf_t *)H5AC2_protect(f, dxpl_id, H5AC2_BT2_LEAF, curr_node_ptr.addr, (size_t)shared->node_size, &cache_udata, H5AC2_READ))) + if(NULL == (leaf = (H5B2_leaf_t *)H5AC_protect(f, dxpl_id, H5AC_BT2_LEAF, curr_node_ptr.addr, (size_t)shared->node_size, &cache_udata, H5AC_READ))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree internal node") /* Locate record */ cmp = H5B2_locate_record(shared->type, leaf->nrec, shared->nat_off, leaf->leaf_native, udata, &idx); /* Unlock current node */ - if(H5AC2_unprotect(f, dxpl_id, H5AC2_BT2_LEAF, curr_node_ptr.addr, (size_t)0, leaf, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_BT2_LEAF, curr_node_ptr.addr, (size_t)0, leaf, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_BTREE, H5E_CANTUNPROTECT, FAIL, "unable to release B-tree node") /* Indicate the depth that the record was found */ diff --git a/src/H5Bcache.c b/src/H5Bcache.c index b6dedb2..fd99d1f 100644 --- a/src/H5Bcache.c +++ b/src/H5Bcache.c @@ -66,9 +66,9 @@ static herr_t H5B_free_icr(haddr_t addr, size_t len, void *thing); /* Package Variables */ /*********************/ -/* H5B inherits cache-like properties from H5AC2 */ -const H5AC2_class_t H5AC2_BT[1] = {{ - H5AC2_BT_ID, +/* H5B inherits cache-like properties from H5AC */ +const H5AC_class_t H5AC_BT[1] = {{ + H5AC_BT_ID, "v1 B-tree", H5FD_MEM_BTREE, H5B_deserialize, @@ -118,7 +118,7 @@ H5B_deserialize(haddr_t UNUSED addr, size_t UNUSED len, const void *image, /* Allocate the B-tree node in memory */ if(NULL == (bt = H5FL_MALLOC(H5B_t))) HGOTO_ERROR(H5E_BTREE, H5E_NOSPACE, NULL, "can't allocate B-tree struct") - HDmemset(&bt->cache_info, 0, sizeof(H5AC2_info_t)); + HDmemset(&bt->cache_info, 0, sizeof(H5AC_info_t)); /* Set & increment the ref-counted "shared" B-tree information for the node */ bt->rc_shared = udata->rc_shared; diff --git a/src/H5Bpkg.h b/src/H5Bpkg.h index f1354ab..5309d02 100644 --- a/src/H5Bpkg.h +++ b/src/H5Bpkg.h @@ -32,7 +32,7 @@ #include "H5Bprivate.h" /* Other private headers needed by this file */ -#include "H5AC2private.h" /* Metadata cache #2 */ +#include "H5ACprivate.h" /* Metadata cache */ /**************************/ @@ -46,7 +46,7 @@ /* The B-tree node as stored in memory... */ typedef struct H5B_t { - H5AC2_info_t cache_info; /* Information for H5AC2 cache functions */ + H5AC_info_t cache_info; /* Information for H5AC cache functions */ /* _must_ be first field in structure */ H5RC_t *rc_shared; /*ref-counted shared info */ unsigned level; /*node level */ @@ -68,8 +68,8 @@ typedef struct H5B_cache_ud_t { /* Package Private Variables */ /*****************************/ -/* H5B header inherits cache-like properties from H5AC2 */ -H5_DLLVAR const H5AC2_class_t H5AC2_BT[1]; +/* H5B header inherits cache-like properties from H5AC */ +H5_DLLVAR const H5AC_class_t H5AC_BT[1]; /* Declare a free list to manage the haddr_t sequence information */ H5FL_SEQ_EXTERN(haddr_t); diff --git a/src/H5C.c b/src/H5C.c new file mode 100644 index 0000000..6355182 --- /dev/null +++ b/src/H5C.c @@ -0,0 +1,9609 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * Copyright by the Board of Trustees of the University of Illinois. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/*------------------------------------------------------------------------- + * + * Created: H5C.c + * June 1 2004 + * John Mainzer + * + * Purpose: Functions in this file implement a generic cache for + * things which exist on disk, and which may be + * unambiguously referenced by their disk addresses. + * + * The code in this module was initially written in + * support of a complete re-write of the metadata cache + * in H5AC.c However, other uses for the cache code + * suggested themselves, and thus this file was created + * in an attempt to support re-use. + * + * For a detailed overview of the cache, please see the + * header comment for H5C_t in H5Cpkg.h. + * + * Modifications: + * + * QAK - 11/27/2004 + * Switched over to using skip list routines instead of TBBT + * routines. + * + * JRM - 12/15/04 + * Added code supporting manual and automatic cache resizing. + * See the header for H5C_auto_size_ctl_t in H5Cprivate.h for + * an overview. + * + * Some elements of the automatic cache resize code depend on + * the LRU list. Thus if we ever choose to support a new + * replacement policy, we will either have to disable those + * elements of the auto resize code when running the new + * policy, or modify them to make use of similar information + * maintained by the new policy code. + * + *------------------------------------------------------------------------- + */ + +/************************************************************************** + * + * To Do: + * + * Code Changes: + * + * - Remove extra functionality in H5C_flush_single_entry()? + * + * - Change protect/unprotect to lock/unlock. + * + * - Change the way the dirty flag is set. Probably pass it in + * as a parameter in unprotect & insert. + * + * - Size should also be passed in as a parameter in insert and + * unprotect -- or some other way should be found to advise the + * cache of changes in entry size. + * + * - Flush entries in increasing address order in + * H5C_make_space_in_cache(). + * + * - Also in H5C_make_space_in_cache(), use high and low water marks + * to reduce the number of I/O calls. + * + * - When flushing, attempt to combine contiguous entries to reduce + * I/O overhead. Can't do this just yet as some entries are not + * contiguous. Do this in parallel only or in serial as well? + * + * - Create MPI type for dirty objects when flushing in parallel. + * + * - Now that TBBT routines aren't used, fix nodes in memory to + * point directly to the skip list node from the LRU list, eliminating + * skip list lookups when evicting objects from the cache. + * + * Tests: + * + * - Trim execution time. (This is no longer a major issue with the + * shift from the TBBT to a hash table for indexing.) + * + * - Add random tests. + * + **************************************************************************/ + +#include + +#define H5C_PACKAGE /*suppress error about including H5Cpkg */ +#define H5F_PACKAGE /*suppress error about including H5Fpkg */ + + +#include "H5private.h" /* Generic Functions */ +#include "H5Cpkg.h" /* Cache */ +#include "H5Dprivate.h" /* Dataset functions */ +#include "H5Eprivate.h" /* Error handling */ +#include "H5Fpkg.h" /* Files */ +#include "H5FDprivate.h" /* File drivers */ +#include "H5FLprivate.h" /* Free Lists */ +#include "H5Iprivate.h" /* IDs */ +#include "H5MMprivate.h" /* Memory management */ +#include "H5Pprivate.h" /* Property lists */ +#include "H5SLprivate.h" /* Skip lists */ + + +/* + * #defines controlling debugging code. All should be turned off + * before checkin. + */ + +#define H5C_PRINT_ENTRY_POINTS FALSE + +#if H5C_PRINT_ENTRY_POINTS +#define H5C_PRINT_EXIT_POINTS TRUE +#define H5C_PRINT_ENTRY_POINT_TARGET_TYPE(i) \ + ( ( (i) == H5AC_FHEAP_HDR_ID ) || \ + ( (i) == H5AC_FHEAP_DBLOCK_ID ) || \ + ( (i) == H5AC_FHEAP_IBLOCK_ID ) ) +#else /* H5C_PRINT_ENTRY_POINTS */ +#define H5C_PRINT_EXIT_POINTS FALSE +#endif /* H5C_PRINT_ENTRY_POINTS */ + + + +/* + * Private file-scope variables. + */ + +/* Declare a free list to manage the H5C_t struct */ +H5FL_DEFINE_STATIC(H5C_t); + + +/* + * Private file-scope function declarations: + */ + +static herr_t H5C__auto_adjust_cache_size(H5F_t * f, + hid_t dxpl_id, + H5C_t * cache_ptr, + hbool_t write_permitted); + +static herr_t H5C__autoadjust__ageout(H5F_t * f, + hid_t dxpl_id, + H5C_t * cache_ptr, + double hit_rate, + enum H5C_resize_status * status_ptr, + size_t * new_max_cache_size_ptr, + hbool_t write_permitted); + +static herr_t H5C__autoadjust__ageout__cycle_epoch_marker(H5C_t * cache_ptr); + +static herr_t H5C__autoadjust__ageout__evict_aged_out_entries(H5F_t * f, + hid_t dxpl_id, + H5C_t * cache_ptr, + hbool_t write_permitted); + +static herr_t H5C__autoadjust__ageout__insert_new_marker(H5C_t * cache_ptr); + +static herr_t H5C__autoadjust__ageout__remove_all_markers(H5C_t * cache_ptr); + +static herr_t H5C__autoadjust__ageout__remove_excess_markers(H5C_t * cache_ptr); + +static herr_t H5C__flash_increase_cache_size(H5C_t * cache_ptr, + size_t old_entry_size, + size_t new_entry_size); + +static herr_t H5C_flush_single_entry(const H5F_t * f, + hid_t dxpl_id, + H5C_t * cache_ptr, + const H5C_class_t * type_ptr, + haddr_t addr, + unsigned flags, + hbool_t del_entry_from_slist_on_destroy); + +static herr_t H5C_flush_invalidate_cache(const H5F_t * f, + hid_t dxpl_id, + H5C_t * cache_ptr, + unsigned flags); + +static void * H5C_load_entry(H5F_t * f, + hid_t dxpl_id, + const H5C_class_t * type, + haddr_t addr, + size_t len, + void * udata_ptr); + +static herr_t H5C_make_space_in_cache(H5F_t * f, + hid_t dxpl_id, + H5C_t * cache_ptr, + size_t space_needed, + hbool_t write_permitted); + +#if H5C_DO_EXTREME_SANITY_CHECKS +static herr_t H5C_validate_lru_list(H5C_t * cache_ptr); +static herr_t H5C_verify_not_in_index(H5C_t * cache_ptr, + H5C_cache_entry_t * entry_ptr); +#endif /* H5C_DO_EXTREME_SANITY_CHECKS */ + + +/**************************************************************************** + * + * #defines and declarations for epoch marker cache entries. + * + * As a strategy for automatic cache size reduction, the cache may insert + * marker entries in the LRU list at the end of each epoch. These markers + * are then used to identify entries that have not been accessed for n + * epochs so that they can be evicted from the cache. + * + ****************************************************************************/ + +/* Note that H5C__MAX_EPOCH_MARKERS is defined in H5Cpkg.h, not here because + * it is needed to dimension arrays in H5C_t. + */ + +#define H5C__EPOCH_MARKER_TYPE H5C__MAX_NUM_TYPE_IDS + +static void * H5C_epoch_marker_deserialize(haddr_t addr, + size_t len, + const void * image_ptr, + void * udata_ptr, + hbool_t * dirty_ptr); +static herr_t H5C_epoch_marker_image_len(const void * thing, + size_t *image_len_ptr); +static herr_t H5C_epoch_marker_serialize(const H5F_t *f, + hid_t dxpl_id, + haddr_t addr, + size_t len, + void * image_ptr, + void * thing, + unsigned * flags_ptr, + haddr_t * new_addr_ptr, + size_t * new_len_ptr, + void ** new_image_ptr_ptr); +static herr_t H5C_epoch_marker_free_icr(haddr_t addr, + size_t len, + void * thing); +static herr_t H5C_epoch_marker_clear_dirty_bits(haddr_t addr, + size_t len, + void * thing); + +const H5C_class_t epoch_marker_class_2 = +{ + /* id = */ H5C__EPOCH_MARKER_TYPE, + /* name = */ "epoch marker", + /* mem_type = */ H5FD_MEM_DEFAULT, /* value doesn't matter */ + /* deserialize = */ &H5C_epoch_marker_deserialize, + /* image_len = */ &H5C_epoch_marker_image_len, + /* serialize = */ &H5C_epoch_marker_serialize, + /* free_icr = */ &H5C_epoch_marker_free_icr, + /* clear_dirty_bits = */ &H5C_epoch_marker_clear_dirty_bits, +}; + + +/*************************************************************************** + * Class functions for H5C__EPOCH_MAKER_TYPE: + * + * None of these functions should ever be called, so there is no point in + * documenting them separately. + * JRM - 11/16/04 + * + ***************************************************************************/ + +static void * +H5C_epoch_marker_deserialize(haddr_t UNUSED addr, + size_t UNUSED len, + const void UNUSED * image_ptr, + void UNUSED * udata_ptr, + hbool_t UNUSED * dirty_ptr) +{ + void * ret_value = NULL; /* Return value */ + + FUNC_ENTER_NOAPI(H5C_epoch_marker_deserialize, NULL) + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, NULL, "called unreachable fcn.") + +done: + + FUNC_LEAVE_NOAPI(ret_value) +} + +static herr_t +H5C_epoch_marker_image_len(const void UNUSED *thing, + size_t UNUSED *image_len_ptr) +{ + herr_t ret_value = FAIL; /* Return value */ + + FUNC_ENTER_NOAPI(H5C_epoch_marker_image_len, FAIL) + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "called unreachable fcn.") + +done: + + FUNC_LEAVE_NOAPI(ret_value) +} + +static herr_t +H5C_epoch_marker_serialize(const H5F_t UNUSED *f, + hid_t UNUSED dxpl_id, + haddr_t UNUSED addr, + size_t UNUSED len, + void UNUSED * image_ptr, + void UNUSED * thing, + unsigned UNUSED * flags_ptr, + haddr_t UNUSED * new_addr_ptr, + size_t UNUSED * new_len_ptr, + void UNUSED ** new_image_ptr_ptr) +{ + herr_t ret_value = FAIL; /* Return value */ + + FUNC_ENTER_NOAPI(H5C_epoch_marker_serialize, FAIL) + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "called unreachable fcn.") + +done: + + FUNC_LEAVE_NOAPI(ret_value) +} + +static herr_t +H5C_epoch_marker_free_icr(haddr_t UNUSED addr, + size_t UNUSED len, + void UNUSED * thing) +{ + herr_t ret_value = FAIL; /* Return value */ + + FUNC_ENTER_NOAPI(H5C_epoch_marker_free_icr, FAIL) + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "called unreachable fcn.") + +done: + + FUNC_LEAVE_NOAPI(ret_value) +} + +static herr_t +H5C_epoch_marker_clear_dirty_bits(haddr_t UNUSED addr, + size_t UNUSED len, + void UNUSED * thing) +{ + herr_t ret_value = FAIL; /* Return value */ + + FUNC_ENTER_NOAPI(H5C_epoch_marker_clear_dirty_bits, FAIL) + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "called unreachable fcn.") + +done: + + FUNC_LEAVE_NOAPI(ret_value) +} + + + +/*------------------------------------------------------------------------- + * Function: H5C_create + * + * Purpose: Allocate, initialize, and return the address of a new + * instance of H5C_t. + * + * In general, the max_cache_size parameter must be positive, + * and the min_clean_size parameter must lie in the closed + * interval [0, max_cache_size]. + * + * The check_write_permitted parameter must either be NULL, + * or point to a function of type H5C_write_permitted_func_t. + * If it is NULL, the cache will use the write_permitted + * flag to determine whether writes are permitted. + * + * Return: Success: Pointer to the new instance. + * + * Failure: NULL + * + * Programmer: John Mainzer + * 6/2/04 + * + * Modifications: + * + * JRM -- 7/20/04 + * Updated for the addition of the hash table. + * + * JRM -- 10/5/04 + * Added call to H5C_reset_cache_hit_rate_stats(). Also + * added initialization for cache_is_full flag and for + * resize_ctl. + * + * JRM -- 11/12/04 + * Added initialization for the new size_decreased field. + * + * JRM -- 11/17/04 + * Added/updated initialization for the automatic cache + * size control data structures. + * + * JRM -- 6/24/05 + * Added support for the new write_permitted field of + * the H5C_t structure. + * + * JRM -- 7/5/05 + * Added the new log_flush parameter and supporting code. + * + * JRM -- 9/21/05 + * Added the new aux_ptr parameter and supporting code. + * + * JRM -- 1/20/06 + * Added initialization of the new prefix field in H5C_t. + * + * JRM -- 3/16/06 + * Added initialization for the pinned entry related fields. + * + * JRM -- 5/31/06 + * Added initialization for the trace_file_ptr field. + * + * JRM -- 8/19/06 + * Added initialization for the flush_in_progress field. + * + * JRM -- 8/25/06 + * Added initialization for the slist_len_increase and + * slist_size_increase fields. These fields are used + * for sanity checking in the flush process, and are not + * compiled in unless H5C_DO_SANITY_CHECKS is TRUE. + * + * JRM -- 3/28/07 + * Added initialization for the new is_read_only and + * ro_ref_count fields. + * + * JRM -- 7/10/07 + * Added the f parameter, along with initialization of + * the field of the same in in H5C_t. Also removed the + * type name table, as type names are now included in + * instances of H5C_class_t. + * + * JRM -- 3/28/07 + * Added initialization for the new is_read_only and + * ro_ref_count fields. + * + * JRM -- 12/31/07 + * Added initialization for the new flash cache size increase + * related fields of H5C_t. + * + * JRM -- 3/6/08 + * Added initialization for metadata journaling related + * fields in H5C_t. + * + * JRM -- 3/26/08 + * Added dxpl_id and journal_recovered parameters. Also + * added code to test to see if the file is marked as having + * journaling in progress, and fail if it does unless + * the journal_recovered parameter is TRUE. + * + * JRM -- 7/10/08 + * Removed the f, dxpl_id, and journal_recovered parameters, + * as checking for journaling in progress is no longer handled + * in H5C_create(). + * + *------------------------------------------------------------------------- + */ + +H5C_t * +H5C_create(size_t max_cache_size, + size_t min_clean_size, + int max_type_id, + const char * (* type_name_table_ptr), + H5C_write_permitted_func_t check_write_permitted, + hbool_t write_permitted, + H5C_log_flush_func_t log_flush, + void * aux_ptr) +{ + int i; + H5C_t * cache_ptr = NULL; + H5C_t * ret_value = NULL; /* Return value */ + + FUNC_ENTER_NOAPI(H5C_create, NULL) + + HDassert( max_cache_size >= H5C__MIN_MAX_CACHE_SIZE ); + HDassert( max_cache_size <= H5C__MAX_MAX_CACHE_SIZE ); + HDassert( min_clean_size <= max_cache_size ); + + HDassert( max_type_id >= 0 ); + HDassert( max_type_id < H5C__MAX_NUM_TYPE_IDS ); + HDassert( type_name_table_ptr ); + + HDassert( ( write_permitted == TRUE ) || ( write_permitted == FALSE ) ); + + for ( i = 0; i <= max_type_id; i++ ) { + + HDassert( (type_name_table_ptr)[i] ); + HDassert( HDstrlen(( type_name_table_ptr)[i]) > 0 ); + } + + if ( NULL == (cache_ptr = H5FL_CALLOC(H5C_t)) ) { + + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, \ + "memory allocation failed") + } + + if ( (cache_ptr->slist_ptr = H5SL_create(H5SL_TYPE_HADDR,0.5,(size_t)16)) + == NULL ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTCREATE, NULL, "can't create skip list.") + } + + /* If we get this far, we should succeed unless we detect journaling + * that was not cleaned up properly. Go ahead and initialize all + * the fields as we will need some of them for the journaling check. + */ + + cache_ptr->magic = H5C__H5C_T_MAGIC; + + cache_ptr->flush_in_progress = FALSE; + + cache_ptr->trace_file_ptr = NULL; + + cache_ptr->aux_ptr = aux_ptr; + + cache_ptr->max_type_id = max_type_id; + + cache_ptr->type_name_table_ptr = type_name_table_ptr; + + cache_ptr->max_cache_size = max_cache_size; + cache_ptr->min_clean_size = min_clean_size; + + cache_ptr->check_write_permitted = check_write_permitted; + cache_ptr->write_permitted = write_permitted; + + cache_ptr->log_flush = log_flush; + + cache_ptr->evictions_enabled = TRUE; + + cache_ptr->index_len = 0; + cache_ptr->index_size = (size_t)0; + + cache_ptr->slist_len = 0; + cache_ptr->slist_size = (size_t)0; + +#if H5C_DO_SANITY_CHECKS + cache_ptr->slist_len_increase = 0; + cache_ptr->slist_size_increase = 0; +#endif /* H5C_DO_SANITY_CHECKS */ + + for ( i = 0; i < H5C__HASH_TABLE_LEN; i++ ) + { + (cache_ptr->index)[i] = NULL; + } + + cache_ptr->pl_len = 0; + cache_ptr->pl_size = (size_t)0; + cache_ptr->pl_head_ptr = NULL; + cache_ptr->pl_tail_ptr = NULL; + + cache_ptr->pel_len = 0; + cache_ptr->pel_size = (size_t)0; + cache_ptr->pel_head_ptr = NULL; + cache_ptr->pel_tail_ptr = NULL; + + cache_ptr->LRU_list_len = 0; + cache_ptr->LRU_list_size = (size_t)0; + cache_ptr->LRU_head_ptr = NULL; + cache_ptr->LRU_tail_ptr = NULL; + + cache_ptr->cLRU_list_len = 0; + cache_ptr->cLRU_list_size = (size_t)0; + cache_ptr->cLRU_head_ptr = NULL; + cache_ptr->cLRU_tail_ptr = NULL; + + cache_ptr->dLRU_list_len = 0; + cache_ptr->dLRU_list_size = (size_t)0; + cache_ptr->dLRU_head_ptr = NULL; + cache_ptr->dLRU_tail_ptr = NULL; + + cache_ptr->size_increase_possible = FALSE; + cache_ptr->flash_size_increase_possible = FALSE; + cache_ptr->flash_size_increase_threshold = 0; + cache_ptr->size_decrease_possible = FALSE; + cache_ptr->resize_enabled = FALSE; + cache_ptr->cache_full = FALSE; + cache_ptr->size_decreased = FALSE; + + (cache_ptr->resize_ctl).version = H5C__CURR_AUTO_SIZE_CTL_VER; + (cache_ptr->resize_ctl).rpt_fcn = NULL; + (cache_ptr->resize_ctl).set_initial_size = FALSE; + (cache_ptr->resize_ctl).initial_size = H5C__DEF_AR_INIT_SIZE; + (cache_ptr->resize_ctl).min_clean_fraction = H5C__DEF_AR_MIN_CLEAN_FRAC; + (cache_ptr->resize_ctl).max_size = H5C__DEF_AR_MAX_SIZE; + (cache_ptr->resize_ctl).min_size = H5C__DEF_AR_MIN_SIZE; + (cache_ptr->resize_ctl).epoch_length = H5C__DEF_AR_EPOCH_LENGTH; + + (cache_ptr->resize_ctl).incr_mode = H5C_incr__off; + (cache_ptr->resize_ctl).lower_hr_threshold = H5C__DEF_AR_LOWER_THRESHHOLD; + (cache_ptr->resize_ctl).increment = H5C__DEF_AR_INCREMENT; + (cache_ptr->resize_ctl).apply_max_increment = TRUE; + (cache_ptr->resize_ctl).max_increment = H5C__DEF_AR_MAX_INCREMENT; + + (cache_ptr->resize_ctl).flash_incr_mode = H5C_flash_incr__off; + (cache_ptr->resize_ctl).flash_multiple = 1.0; + (cache_ptr->resize_ctl).flash_threshold = 0.25; + + (cache_ptr->resize_ctl).decr_mode = H5C_decr__off; + (cache_ptr->resize_ctl).upper_hr_threshold = H5C__DEF_AR_UPPER_THRESHHOLD; + (cache_ptr->resize_ctl).decrement = H5C__DEF_AR_DECREMENT; + (cache_ptr->resize_ctl).apply_max_decrement = TRUE; + (cache_ptr->resize_ctl).max_decrement = H5C__DEF_AR_MAX_DECREMENT; + (cache_ptr->resize_ctl).epochs_before_eviction = H5C__DEF_AR_EPCHS_B4_EVICT; + (cache_ptr->resize_ctl).apply_empty_reserve = TRUE; + (cache_ptr->resize_ctl).empty_reserve = H5C__DEF_AR_EMPTY_RESERVE; + + cache_ptr->epoch_markers_active = 0; + + /* no need to initialize the ring buffer itself */ + cache_ptr->epoch_marker_ringbuf_first = 1; + cache_ptr->epoch_marker_ringbuf_last = 0; + cache_ptr->epoch_marker_ringbuf_size = 0; + + for ( i = 0; i < H5C__MAX_EPOCH_MARKERS; i++ ) + { + (cache_ptr->epoch_marker_active)[i] = FALSE; +#ifndef NDEBUG + ((cache_ptr->epoch_markers)[i]).magic = + H5C__H5C_CACHE_ENTRY_T_MAGIC; +#endif /* NDEBUG */ + ((cache_ptr->epoch_markers)[i]).addr = (haddr_t)i; + ((cache_ptr->epoch_markers)[i]).size = (size_t)0; + ((cache_ptr->epoch_markers)[i]).image_ptr = NULL; + ((cache_ptr->epoch_markers)[i]).image_up_to_date = FALSE; + ((cache_ptr->epoch_markers)[i]).type = &epoch_marker_class_2; + ((cache_ptr->epoch_markers)[i]).is_dirty = FALSE; + ((cache_ptr->epoch_markers)[i]).dirtied = FALSE; + ((cache_ptr->epoch_markers)[i]).is_protected = FALSE; + ((cache_ptr->epoch_markers)[i]).is_read_only = FALSE; + ((cache_ptr->epoch_markers)[i]).ro_ref_count = 0; + ((cache_ptr->epoch_markers)[i]).is_pinned = FALSE; + ((cache_ptr->epoch_markers)[i]).in_slist = FALSE; + ((cache_ptr->epoch_markers)[i]).ht_next = NULL; + ((cache_ptr->epoch_markers)[i]).ht_prev = NULL; + ((cache_ptr->epoch_markers)[i]).next = NULL; + ((cache_ptr->epoch_markers)[i]).prev = NULL; + ((cache_ptr->epoch_markers)[i]).aux_next = NULL; + ((cache_ptr->epoch_markers)[i]).aux_prev = NULL; +#if H5C_COLLECT_CACHE_ENTRY_STATS + ((cache_ptr->epoch_markers)[i]).accesses = 0; + ((cache_ptr->epoch_markers)[i]).clears = 0; + ((cache_ptr->epoch_markers)[i]).flushes = 0; + ((cache_ptr->epoch_markers)[i]).pins = 0; +#endif /* H5C_COLLECT_CACHE_ENTRY_STATS */ + } + + /* metadata journaling related fields */ + cache_ptr->mdj_enabled = FALSE; + cache_ptr->trans_in_progress = FALSE; + cache_ptr->trans_api_name[0] = '\0'; + cache_ptr->trans_num = 0; + cache_ptr->last_trans_on_disk = 0; + cache_ptr->jnl_magic = 0; + cache_ptr->jnl_file_name_len = 0; + (cache_ptr->jnl_file_name)[0] = '\0'; + (cache_ptr->mdj_jbrb).magic = + H5C__H5C_JBRB_T_MAGIC; + cache_ptr->tl_len = 0; + cache_ptr->tl_size = 0; + cache_ptr->tl_head_ptr = NULL; + cache_ptr->tl_tail_ptr = NULL; + cache_ptr->jwipl_len = 0; + cache_ptr->jwipl_size = 0; + cache_ptr->jwipl_head_ptr = NULL; + cache_ptr->jwipl_tail_ptr = NULL; + + /* allocate and initialze the metadata journaling status change + * callback table, along with the associated fields. Note that + * the table will grow and shrink as needed. + */ + cache_ptr->mdjsc_cb_tbl = + H5MM_malloc(H5C__MIN_MDJSC_CB_TBL_LEN * + sizeof(H5C_mdjsc_record_t)); + if ( cache_ptr->mdjsc_cb_tbl == NULL ) { + + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, \ + "can't alloc mdjsc_cb_tbl.") + } + for ( i = 0; i < H5C__MIN_MDJSC_CB_TBL_LEN; i++ ) + { + ((cache_ptr->mdjsc_cb_tbl)[i]).fcn_ptr = NULL; + ((cache_ptr->mdjsc_cb_tbl)[i]).data_ptr = NULL; + ((cache_ptr->mdjsc_cb_tbl)[i]).fl_next = i + 1; + } + ((cache_ptr->mdjsc_cb_tbl)[H5C__MIN_MDJSC_CB_TBL_LEN - 1]).fl_next = -1; + cache_ptr->mdjsc_cb_tbl_len = H5C__MIN_MDJSC_CB_TBL_LEN; + cache_ptr->num_mdjsc_cbs = 0; + cache_ptr->mdjsc_cb_tbl_fl_head = 0; + cache_ptr->mdjsc_cb_tbl_max_idx_in_use = -1; + + + if ( H5C_reset_cache_hit_rate_stats(cache_ptr) != SUCCEED ) { + + /* this should be impossible... */ + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, NULL, \ + "H5C_reset_cache_hit_rate_stats failed.") + } + + H5C_stats__reset(cache_ptr); + + cache_ptr->skip_file_checks = FALSE; + cache_ptr->skip_dxpl_id_checks = FALSE; + cache_ptr->prefix[0] = '\0'; /* empty string */ + + /* We used to check for journaling here, but the super block hasn't + * been read in yet at cache creation time -- thus the check for + * journaling has been moved to H5AC_check_for_journaling(), which + * is simply a wrapper for H5C_check_for_journaling(). + * + * H5AC_check_for_journaling() is called at the end of H5Fopen() -- + * at which point the superblock has been read. + * + * Note that H5Fopen() is called by both H5Fcreate() and H5Fopen(). + */ + + /* Set return value */ + ret_value = cache_ptr; + +done: + + if ( ret_value == 0 ) { + + if ( cache_ptr != NULL ) { + + if ( cache_ptr->slist_ptr != NULL ) + H5SL_close(cache_ptr->slist_ptr); + + cache_ptr->magic = 0; + H5FL_FREE(H5C_t, cache_ptr); + cache_ptr = NULL; + + } /* end if */ + + } /* end if */ + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_create() */ + + +/*------------------------------------------------------------------------- + * Function: H5C_def_auto_resize_rpt_fcn + * + * Purpose: Print results of a automatic cache resize. + * + * This function should only be used where HDprintf() behaves + * well -- i.e. not on Windows. + * + * Return: void + * + * Programmer: John Mainzer + * 10/27/04 + * + * Modifications: + * + * JRM -- 11/22/04 + * Reworked function to adapt it to the addition of the + * ageout method of cache size reduction. + * + * JRM -- 1/19/06 + * Updated function for display the new prefix field of + * H5C_t in output. + * + * JRM 12/31/07 + * Updated function to handle flash size increases. + * + *------------------------------------------------------------------------- + */ +void +H5C_def_auto_resize_rpt_fcn(H5C_t * cache_ptr, +#ifndef NDEBUG + int32_t version, +#else /* NDEBUG */ + int32_t UNUSED version, +#endif /* NDEBUG */ + double hit_rate, + enum H5C_resize_status status, + size_t old_max_cache_size, + size_t new_max_cache_size, + size_t old_min_clean_size, + size_t new_min_clean_size) +{ + HDassert( cache_ptr != NULL ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + HDassert( version == H5C__CURR_AUTO_RESIZE_RPT_FCN_VER ); + + switch ( status ) + { + case in_spec2: + HDfprintf(stdout, + "%sAuto cache resize -- no change. (hit rate = %lf)\n", + cache_ptr->prefix, hit_rate); + break; + + case increase2: + HDassert( hit_rate < (cache_ptr->resize_ctl).lower_hr_threshold ); + HDassert( old_max_cache_size < new_max_cache_size ); + + HDfprintf(stdout, + "%sAuto cache resize -- hit rate (%lf) out of bounds low (%6.5lf).\n", + cache_ptr->prefix, hit_rate, + (cache_ptr->resize_ctl).lower_hr_threshold); + + HDfprintf(stdout, + "%s cache size increased from (%Zu/%Zu) to (%Zu/%Zu).\n", + cache_ptr->prefix, + old_max_cache_size, + old_min_clean_size, + new_max_cache_size, + new_min_clean_size); + break; + + case flash_increase2: + HDassert( old_max_cache_size < new_max_cache_size ); + + HDfprintf(stdout, + "%sflash cache resize(%d) -- size threshold = %Zu.\n", + cache_ptr->prefix, + (int)((cache_ptr->resize_ctl).flash_incr_mode), + cache_ptr->flash_size_increase_threshold); + + HDfprintf(stdout, + "%s cache size increased from (%Zu/%Zu) to (%Zu/%Zu).\n", + cache_ptr->prefix, + old_max_cache_size, + old_min_clean_size, + new_max_cache_size, + new_min_clean_size); + break; + + + case decrease2: + HDassert( old_max_cache_size > new_max_cache_size ); + + switch ( (cache_ptr->resize_ctl).decr_mode ) + { + case H5C_decr__threshold: + HDassert( hit_rate > + (cache_ptr->resize_ctl).upper_hr_threshold ); + + HDfprintf(stdout, + "%sAuto cache resize -- decrease by threshold. HR = %lf > %6.5lf\n", + cache_ptr->prefix, hit_rate, + (cache_ptr->resize_ctl).upper_hr_threshold); + + HDfprintf(stdout, "%sout of bounds high (%6.5lf).\n", + cache_ptr->prefix, + (cache_ptr->resize_ctl).upper_hr_threshold); + break; + + case H5C_decr__age_out: + HDfprintf(stdout, + "%sAuto cache resize -- decrease by ageout. HR = %lf\n", + cache_ptr->prefix, hit_rate); + break; + + case H5C_decr__age_out_with_threshold: + HDassert( hit_rate > + (cache_ptr->resize_ctl).upper_hr_threshold ); + + HDfprintf(stdout, + "%sAuto cache resize -- decrease by ageout with threshold. HR = %lf > %6.5lf\n", + cache_ptr->prefix, hit_rate, + (cache_ptr->resize_ctl).upper_hr_threshold); + break; + + default: + HDfprintf(stdout, + "%sAuto cache resize -- decrease by unknown mode. HR = %lf\n", + cache_ptr->prefix, hit_rate); + } + + HDfprintf(stdout, + "%s cache size decreased from (%Zu/%Zu) to (%Zu/%Zu).\n", + cache_ptr->prefix, + old_max_cache_size, + old_min_clean_size, + new_max_cache_size, + new_min_clean_size); + break; + + case at_max_size2: + HDfprintf(stdout, + "%sAuto cache resize -- hit rate (%lf) out of bounds low (%6.5lf).\n", + cache_ptr->prefix, hit_rate, + (cache_ptr->resize_ctl).lower_hr_threshold); + HDfprintf(stdout, + "%s cache already at maximum size so no change.\n", + cache_ptr->prefix); + break; + + case at_min_size2: + HDfprintf(stdout, + "%sAuto cache resize -- hit rate (%lf) -- can't decrease.\n", + cache_ptr->prefix, hit_rate); + HDfprintf(stdout, "%s cache already at minimum size.\n", + cache_ptr->prefix); + break; + + case increase_disabled2: + HDfprintf(stdout, + "%sAuto cache resize -- increase disabled -- HR = %lf.", + cache_ptr->prefix, hit_rate); + break; + + case decrease_disabled2: + HDfprintf(stdout, + "%sAuto cache resize -- decrease disabled -- HR = %lf.\n", + cache_ptr->prefix, hit_rate); + break; + + case not_full2: + HDassert( hit_rate < (cache_ptr->resize_ctl).lower_hr_threshold ); + + HDfprintf(stdout, + "%sAuto cache resize -- hit rate (%lf) out of bounds low (%6.5lf).\n", + cache_ptr->prefix, hit_rate, + (cache_ptr->resize_ctl).lower_hr_threshold); + HDfprintf(stdout, + "%s cache not full so no increase in size.\n", + cache_ptr->prefix); + break; + + default: + HDfprintf(stdout, "%sAuto cache resize -- unknown status code.\n", + cache_ptr->prefix); + break; + } + + return; + +} /* H5C_def_auto_resize_rpt_fcn() */ + + +/*------------------------------------------------------------------------- + * Function: H5C_dest + * + * Purpose: Flush all data to disk and destroy the cache. + * + * This function fails if any object are protected since the + * resulting file might not be consistent. + * + * The primary_dxpl_id and secondary_dxpl_id parameters + * specify the dxpl_ids used on the first write occasioned + * by the destroy (primary_dxpl_id), and on all subsequent + * writes (secondary_dxpl_id). This is useful in the metadata + * cache, but may not be needed elsewhere. If so, just use the + * same dxpl_id for both parameters. + * + * Note that *cache_ptr has been freed upon successful return. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: John Mainzer + * 6/2/04 + * + * Modifications: + * + * JRM -- 7/11/07 + * Reworked parameter list for the revised cache API. + * The function lost its pointer to an instance of + * H5F_t (now supplied via cache_ptr), and one of its + * dxlp ids. + * + *------------------------------------------------------------------------- + */ +herr_t +H5C_dest(H5F_t * f, + hid_t dxpl_id) +{ + H5C_t * cache_ptr = f->shared->cache; + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5C_dest, FAIL) + + HDassert( cache_ptr ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + + /* All metadata journaling status change callbacks should have + * de-registered at this point. + */ + HDassert( cache_ptr->num_mdjsc_cbs == 0 ); + + if ( cache_ptr->mdj_enabled ) { + + if ( H5C_end_journaling(f, dxpl_id, cache_ptr) != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ + "H5C_end_journaling() failed.") + } + } + + if ( H5C_flush_cache(f, dxpl_id, + H5C__FLUSH_INVALIDATE_FLAG) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush cache") + } + + if ( cache_ptr->slist_ptr != NULL ) { + + H5SL_close(cache_ptr->slist_ptr); + cache_ptr->slist_ptr = NULL; + } + + if ( cache_ptr->mdjsc_cb_tbl != NULL ) { + + cache_ptr->mdjsc_cb_tbl = H5MM_xfree(cache_ptr->mdjsc_cb_tbl); + + if ( cache_ptr->mdjsc_cb_tbl != NULL ) { + + HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, \ + "free of mdjsc_cb_tbl failed."); + } + } + + cache_ptr->magic = 0; + + cache_ptr = H5FL_FREE(H5C_t, cache_ptr); + +done: + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_dest() */ + + +/*------------------------------------------------------------------------- + * Function: H5C_dest_empty + * + * Purpose: Destroy an empty cache. + * + * This function fails if the cache is not empty on entry. + * + * Note that *cache_ptr has been freed upon successful return. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: John Mainzer + * 6/2/04 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ +herr_t +H5C_dest_empty(H5C_t * cache_ptr) +{ + herr_t ret_value=SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5C_dest_empty, FAIL) + + /* This would normally be an assert, but we need to use an HGOTO_ERROR + * call to shut up the compiler. + */ + if ( ( ! cache_ptr ) || + ( cache_ptr->magic != H5C__H5C_T_MAGIC ) || + ( cache_ptr->index_len != 0 ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "Bad cache_ptr or non-empty cache on entry.") + } + + + if ( cache_ptr->slist_ptr != NULL ) { + + H5SL_close(cache_ptr->slist_ptr); + cache_ptr->slist_ptr = NULL; + } + + cache_ptr->magic = 0; + + H5FL_FREE(H5C_t, cache_ptr); + +done: + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_dest_empty() */ + + +/*------------------------------------------------------------------------- + * + * Function: H5C_expunge_entry + * + * Purpose: Use this function to tell the cache to expunge an entry + * from the cache without writing it to disk even if it is + * dirty. The entry may not be either pinned or protected. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: John Mainzer + * 6/29/06 + * + * Modifications: + * + * JRM -- 7/11/07 + * Reworked the parameter list for the revised cache API. + * The function lost its file pointer (now passed in the + * *cache_ptr), and one of the dxpl ids. + * + * JRM -- 4/3/08 + * Added code to test to see if journaling is enabled, and + * if it is, test to see if entry_ptr->last_trans > zero. + * If so, must remove the entry from the transaction list + * (if it is present), remove the entry from the journal + * write in progress list, and set entry_ptr->last_trans to + * zero before calling H5C_flush_single_entry(). + * + *------------------------------------------------------------------------- + */ + +herr_t +H5C_expunge_entry(H5F_t * f, + hid_t dxpl_id, + const H5C_class_t * type, + haddr_t addr) +{ + H5C_t * cache_ptr; + herr_t result; + herr_t ret_value = SUCCEED; /* Return value */ + H5C_cache_entry_t * entry_ptr = NULL; + + FUNC_ENTER_NOAPI(H5C_expunge_entry, FAIL) + +#if H5C_PRINT_ENTRY_POINTS + if ( H5C_PRINT_ENTRY_POINT_TARGET_TYPE(type->id) ) + { + HDfprintf(stdout, "%s: addr = 0x%lX, type = %s.\n", + FUNC, (unsigned long)addr, type->name); + } +#endif /* H5C_PRINT_ENTRY_POINTS */ + + HDassert( f ); + HDassert( f->shared ); + + cache_ptr = f->shared->cache; + + HDassert( H5F_addr_defined(addr) ); + HDassert( cache_ptr ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + HDassert( type ); + +#if H5C_DO_EXTREME_SANITY_CHECKS + if ( H5C_validate_lru_list(cache_ptr) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "LRU sanity check failed.\n"); + } +#endif /* H5C_DO_EXTREME_SANITY_CHECKS */ + + H5C__SEARCH_INDEX(cache_ptr, addr, entry_ptr, FAIL) + + if ( ( entry_ptr == NULL ) || ( entry_ptr->type != type ) ) { + + /* the target doesn't exist in the cache, so we are done. */ + HGOTO_DONE(SUCCEED) + } + + HDassert( entry_ptr->addr == addr ); + HDassert( entry_ptr->type == type ); + + if ( entry_ptr->is_protected ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTEXPUNGE, FAIL, \ + "Target entry is protected.") + } + + if ( entry_ptr->is_pinned ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTEXPUNGE, FAIL, \ + "Target entry is pinned.") + } + + /* H5C_flush_single_entry() will choke if the last_trans field + * of the entry isn't zero, or if the entry is on the transaction + * list, or on the transaction write in progress list. Must tend + * to this before we we make the call. + */ + if ( cache_ptr->mdj_enabled ) { + + if ( cache_ptr->trans_num > 0 ) { + + /* remove the entry from the transaction list if it is there */ + H5C__TRANS_DLL_REMOVE(entry_ptr, cache_ptr->tl_head_ptr, \ + cache_ptr->tl_tail_ptr, cache_ptr->tl_len, \ + cache_ptr->tl_size, FAIL); + + entry_ptr->last_trans = (uint64_t)0; + + H5C__UPDATE_RP_FOR_JOURNAL_WRITE_COMPLETE(cache_ptr, \ + entry_ptr, \ + FAIL) + } + } + + /* If we get this far, call H5C_flush_single_entry() with the + * H5C__FLUSH_INVALIDATE_FLAG and the H5C__FLUSH_CLEAR_ONLY_FLAG. + * This will clear the entry, and then delete it from the cache. + */ + + result = H5C_flush_single_entry(f, + dxpl_id, + cache_ptr, + entry_ptr->type, + entry_ptr->addr, + H5C__FLUSH_INVALIDATE_FLAG | + H5C__FLUSH_CLEAR_ONLY_FLAG, + TRUE); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTEXPUNGE, FAIL, \ + "H5C_flush_single_entry() failed.") + } + +done: + +#if H5C_DO_EXTREME_SANITY_CHECKS + if ( H5C_validate_lru_list(cache_ptr) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "LRU sanity check failed.\n"); + } +#endif /* H5C_DO_EXTREME_SANITY_CHECKS */ + +#if H5C_PRINT_EXIT_POINTS + if ( H5C_PRINT_ENTRY_POINT_TARGET_TYPE(type->id) ) { + HDfprintf(stdout, "%s: Exiting with result = %d.\n", + FUNC, (int)ret_value); + } +#endif /* H5C_PRINT_EXIT_POINTS */ + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_expunge_entry() */ + + +/*------------------------------------------------------------------------- + * Function: H5C_flush_cache + * + * Purpose: Flush (and possibly destroy) the entries contained in the + * specified cache. + * + * If the cache contains protected entries, the function will + * fail, as protected entries cannot be flushed. However + * all unprotected entries should be flushed before the + * function returns failure. + * + * The primary_dxpl_id and secondary_dxpl_id parameters + * specify the dxpl_ids used on the first write occasioned + * by the flush (primary_dxpl_id), and on all subsequent + * writes (secondary_dxpl_id). This is useful in the metadata + * cache, but may not be needed elsewhere. If so, just use the + * same dxpl_id for both parameters. + * + * Return: Non-negative on success/Negative on failure or if there was + * a request to flush all items and something was protected. + * + * Programmer: John Mainzer + * 6/2/04 + * + * Modifications: + * + * JRM -- 7/20/04 + * Modified the function for the addition of the hash table. + * + * JRM -- 11/22/04 + * Added code to remove all epoch markers (if any) from the + * LRU list before a destroy. Strictly speaking, this isn't + * necessary, as the marker entries reside only in the LRU + * list, never in the index or in the tree. However, it + * never hurts to tidy up. + * + * JRM -- 1/6/05 + * Reworked code to support the new + * H5C__FLUSH_MARKED_ENTRIES_FLAG, and for the replacement of + * H5F_FLUSH_INVALIDATE flag with H5C__FLUSH_INVALIDATE_FLAG. + * + * Note that the H5C__FLUSH_INVALIDATE_FLAG takes precidence + * over the H5C__FLUSH_MARKED_ENTRIES_FLAG. Thus if both are + * set, the functions behaves as if just the + * H5C__FLUSH_INVALIDATE_FLAG was set. + * + * The H5C__FLUSH_CLEAR_ONLY_FLAG flag can co-exist with + * either the H5C__FLUSH_MARKED_ENTRIES_FLAG, or the + * H5C__FLUSH_INVALIDATE_FLAG. In all cases, it is simply + * passed along to H5C_flush_single_entry(). In the case of + * H5C__FLUSH_MARKED_ENTRIES_FLAG, it will only apply to + * the marked entries. + * + * JRM -- 10/15/05 + * Added code supporting the new + * H5C__FLUSH_IGNORE_PROTECTED_FLAG. We need this flag, as + * we now use this function to flush large number of entries + * in increasing address order. We do this by marking the + * entries to be flushed, calling this function to flush them, + * and then restoring LRU order. + * + * However, it is possible that the cache will contain other, + * unmarked protected entries, when we make this call. This + * new flag allows us to ignore them. + * + * Note that even with this flag set, it is still an error + * to try to flush a protected entry. + * + * JRM -- 3/25/06 + * Updated function to handle pinned entries. + * + * JRM -- 8/19/06 + * Added code managing the new flush_in_progress field of + * H5C_t. + * + * Also reworked function to allow for the possibility that + * entries will be dirtied, resized, or renamed during flush + * callbacks. As a result, we may have to make multiple + * passes through the skip list before the cache is flushed. + * + * JRM -- 7/11/07 + * Reworked function to support the new metadata cache API. + * The function lost the H5F_t parameter (now passed via + * *cache_ptr), and one of the dxpl id parameters. + * + * JRM -- 10/13/07 + * Added code to detect and manage the case in which a + * serialize callback changes the s-list out from under + * the function. The only way I can think of in which this + * can happen is if a serialize function loads an entry + * into the cache that isn't there already. Quincey tells + * me that this will never happen, but I'm not sure I + * believe him. + * + * Note that this is a pretty bad scenario if it ever + * happens. The code I have added should allow us to + * handle the situation, but one can argue that I should + * just scream and die if I ever detect the condidtion. + * + * JRM -- 10/13/07 + * Added code to detect and manage the case in which a + * flush callback changes the s-list out from under + * the function. The only way I can think of in which this + * can happen is if a flush function loads an entry + * into the cache that isn't there already. Quincey tells + * me that this will never happen, but I'm not sure I + * believe him. + * + * Note that this is a pretty bad scenario if it ever + * happens. The code I have added should allow us to + * handle the situation under all but the worst conditions, + * but one can argue that I should just scream and die if I + * ever detect the condidtion. + * + * JRM -- 4/10/08 + * Added code to support journaling. + * + *------------------------------------------------------------------------- + */ +herr_t +H5C_flush_cache(H5F_t *f, hid_t dxpl_id, unsigned flags) +{ + H5C_t * cache_ptr; + herr_t status; + herr_t ret_value = SUCCEED; + hbool_t destroy; + hbool_t flushed_entries_last_pass; + hbool_t flush_marked_entries; + hbool_t ignore_protected; + hbool_t tried_to_flush_protected_entry = FALSE; + int32_t passes = 0; + int32_t protected_entries = 0; + H5SL_node_t * node_ptr = NULL; + H5C_cache_entry_t * entry_ptr = NULL; + H5C_cache_entry_t * next_entry_ptr = NULL; +#if H5C_DO_SANITY_CHECKS + int64_t flushed_entries_count; + size_t flushed_entries_size; + int64_t initial_slist_len; + size_t initial_slist_size; +#endif /* H5C_DO_SANITY_CHECKS */ + + FUNC_ENTER_NOAPI(H5C_flush_cache, FAIL) + +#if H5C_PRINT_ENTRY_POINTS + HDfprintf(stdout, "%s: flags = 0x%x.\n", FUNC, flags); +#endif /* H5C_PRINT_ENTRY_POINTS */ + + HDassert( f ); + HDassert( f->shared ); + + cache_ptr = f->shared->cache; + + HDassert( cache_ptr ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + HDassert( cache_ptr->skip_file_checks || f); + HDassert( cache_ptr->slist_ptr ); + + ignore_protected = ( (flags & H5C__FLUSH_IGNORE_PROTECTED_FLAG) != 0 ); + + destroy = ( (flags & H5C__FLUSH_INVALIDATE_FLAG) != 0 ); + + /* note that flush_marked_entries is set to FALSE if destroy is TRUE */ + flush_marked_entries = ( ( (flags & H5C__FLUSH_MARKED_ENTRIES_FLAG) != 0 ) + && + ( ! destroy ) + ); + + HDassert( ! ( destroy && ignore_protected ) ); + + HDassert( ! ( cache_ptr->flush_in_progress ) ); + + if ( cache_ptr->mdj_enabled ) { + + status = H5C_journal_pre_flush(cache_ptr); + + if ( status != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ + "H5C_journal_pre_flush() failed.") + } + } + + cache_ptr->flush_in_progress = TRUE; + + if ( destroy ) { + + status = H5C_flush_invalidate_cache(f, + dxpl_id, + cache_ptr, + flags); + + if ( status < 0 ) { + + /* This shouldn't happen -- if it does, we are toast so + * just scream and die. + */ + HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ + "flush invalidate failed.") + } + } else { + /* When we are only flushing marked entries, the slist will usually + * still contain entries when we have flushed everything we should. + * Thus we track whether we have flushed any entries in the last + * pass, and terminate if we haven't. + */ + + flushed_entries_last_pass = TRUE; + + while ( ( passes < H5C__MAX_PASSES_ON_FLUSH ) && + ( cache_ptr->slist_len != 0 ) && + ( protected_entries == 0 ) && + ( flushed_entries_last_pass ) ) + { + flushed_entries_last_pass = FALSE; + node_ptr = H5SL_first(cache_ptr->slist_ptr); + + if ( node_ptr != NULL ) { + + next_entry_ptr = (H5C_cache_entry_t *)H5SL_item(node_ptr); + + if ( next_entry_ptr == NULL ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "next_entry_ptr == NULL 1 ?!?!"); + } +#ifndef NDEBUG + HDassert( next_entry_ptr->magic == + H5C__H5C_CACHE_ENTRY_T_MAGIC ); +#endif /* NDEBUG */ + HDassert( next_entry_ptr->is_dirty ); + HDassert( next_entry_ptr->in_slist ); + + } else { + + next_entry_ptr = NULL; + + } + + HDassert( node_ptr != NULL ); + +#if H5C_DO_SANITY_CHECKS + /* For sanity checking, try to verify that the skip list has + * the expected size and number of entries at the end of each + * internal while loop (see below). + * + * Doing this get a bit tricky, as depending on flags, we may + * or may not flush all the entries in the slist. + * + * To make things more entertaining, with the advent of the + * fractal heap, the entry serialize callback can cause entries + * to be dirtied, resized, and/or renamed. + * + * To deal with this, we first make note of the initial + * skip list length and size: + */ + initial_slist_len = cache_ptr->slist_len; + initial_slist_size = cache_ptr->slist_size; + + /* We then zero counters that we use to track the number + * and total size of entries flushed: + */ + flushed_entries_count = 0; + flushed_entries_size = 0; + + /* As mentioned above, there is the possibility that + * entries will be dirtied, resized, and/or flushed during + * our pass through the skip list. To capture the number + * of entries added, and the skip list size delta, + * zero the slist_len_increase and slist_size_increase of + * the cache's instance of H5C_t. These fields will be + * updated elsewhere to account for slist insertions and/or + * dirty entry size changes. + */ + cache_ptr->slist_len_increase = 0; + cache_ptr->slist_size_increase = 0; + + /* at the end of the loop, use these values to compute the + * expected slist length and size and compare this with the + * value recorded in the cache's instance of H5C_t. + */ +#endif /* H5C_DO_SANITY_CHECKS */ + + while ( node_ptr != NULL ) + { + entry_ptr = next_entry_ptr; + + /* With the advent of the fractal heap, it is possible + * that the serialize callback will dirty and/or resize + * other entries in the cache. In particular, while + * Quincey has promised me that this will never happen, + * it is possible that the serialize callback for an + * entry may protect an entry that is not in the cache, + * perhaps causing the cache to flush and possibly + * evict the entry associated with node_ptr to make + * space for the new entry. + * + * Thus we do a bit of extra sanity checking on entry_ptr, + * and break out of this scan of the skip list if we + * detect minor problems. We have a bit of leaway on the + * number of passes though the skip list, so this shouldn't + * be an issue in the flush in and of itself, as it should + * be all but impossible for this to happen more than once + * in any flush. + * + * Observe that that breaking out of the scan early + * shouldn't break the sanity checks just after the end + * of this while loop. + * + * If an entry has merely been marked clean and removed from + * the s-list, we simply break out of the scan. + * + * If the entry has been evicted, we flag an error and + * exit. + */ +#ifndef NDEBUG + if ( entry_ptr->magic != H5C__H5C_CACHE_ENTRY_T_MAGIC ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "entry_ptr->magic invalid ?!?!"); + + } else +#endif /* NDEBUG */ + if ( ( ! entry_ptr->is_dirty ) || + ( ! entry_ptr->in_slist ) ) { + + /* the s-list has been modified out from under us. + * set node_ptr to NULL and break out of the loop. + */ + node_ptr = NULL; + break; + } + + /* increment node pointer now, before we delete its target + * from the slist. + */ + node_ptr = H5SL_next(node_ptr); + + if ( node_ptr != NULL ) { + + next_entry_ptr = (H5C_cache_entry_t *)H5SL_item(node_ptr); + + if ( next_entry_ptr == NULL ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "next_entry_ptr == NULL 2 ?!?!"); + } +#ifndef NDEBUG + HDassert( next_entry_ptr->magic == + H5C__H5C_CACHE_ENTRY_T_MAGIC ); +#endif /* NDEBUG */ + HDassert( next_entry_ptr->is_dirty ); + HDassert( next_entry_ptr->in_slist ); + } else { + next_entry_ptr = NULL; + } + + HDassert( entry_ptr != NULL ); + HDassert( entry_ptr->in_slist ); + + if ( ( ! flush_marked_entries ) || + ( entry_ptr->flush_marker ) ) { + + if ( entry_ptr->is_protected ) { + + /* we probably have major problems -- but lets flush + * everything we can before we decide whether to flag + * an error. + */ + tried_to_flush_protected_entry = TRUE; + protected_entries++; + + } else if ( entry_ptr->is_pinned ) { + + /* Test to see if we are can flush the entry now. + * If we can, go ahead and flush. Note that we + * aren't trying to do a destroy here, so that + * is not an issue. + */ + if ( TRUE ) { /* When we get to multithreaded cache, + * we will need either locking code, + * and/or a test to see if the entry + * is in flushable condition here. + */ +#if H5C_DO_SANITY_CHECKS + flushed_entries_count++; + flushed_entries_size += entry_ptr->size; +#endif /* H5C_DO_SANITY_CHECKS */ + status = H5C_flush_single_entry(f, + dxpl_id, + cache_ptr, + entry_ptr->type, + entry_ptr->addr, + flags, + FALSE); + if ( status < 0 ) { + + /* This shouldn't happen -- if it does, we + * are toast so just scream and die. + */ + HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ + "dirty pinned entry flush failed.") + } + flushed_entries_last_pass = TRUE; + } + } else { +#if H5C_DO_SANITY_CHECKS + flushed_entries_count++; + flushed_entries_size += entry_ptr->size; +#endif /* H5C_DO_SANITY_CHECKS */ + status = H5C_flush_single_entry(f, + dxpl_id, + cache_ptr, + entry_ptr->type, + entry_ptr->addr, + flags, + FALSE); + if ( status < 0 ) { + + /* This shouldn't happen -- if it does, we are + * toast so just scream and die. + */ + HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ + "Can't flush entry.") + } + flushed_entries_last_pass = TRUE; + } + } + } /* while ( node_ptr != NULL ) */ + +#if H5C_DO_SANITY_CHECKS + /* Verify that the slist size and length are as expected. */ + + HDassert( (initial_slist_len + cache_ptr->slist_len_increase - + flushed_entries_count) == cache_ptr->slist_len ); + HDassert( (initial_slist_size + cache_ptr->slist_size_increase - + flushed_entries_size) == cache_ptr->slist_size ); +#endif /* H5C_DO_SANITY_CHECKS */ + + passes++; + + } /* while */ + + HDassert( protected_entries <= cache_ptr->pl_len ); + + if ( ( ( cache_ptr->pl_len > 0 ) && ( !ignore_protected ) ) + || + ( tried_to_flush_protected_entry ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ + "cache has protected items") + } + + if ( ( cache_ptr->slist_len != 0 ) && + ( passes >= H5C__MAX_PASSES_ON_FLUSH ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ + "flush pass limit exceeded.") + } + +#if H5C_DO_SANITY_CHECKS + if ( ! flush_marked_entries ) { + + HDassert( cache_ptr->slist_len == 0 ); + HDassert( cache_ptr->slist_size == 0 ); + } +#endif /* H5C_DO_SANITY_CHECKS */ + + } + + if ( cache_ptr->mdj_enabled ) { + + status = H5C_journal_post_flush(f, dxpl_id, cache_ptr, + (hbool_t)(flush_marked_entries == FALSE)); + + if ( status != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ + "H5C_journal_post_flush() failed.") + } + } + +done: + + cache_ptr->flush_in_progress = FALSE; + +#if H5C_PRINT_EXIT_POINTS + HDfprintf(stdout, "%s: Exiting with result = %d.\n", + FUNC, (int)ret_value); +#endif /* H5C_PRINT_EXIT_POINTS */ + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_flush_cache() */ + + +/*------------------------------------------------------------------------- + * Function: H5C_flush_to_min_clean + * + * Purpose: Flush dirty entries until the caches min clean size is + * attained. + * + * This function is used in the implementation of the + * metadata cache in PHDF5. To avoid "messages from the + * future", the cache on process 0 can't be allowed to + * flush entries until the other processes have reached + * the same point in the calculation. If this constraint + * is not met, it is possible that the other processes will + * read metadata generated at a future point in the + * computation. + * + * + * Return: Non-negative on success/Negative on failure or if + * write is not permitted. + * + * Programmer: John Mainzer + * 9/16/05 + * + * Modifications: + * + * Re-wrote function to flush dirty entries in increasing + * address order, while maintaining LRU order in the LRU list + * upon return. + * + * Do this by scanning up the dirty LRU list for entries to + * flush to reach min clean size, setting their flush_marker + * flags, and recording their addresses in the order + * encountered. + * + * Then call H5C_flush_cache() to flush the marked entries. + * + * Finally, use the list of marked entries to force the + * correct LRU list order after the flush. + * + * JRM - 10/13/05 + * + * This change had the oposite of the desired effect. Lets + * leave it in (albeit commented out for now). If we can't + * find a case where it helps, lets get rid of it. + * + * + * Added some sanity checks to the change which verify the + * expected values of the new is_read_only and ro_ref_count + * fields. + * JRM - 3/29/07 + * + * Modified parameter list for the new metadata cache API. + * THe function lost its H5F_t parameter (now passed via + * *cache_ptr), and one of its dxpl ids. + * + * JRM - 7/11/07 + * + *------------------------------------------------------------------------- + */ +herr_t +H5C_flush_to_min_clean(H5F_t * f, + hid_t dxpl_id) +{ + H5C_t * cache_ptr; + herr_t result; + herr_t ret_value = SUCCEED; + hbool_t write_permitted; +#if 0 /* modified code -- commented out for now */ + int i; + int flushed_entries_count = 0; + size_t flushed_entries_size = 0; + size_t space_needed = 0; + haddr_t * flushed_entries_list = NULL; + H5C_cache_entry_t * entry_ptr = NULL; +#endif /* JRM */ + + FUNC_ENTER_NOAPI(H5C_flush_to_min_clean, FAIL) + + HDassert( f ); + HDassert( f->shared ); + + cache_ptr = f->shared->cache; + + HDassert( cache_ptr ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + HDassert( cache_ptr->skip_file_checks || f ); + + if ( cache_ptr->check_write_permitted != NULL ) { + + result = (cache_ptr->check_write_permitted)(f, + dxpl_id, + &write_permitted); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "Can't get write_permitted") + } + } else { + + write_permitted = cache_ptr->write_permitted; + } + + if ( ! write_permitted ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "cache write is not permitted!?!\n"); + } +#if 1 /* original code */ + result = H5C_make_space_in_cache(f, + dxpl_id, + cache_ptr, + (size_t)0, + write_permitted); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_make_space_in_cache failed.") + } +#else /* modified code -- commented out for now */ + if ( cache_ptr->max_cache_size > cache_ptr->index_size ) { + + if ( ((cache_ptr->max_cache_size - cache_ptr->index_size) + + cache_ptr->cLRU_list_size) >= cache_ptr->min_clean_size ) { + + space_needed = 0; + + } else { + + space_needed = cache_ptr->min_clean_size - + ((cache_ptr->max_cache_size - cache_ptr->index_size) + + cache_ptr->cLRU_list_size); + } + } else { + + if ( cache_ptr->min_clean_size <= cache_ptr->cLRU_list_size ) { + + space_needed = 0; + + } else { + + space_needed = cache_ptr->min_clean_size - + cache_ptr->cLRU_list_size; + } + } + + if ( space_needed > 0 ) { /* we have work to do */ + + HDassert( cache_ptr->slist_len > 0 ); + + /* allocate an array to keep a list of the entries that we + * mark for flush. We need this list to touch up the LRU + * list after the flush. + */ + flushed_entries_list = (haddr_t *)H5MM_malloc(sizeof(haddr_t) * + (size_t)(cache_ptr->slist_len)); + + if ( flushed_entries_list == NULL ) { + + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \ + "memory allocation failed for flushed entries list") + } + + /* Scan the dirty LRU list from tail forward and mark sufficient + * entries to free up the necessary space. Keep a list of the + * entries marked in the order in which they are encountered. + */ + entry_ptr = cache_ptr->dLRU_tail_ptr; + + while ( ( flushed_entries_size < space_needed ) && + ( flushed_entries_count < cache_ptr->slist_len ) && + ( entry_ptr != NULL ) ) + { + HDassert( ! (entry_ptr->is_protected) ); + HDassert( ! (entry_ptr->is_read_only) ); + HDassert( entry_ptr->ro_ref_count == 0 ); + HDassert( entry_ptr->is_dirty ); + HDassert( entry_ptr->in_slist ); + + entry_ptr->flush_marker = TRUE; + flushed_entries_size += entry_ptr->size; + flushed_entries_list[flushed_entries_count] = entry_ptr->addr; + flushed_entries_count++; + entry_ptr = entry_ptr->aux_prev; + } + + HDassert( flushed_entries_count <= cache_ptr->slist_len ); + HDassert( flushed_entries_size >= space_needed ); + + + /* Flush the marked entries */ + result = H5C_flush_cache(f, primary_dxpl_id, secondary_dxpl_id, + cache_ptr, H5C__FLUSH_MARKED_ENTRIES_FLAG | + H5C__FLUSH_IGNORE_PROTECTED_FLAG); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C_flush_cache failed.") + } + + /* Now touch up the LRU list so as to place the flushed entries in + * the order they they would be in if we had flushed them in the + * order we encountered them in. + */ + + i = 0; + while ( i < flushed_entries_count ) + { + H5C__SEARCH_INDEX_NO_STATS(cache_ptr, flushed_entries_list[i], \ + entry_ptr, FAIL) + + /* At present, the above search must always succeed. However, + * that may change. Write the code so we need only remove the + * following assert in that event. + */ + HDassert( entry_ptr != NULL ); + H5C__FAKE_RP_FOR_MOST_RECENT_ACCESS(cache_ptr, entry_ptr, FAIL) + i++; + } + } /* if ( space_needed > 0 ) */ +#endif /* end modified code -- commented out for now */ + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_flush_to_min_clean() */ + + +/*------------------------------------------------------------------------- + * Function: H5C_get_cache_auto_resize_config + * + * Purpose: Copy the current configuration of the cache automatic + * re-sizing function into the instance of H5C_auto_size_ctl_t + * pointed to by config_ptr. + * + * Return: SUCCEED on success, and FAIL on failure. + * + * Programmer: John Mainzer + * 10/8/04 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +herr_t +H5C_get_cache_auto_resize_config(const H5C_t * cache_ptr, + H5C_auto_size_ctl_t *config_ptr) +{ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5C_get_cache_auto_resize_config, FAIL) + + if ( ( cache_ptr == NULL ) || ( cache_ptr->magic != H5C__H5C_T_MAGIC ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr on entry.") + } + + if ( config_ptr == NULL ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad config_ptr on entry.") + } + + *config_ptr = cache_ptr->resize_ctl; + + config_ptr->set_initial_size = FALSE; + config_ptr->initial_size = cache_ptr->max_cache_size; + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_get_cache_auto_resize_config() */ + + +/*------------------------------------------------------------------------- + * Function: H5C_get_cache_size + * + * Purpose: Return the cache maximum size, the minimum clean size, the + * current size, and the current number of entries in + * *max_size_ptr, *min_clean_size_ptr, *cur_size_ptr, and + * *cur_num_entries_ptr respectively. If any of these + * parameters are NULL, skip that value. + * + * Return: SUCCEED on success, and FAIL on failure. + * + * Programmer: John Mainzer + * 10/8/04 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +herr_t +H5C_get_cache_size(H5C_t * cache_ptr, + size_t * max_size_ptr, + size_t * min_clean_size_ptr, + size_t * cur_size_ptr, + int32_t * cur_num_entries_ptr) +{ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5C_get_cache_size, FAIL) + + if ( ( cache_ptr == NULL ) || ( cache_ptr->magic != H5C__H5C_T_MAGIC ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr on entry.") + } + + if ( max_size_ptr != NULL ) { + + *max_size_ptr = cache_ptr->max_cache_size; + } + + if ( min_clean_size_ptr != NULL ) { + + *min_clean_size_ptr = cache_ptr->min_clean_size; + } + + if ( cur_size_ptr != NULL ) { + + *cur_size_ptr = cache_ptr->index_size; + } + + if ( cur_num_entries_ptr != NULL ) { + + *cur_num_entries_ptr = cache_ptr->index_len; + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_get_cache_size() */ + + +/*------------------------------------------------------------------------- + * Function: H5C_get_cache_hit_rate + * + * Purpose: Compute and return the current cache hit rate in + * *hit_rate_ptr. If there have been no accesses since the + * last time the cache hit rate stats were reset, set + * *hit_rate_ptr to 0.0. On error, *hit_rate_ptr is + * undefined. + * + * Return: SUCCEED on success, and FAIL on failure. + * + * Programmer: John Mainzer + * 10/7/04 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +herr_t +H5C_get_cache_hit_rate(H5C_t * cache_ptr, + double * hit_rate_ptr) + +{ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5C_get_cache_hit_rate, FAIL) + + if ( ( cache_ptr == NULL ) || ( cache_ptr->magic != H5C__H5C_T_MAGIC ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr on entry.") + } + + if ( hit_rate_ptr == NULL ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad hit_rate_ptr on entry.") + } + + HDassert( cache_ptr->cache_hits >= 0 ); + HDassert( cache_ptr->cache_accesses >= cache_ptr->cache_hits ); + + if ( cache_ptr->cache_accesses > 0 ) { + + *hit_rate_ptr = ((double)(cache_ptr->cache_hits)) / + ((double)(cache_ptr->cache_accesses)); + + } else { + + *hit_rate_ptr = 0.0; + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_get_cache_hit_rate() */ + + +/*------------------------------------------------------------------------- + * + * Function: H5C_get_entry_status + * + * Purpose: This function is used to determine whether the cache + * contains an entry with the specified base address. If + * the entry exists, it also reports some status information + * on the entry. + * + * Status information is reported in the locations pointed + * to by the size_ptr, in_cache_ptr, is_dirty_ptr, and + * is_protected_ptr. While in_cache_ptr must be defined, + * the remaining pointers may be NULL, in which case the + * associated data is not reported. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: John Mainzer + * 7/1/05 + * + * Modifications: + * + * JRM -- 4/26/06 + * Added the is_pinned_ptr parameter and supporting code. + * + *------------------------------------------------------------------------- + */ + +herr_t +H5C_get_entry_status(const H5F_t * f, + haddr_t addr, + size_t * size_ptr, + hbool_t * in_cache_ptr, + hbool_t * is_dirty_ptr, + hbool_t * is_protected_ptr, + hbool_t * is_pinned_ptr) +{ + H5C_t * cache_ptr; + herr_t ret_value = SUCCEED; /* Return value */ + H5C_cache_entry_t * entry_ptr = NULL; + + FUNC_ENTER_NOAPI(H5C_get_entry_status, FAIL) + + HDassert( f ); + HDassert( f->shared ); + + cache_ptr = f->shared->cache; + + HDassert( cache_ptr != NULL ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + HDassert( H5F_addr_defined(addr) ); + HDassert( in_cache_ptr != NULL ); + + /* this test duplicates two of the above asserts, but we need an + * invocation of HGOTO_ERROR to keep the compiler happy. + */ + if ( ( cache_ptr == NULL ) || ( cache_ptr->magic != H5C__H5C_T_MAGIC ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr on entry.") + } + + H5C__SEARCH_INDEX(cache_ptr, addr, entry_ptr, FAIL) + + if ( entry_ptr == NULL ) { + + /* the entry doesn't exist in the cache -- report this + * and quit. + */ + *in_cache_ptr = FALSE; + + } else { + + *in_cache_ptr = TRUE; + + if ( size_ptr != NULL ) { + + *size_ptr = entry_ptr->size; + } + + if ( is_dirty_ptr != NULL ) { + + *is_dirty_ptr = entry_ptr->is_dirty; + } + + if ( is_protected_ptr != NULL ) { + + *is_protected_ptr = entry_ptr->is_protected; + } + + if ( is_pinned_ptr != NULL ) { + + *is_pinned_ptr = entry_ptr->is_pinned; + } + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_get_entry_status() */ + + +/*------------------------------------------------------------------------- + * Function: H5C_get_evictions_enabled() + * + * Purpose: Copy the current value of cache_ptr->evictions_enabled into + * *evictions_enabled_ptr. + * + * Return: SUCCEED on success, and FAIL on failure. + * + * Programmer: John Mainzer + * 7/27/07 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +herr_t +H5C_get_evictions_enabled(const H5C_t * cache_ptr, + hbool_t * evictions_enabled_ptr) +{ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5C_get_evictions_enabled, FAIL) + + if ( ( cache_ptr == NULL ) || + ( cache_ptr->magic != H5C__H5C_T_MAGIC ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr on entry.") + } + + if ( evictions_enabled_ptr == NULL ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "Bad evictions_enabled_ptr on entry.") + } + + *evictions_enabled_ptr = cache_ptr->evictions_enabled; + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_get_evictions_enabled() */ + + +/*------------------------------------------------------------------------- + * Function: H5C_get_trace_file_ptr + * + * Purpose: Get the trace_file_ptr field from the cache. + * + * This field will either be NULL (which indicates that trace + * file logging is turned off), or contain a pointer to the + * open file to which trace file data is to be written. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: John Mainzer + * 1/20/06 + * + *------------------------------------------------------------------------- + */ +herr_t +H5C_get_trace_file_ptr(const H5C_t *cache_ptr, FILE **trace_file_ptr_ptr) +{ + FUNC_ENTER_NOAPI_NOFUNC(H5C_get_trace_file_ptr) + + HDassert(cache_ptr); + HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC); + HDassert(trace_file_ptr_ptr); + + *trace_file_ptr_ptr = cache_ptr->trace_file_ptr; + + FUNC_LEAVE_NOAPI(SUCCEED) +} /* H5C_get_trace_file_ptr() */ + + +/*------------------------------------------------------------------------- + * Function: H5C_get_trace_file_ptr_from_entry + * + * Purpose: Get the trace_file_ptr field from the cache, via an entry. + * + * This field will either be NULL (which indicates that trace + * file logging is turned off), or contain a pointer to the + * open file to which trace file data is to be written. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: Quincey Koziol + * 6/9/08 + * + *------------------------------------------------------------------------- + */ +herr_t +H5C_get_trace_file_ptr_from_entry(const H5C_cache_entry_t *entry_ptr, + FILE ** trace_file_ptr_ptr) +{ + FUNC_ENTER_NOAPI_NOFUNC(H5C_get_trace_file_ptr_from_entry) + + /* Sanity checks */ + HDassert(entry_ptr); + HDassert(entry_ptr->cache_ptr); + + H5C_get_trace_file_ptr(entry_ptr->cache_ptr, trace_file_ptr_ptr); + + FUNC_LEAVE_NOAPI(SUCCEED) +} /* H5C_get_trace_file_ptr_from_entry() */ + + +/*------------------------------------------------------------------------- + * Function: H5C_insert_entry + * + * Purpose: Adds the specified thing to the cache. The thing need not + * exist on disk yet, but it must have an address and disk + * space reserved. + * + * The primary_dxpl_id and secondary_dxpl_id parameters + * specify the dxpl_ids used on the first write occasioned + * by the insertion (primary_dxpl_id), and on all subsequent + * writes (secondary_dxpl_id). This is useful in the + * metadata cache, but may not be needed elsewhere. If so, + * just use the same dxpl_id for both parameters. + * + * The primary_dxpl_id is the dxpl_id passed to the + * check_write_permitted function if such a function has been + * provided. + * + * Observe that this function cannot occasion a read. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: John Mainzer + * 6/2/04 + * + * Modifications: + * + * JRM -- 7/21/04 + * Updated function for the addition of the hash table. + * + * JRM -- 10/28/04 + * Added code to set the cache_full flag to TRUE when ever + * we need to make space in the cache. + * + * JRM -- 11/22/04 + * Updated function for the addition of the first_flush_ptr + * parameter to H5C_make_space_in_cache(). + * + * JRM -- 1/6/05 + * Added the flags parameter, and code supporting + * H5C__SET_FLUSH_MARKER_FLAG. Note that this flag is + * ignored unless the new entry is dirty. + * + * JRM -- 6/6/05 + * Added code to force all inserted entries to be dirty. + * This is part of a set of changes moving management of the + * is_dirty field of H5C_cache_entry_t into the H5C code. + * + * JRM -- 6/24/05 + * Added support for the new write_permitted field of + * the H5C_t structure. + * + * JRM -- 3/16/06 + * Added initialization for the new is_pinned field of the + * H5C_cache_entry_t structure. + * + * JRM -- 5/3/06 + * Added initialization for the new dirtied field of the + * H5C_cache_entry_t structure. + * + * JRM -- 8/9/06 + * Added code supporting insertion of pinned entries. + * + * JRM -- 8/21/06 + * Added initialization for the new flush_in_progress and + * destroy_in_progress fields. + * + * JRM -- 3/29/07 + * Added initialization for the new is_read_only and + * ro_ref_count fields. + * + * JRM -- 7/11/07 + * Reworked the parameter list for the revised metadata + * cache API. The function lost its pointer to H5F_t + * (now supplied via *cache_ptr), and one of dxpl id + * parameters. It gained a entry length parameter. + * Numerous internal changes to support the API change. + * + * JRM -- 8/1/07 + * Added code to disable evictions when the new + * evictions_enabled field is FALSE. + * + * JRM -- 10/12/07 + * Added initialization for the new magic field. + * + * JRM -- 12/31/07 + * Added code supporting flash cache size increases. + * + * JRM -- 3/26/08 + * Added code initializing the journaling related fields. + * Also added code to set the new entries last_trans field + * to the current transaction number and insert the entry + * in the transaction list if journaling is enabled. + * + *------------------------------------------------------------------------- + */ + +herr_t +H5C_insert_entry(H5F_t * f, + hid_t dxpl_id, + const H5C_class_t * type, + haddr_t addr, + size_t len, + void * thing, + unsigned int flags) +{ + H5C_t * cache_ptr; + herr_t result; + herr_t ret_value = SUCCEED; /* Return value */ + hbool_t insert_pinned; + hbool_t set_flush_marker; + hbool_t write_permitted = TRUE; + H5C_cache_entry_t * entry_ptr; + H5C_cache_entry_t * test_entry_ptr; + + FUNC_ENTER_NOAPI(H5C_insert_entry, FAIL) + +#if H5C_PRINT_ENTRY_POINTS + if ( H5C_PRINT_ENTRY_POINT_TARGET_TYPE(type->id) ) + { + HDfprintf(stdout, "%s: addr = 0x%lX, len = %d, type = %s.\n", FUNC, + (unsigned long)addr, (int)len, type->name); + } +#endif /* JRM */ + + HDassert( f ); + HDassert( f->shared ); + + cache_ptr = f->shared->cache; + + HDassert( cache_ptr ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + HDassert( cache_ptr->skip_file_checks || f ); + HDassert( ( ! ( cache_ptr->mdj_enabled ) ) || + ( cache_ptr->trans_in_progress ) ); + HDassert( type ); + HDassert( H5F_addr_defined(addr) ); + HDassert( thing ); + +#if H5C_DO_EXTREME_SANITY_CHECKS + if ( H5C_verify_not_in_index(cache_ptr, (H5C_cache_entry_t *)thing) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "thing already in index.\n"); + } +#endif /* H5C_DO_SANITY_CHECKS */ + +#if H5C_DO_EXTREME_SANITY_CHECKS + if ( H5C_validate_lru_list(cache_ptr) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "LRU sanity check failed.\n"); + } +#endif /* H5C_DO_EXTREME_SANITY_CHECKS */ + + set_flush_marker = ( (flags & H5C__SET_FLUSH_MARKER_FLAG) != 0 ); + insert_pinned = ( (flags & H5C__PIN_ENTRY_FLAG) != 0 ); + + entry_ptr = (H5C_cache_entry_t *)thing; +#ifndef NDEBUG + entry_ptr->magic = H5C__H5C_CACHE_ENTRY_T_MAGIC; +#endif /* NDEBUG */ + entry_ptr->cache_ptr = cache_ptr; + entry_ptr->addr = addr; + entry_ptr->type = type; + + entry_ptr->image_ptr = NULL; + entry_ptr->image_up_to_date = FALSE; + + /* newly inserted entries are assumed to be dirty */ + entry_ptr->is_dirty = TRUE; + + /* not protected, so can't be dirtied */ + entry_ptr->dirtied = FALSE; + + entry_ptr->size = len; + + HDassert( entry_ptr->size < H5C_MAX_ENTRY_SIZE ); + + entry_ptr->in_slist = FALSE; + +#ifdef H5_HAVE_PARALLEL + entry_ptr->clear_on_unprotect = FALSE; +#endif /* H5_HAVE_PARALLEL */ + + entry_ptr->flush_in_progress = FALSE; + entry_ptr->destroy_in_progress = FALSE; + + entry_ptr->ht_next = NULL; + entry_ptr->ht_prev = NULL; + + entry_ptr->next = NULL; + entry_ptr->prev = NULL; + + entry_ptr->aux_next = NULL; + entry_ptr->aux_prev = NULL; + + entry_ptr->last_trans = 0; + entry_ptr->trans_next = NULL; + entry_ptr->trans_prev = NULL; + + H5C__RESET_CACHE_ENTRY_STATS(entry_ptr) + + if ( ( cache_ptr->flash_size_increase_possible ) && + ( entry_ptr->size > cache_ptr->flash_size_increase_threshold ) ) { + + result = H5C__flash_increase_cache_size(cache_ptr, 0, + entry_ptr->size); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTINS, FAIL, \ + "H5C__flash_increase_cache_size failed.") + } + } + + if ( ( cache_ptr->evictions_enabled ) && + ( (cache_ptr->index_size + entry_ptr->size) > + cache_ptr->max_cache_size ) ) { + + size_t space_needed; + + cache_ptr->cache_full = TRUE; + + if ( cache_ptr->check_write_permitted != NULL ) { + + result = (cache_ptr->check_write_permitted)(f, + dxpl_id, + &write_permitted); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTINS, FAIL, \ + "Can't get write_permitted") + } + } else { + + write_permitted = cache_ptr->write_permitted; + } + + HDassert( entry_ptr->size <= H5C_MAX_ENTRY_SIZE ); + + space_needed = entry_ptr->size; + + if ( space_needed > cache_ptr->max_cache_size ) { + + space_needed = cache_ptr->max_cache_size; + } + + /* Note that space_needed is just the amount of space that + * needed to insert the new entry without exceeding the cache + * size limit. The subsequent call to H5C_make_space_in_cache() + * may evict the entries required to free more or less space + * depending on conditions. It MAY be less if the cache is + * currently undersized, or more if the cache is oversized. + * + * The cache can exceed its maximum size limit via the following + * mechanisms: + * + * First, it is possible for the cache to grow without + * bound as long as entries are protected and not unprotected. + * + * Second, when writes are not permitted it is also possible + * for the cache to grow without bound. + * + * Finally, we usually don't check to see if the cache is + * oversized at the end of an unprotect. As a result, it is + * possible to have a vastly oversized cache with no protected + * entries as long as all the protects preceed the unprotects. + * + * Since items 1 and 2 are not changing any time soon, I see + * no point in worrying about the third. + */ + + result = H5C_make_space_in_cache(f, + dxpl_id, + cache_ptr, + space_needed, + write_permitted); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTINS, FAIL, \ + "H5C_make_space_in_cache failed.") + } + } + + /* verify that the new entry isn't already in the hash table -- scream + * and die if it is. + */ + + H5C__SEARCH_INDEX(cache_ptr, addr, test_entry_ptr, FAIL) + + if ( test_entry_ptr != NULL ) { + + if ( test_entry_ptr == entry_ptr ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTINS, FAIL, \ + "entry already in cache.") + + } else { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTINS, FAIL, \ + "duplicate entry in cache.") + } + } + + /* we don't initialize the protected field until here as it is + * possible that the entry is already in the cache, and already + * protected. If it is, we don't want to make things worse by + * marking it unprotected. + */ + + entry_ptr->is_protected = FALSE; + entry_ptr->is_read_only = FALSE; + entry_ptr->ro_ref_count = 0; + + entry_ptr->is_pinned = insert_pinned; + + H5C__INSERT_IN_INDEX(cache_ptr, entry_ptr, FAIL) + + /* New entries are presumed to be dirty, so this if statement is + * unnecessary. Rework it once the rest of the code changes are + * in and tested. -- JRM + */ + if ( entry_ptr->is_dirty ) { + + entry_ptr->flush_marker = set_flush_marker; + H5C__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, FAIL) + + } else { + + entry_ptr->flush_marker = FALSE; + } + + /* insert the entry in the transaction list if journaling is enabled */ + H5C__INSERT_ENTRY_IN_TL(cache_ptr, entry_ptr, FAIL); + + H5C__UPDATE_RP_FOR_INSERTION(cache_ptr, entry_ptr, FAIL) + +#if H5C_DO_EXTREME_SANITY_CHECKS + if ( H5C_validate_lru_list(cache_ptr) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "LRU sanity check failed.\n"); + } +#endif /* H5C_DO_EXTREME_SANITY_CHECKS */ + + H5C__UPDATE_STATS_FOR_INSERTION(cache_ptr, entry_ptr) + +done: + +#if H5C_DO_EXTREME_SANITY_CHECKS + if ( H5C_validate_lru_list(cache_ptr) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "LRU sanity check failed.\n"); + } +#endif /* H5C_DO_EXTREME_SANITY_CHECKS */ + +#if H5C_PRINT_EXIT_POINTS + if ( H5C_PRINT_ENTRY_POINT_TARGET_TYPE(type->id) ) { + HDfprintf(stdout, "%s: Exiting with result = %d.\n", + FUNC, (int)ret_value); + } +#endif /* H5C_PRINT_EXIT_POINTS */ + + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_insert_entry() */ + + +/*------------------------------------------------------------------------- + * + * Function: H5C_mark_entries_as_clean + * + * Purpose: When the H5C code is used to implement the metadata caches + * in PHDF5, only the cache with MPI_rank 0 is allowed to + * actually write entries to disk -- all other caches must + * retain dirty entries until they are advised that the + * entries are clean. + * + * This function exists to allow the H5C code to receive these + * notifications. + * + * The function receives a list of entry base addresses + * which must refer to dirty entries in the cache. If any + * of the entries are either clean or don't exist, the + * function flags an error. + * + * The function scans the list of entries and flushes all + * those that are currently unprotected with the + * H5C__FLUSH_CLEAR_ONLY_FLAG. Those that are currently + * protected are flagged for clearing when they are + * unprotected. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: John Mainzer + * 7/5/05 + * + * Modifications: + * + * Reworked function to flush entries in LRU order instead + * of increasing address order. The hope is that this will + * improve the hit rate on the slave caches. + * + * JRM - 10/13/05 + * + * Leave the old code in place for now (commented out) for + * benchmarking. + * + * JRM -- 4/13/06 + * Updated function to deal with pinned entries. + * + * JRM -- 7/11/07 + * Revised function for the new metadata cache API. The + * function lost its point to H5F_t (now supplied via + * *cache_ptr), and one of its dxpl ids. Also internal + * changes supporting the revised API. + * + * JRM -- 10/13/07 + * Didn't modify this function to detect the case in which + * the LRU is modified out from under it. It shouldn't be + * an issue here, as this function is only called in the + * parallel case, and serialize callbacks must not modify + * other entries in parallel case. If they do, they will + * cause inconsistancies in metadata across processes. + * + * Further, since this function only clears entries, and + * thus the serialize functions are never called, the + * situation will be even worse, as the changes will only + * exist on process 0. + * + * Bottom line -- the calls to H5C_flush_single_entry() + * in this function will not call serialize, thus no change + * in the LRU is possible. Even if they did, the serialize() + * callbacks are banned from making such changes in the + * parallel case. + * + *------------------------------------------------------------------------- + */ + +#ifdef H5_HAVE_PARALLEL +herr_t +H5C_mark_entries_as_clean(H5F_t * f, + hid_t dxpl_id, + int32_t ce_array_len, + haddr_t * ce_array_ptr) +{ + H5C_t * cache_ptr; + herr_t ret_value = SUCCEED; /* Return value */ + int entries_cleared; + int entries_examined; + int i; + int initial_list_len; + haddr_t addr; +#if H5C_DO_SANITY_CHECKS + int pinned_entries_marked = 0; + int protected_entries_marked = 0; + int other_entries_marked = 0; + haddr_t last_addr; +#endif /* H5C_DO_SANITY_CHECKS */ + H5C_cache_entry_t * clear_ptr = NULL; + H5C_cache_entry_t * entry_ptr = NULL; + + FUNC_ENTER_NOAPI(H5C_mark_entries_as_clean, FAIL) + + HDassert( f ); + HDassert( f->shared ); + cache_ptr = f->shared->cache; + HDassert( cache_ptr ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + + HDassert( ce_array_len > 0 ); + HDassert( ce_array_ptr != NULL ); + +#if H5C_DO_EXTREME_SANITY_CHECKS + if ( H5C_validate_lru_list(cache_ptr) < 0 ) { + + HDassert(0); + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "LRU sanity check failed.\n"); + } +#endif /* H5C_DO_EXTREME_SANITY_CHECKS */ + + for ( i = 0; i < ce_array_len; i++ ) + { + addr = ce_array_ptr[i]; + +#if H5C_DO_SANITY_CHECKS + if ( i == 0 ) { + + last_addr = addr; + + } else { + + if ( last_addr == addr ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "Duplicate entry in cleaned list.\n"); + + } else if ( last_addr > addr ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "cleaned list not sorted.\n"); + } + } + +#if H5C_DO_EXTREME_SANITY_CHECKS + if ( H5C_validate_lru_list(cache_ptr) < 0 ) { + + HDassert(0); + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "LRU sanity check failed.\n"); + } +#endif /* H5C_DO_EXTREME_SANITY_CHECKS */ +#endif /* H5C_DO_SANITY_CHECKS */ + + HDassert( H5F_addr_defined(addr) ); + + H5C__SEARCH_INDEX(cache_ptr, addr, entry_ptr, FAIL) + + if ( entry_ptr == NULL ) { +#if H5C_DO_SANITY_CHECKS + HDfprintf(stdout, + "H5C_mark_entries_as_clean: entry[%d] = %ld not in cache.\n", + (int)i, + (long)addr); +#endif /* H5C_DO_SANITY_CHECKS */ + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "Listed entry not in cache?!?!?.") + + } else if ( ! entry_ptr->is_dirty ) { + +#if H5C_DO_SANITY_CHECKS + HDfprintf(stdout, + "H5C_mark_entries_as_clean: entry %ld is not dirty!?!\n", + (long)addr); +#endif /* H5C_DO_SANITY_CHECKS */ + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "Listed entry not dirty?!?!?.") +#if 0 /* original code */ + } else if ( entry_ptr->is_protected ) { + + entry_ptr->clear_on_unprotect = TRUE; + + } else { + + if ( H5C_flush_single_entry(f, + dxpl_id, + cache_ptr, + entry_ptr->type, + addr, + H5C__FLUSH_CLEAR_ONLY_FLAG, + TRUE) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't clear entry.") + } + } +#else /* modified code */ + } else { + /* Mark the entry to be cleared on unprotect. We will + * scan the LRU list shortly, and clear all those entries + * not currently protected. + */ + entry_ptr->clear_on_unprotect = TRUE; +#if H5C_DO_SANITY_CHECKS + if ( entry_ptr->is_protected ) { + + protected_entries_marked++; + + } else if ( entry_ptr->is_pinned ) { + + pinned_entries_marked++; + + } else { + + other_entries_marked++; + } +#endif /* H5C_DO_SANITY_CHECKS */ + } +#endif /* end modified code */ + } +#if 1 /* modified code */ + /* Scan through the LRU list from back to front, and flush the + * entries whose clear_on_unprotect flags are set. Observe that + * any protected entries will not be on the LRU, and therefore + * will not be flushed at this time. + */ + + entries_cleared = 0; + entries_examined = 0; + initial_list_len = cache_ptr->LRU_list_len; + entry_ptr = cache_ptr->LRU_tail_ptr; + + while ( ( entry_ptr != NULL ) && + ( entries_examined <= initial_list_len ) && + ( entries_cleared < ce_array_len ) ) + { + if ( entry_ptr->clear_on_unprotect ) { + + entry_ptr->clear_on_unprotect = FALSE; + clear_ptr = entry_ptr; + entry_ptr = entry_ptr->prev; + entries_cleared++; + + if ( H5C_flush_single_entry(f, + dxpl_id, + cache_ptr, + clear_ptr->type, + clear_ptr->addr, + H5C__FLUSH_CLEAR_ONLY_FLAG, + TRUE) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't clear entry.") + } + } else { + + entry_ptr = entry_ptr->prev; + } + entries_examined++; + } + +#if H5C_DO_SANITY_CHECKS + HDassert( entries_cleared == other_entries_marked ); +#endif /* H5C_DO_SANITY_CHECKS */ + + /* It is also possible that some of the cleared entries are on the + * pinned list. Must scan that also. + */ + + entry_ptr = cache_ptr->pel_head_ptr; + + while ( entry_ptr != NULL ) + { + if ( entry_ptr->clear_on_unprotect ) { + + entry_ptr->clear_on_unprotect = FALSE; + clear_ptr = entry_ptr; + entry_ptr = entry_ptr->next; + entries_cleared++; + + if ( H5C_flush_single_entry(f, + dxpl_id, + cache_ptr, + clear_ptr->type, + clear_ptr->addr, + H5C__FLUSH_CLEAR_ONLY_FLAG, + TRUE) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't clear entry.") + } + } else { + + entry_ptr = entry_ptr->next; + } + } + +#if H5C_DO_SANITY_CHECKS + HDassert( entries_cleared == pinned_entries_marked + other_entries_marked ); + HDassert( entries_cleared + protected_entries_marked == ce_array_len ); +#endif /* H5C_DO_SANITY_CHECKS */ + + HDassert( ( entries_cleared == ce_array_len ) || + ( (ce_array_len - entries_cleared) <= cache_ptr->pl_len ) ); + +#if H5C_DO_SANITY_CHECKS + i = 0; + entry_ptr = cache_ptr->pl_head_ptr; + while ( entry_ptr != NULL ) + { + if ( entry_ptr->clear_on_unprotect ) { + + i++; + } + entry_ptr = entry_ptr->next; + } + HDassert( (entries_cleared + i) == ce_array_len ); +#endif /* H5C_DO_SANITY_CHECKS */ +#endif /* modified code */ + +done: + +#if H5C_DO_EXTREME_SANITY_CHECKS + if ( H5C_validate_lru_list(cache_ptr) < 0 ) { + + HDassert(0); + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "LRU sanity check failed.\n"); + } +#endif /* H5C_DO_EXTREME_SANITY_CHECKS */ + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_mark_entries_as_clean() */ +#endif /* H5_HAVE_PARALLEL */ + + +/*------------------------------------------------------------------------- + * Function: H5C_mark_pinned_entry_dirty + * + * Purpose: Mark a pinned entry as dirty. The target entry MUST be + * be pinned, and MUST be unprotected. + * + * If the entry has changed size, the function updates + * data structures for the size change. + * + * If the entry is not already dirty, the function places + * the entry on the skip list. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: John Mainzer + * 3/22/06 + * + *------------------------------------------------------------------------- + */ +herr_t +H5C_mark_pinned_entry_dirty(void *thing, hbool_t size_changed, size_t new_size) +{ + H5C_t * cache_ptr; + H5C_cache_entry_t * entry_ptr = (H5C_cache_entry_t *)thing; + size_t size_increase; + herr_t result; + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5C_mark_pinned_entry_dirty, FAIL) + + /* Sanity checks */ + HDassert(entry_ptr); + HDassert(H5F_addr_defined(entry_ptr->addr)); + cache_ptr = entry_ptr->cache_ptr; + HDassert(cache_ptr); + HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC); + HDassert((!cache_ptr->mdj_enabled) || cache_ptr->trans_in_progress); + +#if H5C_PRINT_ENTRY_POINTS + if(H5C_PRINT_ENTRY_POINT_TARGET_TYPE(entry_ptr->type->id)) + HDfprintf(stdout, + "%s: addr = 0x%lX, size_changed = %d, new_size = %d.\n", + FUNC, (unsigned long)(entry_ptr->addr), (int)size_changed, + (int)new_size); +#endif /* JRM */ + + /* Check for usage errors */ + if(!entry_ptr->is_pinned) + HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKDIRTY, FAIL, "Entry isn't pinned??") + if(entry_ptr->is_protected) + HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKDIRTY, FAIL, "Entry is protected??") + + /* mark the entry as dirty if it isn't already */ + entry_ptr->is_dirty = TRUE; + entry_ptr->image_up_to_date = FALSE; + + /* update for change in entry size if necessary */ + if ( ( size_changed ) && ( entry_ptr->size != new_size ) ) { + + /* Release the current image */ + if( entry_ptr->image_ptr ) + entry_ptr->image_ptr = H5MM_xfree(entry_ptr->image_ptr); + + /* do a flash cache size increase if appropriate */ + if ( cache_ptr->flash_size_increase_possible ) { + + if ( new_size > entry_ptr->size ) { + + size_increase = new_size - entry_ptr->size; + + if ( size_increase >= + cache_ptr->flash_size_increase_threshold ) { + if(H5C__flash_increase_cache_size(cache_ptr, entry_ptr->size, new_size) < 0) + HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "flash cache increase failed") + } + } + } + + /* update the pinned entry list */ + H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr->pel_len), \ + (cache_ptr->pel_size), \ + (entry_ptr->size), (new_size)); + + /* update the hash table */ + H5C__UPDATE_INDEX_FOR_SIZE_CHANGE((cache_ptr), (entry_ptr->size),\ + (new_size)); + + /* if the entry is in the skip list, update that too */ + if ( entry_ptr->in_slist ) { + + H5C__UPDATE_SLIST_FOR_SIZE_CHANGE((cache_ptr), (entry_ptr->size),\ + (new_size)); + } + + /* if journaling is enabled, and the entry is already in the + * transaction list, update that list for the size change as well. + */ + H5C__UPDATE_TL_FOR_ENTRY_SIZE_CHANGE((cache_ptr), (entry_ptr), \ + (entry_ptr->size), (new_size)); + + /* update statistics just before changing the entry size */ + H5C__UPDATE_STATS_FOR_ENTRY_SIZE_CHANGE((cache_ptr), (entry_ptr), \ + (new_size)); + + /* finally, update the entry size proper */ + entry_ptr->size = new_size; + } + + if ( ! (entry_ptr->in_slist) ) { + + H5C__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, FAIL) + } + + /* if journaling is enabled, check to see if the entry is in the + * transaction list. If it isn't, insert it. If it is, move it to + * the head of the list. + */ + H5C__UPDATE_TL_FOR_ENTRY_DIRTY(cache_ptr, entry_ptr, FAIL) + + H5C__UPDATE_STATS_FOR_DIRTY_PIN(cache_ptr, entry_ptr) + +done: +#if H5C_PRINT_EXIT_POINTS + if(H5C_PRINT_ENTRY_POINT_TARGET_TYPE(entry_ptr->type->id)) + HDfprintf(stdout, "%s: Exiting with result = %d.\n", FUNC, (int)ret_value); +#endif /* H5C_PRINT_EXIT_POINTS */ + + FUNC_LEAVE_NOAPI(ret_value) +} /* H5C_mark_pinned_entry_dirty() */ + + +/*------------------------------------------------------------------------- + * Function: H5C_mark_pinned_or_protected_entry_dirty + * + * Purpose: Mark a pinned or protected entry as dirty. The target entry + * MUST be either pinned or protected, and MAY be both. + * + * At present, this funtion does not support size change. + * + * In the protected case, this call is the functional + * equivalent of setting the H5C__DIRTIED_FLAG on an unprotect + * call. + * + * In the pinned but not protected case, if the entry is not + * already dirty, the function places function marks the entry + * dirty and places it on the skip list. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: John Mainzer + * 5/15/06 + * + *------------------------------------------------------------------------- + */ +herr_t +H5C_mark_pinned_or_protected_entry_dirty(void *thing) +{ + H5C_t * cache_ptr; + H5C_cache_entry_t * entry_ptr = (H5C_cache_entry_t *)thing; + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5C_mark_pinned_or_protected_entry_dirty, FAIL) + + /* Sanity checks */ + HDassert(entry_ptr); + HDassert(H5F_addr_defined(entry_ptr->addr)); + cache_ptr = entry_ptr->cache_ptr; + HDassert(cache_ptr); + HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC); + +#if H5C_PRINT_ENTRY_POINTS + if(H5C_PRINT_ENTRY_POINT_TARGET_TYPE(entry_ptr->type->id)) + HDfprintf(stdout, "%s: addr = 0x%lX, type = %s.\n", FUNC, + (unsigned long)(entry_ptr->addr), entry_ptr->type->name); +#endif /* JRM */ + + if ( entry_ptr->is_protected ) { + + HDassert( ! ((entry_ptr)->is_read_only) ); + + /* set the dirtied flag */ + entry_ptr->dirtied = TRUE; + + /* don't do anything with the transaction list now, as the + * entry will be added to the transaction list when it is + * unprotected. + */ + + } else if ( entry_ptr->is_pinned ) { + + /* mark the entry as dirty if it isn't already */ + entry_ptr->is_dirty = TRUE; + entry_ptr->image_up_to_date = FALSE; + + /* If journaling is enabled, must add the entry to the transaction + * list, if it is not there already. + */ + H5C__UPDATE_TL_FOR_ENTRY_DIRTY(cache_ptr, entry_ptr, FAIL); + + if ( ! (entry_ptr->in_slist) ) { + + H5C__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, FAIL) + } + + H5C__UPDATE_STATS_FOR_DIRTY_PIN(cache_ptr, entry_ptr) + + } else { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKDIRTY, FAIL, \ + "Entry is neither pinned nor protected??") + } + +done: +#if H5C_PRINT_EXIT_POINTS + if(H5C_PRINT_ENTRY_POINT_TARGET_TYPE(entry_ptr->type->id)) + HDfprintf(stdout, "%s: Exiting with result = %d.\n", FUNC, (int)ret_value); +#endif /* H5C_PRINT_EXIT_POINTS */ + + FUNC_LEAVE_NOAPI(ret_value) +} /* H5C_mark_pinned_or_protected_entry_dirty() */ + + +/*------------------------------------------------------------------------- + * + * Function: H5C_rename_entry + * + * Purpose: Use this function to notify the cache that an entry's + * file address changed. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: John Mainzer + * 6/2/04 + * + * Modifications: + * + * JRM -- 7/21/04 + * Updated function for the addition of the hash table. + * + * JRM -- 6/6/05 + * Updated function to force all renamed entries to be + * dirty. This is part of a series of code modifications + * moving management of the is_dirty field of + * H5C_cache_entry_t into the H5C code. + * + * JRM -- 4/3/06 + * Updated function to disallow renaming of pinned entries. + * + * JRM -- 4/27/06 + * Updated function to support renaming of pinned entries. + * + * JRM -- 8/24/06 + * Updated function to refrain from altering the index, the + * replacement policy data structures, and skip list when + * the function is called within the flush callback for the + * target entry and the target entry is being destroyed. + * + * Note that in this case H5C_flush_single_entry() will handle + * all these details for us. + * + * JRM -- 10/13/07 + * Renames of the target entry in a serialize callback are + * now handled by H5C_flush_single_entry() -- hence the above + * modification is now obsolete. + * + * JRM -- 3/31/08 + * Updated function to check if journaling is enabled. If + * it is, the function now inserts the renamed entry in the + * transaction list (if it wasn't there already). + * + * Also added sanity checks that will scream and die if + * we attempt to rename an entry during either a destroy + * or flush if journaling is enabled. Recall that any + * rename should have already been triggered when the + * entry was serialized to construct its journal entry. + * + *------------------------------------------------------------------------- + */ + +herr_t +H5C_rename_entry(H5C_t * cache_ptr, + const H5C_class_t * type, + haddr_t old_addr, + haddr_t new_addr) +{ + herr_t ret_value = SUCCEED; /* Return value */ + hbool_t was_dirty; + hbool_t had_jwip; + H5C_cache_entry_t * entry_ptr = NULL; + H5C_cache_entry_t * test_entry_ptr = NULL; +#if H5C_DO_SANITY_CHECKS + hbool_t removed_entry_from_slist = FALSE; +#endif /* H5C_DO_SANITY_CHECKS */ + + FUNC_ENTER_NOAPI(H5C_rename_entry, FAIL) + +#if H5C_PRINT_ENTRY_POINTS + if ( H5C_PRINT_ENTRY_POINT_TARGET_TYPE(type->id) ) + { + HDfprintf(stdout, "%s: type = %s, old_addr = 0x%lX, new_addr = 0x%lx.\n", + FUNC, type->name, (unsigned long)old_addr, + (unsigned long)new_addr); + } +#endif /* JRM */ + + HDassert( cache_ptr ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + HDassert( type ); + HDassert( H5F_addr_defined(old_addr) ); + HDassert( H5F_addr_defined(new_addr) ); + HDassert( H5F_addr_ne(old_addr, new_addr) ); + +#if H5C_DO_EXTREME_SANITY_CHECKS + if ( H5C_validate_lru_list(cache_ptr) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "LRU sanity check failed.\n"); + } +#endif /* H5C_DO_EXTREME_SANITY_CHECKS */ + + H5C__SEARCH_INDEX(cache_ptr, old_addr, entry_ptr, FAIL) + + if ( ( entry_ptr == NULL ) || ( entry_ptr->type != type ) ) { + + /* the old item doesn't exist in the cache, so we are done. */ + HGOTO_DONE(SUCCEED) + } + + HDassert( entry_ptr->addr == old_addr ); + HDassert( entry_ptr->type == type ); + + if ( entry_ptr->is_protected ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTRENAME, FAIL, \ + "Target entry is protected.") + } + + if ( ( entry_ptr->destroy_in_progress ) && + ( cache_ptr->mdj_enabled ) ) + { + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "rename on destroy when journaling is enabled.\n"); + } + + if ( ( entry_ptr->flush_in_progress ) && + ( cache_ptr->mdj_enabled ) ) + { + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "rename on flush when journaling is enabled.\n"); + } + + H5C__SEARCH_INDEX(cache_ptr, new_addr, test_entry_ptr, FAIL) + + if ( test_entry_ptr != NULL ) { /* we are hosed */ + + if ( test_entry_ptr->type == type ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTRENAME, FAIL, \ + "Target already renamed & reinserted???.") + + } else { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTRENAME, FAIL, \ + "New address already in use?.") + + } + } + + /* If we get this far we have work to do. Remove *entry_ptr from + * the hash table (and skip list if necessary), change its address to the + * new address, mark it as dirty (if it isn't already) and then re-insert. + * + * Update the replacement policy for a hit to avoid an eviction before + * the renamed entry is touched. Update stats for a rename. + * + * Note that we do not check the size of the cache, or evict anything. + * Since this is a simple re-name, cache size should be unaffected. + * + * Check to see if the target entry is in the process of being destroyed + * before we delete from the index, etc. If it is, all we do is + * change the addr. If the entry is only in the process of being flushed, + * don't mark it as dirty either, lest we confuse the flush call back. + */ + + if ( ! ( entry_ptr->destroy_in_progress ) ) { + + H5C__DELETE_FROM_INDEX(cache_ptr, entry_ptr) + + if ( entry_ptr->in_slist ) { + + HDassert( cache_ptr->slist_ptr ); + + H5C__REMOVE_ENTRY_FROM_SLIST(cache_ptr, entry_ptr) + +#if H5C_DO_SANITY_CHECKS + + removed_entry_from_slist = TRUE; + +#endif /* H5C_DO_SANITY_CHECKS */ + } + } + + entry_ptr->addr = new_addr; + + if ( ! ( entry_ptr->destroy_in_progress ) ) { + + was_dirty = entry_ptr->is_dirty; + + if ( ! ( entry_ptr->flush_in_progress ) ) { + + entry_ptr->is_dirty = TRUE; + /* This shouldn't be needed, but it keeps the test code happy */ + entry_ptr->image_up_to_date = FALSE; + } + + H5C__INSERT_IN_INDEX(cache_ptr, entry_ptr, FAIL) + + if ( ! ( entry_ptr->flush_in_progress ) ) { + + H5C__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, FAIL) + +#if H5C_DO_SANITY_CHECKS + + if ( removed_entry_from_slist ) { + + /* we just removed the entry from the slist. Thus we + * must touch up cache_ptr->slist_len_increase and + * cache_ptr->slist_size_increase to keep from skewing + * the sanity checks. + */ + HDassert( cache_ptr->slist_len_increase > 1 ); + HDassert( cache_ptr->slist_size_increase > entry_ptr->size ); + + cache_ptr->slist_len_increase -= 1; + cache_ptr->slist_size_increase -= entry_ptr->size; + } + +#endif /* H5C_DO_SANITY_CHECKS */ + + /* make note of whether the target entry had a journal write + * in progress -- will need this fact to update the replacement + * policy structures for the rename. + */ + had_jwip = ( entry_ptr->last_trans != 0 ); + + /* If journaling is enabled, add the entry to the transaction + * list, if it isn't there already. + */ + H5C__UPDATE_TL_FOR_ENTRY_DIRTY(cache_ptr, entry_ptr, FAIL); + + H5C__UPDATE_RP_FOR_RENAME(cache_ptr, entry_ptr, was_dirty, \ + had_jwip, FAIL); + } + } + + H5C__UPDATE_STATS_FOR_RENAME(cache_ptr, entry_ptr) + +done: + +#if H5C_DO_EXTREME_SANITY_CHECKS + if ( H5C_validate_lru_list(cache_ptr) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "LRU sanity check failed.\n"); + } +#endif /* H5C_DO_EXTREME_SANITY_CHECKS */ + +#if H5C_PRINT_EXIT_POINTS + if ( H5C_PRINT_ENTRY_POINT_TARGET_TYPE(type->id) ) { + HDfprintf(stdout, "%s: Exiting with result = %d.\n", + FUNC, (int)ret_value); + } +#endif /* H5C_PRINT_EXIT_POINTS */ + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_rename_entry() */ + + +/*------------------------------------------------------------------------- + * Function: H5C_resize_pinned_entry + * + * Purpose: Resize a pinned entry. The target entry MUST be + * be pinned, and MUST not be unprotected. + * + * Resizing an entry dirties it, so if the entry is not + * already dirty, the function places the entry on the + * skip list. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: John Mainzer + * 7/5/06 + * + *------------------------------------------------------------------------- + */ +herr_t +H5C_resize_pinned_entry(void *thing, size_t new_size) +{ + H5C_t * cache_ptr; + H5C_cache_entry_t * entry_ptr = (H5C_cache_entry_t *)thing; + size_t size_increase; + herr_t result; + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5C_resize_pinned_entry, FAIL) + + /* Sanity checks */ + HDassert(entry_ptr); + HDassert(H5F_addr_defined(entry_ptr->addr)); + cache_ptr = entry_ptr->cache_ptr; + HDassert(cache_ptr); + HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC); + +#if H5C_PRINT_ENTRY_POINTS + if(H5C_PRINT_ENTRY_POINT_TARGET_TYPE(entry_ptr->type->id)) + HDfprintf(stdout, "%s: type = %s, addr = 0x%lX, new_size = %d.\n", + FUNC, entry_ptr->type->name, (unsigned long)(entry_ptr->addr), + (int)new_size); +#endif /* JRM */ + + /* Check for usage errors */ + if(new_size <= 0) + HGOTO_ERROR(H5E_CACHE, H5E_CANTRESIZE, FAIL, "New size is non-positive.") + if(!entry_ptr->is_pinned) + HGOTO_ERROR(H5E_CACHE, H5E_CANTRESIZE, FAIL, "Entry isn't pinned??") + if(entry_ptr->is_protected) + HGOTO_ERROR(H5E_CACHE, H5E_CANTRESIZE, FAIL, "Entry is protected??") + + /* resizing dirties entries -- mark the entry as dirty if it + * isn't already + */ + entry_ptr->is_dirty = TRUE; + entry_ptr->image_up_to_date = FALSE; + + /* update for change in entry size if necessary */ + if ( entry_ptr->size != new_size ) { + + /* Release the current image */ + if( entry_ptr->image_ptr ) + entry_ptr->image_ptr = H5MM_xfree(entry_ptr->image_ptr); + + /* do a flash cache size increase if appropriate */ + if ( cache_ptr->flash_size_increase_possible ) { + + if ( new_size > entry_ptr->size ) { + + size_increase = new_size - entry_ptr->size; + + if ( size_increase >= + cache_ptr->flash_size_increase_threshold ) { + + result = H5C__flash_increase_cache_size(cache_ptr, + entry_ptr->size, + new_size); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \ + "H5C__flash_increase_cache_size failed.") + } + } + } + } + + /* update the protected entry list */ + H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr->pel_len), \ + (cache_ptr->pel_size), \ + (entry_ptr->size), (new_size)); + + /* update the hash table */ + H5C__UPDATE_INDEX_FOR_SIZE_CHANGE((cache_ptr), (entry_ptr->size),\ + (new_size)); + + /* if the entry is in the skip list, update that too */ + if ( entry_ptr->in_slist ) { + + H5C__UPDATE_SLIST_FOR_SIZE_CHANGE((cache_ptr), (entry_ptr->size),\ + (new_size)); + } + + /* if journaling is enabled, and the entry is already in the + * transaction list, update that list for the size change as well. + */ + H5C__UPDATE_TL_FOR_ENTRY_SIZE_CHANGE((cache_ptr), (entry_ptr), \ + (entry_ptr->size), (new_size)); + + + /* update statistics just before changing the entry size */ + H5C__UPDATE_STATS_FOR_ENTRY_SIZE_CHANGE((cache_ptr), (entry_ptr), \ + (new_size)); + + /* finally, update the entry size proper */ + entry_ptr->size = new_size; + } + + if ( ! (entry_ptr->in_slist) ) { + + H5C__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, FAIL) + } + + /* if journaling is enabled, check to see if the entry is in the + * transaction list. If it isn't, insert it. If it is, move it to + * the head of the list. + */ + H5C__UPDATE_TL_FOR_ENTRY_DIRTY(cache_ptr, entry_ptr, FAIL) + + H5C__UPDATE_STATS_FOR_DIRTY_PIN(cache_ptr, entry_ptr) + +done: +#if H5C_PRINT_EXIT_POINTS + if(H5C_PRINT_ENTRY_POINT_TARGET_TYPE(entry_ptr->type->id)) + HDfprintf(stdout, "%s: Exiting with result = %d.\n", FUNC, (int)ret_value); +#endif /* H5C_PRINT_EXIT_POINTS */ + + FUNC_LEAVE_NOAPI(ret_value) +} /* H5C_resize_pinned_entry() */ + + +/*------------------------------------------------------------------------- + * Function: H5C_pin_protected_entry() + * + * Purpose: Pin a protected cache entry. The entry must be protected + * at the time of call, and must be unpinned. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: John Mainzer + * 4/26/06 + * + *------------------------------------------------------------------------- + */ +herr_t +H5C_pin_protected_entry(void *thing) +{ + H5C_t * cache_ptr; + H5C_cache_entry_t * entry_ptr = (H5C_cache_entry_t *)thing; + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5C_pin_protected_entry, FAIL) + +#if H5C_PRINT_ENTRY_POINTS + if(H5C_PRINT_ENTRY_POINT_TARGET_TYPE(entry_ptr->type->id)) + HDfprintf(stdout, "%s: addr = 0x%lX, type = %s.\n", FUNC, + (unsigned long)(entry_ptr->addr), entry_ptr->type->name); +#endif /* JRM */ + + /* Sanity checks */ + HDassert(entry_ptr); + HDassert(H5F_addr_defined(entry_ptr->addr)); + cache_ptr = entry_ptr->cache_ptr; + HDassert(cache_ptr); + HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC); + + /* Check for usage errors */ + if(!entry_ptr->is_protected) + HGOTO_ERROR(H5E_CACHE, H5E_CANTPIN, FAIL, "Entry isn't protected") + if(entry_ptr->is_pinned) + HGOTO_ERROR(H5E_CACHE, H5E_CANTPIN, FAIL, "Entry is already pinned") + + /* Pin entry */ + entry_ptr->is_pinned = TRUE; + + /* Update statistics for entry */ + H5C__UPDATE_STATS_FOR_PIN(cache_ptr, entry_ptr) + +done: +#if H5C_PRINT_EXIT_POINTS + if(H5C_PRINT_ENTRY_POINT_TARGET_TYPE(entry_ptr->type->id)) + HDfprintf(stdout, "%s: Exiting with result = %d.\n", FUNC, (int)ret_value); +#endif /* H5C_PRINT_EXIT_POINTS */ + + FUNC_LEAVE_NOAPI(ret_value) +} /* H5C_pin_protected_entry() */ + + +/*------------------------------------------------------------------------- + * Function: H5C_protect + * + * Purpose: If the target entry is not in the cache, load it. If + * necessary, attempt to evict one or more entries to keep + * the cache within its maximum size. + * + * Mark the target entry as protected, and return its address + * to the caller. The caller must call H5C_unprotect() when + * finished with the entry. + * + * While it is protected, the entry may not be either evicted + * or flushed -- nor may it be accessed by another call to + * H5C_protect. Any attempt to do so will result in a failure. + * + * The primary_dxpl_id and secondary_dxpl_id parameters + * specify the dxpl_ids used on the first write occasioned + * by the insertion (primary_dxpl_id), and on all subsequent + * writes (secondary_dxpl_id). This is useful in the + * metadata cache, but may not be needed elsewhere. If so, + * just use the same dxpl_id for both parameters. + * + * All reads are performed with the primary_dxpl_id. + * + * Similarly, the primary_dxpl_id is passed to the + * check_write_permitted function if it is called. + * + * Return: Success: Ptr to the desired entry + * + * Failure: NULL + * + * Programmer: John Mainzer - 6/2/04 + * + * Modifications: + * + * JRM -- 7/21/04 + * Updated for the addition of the hash table. + * + * JRM -- 10/28/04 + * Added code to set cache_full to TRUE whenever we try to + * make space in the cache. + * + * JRM -- 11/12/04 + * Added code to call to H5C_make_space_in_cache() + * after the call to H5C__auto_adjust_cache_size() if that + * function sets the size_decreased flag is TRUE. + * + * JRM -- 4/25/05 + * The size_decreased flag can also be set to TRUE in + * H5C_set_cache_auto_resize_config() if a new configuration + * forces an immediate reduction in cache size. Modified + * the code to deal with this eventuallity. + * + * JRM -- 6/24/05 + * Added support for the new write_permitted field of H5C_t. + * + * JRM -- 10/22/05 + * Hand optimizations. + * + * JRM -- 5/3/06 + * Added code to set the new dirtied field in + * H5C_cache_entry_t to FALSE prior to return. + * + * JRM -- 6/23/06 + * Modified code to allow dirty entries to be loaded from + * disk. This is necessary as a bug fix in the object + * header code requires us to modify a header as it is read. + * + * JRM -- 3/28/07 + * Added the flags parameter and supporting code. At least + * for now, this parameter is used to allow the entry to + * be protected read only, thus allowing multiple protects. + * + * Also added code to allow multiple read only protects + * of cache entries. + * + * JRM -- 7/27/07 + * Added code supporting the new evictions_enabled field + * in H5C_t. + * + * JRM -- 7/11/07 + * Revised function for the new metadata cache API. The + * function lost its point to H5F_t (now supplied via + * *cache_ptr), one of its dxpl ids. and one of the udata + * fields. Gained the len parameter. Also internal + * changes supporting the revised API. + * + * JRM -- 1/3/08 + * Added to do a flash cache size increase if appropriate + * when a large entry is loaded. + * + * JRM 3/31/08 + * Updated function to insert the newly protected entry in + * the transaction list if journaling is enabled and the + * entry was dirtied on load. + * + *------------------------------------------------------------------------- + */ + +void * +H5C_protect(H5F_t * f, + hid_t dxpl_id, + const H5C_class_t * type, + haddr_t addr, + size_t len, + void * udata, + unsigned flags) +{ + H5C_t * cache_ptr; + hbool_t hit; + hbool_t first_flush; + hbool_t have_write_permitted = FALSE; + hbool_t read_only = FALSE; + hbool_t write_permitted; + herr_t result; + void * thing; + H5C_cache_entry_t * entry_ptr; + void * ret_value; /* Return value */ + + FUNC_ENTER_NOAPI(H5C_protect, NULL) + +#if H5C_PRINT_ENTRY_POINTS + if ( H5C_PRINT_ENTRY_POINT_TARGET_TYPE(type->id) ) + { + HDfprintf(stdout, + "%s: addr = 0x%lX, len = %d, type = %s, flags = 0x%x.\n", + FUNC, (unsigned long)addr, (int)len, type->name, flags); + } +#endif /* JRM */ + + /* check args */ + HDassert( f ); + HDassert( f->shared ); + + cache_ptr = f->shared->cache; + + HDassert( cache_ptr ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + HDassert( cache_ptr->skip_file_checks || f ); + HDassert( type ); + HDassert( H5F_addr_defined(addr) ); + HDassert( len > 0 ); + +#if H5C_DO_EXTREME_SANITY_CHECKS + if ( H5C_validate_lru_list(cache_ptr) < 0 ) { + + HDassert(0); + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, NULL, \ + "LRU sanity check failed.\n"); + } +#endif /* H5C_DO_EXTREME_SANITY_CHECKS */ + + if ( (flags & H5C__READ_ONLY_FLAG) != 0 ) + { + read_only = TRUE; + } + + /* first check to see if the target is in cache */ + H5C__SEARCH_INDEX(cache_ptr, addr, entry_ptr, NULL) + + if ( entry_ptr != NULL ) { + + hit = TRUE; + thing = (void *)entry_ptr; + + } else { + + /* must try to load the entry from disk. */ + + hit = FALSE; + + thing = H5C_load_entry(f, dxpl_id, type, addr, len, udata); + + if ( thing == NULL ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTLOAD, NULL, "can't load entry") + } + + entry_ptr = (H5C_cache_entry_t *)thing; + + /* If the entry is very large, and we are configured to allow it, + * we may wish to perform a flash cache size increase. + */ + if ( ( cache_ptr->flash_size_increase_possible ) && + ( entry_ptr->size > cache_ptr->flash_size_increase_threshold ) ) { + + result = H5C__flash_increase_cache_size(cache_ptr, 0, + entry_ptr->size); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, \ + "H5C__flash_increase_cache_size failed.") + } + } + + /* try to free up some space if necessary and if + * evictions are permitted + */ + if ( ( cache_ptr->evictions_enabled ) && + ( (cache_ptr->index_size + entry_ptr->size) > + cache_ptr->max_cache_size ) ) { + + size_t space_needed; + + cache_ptr->cache_full = TRUE; + + if ( cache_ptr->check_write_permitted != NULL ) { + + result = (cache_ptr->check_write_permitted)(f, + dxpl_id, + &write_permitted); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, \ + "Can't get write_permitted 1") + + } else { + + have_write_permitted = TRUE; + + first_flush = TRUE; + } + } else { + + write_permitted = cache_ptr->write_permitted; + + have_write_permitted = TRUE; + + first_flush = TRUE; + } + + HDassert( entry_ptr->size <= H5C_MAX_ENTRY_SIZE ); + + space_needed = entry_ptr->size; + + if ( space_needed > cache_ptr->max_cache_size ) { + + space_needed = cache_ptr->max_cache_size; + } + + /* Note that space_needed is just the amount of space that + * needed to insert the new entry without exceeding the cache + * size limit. The subsequent call to H5C_make_space_in_cache() + * may evict the entries required to free more or less space + * depending on conditions. It MAY be less if the cache is + * currently undersized, or more if the cache is oversized. + * + * The cache can exceed its maximum size limit via the following + * mechanisms: + * + * First, it is possible for the cache to grow without + * bound as long as entries are protected and not unprotected. + * + * Second, when writes are not permitted it is also possible + * for the cache to grow without bound. + * + * Third, the user may choose to disable evictions -- causing + * the cache to grow without bound until evictions are + * re-enabled. + * + * Finally, we usually don't check to see if the cache is + * oversized at the end of an unprotect. As a result, it is + * possible to have a vastly oversized cache with no protected + * entries as long as all the protects preceed the unprotects. + * + * Since items 1, 2, and 3 are not changing any time soon, I + * see no point in worrying about the fourth. + */ + + result = H5C_make_space_in_cache(f, dxpl_id, cache_ptr, + space_needed, write_permitted); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, \ + "H5C_make_space_in_cache failed 1.") + } + } + + /* Insert the entry in the hash table. It can't be dirty yet, so + * we don't even check to see if it should go in the skip list. + * + * This is no longer true -- due to a bug fix, we may modify + * data on load to repair a file. + */ + H5C__INSERT_IN_INDEX(cache_ptr, entry_ptr, NULL) + + if ( ( entry_ptr->is_dirty ) && ( ! (entry_ptr->in_slist) ) ) { + + H5C__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, NULL) + } + + /* under rare (we hope) circumstances, the load routine will + * modify an entry as it loads it to repair corruption from + * a previous version of the library. If this happens, we must + * place the entry on the transaction list. + */ + if ( entry_ptr->is_dirty ) { + + H5C__INSERT_ENTRY_IN_TL(cache_ptr, entry_ptr, NULL); + } + + /* load the entry into the data structures used by the replacement + * policy. We are just going to take it out again when we update + * the replacement policy for a protect, but this simplifies the + * code. If we do this often enough, we may want to optimize this. + * + * Note that we used to do an update for insertion here, but + * that confused the journaling code -- the update for load is + * just a simplified version of update for insertion that + * avoids the problem. + */ + + H5C__UPDATE_RP_FOR_LOAD(cache_ptr, entry_ptr, NULL) + } + + HDassert( entry_ptr->addr == addr ); + HDassert( entry_ptr->type == type ); + + if ( entry_ptr->is_protected ) { + + if ( ( read_only ) && ( entry_ptr->is_read_only ) ) { + + HDassert( entry_ptr->ro_ref_count > 0 ); + + (entry_ptr->ro_ref_count)++; + + } else { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, \ + "Target already protected & not read only?!?.") + } + } else { + + H5C__UPDATE_RP_FOR_PROTECT(cache_ptr, entry_ptr, NULL) + + entry_ptr->is_protected = TRUE; + + if ( read_only ) { + + entry_ptr->is_read_only = TRUE; + entry_ptr->ro_ref_count = 1; + } + + entry_ptr->dirtied = FALSE; + } + + H5C__UPDATE_CACHE_HIT_RATE_STATS(cache_ptr, hit) + + H5C__UPDATE_STATS_FOR_PROTECT(cache_ptr, entry_ptr, hit) + + ret_value = thing; + + if ( ( cache_ptr->evictions_enabled ) && + ( ( cache_ptr->size_decreased ) || + ( ( cache_ptr->resize_enabled ) && + ( cache_ptr->cache_accesses >= + (cache_ptr->resize_ctl).epoch_length ) ) ) ) { + + if ( ! have_write_permitted ) { + + if ( cache_ptr->check_write_permitted != NULL ) { + + result = (cache_ptr->check_write_permitted)(f, + dxpl_id, + &write_permitted); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, \ + "Can't get write_permitted 2") + + } else { + + have_write_permitted = TRUE; + + first_flush = TRUE; + } + } else { + + write_permitted = cache_ptr->write_permitted; + + have_write_permitted = TRUE; + + first_flush = TRUE; + } + } + + if ( ( cache_ptr->resize_enabled ) && + ( cache_ptr->cache_accesses >= + (cache_ptr->resize_ctl).epoch_length ) ) { + + result = H5C__auto_adjust_cache_size(f, + dxpl_id, + cache_ptr, + write_permitted); + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, \ + "Cache auto-resize failed.") + } + } + + if ( cache_ptr->size_decreased ) { + + cache_ptr->size_decreased = FALSE; + + /* check to see if the cache is now oversized due to the cache + * size reduction. If it is, try to evict enough entries to + * bring the cache size down to the current maximum cache size. + */ + if ( cache_ptr->index_size > cache_ptr->max_cache_size ) { + + cache_ptr->cache_full = TRUE; + + result = H5C_make_space_in_cache(f, + dxpl_id, + cache_ptr, + (size_t)0, + write_permitted); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, \ + "H5C_make_space_in_cache failed 2.") + } + } + } + } + +done: + +#if H5C_DO_EXTREME_SANITY_CHECKS + if ( H5C_validate_lru_list(cache_ptr) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, NULL, \ + "LRU sanity check failed.\n"); + } +#endif /* H5C_DO_EXTREME_SANITY_CHECKS */ + +#if H5C_PRINT_EXIT_POINTS + if ( H5C_PRINT_ENTRY_POINT_TARGET_TYPE(type->id) ) { + HDfprintf(stdout, "%s: Exiting with result = 0x%lX.\n", + FUNC, (unsigned long)ret_value); + } +#endif /* H5C_PRINT_EXIT_POINTS */ + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_protect() */ + + +/*------------------------------------------------------------------------- + * + * Function: H5C_reset_cache_hit_rate_stats() + * + * Purpose: Reset the cache hit rate computation fields. + * + * Return: SUCCEED on success, and FAIL on failure. + * + * Programmer: John Mainzer, 10/5/04 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +herr_t +H5C_reset_cache_hit_rate_stats(H5C_t * cache_ptr) +{ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5C_reset_cache_hit_rate_stats, FAIL) + + if ( ( cache_ptr == NULL ) || ( cache_ptr->magic != H5C__H5C_T_MAGIC ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr on entry.") + } + + cache_ptr->cache_hits = 0; + cache_ptr->cache_accesses = 0; + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_reset_cache_hit_rate_stats() */ + + +/*------------------------------------------------------------------------- + * Function: H5C_set_cache_auto_resize_config + * + * Purpose: Set the cache automatic resize configuration to the + * provided values if they are in range, and fail if they + * are not. + * + * If the new configuration enables automatic cache resizing, + * coerce the cache max size and min clean size into agreement + * with the new policy and re-set the full cache hit rate + * stats. + * + * Return: SUCCEED on success, and FAIL on failure. + * + * Programmer: John Mainzer + * 10/8/04 + * + * Modifications: + * + * JRM -- 11/18/04 + * Reworked function to match major changes in + * H5C_auto_size_ctl_t. + * + * JRM -- 4/25/05 + * Added code to set cache_ptr->size_decreased to TRUE + * if the new configuration forces an immediate reduction + * in cache size. + * + * JRM -- 12/31/07 + * Added code supporting the new flash cache size increase + * code. + * + *------------------------------------------------------------------------- + */ + +herr_t +H5C_set_cache_auto_resize_config(H5C_t * cache_ptr, + H5C_auto_size_ctl_t *config_ptr) +{ + herr_t result; + size_t new_max_cache_size; + size_t new_min_clean_size; + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5C_set_cache_auto_resize_config, FAIL) + + if ( ( cache_ptr == NULL ) || ( cache_ptr->magic != H5C__H5C_T_MAGIC ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr on entry.") + } + + if ( config_ptr == NULL ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "NULL config_ptr on entry.") + } + + if ( config_ptr->version != H5C__CURR_AUTO_SIZE_CTL_VER ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Unknown config version.") + } + + /* check general configuration section of the config: */ + if ( SUCCEED != H5C_validate_resize_config(config_ptr, + H5C_RESIZE_CFG__VALIDATE_GENERAL) ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, \ + "error in general configuration fields of new config.") + } + + /* check size increase control fields of the config: */ + if ( SUCCEED != H5C_validate_resize_config(config_ptr, + H5C_RESIZE_CFG__VALIDATE_INCREMENT) ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, \ + "error in the size increase control fields of new config.") + } + + /* check size decrease control fields of the config: */ + if ( SUCCEED != H5C_validate_resize_config(config_ptr, + H5C_RESIZE_CFG__VALIDATE_DECREMENT) ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, \ + "error in the size decrease control fields of new config.") + } + + /* check for conflicts between size increase and size decrease controls: */ + if ( SUCCEED != H5C_validate_resize_config(config_ptr, + H5C_RESIZE_CFG__VALIDATE_INTERACTIONS) ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, \ + "conflicting threshold fields in new config.") + } + + /* will set the increase possible fields to FALSE later if needed */ + cache_ptr->size_increase_possible = TRUE; + cache_ptr->flash_size_increase_possible = TRUE; + cache_ptr->size_decrease_possible = TRUE; + + switch ( config_ptr->incr_mode ) + { + case H5C_incr__off: + cache_ptr->size_increase_possible = FALSE; + break; + + case H5C_incr__threshold: + if ( ( config_ptr->lower_hr_threshold <= 0.0 ) || + ( config_ptr->increment <= 1.0 ) || + ( ( config_ptr->apply_max_increment ) && + ( config_ptr->max_increment <= 0 ) ) ) { + + cache_ptr->size_increase_possible = FALSE; + } + break; + + default: /* should be unreachable */ + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Unknown incr_mode?!?!?.") + } + + /* logically, this is were configuration for flash cache size increases + * should go. However, this configuration depends on max_cache_size, so + * we wait until the end of the function, when this field is set. + */ + + switch ( config_ptr->decr_mode ) + { + case H5C_decr__off: + cache_ptr->size_decrease_possible = FALSE; + break; + + case H5C_decr__threshold: + if ( ( config_ptr->upper_hr_threshold >= 1.0 ) || + ( config_ptr->decrement >= 1.0 ) || + ( ( config_ptr->apply_max_decrement ) && + ( config_ptr->max_decrement <= 0 ) ) ) { + + cache_ptr->size_decrease_possible = FALSE; + } + break; + + case H5C_decr__age_out: + if ( ( ( config_ptr->apply_empty_reserve ) && + ( config_ptr->empty_reserve >= 1.0 ) ) || + ( ( config_ptr->apply_max_decrement ) && + ( config_ptr->max_decrement <= 0 ) ) ) { + + cache_ptr->size_decrease_possible = FALSE; + } + break; + + case H5C_decr__age_out_with_threshold: + if ( ( ( config_ptr->apply_empty_reserve ) && + ( config_ptr->empty_reserve >= 1.0 ) ) || + ( ( config_ptr->apply_max_decrement ) && + ( config_ptr->max_decrement <= 0 ) ) || + ( config_ptr->upper_hr_threshold >= 1.0 ) ) { + + cache_ptr->size_decrease_possible = FALSE; + } + break; + + default: /* should be unreachable */ + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Unknown decr_mode?!?!?.") + } + + if ( config_ptr->max_size == config_ptr->min_size ) { + + cache_ptr->size_increase_possible = FALSE; + cache_ptr->flash_size_increase_possible = FALSE; + cache_ptr->size_decrease_possible = FALSE; + } + + /* flash_size_increase_possible is intentionally omitted from the + * following: + */ + + cache_ptr->resize_enabled = cache_ptr->size_increase_possible || + cache_ptr->size_decrease_possible; + + cache_ptr->resize_ctl = *config_ptr; + + /* Resize the cache to the supplied initial value if requested, or as + * necessary to force it within the bounds of the current automatic + * cache resizing configuration. + * + * Note that the min_clean_fraction may have changed, so we + * go through the exercise even if the current size is within + * range and an initial size has not been provided. + */ + if ( (cache_ptr->resize_ctl).set_initial_size ) { + + new_max_cache_size = (cache_ptr->resize_ctl).initial_size; + } + else if ( cache_ptr->max_cache_size > (cache_ptr->resize_ctl).max_size ) { + + new_max_cache_size = (cache_ptr->resize_ctl).max_size; + } + else if ( cache_ptr->max_cache_size < (cache_ptr->resize_ctl).min_size ) { + + new_max_cache_size = (cache_ptr->resize_ctl).min_size; + + } else { + + new_max_cache_size = cache_ptr->max_cache_size; + } + + new_min_clean_size = (size_t) + ((double)new_max_cache_size * + ((cache_ptr->resize_ctl).min_clean_fraction)); + + + /* since new_min_clean_size is of type size_t, we have + * + * ( 0 <= new_min_clean_size ) + * + * by definition. + */ + HDassert( new_min_clean_size <= new_max_cache_size ); + HDassert( (cache_ptr->resize_ctl).min_size <= new_max_cache_size ); + HDassert( new_max_cache_size <= (cache_ptr->resize_ctl).max_size ); + + if ( new_max_cache_size < cache_ptr->max_cache_size ) { + + cache_ptr->size_decreased = TRUE; + } + + cache_ptr->max_cache_size = new_max_cache_size; + cache_ptr->min_clean_size = new_min_clean_size; + + if ( H5C_reset_cache_hit_rate_stats(cache_ptr) != SUCCEED ) { + + /* this should be impossible... */ + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_reset_cache_hit_rate_stats failed.") + } + + /* remove excess epoch markers if any */ + if ( ( config_ptr->decr_mode == H5C_decr__age_out_with_threshold ) || + ( config_ptr->decr_mode == H5C_decr__age_out ) ) { + + if ( cache_ptr->epoch_markers_active > + (cache_ptr->resize_ctl).epochs_before_eviction ) { + + result = + H5C__autoadjust__ageout__remove_excess_markers(cache_ptr); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "can't remove excess epoch markers.") + } + } + } else if ( cache_ptr->epoch_markers_active > 0 ) { + + result = H5C__autoadjust__ageout__remove_all_markers(cache_ptr); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "error removing all epoch markers.") + } + } + + /* configure flash size increase facility. We wait until the + * end of the function, as we need the max_cache_size set before + * we start to keep things simple. + * + * If we haven't already ruled out flash cache size increases above, + * go ahead and configure it. + */ + + if ( cache_ptr->flash_size_increase_possible ) { + + switch ( config_ptr->flash_incr_mode ) + { + case H5C_flash_incr__off: + cache_ptr->flash_size_increase_possible = FALSE; + break; + + case H5C_flash_incr__add_space: + cache_ptr->flash_size_increase_possible = TRUE; + cache_ptr->flash_size_increase_threshold = + (size_t) + (((double)(cache_ptr->max_cache_size)) * + ((cache_ptr->resize_ctl).flash_threshold)); + break; + + default: /* should be unreachable */ + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "Unknown flash_incr_mode?!?!?.") + break; + } + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_set_cache_auto_resize_config() */ + + +/*------------------------------------------------------------------------- + * Function: H5C_set_evictions_enabled() + * + * Purpose: Set cache_ptr->evictions_enabled to the value of the + * evictions enabled parameter. + * + * Return: SUCCEED on success, and FAIL on failure. + * + * Programmer: John Mainzer + * 7/27/07 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +herr_t +H5C_set_evictions_enabled(H5C_t * cache_ptr, + hbool_t evictions_enabled) +{ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5C_set_evictions_enabled, FAIL) + + if ( ( cache_ptr == NULL ) || ( cache_ptr->magic != H5C__H5C_T_MAGIC ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr on entry.") + } + + if ( ( evictions_enabled != TRUE ) && ( evictions_enabled != FALSE ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "Bad evictions_enabled on entry.") + } + + /* There is no fundamental reason why we should not permit + * evictions to be disabled while automatic resize is enabled. + * However, I can't think of any good reason why one would + * want to, and allowing it would greatly complicate testing + * the feature. Hence the following: + */ + if ( ( evictions_enabled != TRUE ) && + ( ( cache_ptr->resize_ctl.incr_mode != H5C_incr__off ) || + ( cache_ptr->resize_ctl.flash_incr_mode != H5C_flash_incr__off ) || + ( cache_ptr->resize_ctl.decr_mode != H5C_decr__off ) ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "Can't disable evictions when auto resize enabled.") + } + + cache_ptr->evictions_enabled = evictions_enabled; + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_set_evictions_enabled() */ + + +/*------------------------------------------------------------------------- + * Function: H5C_set_prefix + * + * Purpose: Set the values of the prefix field of H5C_t. This + * filed is used to label some debugging output. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: John Mainzer + * 1/20/06 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +herr_t +H5C_set_prefix(H5C_t * cache_ptr, + char * prefix) +{ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5C_set_prefix, FAIL) + + /* This would normally be an assert, but we need to use an HGOTO_ERROR + * call to shut up the compiler. + */ + if ( ( ! cache_ptr ) || ( cache_ptr->magic != H5C__H5C_T_MAGIC ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr") + } + + HDassert( prefix ); + HDassert( HDstrlen(prefix) < H5C__PREFIX_LEN ) ; + + HDstrcpy(&(cache_ptr->prefix[0]), prefix); + +done: + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_set_prefix() */ + + +/*------------------------------------------------------------------------- + * Function: H5C_set_skip_flags + * + * Purpose: Set the values of the skip sanity check flags. + * + * This function and the skip sanity check flags were created + * for the convenience of the test bed. However it is + * possible that there may be other uses for the flags. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: John Mainzer + * 6/11/04 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +herr_t +H5C_set_skip_flags(H5C_t * cache_ptr, + hbool_t skip_file_checks, + hbool_t skip_dxpl_id_checks) +{ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5C_set_skip_flags, FAIL) + + /* This would normally be an assert, but we need to use an HGOTO_ERROR + * call to shut up the compiler. + */ + if ( ( ! cache_ptr ) || ( cache_ptr->magic != H5C__H5C_T_MAGIC ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr") + } + + cache_ptr->skip_file_checks = skip_file_checks; + cache_ptr->skip_dxpl_id_checks = skip_dxpl_id_checks; + +done: + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_set_skip_flags() */ + + +/*------------------------------------------------------------------------- + * Function: H5C_set_trace_file_ptr + * + * Purpose: Set the trace_file_ptr field for the cache. + * + * This field must either be NULL (which turns of trace + * file logging), or be a pointer to an open file to which + * trace file data is to be written. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: John Mainzer + * 1/20/06 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +herr_t +H5C_set_trace_file_ptr(H5C_t * cache_ptr, + FILE * trace_file_ptr) +{ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5C_set_trace_file_ptr, FAIL) + + /* This would normally be an assert, but we need to use an HGOTO_ERROR + * call to shut up the compiler. + */ + if ( ( ! cache_ptr ) || ( cache_ptr->magic != H5C__H5C_T_MAGIC ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr") + } + + cache_ptr->trace_file_ptr = trace_file_ptr; + +done: + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_set_trace_file_ptr() */ + + +/*------------------------------------------------------------------------- + * Function: H5C_stats + * + * Purpose: Prints statistics about the cache. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: John Mainzer + * 6/2/04 + * + * Modifications: + * + * JRM -- 7/21/04 + * Updated function for the addition of the hash table. + * + * JRM -- 9/8/05 + * Updated function for the addition of cache entry size + * change statistics. + * + * JRM -- 1/13/06 + * Added code to use the prefix field of H5C_t to allow + * tagging of statistics output. + * + * JRM -- 3/21/06 + * Added code supporting the pinned entry related stats. + * + * JRM -- 8/9/06 + * More code supporting pinned entry related stats. + * + * JRM -- 8/23/06 + * Added code supporting new flush related statistics. + * + * JRM -- 3/31/07 + * Added code supporting the new write_protects, + * read_protects, and max_read_protects fields. + * + *------------------------------------------------------------------------- + */ + +herr_t +H5C_stats(H5C_t * cache_ptr, + const char * cache_name, + hbool_t +#if !H5C_COLLECT_CACHE_STATS + UNUSED +#endif /* H5C_COLLECT_CACHE_STATS */ + display_detailed_stats) +{ + herr_t ret_value = SUCCEED; /* Return value */ + +#if H5C_COLLECT_CACHE_STATS + int i; + int64_t total_hits = 0; + int64_t total_misses = 0; + int64_t total_write_protects = 0; + int64_t total_read_protects = 0; + int64_t max_read_protects = 0; + int64_t total_insertions = 0; + int64_t total_pinned_insertions = 0; + int64_t total_clears = 0; + int64_t total_flushes = 0; + int64_t total_evictions = 0; + int64_t total_renames = 0; + int64_t total_entry_flush_renames = 0; + int64_t total_cache_flush_renames = 0; + int64_t total_size_increases = 0; + int64_t total_size_decreases = 0; + int64_t total_entry_flush_size_changes = 0; + int64_t total_cache_flush_size_changes = 0; + int64_t total_pins = 0; + int64_t total_unpins = 0; + int64_t total_dirty_pins = 0; + int64_t total_pinned_flushes = 0; + int64_t total_pinned_clears = 0; + int32_t aggregate_max_accesses = 0; + int32_t aggregate_min_accesses = 1000000; + int32_t aggregate_max_clears = 0; + int32_t aggregate_max_flushes = 0; + size_t aggregate_max_size = 0; + int32_t aggregate_max_pins = 0; + double hit_rate; + double average_successful_search_depth = 0.0; + double average_failed_search_depth = 0.0; +#endif /* H5C_COLLECT_CACHE_STATS */ + + FUNC_ENTER_NOAPI(H5C_stats, FAIL) + + /* This would normally be an assert, but we need to use an HGOTO_ERROR + * call to shut up the compiler. + */ + if ( ( ! cache_ptr ) || + ( cache_ptr->magic != H5C__H5C_T_MAGIC ) || + ( !cache_name ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr or cache_name") + } + +#if H5C_COLLECT_CACHE_STATS + + for ( i = 0; i <= cache_ptr->max_type_id; i++ ) { + + total_hits += cache_ptr->hits[i]; + total_misses += cache_ptr->misses[i]; + total_write_protects += cache_ptr->write_protects[i]; + total_read_protects += cache_ptr->read_protects[i]; + if ( max_read_protects < cache_ptr->max_read_protects[i] ) { + max_read_protects = cache_ptr->max_read_protects[i]; + } + total_insertions += cache_ptr->insertions[i]; + total_pinned_insertions += cache_ptr->pinned_insertions[i]; + total_clears += cache_ptr->clears[i]; + total_flushes += cache_ptr->flushes[i]; + total_evictions += cache_ptr->evictions[i]; + total_renames += cache_ptr->renames[i]; + total_entry_flush_renames + += cache_ptr->entry_flush_renames[i]; + total_cache_flush_renames + += cache_ptr->cache_flush_renames[i]; + total_size_increases += cache_ptr->size_increases[i]; + total_size_decreases += cache_ptr->size_decreases[i]; + total_entry_flush_size_changes + += cache_ptr->entry_flush_size_changes[i]; + total_cache_flush_size_changes + += cache_ptr->cache_flush_size_changes[i]; + total_pins += cache_ptr->pins[i]; + total_unpins += cache_ptr->unpins[i]; + total_dirty_pins += cache_ptr->dirty_pins[i]; + total_pinned_flushes += cache_ptr->pinned_flushes[i]; + total_pinned_clears += cache_ptr->pinned_clears[i]; +#if H5C_COLLECT_CACHE_ENTRY_STATS + if ( aggregate_max_accesses < cache_ptr->max_accesses[i] ) + aggregate_max_accesses = cache_ptr->max_accesses[i]; + if ( aggregate_min_accesses > aggregate_max_accesses ) + aggregate_min_accesses = aggregate_max_accesses; + if ( aggregate_min_accesses > cache_ptr->min_accesses[i] ) + aggregate_min_accesses = cache_ptr->min_accesses[i]; + if ( aggregate_max_clears < cache_ptr->max_clears[i] ) + aggregate_max_clears = cache_ptr->max_clears[i]; + if ( aggregate_max_flushes < cache_ptr->max_flushes[i] ) + aggregate_max_flushes = cache_ptr->max_flushes[i]; + if ( aggregate_max_size < cache_ptr->max_size[i] ) + aggregate_max_size = cache_ptr->max_size[i]; + if ( aggregate_max_pins < cache_ptr->max_pins[i] ) + aggregate_max_pins = cache_ptr->max_pins[i]; +#endif /* H5C_COLLECT_CACHE_ENTRY_STATS */ + } + + if ( ( total_hits > 0 ) || ( total_misses > 0 ) ) { + + hit_rate = 100.0 * ((double)(total_hits)) / + ((double)(total_hits + total_misses)); + } else { + hit_rate = 0.0; + } + + if ( cache_ptr->successful_ht_searches > 0 ) { + + average_successful_search_depth = + ((double)(cache_ptr->total_successful_ht_search_depth)) / + ((double)(cache_ptr->successful_ht_searches)); + } + + if ( cache_ptr->failed_ht_searches > 0 ) { + + average_failed_search_depth = + ((double)(cache_ptr->total_failed_ht_search_depth)) / + ((double)(cache_ptr->failed_ht_searches)); + } + + + HDfprintf(stdout, "\n%sH5C: cache statistics for %s\n", + cache_ptr->prefix, cache_name); + + HDfprintf(stdout, "\n"); + + HDfprintf(stdout, + "%s hash table insertion / deletions = %ld / %ld\n", + cache_ptr->prefix, + (long)(cache_ptr->total_ht_insertions), + (long)(cache_ptr->total_ht_deletions)); + + HDfprintf(stdout, + "%s HT successful / failed searches = %ld / %ld\n", + cache_ptr->prefix, + (long)(cache_ptr->successful_ht_searches), + (long)(cache_ptr->failed_ht_searches)); + + HDfprintf(stdout, + "%s Av. HT suc / failed search depth = %f / %f\n", + cache_ptr->prefix, + average_successful_search_depth, + average_failed_search_depth); + + HDfprintf(stdout, + "%s current (max) index size / length = %ld (%ld) / %ld (%ld)\n", + cache_ptr->prefix, + (long)(cache_ptr->index_size), + (long)(cache_ptr->max_index_size), + (long)(cache_ptr->index_len), + (long)(cache_ptr->max_index_len)); + + HDfprintf(stdout, + "%s current (max) slist size / length = %ld (%ld) / %ld (%ld)\n", + cache_ptr->prefix, + (long)(cache_ptr->slist_size), + (long)(cache_ptr->max_slist_size), + (long)(cache_ptr->slist_len), + (long)(cache_ptr->max_slist_len)); + + HDfprintf(stdout, + "%s current (max) PL size / length = %ld (%ld) / %ld (%ld)\n", + cache_ptr->prefix, + (long)(cache_ptr->pl_size), + (long)(cache_ptr->max_pl_size), + (long)(cache_ptr->pl_len), + (long)(cache_ptr->max_pl_len)); + + HDfprintf(stdout, + "%s current (max) PEL size / length = %ld (%ld) / %ld (%ld)\n", + cache_ptr->prefix, + (long)(cache_ptr->pel_size), + (long)(cache_ptr->max_pel_size), + (long)(cache_ptr->pel_len), + (long)(cache_ptr->max_pel_len)); + + HDfprintf(stdout, + "%s current LRU list size / length = %ld / %ld\n", + cache_ptr->prefix, + (long)(cache_ptr->LRU_list_size), + (long)(cache_ptr->LRU_list_len)); + + HDfprintf(stdout, + "%s current clean LRU size / length = %ld / %ld\n", + cache_ptr->prefix, + (long)(cache_ptr->cLRU_list_size), + (long)(cache_ptr->cLRU_list_len)); + + HDfprintf(stdout, + "%s current dirty LRU size / length = %ld / %ld\n", + cache_ptr->prefix, + (long)(cache_ptr->dLRU_list_size), + (long)(cache_ptr->dLRU_list_len)); + + HDfprintf(stdout, + "%s Total hits / misses / hit_rate = %ld / %ld / %f\n", + cache_ptr->prefix, + (long)total_hits, + (long)total_misses, + hit_rate); + + HDfprintf(stdout, + "%s Total write / read (max) protects = %ld / %ld (%ld)\n", + cache_ptr->prefix, + (long)total_write_protects, + (long)total_read_protects, + (long)max_read_protects); + + HDfprintf(stdout, + "%s Total clears / flushes / evictions = %ld / %ld / %ld\n", + cache_ptr->prefix, + (long)total_clears, + (long)total_flushes, + (long)total_evictions); + + HDfprintf(stdout, + "%s Total insertions(pinned) / renames = %ld(%ld) / %ld\n", + cache_ptr->prefix, + (long)total_insertions, + (long)total_pinned_insertions, + (long)total_renames); + + HDfprintf(stdout, + "%s Total entry / cache flush renames = %ld / %ld\n", + cache_ptr->prefix, + (long)total_entry_flush_renames, + (long)total_cache_flush_renames); + + HDfprintf(stdout, "%s Total entry size incrs / decrs = %ld / %ld\n", + cache_ptr->prefix, + (long)total_size_increases, + (long)total_size_decreases); + + HDfprintf(stdout, "%s Ttl entry/cache flush size changes = %ld / %ld\n", + cache_ptr->prefix, + (long)total_entry_flush_size_changes, + (long)total_cache_flush_size_changes); + + HDfprintf(stdout, + "%s Total entry pins (dirty) / unpins = %ld (%ld) / %ld\n", + cache_ptr->prefix, + (long)total_pins, + (long)total_dirty_pins, + (long)total_unpins); + + HDfprintf(stdout, "%s Total pinned flushes / clears = %ld / %ld\n", + cache_ptr->prefix, + (long)total_pinned_flushes, + (long)total_pinned_clears); + +#if H5C_COLLECT_CACHE_ENTRY_STATS + + HDfprintf(stdout, "%s aggregate max / min accesses = %d / %d\n", + cache_ptr->prefix, + (int)aggregate_max_accesses, + (int)aggregate_min_accesses); + + HDfprintf(stdout, "%s aggregate max_clears / max_flushes = %d / %d\n", + cache_ptr->prefix, + (int)aggregate_max_clears, + (int)aggregate_max_flushes); + + HDfprintf(stdout, "%s aggregate max_size / max_pins = %d / %d\n", + cache_ptr->prefix, + (int)aggregate_max_size, + (int)aggregate_max_pins); + +#endif /* H5C_COLLECT_CACHE_ENTRY_STATS */ + + if ( display_detailed_stats ) + { + + for ( i = 0; i <= cache_ptr->max_type_id; i++ ) { + + HDfprintf(stdout, "\n"); + + HDfprintf(stdout, "%s Stats on %s:\n", + cache_ptr->prefix, + ((cache_ptr->type_name_table_ptr))[i]); + + if ( ( cache_ptr->hits[i] > 0 ) || ( cache_ptr->misses[i] > 0 ) ) { + + hit_rate = 100.0 * ((double)(cache_ptr->hits[i])) / + ((double)(cache_ptr->hits[i] + cache_ptr->misses[i])); + } else { + hit_rate = 0.0; + } + + HDfprintf(stdout, + "%s hits / misses / hit_rate = %ld / %ld / %f\n", + cache_ptr->prefix, + (long)(cache_ptr->hits[i]), + (long)(cache_ptr->misses[i]), + hit_rate); + + HDfprintf(stdout, + "%s write / read (max) protects = %ld / %ld (%d)\n", + cache_ptr->prefix, + (long)(cache_ptr->write_protects[i]), + (long)(cache_ptr->read_protects[i]), + (int)(cache_ptr->max_read_protects[i])); + + HDfprintf(stdout, + "%s clears / flushes / evictions = %ld / %ld / %ld\n", + cache_ptr->prefix, + (long)(cache_ptr->clears[i]), + (long)(cache_ptr->flushes[i]), + (long)(cache_ptr->evictions[i])); + + HDfprintf(stdout, + "%s insertions(pinned) / renames = %ld(%ld) / %ld\n", + cache_ptr->prefix, + (long)(cache_ptr->insertions[i]), + (long)(cache_ptr->pinned_insertions[i]), + (long)(cache_ptr->renames[i])); + + HDfprintf(stdout, + "%s entry / cache flush renames = %ld / %ld\n", + cache_ptr->prefix, + (long)(cache_ptr->entry_flush_renames[i]), + (long)(cache_ptr->cache_flush_renames[i])); + + HDfprintf(stdout, + "%s size increases / decreases = %ld / %ld\n", + cache_ptr->prefix, + (long)(cache_ptr->size_increases[i]), + (long)(cache_ptr->size_decreases[i])); + + HDfprintf(stdout, + "%s entry/cache flush size changes = %ld / %ld\n", + cache_ptr->prefix, + (long)(cache_ptr->entry_flush_size_changes[i]), + (long)(cache_ptr->cache_flush_size_changes[i])); + + + HDfprintf(stdout, + "%s entry pins / unpins = %ld / %ld\n", + cache_ptr->prefix, + (long)(cache_ptr->pins[i]), + (long)(cache_ptr->unpins[i])); + + HDfprintf(stdout, + "%s entry dirty pins/pin'd flushes = %ld / %ld\n", + cache_ptr->prefix, + (long)(cache_ptr->dirty_pins[i]), + (long)(cache_ptr->pinned_flushes[i])); + +#if H5C_COLLECT_CACHE_ENTRY_STATS + + HDfprintf(stdout, + "%s entry max / min accesses = %d / %d\n", + cache_ptr->prefix, + cache_ptr->max_accesses[i], + cache_ptr->min_accesses[i]); + + HDfprintf(stdout, + "%s entry max_clears / max_flushes = %d / %d\n", + cache_ptr->prefix, + cache_ptr->max_clears[i], + cache_ptr->max_flushes[i]); + + HDfprintf(stdout, + "%s entry max_size / max_pins = %d / %d\n", + cache_ptr->prefix, + (int)(cache_ptr->max_size[i]), + (int)(cache_ptr->max_pins[i])); + + +#endif /* H5C_COLLECT_CACHE_ENTRY_STATS */ + + } + } + + HDfprintf(stdout, "\n"); + +#endif /* H5C_COLLECT_CACHE_STATS */ + +done: + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_stats() */ + + +/*------------------------------------------------------------------------- + * + * Function: H5C_stats__reset + * + * Purpose: Reset the stats fields to their initial values. + * + * Return: void + * + * Programmer: John Mainzer, 4/28/04 + * + * Modifications: + * + * JRM - 7/21/04 + * Updated for hash table related statistics. + * + * JRM - 9/8/05 + * Updated for size increase / decrease statistics. + * + * JRM - 3/20/06 + * Updated for pin / unpin related statistics. + * + * JRM - 8/9/06 + * Further updates for pin related statistics. + * + * JRM 8/23/06 + * Added initialization code for new flush related statistics. + * + * JRM 2/16/07 + * Added conditional compile code to avoid unused parameter + * warning in the production build. + * + * JRM 3/31/07 + * Added initialization for the new write_protects, + * read_protects, and max_read_protects fields. + * + *------------------------------------------------------------------------- + */ + +void +#ifndef NDEBUG +H5C_stats__reset(H5C_t * cache_ptr) +#else /* NDEBUG */ +#if H5C_COLLECT_CACHE_STATS +H5C_stats__reset(H5C_t * cache_ptr) +#else /* H5C_COLLECT_CACHE_STATS */ +H5C_stats__reset(H5C_t UNUSED * cache_ptr) +#endif /* H5C_COLLECT_CACHE_STATS */ +#endif /* NDEBUG */ +{ +#if H5C_COLLECT_CACHE_STATS + int i; +#endif /* H5C_COLLECT_CACHE_STATS */ + + HDassert( cache_ptr ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + +#if H5C_COLLECT_CACHE_STATS + for ( i = 0; i <= cache_ptr->max_type_id; i++ ) + { + cache_ptr->hits[i] = 0; + cache_ptr->misses[i] = 0; + cache_ptr->write_protects[i] = 0; + cache_ptr->read_protects[i] = 0; + cache_ptr->max_read_protects[i] = 0; + cache_ptr->insertions[i] = 0; + cache_ptr->pinned_insertions[i] = 0; + cache_ptr->clears[i] = 0; + cache_ptr->flushes[i] = 0; + cache_ptr->evictions[i] = 0; + cache_ptr->renames[i] = 0; + cache_ptr->entry_flush_renames[i] = 0; + cache_ptr->cache_flush_renames[i] = 0; + cache_ptr->pins[i] = 0; + cache_ptr->unpins[i] = 0; + cache_ptr->dirty_pins[i] = 0; + cache_ptr->pinned_flushes[i] = 0; + cache_ptr->pinned_clears[i] = 0; + cache_ptr->size_increases[i] = 0; + cache_ptr->size_decreases[i] = 0; + cache_ptr->entry_flush_size_changes[i] = 0; + cache_ptr->cache_flush_size_changes[i] = 0; + } + + cache_ptr->total_ht_insertions = 0; + cache_ptr->total_ht_deletions = 0; + cache_ptr->successful_ht_searches = 0; + cache_ptr->total_successful_ht_search_depth = 0; + cache_ptr->failed_ht_searches = 0; + cache_ptr->total_failed_ht_search_depth = 0; + + cache_ptr->max_index_len = 0; + cache_ptr->max_index_size = (size_t)0; + + cache_ptr->max_slist_len = 0; + cache_ptr->max_slist_size = (size_t)0; + + cache_ptr->max_pl_len = 0; + cache_ptr->max_pl_size = (size_t)0; + + cache_ptr->max_pel_len = 0; + cache_ptr->max_pel_size = (size_t)0; + +#if H5C_COLLECT_CACHE_ENTRY_STATS + + for ( i = 0; i <= cache_ptr->max_type_id; i++ ) + { + cache_ptr->max_accesses[i] = 0; + cache_ptr->min_accesses[i] = 1000000; + cache_ptr->max_clears[i] = 0; + cache_ptr->max_flushes[i] = 0; + cache_ptr->max_size[i] = (size_t)0; + cache_ptr->max_pins[i] = 0; + } + +#endif /* H5C_COLLECT_CACHE_ENTRY_STATS */ +#endif /* H5C_COLLECT_CACHE_STATS */ + + return; + +} /* H5C_stats__reset() */ + + +/*------------------------------------------------------------------------- + * Function: H5C_unpin_entry() + * + * Purpose: Unpin a cache entry. The entry must be unprotected at + * the time of call, and must be pinned. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: John Mainzer + * 3/22/06 + * + *------------------------------------------------------------------------- + */ +herr_t +H5C_unpin_entry(void *_entry_ptr) +{ + H5C_t *cache_ptr; + H5C_cache_entry_t *entry_ptr = (H5C_cache_entry_t *)_entry_ptr; + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5C_unpin_entry, FAIL) + + /* Sanity check */ + HDassert(entry_ptr); + cache_ptr = entry_ptr->cache_ptr; + HDassert(cache_ptr); + HDassert(cache_ptr->magic == H5C__H5C_T_MAGIC); + +#if H5C_PRINT_ENTRY_POINTS + if(H5C_PRINT_ENTRY_POINT_TARGET_TYPE(entry_ptr->type->id)) + HDfprintf(stdout, "%s: addr = 0x%lX, type = %s.\n", FUNC, (unsigned long)(entry_ptr->addr), entry_ptr->type->name); +#endif /* H5C_PRINT_ENTRY_POINTS */ + + /* Error checking */ + if(!entry_ptr->is_pinned) + HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPIN, FAIL, "Entry isn't pinned") + + /* Update unprotected entry */ + if(!entry_ptr->is_protected) + H5C__UPDATE_RP_FOR_UNPIN(cache_ptr, entry_ptr, FAIL) + + /* Mark entry unpinned */ + entry_ptr->is_pinned = FALSE; + + /* Update statistics for unpin operation */ + H5C__UPDATE_STATS_FOR_UNPIN(cache_ptr, entry_ptr) + +done: +#if H5C_PRINT_EXIT_POINTS + if(H5C_PRINT_ENTRY_POINT_TARGET_TYPE(entry_ptr->type->id)) + HDfprintf(stdout, "%s: Exiting with result = %d.\n", FUNC, (int)ret_value); +#endif /* H5C_PRINT_EXIT_POINTS */ + + FUNC_LEAVE_NOAPI(ret_value) +} /* H5C_unpin_entry() */ + + +/*------------------------------------------------------------------------- + * Function: H5C_unprotect + * + * Purpose: Undo an H5C_protect() call -- specifically, mark the + * entry as unprotected, remove it from the protected list, + * and give it back to the replacement policy. + * + * The TYPE and ADDR arguments must be the same as those in + * the corresponding call to H5C_protect() and the THING + * argument must be the value returned by that call to + * H5C_protect(). + * + * The primary_dxpl_id and secondary_dxpl_id parameters + * specify the dxpl_ids used on the first write occasioned + * by the unprotect (primary_dxpl_id), and on all subsequent + * writes (secondary_dxpl_id). Since an uprotect cannot + * occasion a write at present, all this is moot for now. + * However, things change, and in any case, + * H5C_flush_single_entry() needs primary_dxpl_id and + * secondary_dxpl_id in its parameter list. + * + * The function can't cause a read either, so the dxpl_id + * parameters are moot in this case as well. + * + * Return: Non-negative on success/Negative on failure + * + * If the deleted flag is TRUE, simply remove the target entry + * from the cache, clear it, and free it without writing it to + * disk. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: John Mainzer + * 6/2/04 + * + * Modifications: + * + * JRM -- 7/21/04 + * Updated the function for the addition of the hash table. + * In particular, we now add dirty entries to the tree if + * they aren't in the tree already. + * + * JRM -- 1/6/05 + * Added the flags parameter, and code supporting + * H5C__SET_FLUSH_MARKER_FLAG. Note that this flag is + * ignored unless the new entry is dirty. Also note that + * once the flush_marker field of an entry is set, the + * only way it can be reset is by being flushed. + * + * JRM -- 6/3/05 + * Added the dirtied parameter and supporting code. This + * is part of an effort to move management of the is_dirty + * field into the cache code. This has become necessary + * to repair a cache coherency bug in PHDF5. + * + * JRM -- 7/5/05 + * Added code supporting the new clear_on_unprotect field + * of H5C_cache_entry_t. This change is also part of the + * above mentioned cache coherency bug fix in PHDF5. + * + * JRM -- 9/8/05 + * Added the size_changed and new_size parameters and the + * supporting code. Since the metadata cache synchronizes + * on dirty bytes creation in the PHDF5 case, we must now + * track changes in entry size. + * + * Note that the new_size parameter is ignored unless the + * size_changed parameter is TRUE. In this case, the new_size + * must be positive. + * + * Also observe that if size_changed is TRUE, dirtied must be + * TRUE. + * + * JRM -- 9/23/05 + * Moved the size_changed parameter into flags. + * + * JRM -- 3/21/06 + * Unpdated function to pin and unpin entries as directed via + * the new H5C__PIN_ENTRY_FLAG and H5C__UNPIN_ENTRY_FLAG flags. + * + * JRM -- 5/3/06 + * Added code to make use of the new dirtied field in + * H5C_cache_entry_t. If this field is TRUE, it is the + * equivalent of setting the H5C__DIRTIED_FLAG. + * + * JRM -- 3/29/07 + * Modified function to allow a entry to be protected + * more than once if the entry is protected read only. + * + * Also added sanity checks using the new is_read_only and + * ro_ref_count parameters. + * + * JRM -- 9/8/07 + * Revised function for the new metadata cache API. The + * function lost its pointer to H5F_t (now supplied via + * *cache_ptr), and one of its dxpl ids. Also internal + * changes supporting the revised API. + * + * JRM -- 12/31/07 + * Modified funtion to support flash cache resizes. + * + *------------------------------------------------------------------------- + */ +herr_t +H5C_unprotect(H5F_t * f, + hid_t dxpl_id, + const H5C_class_t * type, + haddr_t addr, + void * thing, + unsigned int flags, + size_t new_size) +{ + H5C_t * cache_ptr; + hbool_t deleted; + hbool_t dirtied; + hbool_t set_flush_marker; + hbool_t size_changed; + hbool_t pin_entry; + hbool_t unpin_entry; +#ifdef H5_HAVE_PARALLEL + hbool_t clear_entry = FALSE; +#endif /* H5_HAVE_PARALLEL */ + herr_t ret_value = SUCCEED; /* Return value */ + herr_t result; + size_t size_increase = 0; + H5C_cache_entry_t * entry_ptr; + H5C_cache_entry_t * test_entry_ptr; + + FUNC_ENTER_NOAPI(H5C_unprotect, FAIL) + +#if H5C_PRINT_ENTRY_POINTS + if ( H5C_PRINT_ENTRY_POINT_TARGET_TYPE(type->id) ) + { + HDfprintf(stdout, + "%s: addr = 0x%lX, type = %s, flags = 0x%x, new_size = %d.\n", + FUNC, (unsigned long)addr, type->name, flags, (int)new_size); + } +#endif /* JRM */ + + deleted = ( (flags & H5C__DELETED_FLAG) != 0 ); + dirtied = ( (flags & H5C__DIRTIED_FLAG) != 0 ); + set_flush_marker = ( (flags & H5C__SET_FLUSH_MARKER_FLAG) != 0 ); + size_changed = ( (flags & H5C__SIZE_CHANGED_FLAG) != 0 ); + pin_entry = ( (flags & H5C__PIN_ENTRY_FLAG) != 0 ); + unpin_entry = ( (flags & H5C__UNPIN_ENTRY_FLAG) != 0 ); + + /* Changing the size of an entry dirties it. Thus, set the + * dirtied flag if the size_changed flag is set. + */ + + dirtied |= size_changed; + + HDassert( f ); + HDassert( f->shared ); + + cache_ptr = f->shared->cache; + + HDassert( cache_ptr ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + HDassert( cache_ptr->skip_file_checks || f ); + HDassert( type ); + HDassert( H5F_addr_defined(addr) ); + HDassert( thing ); + HDassert( ( size_changed == TRUE ) || ( size_changed == FALSE ) ); + HDassert( ( ! size_changed ) || ( dirtied ) ); + HDassert( ( ! size_changed ) || ( new_size > 0 ) ); + HDassert( ! ( pin_entry && unpin_entry ) ); + + entry_ptr = (H5C_cache_entry_t *)thing; + + HDassert( entry_ptr->addr == addr ); + HDassert( entry_ptr->type == type ); + + /* also set the dirtied variable if the dirtied field is set in + * the entry. + */ + dirtied |= entry_ptr->dirtied; + +#if H5C_DO_EXTREME_SANITY_CHECKS + if ( H5C_validate_lru_list(cache_ptr) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "LRU sanity check failed.\n"); + } +#endif /* H5C_DO_EXTREME_SANITY_CHECKS */ + + + /* if the entry has multiple read only protects, just decrement + * the ro_ref_counter. Don't actually unprotect until the ref count + * drops to zero. + */ + if ( entry_ptr->ro_ref_count > 1 ) { + + HDassert( entry_ptr->is_protected ); + HDassert( entry_ptr->is_read_only ); + + if ( dirtied ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \ + "Read only entry modified(1)??") + } + + (entry_ptr->ro_ref_count)--; + + /* Pin or unpin the entry as requested. */ + if ( pin_entry ) { + + if ( entry_ptr->is_pinned ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTPIN, FAIL, \ + "Entry already pinned???") + } + entry_ptr->is_pinned = TRUE; + H5C__UPDATE_STATS_FOR_PIN(cache_ptr, entry_ptr) + + } else if ( unpin_entry ) { + + if ( ! ( entry_ptr->is_pinned ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPIN, FAIL, \ + "Entry already unpinned???") + } + entry_ptr->is_pinned = FALSE; + H5C__UPDATE_STATS_FOR_UNPIN(cache_ptr, entry_ptr) + + } + + } else { + + if ( entry_ptr->is_read_only ) { + + HDassert( entry_ptr->ro_ref_count == 1 ); + + if ( dirtied ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \ + "Read only entry modified(2)??") + } + + entry_ptr->is_read_only = FALSE; + entry_ptr->ro_ref_count = 0; + } + +#ifdef H5_HAVE_PARALLEL + /* When the H5C code is used to implement the metadata cache in the + * PHDF5 case, only the cache on process 0 is allowed to write to file. + * All the other metadata caches must hold dirty entries until they + * are told that the entries are clean. + * + * The clear_on_unprotect flag in the H5C_cache_entry_t structure + * exists to deal with the case in which an entry is protected when + * its cache receives word that the entry is now clean. In this case, + * the clear_on_unprotect flag is set, and the entry is flushed with + * the H5C__FLUSH_CLEAR_ONLY_FLAG. + * + * All this is a bit awkward, but until the metadata cache entries + * are contiguous, with only one dirty flag, we have to let the supplied + * functions deal with the reseting the is_dirty flag. + */ + if ( entry_ptr->clear_on_unprotect ) { + + HDassert( entry_ptr->is_dirty ); + + entry_ptr->clear_on_unprotect = FALSE; + + if ( ! dirtied ) { + + clear_entry = TRUE; + } + } +#endif /* H5_HAVE_PARALLEL */ + + if ( ! (entry_ptr->is_protected) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \ + "Entry already unprotected??") + } + + /* mark the entry as dirty if appropriate */ + if ( dirtied ) { + + entry_ptr->is_dirty = ( (entry_ptr->is_dirty) || dirtied ); + entry_ptr->image_up_to_date = FALSE; + + H5C__UPDATE_TL_FOR_ENTRY_DIRTY(cache_ptr, entry_ptr, FAIL) + } + + /* update for change in entry size if necessary */ + if ( ( size_changed ) && ( entry_ptr->size != new_size ) ) { + + /* Release the current image */ + if( entry_ptr->image_ptr ) + entry_ptr->image_ptr = H5MM_xfree(entry_ptr->image_ptr); + + /* do a flash cache size increase if appropriate */ + if ( cache_ptr->flash_size_increase_possible ) { + + if ( new_size > entry_ptr->size ) { + + size_increase = new_size - entry_ptr->size; + + if ( size_increase >= + cache_ptr->flash_size_increase_threshold ) { + + result = H5C__flash_increase_cache_size(cache_ptr, + entry_ptr->size, + new_size); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \ + "H5C__flash_increase_cache_size failed.") + } + } + } + } + + /* update the protected list */ + H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr->pl_len), \ + (cache_ptr->pl_size), \ + (entry_ptr->size), (new_size)); + + /* update the hash table */ + H5C__UPDATE_INDEX_FOR_SIZE_CHANGE((cache_ptr), (entry_ptr->size),\ + (new_size)); + + /* if the entry is in the skip list, update that too */ + if ( entry_ptr->in_slist ) { + + H5C__UPDATE_SLIST_FOR_SIZE_CHANGE((cache_ptr), \ + (entry_ptr->size),\ + (new_size)); + } + + /* if journaling is enabled, and the entry is on the transaction + * list, update that list for the size changed. + */ + H5C__UPDATE_TL_FOR_ENTRY_SIZE_CHANGE((cache_ptr), (entry_ptr), \ + (entry_ptr->size), \ + (new_size)); + + /* update statistics just before changing the entry size */ + H5C__UPDATE_STATS_FOR_ENTRY_SIZE_CHANGE((cache_ptr), (entry_ptr), \ + (new_size)); + + /* finally, update the entry size proper */ + entry_ptr->size = new_size; + } + + /* Pin or unpin the entry as requested. */ + if ( pin_entry ) { + + if ( entry_ptr->is_pinned ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTPIN, FAIL, \ + "Entry already pinned???") + } + entry_ptr->is_pinned = TRUE; + H5C__UPDATE_STATS_FOR_PIN(cache_ptr, entry_ptr) + + } else if ( unpin_entry ) { + + if ( ! ( entry_ptr->is_pinned ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPIN, FAIL, \ + "Entry already unpinned???") + } + entry_ptr->is_pinned = FALSE; + H5C__UPDATE_STATS_FOR_UNPIN(cache_ptr, entry_ptr) + + } + + /* H5C__UPDATE_RP_FOR_UNPROTECT will places the unprotected entry on + * the pinned entry list if entry_ptr->is_pined is TRUE. + */ + H5C__UPDATE_RP_FOR_UNPROTECT(cache_ptr, entry_ptr, FAIL) + + entry_ptr->is_protected = FALSE; + + /* if the entry is dirty, 'or' its flush_marker with the set flush flag, + * and then add it to the skip list if it isn't there already. + */ + + if ( entry_ptr->is_dirty ) { + + entry_ptr->flush_marker |= set_flush_marker; + + if ( ! (entry_ptr->in_slist) ) { + + H5C__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, FAIL) + } + } + + /* this implementation of the "deleted" option is a bit inefficient, as + * we re-insert the entry to be deleted into the replacement policy + * data structures, only to remove them again. Depending on how often + * we do this, we may want to optimize a bit. + * + * On the other hand, this implementation is reasonably clean, and + * makes good use of existing code. + * JRM - 5/19/04 + */ + if ( deleted ) { + + /* we can't delete a pinned entry */ + HDassert ( ! (entry_ptr->is_pinned ) ); + + /* verify that the target entry is in the cache. */ + + H5C__SEARCH_INDEX(cache_ptr, addr, test_entry_ptr, FAIL) + + if ( test_entry_ptr == NULL ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \ + "entry not in hash table?!?.") + } + else if ( test_entry_ptr != entry_ptr ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \ + "hash table contains multiple entries for addr?!?.") + } + + if ( cache_ptr->mdj_enabled ) { + + /* if journaling is enabled, we have a bit of house keeping + * to do before we delete the entry. + * + * First, if a transaction is in progress, it is possible + * that the target entry is on the transaction list. If it is + * it must be removed before the flush destroy. + * + * Second, if the target entry is on the journal write in + * in progress list, it must be removed from that list as + * well. + */ + + hbool_t entry_on_jwip_list = ( entry_ptr->last_trans != 0 ); + + if ( cache_ptr->trans_in_progress ) { + + H5C__UPDATE_TL_FOR_ENTRY_CLEAR((cache_ptr), \ + (entry_ptr), \ + FAIL) + } + + if ( entry_on_jwip_list ) { + + entry_ptr->last_trans = 0; + H5C__UPDATE_RP_FOR_JOURNAL_WRITE_COMPLETE((cache_ptr), \ + (entry_ptr), \ + FAIL) + } + } + + if ( H5C_flush_single_entry(f, + dxpl_id, + cache_ptr, + type, + addr, + (H5C__FLUSH_CLEAR_ONLY_FLAG | + H5C__FLUSH_INVALIDATE_FLAG), + TRUE) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "Can't flush.") + } + } +#ifdef H5_HAVE_PARALLEL + else if ( clear_entry ) { + + /* verify that the target entry is in the cache. */ + + H5C__SEARCH_INDEX(cache_ptr, addr, test_entry_ptr, FAIL) + + if ( test_entry_ptr == NULL ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \ + "entry not in hash table?!?.") + } + else if ( test_entry_ptr != entry_ptr ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \ + "hash table contains multiple entries for addr?!?.") + } + + if ( H5C_flush_single_entry(f, + dxpl_id, + cache_ptr, + type, + addr, + H5C__FLUSH_CLEAR_ONLY_FLAG, + TRUE) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "Can't clear.") + } + } +#endif /* H5_HAVE_PARALLEL */ + } + + H5C__UPDATE_STATS_FOR_UNPROTECT(cache_ptr) + +done: + +#if H5C_DO_EXTREME_SANITY_CHECKS + if ( H5C_validate_lru_list(cache_ptr) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "LRU sanity check failed.\n"); + } +#endif /* H5C_DO_EXTREME_SANITY_CHECKS */ + +#if H5C_PRINT_EXIT_POINTS + if ( H5C_PRINT_ENTRY_POINT_TARGET_TYPE(type->id) ) { + HDfprintf(stdout, "%s: Exiting with result = %d.\n", + FUNC, (int)ret_value); + } +#endif /* H5C_PRINT_EXIT_POINTS */ + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_unprotect() */ + + +/*------------------------------------------------------------------------- + * Function: H5C_validate_resize_config() + * + * Purpose: Run a sanity check on the specified sections of the + * provided instance of struct H5C_auto_size_ctl_t. + * + * Do nothing and return SUCCEED if no errors are detected, + * and flag an error and return FAIL otherwise. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: John Mainzer + * 3/23/05 + * + * Modifications: + * + * Added validation for the flash increment fields. + * + * JRM -- 12/31/07 + * + *------------------------------------------------------------------------- + */ + +herr_t +H5C_validate_resize_config(H5C_auto_size_ctl_t * config_ptr, + unsigned int tests) +{ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5C_validate_resize_config, FAIL) + + if ( config_ptr == NULL ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "NULL config_ptr on entry.") + } + + if ( config_ptr->version != H5C__CURR_AUTO_SIZE_CTL_VER ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Unknown config version.") + } + + + if ( (tests & H5C_RESIZE_CFG__VALIDATE_GENERAL) != 0 ) { + + if ( ( config_ptr->set_initial_size != TRUE ) && + ( config_ptr->set_initial_size != FALSE ) ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ + "set_initial_size must be either TRUE or FALSE"); + } + + if ( config_ptr->max_size > H5C__MAX_MAX_CACHE_SIZE ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "max_size too big"); + } + + if ( config_ptr->min_size < H5C__MIN_MAX_CACHE_SIZE ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "min_size too small"); + } + + if ( config_ptr->min_size > config_ptr->max_size ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "min_size > max_size"); + } + + if ( ( config_ptr->set_initial_size ) && + ( ( config_ptr->initial_size < config_ptr->min_size ) || + ( config_ptr->initial_size > config_ptr->max_size ) ) ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ + "initial_size must be in the interval [min_size, max_size]"); + } + + if ( ( config_ptr->min_clean_fraction < 0.0 ) || + ( config_ptr->min_clean_fraction > 1.0 ) ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ + "min_clean_fraction must be in the interval [0.0, 1.0]"); + } + + if ( config_ptr->epoch_length < H5C__MIN_AR_EPOCH_LENGTH ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "epoch_length too small"); + } + + if ( config_ptr->epoch_length > H5C__MAX_AR_EPOCH_LENGTH ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "epoch_length too big"); + } + } /* H5C_RESIZE_CFG__VALIDATE_GENERAL */ + + + if ( (tests & H5C_RESIZE_CFG__VALIDATE_INCREMENT) != 0 ) { + + if ( ( config_ptr->incr_mode != H5C_incr__off ) && + ( config_ptr->incr_mode != H5C_incr__threshold ) ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Invalid incr_mode"); + } + + if ( config_ptr->incr_mode == H5C_incr__threshold ) { + + if ( ( config_ptr->lower_hr_threshold < 0.0 ) || + ( config_ptr->lower_hr_threshold > 1.0 ) ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ + "lower_hr_threshold must be in the range [0.0, 1.0]"); + } + + if ( config_ptr->increment < 1.0 ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ + "increment must be greater than or equal to 1.0"); + } + + if ( ( config_ptr->apply_max_increment != TRUE ) && + ( config_ptr->apply_max_increment != FALSE ) ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ + "apply_max_increment must be either TRUE or FALSE"); + } + + /* no need to check max_increment, as it is a size_t, + * and thus must be non-negative. + */ + } /* H5C_incr__threshold */ + + switch ( config_ptr->flash_incr_mode ) + { + case H5C_flash_incr__off: + /* nothing to do here */ + break; + + case H5C_flash_incr__add_space: + if ( ( config_ptr->flash_multiple < 0.1 ) || + ( config_ptr->flash_multiple > 10.0 ) ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ + "flash_multiple must be in the range [0.1, 10.0]"); + } + + if ( ( config_ptr->flash_threshold < 0.1 ) || + ( config_ptr->flash_threshold > 1.0 ) ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ + "flash_threshold must be in the range [0.1, 1.0]"); + } + break; + + default: + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ + "Invalid flash_incr_mode"); + break; + } + } /* H5C_RESIZE_CFG__VALIDATE_INCREMENT */ + + + if ( (tests & H5C_RESIZE_CFG__VALIDATE_DECREMENT) != 0 ) { + + if ( ( config_ptr->decr_mode != H5C_decr__off ) && + ( config_ptr->decr_mode != H5C_decr__threshold ) && + ( config_ptr->decr_mode != H5C_decr__age_out ) && + ( config_ptr->decr_mode != H5C_decr__age_out_with_threshold ) + ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Invalid decr_mode"); + } + + if ( config_ptr->decr_mode == H5C_decr__threshold ) { + + if ( config_ptr->upper_hr_threshold > 1.0 ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ + "upper_hr_threshold must be <= 1.0"); + } + + if ( ( config_ptr->decrement > 1.0 ) || + ( config_ptr->decrement < 0.0 ) ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ + "decrement must be in the interval [0.0, 1.0]"); + } + + /* no need to check max_decrement as it is a size_t + * and thus must be non-negative. + */ + } /* H5C_decr__threshold */ + + if ( ( config_ptr->decr_mode == H5C_decr__age_out ) || + ( config_ptr->decr_mode == H5C_decr__age_out_with_threshold ) + ) { + + if ( config_ptr->epochs_before_eviction < 1 ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ + "epochs_before_eviction must be positive"); + } + + if ( config_ptr->epochs_before_eviction > H5C__MAX_EPOCH_MARKERS ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ + "epochs_before_eviction too big"); + } + + if ( ( config_ptr->apply_empty_reserve != TRUE ) && + ( config_ptr->apply_empty_reserve != FALSE ) ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ + "apply_empty_reserve must be either TRUE or FALSE"); + } + + if ( ( config_ptr->apply_empty_reserve ) && + ( ( config_ptr->empty_reserve > 1.0 ) || + ( config_ptr->empty_reserve < 0.0 ) ) ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ + "empty_reserve must be in the interval [0.0, 1.0]"); + } + + /* no need to check max_decrement as it is a size_t + * and thus must be non-negative. + */ + } /* H5C_decr__age_out || H5C_decr__age_out_with_threshold */ + + if ( config_ptr->decr_mode == H5C_decr__age_out_with_threshold ) { + + if ( ( config_ptr->upper_hr_threshold > 1.0 ) || + ( config_ptr->upper_hr_threshold < 0.0 ) ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ + "upper_hr_threshold must be in the interval [0.0, 1.0]"); + } + } /* H5C_decr__age_out_with_threshold */ + + } /* H5C_RESIZE_CFG__VALIDATE_DECREMENT */ + + + if ( (tests & H5C_RESIZE_CFG__VALIDATE_INTERACTIONS) != 0 ) { + + if ( ( config_ptr->incr_mode == H5C_incr__threshold ) + && + ( ( config_ptr->decr_mode == H5C_decr__threshold ) + || + ( config_ptr->decr_mode == H5C_decr__age_out_with_threshold ) + ) + && + ( config_ptr->lower_hr_threshold + >= + config_ptr->upper_hr_threshold + ) + ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ + "conflicting threshold fields in config.") + } + } /* H5C_RESIZE_CFG__VALIDATE_INTERACTIONS */ + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_validate_resize_config() */ + + +/*************************************************************************/ +/**************************** Private Functions: *************************/ +/*************************************************************************/ + +/*------------------------------------------------------------------------- + * + * Function: H5C__auto_adjust_cache_size + * + * Purpose: Obtain the current full cache hit rate, and compare it + * with the hit rate thresholds for modifying cache size. + * If one of the thresholds has been crossed, adjusts the + * size of the cache accordingly. + * + * The function then resets the full cache hit rate + * statistics, and exits. + * + * Return: Non-negative on success/Negative on failure or if there was + * an attempt to flush a protected item. + * + * + * Programmer: John Mainzer, 10/7/04 + * + * Modifications: + * + * JRM -- 11/18/04 + * Major re-write to support ageout method of cache size + * reduction, and to adjust to changes in the + * H5C_auto_size_ctl_t structure. + * + * JRM -- 9/8/07 + * Reworked to accomodate cache API changes needed to + * support metadata journaling. Mostly, this involved + * removing a bunch of parameters that used to be + * passed through to other calls, and are no longer + * needed. + * + * JRM -- 1/5/08 + * Added support for flash cache size increases. + * + *------------------------------------------------------------------------- + */ + +static herr_t +H5C__auto_adjust_cache_size(H5F_t * f, + hid_t dxpl_id, + H5C_t * cache_ptr, + hbool_t write_permitted) +{ + herr_t result; + hbool_t inserted_epoch_marker = FALSE; + size_t new_max_cache_size = 0; + size_t old_max_cache_size = 0; + size_t new_min_clean_size = 0; + size_t old_min_clean_size = 0; + double hit_rate; + enum H5C_resize_status status = in_spec2; /* will change if needed */ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI_NOINIT(H5C__auto_adjust_cache_size) + + HDassert( f ); + HDassert( cache_ptr ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + HDassert( cache_ptr->cache_accesses >= + (cache_ptr->resize_ctl).epoch_length ); + HDassert( 0.0 <= (cache_ptr->resize_ctl).min_clean_fraction ); + HDassert( (cache_ptr->resize_ctl).min_clean_fraction <= 100.0 ); + + if ( !cache_ptr->resize_enabled ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Auto cache resize disabled.") + } + + HDassert( ( (cache_ptr->resize_ctl).incr_mode != H5C_incr__off ) || \ + ( (cache_ptr->resize_ctl).decr_mode != H5C_decr__off ) ); + + if ( H5C_get_cache_hit_rate(cache_ptr, &hit_rate) != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't get hit rate.") + } + + HDassert( ( 0.0 <= hit_rate ) && ( hit_rate <= 1.0 ) ); + + switch ( (cache_ptr->resize_ctl).incr_mode ) + { + case H5C_incr__off: + if ( cache_ptr->size_increase_possible ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "size_increase_possible but H5C_incr__off?!?!?") + } + break; + + case H5C_incr__threshold: + if ( hit_rate < (cache_ptr->resize_ctl).lower_hr_threshold ) { + + if ( ! cache_ptr->size_increase_possible ) { + + status = increase_disabled2; + + } else if ( cache_ptr->max_cache_size >= + (cache_ptr->resize_ctl).max_size ) { + + HDassert( cache_ptr->max_cache_size == \ + (cache_ptr->resize_ctl).max_size ); + status = at_max_size2; + + } else if ( ! cache_ptr->cache_full ) { + + status = not_full2; + + } else { + + new_max_cache_size = (size_t) + (((double)(cache_ptr->max_cache_size)) * + (cache_ptr->resize_ctl).increment); + + /* clip to max size if necessary */ + if ( new_max_cache_size > + (cache_ptr->resize_ctl).max_size ) { + + new_max_cache_size = (cache_ptr->resize_ctl).max_size; + } + + /* clip to max increment if necessary */ + if ( ( (cache_ptr->resize_ctl).apply_max_increment ) && + ( (cache_ptr->max_cache_size + + (cache_ptr->resize_ctl).max_increment) < + new_max_cache_size ) ) { + + new_max_cache_size = cache_ptr->max_cache_size + + (cache_ptr->resize_ctl).max_increment; + } + + status = increase2; + } + } + break; + + default: + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unknown incr_mode.") + } + + /* If the decr_mode is either age out or age out with threshold, we + * must run the marker maintenance code, whether we run the size + * reduction code or not. We do this in two places -- here we + * insert a new marker if the number of active epoch markers is + * is less than the the current epochs before eviction, and after + * the ageout call, we cycle the markers. + * + * However, we can't call the ageout code or cycle the markers + * unless there was a full complement of markers in place on + * entry. The inserted_epoch_marker flag is used to track this. + */ + + if ( ( ( (cache_ptr->resize_ctl).decr_mode == H5C_decr__age_out ) + || + ( (cache_ptr->resize_ctl).decr_mode == + H5C_decr__age_out_with_threshold + ) + ) + && + ( cache_ptr->epoch_markers_active < + (cache_ptr->resize_ctl).epochs_before_eviction + ) + ) { + + result = H5C__autoadjust__ageout__insert_new_marker(cache_ptr); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "can't insert new epoch marker.") + + } else { + + inserted_epoch_marker = TRUE; + } + } + + /* don't run the cache size decrease code unless the cache size + * increase code is disabled, or the size increase code sees no need + * for action. In either case, status == in_spec2 at this point. + */ + + if ( status == in_spec2 ) { + + switch ( (cache_ptr->resize_ctl).decr_mode ) + { + case H5C_decr__off: + break; + + case H5C_decr__threshold: + if ( hit_rate > (cache_ptr->resize_ctl).upper_hr_threshold ) { + + if ( ! cache_ptr->size_decrease_possible ) { + + status = decrease_disabled2; + + } else if ( cache_ptr->max_cache_size <= + (cache_ptr->resize_ctl).min_size ) { + + HDassert( cache_ptr->max_cache_size == + (cache_ptr->resize_ctl).min_size ); + status = at_min_size2; + + } else { + + new_max_cache_size = (size_t) + (((double)(cache_ptr->max_cache_size)) * + (cache_ptr->resize_ctl).decrement); + + /* clip to min size if necessary */ + if ( new_max_cache_size < + (cache_ptr->resize_ctl).min_size ) { + + new_max_cache_size = + (cache_ptr->resize_ctl).min_size; + } + + /* clip to max decrement if necessary */ + if ( ( (cache_ptr->resize_ctl).apply_max_decrement ) && + ( ((cache_ptr->resize_ctl).max_decrement + + new_max_cache_size) < + cache_ptr->max_cache_size ) ) { + + new_max_cache_size = cache_ptr->max_cache_size - + (cache_ptr->resize_ctl).max_decrement; + } + + status = decrease2; + } + } + break; + + case H5C_decr__age_out_with_threshold: + case H5C_decr__age_out: + if ( ! inserted_epoch_marker ) { + + if ( ! cache_ptr->size_decrease_possible ) { + + status = decrease_disabled2; + + } else { + + result = H5C__autoadjust__ageout(f, + dxpl_id, + cache_ptr, + hit_rate, + &status, + &new_max_cache_size, + write_permitted); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "ageout code failed.") + } + } + } + break; + + default: + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unknown incr_mode.") + } + } + + /* cycle the epoch markers here if appropriate */ + if ( ( ( (cache_ptr->resize_ctl).decr_mode == H5C_decr__age_out ) + || + ( (cache_ptr->resize_ctl).decr_mode == + H5C_decr__age_out_with_threshold + ) + ) + && + ( ! inserted_epoch_marker ) + ) { + + /* move last epoch marker to the head of the LRU list */ + result = H5C__autoadjust__ageout__cycle_epoch_marker(cache_ptr); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "error cycling epoch marker.") + } + } + + if ( ( status == increase2 ) || ( status == decrease2 ) ) { + + old_max_cache_size = cache_ptr->max_cache_size; + old_min_clean_size = cache_ptr->min_clean_size; + + new_min_clean_size = (size_t) + ((double)new_max_cache_size * + ((cache_ptr->resize_ctl).min_clean_fraction)); + + /* new_min_clean_size is of size_t, and thus must be non-negative. + * Hence we have + * + * ( 0 <= new_min_clean_size ). + * + * by definition. + */ + HDassert( new_min_clean_size <= new_max_cache_size ); + HDassert( (cache_ptr->resize_ctl).min_size <= new_max_cache_size ); + HDassert( new_max_cache_size <= (cache_ptr->resize_ctl).max_size ); + + cache_ptr->max_cache_size = new_max_cache_size; + cache_ptr->min_clean_size = new_min_clean_size; + + if ( status == increase2 ) { + + cache_ptr->cache_full = FALSE; + + } else if ( status == decrease2 ) { + + cache_ptr->size_decreased = TRUE; + } + + /* update flash cache size increase fields as appropriate */ + if ( cache_ptr->flash_size_increase_possible ) { + + switch ( (cache_ptr->resize_ctl).flash_incr_mode ) + { + case H5C_flash_incr__off: + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "flash_size_increase_possible but H5C_flash_incr__off?!") + break; + + case H5C_flash_incr__add_space: + cache_ptr->flash_size_increase_threshold = + (size_t) + (((double)(cache_ptr->max_cache_size)) * + ((cache_ptr->resize_ctl).flash_threshold)); + break; + + default: /* should be unreachable */ + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "Unknown flash_incr_mode?!?!?.") + break; + } + } + } + + if ( (cache_ptr->resize_ctl).rpt_fcn != NULL ) { + + (*((cache_ptr->resize_ctl).rpt_fcn)) + (cache_ptr, + H5C__CURR_AUTO_RESIZE_RPT_FCN_VER, + hit_rate, + status, + old_max_cache_size, + new_max_cache_size, + old_min_clean_size, + new_min_clean_size); + } + + if ( H5C_reset_cache_hit_rate_stats(cache_ptr) != SUCCEED ) { + + /* this should be impossible... */ + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_reset_cache_hit_rate_stats failed.") + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C__auto_adjust_cache_size() */ + + +/*------------------------------------------------------------------------- + * + * Function: H5C__autoadjust__ageout + * + * Purpose: Implement the ageout automatic cache size decrement + * algorithm. Note that while this code evicts aged out + * entries, the code does not change the maximum cache size. + * Instead, the function simply computes the new value (if + * any change is indicated) and reports this value in + * *new_max_cache_size_ptr. + * + * Return: Non-negative on success/Negative on failure or if there was + * an attempt to flush a protected item. + * + * + * Programmer: John Mainzer, 11/18/04 + * + * Modifications: + * + * JRM -- 9/9/07 + * Reworked function to support API changes in support of + * metadata cacheing. In essence, the change involved + * removal of arguments that are no longer needed by the + * callbacks, and thus no-longer need be passed through. + * + *------------------------------------------------------------------------- + */ + +static herr_t +H5C__autoadjust__ageout(H5F_t * f, + hid_t dxpl_id, + H5C_t * cache_ptr, + double hit_rate, + enum H5C_resize_status * status_ptr, + size_t * new_max_cache_size_ptr, + hbool_t write_permitted) +{ + herr_t ret_value = SUCCEED; /* Return value */ + herr_t result; + size_t test_size; + + FUNC_ENTER_NOAPI_NOINIT(H5C__autoadjust__ageout) + + HDassert( f ); + HDassert( cache_ptr ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + HDassert( ( status_ptr ) && ( *status_ptr == in_spec2 ) ); + HDassert( ( new_max_cache_size_ptr ) && ( *new_max_cache_size_ptr == 0 ) ); + + /* remove excess epoch markers if any */ + if ( cache_ptr->epoch_markers_active > + (cache_ptr->resize_ctl).epochs_before_eviction ) { + + result = H5C__autoadjust__ageout__remove_excess_markers(cache_ptr); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "can't remove excess epoch markers.") + } + } + + if ( ( (cache_ptr->resize_ctl).decr_mode == H5C_decr__age_out ) + || + ( ( (cache_ptr->resize_ctl).decr_mode == + H5C_decr__age_out_with_threshold + ) + && + ( hit_rate >= (cache_ptr->resize_ctl).upper_hr_threshold ) + ) + ) { + + if ( cache_ptr->max_cache_size > (cache_ptr->resize_ctl).min_size ){ + + /* evict aged out cache entries if appropriate... */ + result = H5C__autoadjust__ageout__evict_aged_out_entries + ( + f, + dxpl_id, + cache_ptr, + write_permitted + ); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "error flushing aged out entries.") + } + + /* ... and then reduce cache size if appropriate */ + if ( cache_ptr->index_size < cache_ptr->max_cache_size ) { + + if ( (cache_ptr->resize_ctl).apply_empty_reserve ) { + + test_size = (size_t)(((double)cache_ptr->index_size) / + (1 - (cache_ptr->resize_ctl).empty_reserve)); + + if ( test_size < cache_ptr->max_cache_size ) { + + *status_ptr = decrease2; + *new_max_cache_size_ptr = test_size; + } + } else { + + *status_ptr = decrease2; + *new_max_cache_size_ptr = cache_ptr->index_size; + } + + if ( *status_ptr == decrease2 ) { + + /* clip to min size if necessary */ + if ( *new_max_cache_size_ptr < + (cache_ptr->resize_ctl).min_size ) { + + *new_max_cache_size_ptr = + (cache_ptr->resize_ctl).min_size; + } + + /* clip to max decrement if necessary */ + if ( ( (cache_ptr->resize_ctl).apply_max_decrement ) && + ( ((cache_ptr->resize_ctl).max_decrement + + *new_max_cache_size_ptr) < + cache_ptr->max_cache_size ) ) { + + *new_max_cache_size_ptr = cache_ptr->max_cache_size - + (cache_ptr->resize_ctl).max_decrement; + } + } + } + } else { + + *status_ptr = at_min_size2; + } + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C__autoadjust__ageout() */ + + +/*------------------------------------------------------------------------- + * + * Function: H5C__autoadjust__ageout__cycle_epoch_marker + * + * Purpose: Remove the oldest epoch marker from the LRU list, + * and reinsert it at the head of the LRU list. Also + * remove the epoch marker's index from the head of the + * ring buffer, and re-insert it at the tail of the ring + * buffer. + * + * Return: SUCCEED on success/FAIL on failure. + * + * Programmer: John Mainzer, 11/22/04 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +static herr_t +H5C__autoadjust__ageout__cycle_epoch_marker(H5C_t * cache_ptr) +{ + herr_t ret_value = SUCCEED; /* Return value */ + int i; + + FUNC_ENTER_NOAPI_NOINIT(H5C__autoadjust__ageout__cycle_epoch_marker) + + HDassert( cache_ptr ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + + if ( cache_ptr->epoch_markers_active <= 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "No active epoch markers on entry?!?!?.") + } + + /* remove the last marker from both the ring buffer and the LRU list */ + + i = cache_ptr->epoch_marker_ringbuf[cache_ptr->epoch_marker_ringbuf_first]; + + cache_ptr->epoch_marker_ringbuf_first = + (cache_ptr->epoch_marker_ringbuf_first + 1) % + (H5C__MAX_EPOCH_MARKERS + 1); + + cache_ptr->epoch_marker_ringbuf_size -= 1; + + if ( cache_ptr->epoch_marker_ringbuf_size < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "ring buffer underflow.") + } + + if ( (cache_ptr->epoch_marker_active)[i] != TRUE ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unused marker in LRU?!?") + } + + H5C__DLL_REMOVE((&((cache_ptr->epoch_markers)[i])), \ + (cache_ptr)->LRU_head_ptr, \ + (cache_ptr)->LRU_tail_ptr, \ + (cache_ptr)->LRU_list_len, \ + (cache_ptr)->LRU_list_size, \ + (FAIL)) + + /* now, re-insert it at the head of the LRU list, and at the tail of + * the ring buffer. + */ + + HDassert( ((cache_ptr->epoch_markers)[i]).addr == (haddr_t)i ); + HDassert( ((cache_ptr->epoch_markers)[i]).next == NULL ); + HDassert( ((cache_ptr->epoch_markers)[i]).prev == NULL ); + + cache_ptr->epoch_marker_ringbuf_last = + (cache_ptr->epoch_marker_ringbuf_last + 1) % + (H5C__MAX_EPOCH_MARKERS + 1); + + (cache_ptr->epoch_marker_ringbuf)[cache_ptr->epoch_marker_ringbuf_last] = i; + + cache_ptr->epoch_marker_ringbuf_size += 1; + + if ( cache_ptr->epoch_marker_ringbuf_size > H5C__MAX_EPOCH_MARKERS ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "ring buffer overflow.") + } + + H5C__DLL_PREPEND((&((cache_ptr->epoch_markers)[i])), \ + (cache_ptr)->LRU_head_ptr, \ + (cache_ptr)->LRU_tail_ptr, \ + (cache_ptr)->LRU_list_len, \ + (cache_ptr)->LRU_list_size, \ + (FAIL)) +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C__autoadjust__ageout__cycle_epoch_marker() */ + + +/*------------------------------------------------------------------------- + * + * Function: H5C__autoadjust__ageout__evict_aged_out_entries + * + * Purpose: Evict clean entries in the cache that haven't + * been accessed for at least + * (cache_ptr->resize_ctl).epochs_before_eviction epochs, + * and flush dirty entries that haven't been accessed for + * that amount of time. + * + * Depending on configuration, the function will either + * flush or evict all such entries, or all such entries it + * encounters until it has freed the maximum amount of space + * allowed under the maximum decrement. + * + * If we are running in parallel mode, writes may not be + * permitted. If so, the function simply skips any dirty + * entries it may encounter. + * + * The function makes no attempt to maintain the minimum + * clean size, as there is no guarantee that the cache size + * will be changed. + * + * If there is no cache size change, the minimum clean size + * constraint will be met through a combination of clean + * entries and free space in the cache. + * + * If there is a cache size reduction, the minimum clean size + * will be re-calculated, and will be enforced the next time + * we have to make space in the cache. + * + * The primary_dxpl_id and secondary_dxpl_id parameters + * specify the dxpl_ids used depending on the value of + * *first_flush_ptr. The idea is to use the primary_dxpl_id + * on the first write in a sequence of writes, and to use + * the secondary_dxpl_id on all subsequent writes. + * + * This is useful in the metadata cache, but may not be + * needed elsewhere. If so, just use the same dxpl_id for + * both parameters. + * + * Observe that this function cannot occasion a read. + * + * Return: Non-negative on success/Negative on failure. + * + * Programmer: John Mainzer, 11/22/04 + * + * Modifications: + * + * JRM -- 9/9/07 + * Reworked function to support API changes in support of + * metadata cacheing. In essence, the change involved + * removal of arguments that are no longer needed by the + * callbacks, and thus no-longer need be passed through. + * + * JRM -- 10/13/07 + * Reworked code to allow it to the function to handle the + * case in which the LRU list is modified out from under the + * function by a serialize function. This can happen if + * the serialize function associated with the entry being + * flushed either accesses the next item in the LRU list, + * or (as Quincey assures me is impossible), it accesses + * an entry not currently in cache, causing the eviction + * of the next entry in the LRU. + * + * We handle this situation by detecting it, and restarting + * the scan of the LRU when it occurs. + * + *------------------------------------------------------------------------- + */ + +static herr_t +H5C__autoadjust__ageout__evict_aged_out_entries(H5F_t * f, + hid_t dxpl_id, + H5C_t * cache_ptr, + hbool_t write_permitted) +{ + herr_t result; + size_t eviction_size_limit; + size_t bytes_evicted = 0; + hbool_t prev_is_dirty = FALSE; + H5C_cache_entry_t * entry_ptr; + H5C_cache_entry_t * next_ptr; + H5C_cache_entry_t * prev_ptr; + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI_NOINIT(H5C__autoadjust__ageout__evict_aged_out_entries) + + HDassert( f ); + HDassert( cache_ptr ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + + /* if there is a limit on the amount that the cache size can be decrease + * in any one round of the cache size reduction algorithm, load that + * limit into eviction_size_limit. Otherwise, set eviction_size_limit + * to the equivalent of infinity. The current size of the index will + * do nicely. + */ + if ( (cache_ptr->resize_ctl).apply_max_decrement ) { + + eviction_size_limit = (cache_ptr->resize_ctl).max_decrement; + + } else { + + eviction_size_limit = cache_ptr->index_size; /* i.e. infinity */ + } + + if ( write_permitted ) { + + entry_ptr = cache_ptr->LRU_tail_ptr; + + while ( ( entry_ptr != NULL ) && + ( (entry_ptr->type)->id != H5C__EPOCH_MARKER_TYPE ) && + ( bytes_evicted < eviction_size_limit ) ) + { + HDassert( ! (entry_ptr->is_protected) ); + + next_ptr = entry_ptr->next; + prev_ptr = entry_ptr->prev; + + if ( prev_ptr != NULL ) { + + prev_is_dirty = prev_ptr->is_dirty; + } + + if ( entry_ptr->is_dirty ) { + + result = H5C_flush_single_entry(f, + dxpl_id, + cache_ptr, + entry_ptr->type, + entry_ptr->addr, + H5C__NO_FLAGS_SET, + FALSE); + } else { + + bytes_evicted += entry_ptr->size; + + result = H5C_flush_single_entry(f, + dxpl_id, + cache_ptr, + entry_ptr->type, + entry_ptr->addr, + H5C__FLUSH_INVALIDATE_FLAG, + TRUE); + } + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ + "unable to flush entry") + } + + if ( prev_ptr != NULL ) { +#ifndef NDEBUG + if ( prev_ptr->magic != H5C__H5C_CACHE_ENTRY_T_MAGIC ) { + + /* something horrible has happened to *prev_ptr -- + * scream and die. + */ + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "*prev_ptr corrupt") + + } else +#endif /* NDEBUG */ + if ( ( prev_ptr->is_dirty != prev_is_dirty ) + || + ( prev_ptr->next != next_ptr ) + || + ( prev_ptr->is_protected ) + || + ( prev_ptr->is_pinned ) ) { + + /* something has happened to the LRU -- start over + * from the tail. + */ + entry_ptr = cache_ptr->LRU_tail_ptr; + + } else { + + entry_ptr = prev_ptr; + + } + } else { + + entry_ptr = NULL; + + } + } /* end while */ + + /* for now at least, don't bother to maintain the minimum clean size, + * as the cache should now be less than its maximum size. Due to + * the vaguries of the cache size reduction algorthim, we may not + * reduce the size of the cache. + * + * If we do, we will calculate a new minimum clean size, which will + * be enforced the next time we try to make space in the cache. + * + * If we don't, no action is necessary, as we have just evicted and/or + * or flushed a bunch of entries and therefore the sum of the clean + * and free space in the cache must be greater than or equal to the + * min clean space requirement (assuming that requirement was met on + * entry). + */ + + } else /* ! write_permitted */ { + + /* since we are not allowed to write, all we can do is evict + * any clean entries that we may encounter before we either + * hit the eviction size limit, or encounter the epoch marker. + * + * If we are operating read only, this isn't an issue, as there + * will not be any dirty entries. + * + * If we are operating in R/W mode, all the dirty entries we + * skip will be flushed the next time we attempt to make space + * when writes are permitted. This may have some local + * performance implications, but it shouldn't cause any net + * slowdown. + */ + + HDassert( H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS ); + + entry_ptr = cache_ptr->LRU_tail_ptr; + + while ( ( entry_ptr != NULL ) && + ( (entry_ptr->type)->id != H5C__EPOCH_MARKER_TYPE ) && + ( bytes_evicted < eviction_size_limit ) ) + { + HDassert( ! (entry_ptr->is_protected) ); + + prev_ptr = entry_ptr->prev; + + if ( ! (entry_ptr->is_dirty) ) { + + result = H5C_flush_single_entry(f, + dxpl_id, + cache_ptr, + entry_ptr->type, + entry_ptr->addr, + H5C__FLUSH_INVALIDATE_FLAG, + TRUE); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ + "unable to flush clean entry") + } + } + /* just skip the entry if it is dirty, as we can't do + * anything with it now since we can't write. + * + * Since all entries are clean, serialize() will no be called, + * and thus we needn't test to see if the LRU has been changed + * out from under us. + */ + + entry_ptr = prev_ptr; + + } /* end while */ + } + + if ( cache_ptr->index_size < cache_ptr->max_cache_size ) { + + cache_ptr->cache_full = FALSE; + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C__autoadjust__ageout__evict_aged_out_entries() */ + + +/*------------------------------------------------------------------------- + * + * Function: H5C__autoadjust__ageout__insert_new_marker + * + * Purpose: Find an unused marker cache entry, mark it as used, and + * insert it at the head of the LRU list. Also add the + * marker's index in the epoch_markers array. + * + * Return: SUCCEED on success/FAIL on failure. + * + * Programmer: John Mainzer, 11/19/04 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +static herr_t +H5C__autoadjust__ageout__insert_new_marker(H5C_t * cache_ptr) +{ + herr_t ret_value = SUCCEED; /* Return value */ + int i; + + FUNC_ENTER_NOAPI_NOINIT(H5C__autoadjust__ageout__insert_new_marker) + + HDassert( cache_ptr ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + + if ( cache_ptr->epoch_markers_active >= + (cache_ptr->resize_ctl).epochs_before_eviction ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "Already have a full complement of markers.") + } + + /* find an unused marker */ + i = 0; + while ( ( (cache_ptr->epoch_marker_active)[i] ) && + ( i < H5C__MAX_EPOCH_MARKERS ) ) + { + i++; + } + + HDassert( i < H5C__MAX_EPOCH_MARKERS ); + + if ( (cache_ptr->epoch_marker_active)[i] != FALSE ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't find unused marker.") + } + + HDassert( ((cache_ptr->epoch_markers)[i]).addr == (haddr_t)i ); + HDassert( ((cache_ptr->epoch_markers)[i]).next == NULL ); + HDassert( ((cache_ptr->epoch_markers)[i]).prev == NULL ); + + (cache_ptr->epoch_marker_active)[i] = TRUE; + + cache_ptr->epoch_marker_ringbuf_last = + (cache_ptr->epoch_marker_ringbuf_last + 1) % + (H5C__MAX_EPOCH_MARKERS + 1); + + (cache_ptr->epoch_marker_ringbuf)[cache_ptr->epoch_marker_ringbuf_last] = i; + + cache_ptr->epoch_marker_ringbuf_size += 1; + + if ( cache_ptr->epoch_marker_ringbuf_size > H5C__MAX_EPOCH_MARKERS ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "ring buffer overflow.") + } + + H5C__DLL_PREPEND((&((cache_ptr->epoch_markers)[i])), \ + (cache_ptr)->LRU_head_ptr, \ + (cache_ptr)->LRU_tail_ptr, \ + (cache_ptr)->LRU_list_len, \ + (cache_ptr)->LRU_list_size, \ + (FAIL)) + + cache_ptr->epoch_markers_active += 1; + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C__autoadjust__ageout__insert_new_marker() */ + + +/*------------------------------------------------------------------------- + * + * Function: H5C__autoadjust__ageout__remove_all_markers + * + * Purpose: Remove all epoch markers from the LRU list and mark them + * as inactive. + * + * Return: SUCCEED on success/FAIL on failure. + * + * Programmer: John Mainzer, 11/22/04 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +static herr_t +H5C__autoadjust__ageout__remove_all_markers(H5C_t * cache_ptr) +{ + herr_t ret_value = SUCCEED; /* Return value */ + int i; + int ring_buf_index; + + FUNC_ENTER_NOAPI_NOINIT(H5C__autoadjust__ageout__remove_all_markers) + + HDassert( cache_ptr ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + + while ( cache_ptr->epoch_markers_active > 0 ) + { + /* get the index of the last epoch marker in the LRU list + * and remove it from the ring buffer. + */ + + ring_buf_index = cache_ptr->epoch_marker_ringbuf_first; + i = (cache_ptr->epoch_marker_ringbuf)[ring_buf_index]; + + cache_ptr->epoch_marker_ringbuf_first = + (cache_ptr->epoch_marker_ringbuf_first + 1) % + (H5C__MAX_EPOCH_MARKERS + 1); + + cache_ptr->epoch_marker_ringbuf_size -= 1; + + if ( cache_ptr->epoch_marker_ringbuf_size < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "ring buffer underflow.") + } + + if ( (cache_ptr->epoch_marker_active)[i] != TRUE ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unused marker in LRU?!?") + } + + /* remove the epoch marker from the LRU list */ + H5C__DLL_REMOVE((&((cache_ptr->epoch_markers)[i])), \ + (cache_ptr)->LRU_head_ptr, \ + (cache_ptr)->LRU_tail_ptr, \ + (cache_ptr)->LRU_list_len, \ + (cache_ptr)->LRU_list_size, \ + (FAIL)) + + /* mark the epoch marker as unused. */ + (cache_ptr->epoch_marker_active)[i] = FALSE; + + HDassert( ((cache_ptr->epoch_markers)[i]).addr == (haddr_t)i ); + HDassert( ((cache_ptr->epoch_markers)[i]).next == NULL ); + HDassert( ((cache_ptr->epoch_markers)[i]).prev == NULL ); + + /* decrement the number of active epoch markers */ + cache_ptr->epoch_markers_active -= 1; + + HDassert( cache_ptr->epoch_markers_active == \ + cache_ptr->epoch_marker_ringbuf_size ); + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C__autoadjust__ageout__remove_all_markers() */ + + +/*------------------------------------------------------------------------- + * + * Function: H5C__autoadjust__ageout__remove_excess_markers + * + * Purpose: Remove epoch markers from the end of the LRU list and + * mark them as inactive until the number of active markers + * equals the the current value of + * (cache_ptr->resize_ctl).epochs_before_eviction. + * + * Return: SUCCEED on success/FAIL on failure. + * + * Programmer: John Mainzer, 11/19/04 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +static herr_t +H5C__autoadjust__ageout__remove_excess_markers(H5C_t * cache_ptr) +{ + herr_t ret_value = SUCCEED; /* Return value */ + int i; + int ring_buf_index; + + FUNC_ENTER_NOAPI_NOINIT(H5C__autoadjust__ageout__remove_excess_markers) + + HDassert( cache_ptr ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + + if ( cache_ptr->epoch_markers_active <= + (cache_ptr->resize_ctl).epochs_before_eviction ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "no excess markers on entry.") + } + + while ( cache_ptr->epoch_markers_active > + (cache_ptr->resize_ctl).epochs_before_eviction ) + { + /* get the index of the last epoch marker in the LRU list + * and remove it from the ring buffer. + */ + + ring_buf_index = cache_ptr->epoch_marker_ringbuf_first; + i = (cache_ptr->epoch_marker_ringbuf)[ring_buf_index]; + + cache_ptr->epoch_marker_ringbuf_first = + (cache_ptr->epoch_marker_ringbuf_first + 1) % + (H5C__MAX_EPOCH_MARKERS + 1); + + cache_ptr->epoch_marker_ringbuf_size -= 1; + + if ( cache_ptr->epoch_marker_ringbuf_size < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "ring buffer underflow.") + } + + if ( (cache_ptr->epoch_marker_active)[i] != TRUE ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unused marker in LRU?!?") + } + + /* remove the epoch marker from the LRU list */ + H5C__DLL_REMOVE((&((cache_ptr->epoch_markers)[i])), \ + (cache_ptr)->LRU_head_ptr, \ + (cache_ptr)->LRU_tail_ptr, \ + (cache_ptr)->LRU_list_len, \ + (cache_ptr)->LRU_list_size, \ + (FAIL)) + + /* mark the epoch marker as unused. */ + (cache_ptr->epoch_marker_active)[i] = FALSE; + + HDassert( ((cache_ptr->epoch_markers)[i]).addr == (haddr_t)i ); + HDassert( ((cache_ptr->epoch_markers)[i]).next == NULL ); + HDassert( ((cache_ptr->epoch_markers)[i]).prev == NULL ); + + /* decrement the number of active epoch markers */ + cache_ptr->epoch_markers_active -= 1; + + HDassert( cache_ptr->epoch_markers_active == \ + cache_ptr->epoch_marker_ringbuf_size ); + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C__autoadjust__ageout__remove_excess_markers() */ + + +/*------------------------------------------------------------------------- + * + * Function: H5C__flash_increase_cache_size + * + * Purpose: If there is not at least new_entry_size - old_entry_size + * bytes of free space in the cache and the current + * max_cache_size is less than (cache_ptr->resize_ctl).max_size, + * perform a flash increase in the cache size and then reset + * the full cache hit rate statistics, and exit. + * + * Return: Non-negative on success/Negative on failure. + * + * Programmer: John Mainzer, 12/31/07 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +static herr_t +H5C__flash_increase_cache_size(H5C_t * cache_ptr, + size_t old_entry_size, + size_t new_entry_size) +{ + size_t new_max_cache_size = 0; + size_t old_max_cache_size = 0; + size_t new_min_clean_size = 0; + size_t old_min_clean_size = 0; + size_t space_needed; + enum H5C_resize_status status = flash_increase2; /* may change */ + double hit_rate; + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI_NOINIT(H5C__flash_increase_cache_size) + HDassert( cache_ptr ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + HDassert( cache_ptr->flash_size_increase_possible ); + HDassert( new_entry_size > cache_ptr->flash_size_increase_threshold ); + HDassert( old_entry_size < new_entry_size ); + + if ( old_entry_size >= new_entry_size ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "old_entry_size >= new_entry_size") + } + + space_needed = new_entry_size - old_entry_size; + + if ( ( (cache_ptr->index_size + space_needed) > + cache_ptr->max_cache_size ) && + ( cache_ptr->max_cache_size < (cache_ptr->resize_ctl).max_size ) ) { + + /* we have work to do */ + + switch ( (cache_ptr->resize_ctl).flash_incr_mode ) + { + case H5C_flash_incr__off: + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "flash_size_increase_possible but H5C_flash_incr__off?!") + break; + + case H5C_flash_incr__add_space: + if ( cache_ptr->index_size < cache_ptr->max_cache_size ) { + + HDassert( (cache_ptr->max_cache_size - + cache_ptr->index_size) + < space_needed ); + space_needed -= cache_ptr->max_cache_size - + cache_ptr->index_size; + } + space_needed = + (size_t)(((double)space_needed) * + (cache_ptr->resize_ctl).flash_multiple); + + new_max_cache_size = cache_ptr->max_cache_size + space_needed; + + break; + + default: /* should be unreachable */ + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "Unknown flash_incr_mode?!?!?.") + break; + } + + if ( new_max_cache_size > (cache_ptr->resize_ctl).max_size ) { + + new_max_cache_size = (cache_ptr->resize_ctl).max_size; + } + + HDassert( new_max_cache_size > cache_ptr->max_cache_size ); + + new_min_clean_size = (size_t) + ((double)new_max_cache_size * + ((cache_ptr->resize_ctl).min_clean_fraction)); + + HDassert( new_min_clean_size <= new_max_cache_size ); + + old_max_cache_size = cache_ptr->max_cache_size; + old_min_clean_size = cache_ptr->min_clean_size; + + cache_ptr->max_cache_size = new_max_cache_size; + cache_ptr->min_clean_size = new_min_clean_size; + + /* update flash cache size increase fields as appropriate */ + HDassert ( cache_ptr->flash_size_increase_possible ); + + switch ( (cache_ptr->resize_ctl).flash_incr_mode ) + { + case H5C_flash_incr__off: + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "flash_size_increase_possible but H5C_flash_incr__off?!") + break; + + case H5C_flash_incr__add_space: + cache_ptr->flash_size_increase_threshold = + (size_t) + (((double)(cache_ptr->max_cache_size)) * + ((cache_ptr->resize_ctl).flash_threshold)); + break; + + default: /* should be unreachable */ + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "Unknown flash_incr_mode?!?!?.") + break; + } + + /* note that we don't cycle the epoch markers. We can + * argue either way as to whether we should, but for now + * we don't. + */ + + if ( (cache_ptr->resize_ctl).rpt_fcn != NULL ) { + + /* get the hit rate for the reporting function. Should still + * be good as we havent reset the hit rate statistics. + */ + if ( H5C_get_cache_hit_rate(cache_ptr, &hit_rate) != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't get hit rate.") + } + + (*((cache_ptr->resize_ctl).rpt_fcn)) + (cache_ptr, + H5C__CURR_AUTO_RESIZE_RPT_FCN_VER, + hit_rate, + status, + old_max_cache_size, + new_max_cache_size, + old_min_clean_size, + new_min_clean_size); + } + + if ( H5C_reset_cache_hit_rate_stats(cache_ptr) != SUCCEED ) { + + /* this should be impossible... */ + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_reset_cache_hit_rate_stats failed.") + } + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C__flash_increase_cache_size() */ + + + +/*------------------------------------------------------------------------- + * Function: H5C_flush_invalidate_cache + * + * Purpose: Flush and destroy the entries contained in the target + * cache. + * + * If the cache contains protected entries, the function will + * fail, as protected entries cannot be either flushed or + * destroyed. However all unprotected entries should be + * flushed and destroyed before the function returns failure. + * + * While pinned entries can usually be flushed, they cannot + * be destroyed. However, they should be unpinned when all + * the entries that reference them have been destroyed (thus + * reduding the pinned entry's reference count to 0, allowing + * it to be unpinned). + * + * If pinned entries are present, the function makes repeated + * passes through the cache, flushing all dirty entries + * (including the pinned dirty entries where permitted) and + * destroying all unpinned entries. This process is repeated + * until either the cache is empty, or the number of pinned + * entries stops decreasing on each pass. + * + * The primary_dxpl_id and secondary_dxpl_id parameters + * specify the dxpl_ids used on the first write occasioned + * by the flush (primary_dxpl_id), and on all subsequent + * writes (secondary_dxpl_id). + * + * Return: Non-negative on success/Negative on failure or if there was + * a request to flush all items and something was protected. + * + * Programmer: John Mainzer + * 3/24/065 + * + * Modifications: + * + * To support the fractal heap, the cache must now deal with + * entries being dirtied, resized, and/or renamed inside + * flush callbacks. Updated function to support this. + * + * Reworked argument list and code to reflect the + * removal of the secondary dxpl id, and the decision + * to store f in H5C_t, removing the need to pass it + * in all the time. + * -- JRM 8/27/06 + * + * Added code to detect and manage the case in which a + * flush callback changes the s-list out from under + * the function. The only way I can think of in which this + * can happen is if a flush function loads an entry + * into the cache that isn't there already. Quincey tells + * me that this will never happen, but I'm not sure I + * believe him. + * + * Note that this is a pretty bad scenario if it ever + * happens. The code I have added should allow us to + * handle the situation under all but the worst conditions, + * but one can argue that I should just scream and die if I + * ever detect the condidtion. + * + * -- JRM 10/13/07 + * + *------------------------------------------------------------------------- + */ +static herr_t +H5C_flush_invalidate_cache(const H5F_t * f, + hid_t dxpl_id, + H5C_t * cache_ptr, + unsigned flags) +{ + herr_t status; + hbool_t done = FALSE; + int32_t protected_entries = 0; + int32_t i; + int32_t cur_pel_len; + int32_t old_pel_len; + int32_t passes = 0; + unsigned cooked_flags; + H5SL_node_t * node_ptr = NULL; + H5C_cache_entry_t * entry_ptr = NULL; + H5C_cache_entry_t * next_entry_ptr = NULL; +#if H5C_DO_SANITY_CHECKS + int64_t actual_slist_len = 0; + int64_t initial_slist_len = 0; + size_t actual_slist_size = 0; + size_t initial_slist_size = 0; +#endif /* H5C_DO_SANITY_CHECKS */ + herr_t ret_value = SUCCEED; + + FUNC_ENTER_NOAPI(H5C_flush_invalidate_cache, FAIL) + + HDassert( f ); + HDassert( cache_ptr ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + HDassert( cache_ptr->skip_file_checks || f ); + HDassert( cache_ptr->slist_ptr ); + + /* Filter out the flags that are not relevant to the flush/invalidate. + * At present, only the H5C__FLUSH_CLEAR_ONLY_FLAG is kept. + */ + cooked_flags = flags & H5C__FLUSH_CLEAR_ONLY_FLAG; + + /* remove ageout markers if present */ + if ( cache_ptr->epoch_markers_active > 0 ) { + + status = H5C__autoadjust__ageout__remove_all_markers(cache_ptr); + + if ( status != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "error removing all epoch markers.") + } + } + + /* The flush proceedure here is a bit strange. + * + * In the outer while loop we make at least one pass through the + * cache, and then repeat until either all the pinned entries + * unpin themselves, or until the number of pinned entries stops + * declining. In this later case, we scream and die. + * + * Since the fractal heap can dirty, resize, and/or rename entries + * in is flush callback, it is possible that the cache will still + * contain dirty entries at this point. If so, we must make up to + * H5C__MAX_PASSES_ON_FLUSH more passes through the skip list + * to allow it to empty. If is is not empty at this point, we again + * scream and die. + * + * Further, since clean entries can be dirtied, resized, and/or renamed + * as the result of a flush call back (either the entries own, or that + * for some other cache entry), we can no longer promise to flush + * the cache entries in increasing address order. + * + * Instead, we just do the best we can -- making a pass through + * the skip list, and then a pass through the "clean" entries, and + * then repeating as needed. Thus it is quite possible that an + * entry will be evicted from the cache only to be re-loaded later + * in the flush process (From what Quincey tells me, the pin + * mechanism makes this impossible, but even it it is true now, + * we shouldn't count on it in the future.) + * + * The bottom line is that entries will probably be flushed in close + * to increasing address order, but there are no guarantees. + */ + + cur_pel_len = cache_ptr->pel_len; + old_pel_len = cache_ptr->pel_len; + + while ( ! done ) + { + /* first, try to flush-destroy any dirty entries. Do this by + * making a scan through the slist. Note that new dirty entries + * may be created by the flush call backs. Thus it is possible + * that the slist will not be empty after we finish the scan. + */ + + if ( cache_ptr->slist_len == 0 ) { + + node_ptr = NULL; + next_entry_ptr = NULL; + HDassert( cache_ptr->slist_size == 0 ); + + } else { + + node_ptr = H5SL_first(cache_ptr->slist_ptr); + + if ( node_ptr == NULL ) { + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "slist_len != 0 && node_ptr == NULL"); + } + + next_entry_ptr = (H5C_cache_entry_t *)H5SL_item(node_ptr); + + if ( next_entry_ptr == NULL ) { + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "next_entry_ptr == NULL 1 ?!?!"); + } +#ifndef NDEBUG + HDassert( next_entry_ptr->magic == + H5C__H5C_CACHE_ENTRY_T_MAGIC ); +#endif /* NDEBUG */ + HDassert( next_entry_ptr->is_dirty ); + HDassert( next_entry_ptr->in_slist ); + + } + +#if H5C_DO_SANITY_CHECKS + /* Depending on circumstances, H5C_flush_single_entry() will + * remove dirty entries from the slist as it flushes them. + * Thus for sanity checks we must make note of the initial + * slist length and size before we do any flushes. + */ + initial_slist_len = cache_ptr->slist_len; + initial_slist_size = cache_ptr->slist_size; + + /* There is also the possibility that entries will be + * dirtied, resized, and/or renamed as the result of + * calls to the flush callbacks. We use the slist_len_increase + * and slist_size_increase increase fields in struct H5C_t + * to track these changes for purpose of sanity checking. + * To this end, we must zero these fields before we start + * the pass through the slist. + */ + cache_ptr->slist_len_increase = 0; + cache_ptr->slist_size_increase = 0; + + /* Finally, reset the actual_slist_len and actual_slist_size + * fields to zero, as these fields are used to accumulate + * the slist lenght and size that we see as we scan through + * the slist. + */ + actual_slist_len = 0; + actual_slist_size = 0; +#endif /* H5C_DO_SANITY_CHECKS */ + + while ( node_ptr != NULL ) + { + entry_ptr = next_entry_ptr; + + /* With the advent of the fractal heap, it is possible + * that the serialize callback will dirty and/or resize + * other entries in the cache. In particular, while + * Quincey has promised me that this will never happen, + * it is possible that the serialize callback for an + * entry may protect an entry that is not in the cache, + * perhaps causing the cache to flush and possibly + * evict the entry associated with node_ptr to make + * space for the new entry. + * + * Thus we do a bit of extra sanity checking on entry_ptr, + * and break out of this scan of the skip list if we + * detect major problems. We have a bit of leaway on the + * number of passes though the skip list, so this shouldn't + * be an issue in the flush in and of itself, as it should + * be all but impossible for this to happen more than once + * in any flush. + * + * Observe that that breaking out of the scan early + * shouldn't break the sanity checks just after the end + * of this while loop. + * + * If an entry has merely been marked clean and removed from + * the s-list, we simply break out of the scan. + * + * If the entry has been evicted, we flag an error and + * exit. + */ +#ifndef NDEBUG + if ( entry_ptr->magic != H5C__H5C_CACHE_ENTRY_T_MAGIC ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "entry_ptr->magic is invalid ?!?!"); + + } else +#endif /* NDEBUG */ + if ( ( ! entry_ptr->is_dirty ) || + ( ! entry_ptr->in_slist ) ) { + + /* the s-list has been modified out from under us. + * break out of the loop. + */ + break; + } + + /* increment node pointer now, before we delete its target + * from the slist. + */ + node_ptr = H5SL_next(node_ptr); + + if ( node_ptr != NULL ) { + + next_entry_ptr = (H5C_cache_entry_t *)H5SL_item(node_ptr); + + if ( next_entry_ptr == NULL ) { + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "next_entry_ptr == NULL 2 ?!?!"); + } +#ifndef NDEBUG + HDassert( next_entry_ptr->magic == + H5C__H5C_CACHE_ENTRY_T_MAGIC ); +#endif /* NDEBUG */ + HDassert( next_entry_ptr->is_dirty ); + HDassert( next_entry_ptr->in_slist ); + + } else { + + next_entry_ptr = NULL; + } + + /* Note that we now remove nodes from the slist as we flush + * the associated entries, instead of leaving them there + * until we are done, and then destroying all nodes in + * the slist. + * + * While this optimization used to be easy, with the possibility + * of new entries being added to the slist in the midst of the + * flush, we must keep the slist in cannonical form at all + * times. + */ + + HDassert( entry_ptr != NULL ); + HDassert( entry_ptr->in_slist ); + +#if H5C_DO_SANITY_CHECKS + /* update actual_slist_len & actual_slist_size before + * the flush. Note that the entry will be removed + * from the slist after the flush, and thus may be + * resized by the flush callback. This is OK, as + * we will catch the size delta in + * cache_ptr->slist_size_increase. + * + * Note that we include pinned entries in this count, even + * though we will not actually flush them. + */ + actual_slist_len++; + actual_slist_size += entry_ptr->size; +#endif /* H5C_DO_SANITY_CHECKS */ + + if ( entry_ptr->is_protected ) { + + /* we have major problems -- but lets flush + * everything we can before we flag an error. + */ + protected_entries++; + + } else if ( entry_ptr->is_pinned ) { + + /* Test to see if we are can flush the entry now. + * If we can, go ahead and flush, but don't tell + * H5C_flush_single_entry() to destroy the entry + * as pinned entries can't be evicted. + */ + if ( TRUE ) { /* When we get to multithreaded cache, + * we will need either locking code, and/or + * a test to see if the entry is in flushable + * condition here. + */ + + status = H5C_flush_single_entry(f, + dxpl_id, + cache_ptr, + entry_ptr->type, + entry_ptr->addr, + H5C__NO_FLAGS_SET, + FALSE); + if ( status < 0 ) { + + /* This shouldn't happen -- if it does, we are toast + * so just scream and die. + */ + + HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ + "dirty pinned entry flush failed.") + } + } + } else { + + status = H5C_flush_single_entry(f, + dxpl_id, + cache_ptr, + entry_ptr->type, + entry_ptr->addr, + (cooked_flags | + H5C__FLUSH_INVALIDATE_FLAG), + TRUE); + if ( status < 0 ) { + + /* This shouldn't happen -- if it does, we are toast so + * just scream and die. + */ + + HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ + "dirty entry flush destroy failed.") + } + } + + } /* end while loop scanning skip list */ + +#if H5C_DO_SANITY_CHECKS + /* It is possible that entries were added to the slist during + * the scan, either before or after scan pointer. The following + * asserts take this into account. + * + * Don't bother with the sanity checks if node_ptr != NULL, as + * in this case we broke out of the loop because it got changed + * out from under us. + */ + + if ( node_ptr == NULL ) { + + HDassert( (actual_slist_len + cache_ptr->slist_len) == + (initial_slist_len + cache_ptr->slist_len_increase) ); + HDassert( (actual_slist_size + cache_ptr->slist_size) == + (initial_slist_size + cache_ptr->slist_size_increase) ); + } +#endif /* H5C_DO_SANITY_CHECKS */ + + /* Since we are doing a destroy, we must make a pass through + * the hash table and try to flush - destroy all entries that + * remain. + * + * It used to be that all entries remaining in the cache at + * this point had to be clean, but with the fractal heap mods + * this may not be the case. If so, we will flush entries out + * of increasing address order. + * + * Writes to disk are possible here. + */ + for ( i = 0; i < H5C__HASH_TABLE_LEN; i++ ) + { + next_entry_ptr = cache_ptr->index[i]; + + while ( next_entry_ptr != NULL ) + { + entry_ptr = next_entry_ptr; +#ifndef NDEBUG + HDassert( entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC ); +#endif /* NDEBUG */ + next_entry_ptr = entry_ptr->ht_next; +#ifndef NDEBUG + HDassert ( ( next_entry_ptr == NULL ) || + ( next_entry_ptr->magic == + H5C__H5C_CACHE_ENTRY_T_MAGIC ) ); +#endif /* NDEBUG */ + if ( entry_ptr->is_protected ) { + + /* we have major problems -- but lets flush and destroy + * everything we can before we flag an error. + */ + protected_entries++; + + if ( ! entry_ptr->in_slist ) { + + HDassert( !(entry_ptr->is_dirty) ); + } + } else if ( ! ( entry_ptr->is_pinned ) ) { + + status = + H5C_flush_single_entry(f, + dxpl_id, + cache_ptr, + entry_ptr->type, + entry_ptr->addr, + (cooked_flags | + H5C__FLUSH_INVALIDATE_FLAG), + TRUE); + if ( status < 0 ) { + + /* This shouldn't happen -- if it does, we are toast so + * just scream and die. + */ + + HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ + "Entry flush destroy failed.") + } + } + /* We can't do anything if the entry is pinned. The + * hope is that the entry will be unpinned as the + * result of destroys of entries that reference it. + * + * We detect this by noting the change in the number + * of pinned entries from pass to pass. If it stops + * shrinking before it hits zero, we scream and die. + */ + + /* if the serialize function on the entry we last evicted + * loaded an entry into cache (as Quincey has promised me + * it never will), and if the cache was full, it is + * possible that *nexte_entry_ptr was flushed or evicted. + * + * Test to see if this happened here, and set next_entry_ptr + * to NULL if it did. Note that if this test is triggred, + * we are accessing a deallocated piece of dynamically + * allocated memory, so we just scream and die. + */ +#ifndef NDEBUG + if ( ( next_entry_ptr != NULL ) && + ( next_entry_ptr->magic != + H5C__H5C_CACHE_ENTRY_T_MAGIC ) ) { + + /* Something horrible has happened to + * *next_entry_ptr -- scream and die. + */ + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "next_entry_ptr->magic is invalid?!?!?.") + } +#endif /* NDEBUG */ + } /* end while loop scanning hash table bin */ + } /* end for loop scanning hash table */ + + old_pel_len = cur_pel_len; + cur_pel_len = cache_ptr->pel_len; + + if ( ( cur_pel_len > 0 ) && ( cur_pel_len >= old_pel_len ) ) { + + /* The number of pinned entries is positive, and it is not + * declining. Scream and die. + */ + + HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ + "Can't unpin all pinned entries 1.") + + } else if ( ( cur_pel_len == 0 ) && ( old_pel_len == 0 ) ) { + + /* increment the pass count */ + passes++; + } + + if ( passes >= H5C__MAX_PASSES_ON_FLUSH ) { + + /* we have exceeded the maximum number of passes through the + * cache to flush and destroy all entries. Scream and die. + */ + + HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ + "Maximum passes on flush exceeded.") + } + + if ( cache_ptr->index_len <= 0 ) { + + done = TRUE; + HDassert( cache_ptr->index_size == 0 ); + HDassert( cache_ptr->slist_len == 0 ); + HDassert( cache_ptr->slist_size == 0 ); + HDassert( cache_ptr->pel_len == 0 ); + HDassert( cache_ptr->pel_size == 0 ); + HDassert( cache_ptr->pl_len == 0 ); + HDassert( cache_ptr->pl_size == 0 ); + HDassert( cache_ptr->LRU_list_len == 0 ); + HDassert( cache_ptr->LRU_list_size == 0 ); + } + + } /* main while loop */ + + HDassert( protected_entries <= cache_ptr->pl_len ); + + if ( protected_entries > 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ + "Cache has protected entries.") + + } else if ( cur_pel_len > 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ + "Can't unpin all pinned entries 2.") + + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_flush_invalidate_cache() */ + + +/*------------------------------------------------------------------------- + * + * Function: H5C_flush_single_entry + * + * Purpose: Flush or clear (and evict if requested) the cache entry + * with the specified address and type. If the type is NULL, + * any unprotected entry at the specified address will be + * flushed (and possibly evicted). + * + * Attempts to flush a protected entry will result in an + * error. + * + * *first_flush_ptr should be true if only one + * flush is contemplated before the next load, or if this + * is the first of a sequence of flushes that will be + * completed before the next load. *first_flush_ptr is set + * to false if a flush actually takes place, and should be + * left false until the end of the sequence. + * + * The primary_dxpl_id is used if *first_flush_ptr is TRUE + * on entry, and a flush actually takes place. The + * secondary_dxpl_id is used in any subsequent flush where + * *first_flush_ptr is FALSE on entry. + * + * If the H5C__FLUSH_INVALIDATE_FLAG flag is set, the entry will + * be cleared and not flushed -- in the case *first_flush_ptr, + * primary_dxpl_id, and secondary_dxpl_id are all irrelevent, + * and the call can't be part of a sequence of flushes. + * + * If the caller knows the address of the TBBT node at + * which the target entry resides, it can avoid a lookup + * by supplying that address in the tgt_node_ptr parameter. + * If this parameter is NULL, the function will do a TBBT + * search for the entry instead. + * + * The function does nothing silently if there is no entry + * at the supplied address, or if the entry found has the + * wrong type. + * + * Return: Non-negative on success/Negative on failure or if there was + * an attempt to flush a protected item. + * + * Programmer: John Mainzer, 5/5/04 + * + * Modifications: + * + * JRM -- 7/21/04 + * Updated function for the addition of the hash table. + * + * QAK -- 11/26/04 + * Updated function for the switch from TBBTs to skip lists. + * + * JRM -- 1/6/05 + * Updated function to reset the flush_marker field. + * Also replace references to H5F_FLUSH_INVALIDATE and + * H5F_FLUSH_CLEAR_ONLY with references to + * H5C__FLUSH_INVALIDATE_FLAG and H5C__FLUSH_CLEAR_ONLY_FLAG + * respectively. + * + * JRM -- 6/24/05 + * Added code to remove dirty entries from the slist after + * they have been flushed. Also added a sanity check that + * will scream if we attempt a write when writes are + * completely disabled. + * + * JRM -- 7/5/05 + * Added code to call the new log_flush callback whenever + * a dirty entry is written to disk. Note that the callback + * is not called if the H5C__FLUSH_CLEAR_ONLY_FLAG is set, + * as there is no write to file in this case. + * + * JRM -- 8/21/06 + * Added code maintaining the flush_in_progress and + * destroy_in_progress fields in H5C_cache_entry_t. + * + * Also added flush_flags parameter to the call to + * type_ptr->flush() so that the flush routine can report + * whether the entry has been resized or renamed. Added + * code using the flush_flags variable to detect the case + * in which the target entry is resized during flush, and + * update the caches data structures accordingly. + * + * + * JRM -- 3/29/07 + * Added sanity checks on the new is_read_only and + * ro_ref_count fields. + * + * JRM -- 6/25/07 + * Rewrite of function to use the new metadata cache callback + * functions. These functions move all metadata file I/O into + * the cache proper, which is necessary for metadata journaling. + * + * To date, the functions of the H5C__FLUSH_INVALIDATE_FLAG + * and H5C__FLUSH_CLEAR_ONLY_FLAG have not been documented + * in H5C, as these flags were just passed through to the + * client callbacks. As much of the callback functionality + * is now in the cache, the function of these flags should + * be documented explicitly here in H5C. + * + * If the H5C__FLUSH_INVALIDATE_FLAG is set, the entry is to + * be written to disk if dirty, and then evicted from the + * cache and discarded. As an optimization, the destroyed + * is deleted from the slist only on request. + * + * If the H5C__FLUSH_CLEAR_ONLY_FLAG is set, the entry is + * to be marked clean if it is dirty. Under no circumstances + * will it be written to disk. + * + * If both the H5C__FLUSH_INVALIDATE_FLAG and the + * H5C__FLUSH_CLEAR_ONLY_FLAG are set, the entry is marked + * clean and then evicted from the cache without writing + * to disk. If dirty, the entry is removed from the slist + * or not as requested. + * + * JRM -- 3/31/08 + * If journaling is enabled, modified function to remove + * the target entry from the transaction list on a clear. + * Also added some sanity checks. + * + *------------------------------------------------------------------------- + */ + +static herr_t +H5C_flush_single_entry(const H5F_t * f, + hid_t dxpl_id, + H5C_t * cache_ptr, + const H5C_class_t * type_ptr, + haddr_t addr, + unsigned flags, + hbool_t del_entry_from_slist_on_destroy) +{ + hbool_t destroy; + hbool_t clear_only; + hbool_t was_dirty; + herr_t ret_value = SUCCEED; /* Return value */ + herr_t status; + int type_id; + unsigned serialize_flags = 0; + haddr_t new_addr; + size_t new_len; + void * new_image_ptr; + H5C_cache_entry_t * entry_ptr = NULL; + + FUNC_ENTER_NOAPI_NOINIT(H5C_flush_single_entry) + + HDassert( f ); + HDassert( cache_ptr ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + HDassert( type_ptr ); + HDassert( H5F_addr_defined(addr) ); + + destroy = ( (flags & H5C__FLUSH_INVALIDATE_FLAG) != 0 ); + clear_only = ( (flags & H5C__FLUSH_CLEAR_ONLY_FLAG) != 0); + + + /* attempt to find the target entry in the hash table */ + H5C__SEARCH_INDEX(cache_ptr, addr, entry_ptr, FAIL) + + +#if H5C_DO_SANITY_CHECKS + if ( entry_ptr != NULL ) { + + HDassert( ! ( ( destroy ) && ( entry_ptr->is_pinned ) ) ); + + if ( entry_ptr->in_slist ) { + + if ( ( ( entry_ptr->flush_marker ) && ( ! entry_ptr->is_dirty ) ) + || + ( entry_ptr->addr != addr ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "entry in slist failed sanity checks.") + } + } else { + + if ( ( entry_ptr->is_dirty ) || + ( entry_ptr->flush_marker ) || + ( entry_ptr->addr != addr ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "entry failed sanity checks.") + } + } + } +#if 0 + /* this should be useful for debugging from time to time. + * lets leave it in for now. -- JRM 12/15/04 + */ + else { + HDfprintf(stdout, + "H5C_flush_single_entry(): non-existant entry. addr = 0x%lx\n", + (long)addr); + HDfflush(stdout); + } +#endif +#endif /* H5C_DO_SANITY_CHECKS */ + + + if ( ( entry_ptr != NULL ) && ( entry_ptr->is_protected ) ) + { + + /* Attempt to flush a protected entry -- scream and die. */ + HGOTO_ERROR(H5E_CACHE, H5E_PROTECT, FAIL, \ + "Attempt to flush a protected entry.") + } + + + if ( ( entry_ptr != NULL ) && + ( ( type_ptr == NULL ) || ( type_ptr->id == entry_ptr->type->id ) ) ) + { + /* we have work to do */ + + /* We will set flush_in_progress back to FALSE at the end if the + * entry still exists at that point. + */ + entry_ptr->flush_in_progress = TRUE; + +#ifdef H5_HAVE_PARALLEL +#ifndef NDEBUG + + /* If MPI based VFD is used, do special parallel I/O sanity checks. + * Note that we only do these sanity checks when the clear_only flag + * is not set, and the entry to be flushed is dirty. Don't bother + * otherwise as no file I/O can result. + */ + if ( ( ! clear_only ) && + ( entry_ptr->is_dirty ) && + ( IS_H5FD_MPI(f) ) ) { + + H5P_genplist_t *dxpl; /* Dataset transfer property list */ + H5FD_mpio_xfer_t xfer_mode; /* I/O xfer mode property value */ + + /* Get the dataset transfer property list */ + if ( NULL == (dxpl = H5I_object(dxpl_id)) ) { + + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, \ + "not a dataset creation property list") + } + + /* Get the transfer mode property */ + if( H5P_get(dxpl, H5D_XFER_IO_XFER_MODE_NAME, &xfer_mode) < 0 ) { + + HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, \ + "can't retrieve xfer mode") + } + + /* Sanity check transfer mode */ + /* I'm surprised that this sanity check is working at + * present -- will need to look into it at some point. + * + * JRM -- 7/7/07 + */ + + HDassert( xfer_mode == H5FD_MPIO_COLLECTIVE ); + } + +#endif /* NDEBUG */ +#endif /* H5_HAVE_PARALLEL */ + + was_dirty = entry_ptr->is_dirty; + type_id = entry_ptr->type->id; + + entry_ptr->flush_marker = FALSE; + + if ( clear_only ) { + H5C__UPDATE_STATS_FOR_CLEAR(cache_ptr, entry_ptr) + } else { + H5C__UPDATE_STATS_FOR_FLUSH(cache_ptr, entry_ptr) + } + + if ( destroy ) { + H5C__UPDATE_STATS_FOR_EVICTION(cache_ptr, entry_ptr) + } + + /* Always remove the entry from the hash table on a destroy. On a + * flush with destroy, it is cheaper to discard the skip list all at + * once rather than remove the entries one by one, so we only delete + * from the slist only if requested. + * + * Note that it is possible that the entry will be renamed during + * its call to flush. This will upset H5C_rename_entry() if we + * don't tell it that it doesn't have to worry about updating the + * index and SLIST. Use the destroy_in_progress field for this + * purpose. + */ + if ( destroy ) { + + entry_ptr->destroy_in_progress = TRUE; + + H5C__DELETE_FROM_INDEX(cache_ptr, entry_ptr) + + if ( ( entry_ptr->in_slist ) && + ( del_entry_from_slist_on_destroy ) ) { + + H5C__REMOVE_ENTRY_FROM_SLIST(cache_ptr, entry_ptr) + } + } + + + /* Update the replacement policy for the flush or eviction. */ + if ( destroy ) { /* AKA eviction */ + +#if 0 /* JRM */ + /* This test code may come in handy -- lets keep it for a while. + * + * Note that it will cause spurious errors in the serial case + * unless we are maintaining the clean and dirty LRU lists. + */ + { + if ( entry_ptr->is_dirty ) + { + if ( cache_ptr->dLRU_head_ptr == NULL ) + HDfprintf(stdout, + "%s: cache_ptr->dLRU_head_ptr == NULL.\n", + FUNC); + + if ( cache_ptr->dLRU_tail_ptr == NULL ) + HDfprintf(stdout, + "%s: cache_ptr->dLRU_tail_ptr == NULL.\n", + FUNC); + + if ( cache_ptr->dLRU_list_len <= 0 ) + HDfprintf(stdout, + "%s: cache_ptr->dLRU_list_len <= 0.\n", + FUNC); + + if ( cache_ptr->dLRU_list_size <= 0 ) + HDfprintf(stdout, + "%s: cache_ptr->dLRU_list_size <= 0.\n", + FUNC); + + if ( cache_ptr->dLRU_list_size < entry_ptr->size ) + HDfprintf(stdout, + "%s: cache_ptr->dLRU_list_size < entry_ptr->size.\n", + FUNC); + + if ( ( (cache_ptr->dLRU_list_size) == entry_ptr->size ) && + ( ! ( (cache_ptr->dLRU_list_len) == 1 ) ) ) + HDfprintf(stdout, + "%s: dLRU_list_size == size && dLRU_list_len != 1\n", + FUNC); + + if ( ( entry_ptr->aux_prev == NULL ) && + ( cache_ptr->dLRU_head_ptr != entry_ptr ) ) + HDfprintf(stdout, + "%s: entry_ptr->aux_prev == NULL && dLRU_head_ptr != entry_ptr\n", + FUNC); + + if ( ( entry_ptr->aux_next == NULL ) && + ( cache_ptr->dLRU_tail_ptr != entry_ptr ) ) + HDfprintf(stdout, + "%s: entry_ptr->aux_next == NULL && dLRU_tail_ptr != entry_ptr\n", + FUNC); + + if ( ( cache_ptr->dLRU_list_len == 1 ) && + ( ! ( ( cache_ptr->dLRU_head_ptr == entry_ptr ) && + ( cache_ptr->dLRU_tail_ptr == entry_ptr ) && + ( entry_ptr->aux_next == NULL ) && + ( entry_ptr->aux_prev == NULL ) && + ( cache_ptr->dLRU_list_size == entry_ptr->size ) + ) + ) + ) + { + HDfprintf(stdout, + "%s: single entry dlru sanity check fails\n", + FUNC); + } + + } + else + { + if ( cache_ptr->cLRU_head_ptr == NULL ) + HDfprintf(stdout, + "%s: cache_ptr->cLRU_head_ptr == NULL.\n", + FUNC); + + if ( cache_ptr->cLRU_tail_ptr == NULL ) + HDfprintf(stdout, + "%s: cache_ptr->cLRU_tail_ptr == NULL.\n", + FUNC); + + if ( cache_ptr->cLRU_list_len <= 0 ) + HDfprintf(stdout, + "%s: cache_ptr->cLRU_list_len <= 0.\n", + FUNC); + + if ( cache_ptr->cLRU_list_size <= 0 ) + HDfprintf(stdout, + "%s: cache_ptr->cLRU_list_size <= 0.\n", + FUNC); + + if ( cache_ptr->cLRU_list_size < entry_ptr->size ) + HDfprintf(stdout, + "%s: cache_ptr->cLRU_list_size < entry_ptr->size.\n", + FUNC); + + if ( ( (cache_ptr->cLRU_list_size) == entry_ptr->size ) && + ( ! ( (cache_ptr->cLRU_list_len) == 1 ) ) ) + HDfprintf(stdout, + "%s: cLRU_list_size == size && cLRU_list_len != 1\n", + FUNC); + + if ( ( entry_ptr->aux_prev == NULL ) && + ( cache_ptr->cLRU_head_ptr != entry_ptr ) ) + HDfprintf(stdout, "%s: entry_ptr->aux_prev == NULL && cLRU_head_ptr != entry_ptr\n", FUNC); + + if ( ( entry_ptr->aux_next == NULL ) && + ( cache_ptr->cLRU_tail_ptr != entry_ptr ) ) + HDfprintf(stdout, "%s: entry_ptr->aux_next == NULL && cLRU_tail_ptr != entry_ptr\n", FUNC); + + if ( ( cache_ptr->cLRU_list_len == 1 ) && + ( ! ( ( cache_ptr->cLRU_head_ptr == entry_ptr ) && + ( cache_ptr->cLRU_tail_ptr == entry_ptr ) && + ( entry_ptr->aux_next == NULL ) && + ( entry_ptr->aux_prev == NULL ) && + ( cache_ptr->cLRU_list_size == entry_ptr->size ) + ) + ) + ) + { + HDfprintf(stdout, + "%s: single entry clru sanity check fails\n", + FUNC); + } + } + } +#endif /* JRM */ + + H5C__UPDATE_RP_FOR_EVICTION(cache_ptr, entry_ptr, FAIL) + + } else { + + /* If journaling is enabled, the target entry is being cleared, + * and it is on the transaction list, remove it from the transaction + * list and set its last_trans field to zero. + * + * Must do this now, as otherwise H5C__UPDATE_RP_FOR_FLUSH may + * scream incorrectly about flushing an entry with a pending + * journal write. + */ + if ( clear_only ) { + H5C__UPDATE_TL_FOR_ENTRY_CLEAR(cache_ptr, entry_ptr, FAIL); + } + + /* We are either doing a flush or a clear. + * + * A clear and a flush are the same from the point of view of + * the replacement policy and the slist. Hence no + * differentiation between them. + * JRM -- 7/7/07 + */ + + H5C__UPDATE_RP_FOR_FLUSH(cache_ptr, entry_ptr, FAIL) + + if ( entry_ptr->in_slist ) + { + H5C__REMOVE_ENTRY_FROM_SLIST(cache_ptr, entry_ptr) + } + } + + + /* Clear the dirty flag only, if requested */ + if ( clear_only ) + { + if ( entry_ptr->is_dirty ) + { +#ifndef NDEBUG + /* only call the clear_dirty_bits callback if debugging + * is enabled. + */ + if ( entry_ptr->type->clear_dirty_bits && entry_ptr->type->clear_dirty_bits(addr, + entry_ptr->size, + (void *)entry_ptr) + != SUCCEED ) + { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ + "clear_dirty_bits() failed.") + } +#endif /* NDEBUG */ + } + entry_ptr->is_dirty = FALSE; + + } + else if ( entry_ptr->is_dirty ) + { + /* The entry is dirty, and we are doing either a flush, + * or a flush destroy. In either case, serialize the + * entry and write it to disk. + * + * If the serialize function changes the size or location + * of the entry, and we are not doing a flush destroy, we + * will have to touch up the cache to account for the + * change(s). + */ + +#if H5C_DO_SANITY_CHECKS + if ( ( cache_ptr->check_write_permitted == NULL ) && + ( ! (cache_ptr->write_permitted) ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "Write when writes are always forbidden!?!?!") + } +#endif /* H5C_DO_SANITY_CHECKS */ + + if ( entry_ptr->image_ptr == NULL ) + { + entry_ptr->image_ptr = H5MM_malloc(entry_ptr->size); + + if ( entry_ptr->image_ptr == NULL ) + { + + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \ + "memory allocation failed for on disk image buffer.") + } + } + + if ( ! ( entry_ptr->image_up_to_date ) ) { + + if ( entry_ptr->type->serialize(f, + dxpl_id, + entry_ptr->addr, + entry_ptr->size, + entry_ptr->image_ptr, + (void *)entry_ptr, + &serialize_flags, + &new_addr, + &new_len, + &new_image_ptr) != SUCCEED ) + { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ + "unable to serialize entry") + } + + if ( serialize_flags != 0 ) + { + + /* Check for unexpected flags from serialize callback */ + if(serialize_flags & ~(H5C__SERIALIZE_RESIZED_FLAG | H5C__SERIALIZE_RENAMED_FLAG)) + HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unknown serialize flag(s)") + + if ( destroy ) + { + if ( cache_ptr->mdj_enabled ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "rename/resize on destroy when journaling enabled.") + } + + /* We have already removed the entry from the + * cache's data structures, so no need to update + * them for the re-size and/or rename. All we need + * to do is update the cache entry so we will have + * the correct values when we actually write the + * image of the entry to disk. + * + * Note that if the serialize function changes the + * size of the disk image of the entry, it must + * deallocate the old image, and allocate a new. + */ + + if(serialize_flags & H5C__SERIALIZE_RESIZED_FLAG) { + H5C__UPDATE_STATS_FOR_ENTRY_SIZE_CHANGE(cache_ptr, \ + entry_ptr, \ + new_len) + + /* Check for resize+rename */ + if(serialize_flags & H5C__SERIALIZE_RENAMED_FLAG) { + H5C__UPDATE_STATS_FOR_RENAME(cache_ptr, \ + entry_ptr) + entry_ptr->addr = new_addr; + } /* end if */ + + entry_ptr->size = new_len; + entry_ptr->image_ptr = new_image_ptr; + } /* end if */ + else { + HDassert(serialize_flags & H5C__SERIALIZE_RENAMED_FLAG); + + H5C__UPDATE_STATS_FOR_RENAME(cache_ptr, \ + entry_ptr) + entry_ptr->addr = new_addr; + } /* end else */ + } + else + { + if ( cache_ptr->mdj_enabled ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "rename/resize on flush when journaling enabled."); + } + + /* The entry is not being destroyed, and thus has not + * been removed from the cache's data structures. + * + * Thus, in addition to updating the entry for the + * re-size and/or rename, we must also update the + * cache data structures. + */ + + if(serialize_flags & H5C__SERIALIZE_RESIZED_FLAG) { + + H5C__UPDATE_STATS_FOR_ENTRY_SIZE_CHANGE( \ + cache_ptr, \ + entry_ptr, \ + new_len) + + /* The replacement policy code thinks the + * entry is already clean, so modify is_dirty + * to meet this expectation. + */ + entry_ptr->is_dirty = FALSE; + + /* Check for resize+rename */ + if(serialize_flags & H5C__SERIALIZE_RENAMED_FLAG) { + H5C__UPDATE_STATS_FOR_RENAME(cache_ptr, \ + entry_ptr) + + /* update the hash table for the rename */ + H5C__DELETE_FROM_INDEX(cache_ptr, entry_ptr) + entry_ptr->addr = new_addr; + H5C__INSERT_IN_INDEX(cache_ptr, entry_ptr, \ + FAIL) + } /* end if */ + + /* update the hash table for the size change*/ + H5C__UPDATE_INDEX_FOR_SIZE_CHANGE( \ + (cache_ptr), \ + (entry_ptr->size),\ + (new_len)); + + /* The entry can't be protected since we are + * in the process of flushing it. Thus we must + * update the replacement policy data + * structures for the size change. The macro + * deals with the pinned case. + */ + H5C__UPDATE_RP_FOR_SIZE_CHANGE(cache_ptr, \ + entry_ptr, \ + new_len); + + /* The entry can't be in the slist, so no need + * to update the slist for the size change. + */ + + /* finally, set is_dirty to TRUE again, and + * update the size and image_ptr. + */ + entry_ptr->is_dirty = TRUE; + entry_ptr->size = new_len; + entry_ptr->image_ptr = new_image_ptr; + } /* end if */ + else { + HDassert(serialize_flags & H5C__SERIALIZE_RENAMED_FLAG); + + /* The replacement policy code thinks the + * entry is already clean, so modify is_dirty + * to meet this expectation. + */ + entry_ptr->is_dirty = FALSE; + + H5C__UPDATE_STATS_FOR_RENAME(cache_ptr, \ + entry_ptr) + + /* first update the hash table for the rename */ + H5C__DELETE_FROM_INDEX(cache_ptr, entry_ptr) + entry_ptr->addr = new_addr; + H5C__INSERT_IN_INDEX(cache_ptr, entry_ptr, \ + FAIL) + + /* finally, set is_dirty to TRUE again */ + entry_ptr->is_dirty = TRUE; + } /* end else */ + } + } + entry_ptr->image_up_to_date = TRUE; + } + + /* now write the image to disk */ + if ( H5F_block_write(f, type_ptr->mem_type, entry_ptr->addr, + entry_ptr->size, dxpl_id, + entry_ptr->image_ptr) < 0 ) + { + HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ + "Can't write image to file.") + } + +#ifdef H5_HAVE_PARALLEL + /* note that we initialized the serialize_flags to 0, so if + * the image was up to date on entry, serialize_flags should + * still be 0 at this point. + */ + if ( serialize_flags != 0 ) { + + /* In the parallel case, resizes and renames in + * the serialize operation can cause problems. + * If they occur, scream and die. + * + * At present, in the parallel case, the aux_ptr + * will only be set if there is more than one + * process. Thus we can use this to detect + * the parallel case. + * + * This works for now, but if we start using the + * aux_ptr for other purposes, we will have to + * change this test accordingly. + * + * NB: While this test detects entryies that attempt + * to resize or rename themselves during a flush + * in the parallel case, it will not detect an + * entry that dirties, resizes, and/or renames + * other entries during its flush. + * + * From what Quincey tells me, this test is + * sufficient for now, as any flush routine that + * does the latter will also do the former. + * + * If that ceases to be the case, further + * tests will be necessary. + */ + if ( cache_ptr->aux_ptr != NULL ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "resize/rename in serialize occured in parallel case.") + + } + } +#endif /* H5_HAVE_PARALLEL */ + + entry_ptr->is_dirty = FALSE; + } + + + if ( destroy ) /* time to discard the entry */ + { + /* start by freeing the buffer for the on disk image */ + if ( entry_ptr->image_ptr != NULL ) { + + entry_ptr->image_ptr = H5MM_xfree(entry_ptr->image_ptr); + + if ( entry_ptr->image_ptr != NULL ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ + "*image_ptr free failed.") + } + } + + /* we are about to discard the in core representation -- + * set the magic field to bad magic so we can detect a + * freed entry if we see one. + * + * Also reset the pointer to the cache the entry is within. -QAK + */ +#ifndef NDEBUG + entry_ptr->magic = H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC; +#endif /* NDEBUG */ + entry_ptr->cache_ptr = NULL; + + if ( type_ptr->free_icr(entry_ptr->addr, entry_ptr->size, + (void *)entry_ptr) != SUCCEED ) + { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ + "free_icr callback failed.") + } + } + else /* just flushing or clearing */ + { + entry_ptr->flush_in_progress = FALSE; + } + + + if ( cache_ptr->log_flush ) { + + /* JRM */ /* may want to update this */ + status = (cache_ptr->log_flush)(cache_ptr, addr, was_dirty, + flags, type_id); + + if ( status < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ + "log_flush callback failed.") + } + } + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_flush_single_entry() */ + + +/*------------------------------------------------------------------------- + * + * Function: H5C_load_entry + * + * Purpose: Attempt to load the entry at the specified disk address + * and with the specified type into memory. If successful. + * return the in memory address of the entry. Return NULL + * on failure. + * + * Note that this function simply loads the entry into + * core. It does not insert it into the cache. + * + * Return: Non-NULL on success / NULL on failure. + * + * Programmer: John Mainzer, 5/18/04 + * + * Modifications: + * + * JRM - 7/21/04 + * Updated function for the addition of the hash table. + * + * JRM - 6/23/06 + * Deleted assertion that verified that a newly loaded + * entry is clean. Due to a bug fix, this need not be + * the case, as our code will attempt to repair errors + * on load. + * + * JRM - 8/21/06 + * Added initialization for the new flush_in_progress and + * destroy in progress fields. + * + * JRM - 3/29/07 + * Added initialization for the new is_read_only and + * ro_ref_count fields. + * + * JRM - 6/25/07 + * Reworked function to use the new client callback + * functions that are needed to implement metadata + * journaling. Removed skip_file_checks parameter. + * + * JRM -- 10/12/07 + * Added initialization for the new magic field. + * + * JRM -- 3/26/08 + * Added initialization for the journaling related + * fields. + * + *------------------------------------------------------------------------- + */ + +static void * +H5C_load_entry(H5F_t * f, + hid_t dxpl_id, + const H5C_class_t * type, + haddr_t addr, + size_t len, + void * udata_ptr) +{ + hbool_t dirty = FALSE; + void * image_ptr = NULL; + void * thing = NULL; + H5C_cache_entry_t * entry_ptr = NULL; + void * ret_value = NULL; + + FUNC_ENTER_NOAPI_NOINIT(H5C_load_entry) + + HDassert( f ); + HDassert( f->shared ); + HDassert( f->shared->cache ); + HDassert( type ); + HDassert( H5F_addr_defined(addr) ); + HDassert( len > 0 ); + HDassert( type->deserialize ); + + /* Check for possible speculative read off the end of the file */ + /* (Assume speculative reads will only occur if an image_len callback is defined) */ + if ( type->image_len ) + { + + haddr_t eoa; /* End-of-allocation in the file */ + haddr_t base_addr; /* Base address of file data */ + + /* Get the file's end-of-allocation value */ + eoa = H5F_get_eoa(f); + HDassert(H5F_addr_defined(eoa)); + + /* Get the file's base address */ + base_addr = H5F_BASE_ADDR(f); + HDassert(H5F_addr_defined(base_addr)); + + /* Check for bad address in general */ + if ( (addr + base_addr) > eoa ) + { + + HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, NULL, \ + "address of object past end of allocation") + + } + + /* Check if the amount of data to read will be past the eoa */ + if ( ( addr + base_addr + len ) > eoa ) + { + + /* Trim down the length of the metadata */ + len = eoa - (addr + base_addr); + + } + } + + image_ptr = H5MM_malloc(len); + + if ( image_ptr == NULL ) { + + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, \ + "memory allocation failed for on disk image buffer.") + } + + if ( H5F_block_read(f, type->mem_type, addr, len, dxpl_id, image_ptr) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTLOAD, NULL, "Can't read image*") + } + + thing = type->deserialize(addr, len, image_ptr, udata_ptr, &dirty); + + if ( thing == NULL ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTLOAD, NULL, "Can't deserialize image") + } + + /* If the client's cache has an image_len callback, check it */ + if ( type->image_len ) + { + size_t new_len; + + if ( type->image_len(thing, &new_len) != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTLOAD, NULL, "image_len() failed.\n"); + + } else if ( new_len == 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTLOAD, NULL, "new_len == 0\n") + } + else if ( new_len != len) + { + image_ptr = H5MM_realloc(image_ptr, new_len); + + if ( image_ptr == NULL ) { + + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, \ + "image_ptr null after H5MM_realloc().") + } + + /* If the thing's image needs to be bigger, free the thing + * and retry with new length + */ + if ( new_len > len) + { + if ( type->free_icr(addr, len, thing) != SUCCEED ) + { + HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, NULL, \ + "free_icr callback failed.") + } + + if ( H5F_block_read(f, type->mem_type, addr, new_len, + dxpl_id, image_ptr) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTLOAD, NULL, \ + "Can't read image") + } + + thing = type->deserialize(addr, new_len, image_ptr, + udata_ptr, &dirty); + + if ( thing == NULL ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTLOAD, NULL, \ + "Can't deserialize image") + } + + } + + /* Retain adjusted size */ + len = new_len; + } + } + + entry_ptr = (H5C_cache_entry_t *)thing; + + /* In general, an entry should be clean just after it is loaded. + * + * However, when this code is used in the metadata cache, it is + * possible that object headers will be dirty at this point, as + * the deserialize function will alter object headers if necessary to + * fix an old bug. + * + * In the following assert: + * + * HDassert( ( dirty == FALSE ) || ( type->id == 5 || type->id == 6 ) ); + * + * note that type ids 5 & 6 are associated with object headers in the metadata + * cache. + * + * When we get to using H5C for other purposes, we may wish to + * tighten up the assert so that the loophole only applies to the + * metadata cache. + */ + + HDassert( ( dirty == FALSE ) || ( type->id == 5 || type->id == 6) ); + HDassert( entry_ptr->size < H5C_MAX_ENTRY_SIZE ); +#ifndef NDEBUG + entry_ptr->magic = H5C__H5C_CACHE_ENTRY_T_MAGIC; +#endif /* NDEBUG */ + entry_ptr->cache_ptr = f->shared->cache; + entry_ptr->addr = addr; + entry_ptr->size = len; + entry_ptr->image_ptr = image_ptr; + entry_ptr->image_up_to_date = TRUE; + entry_ptr->type = type; + entry_ptr->is_dirty = dirty; + entry_ptr->dirtied = FALSE; + entry_ptr->is_protected = FALSE; + entry_ptr->is_read_only = FALSE; + entry_ptr->ro_ref_count = 0; + entry_ptr->is_pinned = FALSE; + entry_ptr->in_slist = FALSE; + entry_ptr->flush_marker = FALSE; +#ifdef H5_HAVE_PARALLEL + entry_ptr->clear_on_unprotect = FALSE; +#endif /* H5_HAVE_PARALLEL */ + entry_ptr->flush_in_progress = FALSE; + entry_ptr->destroy_in_progress = FALSE; + + entry_ptr->ht_next = NULL; + entry_ptr->ht_prev = NULL; + + entry_ptr->next = NULL; + entry_ptr->prev = NULL; + + entry_ptr->aux_next = NULL; + entry_ptr->aux_prev = NULL; + + entry_ptr->last_trans = 0; + entry_ptr->trans_next = NULL; + entry_ptr->trans_prev = NULL; + + H5C__RESET_CACHE_ENTRY_STATS(entry_ptr); + + ret_value = thing; + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_load_entry() */ + + +/*------------------------------------------------------------------------- + * + * Function: H5C_make_space_in_cache + * + * Purpose: Attempt to evict cache entries until the index_size + * is at least needed_space below max_cache_size. + * + * In passing, also attempt to bring cLRU_list_size to a + * value greater than min_clean_size. + * + * Depending on circumstances, both of these goals may + * be impossible, as in parallel mode, we must avoid generating + * a write as part of a read (to avoid deadlock in collective + * I/O), and in all cases, it is possible (though hopefully + * highly unlikely) that the protected list may exceed the + * maximum size of the cache. + * + * Thus the function simply does its best, returning success + * unless an error is encountered. + * + * The primary_dxpl_id and secondary_dxpl_id parameters + * specify the dxpl_ids used on the first write occasioned + * by the call (primary_dxpl_id), and on all subsequent + * writes (secondary_dxpl_id). This is useful in the metadata + * cache, but may not be needed elsewhere. If so, just use the + * same dxpl_id for both parameters. + * + * Observe that this function cannot occasion a read. + * + * Return: Non-negative on success/Negative on failure. + * + * Programmer: John Mainzer, 5/14/04 + * + * Modifications: + * + * JRM --7/21/04 + * Minor modifications in support of the addition of a hash + * table to facilitate lookups. + * + * JRM -- 11/22/04 + * Added the first_flush_ptr parameter, which replaces the + * old first_flush local variable. This allows the function + * to coordinate on the first flush issue with other functions. + * + * JRM -- 12/13/04 + * Added code to skip over epoch markers if present. + * + * JRM -- 1/3/06 + * Modified function to work correctly when the the cache + * is not full. This case occurs when we need to flush to + * min clean size before the cache has filled. + * + * JRM -- 3/29/07 + * Added sanity checks using the new is_read_only and + * ro_ref_count fields. + * + * JRM -- 8/24/07 + * Reworked parameter list and code for the removal of the + * secondary dxpl id, and the decision to store the file + * pointer f in *cache_ptr. + * + * JRM -- 10/12/07 + * Added code to detect the case in which the LRU list has + * been modified by a serialize callback, and cause the + * function to re-start its scan at the tail of the LRU. + * + *------------------------------------------------------------------------- + */ + +static herr_t +H5C_make_space_in_cache(H5F_t * f, + hid_t dxpl_id, + H5C_t * cache_ptr, + size_t space_needed, + hbool_t write_permitted) +{ + herr_t result; + int32_t entries_examined = 0; + int32_t initial_list_len; +#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS + size_t empty_space; +#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ + hbool_t prev_is_dirty = FALSE; + hbool_t entry_is_epoch_maker = FALSE; + H5C_cache_entry_t * entry_ptr; + H5C_cache_entry_t * prev_ptr; + H5C_cache_entry_t * next_ptr; + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI_NOINIT(H5C_make_space_in_cache) + + HDassert( f ); + HDassert( cache_ptr ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + + if ( write_permitted ) { + + initial_list_len = cache_ptr->LRU_list_len; + entry_ptr = cache_ptr->LRU_tail_ptr; + + while ( ( (cache_ptr->index_size + space_needed) + > + cache_ptr->max_cache_size + ) + && + ( entries_examined <= (2 * initial_list_len) ) + && + ( entry_ptr != NULL ) + ) + { + HDassert( ! (entry_ptr->is_protected) ); + HDassert( ! (entry_ptr->is_read_only) ); + HDassert( (entry_ptr->ro_ref_count) == 0 ); + + next_ptr = entry_ptr->next; + prev_ptr = entry_ptr->prev; + + if ( prev_ptr != NULL ) { + + prev_is_dirty = prev_ptr->is_dirty; + } + + if ( (entry_ptr->type)->id != H5C__EPOCH_MARKER_TYPE ) { + + entry_is_epoch_maker = FALSE; + + if ( entry_ptr->is_dirty ) { + + result = H5C_flush_single_entry(f, + dxpl_id, + cache_ptr, + entry_ptr->type, + entry_ptr->addr, + H5C__NO_FLAGS_SET, + FALSE); + } else { + + result = + H5C_flush_single_entry(f, + dxpl_id, + cache_ptr, + entry_ptr->type, + entry_ptr->addr, + H5C__FLUSH_INVALIDATE_FLAG, + TRUE); + } + } else { + + /* Skip epoch markers. Set result to SUCCEED to avoid + * triggering the error code below. + */ + entry_is_epoch_maker = TRUE; + result = SUCCEED; + } + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ + "unable to flush entry") + } + + if ( prev_ptr != NULL ) { +#ifndef NDEBUG + if ( prev_ptr->magic != H5C__H5C_CACHE_ENTRY_T_MAGIC ) { + + /* something horrible has happened to *prev_ptr -- + * scream and die. + */ + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "*prev_ptr corrupt 1") + + } else +#endif /* NDEBUG */ + if ( entry_is_epoch_maker ) { + + /* epoch markers don't get flushed, so the sanity checks + * on normal entries will fail -- thus just set entry_ptr + * to prev_ptr and go on. + */ + entry_ptr = prev_ptr; + + } else if ( ( prev_ptr->is_dirty != prev_is_dirty ) + || + ( prev_ptr->next != next_ptr ) + || + ( prev_ptr->is_protected ) + || + ( prev_ptr->is_pinned ) ) { + + /* something has happened to the LRU -- start over + * from the tail. + */ + entry_ptr = cache_ptr->LRU_tail_ptr; + + } else { + + entry_ptr = prev_ptr; + + } + } else { + + entry_ptr = NULL; + + } + + entries_examined++; + + } + +#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS + + entries_examined = 0; + initial_list_len = cache_ptr->dLRU_list_len; + entry_ptr = cache_ptr->dLRU_tail_ptr; + + if ( cache_ptr->index_size < cache_ptr->max_cache_size ) { + + empty_space = cache_ptr->max_cache_size - cache_ptr->index_size; + + } else { + + empty_space = 0; + } + + while ( ( (cache_ptr->cLRU_list_size + empty_space) + < cache_ptr->min_clean_size ) && + ( entries_examined <= initial_list_len ) && + ( entry_ptr != NULL ) + ) + { + HDassert( ! (entry_ptr->is_protected) ); + HDassert( ! (entry_ptr->is_read_only) ); + HDassert( (entry_ptr->ro_ref_count) == 0 ); + HDassert( entry_ptr->is_dirty ); + HDassert( entry_ptr->in_slist ); + + prev_ptr = entry_ptr->aux_prev; + + next_ptr = entry_ptr->aux_next; + + if ( prev_ptr != NULL ) { + + HDassert( prev_ptr->is_dirty ); + } + + result = H5C_flush_single_entry(f, + dxpl_id, + cache_ptr, + entry_ptr->type, + entry_ptr->addr, + H5C__NO_FLAGS_SET, + FALSE); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ + "unable to flush entry") + } + + if ( prev_ptr != NULL ) { +#ifndef NDEBUG + if (prev_ptr->magic != H5C__H5C_CACHE_ENTRY_T_MAGIC) { + + /* something horrible has happened to *prev_ptr -- + * scream and die. + */ + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "*prev_ptr corrupt 2") + + } else +#endif /* #ifndef NDEBUG */ + if ( ( ! ( prev_ptr->is_dirty ) ) + || + ( prev_ptr->aux_next != next_ptr ) + || + ( prev_ptr->is_protected ) + || + ( prev_ptr->is_pinned ) ) { + + /* something has happened to the dirty LRU -- start over + * from the tail. + */ + +#if 0 /* This debuging code may be useful in the future -- keep it for now. */ + if ( ! ( prev_ptr->is_dirty ) ) { + HDfprintf(stdout, "%s: ! prev_ptr->is_dirty\n", + FUNC); + } + if ( prev_ptr->aux_next != next_ptr ) { + HDfprintf(stdout, "%s: prev_ptr->next != next_ptr\n", + FUNC); + } + if ( prev_ptr->is_protected ) { + HDfprintf(stdout, "%s: prev_ptr->is_protected\n", + FUNC); + } + if ( prev_ptr->is_pinned ) { + HDfprintf(stdout, "%s:prev_ptr->is_pinned\n", + FUNC); + } + + HDfprintf(stdout, "%s: re-starting scan of dirty list\n", + FUNC); +#endif /* JRM */ + entry_ptr = cache_ptr->dLRU_tail_ptr; + + } else { + + entry_ptr = prev_ptr; + + } + } else { + + entry_ptr = NULL; + + } + + entries_examined++; + } + +#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ + + } else { + + HDassert( H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS ); + + initial_list_len = cache_ptr->cLRU_list_len; + entry_ptr = cache_ptr->cLRU_tail_ptr; + + while ( ( (cache_ptr->index_size + space_needed) + > + cache_ptr->max_cache_size + ) + && + ( entries_examined <= initial_list_len ) + && + ( entry_ptr != NULL ) + ) + { + HDassert( ! (entry_ptr->is_protected) ); + HDassert( ! (entry_ptr->is_read_only) ); + HDassert( (entry_ptr->ro_ref_count) == 0 ); + HDassert( ! (entry_ptr->is_dirty) ); + + prev_ptr = entry_ptr->aux_prev; + + result = H5C_flush_single_entry(f, + dxpl_id, + cache_ptr, + entry_ptr->type, + entry_ptr->addr, + H5C__FLUSH_INVALIDATE_FLAG, + TRUE); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ + "unable to flush entry") + } + + /* we are scanning the clean LRU, so the serialize function + * will not be called on any entry -- thus there is no + * concern about the list being modified out from under + * this function. + */ + + entry_ptr = prev_ptr; + entries_examined++; + } + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_make_space_in_cache() */ + + +/*------------------------------------------------------------------------- + * + * Function: H5C_validate_lru_list + * + * Purpose: Debugging function that scans the LRU list for errors. + * + * If an error is detected, the function generates a + * diagnostic and returns FAIL. If no error is detected, + * the function returns SUCCEED. + * + * Return: FAIL if error is detected, SUCCEED otherwise. + * + * Programmer: John Mainzer, 7/14/05 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +#if H5C_DO_EXTREME_SANITY_CHECKS + +static herr_t +H5C_validate_lru_list(H5C_t * cache_ptr) +{ + herr_t ret_value = SUCCEED; /* Return value */ + int32_t len = 0; + size_t size = 0; + H5C_cache_entry_t * entry_ptr = NULL; + + FUNC_ENTER_NOAPI_NOINIT(H5C_validate_lru_list) + + HDassert( cache_ptr ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + + if ( ( ( cache_ptr->LRU_head_ptr == NULL ) + || + ( cache_ptr->LRU_tail_ptr == NULL ) + ) + && + ( cache_ptr->LRU_head_ptr != cache_ptr->LRU_tail_ptr ) + ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 1 failed") + } + + if ( ( cache_ptr->LRU_list_len < 0 ) || ( cache_ptr->LRU_list_size < 0 ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 2 failed") + } + + if ( ( cache_ptr->LRU_list_len == 1 ) + && + ( ( cache_ptr->LRU_head_ptr != cache_ptr->LRU_tail_ptr ) + || + ( cache_ptr->LRU_head_ptr == NULL ) + || + ( cache_ptr->LRU_head_ptr->size != cache_ptr->LRU_list_size ) + ) + ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 3 failed") + } + + if ( ( cache_ptr->LRU_list_len >= 1 ) + && + ( ( cache_ptr->LRU_head_ptr == NULL ) + || + ( cache_ptr->LRU_head_ptr->prev != NULL ) + || + ( cache_ptr->LRU_tail_ptr == NULL ) + || + ( cache_ptr->LRU_tail_ptr->next != NULL ) + ) + ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 4 failed") + } + + entry_ptr = cache_ptr->LRU_head_ptr; + while ( entry_ptr != NULL ) + { + + if ( ( entry_ptr != cache_ptr->LRU_head_ptr ) && + ( ( entry_ptr->prev == NULL ) || + ( entry_ptr->prev->next != entry_ptr ) ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 5 failed") + } + + if ( ( entry_ptr != cache_ptr->LRU_tail_ptr ) && + ( ( entry_ptr->next == NULL ) || + ( entry_ptr->next->prev != entry_ptr ) ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 6 failed") + } + + len++; + size += entry_ptr->size; + entry_ptr = entry_ptr->next; + } + + if ( ( cache_ptr->LRU_list_len != len ) || + ( cache_ptr->LRU_list_size != size ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 7 failed") + } + +done: + + if ( ret_value != SUCCEED ) { + + HDassert(0); + } + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_validate_lru_list() */ + +#endif /* H5C_DO_EXTREME_SANITY_CHECKS */ + + +/*------------------------------------------------------------------------- + * + * Function: H5C_verify_not_in_index + * + * Purpose: Debugging function that scans the hash table to verify + * that the specified instance of H5C_cache_entry_t is not + * present. + * + * If an error is detected, the function generates a + * diagnostic and returns FAIL. If no error is detected, + * the function returns SUCCEED. + * + * Return: FAIL if error is detected, SUCCEED otherwise. + * + * Programmer: John Mainzer, 7/14/05 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +#if H5C_DO_EXTREME_SANITY_CHECKS + +static herr_t +H5C_verify_not_in_index(H5C_t * cache_ptr, + H5C_cache_entry_t * entry_ptr) +{ + herr_t ret_value = SUCCEED; /* Return value */ + int32_t i; + int32_t depth; + H5C_cache_entry_t * scan_ptr = NULL; + + FUNC_ENTER_NOAPI_NOINIT(H5C_verify_not_in_index) + + HDassert( cache_ptr != NULL ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + HDassert( entry_ptr != NULL ); + + for ( i = 0; i < H5C__HASH_TABLE_LEN; i++ ) + { + depth = 0; + scan_ptr = cache_ptr->index[i]; + + while ( scan_ptr != NULL ) + { + if ( scan_ptr == entry_ptr ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "Entry already in index.") + } + depth++; + scan_ptr = scan_ptr->ht_next; + } + } + +done: + + if ( ret_value != SUCCEED ) { + + HDassert(0); + } + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_verify_not_in_index() */ + +#endif /* H5C_DO_EXTREME_SANITY_CHECKS */ diff --git a/src/H5C2.c b/src/H5C2.c deleted file mode 100644 index dd4105a..0000000 --- a/src/H5C2.c +++ /dev/null @@ -1,9609 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * Copyright by the Board of Trustees of the University of Illinois. * - * All rights reserved. * - * * - * This file is part of HDF5. The full HDF5 copyright notice, including * - * terms governing use, modification, and redistribution, is contained in * - * the files COPYING and Copyright.html. COPYING can be found at the root * - * of the source code distribution tree; Copyright.html can be found at the * - * root level of an installed copy of the electronic HDF5 document set and * - * is linked from the top-level documents page. It can also be found at * - * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * - * access to either file, you may request a copy from help@hdfgroup.org. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/*------------------------------------------------------------------------- - * - * Created: H5C2.c - * June 1 2004 - * John Mainzer - * - * Purpose: Functions in this file implement a generic cache for - * things which exist on disk, and which may be - * unambiguously referenced by their disk addresses. - * - * The code in this module was initially written in - * support of a complete re-write of the metadata cache - * in H5AC.c However, other uses for the cache code - * suggested themselves, and thus this file was created - * in an attempt to support re-use. - * - * For a detailed overview of the cache, please see the - * header comment for H5C2_t in H5C2pkg.h. - * - * Modifications: - * - * QAK - 11/27/2004 - * Switched over to using skip list routines instead of TBBT - * routines. - * - * JRM - 12/15/04 - * Added code supporting manual and automatic cache resizing. - * See the header for H5C2_auto_size_ctl_t in H5C2private.h for - * an overview. - * - * Some elements of the automatic cache resize code depend on - * the LRU list. Thus if we ever choose to support a new - * replacement policy, we will either have to disable those - * elements of the auto resize code when running the new - * policy, or modify them to make use of similar information - * maintained by the new policy code. - * - *------------------------------------------------------------------------- - */ - -/************************************************************************** - * - * To Do: - * - * Code Changes: - * - * - Remove extra functionality in H5C2_flush_single_entry()? - * - * - Change protect/unprotect to lock/unlock. - * - * - Change the way the dirty flag is set. Probably pass it in - * as a parameter in unprotect & insert. - * - * - Size should also be passed in as a parameter in insert and - * unprotect -- or some other way should be found to advise the - * cache of changes in entry size. - * - * - Flush entries in increasing address order in - * H5C2_make_space_in_cache(). - * - * - Also in H5C2_make_space_in_cache(), use high and low water marks - * to reduce the number of I/O calls. - * - * - When flushing, attempt to combine contiguous entries to reduce - * I/O overhead. Can't do this just yet as some entries are not - * contiguous. Do this in parallel only or in serial as well? - * - * - Create MPI type for dirty objects when flushing in parallel. - * - * - Now that TBBT routines aren't used, fix nodes in memory to - * point directly to the skip list node from the LRU list, eliminating - * skip list lookups when evicting objects from the cache. - * - * Tests: - * - * - Trim execution time. (This is no longer a major issue with the - * shift from the TBBT to a hash table for indexing.) - * - * - Add random tests. - * - **************************************************************************/ - -#include - -#define H5C2_PACKAGE /*suppress error about including H5C2pkg */ -#define H5F_PACKAGE /*suppress error about including H5Fpkg */ - - -#include "H5private.h" /* Generic Functions */ -#include "H5C2pkg.h" /* Cache */ -#include "H5Dprivate.h" /* Dataset functions */ -#include "H5Eprivate.h" /* Error handling */ -#include "H5Fpkg.h" /* Files */ -#include "H5FDprivate.h" /* File drivers */ -#include "H5FLprivate.h" /* Free Lists */ -#include "H5Iprivate.h" /* IDs */ -#include "H5MMprivate.h" /* Memory management */ -#include "H5Pprivate.h" /* Property lists */ -#include "H5SLprivate.h" /* Skip lists */ - - -/* - * #defines controlling debugging code. All should be turned off - * before checkin. - */ - -#define H5C2_PRINT_ENTRY_POINTS FALSE - -#if H5C2_PRINT_ENTRY_POINTS -#define H5C2_PRINT_EXIT_POINTS TRUE -#define H5C2_PRINT_ENTRY_POINT_TARGET_TYPE(i) \ - ( ( (i) == H5AC2_FHEAP_HDR_ID ) || \ - ( (i) == H5AC2_FHEAP_DBLOCK_ID ) || \ - ( (i) == H5AC2_FHEAP_IBLOCK_ID ) ) -#else /* H5C2_PRINT_ENTRY_POINTS */ -#define H5C2_PRINT_EXIT_POINTS FALSE -#endif /* H5C2_PRINT_ENTRY_POINTS */ - - - -/* - * Private file-scope variables. - */ - -/* Declare a free list to manage the H5C2_t struct */ -H5FL_DEFINE_STATIC(H5C2_t); - - -/* - * Private file-scope function declarations: - */ - -static herr_t H5C2__auto_adjust_cache_size(H5F_t * f, - hid_t dxpl_id, - H5C2_t * cache_ptr, - hbool_t write_permitted); - -static herr_t H5C2__autoadjust__ageout(H5F_t * f, - hid_t dxpl_id, - H5C2_t * cache_ptr, - double hit_rate, - enum H5C2_resize_status * status_ptr, - size_t * new_max_cache_size_ptr, - hbool_t write_permitted); - -static herr_t H5C2__autoadjust__ageout__cycle_epoch_marker(H5C2_t * cache_ptr); - -static herr_t H5C2__autoadjust__ageout__evict_aged_out_entries(H5F_t * f, - hid_t dxpl_id, - H5C2_t * cache_ptr, - hbool_t write_permitted); - -static herr_t H5C2__autoadjust__ageout__insert_new_marker(H5C2_t * cache_ptr); - -static herr_t H5C2__autoadjust__ageout__remove_all_markers(H5C2_t * cache_ptr); - -static herr_t H5C2__autoadjust__ageout__remove_excess_markers(H5C2_t * cache_ptr); - -static herr_t H5C2__flash_increase_cache_size(H5C2_t * cache_ptr, - size_t old_entry_size, - size_t new_entry_size); - -static herr_t H5C2_flush_single_entry(const H5F_t * f, - hid_t dxpl_id, - H5C2_t * cache_ptr, - const H5C2_class_t * type_ptr, - haddr_t addr, - unsigned flags, - hbool_t del_entry_from_slist_on_destroy); - -static herr_t H5C2_flush_invalidate_cache(const H5F_t * f, - hid_t dxpl_id, - H5C2_t * cache_ptr, - unsigned flags); - -static void * H5C2_load_entry(H5F_t * f, - hid_t dxpl_id, - const H5C2_class_t * type, - haddr_t addr, - size_t len, - void * udata_ptr); - -static herr_t H5C2_make_space_in_cache(H5F_t * f, - hid_t dxpl_id, - H5C2_t * cache_ptr, - size_t space_needed, - hbool_t write_permitted); - -#if H5C2_DO_EXTREME_SANITY_CHECKS -static herr_t H5C2_validate_lru_list(H5C2_t * cache_ptr); -static herr_t H5C2_verify_not_in_index(H5C2_t * cache_ptr, - H5C2_cache_entry_t * entry_ptr); -#endif /* H5C2_DO_EXTREME_SANITY_CHECKS */ - - -/**************************************************************************** - * - * #defines and declarations for epoch marker cache entries. - * - * As a strategy for automatic cache size reduction, the cache may insert - * marker entries in the LRU list at the end of each epoch. These markers - * are then used to identify entries that have not been accessed for n - * epochs so that they can be evicted from the cache. - * - ****************************************************************************/ - -/* Note that H5C2__MAX_EPOCH_MARKERS is defined in H5C2pkg.h, not here because - * it is needed to dimension arrays in H5C2_t. - */ - -#define H5C2__EPOCH_MARKER_TYPE H5C2__MAX_NUM_TYPE_IDS - -static void * H5C2_epoch_marker_deserialize(haddr_t addr, - size_t len, - const void * image_ptr, - void * udata_ptr, - hbool_t * dirty_ptr); -static herr_t H5C2_epoch_marker_image_len(const void * thing, - size_t *image_len_ptr); -static herr_t H5C2_epoch_marker_serialize(const H5F_t *f, - hid_t dxpl_id, - haddr_t addr, - size_t len, - void * image_ptr, - void * thing, - unsigned * flags_ptr, - haddr_t * new_addr_ptr, - size_t * new_len_ptr, - void ** new_image_ptr_ptr); -static herr_t H5C2_epoch_marker_free_icr(haddr_t addr, - size_t len, - void * thing); -static herr_t H5C2_epoch_marker_clear_dirty_bits(haddr_t addr, - size_t len, - void * thing); - -const H5C2_class_t epoch_marker_class_2 = -{ - /* id = */ H5C2__EPOCH_MARKER_TYPE, - /* name = */ "epoch marker", - /* mem_type = */ H5FD_MEM_DEFAULT, /* value doesn't matter */ - /* deserialize = */ &H5C2_epoch_marker_deserialize, - /* image_len = */ &H5C2_epoch_marker_image_len, - /* serialize = */ &H5C2_epoch_marker_serialize, - /* free_icr = */ &H5C2_epoch_marker_free_icr, - /* clear_dirty_bits = */ &H5C2_epoch_marker_clear_dirty_bits, -}; - - -/*************************************************************************** - * Class functions for H5C2__EPOCH_MAKER_TYPE: - * - * None of these functions should ever be called, so there is no point in - * documenting them separately. - * JRM - 11/16/04 - * - ***************************************************************************/ - -static void * -H5C2_epoch_marker_deserialize(haddr_t UNUSED addr, - size_t UNUSED len, - const void UNUSED * image_ptr, - void UNUSED * udata_ptr, - hbool_t UNUSED * dirty_ptr) -{ - void * ret_value = NULL; /* Return value */ - - FUNC_ENTER_NOAPI(H5C2_epoch_marker_deserialize, NULL) - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, NULL, "called unreachable fcn.") - -done: - - FUNC_LEAVE_NOAPI(ret_value) -} - -static herr_t -H5C2_epoch_marker_image_len(const void UNUSED *thing, - size_t UNUSED *image_len_ptr) -{ - herr_t ret_value = FAIL; /* Return value */ - - FUNC_ENTER_NOAPI(H5C2_epoch_marker_image_len, FAIL) - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "called unreachable fcn.") - -done: - - FUNC_LEAVE_NOAPI(ret_value) -} - -static herr_t -H5C2_epoch_marker_serialize(const H5F_t UNUSED *f, - hid_t UNUSED dxpl_id, - haddr_t UNUSED addr, - size_t UNUSED len, - void UNUSED * image_ptr, - void UNUSED * thing, - unsigned UNUSED * flags_ptr, - haddr_t UNUSED * new_addr_ptr, - size_t UNUSED * new_len_ptr, - void UNUSED ** new_image_ptr_ptr) -{ - herr_t ret_value = FAIL; /* Return value */ - - FUNC_ENTER_NOAPI(H5C2_epoch_marker_serialize, FAIL) - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "called unreachable fcn.") - -done: - - FUNC_LEAVE_NOAPI(ret_value) -} - -static herr_t -H5C2_epoch_marker_free_icr(haddr_t UNUSED addr, - size_t UNUSED len, - void UNUSED * thing) -{ - herr_t ret_value = FAIL; /* Return value */ - - FUNC_ENTER_NOAPI(H5C2_epoch_marker_free_icr, FAIL) - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "called unreachable fcn.") - -done: - - FUNC_LEAVE_NOAPI(ret_value) -} - -static herr_t -H5C2_epoch_marker_clear_dirty_bits(haddr_t UNUSED addr, - size_t UNUSED len, - void UNUSED * thing) -{ - herr_t ret_value = FAIL; /* Return value */ - - FUNC_ENTER_NOAPI(H5C2_epoch_marker_clear_dirty_bits, FAIL) - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "called unreachable fcn.") - -done: - - FUNC_LEAVE_NOAPI(ret_value) -} - - - -/*------------------------------------------------------------------------- - * Function: H5C2_create - * - * Purpose: Allocate, initialize, and return the address of a new - * instance of H5C2_t. - * - * In general, the max_cache_size parameter must be positive, - * and the min_clean_size parameter must lie in the closed - * interval [0, max_cache_size]. - * - * The check_write_permitted parameter must either be NULL, - * or point to a function of type H5C2_write_permitted_func_t. - * If it is NULL, the cache will use the write_permitted - * flag to determine whether writes are permitted. - * - * Return: Success: Pointer to the new instance. - * - * Failure: NULL - * - * Programmer: John Mainzer - * 6/2/04 - * - * Modifications: - * - * JRM -- 7/20/04 - * Updated for the addition of the hash table. - * - * JRM -- 10/5/04 - * Added call to H5C2_reset_cache_hit_rate_stats(). Also - * added initialization for cache_is_full flag and for - * resize_ctl. - * - * JRM -- 11/12/04 - * Added initialization for the new size_decreased field. - * - * JRM -- 11/17/04 - * Added/updated initialization for the automatic cache - * size control data structures. - * - * JRM -- 6/24/05 - * Added support for the new write_permitted field of - * the H5C2_t structure. - * - * JRM -- 7/5/05 - * Added the new log_flush parameter and supporting code. - * - * JRM -- 9/21/05 - * Added the new aux_ptr parameter and supporting code. - * - * JRM -- 1/20/06 - * Added initialization of the new prefix field in H5C2_t. - * - * JRM -- 3/16/06 - * Added initialization for the pinned entry related fields. - * - * JRM -- 5/31/06 - * Added initialization for the trace_file_ptr field. - * - * JRM -- 8/19/06 - * Added initialization for the flush_in_progress field. - * - * JRM -- 8/25/06 - * Added initialization for the slist_len_increase and - * slist_size_increase fields. These fields are used - * for sanity checking in the flush process, and are not - * compiled in unless H5C2_DO_SANITY_CHECKS is TRUE. - * - * JRM -- 3/28/07 - * Added initialization for the new is_read_only and - * ro_ref_count fields. - * - * JRM -- 7/10/07 - * Added the f parameter, along with initialization of - * the field of the same in in H5C2_t. Also removed the - * type name table, as type names are now included in - * instances of H5C2_class_t. - * - * JRM -- 3/28/07 - * Added initialization for the new is_read_only and - * ro_ref_count fields. - * - * JRM -- 12/31/07 - * Added initialization for the new flash cache size increase - * related fields of H5C2_t. - * - * JRM -- 3/6/08 - * Added initialization for metadata journaling related - * fields in H5C2_t. - * - * JRM -- 3/26/08 - * Added dxpl_id and journal_recovered parameters. Also - * added code to test to see if the file is marked as having - * journaling in progress, and fail if it does unless - * the journal_recovered parameter is TRUE. - * - * JRM -- 7/10/08 - * Removed the f, dxpl_id, and journal_recovered parameters, - * as checking for journaling in progress is no longer handled - * in H5C2_create(). - * - *------------------------------------------------------------------------- - */ - -H5C2_t * -H5C2_create(size_t max_cache_size, - size_t min_clean_size, - int max_type_id, - const char * (* type_name_table_ptr), - H5C2_write_permitted_func_t check_write_permitted, - hbool_t write_permitted, - H5C2_log_flush_func_t log_flush, - void * aux_ptr) -{ - int i; - H5C2_t * cache_ptr = NULL; - H5C2_t * ret_value = NULL; /* Return value */ - - FUNC_ENTER_NOAPI(H5C2_create, NULL) - - HDassert( max_cache_size >= H5C2__MIN_MAX_CACHE_SIZE ); - HDassert( max_cache_size <= H5C2__MAX_MAX_CACHE_SIZE ); - HDassert( min_clean_size <= max_cache_size ); - - HDassert( max_type_id >= 0 ); - HDassert( max_type_id < H5C2__MAX_NUM_TYPE_IDS ); - HDassert( type_name_table_ptr ); - - HDassert( ( write_permitted == TRUE ) || ( write_permitted == FALSE ) ); - - for ( i = 0; i <= max_type_id; i++ ) { - - HDassert( (type_name_table_ptr)[i] ); - HDassert( HDstrlen(( type_name_table_ptr)[i]) > 0 ); - } - - if ( NULL == (cache_ptr = H5FL_CALLOC(H5C2_t)) ) { - - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, \ - "memory allocation failed") - } - - if ( (cache_ptr->slist_ptr = H5SL_create(H5SL_TYPE_HADDR,0.5,(size_t)16)) - == NULL ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTCREATE, NULL, "can't create skip list.") - } - - /* If we get this far, we should succeed unless we detect journaling - * that was not cleaned up properly. Go ahead and initialize all - * the fields as we will need some of them for the journaling check. - */ - - cache_ptr->magic = H5C2__H5C2_T_MAGIC; - - cache_ptr->flush_in_progress = FALSE; - - cache_ptr->trace_file_ptr = NULL; - - cache_ptr->aux_ptr = aux_ptr; - - cache_ptr->max_type_id = max_type_id; - - cache_ptr->type_name_table_ptr = type_name_table_ptr; - - cache_ptr->max_cache_size = max_cache_size; - cache_ptr->min_clean_size = min_clean_size; - - cache_ptr->check_write_permitted = check_write_permitted; - cache_ptr->write_permitted = write_permitted; - - cache_ptr->log_flush = log_flush; - - cache_ptr->evictions_enabled = TRUE; - - cache_ptr->index_len = 0; - cache_ptr->index_size = (size_t)0; - - cache_ptr->slist_len = 0; - cache_ptr->slist_size = (size_t)0; - -#if H5C2_DO_SANITY_CHECKS - cache_ptr->slist_len_increase = 0; - cache_ptr->slist_size_increase = 0; -#endif /* H5C2_DO_SANITY_CHECKS */ - - for ( i = 0; i < H5C2__HASH_TABLE_LEN; i++ ) - { - (cache_ptr->index)[i] = NULL; - } - - cache_ptr->pl_len = 0; - cache_ptr->pl_size = (size_t)0; - cache_ptr->pl_head_ptr = NULL; - cache_ptr->pl_tail_ptr = NULL; - - cache_ptr->pel_len = 0; - cache_ptr->pel_size = (size_t)0; - cache_ptr->pel_head_ptr = NULL; - cache_ptr->pel_tail_ptr = NULL; - - cache_ptr->LRU_list_len = 0; - cache_ptr->LRU_list_size = (size_t)0; - cache_ptr->LRU_head_ptr = NULL; - cache_ptr->LRU_tail_ptr = NULL; - - cache_ptr->cLRU_list_len = 0; - cache_ptr->cLRU_list_size = (size_t)0; - cache_ptr->cLRU_head_ptr = NULL; - cache_ptr->cLRU_tail_ptr = NULL; - - cache_ptr->dLRU_list_len = 0; - cache_ptr->dLRU_list_size = (size_t)0; - cache_ptr->dLRU_head_ptr = NULL; - cache_ptr->dLRU_tail_ptr = NULL; - - cache_ptr->size_increase_possible = FALSE; - cache_ptr->flash_size_increase_possible = FALSE; - cache_ptr->flash_size_increase_threshold = 0; - cache_ptr->size_decrease_possible = FALSE; - cache_ptr->resize_enabled = FALSE; - cache_ptr->cache_full = FALSE; - cache_ptr->size_decreased = FALSE; - - (cache_ptr->resize_ctl).version = H5C2__CURR_AUTO_SIZE_CTL_VER; - (cache_ptr->resize_ctl).rpt_fcn = NULL; - (cache_ptr->resize_ctl).set_initial_size = FALSE; - (cache_ptr->resize_ctl).initial_size = H5C2__DEF_AR_INIT_SIZE; - (cache_ptr->resize_ctl).min_clean_fraction = H5C2__DEF_AR_MIN_CLEAN_FRAC; - (cache_ptr->resize_ctl).max_size = H5C2__DEF_AR_MAX_SIZE; - (cache_ptr->resize_ctl).min_size = H5C2__DEF_AR_MIN_SIZE; - (cache_ptr->resize_ctl).epoch_length = H5C2__DEF_AR_EPOCH_LENGTH; - - (cache_ptr->resize_ctl).incr_mode = H5C2_incr__off; - (cache_ptr->resize_ctl).lower_hr_threshold = H5C2__DEF_AR_LOWER_THRESHHOLD; - (cache_ptr->resize_ctl).increment = H5C2__DEF_AR_INCREMENT; - (cache_ptr->resize_ctl).apply_max_increment = TRUE; - (cache_ptr->resize_ctl).max_increment = H5C2__DEF_AR_MAX_INCREMENT; - - (cache_ptr->resize_ctl).flash_incr_mode = H5C2_flash_incr__off; - (cache_ptr->resize_ctl).flash_multiple = 1.0; - (cache_ptr->resize_ctl).flash_threshold = 0.25; - - (cache_ptr->resize_ctl).decr_mode = H5C2_decr__off; - (cache_ptr->resize_ctl).upper_hr_threshold = H5C2__DEF_AR_UPPER_THRESHHOLD; - (cache_ptr->resize_ctl).decrement = H5C2__DEF_AR_DECREMENT; - (cache_ptr->resize_ctl).apply_max_decrement = TRUE; - (cache_ptr->resize_ctl).max_decrement = H5C2__DEF_AR_MAX_DECREMENT; - (cache_ptr->resize_ctl).epochs_before_eviction = H5C2__DEF_AR_EPCHS_B4_EVICT; - (cache_ptr->resize_ctl).apply_empty_reserve = TRUE; - (cache_ptr->resize_ctl).empty_reserve = H5C2__DEF_AR_EMPTY_RESERVE; - - cache_ptr->epoch_markers_active = 0; - - /* no need to initialize the ring buffer itself */ - cache_ptr->epoch_marker_ringbuf_first = 1; - cache_ptr->epoch_marker_ringbuf_last = 0; - cache_ptr->epoch_marker_ringbuf_size = 0; - - for ( i = 0; i < H5C2__MAX_EPOCH_MARKERS; i++ ) - { - (cache_ptr->epoch_marker_active)[i] = FALSE; -#ifndef NDEBUG - ((cache_ptr->epoch_markers)[i]).magic = - H5C2__H5C2_CACHE_ENTRY_T_MAGIC; -#endif /* NDEBUG */ - ((cache_ptr->epoch_markers)[i]).addr = (haddr_t)i; - ((cache_ptr->epoch_markers)[i]).size = (size_t)0; - ((cache_ptr->epoch_markers)[i]).image_ptr = NULL; - ((cache_ptr->epoch_markers)[i]).image_up_to_date = FALSE; - ((cache_ptr->epoch_markers)[i]).type = &epoch_marker_class_2; - ((cache_ptr->epoch_markers)[i]).is_dirty = FALSE; - ((cache_ptr->epoch_markers)[i]).dirtied = FALSE; - ((cache_ptr->epoch_markers)[i]).is_protected = FALSE; - ((cache_ptr->epoch_markers)[i]).is_read_only = FALSE; - ((cache_ptr->epoch_markers)[i]).ro_ref_count = 0; - ((cache_ptr->epoch_markers)[i]).is_pinned = FALSE; - ((cache_ptr->epoch_markers)[i]).in_slist = FALSE; - ((cache_ptr->epoch_markers)[i]).ht_next = NULL; - ((cache_ptr->epoch_markers)[i]).ht_prev = NULL; - ((cache_ptr->epoch_markers)[i]).next = NULL; - ((cache_ptr->epoch_markers)[i]).prev = NULL; - ((cache_ptr->epoch_markers)[i]).aux_next = NULL; - ((cache_ptr->epoch_markers)[i]).aux_prev = NULL; -#if H5C2_COLLECT_CACHE_ENTRY_STATS - ((cache_ptr->epoch_markers)[i]).accesses = 0; - ((cache_ptr->epoch_markers)[i]).clears = 0; - ((cache_ptr->epoch_markers)[i]).flushes = 0; - ((cache_ptr->epoch_markers)[i]).pins = 0; -#endif /* H5C2_COLLECT_CACHE_ENTRY_STATS */ - } - - /* metadata journaling related fields */ - cache_ptr->mdj_enabled = FALSE; - cache_ptr->trans_in_progress = FALSE; - cache_ptr->trans_api_name[0] = '\0'; - cache_ptr->trans_num = 0; - cache_ptr->last_trans_on_disk = 0; - cache_ptr->jnl_magic = 0; - cache_ptr->jnl_file_name_len = 0; - (cache_ptr->jnl_file_name)[0] = '\0'; - (cache_ptr->mdj_jbrb).magic = - H5C2__H5C2_JBRB_T_MAGIC; - cache_ptr->tl_len = 0; - cache_ptr->tl_size = 0; - cache_ptr->tl_head_ptr = NULL; - cache_ptr->tl_tail_ptr = NULL; - cache_ptr->jwipl_len = 0; - cache_ptr->jwipl_size = 0; - cache_ptr->jwipl_head_ptr = NULL; - cache_ptr->jwipl_tail_ptr = NULL; - - /* allocate and initialze the metadata journaling status change - * callback table, along with the associated fields. Note that - * the table will grow and shrink as needed. - */ - cache_ptr->mdjsc_cb_tbl = - H5MM_malloc(H5C2__MIN_MDJSC_CB_TBL_LEN * - sizeof(H5C2_mdjsc_record_t)); - if ( cache_ptr->mdjsc_cb_tbl == NULL ) { - - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, \ - "can't alloc mdjsc_cb_tbl.") - } - for ( i = 0; i < H5C2__MIN_MDJSC_CB_TBL_LEN; i++ ) - { - ((cache_ptr->mdjsc_cb_tbl)[i]).fcn_ptr = NULL; - ((cache_ptr->mdjsc_cb_tbl)[i]).data_ptr = NULL; - ((cache_ptr->mdjsc_cb_tbl)[i]).fl_next = i + 1; - } - ((cache_ptr->mdjsc_cb_tbl)[H5C2__MIN_MDJSC_CB_TBL_LEN - 1]).fl_next = -1; - cache_ptr->mdjsc_cb_tbl_len = H5C2__MIN_MDJSC_CB_TBL_LEN; - cache_ptr->num_mdjsc_cbs = 0; - cache_ptr->mdjsc_cb_tbl_fl_head = 0; - cache_ptr->mdjsc_cb_tbl_max_idx_in_use = -1; - - - if ( H5C2_reset_cache_hit_rate_stats(cache_ptr) != SUCCEED ) { - - /* this should be impossible... */ - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, NULL, \ - "H5C2_reset_cache_hit_rate_stats failed.") - } - - H5C2_stats__reset(cache_ptr); - - cache_ptr->skip_file_checks = FALSE; - cache_ptr->skip_dxpl_id_checks = FALSE; - cache_ptr->prefix[0] = '\0'; /* empty string */ - - /* We used to check for journaling here, but the super block hasn't - * been read in yet at cache creation time -- thus the check for - * journaling has been moved to H5AC2_check_for_journaling(), which - * is simply a wrapper for H5C2_check_for_journaling(). - * - * H5AC2_check_for_journaling() is called at the end of H5Fopen() -- - * at which point the superblock has been read. - * - * Note that H5Fopen() is called by both H5Fcreate() and H5Fopen(). - */ - - /* Set return value */ - ret_value = cache_ptr; - -done: - - if ( ret_value == 0 ) { - - if ( cache_ptr != NULL ) { - - if ( cache_ptr->slist_ptr != NULL ) - H5SL_close(cache_ptr->slist_ptr); - - cache_ptr->magic = 0; - H5FL_FREE(H5C2_t, cache_ptr); - cache_ptr = NULL; - - } /* end if */ - - } /* end if */ - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_create() */ - - -/*------------------------------------------------------------------------- - * Function: H5C2_def_auto_resize_rpt_fcn - * - * Purpose: Print results of a automatic cache resize. - * - * This function should only be used where HDprintf() behaves - * well -- i.e. not on Windows. - * - * Return: void - * - * Programmer: John Mainzer - * 10/27/04 - * - * Modifications: - * - * JRM -- 11/22/04 - * Reworked function to adapt it to the addition of the - * ageout method of cache size reduction. - * - * JRM -- 1/19/06 - * Updated function for display the new prefix field of - * H5C2_t in output. - * - * JRM 12/31/07 - * Updated function to handle flash size increases. - * - *------------------------------------------------------------------------- - */ -void -H5C2_def_auto_resize_rpt_fcn(H5C2_t * cache_ptr, -#ifndef NDEBUG - int32_t version, -#else /* NDEBUG */ - int32_t UNUSED version, -#endif /* NDEBUG */ - double hit_rate, - enum H5C2_resize_status status, - size_t old_max_cache_size, - size_t new_max_cache_size, - size_t old_min_clean_size, - size_t new_min_clean_size) -{ - HDassert( cache_ptr != NULL ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - HDassert( version == H5C2__CURR_AUTO_RESIZE_RPT_FCN_VER ); - - switch ( status ) - { - case in_spec2: - HDfprintf(stdout, - "%sAuto cache resize -- no change. (hit rate = %lf)\n", - cache_ptr->prefix, hit_rate); - break; - - case increase2: - HDassert( hit_rate < (cache_ptr->resize_ctl).lower_hr_threshold ); - HDassert( old_max_cache_size < new_max_cache_size ); - - HDfprintf(stdout, - "%sAuto cache resize -- hit rate (%lf) out of bounds low (%6.5lf).\n", - cache_ptr->prefix, hit_rate, - (cache_ptr->resize_ctl).lower_hr_threshold); - - HDfprintf(stdout, - "%s cache size increased from (%Zu/%Zu) to (%Zu/%Zu).\n", - cache_ptr->prefix, - old_max_cache_size, - old_min_clean_size, - new_max_cache_size, - new_min_clean_size); - break; - - case flash_increase2: - HDassert( old_max_cache_size < new_max_cache_size ); - - HDfprintf(stdout, - "%sflash cache resize(%d) -- size threshold = %Zu.\n", - cache_ptr->prefix, - (int)((cache_ptr->resize_ctl).flash_incr_mode), - cache_ptr->flash_size_increase_threshold); - - HDfprintf(stdout, - "%s cache size increased from (%Zu/%Zu) to (%Zu/%Zu).\n", - cache_ptr->prefix, - old_max_cache_size, - old_min_clean_size, - new_max_cache_size, - new_min_clean_size); - break; - - - case decrease2: - HDassert( old_max_cache_size > new_max_cache_size ); - - switch ( (cache_ptr->resize_ctl).decr_mode ) - { - case H5C2_decr__threshold: - HDassert( hit_rate > - (cache_ptr->resize_ctl).upper_hr_threshold ); - - HDfprintf(stdout, - "%sAuto cache resize -- decrease by threshold. HR = %lf > %6.5lf\n", - cache_ptr->prefix, hit_rate, - (cache_ptr->resize_ctl).upper_hr_threshold); - - HDfprintf(stdout, "%sout of bounds high (%6.5lf).\n", - cache_ptr->prefix, - (cache_ptr->resize_ctl).upper_hr_threshold); - break; - - case H5C2_decr__age_out: - HDfprintf(stdout, - "%sAuto cache resize -- decrease by ageout. HR = %lf\n", - cache_ptr->prefix, hit_rate); - break; - - case H5C2_decr__age_out_with_threshold: - HDassert( hit_rate > - (cache_ptr->resize_ctl).upper_hr_threshold ); - - HDfprintf(stdout, - "%sAuto cache resize -- decrease by ageout with threshold. HR = %lf > %6.5lf\n", - cache_ptr->prefix, hit_rate, - (cache_ptr->resize_ctl).upper_hr_threshold); - break; - - default: - HDfprintf(stdout, - "%sAuto cache resize -- decrease by unknown mode. HR = %lf\n", - cache_ptr->prefix, hit_rate); - } - - HDfprintf(stdout, - "%s cache size decreased from (%Zu/%Zu) to (%Zu/%Zu).\n", - cache_ptr->prefix, - old_max_cache_size, - old_min_clean_size, - new_max_cache_size, - new_min_clean_size); - break; - - case at_max_size2: - HDfprintf(stdout, - "%sAuto cache resize -- hit rate (%lf) out of bounds low (%6.5lf).\n", - cache_ptr->prefix, hit_rate, - (cache_ptr->resize_ctl).lower_hr_threshold); - HDfprintf(stdout, - "%s cache already at maximum size so no change.\n", - cache_ptr->prefix); - break; - - case at_min_size2: - HDfprintf(stdout, - "%sAuto cache resize -- hit rate (%lf) -- can't decrease.\n", - cache_ptr->prefix, hit_rate); - HDfprintf(stdout, "%s cache already at minimum size.\n", - cache_ptr->prefix); - break; - - case increase_disabled2: - HDfprintf(stdout, - "%sAuto cache resize -- increase disabled -- HR = %lf.", - cache_ptr->prefix, hit_rate); - break; - - case decrease_disabled2: - HDfprintf(stdout, - "%sAuto cache resize -- decrease disabled -- HR = %lf.\n", - cache_ptr->prefix, hit_rate); - break; - - case not_full2: - HDassert( hit_rate < (cache_ptr->resize_ctl).lower_hr_threshold ); - - HDfprintf(stdout, - "%sAuto cache resize -- hit rate (%lf) out of bounds low (%6.5lf).\n", - cache_ptr->prefix, hit_rate, - (cache_ptr->resize_ctl).lower_hr_threshold); - HDfprintf(stdout, - "%s cache not full so no increase in size.\n", - cache_ptr->prefix); - break; - - default: - HDfprintf(stdout, "%sAuto cache resize -- unknown status code.\n", - cache_ptr->prefix); - break; - } - - return; - -} /* H5C2_def_auto_resize_rpt_fcn() */ - - -/*------------------------------------------------------------------------- - * Function: H5C2_dest - * - * Purpose: Flush all data to disk and destroy the cache. - * - * This function fails if any object are protected since the - * resulting file might not be consistent. - * - * The primary_dxpl_id and secondary_dxpl_id parameters - * specify the dxpl_ids used on the first write occasioned - * by the destroy (primary_dxpl_id), and on all subsequent - * writes (secondary_dxpl_id). This is useful in the metadata - * cache, but may not be needed elsewhere. If so, just use the - * same dxpl_id for both parameters. - * - * Note that *cache_ptr has been freed upon successful return. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: John Mainzer - * 6/2/04 - * - * Modifications: - * - * JRM -- 7/11/07 - * Reworked parameter list for the revised cache API. - * The function lost its pointer to an instance of - * H5F_t (now supplied via cache_ptr), and one of its - * dxlp ids. - * - *------------------------------------------------------------------------- - */ -herr_t -H5C2_dest(H5F_t * f, - hid_t dxpl_id) -{ - H5C2_t * cache_ptr = f->shared->cache2; - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5C2_dest, FAIL) - - HDassert( cache_ptr ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - - /* All metadata journaling status change callbacks should have - * de-registered at this point. - */ - HDassert( cache_ptr->num_mdjsc_cbs == 0 ); - - if ( cache_ptr->mdj_enabled ) { - - if ( H5C2_end_journaling(f, dxpl_id, cache_ptr) != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ - "H5C2_end_journaling() failed.") - } - } - - if ( H5C2_flush_cache(f, dxpl_id, - H5C2__FLUSH_INVALIDATE_FLAG) < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush cache") - } - - if ( cache_ptr->slist_ptr != NULL ) { - - H5SL_close(cache_ptr->slist_ptr); - cache_ptr->slist_ptr = NULL; - } - - if ( cache_ptr->mdjsc_cb_tbl != NULL ) { - - cache_ptr->mdjsc_cb_tbl = H5MM_xfree(cache_ptr->mdjsc_cb_tbl); - - if ( cache_ptr->mdjsc_cb_tbl != NULL ) { - - HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, \ - "free of mdjsc_cb_tbl failed."); - } - } - - cache_ptr->magic = 0; - - cache_ptr = H5FL_FREE(H5C2_t, cache_ptr); - -done: - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_dest() */ - - -/*------------------------------------------------------------------------- - * Function: H5C2_dest_empty - * - * Purpose: Destroy an empty cache. - * - * This function fails if the cache is not empty on entry. - * - * Note that *cache_ptr has been freed upon successful return. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: John Mainzer - * 6/2/04 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ -herr_t -H5C2_dest_empty(H5C2_t * cache_ptr) -{ - herr_t ret_value=SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5C2_dest_empty, FAIL) - - /* This would normally be an assert, but we need to use an HGOTO_ERROR - * call to shut up the compiler. - */ - if ( ( ! cache_ptr ) || - ( cache_ptr->magic != H5C2__H5C2_T_MAGIC ) || - ( cache_ptr->index_len != 0 ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "Bad cache_ptr or non-empty cache on entry.") - } - - - if ( cache_ptr->slist_ptr != NULL ) { - - H5SL_close(cache_ptr->slist_ptr); - cache_ptr->slist_ptr = NULL; - } - - cache_ptr->magic = 0; - - H5FL_FREE(H5C2_t, cache_ptr); - -done: - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_dest_empty() */ - - -/*------------------------------------------------------------------------- - * - * Function: H5C2_expunge_entry - * - * Purpose: Use this function to tell the cache to expunge an entry - * from the cache without writing it to disk even if it is - * dirty. The entry may not be either pinned or protected. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: John Mainzer - * 6/29/06 - * - * Modifications: - * - * JRM -- 7/11/07 - * Reworked the parameter list for the revised cache API. - * The function lost its file pointer (now passed in the - * *cache_ptr), and one of the dxpl ids. - * - * JRM -- 4/3/08 - * Added code to test to see if journaling is enabled, and - * if it is, test to see if entry_ptr->last_trans > zero. - * If so, must remove the entry from the transaction list - * (if it is present), remove the entry from the journal - * write in progress list, and set entry_ptr->last_trans to - * zero before calling H5C2_flush_single_entry(). - * - *------------------------------------------------------------------------- - */ - -herr_t -H5C2_expunge_entry(H5F_t * f, - hid_t dxpl_id, - const H5C2_class_t * type, - haddr_t addr) -{ - H5C2_t * cache_ptr; - herr_t result; - herr_t ret_value = SUCCEED; /* Return value */ - H5C2_cache_entry_t * entry_ptr = NULL; - - FUNC_ENTER_NOAPI(H5C2_expunge_entry, FAIL) - -#if H5C2_PRINT_ENTRY_POINTS - if ( H5C2_PRINT_ENTRY_POINT_TARGET_TYPE(type->id) ) - { - HDfprintf(stdout, "%s: addr = 0x%lX, type = %s.\n", - FUNC, (unsigned long)addr, type->name); - } -#endif /* H5C2_PRINT_ENTRY_POINTS */ - - HDassert( f ); - HDassert( f->shared ); - - cache_ptr = f->shared->cache2; - - HDassert( H5F_addr_defined(addr) ); - HDassert( cache_ptr ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - HDassert( type ); - -#if H5C2_DO_EXTREME_SANITY_CHECKS - if ( H5C2_validate_lru_list(cache_ptr) < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "LRU sanity check failed.\n"); - } -#endif /* H5C2_DO_EXTREME_SANITY_CHECKS */ - - H5C2__SEARCH_INDEX(cache_ptr, addr, entry_ptr, FAIL) - - if ( ( entry_ptr == NULL ) || ( entry_ptr->type != type ) ) { - - /* the target doesn't exist in the cache, so we are done. */ - HGOTO_DONE(SUCCEED) - } - - HDassert( entry_ptr->addr == addr ); - HDassert( entry_ptr->type == type ); - - if ( entry_ptr->is_protected ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTEXPUNGE, FAIL, \ - "Target entry is protected.") - } - - if ( entry_ptr->is_pinned ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTEXPUNGE, FAIL, \ - "Target entry is pinned.") - } - - /* H5C2_flush_single_entry() will choke if the last_trans field - * of the entry isn't zero, or if the entry is on the transaction - * list, or on the transaction write in progress list. Must tend - * to this before we we make the call. - */ - if ( cache_ptr->mdj_enabled ) { - - if ( cache_ptr->trans_num > 0 ) { - - /* remove the entry from the transaction list if it is there */ - H5C2__TRANS_DLL_REMOVE(entry_ptr, cache_ptr->tl_head_ptr, \ - cache_ptr->tl_tail_ptr, cache_ptr->tl_len, \ - cache_ptr->tl_size, FAIL); - - entry_ptr->last_trans = (uint64_t)0; - - H5C2__UPDATE_RP_FOR_JOURNAL_WRITE_COMPLETE(cache_ptr, \ - entry_ptr, \ - FAIL) - } - } - - /* If we get this far, call H5C2_flush_single_entry() with the - * H5C2__FLUSH_INVALIDATE_FLAG and the H5C2__FLUSH_CLEAR_ONLY_FLAG. - * This will clear the entry, and then delete it from the cache. - */ - - result = H5C2_flush_single_entry(f, - dxpl_id, - cache_ptr, - entry_ptr->type, - entry_ptr->addr, - H5C2__FLUSH_INVALIDATE_FLAG | - H5C2__FLUSH_CLEAR_ONLY_FLAG, - TRUE); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTEXPUNGE, FAIL, \ - "H5C2_flush_single_entry() failed.") - } - -done: - -#if H5C2_DO_EXTREME_SANITY_CHECKS - if ( H5C2_validate_lru_list(cache_ptr) < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "LRU sanity check failed.\n"); - } -#endif /* H5C2_DO_EXTREME_SANITY_CHECKS */ - -#if H5C2_PRINT_EXIT_POINTS - if ( H5C2_PRINT_ENTRY_POINT_TARGET_TYPE(type->id) ) { - HDfprintf(stdout, "%s: Exiting with result = %d.\n", - FUNC, (int)ret_value); - } -#endif /* H5C2_PRINT_EXIT_POINTS */ - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_expunge_entry() */ - - -/*------------------------------------------------------------------------- - * Function: H5C2_flush_cache - * - * Purpose: Flush (and possibly destroy) the entries contained in the - * specified cache. - * - * If the cache contains protected entries, the function will - * fail, as protected entries cannot be flushed. However - * all unprotected entries should be flushed before the - * function returns failure. - * - * The primary_dxpl_id and secondary_dxpl_id parameters - * specify the dxpl_ids used on the first write occasioned - * by the flush (primary_dxpl_id), and on all subsequent - * writes (secondary_dxpl_id). This is useful in the metadata - * cache, but may not be needed elsewhere. If so, just use the - * same dxpl_id for both parameters. - * - * Return: Non-negative on success/Negative on failure or if there was - * a request to flush all items and something was protected. - * - * Programmer: John Mainzer - * 6/2/04 - * - * Modifications: - * - * JRM -- 7/20/04 - * Modified the function for the addition of the hash table. - * - * JRM -- 11/22/04 - * Added code to remove all epoch markers (if any) from the - * LRU list before a destroy. Strictly speaking, this isn't - * necessary, as the marker entries reside only in the LRU - * list, never in the index or in the tree. However, it - * never hurts to tidy up. - * - * JRM -- 1/6/05 - * Reworked code to support the new - * H5C2__FLUSH_MARKED_ENTRIES_FLAG, and for the replacement of - * H5F_FLUSH_INVALIDATE flag with H5C2__FLUSH_INVALIDATE_FLAG. - * - * Note that the H5C2__FLUSH_INVALIDATE_FLAG takes precidence - * over the H5C2__FLUSH_MARKED_ENTRIES_FLAG. Thus if both are - * set, the functions behaves as if just the - * H5C2__FLUSH_INVALIDATE_FLAG was set. - * - * The H5C2__FLUSH_CLEAR_ONLY_FLAG flag can co-exist with - * either the H5C2__FLUSH_MARKED_ENTRIES_FLAG, or the - * H5C2__FLUSH_INVALIDATE_FLAG. In all cases, it is simply - * passed along to H5C2_flush_single_entry(). In the case of - * H5C2__FLUSH_MARKED_ENTRIES_FLAG, it will only apply to - * the marked entries. - * - * JRM -- 10/15/05 - * Added code supporting the new - * H5C2__FLUSH_IGNORE_PROTECTED_FLAG. We need this flag, as - * we now use this function to flush large number of entries - * in increasing address order. We do this by marking the - * entries to be flushed, calling this function to flush them, - * and then restoring LRU order. - * - * However, it is possible that the cache will contain other, - * unmarked protected entries, when we make this call. This - * new flag allows us to ignore them. - * - * Note that even with this flag set, it is still an error - * to try to flush a protected entry. - * - * JRM -- 3/25/06 - * Updated function to handle pinned entries. - * - * JRM -- 8/19/06 - * Added code managing the new flush_in_progress field of - * H5C2_t. - * - * Also reworked function to allow for the possibility that - * entries will be dirtied, resized, or renamed during flush - * callbacks. As a result, we may have to make multiple - * passes through the skip list before the cache is flushed. - * - * JRM -- 7/11/07 - * Reworked function to support the new metadata cache API. - * The function lost the H5F_t parameter (now passed via - * *cache_ptr), and one of the dxpl id parameters. - * - * JRM -- 10/13/07 - * Added code to detect and manage the case in which a - * serialize callback changes the s-list out from under - * the function. The only way I can think of in which this - * can happen is if a serialize function loads an entry - * into the cache that isn't there already. Quincey tells - * me that this will never happen, but I'm not sure I - * believe him. - * - * Note that this is a pretty bad scenario if it ever - * happens. The code I have added should allow us to - * handle the situation, but one can argue that I should - * just scream and die if I ever detect the condidtion. - * - * JRM -- 10/13/07 - * Added code to detect and manage the case in which a - * flush callback changes the s-list out from under - * the function. The only way I can think of in which this - * can happen is if a flush function loads an entry - * into the cache that isn't there already. Quincey tells - * me that this will never happen, but I'm not sure I - * believe him. - * - * Note that this is a pretty bad scenario if it ever - * happens. The code I have added should allow us to - * handle the situation under all but the worst conditions, - * but one can argue that I should just scream and die if I - * ever detect the condidtion. - * - * JRM -- 4/10/08 - * Added code to support journaling. - * - *------------------------------------------------------------------------- - */ -herr_t -H5C2_flush_cache(H5F_t *f, hid_t dxpl_id, unsigned flags) -{ - H5C2_t * cache_ptr; - herr_t status; - herr_t ret_value = SUCCEED; - hbool_t destroy; - hbool_t flushed_entries_last_pass; - hbool_t flush_marked_entries; - hbool_t ignore_protected; - hbool_t tried_to_flush_protected_entry = FALSE; - int32_t passes = 0; - int32_t protected_entries = 0; - H5SL_node_t * node_ptr = NULL; - H5C2_cache_entry_t * entry_ptr = NULL; - H5C2_cache_entry_t * next_entry_ptr = NULL; -#if H5C2_DO_SANITY_CHECKS - int64_t flushed_entries_count; - size_t flushed_entries_size; - int64_t initial_slist_len; - size_t initial_slist_size; -#endif /* H5C2_DO_SANITY_CHECKS */ - - FUNC_ENTER_NOAPI(H5C2_flush_cache, FAIL) - -#if H5C2_PRINT_ENTRY_POINTS - HDfprintf(stdout, "%s: flags = 0x%x.\n", FUNC, flags); -#endif /* H5C2_PRINT_ENTRY_POINTS */ - - HDassert( f ); - HDassert( f->shared ); - - cache_ptr = f->shared->cache2; - - HDassert( cache_ptr ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - HDassert( cache_ptr->skip_file_checks || f); - HDassert( cache_ptr->slist_ptr ); - - ignore_protected = ( (flags & H5C2__FLUSH_IGNORE_PROTECTED_FLAG) != 0 ); - - destroy = ( (flags & H5C2__FLUSH_INVALIDATE_FLAG) != 0 ); - - /* note that flush_marked_entries is set to FALSE if destroy is TRUE */ - flush_marked_entries = ( ( (flags & H5C2__FLUSH_MARKED_ENTRIES_FLAG) != 0 ) - && - ( ! destroy ) - ); - - HDassert( ! ( destroy && ignore_protected ) ); - - HDassert( ! ( cache_ptr->flush_in_progress ) ); - - if ( cache_ptr->mdj_enabled ) { - - status = H5C2_journal_pre_flush(cache_ptr); - - if ( status != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ - "H5C2_journal_pre_flush() failed.") - } - } - - cache_ptr->flush_in_progress = TRUE; - - if ( destroy ) { - - status = H5C2_flush_invalidate_cache(f, - dxpl_id, - cache_ptr, - flags); - - if ( status < 0 ) { - - /* This shouldn't happen -- if it does, we are toast so - * just scream and die. - */ - HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ - "flush invalidate failed.") - } - } else { - /* When we are only flushing marked entries, the slist will usually - * still contain entries when we have flushed everything we should. - * Thus we track whether we have flushed any entries in the last - * pass, and terminate if we haven't. - */ - - flushed_entries_last_pass = TRUE; - - while ( ( passes < H5C2__MAX_PASSES_ON_FLUSH ) && - ( cache_ptr->slist_len != 0 ) && - ( protected_entries == 0 ) && - ( flushed_entries_last_pass ) ) - { - flushed_entries_last_pass = FALSE; - node_ptr = H5SL_first(cache_ptr->slist_ptr); - - if ( node_ptr != NULL ) { - - next_entry_ptr = (H5C2_cache_entry_t *)H5SL_item(node_ptr); - - if ( next_entry_ptr == NULL ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "next_entry_ptr == NULL 1 ?!?!"); - } -#ifndef NDEBUG - HDassert( next_entry_ptr->magic == - H5C2__H5C2_CACHE_ENTRY_T_MAGIC ); -#endif /* NDEBUG */ - HDassert( next_entry_ptr->is_dirty ); - HDassert( next_entry_ptr->in_slist ); - - } else { - - next_entry_ptr = NULL; - - } - - HDassert( node_ptr != NULL ); - -#if H5C2_DO_SANITY_CHECKS - /* For sanity checking, try to verify that the skip list has - * the expected size and number of entries at the end of each - * internal while loop (see below). - * - * Doing this get a bit tricky, as depending on flags, we may - * or may not flush all the entries in the slist. - * - * To make things more entertaining, with the advent of the - * fractal heap, the entry serialize callback can cause entries - * to be dirtied, resized, and/or renamed. - * - * To deal with this, we first make note of the initial - * skip list length and size: - */ - initial_slist_len = cache_ptr->slist_len; - initial_slist_size = cache_ptr->slist_size; - - /* We then zero counters that we use to track the number - * and total size of entries flushed: - */ - flushed_entries_count = 0; - flushed_entries_size = 0; - - /* As mentioned above, there is the possibility that - * entries will be dirtied, resized, and/or flushed during - * our pass through the skip list. To capture the number - * of entries added, and the skip list size delta, - * zero the slist_len_increase and slist_size_increase of - * the cache's instance of H5C2_t. These fields will be - * updated elsewhere to account for slist insertions and/or - * dirty entry size changes. - */ - cache_ptr->slist_len_increase = 0; - cache_ptr->slist_size_increase = 0; - - /* at the end of the loop, use these values to compute the - * expected slist length and size and compare this with the - * value recorded in the cache's instance of H5C2_t. - */ -#endif /* H5C2_DO_SANITY_CHECKS */ - - while ( node_ptr != NULL ) - { - entry_ptr = next_entry_ptr; - - /* With the advent of the fractal heap, it is possible - * that the serialize callback will dirty and/or resize - * other entries in the cache. In particular, while - * Quincey has promised me that this will never happen, - * it is possible that the serialize callback for an - * entry may protect an entry that is not in the cache, - * perhaps causing the cache to flush and possibly - * evict the entry associated with node_ptr to make - * space for the new entry. - * - * Thus we do a bit of extra sanity checking on entry_ptr, - * and break out of this scan of the skip list if we - * detect minor problems. We have a bit of leaway on the - * number of passes though the skip list, so this shouldn't - * be an issue in the flush in and of itself, as it should - * be all but impossible for this to happen more than once - * in any flush. - * - * Observe that that breaking out of the scan early - * shouldn't break the sanity checks just after the end - * of this while loop. - * - * If an entry has merely been marked clean and removed from - * the s-list, we simply break out of the scan. - * - * If the entry has been evicted, we flag an error and - * exit. - */ -#ifndef NDEBUG - if ( entry_ptr->magic != H5C2__H5C2_CACHE_ENTRY_T_MAGIC ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "entry_ptr->magic invalid ?!?!"); - - } else -#endif /* NDEBUG */ - if ( ( ! entry_ptr->is_dirty ) || - ( ! entry_ptr->in_slist ) ) { - - /* the s-list has been modified out from under us. - * set node_ptr to NULL and break out of the loop. - */ - node_ptr = NULL; - break; - } - - /* increment node pointer now, before we delete its target - * from the slist. - */ - node_ptr = H5SL_next(node_ptr); - - if ( node_ptr != NULL ) { - - next_entry_ptr = (H5C2_cache_entry_t *)H5SL_item(node_ptr); - - if ( next_entry_ptr == NULL ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "next_entry_ptr == NULL 2 ?!?!"); - } -#ifndef NDEBUG - HDassert( next_entry_ptr->magic == - H5C2__H5C2_CACHE_ENTRY_T_MAGIC ); -#endif /* NDEBUG */ - HDassert( next_entry_ptr->is_dirty ); - HDassert( next_entry_ptr->in_slist ); - } else { - next_entry_ptr = NULL; - } - - HDassert( entry_ptr != NULL ); - HDassert( entry_ptr->in_slist ); - - if ( ( ! flush_marked_entries ) || - ( entry_ptr->flush_marker ) ) { - - if ( entry_ptr->is_protected ) { - - /* we probably have major problems -- but lets flush - * everything we can before we decide whether to flag - * an error. - */ - tried_to_flush_protected_entry = TRUE; - protected_entries++; - - } else if ( entry_ptr->is_pinned ) { - - /* Test to see if we are can flush the entry now. - * If we can, go ahead and flush. Note that we - * aren't trying to do a destroy here, so that - * is not an issue. - */ - if ( TRUE ) { /* When we get to multithreaded cache, - * we will need either locking code, - * and/or a test to see if the entry - * is in flushable condition here. - */ -#if H5C2_DO_SANITY_CHECKS - flushed_entries_count++; - flushed_entries_size += entry_ptr->size; -#endif /* H5C2_DO_SANITY_CHECKS */ - status = H5C2_flush_single_entry(f, - dxpl_id, - cache_ptr, - entry_ptr->type, - entry_ptr->addr, - flags, - FALSE); - if ( status < 0 ) { - - /* This shouldn't happen -- if it does, we - * are toast so just scream and die. - */ - HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ - "dirty pinned entry flush failed.") - } - flushed_entries_last_pass = TRUE; - } - } else { -#if H5C2_DO_SANITY_CHECKS - flushed_entries_count++; - flushed_entries_size += entry_ptr->size; -#endif /* H5C2_DO_SANITY_CHECKS */ - status = H5C2_flush_single_entry(f, - dxpl_id, - cache_ptr, - entry_ptr->type, - entry_ptr->addr, - flags, - FALSE); - if ( status < 0 ) { - - /* This shouldn't happen -- if it does, we are - * toast so just scream and die. - */ - HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ - "Can't flush entry.") - } - flushed_entries_last_pass = TRUE; - } - } - } /* while ( node_ptr != NULL ) */ - -#if H5C2_DO_SANITY_CHECKS - /* Verify that the slist size and length are as expected. */ - - HDassert( (initial_slist_len + cache_ptr->slist_len_increase - - flushed_entries_count) == cache_ptr->slist_len ); - HDassert( (initial_slist_size + cache_ptr->slist_size_increase - - flushed_entries_size) == cache_ptr->slist_size ); -#endif /* H5C2_DO_SANITY_CHECKS */ - - passes++; - - } /* while */ - - HDassert( protected_entries <= cache_ptr->pl_len ); - - if ( ( ( cache_ptr->pl_len > 0 ) && ( !ignore_protected ) ) - || - ( tried_to_flush_protected_entry ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ - "cache has protected items") - } - - if ( ( cache_ptr->slist_len != 0 ) && - ( passes >= H5C2__MAX_PASSES_ON_FLUSH ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ - "flush pass limit exceeded.") - } - -#if H5C2_DO_SANITY_CHECKS - if ( ! flush_marked_entries ) { - - HDassert( cache_ptr->slist_len == 0 ); - HDassert( cache_ptr->slist_size == 0 ); - } -#endif /* H5C2_DO_SANITY_CHECKS */ - - } - - if ( cache_ptr->mdj_enabled ) { - - status = H5C2_journal_post_flush(f, dxpl_id, cache_ptr, - (hbool_t)(flush_marked_entries == FALSE)); - - if ( status != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ - "H5C2_journal_post_flush() failed.") - } - } - -done: - - cache_ptr->flush_in_progress = FALSE; - -#if H5C2_PRINT_EXIT_POINTS - HDfprintf(stdout, "%s: Exiting with result = %d.\n", - FUNC, (int)ret_value); -#endif /* H5C2_PRINT_EXIT_POINTS */ - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_flush_cache() */ - - -/*------------------------------------------------------------------------- - * Function: H5C2_flush_to_min_clean - * - * Purpose: Flush dirty entries until the caches min clean size is - * attained. - * - * This function is used in the implementation of the - * metadata cache in PHDF5. To avoid "messages from the - * future", the cache on process 0 can't be allowed to - * flush entries until the other processes have reached - * the same point in the calculation. If this constraint - * is not met, it is possible that the other processes will - * read metadata generated at a future point in the - * computation. - * - * - * Return: Non-negative on success/Negative on failure or if - * write is not permitted. - * - * Programmer: John Mainzer - * 9/16/05 - * - * Modifications: - * - * Re-wrote function to flush dirty entries in increasing - * address order, while maintaining LRU order in the LRU list - * upon return. - * - * Do this by scanning up the dirty LRU list for entries to - * flush to reach min clean size, setting their flush_marker - * flags, and recording their addresses in the order - * encountered. - * - * Then call H5C2_flush_cache() to flush the marked entries. - * - * Finally, use the list of marked entries to force the - * correct LRU list order after the flush. - * - * JRM - 10/13/05 - * - * This change had the oposite of the desired effect. Lets - * leave it in (albeit commented out for now). If we can't - * find a case where it helps, lets get rid of it. - * - * - * Added some sanity checks to the change which verify the - * expected values of the new is_read_only and ro_ref_count - * fields. - * JRM - 3/29/07 - * - * Modified parameter list for the new metadata cache API. - * THe function lost its H5F_t parameter (now passed via - * *cache_ptr), and one of its dxpl ids. - * - * JRM - 7/11/07 - * - *------------------------------------------------------------------------- - */ -herr_t -H5C2_flush_to_min_clean(H5F_t * f, - hid_t dxpl_id) -{ - H5C2_t * cache_ptr; - herr_t result; - herr_t ret_value = SUCCEED; - hbool_t write_permitted; -#if 0 /* modified code -- commented out for now */ - int i; - int flushed_entries_count = 0; - size_t flushed_entries_size = 0; - size_t space_needed = 0; - haddr_t * flushed_entries_list = NULL; - H5C2_cache_entry_t * entry_ptr = NULL; -#endif /* JRM */ - - FUNC_ENTER_NOAPI(H5C2_flush_to_min_clean, FAIL) - - HDassert( f ); - HDassert( f->shared ); - - cache_ptr = f->shared->cache2; - - HDassert( cache_ptr ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - HDassert( cache_ptr->skip_file_checks || f ); - - if ( cache_ptr->check_write_permitted != NULL ) { - - result = (cache_ptr->check_write_permitted)(f, - dxpl_id, - &write_permitted); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "Can't get write_permitted") - } - } else { - - write_permitted = cache_ptr->write_permitted; - } - - if ( ! write_permitted ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "cache write is not permitted!?!\n"); - } -#if 1 /* original code */ - result = H5C2_make_space_in_cache(f, - dxpl_id, - cache_ptr, - (size_t)0, - write_permitted); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "H5C2_make_space_in_cache failed.") - } -#else /* modified code -- commented out for now */ - if ( cache_ptr->max_cache_size > cache_ptr->index_size ) { - - if ( ((cache_ptr->max_cache_size - cache_ptr->index_size) + - cache_ptr->cLRU_list_size) >= cache_ptr->min_clean_size ) { - - space_needed = 0; - - } else { - - space_needed = cache_ptr->min_clean_size - - ((cache_ptr->max_cache_size - cache_ptr->index_size) + - cache_ptr->cLRU_list_size); - } - } else { - - if ( cache_ptr->min_clean_size <= cache_ptr->cLRU_list_size ) { - - space_needed = 0; - - } else { - - space_needed = cache_ptr->min_clean_size - - cache_ptr->cLRU_list_size; - } - } - - if ( space_needed > 0 ) { /* we have work to do */ - - HDassert( cache_ptr->slist_len > 0 ); - - /* allocate an array to keep a list of the entries that we - * mark for flush. We need this list to touch up the LRU - * list after the flush. - */ - flushed_entries_list = (haddr_t *)H5MM_malloc(sizeof(haddr_t) * - (size_t)(cache_ptr->slist_len)); - - if ( flushed_entries_list == NULL ) { - - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \ - "memory allocation failed for flushed entries list") - } - - /* Scan the dirty LRU list from tail forward and mark sufficient - * entries to free up the necessary space. Keep a list of the - * entries marked in the order in which they are encountered. - */ - entry_ptr = cache_ptr->dLRU_tail_ptr; - - while ( ( flushed_entries_size < space_needed ) && - ( flushed_entries_count < cache_ptr->slist_len ) && - ( entry_ptr != NULL ) ) - { - HDassert( ! (entry_ptr->is_protected) ); - HDassert( ! (entry_ptr->is_read_only) ); - HDassert( entry_ptr->ro_ref_count == 0 ); - HDassert( entry_ptr->is_dirty ); - HDassert( entry_ptr->in_slist ); - - entry_ptr->flush_marker = TRUE; - flushed_entries_size += entry_ptr->size; - flushed_entries_list[flushed_entries_count] = entry_ptr->addr; - flushed_entries_count++; - entry_ptr = entry_ptr->aux_prev; - } - - HDassert( flushed_entries_count <= cache_ptr->slist_len ); - HDassert( flushed_entries_size >= space_needed ); - - - /* Flush the marked entries */ - result = H5C2_flush_cache(f, primary_dxpl_id, secondary_dxpl_id, - cache_ptr, H5C2__FLUSH_MARKED_ENTRIES_FLAG | - H5C2__FLUSH_IGNORE_PROTECTED_FLAG); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5C2_flush_cache failed.") - } - - /* Now touch up the LRU list so as to place the flushed entries in - * the order they they would be in if we had flushed them in the - * order we encountered them in. - */ - - i = 0; - while ( i < flushed_entries_count ) - { - H5C2__SEARCH_INDEX_NO_STATS(cache_ptr, flushed_entries_list[i], \ - entry_ptr, FAIL) - - /* At present, the above search must always succeed. However, - * that may change. Write the code so we need only remove the - * following assert in that event. - */ - HDassert( entry_ptr != NULL ); - H5C2__FAKE_RP_FOR_MOST_RECENT_ACCESS(cache_ptr, entry_ptr, FAIL) - i++; - } - } /* if ( space_needed > 0 ) */ -#endif /* end modified code -- commented out for now */ - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_flush_to_min_clean() */ - - -/*------------------------------------------------------------------------- - * Function: H5C2_get_cache_auto_resize_config - * - * Purpose: Copy the current configuration of the cache automatic - * re-sizing function into the instance of H5C2_auto_size_ctl_t - * pointed to by config_ptr. - * - * Return: SUCCEED on success, and FAIL on failure. - * - * Programmer: John Mainzer - * 10/8/04 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -herr_t -H5C2_get_cache_auto_resize_config(const H5C2_t * cache_ptr, - H5C2_auto_size_ctl_t *config_ptr) -{ - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5C2_get_cache_auto_resize_config, FAIL) - - if ( ( cache_ptr == NULL ) || ( cache_ptr->magic != H5C2__H5C2_T_MAGIC ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr on entry.") - } - - if ( config_ptr == NULL ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad config_ptr on entry.") - } - - *config_ptr = cache_ptr->resize_ctl; - - config_ptr->set_initial_size = FALSE; - config_ptr->initial_size = cache_ptr->max_cache_size; - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_get_cache_auto_resize_config() */ - - -/*------------------------------------------------------------------------- - * Function: H5C2_get_cache_size - * - * Purpose: Return the cache maximum size, the minimum clean size, the - * current size, and the current number of entries in - * *max_size_ptr, *min_clean_size_ptr, *cur_size_ptr, and - * *cur_num_entries_ptr respectively. If any of these - * parameters are NULL, skip that value. - * - * Return: SUCCEED on success, and FAIL on failure. - * - * Programmer: John Mainzer - * 10/8/04 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -herr_t -H5C2_get_cache_size(H5C2_t * cache_ptr, - size_t * max_size_ptr, - size_t * min_clean_size_ptr, - size_t * cur_size_ptr, - int32_t * cur_num_entries_ptr) -{ - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5C2_get_cache_size, FAIL) - - if ( ( cache_ptr == NULL ) || ( cache_ptr->magic != H5C2__H5C2_T_MAGIC ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr on entry.") - } - - if ( max_size_ptr != NULL ) { - - *max_size_ptr = cache_ptr->max_cache_size; - } - - if ( min_clean_size_ptr != NULL ) { - - *min_clean_size_ptr = cache_ptr->min_clean_size; - } - - if ( cur_size_ptr != NULL ) { - - *cur_size_ptr = cache_ptr->index_size; - } - - if ( cur_num_entries_ptr != NULL ) { - - *cur_num_entries_ptr = cache_ptr->index_len; - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_get_cache_size() */ - - -/*------------------------------------------------------------------------- - * Function: H5C2_get_cache_hit_rate - * - * Purpose: Compute and return the current cache hit rate in - * *hit_rate_ptr. If there have been no accesses since the - * last time the cache hit rate stats were reset, set - * *hit_rate_ptr to 0.0. On error, *hit_rate_ptr is - * undefined. - * - * Return: SUCCEED on success, and FAIL on failure. - * - * Programmer: John Mainzer - * 10/7/04 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -herr_t -H5C2_get_cache_hit_rate(H5C2_t * cache_ptr, - double * hit_rate_ptr) - -{ - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5C2_get_cache_hit_rate, FAIL) - - if ( ( cache_ptr == NULL ) || ( cache_ptr->magic != H5C2__H5C2_T_MAGIC ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr on entry.") - } - - if ( hit_rate_ptr == NULL ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad hit_rate_ptr on entry.") - } - - HDassert( cache_ptr->cache_hits >= 0 ); - HDassert( cache_ptr->cache_accesses >= cache_ptr->cache_hits ); - - if ( cache_ptr->cache_accesses > 0 ) { - - *hit_rate_ptr = ((double)(cache_ptr->cache_hits)) / - ((double)(cache_ptr->cache_accesses)); - - } else { - - *hit_rate_ptr = 0.0; - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_get_cache_hit_rate() */ - - -/*------------------------------------------------------------------------- - * - * Function: H5C2_get_entry_status - * - * Purpose: This function is used to determine whether the cache - * contains an entry with the specified base address. If - * the entry exists, it also reports some status information - * on the entry. - * - * Status information is reported in the locations pointed - * to by the size_ptr, in_cache_ptr, is_dirty_ptr, and - * is_protected_ptr. While in_cache_ptr must be defined, - * the remaining pointers may be NULL, in which case the - * associated data is not reported. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: John Mainzer - * 7/1/05 - * - * Modifications: - * - * JRM -- 4/26/06 - * Added the is_pinned_ptr parameter and supporting code. - * - *------------------------------------------------------------------------- - */ - -herr_t -H5C2_get_entry_status(const H5F_t * f, - haddr_t addr, - size_t * size_ptr, - hbool_t * in_cache_ptr, - hbool_t * is_dirty_ptr, - hbool_t * is_protected_ptr, - hbool_t * is_pinned_ptr) -{ - H5C2_t * cache_ptr; - herr_t ret_value = SUCCEED; /* Return value */ - H5C2_cache_entry_t * entry_ptr = NULL; - - FUNC_ENTER_NOAPI(H5C2_get_entry_status, FAIL) - - HDassert( f ); - HDassert( f->shared ); - - cache_ptr = f->shared->cache2; - - HDassert( cache_ptr != NULL ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - HDassert( H5F_addr_defined(addr) ); - HDassert( in_cache_ptr != NULL ); - - /* this test duplicates two of the above asserts, but we need an - * invocation of HGOTO_ERROR to keep the compiler happy. - */ - if ( ( cache_ptr == NULL ) || ( cache_ptr->magic != H5C2__H5C2_T_MAGIC ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr on entry.") - } - - H5C2__SEARCH_INDEX(cache_ptr, addr, entry_ptr, FAIL) - - if ( entry_ptr == NULL ) { - - /* the entry doesn't exist in the cache -- report this - * and quit. - */ - *in_cache_ptr = FALSE; - - } else { - - *in_cache_ptr = TRUE; - - if ( size_ptr != NULL ) { - - *size_ptr = entry_ptr->size; - } - - if ( is_dirty_ptr != NULL ) { - - *is_dirty_ptr = entry_ptr->is_dirty; - } - - if ( is_protected_ptr != NULL ) { - - *is_protected_ptr = entry_ptr->is_protected; - } - - if ( is_pinned_ptr != NULL ) { - - *is_pinned_ptr = entry_ptr->is_pinned; - } - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_get_entry_status() */ - - -/*------------------------------------------------------------------------- - * Function: H5C2_get_evictions_enabled() - * - * Purpose: Copy the current value of cache_ptr->evictions_enabled into - * *evictions_enabled_ptr. - * - * Return: SUCCEED on success, and FAIL on failure. - * - * Programmer: John Mainzer - * 7/27/07 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -herr_t -H5C2_get_evictions_enabled(const H5C2_t * cache_ptr, - hbool_t * evictions_enabled_ptr) -{ - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5C2_get_evictions_enabled, FAIL) - - if ( ( cache_ptr == NULL ) || - ( cache_ptr->magic != H5C2__H5C2_T_MAGIC ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr on entry.") - } - - if ( evictions_enabled_ptr == NULL ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "Bad evictions_enabled_ptr on entry.") - } - - *evictions_enabled_ptr = cache_ptr->evictions_enabled; - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_get_evictions_enabled() */ - - -/*------------------------------------------------------------------------- - * Function: H5C2_get_trace_file_ptr - * - * Purpose: Get the trace_file_ptr field from the cache. - * - * This field will either be NULL (which indicates that trace - * file logging is turned off), or contain a pointer to the - * open file to which trace file data is to be written. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: John Mainzer - * 1/20/06 - * - *------------------------------------------------------------------------- - */ -herr_t -H5C2_get_trace_file_ptr(const H5C2_t *cache_ptr, FILE **trace_file_ptr_ptr) -{ - FUNC_ENTER_NOAPI_NOFUNC(H5C2_get_trace_file_ptr) - - HDassert(cache_ptr); - HDassert(cache_ptr->magic == H5C2__H5C2_T_MAGIC); - HDassert(trace_file_ptr_ptr); - - *trace_file_ptr_ptr = cache_ptr->trace_file_ptr; - - FUNC_LEAVE_NOAPI(SUCCEED) -} /* H5C2_get_trace_file_ptr() */ - - -/*------------------------------------------------------------------------- - * Function: H5C2_get_trace_file_ptr_from_entry - * - * Purpose: Get the trace_file_ptr field from the cache, via an entry. - * - * This field will either be NULL (which indicates that trace - * file logging is turned off), or contain a pointer to the - * open file to which trace file data is to be written. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: Quincey Koziol - * 6/9/08 - * - *------------------------------------------------------------------------- - */ -herr_t -H5C2_get_trace_file_ptr_from_entry(const H5C2_cache_entry_t *entry_ptr, - FILE ** trace_file_ptr_ptr) -{ - FUNC_ENTER_NOAPI_NOFUNC(H5C2_get_trace_file_ptr_from_entry) - - /* Sanity checks */ - HDassert(entry_ptr); - HDassert(entry_ptr->cache_ptr); - - H5C2_get_trace_file_ptr(entry_ptr->cache_ptr, trace_file_ptr_ptr); - - FUNC_LEAVE_NOAPI(SUCCEED) -} /* H5C2_get_trace_file_ptr_from_entry() */ - - -/*------------------------------------------------------------------------- - * Function: H5C2_insert_entry - * - * Purpose: Adds the specified thing to the cache. The thing need not - * exist on disk yet, but it must have an address and disk - * space reserved. - * - * The primary_dxpl_id and secondary_dxpl_id parameters - * specify the dxpl_ids used on the first write occasioned - * by the insertion (primary_dxpl_id), and on all subsequent - * writes (secondary_dxpl_id). This is useful in the - * metadata cache, but may not be needed elsewhere. If so, - * just use the same dxpl_id for both parameters. - * - * The primary_dxpl_id is the dxpl_id passed to the - * check_write_permitted function if such a function has been - * provided. - * - * Observe that this function cannot occasion a read. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: John Mainzer - * 6/2/04 - * - * Modifications: - * - * JRM -- 7/21/04 - * Updated function for the addition of the hash table. - * - * JRM -- 10/28/04 - * Added code to set the cache_full flag to TRUE when ever - * we need to make space in the cache. - * - * JRM -- 11/22/04 - * Updated function for the addition of the first_flush_ptr - * parameter to H5C2_make_space_in_cache(). - * - * JRM -- 1/6/05 - * Added the flags parameter, and code supporting - * H5C2__SET_FLUSH_MARKER_FLAG. Note that this flag is - * ignored unless the new entry is dirty. - * - * JRM -- 6/6/05 - * Added code to force all inserted entries to be dirty. - * This is part of a set of changes moving management of the - * is_dirty field of H5C2_cache_entry_t into the H5C2 code. - * - * JRM -- 6/24/05 - * Added support for the new write_permitted field of - * the H5C2_t structure. - * - * JRM -- 3/16/06 - * Added initialization for the new is_pinned field of the - * H5C2_cache_entry_t structure. - * - * JRM -- 5/3/06 - * Added initialization for the new dirtied field of the - * H5C2_cache_entry_t structure. - * - * JRM -- 8/9/06 - * Added code supporting insertion of pinned entries. - * - * JRM -- 8/21/06 - * Added initialization for the new flush_in_progress and - * destroy_in_progress fields. - * - * JRM -- 3/29/07 - * Added initialization for the new is_read_only and - * ro_ref_count fields. - * - * JRM -- 7/11/07 - * Reworked the parameter list for the revised metadata - * cache API. The function lost its pointer to H5F_t - * (now supplied via *cache_ptr), and one of dxpl id - * parameters. It gained a entry length parameter. - * Numerous internal changes to support the API change. - * - * JRM -- 8/1/07 - * Added code to disable evictions when the new - * evictions_enabled field is FALSE. - * - * JRM -- 10/12/07 - * Added initialization for the new magic field. - * - * JRM -- 12/31/07 - * Added code supporting flash cache size increases. - * - * JRM -- 3/26/08 - * Added code initializing the journaling related fields. - * Also added code to set the new entries last_trans field - * to the current transaction number and insert the entry - * in the transaction list if journaling is enabled. - * - *------------------------------------------------------------------------- - */ - -herr_t -H5C2_insert_entry(H5F_t * f, - hid_t dxpl_id, - const H5C2_class_t * type, - haddr_t addr, - size_t len, - void * thing, - unsigned int flags) -{ - H5C2_t * cache_ptr; - herr_t result; - herr_t ret_value = SUCCEED; /* Return value */ - hbool_t insert_pinned; - hbool_t set_flush_marker; - hbool_t write_permitted = TRUE; - H5C2_cache_entry_t * entry_ptr; - H5C2_cache_entry_t * test_entry_ptr; - - FUNC_ENTER_NOAPI(H5C2_insert_entry, FAIL) - -#if H5C2_PRINT_ENTRY_POINTS - if ( H5C2_PRINT_ENTRY_POINT_TARGET_TYPE(type->id) ) - { - HDfprintf(stdout, "%s: addr = 0x%lX, len = %d, type = %s.\n", FUNC, - (unsigned long)addr, (int)len, type->name); - } -#endif /* JRM */ - - HDassert( f ); - HDassert( f->shared ); - - cache_ptr = f->shared->cache2; - - HDassert( cache_ptr ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - HDassert( cache_ptr->skip_file_checks || f ); - HDassert( ( ! ( cache_ptr->mdj_enabled ) ) || - ( cache_ptr->trans_in_progress ) ); - HDassert( type ); - HDassert( H5F_addr_defined(addr) ); - HDassert( thing ); - -#if H5C2_DO_EXTREME_SANITY_CHECKS - if ( H5C2_verify_not_in_index(cache_ptr, (H5C2_cache_entry_t *)thing) < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "thing already in index.\n"); - } -#endif /* H5C2_DO_SANITY_CHECKS */ - -#if H5C2_DO_EXTREME_SANITY_CHECKS - if ( H5C2_validate_lru_list(cache_ptr) < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "LRU sanity check failed.\n"); - } -#endif /* H5C2_DO_EXTREME_SANITY_CHECKS */ - - set_flush_marker = ( (flags & H5C2__SET_FLUSH_MARKER_FLAG) != 0 ); - insert_pinned = ( (flags & H5C2__PIN_ENTRY_FLAG) != 0 ); - - entry_ptr = (H5C2_cache_entry_t *)thing; -#ifndef NDEBUG - entry_ptr->magic = H5C2__H5C2_CACHE_ENTRY_T_MAGIC; -#endif /* NDEBUG */ - entry_ptr->cache_ptr = cache_ptr; - entry_ptr->addr = addr; - entry_ptr->type = type; - - entry_ptr->image_ptr = NULL; - entry_ptr->image_up_to_date = FALSE; - - /* newly inserted entries are assumed to be dirty */ - entry_ptr->is_dirty = TRUE; - - /* not protected, so can't be dirtied */ - entry_ptr->dirtied = FALSE; - - entry_ptr->size = len; - - HDassert( entry_ptr->size < H5C2_MAX_ENTRY_SIZE ); - - entry_ptr->in_slist = FALSE; - -#ifdef H5_HAVE_PARALLEL - entry_ptr->clear_on_unprotect = FALSE; -#endif /* H5_HAVE_PARALLEL */ - - entry_ptr->flush_in_progress = FALSE; - entry_ptr->destroy_in_progress = FALSE; - - entry_ptr->ht_next = NULL; - entry_ptr->ht_prev = NULL; - - entry_ptr->next = NULL; - entry_ptr->prev = NULL; - - entry_ptr->aux_next = NULL; - entry_ptr->aux_prev = NULL; - - entry_ptr->last_trans = 0; - entry_ptr->trans_next = NULL; - entry_ptr->trans_prev = NULL; - - H5C2__RESET_CACHE_ENTRY_STATS(entry_ptr) - - if ( ( cache_ptr->flash_size_increase_possible ) && - ( entry_ptr->size > cache_ptr->flash_size_increase_threshold ) ) { - - result = H5C2__flash_increase_cache_size(cache_ptr, 0, - entry_ptr->size); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTINS, FAIL, \ - "H5C2__flash_increase_cache_size failed.") - } - } - - if ( ( cache_ptr->evictions_enabled ) && - ( (cache_ptr->index_size + entry_ptr->size) > - cache_ptr->max_cache_size ) ) { - - size_t space_needed; - - cache_ptr->cache_full = TRUE; - - if ( cache_ptr->check_write_permitted != NULL ) { - - result = (cache_ptr->check_write_permitted)(f, - dxpl_id, - &write_permitted); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTINS, FAIL, \ - "Can't get write_permitted") - } - } else { - - write_permitted = cache_ptr->write_permitted; - } - - HDassert( entry_ptr->size <= H5C2_MAX_ENTRY_SIZE ); - - space_needed = entry_ptr->size; - - if ( space_needed > cache_ptr->max_cache_size ) { - - space_needed = cache_ptr->max_cache_size; - } - - /* Note that space_needed is just the amount of space that - * needed to insert the new entry without exceeding the cache - * size limit. The subsequent call to H5C2_make_space_in_cache() - * may evict the entries required to free more or less space - * depending on conditions. It MAY be less if the cache is - * currently undersized, or more if the cache is oversized. - * - * The cache can exceed its maximum size limit via the following - * mechanisms: - * - * First, it is possible for the cache to grow without - * bound as long as entries are protected and not unprotected. - * - * Second, when writes are not permitted it is also possible - * for the cache to grow without bound. - * - * Finally, we usually don't check to see if the cache is - * oversized at the end of an unprotect. As a result, it is - * possible to have a vastly oversized cache with no protected - * entries as long as all the protects preceed the unprotects. - * - * Since items 1 and 2 are not changing any time soon, I see - * no point in worrying about the third. - */ - - result = H5C2_make_space_in_cache(f, - dxpl_id, - cache_ptr, - space_needed, - write_permitted); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTINS, FAIL, \ - "H5C2_make_space_in_cache failed.") - } - } - - /* verify that the new entry isn't already in the hash table -- scream - * and die if it is. - */ - - H5C2__SEARCH_INDEX(cache_ptr, addr, test_entry_ptr, FAIL) - - if ( test_entry_ptr != NULL ) { - - if ( test_entry_ptr == entry_ptr ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTINS, FAIL, \ - "entry already in cache.") - - } else { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTINS, FAIL, \ - "duplicate entry in cache.") - } - } - - /* we don't initialize the protected field until here as it is - * possible that the entry is already in the cache, and already - * protected. If it is, we don't want to make things worse by - * marking it unprotected. - */ - - entry_ptr->is_protected = FALSE; - entry_ptr->is_read_only = FALSE; - entry_ptr->ro_ref_count = 0; - - entry_ptr->is_pinned = insert_pinned; - - H5C2__INSERT_IN_INDEX(cache_ptr, entry_ptr, FAIL) - - /* New entries are presumed to be dirty, so this if statement is - * unnecessary. Rework it once the rest of the code changes are - * in and tested. -- JRM - */ - if ( entry_ptr->is_dirty ) { - - entry_ptr->flush_marker = set_flush_marker; - H5C2__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, FAIL) - - } else { - - entry_ptr->flush_marker = FALSE; - } - - /* insert the entry in the transaction list if journaling is enabled */ - H5C2__INSERT_ENTRY_IN_TL(cache_ptr, entry_ptr, FAIL); - - H5C2__UPDATE_RP_FOR_INSERTION(cache_ptr, entry_ptr, FAIL) - -#if H5C2_DO_EXTREME_SANITY_CHECKS - if ( H5C2_validate_lru_list(cache_ptr) < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "LRU sanity check failed.\n"); - } -#endif /* H5C2_DO_EXTREME_SANITY_CHECKS */ - - H5C2__UPDATE_STATS_FOR_INSERTION(cache_ptr, entry_ptr) - -done: - -#if H5C2_DO_EXTREME_SANITY_CHECKS - if ( H5C2_validate_lru_list(cache_ptr) < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "LRU sanity check failed.\n"); - } -#endif /* H5C2_DO_EXTREME_SANITY_CHECKS */ - -#if H5C2_PRINT_EXIT_POINTS - if ( H5C2_PRINT_ENTRY_POINT_TARGET_TYPE(type->id) ) { - HDfprintf(stdout, "%s: Exiting with result = %d.\n", - FUNC, (int)ret_value); - } -#endif /* H5C2_PRINT_EXIT_POINTS */ - - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_insert_entry() */ - - -/*------------------------------------------------------------------------- - * - * Function: H5C2_mark_entries_as_clean - * - * Purpose: When the H5C2 code is used to implement the metadata caches - * in PHDF5, only the cache with MPI_rank 0 is allowed to - * actually write entries to disk -- all other caches must - * retain dirty entries until they are advised that the - * entries are clean. - * - * This function exists to allow the H5C2 code to receive these - * notifications. - * - * The function receives a list of entry base addresses - * which must refer to dirty entries in the cache. If any - * of the entries are either clean or don't exist, the - * function flags an error. - * - * The function scans the list of entries and flushes all - * those that are currently unprotected with the - * H5C2__FLUSH_CLEAR_ONLY_FLAG. Those that are currently - * protected are flagged for clearing when they are - * unprotected. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: John Mainzer - * 7/5/05 - * - * Modifications: - * - * Reworked function to flush entries in LRU order instead - * of increasing address order. The hope is that this will - * improve the hit rate on the slave caches. - * - * JRM - 10/13/05 - * - * Leave the old code in place for now (commented out) for - * benchmarking. - * - * JRM -- 4/13/06 - * Updated function to deal with pinned entries. - * - * JRM -- 7/11/07 - * Revised function for the new metadata cache API. The - * function lost its point to H5F_t (now supplied via - * *cache_ptr), and one of its dxpl ids. Also internal - * changes supporting the revised API. - * - * JRM -- 10/13/07 - * Didn't modify this function to detect the case in which - * the LRU is modified out from under it. It shouldn't be - * an issue here, as this function is only called in the - * parallel case, and serialize callbacks must not modify - * other entries in parallel case. If they do, they will - * cause inconsistancies in metadata across processes. - * - * Further, since this function only clears entries, and - * thus the serialize functions are never called, the - * situation will be even worse, as the changes will only - * exist on process 0. - * - * Bottom line -- the calls to H5C2_flush_single_entry() - * in this function will not call serialize, thus no change - * in the LRU is possible. Even if they did, the serialize() - * callbacks are banned from making such changes in the - * parallel case. - * - *------------------------------------------------------------------------- - */ - -#ifdef H5_HAVE_PARALLEL -herr_t -H5C2_mark_entries_as_clean(H5F_t * f, - hid_t dxpl_id, - int32_t ce_array_len, - haddr_t * ce_array_ptr) -{ - H5C2_t * cache_ptr; - herr_t ret_value = SUCCEED; /* Return value */ - int entries_cleared; - int entries_examined; - int i; - int initial_list_len; - haddr_t addr; -#if H5C2_DO_SANITY_CHECKS - int pinned_entries_marked = 0; - int protected_entries_marked = 0; - int other_entries_marked = 0; - haddr_t last_addr; -#endif /* H5C2_DO_SANITY_CHECKS */ - H5C2_cache_entry_t * clear_ptr = NULL; - H5C2_cache_entry_t * entry_ptr = NULL; - - FUNC_ENTER_NOAPI(H5C2_mark_entries_as_clean, FAIL) - - HDassert( f ); - HDassert( f->shared ); - cache_ptr = f->shared->cache2; - HDassert( cache_ptr ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - - HDassert( ce_array_len > 0 ); - HDassert( ce_array_ptr != NULL ); - -#if H5C2_DO_EXTREME_SANITY_CHECKS - if ( H5C2_validate_lru_list(cache_ptr) < 0 ) { - - HDassert(0); - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "LRU sanity check failed.\n"); - } -#endif /* H5C2_DO_EXTREME_SANITY_CHECKS */ - - for ( i = 0; i < ce_array_len; i++ ) - { - addr = ce_array_ptr[i]; - -#if H5C2_DO_SANITY_CHECKS - if ( i == 0 ) { - - last_addr = addr; - - } else { - - if ( last_addr == addr ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "Duplicate entry in cleaned list.\n"); - - } else if ( last_addr > addr ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "cleaned list not sorted.\n"); - } - } - -#if H5C2_DO_EXTREME_SANITY_CHECKS - if ( H5C2_validate_lru_list(cache_ptr) < 0 ) { - - HDassert(0); - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "LRU sanity check failed.\n"); - } -#endif /* H5C2_DO_EXTREME_SANITY_CHECKS */ -#endif /* H5C2_DO_SANITY_CHECKS */ - - HDassert( H5F_addr_defined(addr) ); - - H5C2__SEARCH_INDEX(cache_ptr, addr, entry_ptr, FAIL) - - if ( entry_ptr == NULL ) { -#if H5C2_DO_SANITY_CHECKS - HDfprintf(stdout, - "H5C2_mark_entries_as_clean: entry[%d] = %ld not in cache.\n", - (int)i, - (long)addr); -#endif /* H5C2_DO_SANITY_CHECKS */ - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "Listed entry not in cache?!?!?.") - - } else if ( ! entry_ptr->is_dirty ) { - -#if H5C2_DO_SANITY_CHECKS - HDfprintf(stdout, - "H5C2_mark_entries_as_clean: entry %ld is not dirty!?!\n", - (long)addr); -#endif /* H5C2_DO_SANITY_CHECKS */ - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "Listed entry not dirty?!?!?.") -#if 0 /* original code */ - } else if ( entry_ptr->is_protected ) { - - entry_ptr->clear_on_unprotect = TRUE; - - } else { - - if ( H5C2_flush_single_entry(f, - dxpl_id, - cache_ptr, - entry_ptr->type, - addr, - H5C2__FLUSH_CLEAR_ONLY_FLAG, - TRUE) < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't clear entry.") - } - } -#else /* modified code */ - } else { - /* Mark the entry to be cleared on unprotect. We will - * scan the LRU list shortly, and clear all those entries - * not currently protected. - */ - entry_ptr->clear_on_unprotect = TRUE; -#if H5C2_DO_SANITY_CHECKS - if ( entry_ptr->is_protected ) { - - protected_entries_marked++; - - } else if ( entry_ptr->is_pinned ) { - - pinned_entries_marked++; - - } else { - - other_entries_marked++; - } -#endif /* H5C2_DO_SANITY_CHECKS */ - } -#endif /* end modified code */ - } -#if 1 /* modified code */ - /* Scan through the LRU list from back to front, and flush the - * entries whose clear_on_unprotect flags are set. Observe that - * any protected entries will not be on the LRU, and therefore - * will not be flushed at this time. - */ - - entries_cleared = 0; - entries_examined = 0; - initial_list_len = cache_ptr->LRU_list_len; - entry_ptr = cache_ptr->LRU_tail_ptr; - - while ( ( entry_ptr != NULL ) && - ( entries_examined <= initial_list_len ) && - ( entries_cleared < ce_array_len ) ) - { - if ( entry_ptr->clear_on_unprotect ) { - - entry_ptr->clear_on_unprotect = FALSE; - clear_ptr = entry_ptr; - entry_ptr = entry_ptr->prev; - entries_cleared++; - - if ( H5C2_flush_single_entry(f, - dxpl_id, - cache_ptr, - clear_ptr->type, - clear_ptr->addr, - H5C2__FLUSH_CLEAR_ONLY_FLAG, - TRUE) < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't clear entry.") - } - } else { - - entry_ptr = entry_ptr->prev; - } - entries_examined++; - } - -#if H5C2_DO_SANITY_CHECKS - HDassert( entries_cleared == other_entries_marked ); -#endif /* H5C2_DO_SANITY_CHECKS */ - - /* It is also possible that some of the cleared entries are on the - * pinned list. Must scan that also. - */ - - entry_ptr = cache_ptr->pel_head_ptr; - - while ( entry_ptr != NULL ) - { - if ( entry_ptr->clear_on_unprotect ) { - - entry_ptr->clear_on_unprotect = FALSE; - clear_ptr = entry_ptr; - entry_ptr = entry_ptr->next; - entries_cleared++; - - if ( H5C2_flush_single_entry(f, - dxpl_id, - cache_ptr, - clear_ptr->type, - clear_ptr->addr, - H5C2__FLUSH_CLEAR_ONLY_FLAG, - TRUE) < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't clear entry.") - } - } else { - - entry_ptr = entry_ptr->next; - } - } - -#if H5C2_DO_SANITY_CHECKS - HDassert( entries_cleared == pinned_entries_marked + other_entries_marked ); - HDassert( entries_cleared + protected_entries_marked == ce_array_len ); -#endif /* H5C2_DO_SANITY_CHECKS */ - - HDassert( ( entries_cleared == ce_array_len ) || - ( (ce_array_len - entries_cleared) <= cache_ptr->pl_len ) ); - -#if H5C2_DO_SANITY_CHECKS - i = 0; - entry_ptr = cache_ptr->pl_head_ptr; - while ( entry_ptr != NULL ) - { - if ( entry_ptr->clear_on_unprotect ) { - - i++; - } - entry_ptr = entry_ptr->next; - } - HDassert( (entries_cleared + i) == ce_array_len ); -#endif /* H5C2_DO_SANITY_CHECKS */ -#endif /* modified code */ - -done: - -#if H5C2_DO_EXTREME_SANITY_CHECKS - if ( H5C2_validate_lru_list(cache_ptr) < 0 ) { - - HDassert(0); - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "LRU sanity check failed.\n"); - } -#endif /* H5C2_DO_EXTREME_SANITY_CHECKS */ - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_mark_entries_as_clean() */ -#endif /* H5_HAVE_PARALLEL */ - - -/*------------------------------------------------------------------------- - * Function: H5C2_mark_pinned_entry_dirty - * - * Purpose: Mark a pinned entry as dirty. The target entry MUST be - * be pinned, and MUST be unprotected. - * - * If the entry has changed size, the function updates - * data structures for the size change. - * - * If the entry is not already dirty, the function places - * the entry on the skip list. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: John Mainzer - * 3/22/06 - * - *------------------------------------------------------------------------- - */ -herr_t -H5C2_mark_pinned_entry_dirty(void *thing, hbool_t size_changed, size_t new_size) -{ - H5C2_t * cache_ptr; - H5C2_cache_entry_t * entry_ptr = (H5C2_cache_entry_t *)thing; - size_t size_increase; - herr_t result; - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5C2_mark_pinned_entry_dirty, FAIL) - - /* Sanity checks */ - HDassert(entry_ptr); - HDassert(H5F_addr_defined(entry_ptr->addr)); - cache_ptr = entry_ptr->cache_ptr; - HDassert(cache_ptr); - HDassert(cache_ptr->magic == H5C2__H5C2_T_MAGIC); - HDassert((!cache_ptr->mdj_enabled) || cache_ptr->trans_in_progress); - -#if H5C2_PRINT_ENTRY_POINTS - if(H5C2_PRINT_ENTRY_POINT_TARGET_TYPE(entry_ptr->type->id)) - HDfprintf(stdout, - "%s: addr = 0x%lX, size_changed = %d, new_size = %d.\n", - FUNC, (unsigned long)(entry_ptr->addr), (int)size_changed, - (int)new_size); -#endif /* JRM */ - - /* Check for usage errors */ - if(!entry_ptr->is_pinned) - HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKDIRTY, FAIL, "Entry isn't pinned??") - if(entry_ptr->is_protected) - HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKDIRTY, FAIL, "Entry is protected??") - - /* mark the entry as dirty if it isn't already */ - entry_ptr->is_dirty = TRUE; - entry_ptr->image_up_to_date = FALSE; - - /* update for change in entry size if necessary */ - if ( ( size_changed ) && ( entry_ptr->size != new_size ) ) { - - /* Release the current image */ - if( entry_ptr->image_ptr ) - entry_ptr->image_ptr = H5MM_xfree(entry_ptr->image_ptr); - - /* do a flash cache size increase if appropriate */ - if ( cache_ptr->flash_size_increase_possible ) { - - if ( new_size > entry_ptr->size ) { - - size_increase = new_size - entry_ptr->size; - - if ( size_increase >= - cache_ptr->flash_size_increase_threshold ) { - if(H5C2__flash_increase_cache_size(cache_ptr, entry_ptr->size, new_size) < 0) - HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "flash cache increase failed") - } - } - } - - /* update the pinned entry list */ - H5C2__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr->pel_len), \ - (cache_ptr->pel_size), \ - (entry_ptr->size), (new_size)); - - /* update the hash table */ - H5C2__UPDATE_INDEX_FOR_SIZE_CHANGE((cache_ptr), (entry_ptr->size),\ - (new_size)); - - /* if the entry is in the skip list, update that too */ - if ( entry_ptr->in_slist ) { - - H5C2__UPDATE_SLIST_FOR_SIZE_CHANGE((cache_ptr), (entry_ptr->size),\ - (new_size)); - } - - /* if journaling is enabled, and the entry is already in the - * transaction list, update that list for the size change as well. - */ - H5C2__UPDATE_TL_FOR_ENTRY_SIZE_CHANGE((cache_ptr), (entry_ptr), \ - (entry_ptr->size), (new_size)); - - /* update statistics just before changing the entry size */ - H5C2__UPDATE_STATS_FOR_ENTRY_SIZE_CHANGE((cache_ptr), (entry_ptr), \ - (new_size)); - - /* finally, update the entry size proper */ - entry_ptr->size = new_size; - } - - if ( ! (entry_ptr->in_slist) ) { - - H5C2__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, FAIL) - } - - /* if journaling is enabled, check to see if the entry is in the - * transaction list. If it isn't, insert it. If it is, move it to - * the head of the list. - */ - H5C2__UPDATE_TL_FOR_ENTRY_DIRTY(cache_ptr, entry_ptr, FAIL) - - H5C2__UPDATE_STATS_FOR_DIRTY_PIN(cache_ptr, entry_ptr) - -done: -#if H5C2_PRINT_EXIT_POINTS - if(H5C2_PRINT_ENTRY_POINT_TARGET_TYPE(entry_ptr->type->id)) - HDfprintf(stdout, "%s: Exiting with result = %d.\n", FUNC, (int)ret_value); -#endif /* H5C2_PRINT_EXIT_POINTS */ - - FUNC_LEAVE_NOAPI(ret_value) -} /* H5C2_mark_pinned_entry_dirty() */ - - -/*------------------------------------------------------------------------- - * Function: H5C2_mark_pinned_or_protected_entry_dirty - * - * Purpose: Mark a pinned or protected entry as dirty. The target entry - * MUST be either pinned or protected, and MAY be both. - * - * At present, this funtion does not support size change. - * - * In the protected case, this call is the functional - * equivalent of setting the H5C2__DIRTIED_FLAG on an unprotect - * call. - * - * In the pinned but not protected case, if the entry is not - * already dirty, the function places function marks the entry - * dirty and places it on the skip list. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: John Mainzer - * 5/15/06 - * - *------------------------------------------------------------------------- - */ -herr_t -H5C2_mark_pinned_or_protected_entry_dirty(void *thing) -{ - H5C2_t * cache_ptr; - H5C2_cache_entry_t * entry_ptr = (H5C2_cache_entry_t *)thing; - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5C2_mark_pinned_or_protected_entry_dirty, FAIL) - - /* Sanity checks */ - HDassert(entry_ptr); - HDassert(H5F_addr_defined(entry_ptr->addr)); - cache_ptr = entry_ptr->cache_ptr; - HDassert(cache_ptr); - HDassert(cache_ptr->magic == H5C2__H5C2_T_MAGIC); - -#if H5C2_PRINT_ENTRY_POINTS - if(H5C2_PRINT_ENTRY_POINT_TARGET_TYPE(entry_ptr->type->id)) - HDfprintf(stdout, "%s: addr = 0x%lX, type = %s.\n", FUNC, - (unsigned long)(entry_ptr->addr), entry_ptr->type->name); -#endif /* JRM */ - - if ( entry_ptr->is_protected ) { - - HDassert( ! ((entry_ptr)->is_read_only) ); - - /* set the dirtied flag */ - entry_ptr->dirtied = TRUE; - - /* don't do anything with the transaction list now, as the - * entry will be added to the transaction list when it is - * unprotected. - */ - - } else if ( entry_ptr->is_pinned ) { - - /* mark the entry as dirty if it isn't already */ - entry_ptr->is_dirty = TRUE; - entry_ptr->image_up_to_date = FALSE; - - /* If journaling is enabled, must add the entry to the transaction - * list, if it is not there already. - */ - H5C2__UPDATE_TL_FOR_ENTRY_DIRTY(cache_ptr, entry_ptr, FAIL); - - if ( ! (entry_ptr->in_slist) ) { - - H5C2__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, FAIL) - } - - H5C2__UPDATE_STATS_FOR_DIRTY_PIN(cache_ptr, entry_ptr) - - } else { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTMARKDIRTY, FAIL, \ - "Entry is neither pinned nor protected??") - } - -done: -#if H5C2_PRINT_EXIT_POINTS - if(H5C2_PRINT_ENTRY_POINT_TARGET_TYPE(entry_ptr->type->id)) - HDfprintf(stdout, "%s: Exiting with result = %d.\n", FUNC, (int)ret_value); -#endif /* H5C2_PRINT_EXIT_POINTS */ - - FUNC_LEAVE_NOAPI(ret_value) -} /* H5C2_mark_pinned_or_protected_entry_dirty() */ - - -/*------------------------------------------------------------------------- - * - * Function: H5C2_rename_entry - * - * Purpose: Use this function to notify the cache that an entry's - * file address changed. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: John Mainzer - * 6/2/04 - * - * Modifications: - * - * JRM -- 7/21/04 - * Updated function for the addition of the hash table. - * - * JRM -- 6/6/05 - * Updated function to force all renamed entries to be - * dirty. This is part of a series of code modifications - * moving management of the is_dirty field of - * H5C2_cache_entry_t into the H5C2 code. - * - * JRM -- 4/3/06 - * Updated function to disallow renaming of pinned entries. - * - * JRM -- 4/27/06 - * Updated function to support renaming of pinned entries. - * - * JRM -- 8/24/06 - * Updated function to refrain from altering the index, the - * replacement policy data structures, and skip list when - * the function is called within the flush callback for the - * target entry and the target entry is being destroyed. - * - * Note that in this case H5C2_flush_single_entry() will handle - * all these details for us. - * - * JRM -- 10/13/07 - * Renames of the target entry in a serialize callback are - * now handled by H5C2_flush_single_entry() -- hence the above - * modification is now obsolete. - * - * JRM -- 3/31/08 - * Updated function to check if journaling is enabled. If - * it is, the function now inserts the renamed entry in the - * transaction list (if it wasn't there already). - * - * Also added sanity checks that will scream and die if - * we attempt to rename an entry during either a destroy - * or flush if journaling is enabled. Recall that any - * rename should have already been triggered when the - * entry was serialized to construct its journal entry. - * - *------------------------------------------------------------------------- - */ - -herr_t -H5C2_rename_entry(H5C2_t * cache_ptr, - const H5C2_class_t * type, - haddr_t old_addr, - haddr_t new_addr) -{ - herr_t ret_value = SUCCEED; /* Return value */ - hbool_t was_dirty; - hbool_t had_jwip; - H5C2_cache_entry_t * entry_ptr = NULL; - H5C2_cache_entry_t * test_entry_ptr = NULL; -#if H5C2_DO_SANITY_CHECKS - hbool_t removed_entry_from_slist = FALSE; -#endif /* H5C2_DO_SANITY_CHECKS */ - - FUNC_ENTER_NOAPI(H5C2_rename_entry, FAIL) - -#if H5C2_PRINT_ENTRY_POINTS - if ( H5C2_PRINT_ENTRY_POINT_TARGET_TYPE(type->id) ) - { - HDfprintf(stdout, "%s: type = %s, old_addr = 0x%lX, new_addr = 0x%lx.\n", - FUNC, type->name, (unsigned long)old_addr, - (unsigned long)new_addr); - } -#endif /* JRM */ - - HDassert( cache_ptr ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - HDassert( type ); - HDassert( H5F_addr_defined(old_addr) ); - HDassert( H5F_addr_defined(new_addr) ); - HDassert( H5F_addr_ne(old_addr, new_addr) ); - -#if H5C2_DO_EXTREME_SANITY_CHECKS - if ( H5C2_validate_lru_list(cache_ptr) < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "LRU sanity check failed.\n"); - } -#endif /* H5C2_DO_EXTREME_SANITY_CHECKS */ - - H5C2__SEARCH_INDEX(cache_ptr, old_addr, entry_ptr, FAIL) - - if ( ( entry_ptr == NULL ) || ( entry_ptr->type != type ) ) { - - /* the old item doesn't exist in the cache, so we are done. */ - HGOTO_DONE(SUCCEED) - } - - HDassert( entry_ptr->addr == old_addr ); - HDassert( entry_ptr->type == type ); - - if ( entry_ptr->is_protected ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTRENAME, FAIL, \ - "Target entry is protected.") - } - - if ( ( entry_ptr->destroy_in_progress ) && - ( cache_ptr->mdj_enabled ) ) - { - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "rename on destroy when journaling is enabled.\n"); - } - - if ( ( entry_ptr->flush_in_progress ) && - ( cache_ptr->mdj_enabled ) ) - { - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "rename on flush when journaling is enabled.\n"); - } - - H5C2__SEARCH_INDEX(cache_ptr, new_addr, test_entry_ptr, FAIL) - - if ( test_entry_ptr != NULL ) { /* we are hosed */ - - if ( test_entry_ptr->type == type ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTRENAME, FAIL, \ - "Target already renamed & reinserted???.") - - } else { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTRENAME, FAIL, \ - "New address already in use?.") - - } - } - - /* If we get this far we have work to do. Remove *entry_ptr from - * the hash table (and skip list if necessary), change its address to the - * new address, mark it as dirty (if it isn't already) and then re-insert. - * - * Update the replacement policy for a hit to avoid an eviction before - * the renamed entry is touched. Update stats for a rename. - * - * Note that we do not check the size of the cache, or evict anything. - * Since this is a simple re-name, cache size should be unaffected. - * - * Check to see if the target entry is in the process of being destroyed - * before we delete from the index, etc. If it is, all we do is - * change the addr. If the entry is only in the process of being flushed, - * don't mark it as dirty either, lest we confuse the flush call back. - */ - - if ( ! ( entry_ptr->destroy_in_progress ) ) { - - H5C2__DELETE_FROM_INDEX(cache_ptr, entry_ptr) - - if ( entry_ptr->in_slist ) { - - HDassert( cache_ptr->slist_ptr ); - - H5C2__REMOVE_ENTRY_FROM_SLIST(cache_ptr, entry_ptr) - -#if H5C2_DO_SANITY_CHECKS - - removed_entry_from_slist = TRUE; - -#endif /* H5C2_DO_SANITY_CHECKS */ - } - } - - entry_ptr->addr = new_addr; - - if ( ! ( entry_ptr->destroy_in_progress ) ) { - - was_dirty = entry_ptr->is_dirty; - - if ( ! ( entry_ptr->flush_in_progress ) ) { - - entry_ptr->is_dirty = TRUE; - /* This shouldn't be needed, but it keeps the test code happy */ - entry_ptr->image_up_to_date = FALSE; - } - - H5C2__INSERT_IN_INDEX(cache_ptr, entry_ptr, FAIL) - - if ( ! ( entry_ptr->flush_in_progress ) ) { - - H5C2__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, FAIL) - -#if H5C2_DO_SANITY_CHECKS - - if ( removed_entry_from_slist ) { - - /* we just removed the entry from the slist. Thus we - * must touch up cache_ptr->slist_len_increase and - * cache_ptr->slist_size_increase to keep from skewing - * the sanity checks. - */ - HDassert( cache_ptr->slist_len_increase > 1 ); - HDassert( cache_ptr->slist_size_increase > entry_ptr->size ); - - cache_ptr->slist_len_increase -= 1; - cache_ptr->slist_size_increase -= entry_ptr->size; - } - -#endif /* H5C2_DO_SANITY_CHECKS */ - - /* make note of whether the target entry had a journal write - * in progress -- will need this fact to update the replacement - * policy structures for the rename. - */ - had_jwip = ( entry_ptr->last_trans != 0 ); - - /* If journaling is enabled, add the entry to the transaction - * list, if it isn't there already. - */ - H5C2__UPDATE_TL_FOR_ENTRY_DIRTY(cache_ptr, entry_ptr, FAIL); - - H5C2__UPDATE_RP_FOR_RENAME(cache_ptr, entry_ptr, was_dirty, \ - had_jwip, FAIL); - } - } - - H5C2__UPDATE_STATS_FOR_RENAME(cache_ptr, entry_ptr) - -done: - -#if H5C2_DO_EXTREME_SANITY_CHECKS - if ( H5C2_validate_lru_list(cache_ptr) < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "LRU sanity check failed.\n"); - } -#endif /* H5C2_DO_EXTREME_SANITY_CHECKS */ - -#if H5C2_PRINT_EXIT_POINTS - if ( H5C2_PRINT_ENTRY_POINT_TARGET_TYPE(type->id) ) { - HDfprintf(stdout, "%s: Exiting with result = %d.\n", - FUNC, (int)ret_value); - } -#endif /* H5C2_PRINT_EXIT_POINTS */ - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_rename_entry() */ - - -/*------------------------------------------------------------------------- - * Function: H5C2_resize_pinned_entry - * - * Purpose: Resize a pinned entry. The target entry MUST be - * be pinned, and MUST not be unprotected. - * - * Resizing an entry dirties it, so if the entry is not - * already dirty, the function places the entry on the - * skip list. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: John Mainzer - * 7/5/06 - * - *------------------------------------------------------------------------- - */ -herr_t -H5C2_resize_pinned_entry(void *thing, size_t new_size) -{ - H5C2_t * cache_ptr; - H5C2_cache_entry_t * entry_ptr = (H5C2_cache_entry_t *)thing; - size_t size_increase; - herr_t result; - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5C2_resize_pinned_entry, FAIL) - - /* Sanity checks */ - HDassert(entry_ptr); - HDassert(H5F_addr_defined(entry_ptr->addr)); - cache_ptr = entry_ptr->cache_ptr; - HDassert(cache_ptr); - HDassert(cache_ptr->magic == H5C2__H5C2_T_MAGIC); - -#if H5C2_PRINT_ENTRY_POINTS - if(H5C2_PRINT_ENTRY_POINT_TARGET_TYPE(entry_ptr->type->id)) - HDfprintf(stdout, "%s: type = %s, addr = 0x%lX, new_size = %d.\n", - FUNC, entry_ptr->type->name, (unsigned long)(entry_ptr->addr), - (int)new_size); -#endif /* JRM */ - - /* Check for usage errors */ - if(new_size <= 0) - HGOTO_ERROR(H5E_CACHE, H5E_CANTRESIZE, FAIL, "New size is non-positive.") - if(!entry_ptr->is_pinned) - HGOTO_ERROR(H5E_CACHE, H5E_CANTRESIZE, FAIL, "Entry isn't pinned??") - if(entry_ptr->is_protected) - HGOTO_ERROR(H5E_CACHE, H5E_CANTRESIZE, FAIL, "Entry is protected??") - - /* resizing dirties entries -- mark the entry as dirty if it - * isn't already - */ - entry_ptr->is_dirty = TRUE; - entry_ptr->image_up_to_date = FALSE; - - /* update for change in entry size if necessary */ - if ( entry_ptr->size != new_size ) { - - /* Release the current image */ - if( entry_ptr->image_ptr ) - entry_ptr->image_ptr = H5MM_xfree(entry_ptr->image_ptr); - - /* do a flash cache size increase if appropriate */ - if ( cache_ptr->flash_size_increase_possible ) { - - if ( new_size > entry_ptr->size ) { - - size_increase = new_size - entry_ptr->size; - - if ( size_increase >= - cache_ptr->flash_size_increase_threshold ) { - - result = H5C2__flash_increase_cache_size(cache_ptr, - entry_ptr->size, - new_size); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \ - "H5C2__flash_increase_cache_size failed.") - } - } - } - } - - /* update the protected entry list */ - H5C2__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr->pel_len), \ - (cache_ptr->pel_size), \ - (entry_ptr->size), (new_size)); - - /* update the hash table */ - H5C2__UPDATE_INDEX_FOR_SIZE_CHANGE((cache_ptr), (entry_ptr->size),\ - (new_size)); - - /* if the entry is in the skip list, update that too */ - if ( entry_ptr->in_slist ) { - - H5C2__UPDATE_SLIST_FOR_SIZE_CHANGE((cache_ptr), (entry_ptr->size),\ - (new_size)); - } - - /* if journaling is enabled, and the entry is already in the - * transaction list, update that list for the size change as well. - */ - H5C2__UPDATE_TL_FOR_ENTRY_SIZE_CHANGE((cache_ptr), (entry_ptr), \ - (entry_ptr->size), (new_size)); - - - /* update statistics just before changing the entry size */ - H5C2__UPDATE_STATS_FOR_ENTRY_SIZE_CHANGE((cache_ptr), (entry_ptr), \ - (new_size)); - - /* finally, update the entry size proper */ - entry_ptr->size = new_size; - } - - if ( ! (entry_ptr->in_slist) ) { - - H5C2__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, FAIL) - } - - /* if journaling is enabled, check to see if the entry is in the - * transaction list. If it isn't, insert it. If it is, move it to - * the head of the list. - */ - H5C2__UPDATE_TL_FOR_ENTRY_DIRTY(cache_ptr, entry_ptr, FAIL) - - H5C2__UPDATE_STATS_FOR_DIRTY_PIN(cache_ptr, entry_ptr) - -done: -#if H5C2_PRINT_EXIT_POINTS - if(H5C2_PRINT_ENTRY_POINT_TARGET_TYPE(entry_ptr->type->id)) - HDfprintf(stdout, "%s: Exiting with result = %d.\n", FUNC, (int)ret_value); -#endif /* H5C2_PRINT_EXIT_POINTS */ - - FUNC_LEAVE_NOAPI(ret_value) -} /* H5C2_resize_pinned_entry() */ - - -/*------------------------------------------------------------------------- - * Function: H5C2_pin_protected_entry() - * - * Purpose: Pin a protected cache entry. The entry must be protected - * at the time of call, and must be unpinned. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: John Mainzer - * 4/26/06 - * - *------------------------------------------------------------------------- - */ -herr_t -H5C2_pin_protected_entry(void *thing) -{ - H5C2_t * cache_ptr; - H5C2_cache_entry_t * entry_ptr = (H5C2_cache_entry_t *)thing; - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5C2_pin_protected_entry, FAIL) - -#if H5C2_PRINT_ENTRY_POINTS - if(H5C2_PRINT_ENTRY_POINT_TARGET_TYPE(entry_ptr->type->id)) - HDfprintf(stdout, "%s: addr = 0x%lX, type = %s.\n", FUNC, - (unsigned long)(entry_ptr->addr), entry_ptr->type->name); -#endif /* JRM */ - - /* Sanity checks */ - HDassert(entry_ptr); - HDassert(H5F_addr_defined(entry_ptr->addr)); - cache_ptr = entry_ptr->cache_ptr; - HDassert(cache_ptr); - HDassert(cache_ptr->magic == H5C2__H5C2_T_MAGIC); - - /* Check for usage errors */ - if(!entry_ptr->is_protected) - HGOTO_ERROR(H5E_CACHE, H5E_CANTPIN, FAIL, "Entry isn't protected") - if(entry_ptr->is_pinned) - HGOTO_ERROR(H5E_CACHE, H5E_CANTPIN, FAIL, "Entry is already pinned") - - /* Pin entry */ - entry_ptr->is_pinned = TRUE; - - /* Update statistics for entry */ - H5C2__UPDATE_STATS_FOR_PIN(cache_ptr, entry_ptr) - -done: -#if H5C2_PRINT_EXIT_POINTS - if(H5C2_PRINT_ENTRY_POINT_TARGET_TYPE(entry_ptr->type->id)) - HDfprintf(stdout, "%s: Exiting with result = %d.\n", FUNC, (int)ret_value); -#endif /* H5C2_PRINT_EXIT_POINTS */ - - FUNC_LEAVE_NOAPI(ret_value) -} /* H5C2_pin_protected_entry() */ - - -/*------------------------------------------------------------------------- - * Function: H5C2_protect - * - * Purpose: If the target entry is not in the cache, load it. If - * necessary, attempt to evict one or more entries to keep - * the cache within its maximum size. - * - * Mark the target entry as protected, and return its address - * to the caller. The caller must call H5C2_unprotect() when - * finished with the entry. - * - * While it is protected, the entry may not be either evicted - * or flushed -- nor may it be accessed by another call to - * H5C2_protect. Any attempt to do so will result in a failure. - * - * The primary_dxpl_id and secondary_dxpl_id parameters - * specify the dxpl_ids used on the first write occasioned - * by the insertion (primary_dxpl_id), and on all subsequent - * writes (secondary_dxpl_id). This is useful in the - * metadata cache, but may not be needed elsewhere. If so, - * just use the same dxpl_id for both parameters. - * - * All reads are performed with the primary_dxpl_id. - * - * Similarly, the primary_dxpl_id is passed to the - * check_write_permitted function if it is called. - * - * Return: Success: Ptr to the desired entry - * - * Failure: NULL - * - * Programmer: John Mainzer - 6/2/04 - * - * Modifications: - * - * JRM -- 7/21/04 - * Updated for the addition of the hash table. - * - * JRM -- 10/28/04 - * Added code to set cache_full to TRUE whenever we try to - * make space in the cache. - * - * JRM -- 11/12/04 - * Added code to call to H5C2_make_space_in_cache() - * after the call to H5C2__auto_adjust_cache_size() if that - * function sets the size_decreased flag is TRUE. - * - * JRM -- 4/25/05 - * The size_decreased flag can also be set to TRUE in - * H5C2_set_cache_auto_resize_config() if a new configuration - * forces an immediate reduction in cache size. Modified - * the code to deal with this eventuallity. - * - * JRM -- 6/24/05 - * Added support for the new write_permitted field of H5C2_t. - * - * JRM -- 10/22/05 - * Hand optimizations. - * - * JRM -- 5/3/06 - * Added code to set the new dirtied field in - * H5C2_cache_entry_t to FALSE prior to return. - * - * JRM -- 6/23/06 - * Modified code to allow dirty entries to be loaded from - * disk. This is necessary as a bug fix in the object - * header code requires us to modify a header as it is read. - * - * JRM -- 3/28/07 - * Added the flags parameter and supporting code. At least - * for now, this parameter is used to allow the entry to - * be protected read only, thus allowing multiple protects. - * - * Also added code to allow multiple read only protects - * of cache entries. - * - * JRM -- 7/27/07 - * Added code supporting the new evictions_enabled field - * in H5C2_t. - * - * JRM -- 7/11/07 - * Revised function for the new metadata cache API. The - * function lost its point to H5F_t (now supplied via - * *cache_ptr), one of its dxpl ids. and one of the udata - * fields. Gained the len parameter. Also internal - * changes supporting the revised API. - * - * JRM -- 1/3/08 - * Added to do a flash cache size increase if appropriate - * when a large entry is loaded. - * - * JRM 3/31/08 - * Updated function to insert the newly protected entry in - * the transaction list if journaling is enabled and the - * entry was dirtied on load. - * - *------------------------------------------------------------------------- - */ - -void * -H5C2_protect(H5F_t * f, - hid_t dxpl_id, - const H5C2_class_t * type, - haddr_t addr, - size_t len, - void * udata, - unsigned flags) -{ - H5C2_t * cache_ptr; - hbool_t hit; - hbool_t first_flush; - hbool_t have_write_permitted = FALSE; - hbool_t read_only = FALSE; - hbool_t write_permitted; - herr_t result; - void * thing; - H5C2_cache_entry_t * entry_ptr; - void * ret_value; /* Return value */ - - FUNC_ENTER_NOAPI(H5C2_protect, NULL) - -#if H5C2_PRINT_ENTRY_POINTS - if ( H5C2_PRINT_ENTRY_POINT_TARGET_TYPE(type->id) ) - { - HDfprintf(stdout, - "%s: addr = 0x%lX, len = %d, type = %s, flags = 0x%x.\n", - FUNC, (unsigned long)addr, (int)len, type->name, flags); - } -#endif /* JRM */ - - /* check args */ - HDassert( f ); - HDassert( f->shared ); - - cache_ptr = f->shared->cache2; - - HDassert( cache_ptr ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - HDassert( cache_ptr->skip_file_checks || f ); - HDassert( type ); - HDassert( H5F_addr_defined(addr) ); - HDassert( len > 0 ); - -#if H5C2_DO_EXTREME_SANITY_CHECKS - if ( H5C2_validate_lru_list(cache_ptr) < 0 ) { - - HDassert(0); - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, NULL, \ - "LRU sanity check failed.\n"); - } -#endif /* H5C2_DO_EXTREME_SANITY_CHECKS */ - - if ( (flags & H5C2__READ_ONLY_FLAG) != 0 ) - { - read_only = TRUE; - } - - /* first check to see if the target is in cache */ - H5C2__SEARCH_INDEX(cache_ptr, addr, entry_ptr, NULL) - - if ( entry_ptr != NULL ) { - - hit = TRUE; - thing = (void *)entry_ptr; - - } else { - - /* must try to load the entry from disk. */ - - hit = FALSE; - - thing = H5C2_load_entry(f, dxpl_id, type, addr, len, udata); - - if ( thing == NULL ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTLOAD, NULL, "can't load entry") - } - - entry_ptr = (H5C2_cache_entry_t *)thing; - - /* If the entry is very large, and we are configured to allow it, - * we may wish to perform a flash cache size increase. - */ - if ( ( cache_ptr->flash_size_increase_possible ) && - ( entry_ptr->size > cache_ptr->flash_size_increase_threshold ) ) { - - result = H5C2__flash_increase_cache_size(cache_ptr, 0, - entry_ptr->size); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, \ - "H5C2__flash_increase_cache_size failed.") - } - } - - /* try to free up some space if necessary and if - * evictions are permitted - */ - if ( ( cache_ptr->evictions_enabled ) && - ( (cache_ptr->index_size + entry_ptr->size) > - cache_ptr->max_cache_size ) ) { - - size_t space_needed; - - cache_ptr->cache_full = TRUE; - - if ( cache_ptr->check_write_permitted != NULL ) { - - result = (cache_ptr->check_write_permitted)(f, - dxpl_id, - &write_permitted); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, \ - "Can't get write_permitted 1") - - } else { - - have_write_permitted = TRUE; - - first_flush = TRUE; - } - } else { - - write_permitted = cache_ptr->write_permitted; - - have_write_permitted = TRUE; - - first_flush = TRUE; - } - - HDassert( entry_ptr->size <= H5C2_MAX_ENTRY_SIZE ); - - space_needed = entry_ptr->size; - - if ( space_needed > cache_ptr->max_cache_size ) { - - space_needed = cache_ptr->max_cache_size; - } - - /* Note that space_needed is just the amount of space that - * needed to insert the new entry without exceeding the cache - * size limit. The subsequent call to H5C2_make_space_in_cache() - * may evict the entries required to free more or less space - * depending on conditions. It MAY be less if the cache is - * currently undersized, or more if the cache is oversized. - * - * The cache can exceed its maximum size limit via the following - * mechanisms: - * - * First, it is possible for the cache to grow without - * bound as long as entries are protected and not unprotected. - * - * Second, when writes are not permitted it is also possible - * for the cache to grow without bound. - * - * Third, the user may choose to disable evictions -- causing - * the cache to grow without bound until evictions are - * re-enabled. - * - * Finally, we usually don't check to see if the cache is - * oversized at the end of an unprotect. As a result, it is - * possible to have a vastly oversized cache with no protected - * entries as long as all the protects preceed the unprotects. - * - * Since items 1, 2, and 3 are not changing any time soon, I - * see no point in worrying about the fourth. - */ - - result = H5C2_make_space_in_cache(f, dxpl_id, cache_ptr, - space_needed, write_permitted); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, \ - "H5C2_make_space_in_cache failed 1.") - } - } - - /* Insert the entry in the hash table. It can't be dirty yet, so - * we don't even check to see if it should go in the skip list. - * - * This is no longer true -- due to a bug fix, we may modify - * data on load to repair a file. - */ - H5C2__INSERT_IN_INDEX(cache_ptr, entry_ptr, NULL) - - if ( ( entry_ptr->is_dirty ) && ( ! (entry_ptr->in_slist) ) ) { - - H5C2__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, NULL) - } - - /* under rare (we hope) circumstances, the load routine will - * modify an entry as it loads it to repair corruption from - * a previous version of the library. If this happens, we must - * place the entry on the transaction list. - */ - if ( entry_ptr->is_dirty ) { - - H5C2__INSERT_ENTRY_IN_TL(cache_ptr, entry_ptr, NULL); - } - - /* load the entry into the data structures used by the replacement - * policy. We are just going to take it out again when we update - * the replacement policy for a protect, but this simplifies the - * code. If we do this often enough, we may want to optimize this. - * - * Note that we used to do an update for insertion here, but - * that confused the journaling code -- the update for load is - * just a simplified version of update for insertion that - * avoids the problem. - */ - - H5C2__UPDATE_RP_FOR_LOAD(cache_ptr, entry_ptr, NULL) - } - - HDassert( entry_ptr->addr == addr ); - HDassert( entry_ptr->type == type ); - - if ( entry_ptr->is_protected ) { - - if ( ( read_only ) && ( entry_ptr->is_read_only ) ) { - - HDassert( entry_ptr->ro_ref_count > 0 ); - - (entry_ptr->ro_ref_count)++; - - } else { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, \ - "Target already protected & not read only?!?.") - } - } else { - - H5C2__UPDATE_RP_FOR_PROTECT(cache_ptr, entry_ptr, NULL) - - entry_ptr->is_protected = TRUE; - - if ( read_only ) { - - entry_ptr->is_read_only = TRUE; - entry_ptr->ro_ref_count = 1; - } - - entry_ptr->dirtied = FALSE; - } - - H5C2__UPDATE_CACHE_HIT_RATE_STATS(cache_ptr, hit) - - H5C2__UPDATE_STATS_FOR_PROTECT(cache_ptr, entry_ptr, hit) - - ret_value = thing; - - if ( ( cache_ptr->evictions_enabled ) && - ( ( cache_ptr->size_decreased ) || - ( ( cache_ptr->resize_enabled ) && - ( cache_ptr->cache_accesses >= - (cache_ptr->resize_ctl).epoch_length ) ) ) ) { - - if ( ! have_write_permitted ) { - - if ( cache_ptr->check_write_permitted != NULL ) { - - result = (cache_ptr->check_write_permitted)(f, - dxpl_id, - &write_permitted); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, \ - "Can't get write_permitted 2") - - } else { - - have_write_permitted = TRUE; - - first_flush = TRUE; - } - } else { - - write_permitted = cache_ptr->write_permitted; - - have_write_permitted = TRUE; - - first_flush = TRUE; - } - } - - if ( ( cache_ptr->resize_enabled ) && - ( cache_ptr->cache_accesses >= - (cache_ptr->resize_ctl).epoch_length ) ) { - - result = H5C2__auto_adjust_cache_size(f, - dxpl_id, - cache_ptr, - write_permitted); - if ( result != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, \ - "Cache auto-resize failed.") - } - } - - if ( cache_ptr->size_decreased ) { - - cache_ptr->size_decreased = FALSE; - - /* check to see if the cache is now oversized due to the cache - * size reduction. If it is, try to evict enough entries to - * bring the cache size down to the current maximum cache size. - */ - if ( cache_ptr->index_size > cache_ptr->max_cache_size ) { - - cache_ptr->cache_full = TRUE; - - result = H5C2_make_space_in_cache(f, - dxpl_id, - cache_ptr, - (size_t)0, - write_permitted); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, NULL, \ - "H5C2_make_space_in_cache failed 2.") - } - } - } - } - -done: - -#if H5C2_DO_EXTREME_SANITY_CHECKS - if ( H5C2_validate_lru_list(cache_ptr) < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, NULL, \ - "LRU sanity check failed.\n"); - } -#endif /* H5C2_DO_EXTREME_SANITY_CHECKS */ - -#if H5C2_PRINT_EXIT_POINTS - if ( H5C2_PRINT_ENTRY_POINT_TARGET_TYPE(type->id) ) { - HDfprintf(stdout, "%s: Exiting with result = 0x%lX.\n", - FUNC, (unsigned long)ret_value); - } -#endif /* H5C2_PRINT_EXIT_POINTS */ - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_protect() */ - - -/*------------------------------------------------------------------------- - * - * Function: H5C2_reset_cache_hit_rate_stats() - * - * Purpose: Reset the cache hit rate computation fields. - * - * Return: SUCCEED on success, and FAIL on failure. - * - * Programmer: John Mainzer, 10/5/04 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -herr_t -H5C2_reset_cache_hit_rate_stats(H5C2_t * cache_ptr) -{ - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5C2_reset_cache_hit_rate_stats, FAIL) - - if ( ( cache_ptr == NULL ) || ( cache_ptr->magic != H5C2__H5C2_T_MAGIC ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr on entry.") - } - - cache_ptr->cache_hits = 0; - cache_ptr->cache_accesses = 0; - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_reset_cache_hit_rate_stats() */ - - -/*------------------------------------------------------------------------- - * Function: H5C2_set_cache_auto_resize_config - * - * Purpose: Set the cache automatic resize configuration to the - * provided values if they are in range, and fail if they - * are not. - * - * If the new configuration enables automatic cache resizing, - * coerce the cache max size and min clean size into agreement - * with the new policy and re-set the full cache hit rate - * stats. - * - * Return: SUCCEED on success, and FAIL on failure. - * - * Programmer: John Mainzer - * 10/8/04 - * - * Modifications: - * - * JRM -- 11/18/04 - * Reworked function to match major changes in - * H5C2_auto_size_ctl_t. - * - * JRM -- 4/25/05 - * Added code to set cache_ptr->size_decreased to TRUE - * if the new configuration forces an immediate reduction - * in cache size. - * - * JRM -- 12/31/07 - * Added code supporting the new flash cache size increase - * code. - * - *------------------------------------------------------------------------- - */ - -herr_t -H5C2_set_cache_auto_resize_config(H5C2_t * cache_ptr, - H5C2_auto_size_ctl_t *config_ptr) -{ - herr_t result; - size_t new_max_cache_size; - size_t new_min_clean_size; - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5C2_set_cache_auto_resize_config, FAIL) - - if ( ( cache_ptr == NULL ) || ( cache_ptr->magic != H5C2__H5C2_T_MAGIC ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr on entry.") - } - - if ( config_ptr == NULL ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "NULL config_ptr on entry.") - } - - if ( config_ptr->version != H5C2__CURR_AUTO_SIZE_CTL_VER ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Unknown config version.") - } - - /* check general configuration section of the config: */ - if ( SUCCEED != H5C2_validate_resize_config(config_ptr, - H5C2_RESIZE_CFG__VALIDATE_GENERAL) ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, \ - "error in general configuration fields of new config.") - } - - /* check size increase control fields of the config: */ - if ( SUCCEED != H5C2_validate_resize_config(config_ptr, - H5C2_RESIZE_CFG__VALIDATE_INCREMENT) ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, \ - "error in the size increase control fields of new config.") - } - - /* check size decrease control fields of the config: */ - if ( SUCCEED != H5C2_validate_resize_config(config_ptr, - H5C2_RESIZE_CFG__VALIDATE_DECREMENT) ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, \ - "error in the size decrease control fields of new config.") - } - - /* check for conflicts between size increase and size decrease controls: */ - if ( SUCCEED != H5C2_validate_resize_config(config_ptr, - H5C2_RESIZE_CFG__VALIDATE_INTERACTIONS) ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, FAIL, \ - "conflicting threshold fields in new config.") - } - - /* will set the increase possible fields to FALSE later if needed */ - cache_ptr->size_increase_possible = TRUE; - cache_ptr->flash_size_increase_possible = TRUE; - cache_ptr->size_decrease_possible = TRUE; - - switch ( config_ptr->incr_mode ) - { - case H5C2_incr__off: - cache_ptr->size_increase_possible = FALSE; - break; - - case H5C2_incr__threshold: - if ( ( config_ptr->lower_hr_threshold <= 0.0 ) || - ( config_ptr->increment <= 1.0 ) || - ( ( config_ptr->apply_max_increment ) && - ( config_ptr->max_increment <= 0 ) ) ) { - - cache_ptr->size_increase_possible = FALSE; - } - break; - - default: /* should be unreachable */ - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Unknown incr_mode?!?!?.") - } - - /* logically, this is were configuration for flash cache size increases - * should go. However, this configuration depends on max_cache_size, so - * we wait until the end of the function, when this field is set. - */ - - switch ( config_ptr->decr_mode ) - { - case H5C2_decr__off: - cache_ptr->size_decrease_possible = FALSE; - break; - - case H5C2_decr__threshold: - if ( ( config_ptr->upper_hr_threshold >= 1.0 ) || - ( config_ptr->decrement >= 1.0 ) || - ( ( config_ptr->apply_max_decrement ) && - ( config_ptr->max_decrement <= 0 ) ) ) { - - cache_ptr->size_decrease_possible = FALSE; - } - break; - - case H5C2_decr__age_out: - if ( ( ( config_ptr->apply_empty_reserve ) && - ( config_ptr->empty_reserve >= 1.0 ) ) || - ( ( config_ptr->apply_max_decrement ) && - ( config_ptr->max_decrement <= 0 ) ) ) { - - cache_ptr->size_decrease_possible = FALSE; - } - break; - - case H5C2_decr__age_out_with_threshold: - if ( ( ( config_ptr->apply_empty_reserve ) && - ( config_ptr->empty_reserve >= 1.0 ) ) || - ( ( config_ptr->apply_max_decrement ) && - ( config_ptr->max_decrement <= 0 ) ) || - ( config_ptr->upper_hr_threshold >= 1.0 ) ) { - - cache_ptr->size_decrease_possible = FALSE; - } - break; - - default: /* should be unreachable */ - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Unknown decr_mode?!?!?.") - } - - if ( config_ptr->max_size == config_ptr->min_size ) { - - cache_ptr->size_increase_possible = FALSE; - cache_ptr->flash_size_increase_possible = FALSE; - cache_ptr->size_decrease_possible = FALSE; - } - - /* flash_size_increase_possible is intentionally omitted from the - * following: - */ - - cache_ptr->resize_enabled = cache_ptr->size_increase_possible || - cache_ptr->size_decrease_possible; - - cache_ptr->resize_ctl = *config_ptr; - - /* Resize the cache to the supplied initial value if requested, or as - * necessary to force it within the bounds of the current automatic - * cache resizing configuration. - * - * Note that the min_clean_fraction may have changed, so we - * go through the exercise even if the current size is within - * range and an initial size has not been provided. - */ - if ( (cache_ptr->resize_ctl).set_initial_size ) { - - new_max_cache_size = (cache_ptr->resize_ctl).initial_size; - } - else if ( cache_ptr->max_cache_size > (cache_ptr->resize_ctl).max_size ) { - - new_max_cache_size = (cache_ptr->resize_ctl).max_size; - } - else if ( cache_ptr->max_cache_size < (cache_ptr->resize_ctl).min_size ) { - - new_max_cache_size = (cache_ptr->resize_ctl).min_size; - - } else { - - new_max_cache_size = cache_ptr->max_cache_size; - } - - new_min_clean_size = (size_t) - ((double)new_max_cache_size * - ((cache_ptr->resize_ctl).min_clean_fraction)); - - - /* since new_min_clean_size is of type size_t, we have - * - * ( 0 <= new_min_clean_size ) - * - * by definition. - */ - HDassert( new_min_clean_size <= new_max_cache_size ); - HDassert( (cache_ptr->resize_ctl).min_size <= new_max_cache_size ); - HDassert( new_max_cache_size <= (cache_ptr->resize_ctl).max_size ); - - if ( new_max_cache_size < cache_ptr->max_cache_size ) { - - cache_ptr->size_decreased = TRUE; - } - - cache_ptr->max_cache_size = new_max_cache_size; - cache_ptr->min_clean_size = new_min_clean_size; - - if ( H5C2_reset_cache_hit_rate_stats(cache_ptr) != SUCCEED ) { - - /* this should be impossible... */ - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "H5C2_reset_cache_hit_rate_stats failed.") - } - - /* remove excess epoch markers if any */ - if ( ( config_ptr->decr_mode == H5C2_decr__age_out_with_threshold ) || - ( config_ptr->decr_mode == H5C2_decr__age_out ) ) { - - if ( cache_ptr->epoch_markers_active > - (cache_ptr->resize_ctl).epochs_before_eviction ) { - - result = - H5C2__autoadjust__ageout__remove_excess_markers(cache_ptr); - - if ( result != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "can't remove excess epoch markers.") - } - } - } else if ( cache_ptr->epoch_markers_active > 0 ) { - - result = H5C2__autoadjust__ageout__remove_all_markers(cache_ptr); - - if ( result != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "error removing all epoch markers.") - } - } - - /* configure flash size increase facility. We wait until the - * end of the function, as we need the max_cache_size set before - * we start to keep things simple. - * - * If we haven't already ruled out flash cache size increases above, - * go ahead and configure it. - */ - - if ( cache_ptr->flash_size_increase_possible ) { - - switch ( config_ptr->flash_incr_mode ) - { - case H5C2_flash_incr__off: - cache_ptr->flash_size_increase_possible = FALSE; - break; - - case H5C2_flash_incr__add_space: - cache_ptr->flash_size_increase_possible = TRUE; - cache_ptr->flash_size_increase_threshold = - (size_t) - (((double)(cache_ptr->max_cache_size)) * - ((cache_ptr->resize_ctl).flash_threshold)); - break; - - default: /* should be unreachable */ - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "Unknown flash_incr_mode?!?!?.") - break; - } - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_set_cache_auto_resize_config() */ - - -/*------------------------------------------------------------------------- - * Function: H5C2_set_evictions_enabled() - * - * Purpose: Set cache_ptr->evictions_enabled to the value of the - * evictions enabled parameter. - * - * Return: SUCCEED on success, and FAIL on failure. - * - * Programmer: John Mainzer - * 7/27/07 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -herr_t -H5C2_set_evictions_enabled(H5C2_t * cache_ptr, - hbool_t evictions_enabled) -{ - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5C2_set_evictions_enabled, FAIL) - - if ( ( cache_ptr == NULL ) || ( cache_ptr->magic != H5C2__H5C2_T_MAGIC ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr on entry.") - } - - if ( ( evictions_enabled != TRUE ) && ( evictions_enabled != FALSE ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "Bad evictions_enabled on entry.") - } - - /* There is no fundamental reason why we should not permit - * evictions to be disabled while automatic resize is enabled. - * However, I can't think of any good reason why one would - * want to, and allowing it would greatly complicate testing - * the feature. Hence the following: - */ - if ( ( evictions_enabled != TRUE ) && - ( ( cache_ptr->resize_ctl.incr_mode != H5C2_incr__off ) || - ( cache_ptr->resize_ctl.flash_incr_mode != H5C2_flash_incr__off ) || - ( cache_ptr->resize_ctl.decr_mode != H5C2_decr__off ) ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "Can't disable evictions when auto resize enabled.") - } - - cache_ptr->evictions_enabled = evictions_enabled; - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_set_evictions_enabled() */ - - -/*------------------------------------------------------------------------- - * Function: H5C2_set_prefix - * - * Purpose: Set the values of the prefix field of H5C2_t. This - * filed is used to label some debugging output. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: John Mainzer - * 1/20/06 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -herr_t -H5C2_set_prefix(H5C2_t * cache_ptr, - char * prefix) -{ - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5C2_set_prefix, FAIL) - - /* This would normally be an assert, but we need to use an HGOTO_ERROR - * call to shut up the compiler. - */ - if ( ( ! cache_ptr ) || ( cache_ptr->magic != H5C2__H5C2_T_MAGIC ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr") - } - - HDassert( prefix ); - HDassert( HDstrlen(prefix) < H5C2__PREFIX_LEN ) ; - - HDstrcpy(&(cache_ptr->prefix[0]), prefix); - -done: - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_set_prefix() */ - - -/*------------------------------------------------------------------------- - * Function: H5C2_set_skip_flags - * - * Purpose: Set the values of the skip sanity check flags. - * - * This function and the skip sanity check flags were created - * for the convenience of the test bed. However it is - * possible that there may be other uses for the flags. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: John Mainzer - * 6/11/04 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -herr_t -H5C2_set_skip_flags(H5C2_t * cache_ptr, - hbool_t skip_file_checks, - hbool_t skip_dxpl_id_checks) -{ - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5C2_set_skip_flags, FAIL) - - /* This would normally be an assert, but we need to use an HGOTO_ERROR - * call to shut up the compiler. - */ - if ( ( ! cache_ptr ) || ( cache_ptr->magic != H5C2__H5C2_T_MAGIC ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr") - } - - cache_ptr->skip_file_checks = skip_file_checks; - cache_ptr->skip_dxpl_id_checks = skip_dxpl_id_checks; - -done: - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_set_skip_flags() */ - - -/*------------------------------------------------------------------------- - * Function: H5C2_set_trace_file_ptr - * - * Purpose: Set the trace_file_ptr field for the cache. - * - * This field must either be NULL (which turns of trace - * file logging), or be a pointer to an open file to which - * trace file data is to be written. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: John Mainzer - * 1/20/06 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -herr_t -H5C2_set_trace_file_ptr(H5C2_t * cache_ptr, - FILE * trace_file_ptr) -{ - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5C2_set_trace_file_ptr, FAIL) - - /* This would normally be an assert, but we need to use an HGOTO_ERROR - * call to shut up the compiler. - */ - if ( ( ! cache_ptr ) || ( cache_ptr->magic != H5C2__H5C2_T_MAGIC ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr") - } - - cache_ptr->trace_file_ptr = trace_file_ptr; - -done: - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_set_trace_file_ptr() */ - - -/*------------------------------------------------------------------------- - * Function: H5C2_stats - * - * Purpose: Prints statistics about the cache. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: John Mainzer - * 6/2/04 - * - * Modifications: - * - * JRM -- 7/21/04 - * Updated function for the addition of the hash table. - * - * JRM -- 9/8/05 - * Updated function for the addition of cache entry size - * change statistics. - * - * JRM -- 1/13/06 - * Added code to use the prefix field of H5C2_t to allow - * tagging of statistics output. - * - * JRM -- 3/21/06 - * Added code supporting the pinned entry related stats. - * - * JRM -- 8/9/06 - * More code supporting pinned entry related stats. - * - * JRM -- 8/23/06 - * Added code supporting new flush related statistics. - * - * JRM -- 3/31/07 - * Added code supporting the new write_protects, - * read_protects, and max_read_protects fields. - * - *------------------------------------------------------------------------- - */ - -herr_t -H5C2_stats(H5C2_t * cache_ptr, - const char * cache_name, - hbool_t -#if !H5C2_COLLECT_CACHE_STATS - UNUSED -#endif /* H5C2_COLLECT_CACHE_STATS */ - display_detailed_stats) -{ - herr_t ret_value = SUCCEED; /* Return value */ - -#if H5C2_COLLECT_CACHE_STATS - int i; - int64_t total_hits = 0; - int64_t total_misses = 0; - int64_t total_write_protects = 0; - int64_t total_read_protects = 0; - int64_t max_read_protects = 0; - int64_t total_insertions = 0; - int64_t total_pinned_insertions = 0; - int64_t total_clears = 0; - int64_t total_flushes = 0; - int64_t total_evictions = 0; - int64_t total_renames = 0; - int64_t total_entry_flush_renames = 0; - int64_t total_cache_flush_renames = 0; - int64_t total_size_increases = 0; - int64_t total_size_decreases = 0; - int64_t total_entry_flush_size_changes = 0; - int64_t total_cache_flush_size_changes = 0; - int64_t total_pins = 0; - int64_t total_unpins = 0; - int64_t total_dirty_pins = 0; - int64_t total_pinned_flushes = 0; - int64_t total_pinned_clears = 0; - int32_t aggregate_max_accesses = 0; - int32_t aggregate_min_accesses = 1000000; - int32_t aggregate_max_clears = 0; - int32_t aggregate_max_flushes = 0; - size_t aggregate_max_size = 0; - int32_t aggregate_max_pins = 0; - double hit_rate; - double average_successful_search_depth = 0.0; - double average_failed_search_depth = 0.0; -#endif /* H5C2_COLLECT_CACHE_STATS */ - - FUNC_ENTER_NOAPI(H5C2_stats, FAIL) - - /* This would normally be an assert, but we need to use an HGOTO_ERROR - * call to shut up the compiler. - */ - if ( ( ! cache_ptr ) || - ( cache_ptr->magic != H5C2__H5C2_T_MAGIC ) || - ( !cache_name ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad cache_ptr or cache_name") - } - -#if H5C2_COLLECT_CACHE_STATS - - for ( i = 0; i <= cache_ptr->max_type_id; i++ ) { - - total_hits += cache_ptr->hits[i]; - total_misses += cache_ptr->misses[i]; - total_write_protects += cache_ptr->write_protects[i]; - total_read_protects += cache_ptr->read_protects[i]; - if ( max_read_protects < cache_ptr->max_read_protects[i] ) { - max_read_protects = cache_ptr->max_read_protects[i]; - } - total_insertions += cache_ptr->insertions[i]; - total_pinned_insertions += cache_ptr->pinned_insertions[i]; - total_clears += cache_ptr->clears[i]; - total_flushes += cache_ptr->flushes[i]; - total_evictions += cache_ptr->evictions[i]; - total_renames += cache_ptr->renames[i]; - total_entry_flush_renames - += cache_ptr->entry_flush_renames[i]; - total_cache_flush_renames - += cache_ptr->cache_flush_renames[i]; - total_size_increases += cache_ptr->size_increases[i]; - total_size_decreases += cache_ptr->size_decreases[i]; - total_entry_flush_size_changes - += cache_ptr->entry_flush_size_changes[i]; - total_cache_flush_size_changes - += cache_ptr->cache_flush_size_changes[i]; - total_pins += cache_ptr->pins[i]; - total_unpins += cache_ptr->unpins[i]; - total_dirty_pins += cache_ptr->dirty_pins[i]; - total_pinned_flushes += cache_ptr->pinned_flushes[i]; - total_pinned_clears += cache_ptr->pinned_clears[i]; -#if H5C2_COLLECT_CACHE_ENTRY_STATS - if ( aggregate_max_accesses < cache_ptr->max_accesses[i] ) - aggregate_max_accesses = cache_ptr->max_accesses[i]; - if ( aggregate_min_accesses > aggregate_max_accesses ) - aggregate_min_accesses = aggregate_max_accesses; - if ( aggregate_min_accesses > cache_ptr->min_accesses[i] ) - aggregate_min_accesses = cache_ptr->min_accesses[i]; - if ( aggregate_max_clears < cache_ptr->max_clears[i] ) - aggregate_max_clears = cache_ptr->max_clears[i]; - if ( aggregate_max_flushes < cache_ptr->max_flushes[i] ) - aggregate_max_flushes = cache_ptr->max_flushes[i]; - if ( aggregate_max_size < cache_ptr->max_size[i] ) - aggregate_max_size = cache_ptr->max_size[i]; - if ( aggregate_max_pins < cache_ptr->max_pins[i] ) - aggregate_max_pins = cache_ptr->max_pins[i]; -#endif /* H5C2_COLLECT_CACHE_ENTRY_STATS */ - } - - if ( ( total_hits > 0 ) || ( total_misses > 0 ) ) { - - hit_rate = 100.0 * ((double)(total_hits)) / - ((double)(total_hits + total_misses)); - } else { - hit_rate = 0.0; - } - - if ( cache_ptr->successful_ht_searches > 0 ) { - - average_successful_search_depth = - ((double)(cache_ptr->total_successful_ht_search_depth)) / - ((double)(cache_ptr->successful_ht_searches)); - } - - if ( cache_ptr->failed_ht_searches > 0 ) { - - average_failed_search_depth = - ((double)(cache_ptr->total_failed_ht_search_depth)) / - ((double)(cache_ptr->failed_ht_searches)); - } - - - HDfprintf(stdout, "\n%sH5C2: cache statistics for %s\n", - cache_ptr->prefix, cache_name); - - HDfprintf(stdout, "\n"); - - HDfprintf(stdout, - "%s hash table insertion / deletions = %ld / %ld\n", - cache_ptr->prefix, - (long)(cache_ptr->total_ht_insertions), - (long)(cache_ptr->total_ht_deletions)); - - HDfprintf(stdout, - "%s HT successful / failed searches = %ld / %ld\n", - cache_ptr->prefix, - (long)(cache_ptr->successful_ht_searches), - (long)(cache_ptr->failed_ht_searches)); - - HDfprintf(stdout, - "%s Av. HT suc / failed search depth = %f / %f\n", - cache_ptr->prefix, - average_successful_search_depth, - average_failed_search_depth); - - HDfprintf(stdout, - "%s current (max) index size / length = %ld (%ld) / %ld (%ld)\n", - cache_ptr->prefix, - (long)(cache_ptr->index_size), - (long)(cache_ptr->max_index_size), - (long)(cache_ptr->index_len), - (long)(cache_ptr->max_index_len)); - - HDfprintf(stdout, - "%s current (max) slist size / length = %ld (%ld) / %ld (%ld)\n", - cache_ptr->prefix, - (long)(cache_ptr->slist_size), - (long)(cache_ptr->max_slist_size), - (long)(cache_ptr->slist_len), - (long)(cache_ptr->max_slist_len)); - - HDfprintf(stdout, - "%s current (max) PL size / length = %ld (%ld) / %ld (%ld)\n", - cache_ptr->prefix, - (long)(cache_ptr->pl_size), - (long)(cache_ptr->max_pl_size), - (long)(cache_ptr->pl_len), - (long)(cache_ptr->max_pl_len)); - - HDfprintf(stdout, - "%s current (max) PEL size / length = %ld (%ld) / %ld (%ld)\n", - cache_ptr->prefix, - (long)(cache_ptr->pel_size), - (long)(cache_ptr->max_pel_size), - (long)(cache_ptr->pel_len), - (long)(cache_ptr->max_pel_len)); - - HDfprintf(stdout, - "%s current LRU list size / length = %ld / %ld\n", - cache_ptr->prefix, - (long)(cache_ptr->LRU_list_size), - (long)(cache_ptr->LRU_list_len)); - - HDfprintf(stdout, - "%s current clean LRU size / length = %ld / %ld\n", - cache_ptr->prefix, - (long)(cache_ptr->cLRU_list_size), - (long)(cache_ptr->cLRU_list_len)); - - HDfprintf(stdout, - "%s current dirty LRU size / length = %ld / %ld\n", - cache_ptr->prefix, - (long)(cache_ptr->dLRU_list_size), - (long)(cache_ptr->dLRU_list_len)); - - HDfprintf(stdout, - "%s Total hits / misses / hit_rate = %ld / %ld / %f\n", - cache_ptr->prefix, - (long)total_hits, - (long)total_misses, - hit_rate); - - HDfprintf(stdout, - "%s Total write / read (max) protects = %ld / %ld (%ld)\n", - cache_ptr->prefix, - (long)total_write_protects, - (long)total_read_protects, - (long)max_read_protects); - - HDfprintf(stdout, - "%s Total clears / flushes / evictions = %ld / %ld / %ld\n", - cache_ptr->prefix, - (long)total_clears, - (long)total_flushes, - (long)total_evictions); - - HDfprintf(stdout, - "%s Total insertions(pinned) / renames = %ld(%ld) / %ld\n", - cache_ptr->prefix, - (long)total_insertions, - (long)total_pinned_insertions, - (long)total_renames); - - HDfprintf(stdout, - "%s Total entry / cache flush renames = %ld / %ld\n", - cache_ptr->prefix, - (long)total_entry_flush_renames, - (long)total_cache_flush_renames); - - HDfprintf(stdout, "%s Total entry size incrs / decrs = %ld / %ld\n", - cache_ptr->prefix, - (long)total_size_increases, - (long)total_size_decreases); - - HDfprintf(stdout, "%s Ttl entry/cache flush size changes = %ld / %ld\n", - cache_ptr->prefix, - (long)total_entry_flush_size_changes, - (long)total_cache_flush_size_changes); - - HDfprintf(stdout, - "%s Total entry pins (dirty) / unpins = %ld (%ld) / %ld\n", - cache_ptr->prefix, - (long)total_pins, - (long)total_dirty_pins, - (long)total_unpins); - - HDfprintf(stdout, "%s Total pinned flushes / clears = %ld / %ld\n", - cache_ptr->prefix, - (long)total_pinned_flushes, - (long)total_pinned_clears); - -#if H5C2_COLLECT_CACHE_ENTRY_STATS - - HDfprintf(stdout, "%s aggregate max / min accesses = %d / %d\n", - cache_ptr->prefix, - (int)aggregate_max_accesses, - (int)aggregate_min_accesses); - - HDfprintf(stdout, "%s aggregate max_clears / max_flushes = %d / %d\n", - cache_ptr->prefix, - (int)aggregate_max_clears, - (int)aggregate_max_flushes); - - HDfprintf(stdout, "%s aggregate max_size / max_pins = %d / %d\n", - cache_ptr->prefix, - (int)aggregate_max_size, - (int)aggregate_max_pins); - -#endif /* H5C2_COLLECT_CACHE_ENTRY_STATS */ - - if ( display_detailed_stats ) - { - - for ( i = 0; i <= cache_ptr->max_type_id; i++ ) { - - HDfprintf(stdout, "\n"); - - HDfprintf(stdout, "%s Stats on %s:\n", - cache_ptr->prefix, - ((cache_ptr->type_name_table_ptr))[i]); - - if ( ( cache_ptr->hits[i] > 0 ) || ( cache_ptr->misses[i] > 0 ) ) { - - hit_rate = 100.0 * ((double)(cache_ptr->hits[i])) / - ((double)(cache_ptr->hits[i] + cache_ptr->misses[i])); - } else { - hit_rate = 0.0; - } - - HDfprintf(stdout, - "%s hits / misses / hit_rate = %ld / %ld / %f\n", - cache_ptr->prefix, - (long)(cache_ptr->hits[i]), - (long)(cache_ptr->misses[i]), - hit_rate); - - HDfprintf(stdout, - "%s write / read (max) protects = %ld / %ld (%d)\n", - cache_ptr->prefix, - (long)(cache_ptr->write_protects[i]), - (long)(cache_ptr->read_protects[i]), - (int)(cache_ptr->max_read_protects[i])); - - HDfprintf(stdout, - "%s clears / flushes / evictions = %ld / %ld / %ld\n", - cache_ptr->prefix, - (long)(cache_ptr->clears[i]), - (long)(cache_ptr->flushes[i]), - (long)(cache_ptr->evictions[i])); - - HDfprintf(stdout, - "%s insertions(pinned) / renames = %ld(%ld) / %ld\n", - cache_ptr->prefix, - (long)(cache_ptr->insertions[i]), - (long)(cache_ptr->pinned_insertions[i]), - (long)(cache_ptr->renames[i])); - - HDfprintf(stdout, - "%s entry / cache flush renames = %ld / %ld\n", - cache_ptr->prefix, - (long)(cache_ptr->entry_flush_renames[i]), - (long)(cache_ptr->cache_flush_renames[i])); - - HDfprintf(stdout, - "%s size increases / decreases = %ld / %ld\n", - cache_ptr->prefix, - (long)(cache_ptr->size_increases[i]), - (long)(cache_ptr->size_decreases[i])); - - HDfprintf(stdout, - "%s entry/cache flush size changes = %ld / %ld\n", - cache_ptr->prefix, - (long)(cache_ptr->entry_flush_size_changes[i]), - (long)(cache_ptr->cache_flush_size_changes[i])); - - - HDfprintf(stdout, - "%s entry pins / unpins = %ld / %ld\n", - cache_ptr->prefix, - (long)(cache_ptr->pins[i]), - (long)(cache_ptr->unpins[i])); - - HDfprintf(stdout, - "%s entry dirty pins/pin'd flushes = %ld / %ld\n", - cache_ptr->prefix, - (long)(cache_ptr->dirty_pins[i]), - (long)(cache_ptr->pinned_flushes[i])); - -#if H5C2_COLLECT_CACHE_ENTRY_STATS - - HDfprintf(stdout, - "%s entry max / min accesses = %d / %d\n", - cache_ptr->prefix, - cache_ptr->max_accesses[i], - cache_ptr->min_accesses[i]); - - HDfprintf(stdout, - "%s entry max_clears / max_flushes = %d / %d\n", - cache_ptr->prefix, - cache_ptr->max_clears[i], - cache_ptr->max_flushes[i]); - - HDfprintf(stdout, - "%s entry max_size / max_pins = %d / %d\n", - cache_ptr->prefix, - (int)(cache_ptr->max_size[i]), - (int)(cache_ptr->max_pins[i])); - - -#endif /* H5C2_COLLECT_CACHE_ENTRY_STATS */ - - } - } - - HDfprintf(stdout, "\n"); - -#endif /* H5C2_COLLECT_CACHE_STATS */ - -done: - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_stats() */ - - -/*------------------------------------------------------------------------- - * - * Function: H5C2_stats__reset - * - * Purpose: Reset the stats fields to their initial values. - * - * Return: void - * - * Programmer: John Mainzer, 4/28/04 - * - * Modifications: - * - * JRM - 7/21/04 - * Updated for hash table related statistics. - * - * JRM - 9/8/05 - * Updated for size increase / decrease statistics. - * - * JRM - 3/20/06 - * Updated for pin / unpin related statistics. - * - * JRM - 8/9/06 - * Further updates for pin related statistics. - * - * JRM 8/23/06 - * Added initialization code for new flush related statistics. - * - * JRM 2/16/07 - * Added conditional compile code to avoid unused parameter - * warning in the production build. - * - * JRM 3/31/07 - * Added initialization for the new write_protects, - * read_protects, and max_read_protects fields. - * - *------------------------------------------------------------------------- - */ - -void -#ifndef NDEBUG -H5C2_stats__reset(H5C2_t * cache_ptr) -#else /* NDEBUG */ -#if H5C2_COLLECT_CACHE_STATS -H5C2_stats__reset(H5C2_t * cache_ptr) -#else /* H5C2_COLLECT_CACHE_STATS */ -H5C2_stats__reset(H5C2_t UNUSED * cache_ptr) -#endif /* H5C2_COLLECT_CACHE_STATS */ -#endif /* NDEBUG */ -{ -#if H5C2_COLLECT_CACHE_STATS - int i; -#endif /* H5C2_COLLECT_CACHE_STATS */ - - HDassert( cache_ptr ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - -#if H5C2_COLLECT_CACHE_STATS - for ( i = 0; i <= cache_ptr->max_type_id; i++ ) - { - cache_ptr->hits[i] = 0; - cache_ptr->misses[i] = 0; - cache_ptr->write_protects[i] = 0; - cache_ptr->read_protects[i] = 0; - cache_ptr->max_read_protects[i] = 0; - cache_ptr->insertions[i] = 0; - cache_ptr->pinned_insertions[i] = 0; - cache_ptr->clears[i] = 0; - cache_ptr->flushes[i] = 0; - cache_ptr->evictions[i] = 0; - cache_ptr->renames[i] = 0; - cache_ptr->entry_flush_renames[i] = 0; - cache_ptr->cache_flush_renames[i] = 0; - cache_ptr->pins[i] = 0; - cache_ptr->unpins[i] = 0; - cache_ptr->dirty_pins[i] = 0; - cache_ptr->pinned_flushes[i] = 0; - cache_ptr->pinned_clears[i] = 0; - cache_ptr->size_increases[i] = 0; - cache_ptr->size_decreases[i] = 0; - cache_ptr->entry_flush_size_changes[i] = 0; - cache_ptr->cache_flush_size_changes[i] = 0; - } - - cache_ptr->total_ht_insertions = 0; - cache_ptr->total_ht_deletions = 0; - cache_ptr->successful_ht_searches = 0; - cache_ptr->total_successful_ht_search_depth = 0; - cache_ptr->failed_ht_searches = 0; - cache_ptr->total_failed_ht_search_depth = 0; - - cache_ptr->max_index_len = 0; - cache_ptr->max_index_size = (size_t)0; - - cache_ptr->max_slist_len = 0; - cache_ptr->max_slist_size = (size_t)0; - - cache_ptr->max_pl_len = 0; - cache_ptr->max_pl_size = (size_t)0; - - cache_ptr->max_pel_len = 0; - cache_ptr->max_pel_size = (size_t)0; - -#if H5C2_COLLECT_CACHE_ENTRY_STATS - - for ( i = 0; i <= cache_ptr->max_type_id; i++ ) - { - cache_ptr->max_accesses[i] = 0; - cache_ptr->min_accesses[i] = 1000000; - cache_ptr->max_clears[i] = 0; - cache_ptr->max_flushes[i] = 0; - cache_ptr->max_size[i] = (size_t)0; - cache_ptr->max_pins[i] = 0; - } - -#endif /* H5C2_COLLECT_CACHE_ENTRY_STATS */ -#endif /* H5C2_COLLECT_CACHE_STATS */ - - return; - -} /* H5C2_stats__reset() */ - - -/*------------------------------------------------------------------------- - * Function: H5C2_unpin_entry() - * - * Purpose: Unpin a cache entry. The entry must be unprotected at - * the time of call, and must be pinned. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: John Mainzer - * 3/22/06 - * - *------------------------------------------------------------------------- - */ -herr_t -H5C2_unpin_entry(void *_entry_ptr) -{ - H5C2_t *cache_ptr; - H5C2_cache_entry_t *entry_ptr = (H5C2_cache_entry_t *)_entry_ptr; - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5C2_unpin_entry, FAIL) - - /* Sanity check */ - HDassert(entry_ptr); - cache_ptr = entry_ptr->cache_ptr; - HDassert(cache_ptr); - HDassert(cache_ptr->magic == H5C2__H5C2_T_MAGIC); - -#if H5C2_PRINT_ENTRY_POINTS - if(H5C2_PRINT_ENTRY_POINT_TARGET_TYPE(entry_ptr->type->id)) - HDfprintf(stdout, "%s: addr = 0x%lX, type = %s.\n", FUNC, (unsigned long)(entry_ptr->addr), entry_ptr->type->name); -#endif /* H5C2_PRINT_ENTRY_POINTS */ - - /* Error checking */ - if(!entry_ptr->is_pinned) - HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPIN, FAIL, "Entry isn't pinned") - - /* Update unprotected entry */ - if(!entry_ptr->is_protected) - H5C2__UPDATE_RP_FOR_UNPIN(cache_ptr, entry_ptr, FAIL) - - /* Mark entry unpinned */ - entry_ptr->is_pinned = FALSE; - - /* Update statistics for unpin operation */ - H5C2__UPDATE_STATS_FOR_UNPIN(cache_ptr, entry_ptr) - -done: -#if H5C2_PRINT_EXIT_POINTS - if(H5C2_PRINT_ENTRY_POINT_TARGET_TYPE(entry_ptr->type->id)) - HDfprintf(stdout, "%s: Exiting with result = %d.\n", FUNC, (int)ret_value); -#endif /* H5C2_PRINT_EXIT_POINTS */ - - FUNC_LEAVE_NOAPI(ret_value) -} /* H5C2_unpin_entry() */ - - -/*------------------------------------------------------------------------- - * Function: H5C2_unprotect - * - * Purpose: Undo an H5C2_protect() call -- specifically, mark the - * entry as unprotected, remove it from the protected list, - * and give it back to the replacement policy. - * - * The TYPE and ADDR arguments must be the same as those in - * the corresponding call to H5C2_protect() and the THING - * argument must be the value returned by that call to - * H5C2_protect(). - * - * The primary_dxpl_id and secondary_dxpl_id parameters - * specify the dxpl_ids used on the first write occasioned - * by the unprotect (primary_dxpl_id), and on all subsequent - * writes (secondary_dxpl_id). Since an uprotect cannot - * occasion a write at present, all this is moot for now. - * However, things change, and in any case, - * H5C2_flush_single_entry() needs primary_dxpl_id and - * secondary_dxpl_id in its parameter list. - * - * The function can't cause a read either, so the dxpl_id - * parameters are moot in this case as well. - * - * Return: Non-negative on success/Negative on failure - * - * If the deleted flag is TRUE, simply remove the target entry - * from the cache, clear it, and free it without writing it to - * disk. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: John Mainzer - * 6/2/04 - * - * Modifications: - * - * JRM -- 7/21/04 - * Updated the function for the addition of the hash table. - * In particular, we now add dirty entries to the tree if - * they aren't in the tree already. - * - * JRM -- 1/6/05 - * Added the flags parameter, and code supporting - * H5C2__SET_FLUSH_MARKER_FLAG. Note that this flag is - * ignored unless the new entry is dirty. Also note that - * once the flush_marker field of an entry is set, the - * only way it can be reset is by being flushed. - * - * JRM -- 6/3/05 - * Added the dirtied parameter and supporting code. This - * is part of an effort to move management of the is_dirty - * field into the cache code. This has become necessary - * to repair a cache coherency bug in PHDF5. - * - * JRM -- 7/5/05 - * Added code supporting the new clear_on_unprotect field - * of H5C2_cache_entry_t. This change is also part of the - * above mentioned cache coherency bug fix in PHDF5. - * - * JRM -- 9/8/05 - * Added the size_changed and new_size parameters and the - * supporting code. Since the metadata cache synchronizes - * on dirty bytes creation in the PHDF5 case, we must now - * track changes in entry size. - * - * Note that the new_size parameter is ignored unless the - * size_changed parameter is TRUE. In this case, the new_size - * must be positive. - * - * Also observe that if size_changed is TRUE, dirtied must be - * TRUE. - * - * JRM -- 9/23/05 - * Moved the size_changed parameter into flags. - * - * JRM -- 3/21/06 - * Unpdated function to pin and unpin entries as directed via - * the new H5C2__PIN_ENTRY_FLAG and H5C2__UNPIN_ENTRY_FLAG flags. - * - * JRM -- 5/3/06 - * Added code to make use of the new dirtied field in - * H5C2_cache_entry_t. If this field is TRUE, it is the - * equivalent of setting the H5C2__DIRTIED_FLAG. - * - * JRM -- 3/29/07 - * Modified function to allow a entry to be protected - * more than once if the entry is protected read only. - * - * Also added sanity checks using the new is_read_only and - * ro_ref_count parameters. - * - * JRM -- 9/8/07 - * Revised function for the new metadata cache API. The - * function lost its pointer to H5F_t (now supplied via - * *cache_ptr), and one of its dxpl ids. Also internal - * changes supporting the revised API. - * - * JRM -- 12/31/07 - * Modified funtion to support flash cache resizes. - * - *------------------------------------------------------------------------- - */ -herr_t -H5C2_unprotect(H5F_t * f, - hid_t dxpl_id, - const H5C2_class_t * type, - haddr_t addr, - void * thing, - unsigned int flags, - size_t new_size) -{ - H5C2_t * cache_ptr; - hbool_t deleted; - hbool_t dirtied; - hbool_t set_flush_marker; - hbool_t size_changed; - hbool_t pin_entry; - hbool_t unpin_entry; -#ifdef H5_HAVE_PARALLEL - hbool_t clear_entry = FALSE; -#endif /* H5_HAVE_PARALLEL */ - herr_t ret_value = SUCCEED; /* Return value */ - herr_t result; - size_t size_increase = 0; - H5C2_cache_entry_t * entry_ptr; - H5C2_cache_entry_t * test_entry_ptr; - - FUNC_ENTER_NOAPI(H5C2_unprotect, FAIL) - -#if H5C2_PRINT_ENTRY_POINTS - if ( H5C2_PRINT_ENTRY_POINT_TARGET_TYPE(type->id) ) - { - HDfprintf(stdout, - "%s: addr = 0x%lX, type = %s, flags = 0x%x, new_size = %d.\n", - FUNC, (unsigned long)addr, type->name, flags, (int)new_size); - } -#endif /* JRM */ - - deleted = ( (flags & H5C2__DELETED_FLAG) != 0 ); - dirtied = ( (flags & H5C2__DIRTIED_FLAG) != 0 ); - set_flush_marker = ( (flags & H5C2__SET_FLUSH_MARKER_FLAG) != 0 ); - size_changed = ( (flags & H5C2__SIZE_CHANGED_FLAG) != 0 ); - pin_entry = ( (flags & H5C2__PIN_ENTRY_FLAG) != 0 ); - unpin_entry = ( (flags & H5C2__UNPIN_ENTRY_FLAG) != 0 ); - - /* Changing the size of an entry dirties it. Thus, set the - * dirtied flag if the size_changed flag is set. - */ - - dirtied |= size_changed; - - HDassert( f ); - HDassert( f->shared ); - - cache_ptr = f->shared->cache2; - - HDassert( cache_ptr ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - HDassert( cache_ptr->skip_file_checks || f ); - HDassert( type ); - HDassert( H5F_addr_defined(addr) ); - HDassert( thing ); - HDassert( ( size_changed == TRUE ) || ( size_changed == FALSE ) ); - HDassert( ( ! size_changed ) || ( dirtied ) ); - HDassert( ( ! size_changed ) || ( new_size > 0 ) ); - HDassert( ! ( pin_entry && unpin_entry ) ); - - entry_ptr = (H5C2_cache_entry_t *)thing; - - HDassert( entry_ptr->addr == addr ); - HDassert( entry_ptr->type == type ); - - /* also set the dirtied variable if the dirtied field is set in - * the entry. - */ - dirtied |= entry_ptr->dirtied; - -#if H5C2_DO_EXTREME_SANITY_CHECKS - if ( H5C2_validate_lru_list(cache_ptr) < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "LRU sanity check failed.\n"); - } -#endif /* H5C2_DO_EXTREME_SANITY_CHECKS */ - - - /* if the entry has multiple read only protects, just decrement - * the ro_ref_counter. Don't actually unprotect until the ref count - * drops to zero. - */ - if ( entry_ptr->ro_ref_count > 1 ) { - - HDassert( entry_ptr->is_protected ); - HDassert( entry_ptr->is_read_only ); - - if ( dirtied ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \ - "Read only entry modified(1)??") - } - - (entry_ptr->ro_ref_count)--; - - /* Pin or unpin the entry as requested. */ - if ( pin_entry ) { - - if ( entry_ptr->is_pinned ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTPIN, FAIL, \ - "Entry already pinned???") - } - entry_ptr->is_pinned = TRUE; - H5C2__UPDATE_STATS_FOR_PIN(cache_ptr, entry_ptr) - - } else if ( unpin_entry ) { - - if ( ! ( entry_ptr->is_pinned ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPIN, FAIL, \ - "Entry already unpinned???") - } - entry_ptr->is_pinned = FALSE; - H5C2__UPDATE_STATS_FOR_UNPIN(cache_ptr, entry_ptr) - - } - - } else { - - if ( entry_ptr->is_read_only ) { - - HDassert( entry_ptr->ro_ref_count == 1 ); - - if ( dirtied ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \ - "Read only entry modified(2)??") - } - - entry_ptr->is_read_only = FALSE; - entry_ptr->ro_ref_count = 0; - } - -#ifdef H5_HAVE_PARALLEL - /* When the H5C2 code is used to implement the metadata cache in the - * PHDF5 case, only the cache on process 0 is allowed to write to file. - * All the other metadata caches must hold dirty entries until they - * are told that the entries are clean. - * - * The clear_on_unprotect flag in the H5C2_cache_entry_t structure - * exists to deal with the case in which an entry is protected when - * its cache receives word that the entry is now clean. In this case, - * the clear_on_unprotect flag is set, and the entry is flushed with - * the H5C2__FLUSH_CLEAR_ONLY_FLAG. - * - * All this is a bit awkward, but until the metadata cache entries - * are contiguous, with only one dirty flag, we have to let the supplied - * functions deal with the reseting the is_dirty flag. - */ - if ( entry_ptr->clear_on_unprotect ) { - - HDassert( entry_ptr->is_dirty ); - - entry_ptr->clear_on_unprotect = FALSE; - - if ( ! dirtied ) { - - clear_entry = TRUE; - } - } -#endif /* H5_HAVE_PARALLEL */ - - if ( ! (entry_ptr->is_protected) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \ - "Entry already unprotected??") - } - - /* mark the entry as dirty if appropriate */ - if ( dirtied ) { - - entry_ptr->is_dirty = ( (entry_ptr->is_dirty) || dirtied ); - entry_ptr->image_up_to_date = FALSE; - - H5C2__UPDATE_TL_FOR_ENTRY_DIRTY(cache_ptr, entry_ptr, FAIL) - } - - /* update for change in entry size if necessary */ - if ( ( size_changed ) && ( entry_ptr->size != new_size ) ) { - - /* Release the current image */ - if( entry_ptr->image_ptr ) - entry_ptr->image_ptr = H5MM_xfree(entry_ptr->image_ptr); - - /* do a flash cache size increase if appropriate */ - if ( cache_ptr->flash_size_increase_possible ) { - - if ( new_size > entry_ptr->size ) { - - size_increase = new_size - entry_ptr->size; - - if ( size_increase >= - cache_ptr->flash_size_increase_threshold ) { - - result = H5C2__flash_increase_cache_size(cache_ptr, - entry_ptr->size, - new_size); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \ - "H5C2__flash_increase_cache_size failed.") - } - } - } - } - - /* update the protected list */ - H5C2__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr->pl_len), \ - (cache_ptr->pl_size), \ - (entry_ptr->size), (new_size)); - - /* update the hash table */ - H5C2__UPDATE_INDEX_FOR_SIZE_CHANGE((cache_ptr), (entry_ptr->size),\ - (new_size)); - - /* if the entry is in the skip list, update that too */ - if ( entry_ptr->in_slist ) { - - H5C2__UPDATE_SLIST_FOR_SIZE_CHANGE((cache_ptr), \ - (entry_ptr->size),\ - (new_size)); - } - - /* if journaling is enabled, and the entry is on the transaction - * list, update that list for the size changed. - */ - H5C2__UPDATE_TL_FOR_ENTRY_SIZE_CHANGE((cache_ptr), (entry_ptr), \ - (entry_ptr->size), \ - (new_size)); - - /* update statistics just before changing the entry size */ - H5C2__UPDATE_STATS_FOR_ENTRY_SIZE_CHANGE((cache_ptr), (entry_ptr), \ - (new_size)); - - /* finally, update the entry size proper */ - entry_ptr->size = new_size; - } - - /* Pin or unpin the entry as requested. */ - if ( pin_entry ) { - - if ( entry_ptr->is_pinned ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTPIN, FAIL, \ - "Entry already pinned???") - } - entry_ptr->is_pinned = TRUE; - H5C2__UPDATE_STATS_FOR_PIN(cache_ptr, entry_ptr) - - } else if ( unpin_entry ) { - - if ( ! ( entry_ptr->is_pinned ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPIN, FAIL, \ - "Entry already unpinned???") - } - entry_ptr->is_pinned = FALSE; - H5C2__UPDATE_STATS_FOR_UNPIN(cache_ptr, entry_ptr) - - } - - /* H5C2__UPDATE_RP_FOR_UNPROTECT will places the unprotected entry on - * the pinned entry list if entry_ptr->is_pined is TRUE. - */ - H5C2__UPDATE_RP_FOR_UNPROTECT(cache_ptr, entry_ptr, FAIL) - - entry_ptr->is_protected = FALSE; - - /* if the entry is dirty, 'or' its flush_marker with the set flush flag, - * and then add it to the skip list if it isn't there already. - */ - - if ( entry_ptr->is_dirty ) { - - entry_ptr->flush_marker |= set_flush_marker; - - if ( ! (entry_ptr->in_slist) ) { - - H5C2__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, FAIL) - } - } - - /* this implementation of the "deleted" option is a bit inefficient, as - * we re-insert the entry to be deleted into the replacement policy - * data structures, only to remove them again. Depending on how often - * we do this, we may want to optimize a bit. - * - * On the other hand, this implementation is reasonably clean, and - * makes good use of existing code. - * JRM - 5/19/04 - */ - if ( deleted ) { - - /* we can't delete a pinned entry */ - HDassert ( ! (entry_ptr->is_pinned ) ); - - /* verify that the target entry is in the cache. */ - - H5C2__SEARCH_INDEX(cache_ptr, addr, test_entry_ptr, FAIL) - - if ( test_entry_ptr == NULL ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \ - "entry not in hash table?!?.") - } - else if ( test_entry_ptr != entry_ptr ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \ - "hash table contains multiple entries for addr?!?.") - } - - if ( cache_ptr->mdj_enabled ) { - - /* if journaling is enabled, we have a bit of house keeping - * to do before we delete the entry. - * - * First, if a transaction is in progress, it is possible - * that the target entry is on the transaction list. If it is - * it must be removed before the flush destroy. - * - * Second, if the target entry is on the journal write in - * in progress list, it must be removed from that list as - * well. - */ - - hbool_t entry_on_jwip_list = ( entry_ptr->last_trans != 0 ); - - if ( cache_ptr->trans_in_progress ) { - - H5C2__UPDATE_TL_FOR_ENTRY_CLEAR((cache_ptr), \ - (entry_ptr), \ - FAIL) - } - - if ( entry_on_jwip_list ) { - - entry_ptr->last_trans = 0; - H5C2__UPDATE_RP_FOR_JOURNAL_WRITE_COMPLETE((cache_ptr), \ - (entry_ptr), \ - FAIL) - } - } - - if ( H5C2_flush_single_entry(f, - dxpl_id, - cache_ptr, - type, - addr, - (H5C2__FLUSH_CLEAR_ONLY_FLAG | - H5C2__FLUSH_INVALIDATE_FLAG), - TRUE) < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "Can't flush.") - } - } -#ifdef H5_HAVE_PARALLEL - else if ( clear_entry ) { - - /* verify that the target entry is in the cache. */ - - H5C2__SEARCH_INDEX(cache_ptr, addr, test_entry_ptr, FAIL) - - if ( test_entry_ptr == NULL ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \ - "entry not in hash table?!?.") - } - else if ( test_entry_ptr != entry_ptr ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, \ - "hash table contains multiple entries for addr?!?.") - } - - if ( H5C2_flush_single_entry(f, - dxpl_id, - cache_ptr, - type, - addr, - H5C2__FLUSH_CLEAR_ONLY_FLAG, - TRUE) < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "Can't clear.") - } - } -#endif /* H5_HAVE_PARALLEL */ - } - - H5C2__UPDATE_STATS_FOR_UNPROTECT(cache_ptr) - -done: - -#if H5C2_DO_EXTREME_SANITY_CHECKS - if ( H5C2_validate_lru_list(cache_ptr) < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "LRU sanity check failed.\n"); - } -#endif /* H5C2_DO_EXTREME_SANITY_CHECKS */ - -#if H5C2_PRINT_EXIT_POINTS - if ( H5C2_PRINT_ENTRY_POINT_TARGET_TYPE(type->id) ) { - HDfprintf(stdout, "%s: Exiting with result = %d.\n", - FUNC, (int)ret_value); - } -#endif /* H5C2_PRINT_EXIT_POINTS */ - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_unprotect() */ - - -/*------------------------------------------------------------------------- - * Function: H5C2_validate_resize_config() - * - * Purpose: Run a sanity check on the specified sections of the - * provided instance of struct H5C2_auto_size_ctl_t. - * - * Do nothing and return SUCCEED if no errors are detected, - * and flag an error and return FAIL otherwise. - * - * Return: Non-negative on success/Negative on failure - * - * Programmer: John Mainzer - * 3/23/05 - * - * Modifications: - * - * Added validation for the flash increment fields. - * - * JRM -- 12/31/07 - * - *------------------------------------------------------------------------- - */ - -herr_t -H5C2_validate_resize_config(H5C2_auto_size_ctl_t * config_ptr, - unsigned int tests) -{ - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5C2_validate_resize_config, FAIL) - - if ( config_ptr == NULL ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "NULL config_ptr on entry.") - } - - if ( config_ptr->version != H5C2__CURR_AUTO_SIZE_CTL_VER ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Unknown config version.") - } - - - if ( (tests & H5C2_RESIZE_CFG__VALIDATE_GENERAL) != 0 ) { - - if ( ( config_ptr->set_initial_size != TRUE ) && - ( config_ptr->set_initial_size != FALSE ) ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ - "set_initial_size must be either TRUE or FALSE"); - } - - if ( config_ptr->max_size > H5C2__MAX_MAX_CACHE_SIZE ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "max_size too big"); - } - - if ( config_ptr->min_size < H5C2__MIN_MAX_CACHE_SIZE ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "min_size too small"); - } - - if ( config_ptr->min_size > config_ptr->max_size ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "min_size > max_size"); - } - - if ( ( config_ptr->set_initial_size ) && - ( ( config_ptr->initial_size < config_ptr->min_size ) || - ( config_ptr->initial_size > config_ptr->max_size ) ) ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ - "initial_size must be in the interval [min_size, max_size]"); - } - - if ( ( config_ptr->min_clean_fraction < 0.0 ) || - ( config_ptr->min_clean_fraction > 1.0 ) ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ - "min_clean_fraction must be in the interval [0.0, 1.0]"); - } - - if ( config_ptr->epoch_length < H5C2__MIN_AR_EPOCH_LENGTH ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "epoch_length too small"); - } - - if ( config_ptr->epoch_length > H5C2__MAX_AR_EPOCH_LENGTH ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "epoch_length too big"); - } - } /* H5C2_RESIZE_CFG__VALIDATE_GENERAL */ - - - if ( (tests & H5C2_RESIZE_CFG__VALIDATE_INCREMENT) != 0 ) { - - if ( ( config_ptr->incr_mode != H5C2_incr__off ) && - ( config_ptr->incr_mode != H5C2_incr__threshold ) ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Invalid incr_mode"); - } - - if ( config_ptr->incr_mode == H5C2_incr__threshold ) { - - if ( ( config_ptr->lower_hr_threshold < 0.0 ) || - ( config_ptr->lower_hr_threshold > 1.0 ) ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ - "lower_hr_threshold must be in the range [0.0, 1.0]"); - } - - if ( config_ptr->increment < 1.0 ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ - "increment must be greater than or equal to 1.0"); - } - - if ( ( config_ptr->apply_max_increment != TRUE ) && - ( config_ptr->apply_max_increment != FALSE ) ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ - "apply_max_increment must be either TRUE or FALSE"); - } - - /* no need to check max_increment, as it is a size_t, - * and thus must be non-negative. - */ - } /* H5C2_incr__threshold */ - - switch ( config_ptr->flash_incr_mode ) - { - case H5C2_flash_incr__off: - /* nothing to do here */ - break; - - case H5C2_flash_incr__add_space: - if ( ( config_ptr->flash_multiple < 0.1 ) || - ( config_ptr->flash_multiple > 10.0 ) ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ - "flash_multiple must be in the range [0.1, 10.0]"); - } - - if ( ( config_ptr->flash_threshold < 0.1 ) || - ( config_ptr->flash_threshold > 1.0 ) ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ - "flash_threshold must be in the range [0.1, 1.0]"); - } - break; - - default: - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ - "Invalid flash_incr_mode"); - break; - } - } /* H5C2_RESIZE_CFG__VALIDATE_INCREMENT */ - - - if ( (tests & H5C2_RESIZE_CFG__VALIDATE_DECREMENT) != 0 ) { - - if ( ( config_ptr->decr_mode != H5C2_decr__off ) && - ( config_ptr->decr_mode != H5C2_decr__threshold ) && - ( config_ptr->decr_mode != H5C2_decr__age_out ) && - ( config_ptr->decr_mode != H5C2_decr__age_out_with_threshold ) - ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Invalid decr_mode"); - } - - if ( config_ptr->decr_mode == H5C2_decr__threshold ) { - - if ( config_ptr->upper_hr_threshold > 1.0 ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ - "upper_hr_threshold must be <= 1.0"); - } - - if ( ( config_ptr->decrement > 1.0 ) || - ( config_ptr->decrement < 0.0 ) ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ - "decrement must be in the interval [0.0, 1.0]"); - } - - /* no need to check max_decrement as it is a size_t - * and thus must be non-negative. - */ - } /* H5C2_decr__threshold */ - - if ( ( config_ptr->decr_mode == H5C2_decr__age_out ) || - ( config_ptr->decr_mode == H5C2_decr__age_out_with_threshold ) - ) { - - if ( config_ptr->epochs_before_eviction < 1 ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ - "epochs_before_eviction must be positive"); - } - - if ( config_ptr->epochs_before_eviction > H5C2__MAX_EPOCH_MARKERS ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ - "epochs_before_eviction too big"); - } - - if ( ( config_ptr->apply_empty_reserve != TRUE ) && - ( config_ptr->apply_empty_reserve != FALSE ) ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ - "apply_empty_reserve must be either TRUE or FALSE"); - } - - if ( ( config_ptr->apply_empty_reserve ) && - ( ( config_ptr->empty_reserve > 1.0 ) || - ( config_ptr->empty_reserve < 0.0 ) ) ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ - "empty_reserve must be in the interval [0.0, 1.0]"); - } - - /* no need to check max_decrement as it is a size_t - * and thus must be non-negative. - */ - } /* H5C2_decr__age_out || H5C2_decr__age_out_with_threshold */ - - if ( config_ptr->decr_mode == H5C2_decr__age_out_with_threshold ) { - - if ( ( config_ptr->upper_hr_threshold > 1.0 ) || - ( config_ptr->upper_hr_threshold < 0.0 ) ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ - "upper_hr_threshold must be in the interval [0.0, 1.0]"); - } - } /* H5C2_decr__age_out_with_threshold */ - - } /* H5C2_RESIZE_CFG__VALIDATE_DECREMENT */ - - - if ( (tests & H5C2_RESIZE_CFG__VALIDATE_INTERACTIONS) != 0 ) { - - if ( ( config_ptr->incr_mode == H5C2_incr__threshold ) - && - ( ( config_ptr->decr_mode == H5C2_decr__threshold ) - || - ( config_ptr->decr_mode == H5C2_decr__age_out_with_threshold ) - ) - && - ( config_ptr->lower_hr_threshold - >= - config_ptr->upper_hr_threshold - ) - ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, \ - "conflicting threshold fields in config.") - } - } /* H5C2_RESIZE_CFG__VALIDATE_INTERACTIONS */ - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_validate_resize_config() */ - - -/*************************************************************************/ -/**************************** Private Functions: *************************/ -/*************************************************************************/ - -/*------------------------------------------------------------------------- - * - * Function: H5C2__auto_adjust_cache_size - * - * Purpose: Obtain the current full cache hit rate, and compare it - * with the hit rate thresholds for modifying cache size. - * If one of the thresholds has been crossed, adjusts the - * size of the cache accordingly. - * - * The function then resets the full cache hit rate - * statistics, and exits. - * - * Return: Non-negative on success/Negative on failure or if there was - * an attempt to flush a protected item. - * - * - * Programmer: John Mainzer, 10/7/04 - * - * Modifications: - * - * JRM -- 11/18/04 - * Major re-write to support ageout method of cache size - * reduction, and to adjust to changes in the - * H5C2_auto_size_ctl_t structure. - * - * JRM -- 9/8/07 - * Reworked to accomodate cache API changes needed to - * support metadata journaling. Mostly, this involved - * removing a bunch of parameters that used to be - * passed through to other calls, and are no longer - * needed. - * - * JRM -- 1/5/08 - * Added support for flash cache size increases. - * - *------------------------------------------------------------------------- - */ - -static herr_t -H5C2__auto_adjust_cache_size(H5F_t * f, - hid_t dxpl_id, - H5C2_t * cache_ptr, - hbool_t write_permitted) -{ - herr_t result; - hbool_t inserted_epoch_marker = FALSE; - size_t new_max_cache_size = 0; - size_t old_max_cache_size = 0; - size_t new_min_clean_size = 0; - size_t old_min_clean_size = 0; - double hit_rate; - enum H5C2_resize_status status = in_spec2; /* will change if needed */ - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI_NOINIT(H5C2__auto_adjust_cache_size) - - HDassert( f ); - HDassert( cache_ptr ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - HDassert( cache_ptr->cache_accesses >= - (cache_ptr->resize_ctl).epoch_length ); - HDassert( 0.0 <= (cache_ptr->resize_ctl).min_clean_fraction ); - HDassert( (cache_ptr->resize_ctl).min_clean_fraction <= 100.0 ); - - if ( !cache_ptr->resize_enabled ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Auto cache resize disabled.") - } - - HDassert( ( (cache_ptr->resize_ctl).incr_mode != H5C2_incr__off ) || \ - ( (cache_ptr->resize_ctl).decr_mode != H5C2_decr__off ) ); - - if ( H5C2_get_cache_hit_rate(cache_ptr, &hit_rate) != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't get hit rate.") - } - - HDassert( ( 0.0 <= hit_rate ) && ( hit_rate <= 1.0 ) ); - - switch ( (cache_ptr->resize_ctl).incr_mode ) - { - case H5C2_incr__off: - if ( cache_ptr->size_increase_possible ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "size_increase_possible but H5C2_incr__off?!?!?") - } - break; - - case H5C2_incr__threshold: - if ( hit_rate < (cache_ptr->resize_ctl).lower_hr_threshold ) { - - if ( ! cache_ptr->size_increase_possible ) { - - status = increase_disabled2; - - } else if ( cache_ptr->max_cache_size >= - (cache_ptr->resize_ctl).max_size ) { - - HDassert( cache_ptr->max_cache_size == \ - (cache_ptr->resize_ctl).max_size ); - status = at_max_size2; - - } else if ( ! cache_ptr->cache_full ) { - - status = not_full2; - - } else { - - new_max_cache_size = (size_t) - (((double)(cache_ptr->max_cache_size)) * - (cache_ptr->resize_ctl).increment); - - /* clip to max size if necessary */ - if ( new_max_cache_size > - (cache_ptr->resize_ctl).max_size ) { - - new_max_cache_size = (cache_ptr->resize_ctl).max_size; - } - - /* clip to max increment if necessary */ - if ( ( (cache_ptr->resize_ctl).apply_max_increment ) && - ( (cache_ptr->max_cache_size + - (cache_ptr->resize_ctl).max_increment) < - new_max_cache_size ) ) { - - new_max_cache_size = cache_ptr->max_cache_size + - (cache_ptr->resize_ctl).max_increment; - } - - status = increase2; - } - } - break; - - default: - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unknown incr_mode.") - } - - /* If the decr_mode is either age out or age out with threshold, we - * must run the marker maintenance code, whether we run the size - * reduction code or not. We do this in two places -- here we - * insert a new marker if the number of active epoch markers is - * is less than the the current epochs before eviction, and after - * the ageout call, we cycle the markers. - * - * However, we can't call the ageout code or cycle the markers - * unless there was a full complement of markers in place on - * entry. The inserted_epoch_marker flag is used to track this. - */ - - if ( ( ( (cache_ptr->resize_ctl).decr_mode == H5C2_decr__age_out ) - || - ( (cache_ptr->resize_ctl).decr_mode == - H5C2_decr__age_out_with_threshold - ) - ) - && - ( cache_ptr->epoch_markers_active < - (cache_ptr->resize_ctl).epochs_before_eviction - ) - ) { - - result = H5C2__autoadjust__ageout__insert_new_marker(cache_ptr); - - if ( result != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "can't insert new epoch marker.") - - } else { - - inserted_epoch_marker = TRUE; - } - } - - /* don't run the cache size decrease code unless the cache size - * increase code is disabled, or the size increase code sees no need - * for action. In either case, status == in_spec2 at this point. - */ - - if ( status == in_spec2 ) { - - switch ( (cache_ptr->resize_ctl).decr_mode ) - { - case H5C2_decr__off: - break; - - case H5C2_decr__threshold: - if ( hit_rate > (cache_ptr->resize_ctl).upper_hr_threshold ) { - - if ( ! cache_ptr->size_decrease_possible ) { - - status = decrease_disabled2; - - } else if ( cache_ptr->max_cache_size <= - (cache_ptr->resize_ctl).min_size ) { - - HDassert( cache_ptr->max_cache_size == - (cache_ptr->resize_ctl).min_size ); - status = at_min_size2; - - } else { - - new_max_cache_size = (size_t) - (((double)(cache_ptr->max_cache_size)) * - (cache_ptr->resize_ctl).decrement); - - /* clip to min size if necessary */ - if ( new_max_cache_size < - (cache_ptr->resize_ctl).min_size ) { - - new_max_cache_size = - (cache_ptr->resize_ctl).min_size; - } - - /* clip to max decrement if necessary */ - if ( ( (cache_ptr->resize_ctl).apply_max_decrement ) && - ( ((cache_ptr->resize_ctl).max_decrement + - new_max_cache_size) < - cache_ptr->max_cache_size ) ) { - - new_max_cache_size = cache_ptr->max_cache_size - - (cache_ptr->resize_ctl).max_decrement; - } - - status = decrease2; - } - } - break; - - case H5C2_decr__age_out_with_threshold: - case H5C2_decr__age_out: - if ( ! inserted_epoch_marker ) { - - if ( ! cache_ptr->size_decrease_possible ) { - - status = decrease_disabled2; - - } else { - - result = H5C2__autoadjust__ageout(f, - dxpl_id, - cache_ptr, - hit_rate, - &status, - &new_max_cache_size, - write_permitted); - - if ( result != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "ageout code failed.") - } - } - } - break; - - default: - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unknown incr_mode.") - } - } - - /* cycle the epoch markers here if appropriate */ - if ( ( ( (cache_ptr->resize_ctl).decr_mode == H5C2_decr__age_out ) - || - ( (cache_ptr->resize_ctl).decr_mode == - H5C2_decr__age_out_with_threshold - ) - ) - && - ( ! inserted_epoch_marker ) - ) { - - /* move last epoch marker to the head of the LRU list */ - result = H5C2__autoadjust__ageout__cycle_epoch_marker(cache_ptr); - - if ( result != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "error cycling epoch marker.") - } - } - - if ( ( status == increase2 ) || ( status == decrease2 ) ) { - - old_max_cache_size = cache_ptr->max_cache_size; - old_min_clean_size = cache_ptr->min_clean_size; - - new_min_clean_size = (size_t) - ((double)new_max_cache_size * - ((cache_ptr->resize_ctl).min_clean_fraction)); - - /* new_min_clean_size is of size_t, and thus must be non-negative. - * Hence we have - * - * ( 0 <= new_min_clean_size ). - * - * by definition. - */ - HDassert( new_min_clean_size <= new_max_cache_size ); - HDassert( (cache_ptr->resize_ctl).min_size <= new_max_cache_size ); - HDassert( new_max_cache_size <= (cache_ptr->resize_ctl).max_size ); - - cache_ptr->max_cache_size = new_max_cache_size; - cache_ptr->min_clean_size = new_min_clean_size; - - if ( status == increase2 ) { - - cache_ptr->cache_full = FALSE; - - } else if ( status == decrease2 ) { - - cache_ptr->size_decreased = TRUE; - } - - /* update flash cache size increase fields as appropriate */ - if ( cache_ptr->flash_size_increase_possible ) { - - switch ( (cache_ptr->resize_ctl).flash_incr_mode ) - { - case H5C2_flash_incr__off: - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "flash_size_increase_possible but H5C2_flash_incr__off?!") - break; - - case H5C2_flash_incr__add_space: - cache_ptr->flash_size_increase_threshold = - (size_t) - (((double)(cache_ptr->max_cache_size)) * - ((cache_ptr->resize_ctl).flash_threshold)); - break; - - default: /* should be unreachable */ - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "Unknown flash_incr_mode?!?!?.") - break; - } - } - } - - if ( (cache_ptr->resize_ctl).rpt_fcn != NULL ) { - - (*((cache_ptr->resize_ctl).rpt_fcn)) - (cache_ptr, - H5C2__CURR_AUTO_RESIZE_RPT_FCN_VER, - hit_rate, - status, - old_max_cache_size, - new_max_cache_size, - old_min_clean_size, - new_min_clean_size); - } - - if ( H5C2_reset_cache_hit_rate_stats(cache_ptr) != SUCCEED ) { - - /* this should be impossible... */ - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "H5C2_reset_cache_hit_rate_stats failed.") - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2__auto_adjust_cache_size() */ - - -/*------------------------------------------------------------------------- - * - * Function: H5C2__autoadjust__ageout - * - * Purpose: Implement the ageout automatic cache size decrement - * algorithm. Note that while this code evicts aged out - * entries, the code does not change the maximum cache size. - * Instead, the function simply computes the new value (if - * any change is indicated) and reports this value in - * *new_max_cache_size_ptr. - * - * Return: Non-negative on success/Negative on failure or if there was - * an attempt to flush a protected item. - * - * - * Programmer: John Mainzer, 11/18/04 - * - * Modifications: - * - * JRM -- 9/9/07 - * Reworked function to support API changes in support of - * metadata cacheing. In essence, the change involved - * removal of arguments that are no longer needed by the - * callbacks, and thus no-longer need be passed through. - * - *------------------------------------------------------------------------- - */ - -static herr_t -H5C2__autoadjust__ageout(H5F_t * f, - hid_t dxpl_id, - H5C2_t * cache_ptr, - double hit_rate, - enum H5C2_resize_status * status_ptr, - size_t * new_max_cache_size_ptr, - hbool_t write_permitted) -{ - herr_t ret_value = SUCCEED; /* Return value */ - herr_t result; - size_t test_size; - - FUNC_ENTER_NOAPI_NOINIT(H5C2__autoadjust__ageout) - - HDassert( f ); - HDassert( cache_ptr ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - HDassert( ( status_ptr ) && ( *status_ptr == in_spec2 ) ); - HDassert( ( new_max_cache_size_ptr ) && ( *new_max_cache_size_ptr == 0 ) ); - - /* remove excess epoch markers if any */ - if ( cache_ptr->epoch_markers_active > - (cache_ptr->resize_ctl).epochs_before_eviction ) { - - result = H5C2__autoadjust__ageout__remove_excess_markers(cache_ptr); - - if ( result != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "can't remove excess epoch markers.") - } - } - - if ( ( (cache_ptr->resize_ctl).decr_mode == H5C2_decr__age_out ) - || - ( ( (cache_ptr->resize_ctl).decr_mode == - H5C2_decr__age_out_with_threshold - ) - && - ( hit_rate >= (cache_ptr->resize_ctl).upper_hr_threshold ) - ) - ) { - - if ( cache_ptr->max_cache_size > (cache_ptr->resize_ctl).min_size ){ - - /* evict aged out cache entries if appropriate... */ - result = H5C2__autoadjust__ageout__evict_aged_out_entries - ( - f, - dxpl_id, - cache_ptr, - write_permitted - ); - - if ( result != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "error flushing aged out entries.") - } - - /* ... and then reduce cache size if appropriate */ - if ( cache_ptr->index_size < cache_ptr->max_cache_size ) { - - if ( (cache_ptr->resize_ctl).apply_empty_reserve ) { - - test_size = (size_t)(((double)cache_ptr->index_size) / - (1 - (cache_ptr->resize_ctl).empty_reserve)); - - if ( test_size < cache_ptr->max_cache_size ) { - - *status_ptr = decrease2; - *new_max_cache_size_ptr = test_size; - } - } else { - - *status_ptr = decrease2; - *new_max_cache_size_ptr = cache_ptr->index_size; - } - - if ( *status_ptr == decrease2 ) { - - /* clip to min size if necessary */ - if ( *new_max_cache_size_ptr < - (cache_ptr->resize_ctl).min_size ) { - - *new_max_cache_size_ptr = - (cache_ptr->resize_ctl).min_size; - } - - /* clip to max decrement if necessary */ - if ( ( (cache_ptr->resize_ctl).apply_max_decrement ) && - ( ((cache_ptr->resize_ctl).max_decrement + - *new_max_cache_size_ptr) < - cache_ptr->max_cache_size ) ) { - - *new_max_cache_size_ptr = cache_ptr->max_cache_size - - (cache_ptr->resize_ctl).max_decrement; - } - } - } - } else { - - *status_ptr = at_min_size2; - } - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2__autoadjust__ageout() */ - - -/*------------------------------------------------------------------------- - * - * Function: H5C2__autoadjust__ageout__cycle_epoch_marker - * - * Purpose: Remove the oldest epoch marker from the LRU list, - * and reinsert it at the head of the LRU list. Also - * remove the epoch marker's index from the head of the - * ring buffer, and re-insert it at the tail of the ring - * buffer. - * - * Return: SUCCEED on success/FAIL on failure. - * - * Programmer: John Mainzer, 11/22/04 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -static herr_t -H5C2__autoadjust__ageout__cycle_epoch_marker(H5C2_t * cache_ptr) -{ - herr_t ret_value = SUCCEED; /* Return value */ - int i; - - FUNC_ENTER_NOAPI_NOINIT(H5C2__autoadjust__ageout__cycle_epoch_marker) - - HDassert( cache_ptr ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - - if ( cache_ptr->epoch_markers_active <= 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "No active epoch markers on entry?!?!?.") - } - - /* remove the last marker from both the ring buffer and the LRU list */ - - i = cache_ptr->epoch_marker_ringbuf[cache_ptr->epoch_marker_ringbuf_first]; - - cache_ptr->epoch_marker_ringbuf_first = - (cache_ptr->epoch_marker_ringbuf_first + 1) % - (H5C2__MAX_EPOCH_MARKERS + 1); - - cache_ptr->epoch_marker_ringbuf_size -= 1; - - if ( cache_ptr->epoch_marker_ringbuf_size < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "ring buffer underflow.") - } - - if ( (cache_ptr->epoch_marker_active)[i] != TRUE ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unused marker in LRU?!?") - } - - H5C2__DLL_REMOVE((&((cache_ptr->epoch_markers)[i])), \ - (cache_ptr)->LRU_head_ptr, \ - (cache_ptr)->LRU_tail_ptr, \ - (cache_ptr)->LRU_list_len, \ - (cache_ptr)->LRU_list_size, \ - (FAIL)) - - /* now, re-insert it at the head of the LRU list, and at the tail of - * the ring buffer. - */ - - HDassert( ((cache_ptr->epoch_markers)[i]).addr == (haddr_t)i ); - HDassert( ((cache_ptr->epoch_markers)[i]).next == NULL ); - HDassert( ((cache_ptr->epoch_markers)[i]).prev == NULL ); - - cache_ptr->epoch_marker_ringbuf_last = - (cache_ptr->epoch_marker_ringbuf_last + 1) % - (H5C2__MAX_EPOCH_MARKERS + 1); - - (cache_ptr->epoch_marker_ringbuf)[cache_ptr->epoch_marker_ringbuf_last] = i; - - cache_ptr->epoch_marker_ringbuf_size += 1; - - if ( cache_ptr->epoch_marker_ringbuf_size > H5C2__MAX_EPOCH_MARKERS ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "ring buffer overflow.") - } - - H5C2__DLL_PREPEND((&((cache_ptr->epoch_markers)[i])), \ - (cache_ptr)->LRU_head_ptr, \ - (cache_ptr)->LRU_tail_ptr, \ - (cache_ptr)->LRU_list_len, \ - (cache_ptr)->LRU_list_size, \ - (FAIL)) -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2__autoadjust__ageout__cycle_epoch_marker() */ - - -/*------------------------------------------------------------------------- - * - * Function: H5C2__autoadjust__ageout__evict_aged_out_entries - * - * Purpose: Evict clean entries in the cache that haven't - * been accessed for at least - * (cache_ptr->resize_ctl).epochs_before_eviction epochs, - * and flush dirty entries that haven't been accessed for - * that amount of time. - * - * Depending on configuration, the function will either - * flush or evict all such entries, or all such entries it - * encounters until it has freed the maximum amount of space - * allowed under the maximum decrement. - * - * If we are running in parallel mode, writes may not be - * permitted. If so, the function simply skips any dirty - * entries it may encounter. - * - * The function makes no attempt to maintain the minimum - * clean size, as there is no guarantee that the cache size - * will be changed. - * - * If there is no cache size change, the minimum clean size - * constraint will be met through a combination of clean - * entries and free space in the cache. - * - * If there is a cache size reduction, the minimum clean size - * will be re-calculated, and will be enforced the next time - * we have to make space in the cache. - * - * The primary_dxpl_id and secondary_dxpl_id parameters - * specify the dxpl_ids used depending on the value of - * *first_flush_ptr. The idea is to use the primary_dxpl_id - * on the first write in a sequence of writes, and to use - * the secondary_dxpl_id on all subsequent writes. - * - * This is useful in the metadata cache, but may not be - * needed elsewhere. If so, just use the same dxpl_id for - * both parameters. - * - * Observe that this function cannot occasion a read. - * - * Return: Non-negative on success/Negative on failure. - * - * Programmer: John Mainzer, 11/22/04 - * - * Modifications: - * - * JRM -- 9/9/07 - * Reworked function to support API changes in support of - * metadata cacheing. In essence, the change involved - * removal of arguments that are no longer needed by the - * callbacks, and thus no-longer need be passed through. - * - * JRM -- 10/13/07 - * Reworked code to allow it to the function to handle the - * case in which the LRU list is modified out from under the - * function by a serialize function. This can happen if - * the serialize function associated with the entry being - * flushed either accesses the next item in the LRU list, - * or (as Quincey assures me is impossible), it accesses - * an entry not currently in cache, causing the eviction - * of the next entry in the LRU. - * - * We handle this situation by detecting it, and restarting - * the scan of the LRU when it occurs. - * - *------------------------------------------------------------------------- - */ - -static herr_t -H5C2__autoadjust__ageout__evict_aged_out_entries(H5F_t * f, - hid_t dxpl_id, - H5C2_t * cache_ptr, - hbool_t write_permitted) -{ - herr_t result; - size_t eviction_size_limit; - size_t bytes_evicted = 0; - hbool_t prev_is_dirty = FALSE; - H5C2_cache_entry_t * entry_ptr; - H5C2_cache_entry_t * next_ptr; - H5C2_cache_entry_t * prev_ptr; - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI_NOINIT(H5C2__autoadjust__ageout__evict_aged_out_entries) - - HDassert( f ); - HDassert( cache_ptr ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - - /* if there is a limit on the amount that the cache size can be decrease - * in any one round of the cache size reduction algorithm, load that - * limit into eviction_size_limit. Otherwise, set eviction_size_limit - * to the equivalent of infinity. The current size of the index will - * do nicely. - */ - if ( (cache_ptr->resize_ctl).apply_max_decrement ) { - - eviction_size_limit = (cache_ptr->resize_ctl).max_decrement; - - } else { - - eviction_size_limit = cache_ptr->index_size; /* i.e. infinity */ - } - - if ( write_permitted ) { - - entry_ptr = cache_ptr->LRU_tail_ptr; - - while ( ( entry_ptr != NULL ) && - ( (entry_ptr->type)->id != H5C2__EPOCH_MARKER_TYPE ) && - ( bytes_evicted < eviction_size_limit ) ) - { - HDassert( ! (entry_ptr->is_protected) ); - - next_ptr = entry_ptr->next; - prev_ptr = entry_ptr->prev; - - if ( prev_ptr != NULL ) { - - prev_is_dirty = prev_ptr->is_dirty; - } - - if ( entry_ptr->is_dirty ) { - - result = H5C2_flush_single_entry(f, - dxpl_id, - cache_ptr, - entry_ptr->type, - entry_ptr->addr, - H5C2__NO_FLAGS_SET, - FALSE); - } else { - - bytes_evicted += entry_ptr->size; - - result = H5C2_flush_single_entry(f, - dxpl_id, - cache_ptr, - entry_ptr->type, - entry_ptr->addr, - H5C2__FLUSH_INVALIDATE_FLAG, - TRUE); - } - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ - "unable to flush entry") - } - - if ( prev_ptr != NULL ) { -#ifndef NDEBUG - if ( prev_ptr->magic != H5C2__H5C2_CACHE_ENTRY_T_MAGIC ) { - - /* something horrible has happened to *prev_ptr -- - * scream and die. - */ - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "*prev_ptr corrupt") - - } else -#endif /* NDEBUG */ - if ( ( prev_ptr->is_dirty != prev_is_dirty ) - || - ( prev_ptr->next != next_ptr ) - || - ( prev_ptr->is_protected ) - || - ( prev_ptr->is_pinned ) ) { - - /* something has happened to the LRU -- start over - * from the tail. - */ - entry_ptr = cache_ptr->LRU_tail_ptr; - - } else { - - entry_ptr = prev_ptr; - - } - } else { - - entry_ptr = NULL; - - } - } /* end while */ - - /* for now at least, don't bother to maintain the minimum clean size, - * as the cache should now be less than its maximum size. Due to - * the vaguries of the cache size reduction algorthim, we may not - * reduce the size of the cache. - * - * If we do, we will calculate a new minimum clean size, which will - * be enforced the next time we try to make space in the cache. - * - * If we don't, no action is necessary, as we have just evicted and/or - * or flushed a bunch of entries and therefore the sum of the clean - * and free space in the cache must be greater than or equal to the - * min clean space requirement (assuming that requirement was met on - * entry). - */ - - } else /* ! write_permitted */ { - - /* since we are not allowed to write, all we can do is evict - * any clean entries that we may encounter before we either - * hit the eviction size limit, or encounter the epoch marker. - * - * If we are operating read only, this isn't an issue, as there - * will not be any dirty entries. - * - * If we are operating in R/W mode, all the dirty entries we - * skip will be flushed the next time we attempt to make space - * when writes are permitted. This may have some local - * performance implications, but it shouldn't cause any net - * slowdown. - */ - - HDassert( H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS ); - - entry_ptr = cache_ptr->LRU_tail_ptr; - - while ( ( entry_ptr != NULL ) && - ( (entry_ptr->type)->id != H5C2__EPOCH_MARKER_TYPE ) && - ( bytes_evicted < eviction_size_limit ) ) - { - HDassert( ! (entry_ptr->is_protected) ); - - prev_ptr = entry_ptr->prev; - - if ( ! (entry_ptr->is_dirty) ) { - - result = H5C2_flush_single_entry(f, - dxpl_id, - cache_ptr, - entry_ptr->type, - entry_ptr->addr, - H5C2__FLUSH_INVALIDATE_FLAG, - TRUE); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ - "unable to flush clean entry") - } - } - /* just skip the entry if it is dirty, as we can't do - * anything with it now since we can't write. - * - * Since all entries are clean, serialize() will no be called, - * and thus we needn't test to see if the LRU has been changed - * out from under us. - */ - - entry_ptr = prev_ptr; - - } /* end while */ - } - - if ( cache_ptr->index_size < cache_ptr->max_cache_size ) { - - cache_ptr->cache_full = FALSE; - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2__autoadjust__ageout__evict_aged_out_entries() */ - - -/*------------------------------------------------------------------------- - * - * Function: H5C2__autoadjust__ageout__insert_new_marker - * - * Purpose: Find an unused marker cache entry, mark it as used, and - * insert it at the head of the LRU list. Also add the - * marker's index in the epoch_markers array. - * - * Return: SUCCEED on success/FAIL on failure. - * - * Programmer: John Mainzer, 11/19/04 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -static herr_t -H5C2__autoadjust__ageout__insert_new_marker(H5C2_t * cache_ptr) -{ - herr_t ret_value = SUCCEED; /* Return value */ - int i; - - FUNC_ENTER_NOAPI_NOINIT(H5C2__autoadjust__ageout__insert_new_marker) - - HDassert( cache_ptr ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - - if ( cache_ptr->epoch_markers_active >= - (cache_ptr->resize_ctl).epochs_before_eviction ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "Already have a full complement of markers.") - } - - /* find an unused marker */ - i = 0; - while ( ( (cache_ptr->epoch_marker_active)[i] ) && - ( i < H5C2__MAX_EPOCH_MARKERS ) ) - { - i++; - } - - HDassert( i < H5C2__MAX_EPOCH_MARKERS ); - - if ( (cache_ptr->epoch_marker_active)[i] != FALSE ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't find unused marker.") - } - - HDassert( ((cache_ptr->epoch_markers)[i]).addr == (haddr_t)i ); - HDassert( ((cache_ptr->epoch_markers)[i]).next == NULL ); - HDassert( ((cache_ptr->epoch_markers)[i]).prev == NULL ); - - (cache_ptr->epoch_marker_active)[i] = TRUE; - - cache_ptr->epoch_marker_ringbuf_last = - (cache_ptr->epoch_marker_ringbuf_last + 1) % - (H5C2__MAX_EPOCH_MARKERS + 1); - - (cache_ptr->epoch_marker_ringbuf)[cache_ptr->epoch_marker_ringbuf_last] = i; - - cache_ptr->epoch_marker_ringbuf_size += 1; - - if ( cache_ptr->epoch_marker_ringbuf_size > H5C2__MAX_EPOCH_MARKERS ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "ring buffer overflow.") - } - - H5C2__DLL_PREPEND((&((cache_ptr->epoch_markers)[i])), \ - (cache_ptr)->LRU_head_ptr, \ - (cache_ptr)->LRU_tail_ptr, \ - (cache_ptr)->LRU_list_len, \ - (cache_ptr)->LRU_list_size, \ - (FAIL)) - - cache_ptr->epoch_markers_active += 1; - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2__autoadjust__ageout__insert_new_marker() */ - - -/*------------------------------------------------------------------------- - * - * Function: H5C2__autoadjust__ageout__remove_all_markers - * - * Purpose: Remove all epoch markers from the LRU list and mark them - * as inactive. - * - * Return: SUCCEED on success/FAIL on failure. - * - * Programmer: John Mainzer, 11/22/04 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -static herr_t -H5C2__autoadjust__ageout__remove_all_markers(H5C2_t * cache_ptr) -{ - herr_t ret_value = SUCCEED; /* Return value */ - int i; - int ring_buf_index; - - FUNC_ENTER_NOAPI_NOINIT(H5C2__autoadjust__ageout__remove_all_markers) - - HDassert( cache_ptr ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - - while ( cache_ptr->epoch_markers_active > 0 ) - { - /* get the index of the last epoch marker in the LRU list - * and remove it from the ring buffer. - */ - - ring_buf_index = cache_ptr->epoch_marker_ringbuf_first; - i = (cache_ptr->epoch_marker_ringbuf)[ring_buf_index]; - - cache_ptr->epoch_marker_ringbuf_first = - (cache_ptr->epoch_marker_ringbuf_first + 1) % - (H5C2__MAX_EPOCH_MARKERS + 1); - - cache_ptr->epoch_marker_ringbuf_size -= 1; - - if ( cache_ptr->epoch_marker_ringbuf_size < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "ring buffer underflow.") - } - - if ( (cache_ptr->epoch_marker_active)[i] != TRUE ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unused marker in LRU?!?") - } - - /* remove the epoch marker from the LRU list */ - H5C2__DLL_REMOVE((&((cache_ptr->epoch_markers)[i])), \ - (cache_ptr)->LRU_head_ptr, \ - (cache_ptr)->LRU_tail_ptr, \ - (cache_ptr)->LRU_list_len, \ - (cache_ptr)->LRU_list_size, \ - (FAIL)) - - /* mark the epoch marker as unused. */ - (cache_ptr->epoch_marker_active)[i] = FALSE; - - HDassert( ((cache_ptr->epoch_markers)[i]).addr == (haddr_t)i ); - HDassert( ((cache_ptr->epoch_markers)[i]).next == NULL ); - HDassert( ((cache_ptr->epoch_markers)[i]).prev == NULL ); - - /* decrement the number of active epoch markers */ - cache_ptr->epoch_markers_active -= 1; - - HDassert( cache_ptr->epoch_markers_active == \ - cache_ptr->epoch_marker_ringbuf_size ); - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2__autoadjust__ageout__remove_all_markers() */ - - -/*------------------------------------------------------------------------- - * - * Function: H5C2__autoadjust__ageout__remove_excess_markers - * - * Purpose: Remove epoch markers from the end of the LRU list and - * mark them as inactive until the number of active markers - * equals the the current value of - * (cache_ptr->resize_ctl).epochs_before_eviction. - * - * Return: SUCCEED on success/FAIL on failure. - * - * Programmer: John Mainzer, 11/19/04 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -static herr_t -H5C2__autoadjust__ageout__remove_excess_markers(H5C2_t * cache_ptr) -{ - herr_t ret_value = SUCCEED; /* Return value */ - int i; - int ring_buf_index; - - FUNC_ENTER_NOAPI_NOINIT(H5C2__autoadjust__ageout__remove_excess_markers) - - HDassert( cache_ptr ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - - if ( cache_ptr->epoch_markers_active <= - (cache_ptr->resize_ctl).epochs_before_eviction ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "no excess markers on entry.") - } - - while ( cache_ptr->epoch_markers_active > - (cache_ptr->resize_ctl).epochs_before_eviction ) - { - /* get the index of the last epoch marker in the LRU list - * and remove it from the ring buffer. - */ - - ring_buf_index = cache_ptr->epoch_marker_ringbuf_first; - i = (cache_ptr->epoch_marker_ringbuf)[ring_buf_index]; - - cache_ptr->epoch_marker_ringbuf_first = - (cache_ptr->epoch_marker_ringbuf_first + 1) % - (H5C2__MAX_EPOCH_MARKERS + 1); - - cache_ptr->epoch_marker_ringbuf_size -= 1; - - if ( cache_ptr->epoch_marker_ringbuf_size < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "ring buffer underflow.") - } - - if ( (cache_ptr->epoch_marker_active)[i] != TRUE ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "unused marker in LRU?!?") - } - - /* remove the epoch marker from the LRU list */ - H5C2__DLL_REMOVE((&((cache_ptr->epoch_markers)[i])), \ - (cache_ptr)->LRU_head_ptr, \ - (cache_ptr)->LRU_tail_ptr, \ - (cache_ptr)->LRU_list_len, \ - (cache_ptr)->LRU_list_size, \ - (FAIL)) - - /* mark the epoch marker as unused. */ - (cache_ptr->epoch_marker_active)[i] = FALSE; - - HDassert( ((cache_ptr->epoch_markers)[i]).addr == (haddr_t)i ); - HDassert( ((cache_ptr->epoch_markers)[i]).next == NULL ); - HDassert( ((cache_ptr->epoch_markers)[i]).prev == NULL ); - - /* decrement the number of active epoch markers */ - cache_ptr->epoch_markers_active -= 1; - - HDassert( cache_ptr->epoch_markers_active == \ - cache_ptr->epoch_marker_ringbuf_size ); - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2__autoadjust__ageout__remove_excess_markers() */ - - -/*------------------------------------------------------------------------- - * - * Function: H5C2__flash_increase_cache_size - * - * Purpose: If there is not at least new_entry_size - old_entry_size - * bytes of free space in the cache and the current - * max_cache_size is less than (cache_ptr->resize_ctl).max_size, - * perform a flash increase in the cache size and then reset - * the full cache hit rate statistics, and exit. - * - * Return: Non-negative on success/Negative on failure. - * - * Programmer: John Mainzer, 12/31/07 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -static herr_t -H5C2__flash_increase_cache_size(H5C2_t * cache_ptr, - size_t old_entry_size, - size_t new_entry_size) -{ - size_t new_max_cache_size = 0; - size_t old_max_cache_size = 0; - size_t new_min_clean_size = 0; - size_t old_min_clean_size = 0; - size_t space_needed; - enum H5C2_resize_status status = flash_increase2; /* may change */ - double hit_rate; - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI_NOINIT(H5C2__flash_increase_cache_size) - HDassert( cache_ptr ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - HDassert( cache_ptr->flash_size_increase_possible ); - HDassert( new_entry_size > cache_ptr->flash_size_increase_threshold ); - HDassert( old_entry_size < new_entry_size ); - - if ( old_entry_size >= new_entry_size ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "old_entry_size >= new_entry_size") - } - - space_needed = new_entry_size - old_entry_size; - - if ( ( (cache_ptr->index_size + space_needed) > - cache_ptr->max_cache_size ) && - ( cache_ptr->max_cache_size < (cache_ptr->resize_ctl).max_size ) ) { - - /* we have work to do */ - - switch ( (cache_ptr->resize_ctl).flash_incr_mode ) - { - case H5C2_flash_incr__off: - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "flash_size_increase_possible but H5C2_flash_incr__off?!") - break; - - case H5C2_flash_incr__add_space: - if ( cache_ptr->index_size < cache_ptr->max_cache_size ) { - - HDassert( (cache_ptr->max_cache_size - - cache_ptr->index_size) - < space_needed ); - space_needed -= cache_ptr->max_cache_size - - cache_ptr->index_size; - } - space_needed = - (size_t)(((double)space_needed) * - (cache_ptr->resize_ctl).flash_multiple); - - new_max_cache_size = cache_ptr->max_cache_size + space_needed; - - break; - - default: /* should be unreachable */ - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "Unknown flash_incr_mode?!?!?.") - break; - } - - if ( new_max_cache_size > (cache_ptr->resize_ctl).max_size ) { - - new_max_cache_size = (cache_ptr->resize_ctl).max_size; - } - - HDassert( new_max_cache_size > cache_ptr->max_cache_size ); - - new_min_clean_size = (size_t) - ((double)new_max_cache_size * - ((cache_ptr->resize_ctl).min_clean_fraction)); - - HDassert( new_min_clean_size <= new_max_cache_size ); - - old_max_cache_size = cache_ptr->max_cache_size; - old_min_clean_size = cache_ptr->min_clean_size; - - cache_ptr->max_cache_size = new_max_cache_size; - cache_ptr->min_clean_size = new_min_clean_size; - - /* update flash cache size increase fields as appropriate */ - HDassert ( cache_ptr->flash_size_increase_possible ); - - switch ( (cache_ptr->resize_ctl).flash_incr_mode ) - { - case H5C2_flash_incr__off: - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "flash_size_increase_possible but H5C2_flash_incr__off?!") - break; - - case H5C2_flash_incr__add_space: - cache_ptr->flash_size_increase_threshold = - (size_t) - (((double)(cache_ptr->max_cache_size)) * - ((cache_ptr->resize_ctl).flash_threshold)); - break; - - default: /* should be unreachable */ - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "Unknown flash_incr_mode?!?!?.") - break; - } - - /* note that we don't cycle the epoch markers. We can - * argue either way as to whether we should, but for now - * we don't. - */ - - if ( (cache_ptr->resize_ctl).rpt_fcn != NULL ) { - - /* get the hit rate for the reporting function. Should still - * be good as we havent reset the hit rate statistics. - */ - if ( H5C2_get_cache_hit_rate(cache_ptr, &hit_rate) != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Can't get hit rate.") - } - - (*((cache_ptr->resize_ctl).rpt_fcn)) - (cache_ptr, - H5C2__CURR_AUTO_RESIZE_RPT_FCN_VER, - hit_rate, - status, - old_max_cache_size, - new_max_cache_size, - old_min_clean_size, - new_min_clean_size); - } - - if ( H5C2_reset_cache_hit_rate_stats(cache_ptr) != SUCCEED ) { - - /* this should be impossible... */ - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "H5C2_reset_cache_hit_rate_stats failed.") - } - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2__flash_increase_cache_size() */ - - - -/*------------------------------------------------------------------------- - * Function: H5C2_flush_invalidate_cache - * - * Purpose: Flush and destroy the entries contained in the target - * cache. - * - * If the cache contains protected entries, the function will - * fail, as protected entries cannot be either flushed or - * destroyed. However all unprotected entries should be - * flushed and destroyed before the function returns failure. - * - * While pinned entries can usually be flushed, they cannot - * be destroyed. However, they should be unpinned when all - * the entries that reference them have been destroyed (thus - * reduding the pinned entry's reference count to 0, allowing - * it to be unpinned). - * - * If pinned entries are present, the function makes repeated - * passes through the cache, flushing all dirty entries - * (including the pinned dirty entries where permitted) and - * destroying all unpinned entries. This process is repeated - * until either the cache is empty, or the number of pinned - * entries stops decreasing on each pass. - * - * The primary_dxpl_id and secondary_dxpl_id parameters - * specify the dxpl_ids used on the first write occasioned - * by the flush (primary_dxpl_id), and on all subsequent - * writes (secondary_dxpl_id). - * - * Return: Non-negative on success/Negative on failure or if there was - * a request to flush all items and something was protected. - * - * Programmer: John Mainzer - * 3/24/065 - * - * Modifications: - * - * To support the fractal heap, the cache must now deal with - * entries being dirtied, resized, and/or renamed inside - * flush callbacks. Updated function to support this. - * - * Reworked argument list and code to reflect the - * removal of the secondary dxpl id, and the decision - * to store f in H5C2_t, removing the need to pass it - * in all the time. - * -- JRM 8/27/06 - * - * Added code to detect and manage the case in which a - * flush callback changes the s-list out from under - * the function. The only way I can think of in which this - * can happen is if a flush function loads an entry - * into the cache that isn't there already. Quincey tells - * me that this will never happen, but I'm not sure I - * believe him. - * - * Note that this is a pretty bad scenario if it ever - * happens. The code I have added should allow us to - * handle the situation under all but the worst conditions, - * but one can argue that I should just scream and die if I - * ever detect the condidtion. - * - * -- JRM 10/13/07 - * - *------------------------------------------------------------------------- - */ -static herr_t -H5C2_flush_invalidate_cache(const H5F_t * f, - hid_t dxpl_id, - H5C2_t * cache_ptr, - unsigned flags) -{ - herr_t status; - hbool_t done = FALSE; - int32_t protected_entries = 0; - int32_t i; - int32_t cur_pel_len; - int32_t old_pel_len; - int32_t passes = 0; - unsigned cooked_flags; - H5SL_node_t * node_ptr = NULL; - H5C2_cache_entry_t * entry_ptr = NULL; - H5C2_cache_entry_t * next_entry_ptr = NULL; -#if H5C2_DO_SANITY_CHECKS - int64_t actual_slist_len = 0; - int64_t initial_slist_len = 0; - size_t actual_slist_size = 0; - size_t initial_slist_size = 0; -#endif /* H5C2_DO_SANITY_CHECKS */ - herr_t ret_value = SUCCEED; - - FUNC_ENTER_NOAPI(H5C2_flush_invalidate_cache, FAIL) - - HDassert( f ); - HDassert( cache_ptr ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - HDassert( cache_ptr->skip_file_checks || f ); - HDassert( cache_ptr->slist_ptr ); - - /* Filter out the flags that are not relevant to the flush/invalidate. - * At present, only the H5C2__FLUSH_CLEAR_ONLY_FLAG is kept. - */ - cooked_flags = flags & H5C2__FLUSH_CLEAR_ONLY_FLAG; - - /* remove ageout markers if present */ - if ( cache_ptr->epoch_markers_active > 0 ) { - - status = H5C2__autoadjust__ageout__remove_all_markers(cache_ptr); - - if ( status != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "error removing all epoch markers.") - } - } - - /* The flush proceedure here is a bit strange. - * - * In the outer while loop we make at least one pass through the - * cache, and then repeat until either all the pinned entries - * unpin themselves, or until the number of pinned entries stops - * declining. In this later case, we scream and die. - * - * Since the fractal heap can dirty, resize, and/or rename entries - * in is flush callback, it is possible that the cache will still - * contain dirty entries at this point. If so, we must make up to - * H5C2__MAX_PASSES_ON_FLUSH more passes through the skip list - * to allow it to empty. If is is not empty at this point, we again - * scream and die. - * - * Further, since clean entries can be dirtied, resized, and/or renamed - * as the result of a flush call back (either the entries own, or that - * for some other cache entry), we can no longer promise to flush - * the cache entries in increasing address order. - * - * Instead, we just do the best we can -- making a pass through - * the skip list, and then a pass through the "clean" entries, and - * then repeating as needed. Thus it is quite possible that an - * entry will be evicted from the cache only to be re-loaded later - * in the flush process (From what Quincey tells me, the pin - * mechanism makes this impossible, but even it it is true now, - * we shouldn't count on it in the future.) - * - * The bottom line is that entries will probably be flushed in close - * to increasing address order, but there are no guarantees. - */ - - cur_pel_len = cache_ptr->pel_len; - old_pel_len = cache_ptr->pel_len; - - while ( ! done ) - { - /* first, try to flush-destroy any dirty entries. Do this by - * making a scan through the slist. Note that new dirty entries - * may be created by the flush call backs. Thus it is possible - * that the slist will not be empty after we finish the scan. - */ - - if ( cache_ptr->slist_len == 0 ) { - - node_ptr = NULL; - next_entry_ptr = NULL; - HDassert( cache_ptr->slist_size == 0 ); - - } else { - - node_ptr = H5SL_first(cache_ptr->slist_ptr); - - if ( node_ptr == NULL ) { - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "slist_len != 0 && node_ptr == NULL"); - } - - next_entry_ptr = (H5C2_cache_entry_t *)H5SL_item(node_ptr); - - if ( next_entry_ptr == NULL ) { - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "next_entry_ptr == NULL 1 ?!?!"); - } -#ifndef NDEBUG - HDassert( next_entry_ptr->magic == - H5C2__H5C2_CACHE_ENTRY_T_MAGIC ); -#endif /* NDEBUG */ - HDassert( next_entry_ptr->is_dirty ); - HDassert( next_entry_ptr->in_slist ); - - } - -#if H5C2_DO_SANITY_CHECKS - /* Depending on circumstances, H5C2_flush_single_entry() will - * remove dirty entries from the slist as it flushes them. - * Thus for sanity checks we must make note of the initial - * slist length and size before we do any flushes. - */ - initial_slist_len = cache_ptr->slist_len; - initial_slist_size = cache_ptr->slist_size; - - /* There is also the possibility that entries will be - * dirtied, resized, and/or renamed as the result of - * calls to the flush callbacks. We use the slist_len_increase - * and slist_size_increase increase fields in struct H5C2_t - * to track these changes for purpose of sanity checking. - * To this end, we must zero these fields before we start - * the pass through the slist. - */ - cache_ptr->slist_len_increase = 0; - cache_ptr->slist_size_increase = 0; - - /* Finally, reset the actual_slist_len and actual_slist_size - * fields to zero, as these fields are used to accumulate - * the slist lenght and size that we see as we scan through - * the slist. - */ - actual_slist_len = 0; - actual_slist_size = 0; -#endif /* H5C2_DO_SANITY_CHECKS */ - - while ( node_ptr != NULL ) - { - entry_ptr = next_entry_ptr; - - /* With the advent of the fractal heap, it is possible - * that the serialize callback will dirty and/or resize - * other entries in the cache. In particular, while - * Quincey has promised me that this will never happen, - * it is possible that the serialize callback for an - * entry may protect an entry that is not in the cache, - * perhaps causing the cache to flush and possibly - * evict the entry associated with node_ptr to make - * space for the new entry. - * - * Thus we do a bit of extra sanity checking on entry_ptr, - * and break out of this scan of the skip list if we - * detect major problems. We have a bit of leaway on the - * number of passes though the skip list, so this shouldn't - * be an issue in the flush in and of itself, as it should - * be all but impossible for this to happen more than once - * in any flush. - * - * Observe that that breaking out of the scan early - * shouldn't break the sanity checks just after the end - * of this while loop. - * - * If an entry has merely been marked clean and removed from - * the s-list, we simply break out of the scan. - * - * If the entry has been evicted, we flag an error and - * exit. - */ -#ifndef NDEBUG - if ( entry_ptr->magic != H5C2__H5C2_CACHE_ENTRY_T_MAGIC ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "entry_ptr->magic is invalid ?!?!"); - - } else -#endif /* NDEBUG */ - if ( ( ! entry_ptr->is_dirty ) || - ( ! entry_ptr->in_slist ) ) { - - /* the s-list has been modified out from under us. - * break out of the loop. - */ - break; - } - - /* increment node pointer now, before we delete its target - * from the slist. - */ - node_ptr = H5SL_next(node_ptr); - - if ( node_ptr != NULL ) { - - next_entry_ptr = (H5C2_cache_entry_t *)H5SL_item(node_ptr); - - if ( next_entry_ptr == NULL ) { - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "next_entry_ptr == NULL 2 ?!?!"); - } -#ifndef NDEBUG - HDassert( next_entry_ptr->magic == - H5C2__H5C2_CACHE_ENTRY_T_MAGIC ); -#endif /* NDEBUG */ - HDassert( next_entry_ptr->is_dirty ); - HDassert( next_entry_ptr->in_slist ); - - } else { - - next_entry_ptr = NULL; - } - - /* Note that we now remove nodes from the slist as we flush - * the associated entries, instead of leaving them there - * until we are done, and then destroying all nodes in - * the slist. - * - * While this optimization used to be easy, with the possibility - * of new entries being added to the slist in the midst of the - * flush, we must keep the slist in cannonical form at all - * times. - */ - - HDassert( entry_ptr != NULL ); - HDassert( entry_ptr->in_slist ); - -#if H5C2_DO_SANITY_CHECKS - /* update actual_slist_len & actual_slist_size before - * the flush. Note that the entry will be removed - * from the slist after the flush, and thus may be - * resized by the flush callback. This is OK, as - * we will catch the size delta in - * cache_ptr->slist_size_increase. - * - * Note that we include pinned entries in this count, even - * though we will not actually flush them. - */ - actual_slist_len++; - actual_slist_size += entry_ptr->size; -#endif /* H5C2_DO_SANITY_CHECKS */ - - if ( entry_ptr->is_protected ) { - - /* we have major problems -- but lets flush - * everything we can before we flag an error. - */ - protected_entries++; - - } else if ( entry_ptr->is_pinned ) { - - /* Test to see if we are can flush the entry now. - * If we can, go ahead and flush, but don't tell - * H5C2_flush_single_entry() to destroy the entry - * as pinned entries can't be evicted. - */ - if ( TRUE ) { /* When we get to multithreaded cache, - * we will need either locking code, and/or - * a test to see if the entry is in flushable - * condition here. - */ - - status = H5C2_flush_single_entry(f, - dxpl_id, - cache_ptr, - entry_ptr->type, - entry_ptr->addr, - H5C2__NO_FLAGS_SET, - FALSE); - if ( status < 0 ) { - - /* This shouldn't happen -- if it does, we are toast - * so just scream and die. - */ - - HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ - "dirty pinned entry flush failed.") - } - } - } else { - - status = H5C2_flush_single_entry(f, - dxpl_id, - cache_ptr, - entry_ptr->type, - entry_ptr->addr, - (cooked_flags | - H5C2__FLUSH_INVALIDATE_FLAG), - TRUE); - if ( status < 0 ) { - - /* This shouldn't happen -- if it does, we are toast so - * just scream and die. - */ - - HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ - "dirty entry flush destroy failed.") - } - } - - } /* end while loop scanning skip list */ - -#if H5C2_DO_SANITY_CHECKS - /* It is possible that entries were added to the slist during - * the scan, either before or after scan pointer. The following - * asserts take this into account. - * - * Don't bother with the sanity checks if node_ptr != NULL, as - * in this case we broke out of the loop because it got changed - * out from under us. - */ - - if ( node_ptr == NULL ) { - - HDassert( (actual_slist_len + cache_ptr->slist_len) == - (initial_slist_len + cache_ptr->slist_len_increase) ); - HDassert( (actual_slist_size + cache_ptr->slist_size) == - (initial_slist_size + cache_ptr->slist_size_increase) ); - } -#endif /* H5C2_DO_SANITY_CHECKS */ - - /* Since we are doing a destroy, we must make a pass through - * the hash table and try to flush - destroy all entries that - * remain. - * - * It used to be that all entries remaining in the cache at - * this point had to be clean, but with the fractal heap mods - * this may not be the case. If so, we will flush entries out - * of increasing address order. - * - * Writes to disk are possible here. - */ - for ( i = 0; i < H5C2__HASH_TABLE_LEN; i++ ) - { - next_entry_ptr = cache_ptr->index[i]; - - while ( next_entry_ptr != NULL ) - { - entry_ptr = next_entry_ptr; -#ifndef NDEBUG - HDassert( entry_ptr->magic == H5C2__H5C2_CACHE_ENTRY_T_MAGIC ); -#endif /* NDEBUG */ - next_entry_ptr = entry_ptr->ht_next; -#ifndef NDEBUG - HDassert ( ( next_entry_ptr == NULL ) || - ( next_entry_ptr->magic == - H5C2__H5C2_CACHE_ENTRY_T_MAGIC ) ); -#endif /* NDEBUG */ - if ( entry_ptr->is_protected ) { - - /* we have major problems -- but lets flush and destroy - * everything we can before we flag an error. - */ - protected_entries++; - - if ( ! entry_ptr->in_slist ) { - - HDassert( !(entry_ptr->is_dirty) ); - } - } else if ( ! ( entry_ptr->is_pinned ) ) { - - status = - H5C2_flush_single_entry(f, - dxpl_id, - cache_ptr, - entry_ptr->type, - entry_ptr->addr, - (cooked_flags | - H5C2__FLUSH_INVALIDATE_FLAG), - TRUE); - if ( status < 0 ) { - - /* This shouldn't happen -- if it does, we are toast so - * just scream and die. - */ - - HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ - "Entry flush destroy failed.") - } - } - /* We can't do anything if the entry is pinned. The - * hope is that the entry will be unpinned as the - * result of destroys of entries that reference it. - * - * We detect this by noting the change in the number - * of pinned entries from pass to pass. If it stops - * shrinking before it hits zero, we scream and die. - */ - - /* if the serialize function on the entry we last evicted - * loaded an entry into cache (as Quincey has promised me - * it never will), and if the cache was full, it is - * possible that *nexte_entry_ptr was flushed or evicted. - * - * Test to see if this happened here, and set next_entry_ptr - * to NULL if it did. Note that if this test is triggred, - * we are accessing a deallocated piece of dynamically - * allocated memory, so we just scream and die. - */ -#ifndef NDEBUG - if ( ( next_entry_ptr != NULL ) && - ( next_entry_ptr->magic != - H5C2__H5C2_CACHE_ENTRY_T_MAGIC ) ) { - - /* Something horrible has happened to - * *next_entry_ptr -- scream and die. - */ - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "next_entry_ptr->magic is invalid?!?!?.") - } -#endif /* NDEBUG */ - } /* end while loop scanning hash table bin */ - } /* end for loop scanning hash table */ - - old_pel_len = cur_pel_len; - cur_pel_len = cache_ptr->pel_len; - - if ( ( cur_pel_len > 0 ) && ( cur_pel_len >= old_pel_len ) ) { - - /* The number of pinned entries is positive, and it is not - * declining. Scream and die. - */ - - HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ - "Can't unpin all pinned entries 1.") - - } else if ( ( cur_pel_len == 0 ) && ( old_pel_len == 0 ) ) { - - /* increment the pass count */ - passes++; - } - - if ( passes >= H5C2__MAX_PASSES_ON_FLUSH ) { - - /* we have exceeded the maximum number of passes through the - * cache to flush and destroy all entries. Scream and die. - */ - - HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ - "Maximum passes on flush exceeded.") - } - - if ( cache_ptr->index_len <= 0 ) { - - done = TRUE; - HDassert( cache_ptr->index_size == 0 ); - HDassert( cache_ptr->slist_len == 0 ); - HDassert( cache_ptr->slist_size == 0 ); - HDassert( cache_ptr->pel_len == 0 ); - HDassert( cache_ptr->pel_size == 0 ); - HDassert( cache_ptr->pl_len == 0 ); - HDassert( cache_ptr->pl_size == 0 ); - HDassert( cache_ptr->LRU_list_len == 0 ); - HDassert( cache_ptr->LRU_list_size == 0 ); - } - - } /* main while loop */ - - HDassert( protected_entries <= cache_ptr->pl_len ); - - if ( protected_entries > 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ - "Cache has protected entries.") - - } else if ( cur_pel_len > 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ - "Can't unpin all pinned entries 2.") - - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_flush_invalidate_cache() */ - - -/*------------------------------------------------------------------------- - * - * Function: H5C2_flush_single_entry - * - * Purpose: Flush or clear (and evict if requested) the cache entry - * with the specified address and type. If the type is NULL, - * any unprotected entry at the specified address will be - * flushed (and possibly evicted). - * - * Attempts to flush a protected entry will result in an - * error. - * - * *first_flush_ptr should be true if only one - * flush is contemplated before the next load, or if this - * is the first of a sequence of flushes that will be - * completed before the next load. *first_flush_ptr is set - * to false if a flush actually takes place, and should be - * left false until the end of the sequence. - * - * The primary_dxpl_id is used if *first_flush_ptr is TRUE - * on entry, and a flush actually takes place. The - * secondary_dxpl_id is used in any subsequent flush where - * *first_flush_ptr is FALSE on entry. - * - * If the H5C2__FLUSH_INVALIDATE_FLAG flag is set, the entry will - * be cleared and not flushed -- in the case *first_flush_ptr, - * primary_dxpl_id, and secondary_dxpl_id are all irrelevent, - * and the call can't be part of a sequence of flushes. - * - * If the caller knows the address of the TBBT node at - * which the target entry resides, it can avoid a lookup - * by supplying that address in the tgt_node_ptr parameter. - * If this parameter is NULL, the function will do a TBBT - * search for the entry instead. - * - * The function does nothing silently if there is no entry - * at the supplied address, or if the entry found has the - * wrong type. - * - * Return: Non-negative on success/Negative on failure or if there was - * an attempt to flush a protected item. - * - * Programmer: John Mainzer, 5/5/04 - * - * Modifications: - * - * JRM -- 7/21/04 - * Updated function for the addition of the hash table. - * - * QAK -- 11/26/04 - * Updated function for the switch from TBBTs to skip lists. - * - * JRM -- 1/6/05 - * Updated function to reset the flush_marker field. - * Also replace references to H5F_FLUSH_INVALIDATE and - * H5F_FLUSH_CLEAR_ONLY with references to - * H5C2__FLUSH_INVALIDATE_FLAG and H5C2__FLUSH_CLEAR_ONLY_FLAG - * respectively. - * - * JRM -- 6/24/05 - * Added code to remove dirty entries from the slist after - * they have been flushed. Also added a sanity check that - * will scream if we attempt a write when writes are - * completely disabled. - * - * JRM -- 7/5/05 - * Added code to call the new log_flush callback whenever - * a dirty entry is written to disk. Note that the callback - * is not called if the H5C2__FLUSH_CLEAR_ONLY_FLAG is set, - * as there is no write to file in this case. - * - * JRM -- 8/21/06 - * Added code maintaining the flush_in_progress and - * destroy_in_progress fields in H5C2_cache_entry_t. - * - * Also added flush_flags parameter to the call to - * type_ptr->flush() so that the flush routine can report - * whether the entry has been resized or renamed. Added - * code using the flush_flags variable to detect the case - * in which the target entry is resized during flush, and - * update the caches data structures accordingly. - * - * - * JRM -- 3/29/07 - * Added sanity checks on the new is_read_only and - * ro_ref_count fields. - * - * JRM -- 6/25/07 - * Rewrite of function to use the new metadata cache callback - * functions. These functions move all metadata file I/O into - * the cache proper, which is necessary for metadata journaling. - * - * To date, the functions of the H5C2__FLUSH_INVALIDATE_FLAG - * and H5C2__FLUSH_CLEAR_ONLY_FLAG have not been documented - * in H5C2, as these flags were just passed through to the - * client callbacks. As much of the callback functionality - * is now in the cache, the function of these flags should - * be documented explicitly here in H5C2. - * - * If the H5C2__FLUSH_INVALIDATE_FLAG is set, the entry is to - * be written to disk if dirty, and then evicted from the - * cache and discarded. As an optimization, the destroyed - * is deleted from the slist only on request. - * - * If the H5C2__FLUSH_CLEAR_ONLY_FLAG is set, the entry is - * to be marked clean if it is dirty. Under no circumstances - * will it be written to disk. - * - * If both the H5C2__FLUSH_INVALIDATE_FLAG and the - * H5C2__FLUSH_CLEAR_ONLY_FLAG are set, the entry is marked - * clean and then evicted from the cache without writing - * to disk. If dirty, the entry is removed from the slist - * or not as requested. - * - * JRM -- 3/31/08 - * If journaling is enabled, modified function to remove - * the target entry from the transaction list on a clear. - * Also added some sanity checks. - * - *------------------------------------------------------------------------- - */ - -static herr_t -H5C2_flush_single_entry(const H5F_t * f, - hid_t dxpl_id, - H5C2_t * cache_ptr, - const H5C2_class_t * type_ptr, - haddr_t addr, - unsigned flags, - hbool_t del_entry_from_slist_on_destroy) -{ - hbool_t destroy; - hbool_t clear_only; - hbool_t was_dirty; - herr_t ret_value = SUCCEED; /* Return value */ - herr_t status; - int type_id; - unsigned serialize_flags = 0; - haddr_t new_addr; - size_t new_len; - void * new_image_ptr; - H5C2_cache_entry_t * entry_ptr = NULL; - - FUNC_ENTER_NOAPI_NOINIT(H5C2_flush_single_entry) - - HDassert( f ); - HDassert( cache_ptr ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - HDassert( type_ptr ); - HDassert( H5F_addr_defined(addr) ); - - destroy = ( (flags & H5C2__FLUSH_INVALIDATE_FLAG) != 0 ); - clear_only = ( (flags & H5C2__FLUSH_CLEAR_ONLY_FLAG) != 0); - - - /* attempt to find the target entry in the hash table */ - H5C2__SEARCH_INDEX(cache_ptr, addr, entry_ptr, FAIL) - - -#if H5C2_DO_SANITY_CHECKS - if ( entry_ptr != NULL ) { - - HDassert( ! ( ( destroy ) && ( entry_ptr->is_pinned ) ) ); - - if ( entry_ptr->in_slist ) { - - if ( ( ( entry_ptr->flush_marker ) && ( ! entry_ptr->is_dirty ) ) - || - ( entry_ptr->addr != addr ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "entry in slist failed sanity checks.") - } - } else { - - if ( ( entry_ptr->is_dirty ) || - ( entry_ptr->flush_marker ) || - ( entry_ptr->addr != addr ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "entry failed sanity checks.") - } - } - } -#if 0 - /* this should be useful for debugging from time to time. - * lets leave it in for now. -- JRM 12/15/04 - */ - else { - HDfprintf(stdout, - "H5C2_flush_single_entry(): non-existant entry. addr = 0x%lx\n", - (long)addr); - HDfflush(stdout); - } -#endif -#endif /* H5C2_DO_SANITY_CHECKS */ - - - if ( ( entry_ptr != NULL ) && ( entry_ptr->is_protected ) ) - { - - /* Attempt to flush a protected entry -- scream and die. */ - HGOTO_ERROR(H5E_CACHE, H5E_PROTECT, FAIL, \ - "Attempt to flush a protected entry.") - } - - - if ( ( entry_ptr != NULL ) && - ( ( type_ptr == NULL ) || ( type_ptr->id == entry_ptr->type->id ) ) ) - { - /* we have work to do */ - - /* We will set flush_in_progress back to FALSE at the end if the - * entry still exists at that point. - */ - entry_ptr->flush_in_progress = TRUE; - -#ifdef H5_HAVE_PARALLEL -#ifndef NDEBUG - - /* If MPI based VFD is used, do special parallel I/O sanity checks. - * Note that we only do these sanity checks when the clear_only flag - * is not set, and the entry to be flushed is dirty. Don't bother - * otherwise as no file I/O can result. - */ - if ( ( ! clear_only ) && - ( entry_ptr->is_dirty ) && - ( IS_H5FD_MPI(f) ) ) { - - H5P_genplist_t *dxpl; /* Dataset transfer property list */ - H5FD_mpio_xfer_t xfer_mode; /* I/O xfer mode property value */ - - /* Get the dataset transfer property list */ - if ( NULL == (dxpl = H5I_object(dxpl_id)) ) { - - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, \ - "not a dataset creation property list") - } - - /* Get the transfer mode property */ - if( H5P_get(dxpl, H5D_XFER_IO_XFER_MODE_NAME, &xfer_mode) < 0 ) { - - HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, \ - "can't retrieve xfer mode") - } - - /* Sanity check transfer mode */ - /* I'm surprised that this sanity check is working at - * present -- will need to look into it at some point. - * - * JRM -- 7/7/07 - */ - - HDassert( xfer_mode == H5FD_MPIO_COLLECTIVE ); - } - -#endif /* NDEBUG */ -#endif /* H5_HAVE_PARALLEL */ - - was_dirty = entry_ptr->is_dirty; - type_id = entry_ptr->type->id; - - entry_ptr->flush_marker = FALSE; - - if ( clear_only ) { - H5C2__UPDATE_STATS_FOR_CLEAR(cache_ptr, entry_ptr) - } else { - H5C2__UPDATE_STATS_FOR_FLUSH(cache_ptr, entry_ptr) - } - - if ( destroy ) { - H5C2__UPDATE_STATS_FOR_EVICTION(cache_ptr, entry_ptr) - } - - /* Always remove the entry from the hash table on a destroy. On a - * flush with destroy, it is cheaper to discard the skip list all at - * once rather than remove the entries one by one, so we only delete - * from the slist only if requested. - * - * Note that it is possible that the entry will be renamed during - * its call to flush. This will upset H5C2_rename_entry() if we - * don't tell it that it doesn't have to worry about updating the - * index and SLIST. Use the destroy_in_progress field for this - * purpose. - */ - if ( destroy ) { - - entry_ptr->destroy_in_progress = TRUE; - - H5C2__DELETE_FROM_INDEX(cache_ptr, entry_ptr) - - if ( ( entry_ptr->in_slist ) && - ( del_entry_from_slist_on_destroy ) ) { - - H5C2__REMOVE_ENTRY_FROM_SLIST(cache_ptr, entry_ptr) - } - } - - - /* Update the replacement policy for the flush or eviction. */ - if ( destroy ) { /* AKA eviction */ - -#if 0 /* JRM */ - /* This test code may come in handy -- lets keep it for a while. - * - * Note that it will cause spurious errors in the serial case - * unless we are maintaining the clean and dirty LRU lists. - */ - { - if ( entry_ptr->is_dirty ) - { - if ( cache_ptr->dLRU_head_ptr == NULL ) - HDfprintf(stdout, - "%s: cache_ptr->dLRU_head_ptr == NULL.\n", - FUNC); - - if ( cache_ptr->dLRU_tail_ptr == NULL ) - HDfprintf(stdout, - "%s: cache_ptr->dLRU_tail_ptr == NULL.\n", - FUNC); - - if ( cache_ptr->dLRU_list_len <= 0 ) - HDfprintf(stdout, - "%s: cache_ptr->dLRU_list_len <= 0.\n", - FUNC); - - if ( cache_ptr->dLRU_list_size <= 0 ) - HDfprintf(stdout, - "%s: cache_ptr->dLRU_list_size <= 0.\n", - FUNC); - - if ( cache_ptr->dLRU_list_size < entry_ptr->size ) - HDfprintf(stdout, - "%s: cache_ptr->dLRU_list_size < entry_ptr->size.\n", - FUNC); - - if ( ( (cache_ptr->dLRU_list_size) == entry_ptr->size ) && - ( ! ( (cache_ptr->dLRU_list_len) == 1 ) ) ) - HDfprintf(stdout, - "%s: dLRU_list_size == size && dLRU_list_len != 1\n", - FUNC); - - if ( ( entry_ptr->aux_prev == NULL ) && - ( cache_ptr->dLRU_head_ptr != entry_ptr ) ) - HDfprintf(stdout, - "%s: entry_ptr->aux_prev == NULL && dLRU_head_ptr != entry_ptr\n", - FUNC); - - if ( ( entry_ptr->aux_next == NULL ) && - ( cache_ptr->dLRU_tail_ptr != entry_ptr ) ) - HDfprintf(stdout, - "%s: entry_ptr->aux_next == NULL && dLRU_tail_ptr != entry_ptr\n", - FUNC); - - if ( ( cache_ptr->dLRU_list_len == 1 ) && - ( ! ( ( cache_ptr->dLRU_head_ptr == entry_ptr ) && - ( cache_ptr->dLRU_tail_ptr == entry_ptr ) && - ( entry_ptr->aux_next == NULL ) && - ( entry_ptr->aux_prev == NULL ) && - ( cache_ptr->dLRU_list_size == entry_ptr->size ) - ) - ) - ) - { - HDfprintf(stdout, - "%s: single entry dlru sanity check fails\n", - FUNC); - } - - } - else - { - if ( cache_ptr->cLRU_head_ptr == NULL ) - HDfprintf(stdout, - "%s: cache_ptr->cLRU_head_ptr == NULL.\n", - FUNC); - - if ( cache_ptr->cLRU_tail_ptr == NULL ) - HDfprintf(stdout, - "%s: cache_ptr->cLRU_tail_ptr == NULL.\n", - FUNC); - - if ( cache_ptr->cLRU_list_len <= 0 ) - HDfprintf(stdout, - "%s: cache_ptr->cLRU_list_len <= 0.\n", - FUNC); - - if ( cache_ptr->cLRU_list_size <= 0 ) - HDfprintf(stdout, - "%s: cache_ptr->cLRU_list_size <= 0.\n", - FUNC); - - if ( cache_ptr->cLRU_list_size < entry_ptr->size ) - HDfprintf(stdout, - "%s: cache_ptr->cLRU_list_size < entry_ptr->size.\n", - FUNC); - - if ( ( (cache_ptr->cLRU_list_size) == entry_ptr->size ) && - ( ! ( (cache_ptr->cLRU_list_len) == 1 ) ) ) - HDfprintf(stdout, - "%s: cLRU_list_size == size && cLRU_list_len != 1\n", - FUNC); - - if ( ( entry_ptr->aux_prev == NULL ) && - ( cache_ptr->cLRU_head_ptr != entry_ptr ) ) - HDfprintf(stdout, "%s: entry_ptr->aux_prev == NULL && cLRU_head_ptr != entry_ptr\n", FUNC); - - if ( ( entry_ptr->aux_next == NULL ) && - ( cache_ptr->cLRU_tail_ptr != entry_ptr ) ) - HDfprintf(stdout, "%s: entry_ptr->aux_next == NULL && cLRU_tail_ptr != entry_ptr\n", FUNC); - - if ( ( cache_ptr->cLRU_list_len == 1 ) && - ( ! ( ( cache_ptr->cLRU_head_ptr == entry_ptr ) && - ( cache_ptr->cLRU_tail_ptr == entry_ptr ) && - ( entry_ptr->aux_next == NULL ) && - ( entry_ptr->aux_prev == NULL ) && - ( cache_ptr->cLRU_list_size == entry_ptr->size ) - ) - ) - ) - { - HDfprintf(stdout, - "%s: single entry clru sanity check fails\n", - FUNC); - } - } - } -#endif /* JRM */ - - H5C2__UPDATE_RP_FOR_EVICTION(cache_ptr, entry_ptr, FAIL) - - } else { - - /* If journaling is enabled, the target entry is being cleared, - * and it is on the transaction list, remove it from the transaction - * list and set its last_trans field to zero. - * - * Must do this now, as otherwise H5C2__UPDATE_RP_FOR_FLUSH may - * scream incorrectly about flushing an entry with a pending - * journal write. - */ - if ( clear_only ) { - H5C2__UPDATE_TL_FOR_ENTRY_CLEAR(cache_ptr, entry_ptr, FAIL); - } - - /* We are either doing a flush or a clear. - * - * A clear and a flush are the same from the point of view of - * the replacement policy and the slist. Hence no - * differentiation between them. - * JRM -- 7/7/07 - */ - - H5C2__UPDATE_RP_FOR_FLUSH(cache_ptr, entry_ptr, FAIL) - - if ( entry_ptr->in_slist ) - { - H5C2__REMOVE_ENTRY_FROM_SLIST(cache_ptr, entry_ptr) - } - } - - - /* Clear the dirty flag only, if requested */ - if ( clear_only ) - { - if ( entry_ptr->is_dirty ) - { -#ifndef NDEBUG - /* only call the clear_dirty_bits callback if debugging - * is enabled. - */ - if ( entry_ptr->type->clear_dirty_bits && entry_ptr->type->clear_dirty_bits(addr, - entry_ptr->size, - (void *)entry_ptr) - != SUCCEED ) - { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ - "clear_dirty_bits() failed.") - } -#endif /* NDEBUG */ - } - entry_ptr->is_dirty = FALSE; - - } - else if ( entry_ptr->is_dirty ) - { - /* The entry is dirty, and we are doing either a flush, - * or a flush destroy. In either case, serialize the - * entry and write it to disk. - * - * If the serialize function changes the size or location - * of the entry, and we are not doing a flush destroy, we - * will have to touch up the cache to account for the - * change(s). - */ - -#if H5C2_DO_SANITY_CHECKS - if ( ( cache_ptr->check_write_permitted == NULL ) && - ( ! (cache_ptr->write_permitted) ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "Write when writes are always forbidden!?!?!") - } -#endif /* H5C2_DO_SANITY_CHECKS */ - - if ( entry_ptr->image_ptr == NULL ) - { - entry_ptr->image_ptr = H5MM_malloc(entry_ptr->size); - - if ( entry_ptr->image_ptr == NULL ) - { - - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \ - "memory allocation failed for on disk image buffer.") - } - } - - if ( ! ( entry_ptr->image_up_to_date ) ) { - - if ( entry_ptr->type->serialize(f, - dxpl_id, - entry_ptr->addr, - entry_ptr->size, - entry_ptr->image_ptr, - (void *)entry_ptr, - &serialize_flags, - &new_addr, - &new_len, - &new_image_ptr) != SUCCEED ) - { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ - "unable to serialize entry") - } - - if ( serialize_flags != 0 ) - { - - /* Check for unexpected flags from serialize callback */ - if(serialize_flags & ~(H5C2__SERIALIZE_RESIZED_FLAG | H5C2__SERIALIZE_RENAMED_FLAG)) - HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unknown serialize flag(s)") - - if ( destroy ) - { - if ( cache_ptr->mdj_enabled ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "rename/resize on destroy when journaling enabled.") - } - - /* We have already removed the entry from the - * cache's data structures, so no need to update - * them for the re-size and/or rename. All we need - * to do is update the cache entry so we will have - * the correct values when we actually write the - * image of the entry to disk. - * - * Note that if the serialize function changes the - * size of the disk image of the entry, it must - * deallocate the old image, and allocate a new. - */ - - if(serialize_flags & H5C2__SERIALIZE_RESIZED_FLAG) { - H5C2__UPDATE_STATS_FOR_ENTRY_SIZE_CHANGE(cache_ptr, \ - entry_ptr, \ - new_len) - - /* Check for resize+rename */ - if(serialize_flags & H5C2__SERIALIZE_RENAMED_FLAG) { - H5C2__UPDATE_STATS_FOR_RENAME(cache_ptr, \ - entry_ptr) - entry_ptr->addr = new_addr; - } /* end if */ - - entry_ptr->size = new_len; - entry_ptr->image_ptr = new_image_ptr; - } /* end if */ - else { - HDassert(serialize_flags & H5C2__SERIALIZE_RENAMED_FLAG); - - H5C2__UPDATE_STATS_FOR_RENAME(cache_ptr, \ - entry_ptr) - entry_ptr->addr = new_addr; - } /* end else */ - } - else - { - if ( cache_ptr->mdj_enabled ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "rename/resize on flush when journaling enabled."); - } - - /* The entry is not being destroyed, and thus has not - * been removed from the cache's data structures. - * - * Thus, in addition to updating the entry for the - * re-size and/or rename, we must also update the - * cache data structures. - */ - - if(serialize_flags & H5C2__SERIALIZE_RESIZED_FLAG) { - - H5C2__UPDATE_STATS_FOR_ENTRY_SIZE_CHANGE( \ - cache_ptr, \ - entry_ptr, \ - new_len) - - /* The replacement policy code thinks the - * entry is already clean, so modify is_dirty - * to meet this expectation. - */ - entry_ptr->is_dirty = FALSE; - - /* Check for resize+rename */ - if(serialize_flags & H5C2__SERIALIZE_RENAMED_FLAG) { - H5C2__UPDATE_STATS_FOR_RENAME(cache_ptr, \ - entry_ptr) - - /* update the hash table for the rename */ - H5C2__DELETE_FROM_INDEX(cache_ptr, entry_ptr) - entry_ptr->addr = new_addr; - H5C2__INSERT_IN_INDEX(cache_ptr, entry_ptr, \ - FAIL) - } /* end if */ - - /* update the hash table for the size change*/ - H5C2__UPDATE_INDEX_FOR_SIZE_CHANGE( \ - (cache_ptr), \ - (entry_ptr->size),\ - (new_len)); - - /* The entry can't be protected since we are - * in the process of flushing it. Thus we must - * update the replacement policy data - * structures for the size change. The macro - * deals with the pinned case. - */ - H5C2__UPDATE_RP_FOR_SIZE_CHANGE(cache_ptr, \ - entry_ptr, \ - new_len); - - /* The entry can't be in the slist, so no need - * to update the slist for the size change. - */ - - /* finally, set is_dirty to TRUE again, and - * update the size and image_ptr. - */ - entry_ptr->is_dirty = TRUE; - entry_ptr->size = new_len; - entry_ptr->image_ptr = new_image_ptr; - } /* end if */ - else { - HDassert(serialize_flags & H5C2__SERIALIZE_RENAMED_FLAG); - - /* The replacement policy code thinks the - * entry is already clean, so modify is_dirty - * to meet this expectation. - */ - entry_ptr->is_dirty = FALSE; - - H5C2__UPDATE_STATS_FOR_RENAME(cache_ptr, \ - entry_ptr) - - /* first update the hash table for the rename */ - H5C2__DELETE_FROM_INDEX(cache_ptr, entry_ptr) - entry_ptr->addr = new_addr; - H5C2__INSERT_IN_INDEX(cache_ptr, entry_ptr, \ - FAIL) - - /* finally, set is_dirty to TRUE again */ - entry_ptr->is_dirty = TRUE; - } /* end else */ - } - } - entry_ptr->image_up_to_date = TRUE; - } - - /* now write the image to disk */ - if ( H5F_block_write(f, type_ptr->mem_type, entry_ptr->addr, - entry_ptr->size, dxpl_id, - entry_ptr->image_ptr) < 0 ) - { - HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ - "Can't write image to file.") - } - -#ifdef H5_HAVE_PARALLEL - /* note that we initialized the serialize_flags to 0, so if - * the image was up to date on entry, serialize_flags should - * still be 0 at this point. - */ - if ( serialize_flags != 0 ) { - - /* In the parallel case, resizes and renames in - * the serialize operation can cause problems. - * If they occur, scream and die. - * - * At present, in the parallel case, the aux_ptr - * will only be set if there is more than one - * process. Thus we can use this to detect - * the parallel case. - * - * This works for now, but if we start using the - * aux_ptr for other purposes, we will have to - * change this test accordingly. - * - * NB: While this test detects entryies that attempt - * to resize or rename themselves during a flush - * in the parallel case, it will not detect an - * entry that dirties, resizes, and/or renames - * other entries during its flush. - * - * From what Quincey tells me, this test is - * sufficient for now, as any flush routine that - * does the latter will also do the former. - * - * If that ceases to be the case, further - * tests will be necessary. - */ - if ( cache_ptr->aux_ptr != NULL ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "resize/rename in serialize occured in parallel case.") - - } - } -#endif /* H5_HAVE_PARALLEL */ - - entry_ptr->is_dirty = FALSE; - } - - - if ( destroy ) /* time to discard the entry */ - { - /* start by freeing the buffer for the on disk image */ - if ( entry_ptr->image_ptr != NULL ) { - - entry_ptr->image_ptr = H5MM_xfree(entry_ptr->image_ptr); - - if ( entry_ptr->image_ptr != NULL ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ - "*image_ptr free failed.") - } - } - - /* we are about to discard the in core representation -- - * set the magic field to bad magic so we can detect a - * freed entry if we see one. - * - * Also reset the pointer to the cache the entry is within. -QAK - */ -#ifndef NDEBUG - entry_ptr->magic = H5C2__H5C2_CACHE_ENTRY_T_BAD_MAGIC; -#endif /* NDEBUG */ - entry_ptr->cache_ptr = NULL; - - if ( type_ptr->free_icr(entry_ptr->addr, entry_ptr->size, - (void *)entry_ptr) != SUCCEED ) - { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ - "free_icr callback failed.") - } - } - else /* just flushing or clearing */ - { - entry_ptr->flush_in_progress = FALSE; - } - - - if ( cache_ptr->log_flush ) { - - /* JRM */ /* may want to update this */ - status = (cache_ptr->log_flush)(cache_ptr, addr, was_dirty, - flags, type_id); - - if ( status < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ - "log_flush callback failed.") - } - } - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_flush_single_entry() */ - - -/*------------------------------------------------------------------------- - * - * Function: H5C2_load_entry - * - * Purpose: Attempt to load the entry at the specified disk address - * and with the specified type into memory. If successful. - * return the in memory address of the entry. Return NULL - * on failure. - * - * Note that this function simply loads the entry into - * core. It does not insert it into the cache. - * - * Return: Non-NULL on success / NULL on failure. - * - * Programmer: John Mainzer, 5/18/04 - * - * Modifications: - * - * JRM - 7/21/04 - * Updated function for the addition of the hash table. - * - * JRM - 6/23/06 - * Deleted assertion that verified that a newly loaded - * entry is clean. Due to a bug fix, this need not be - * the case, as our code will attempt to repair errors - * on load. - * - * JRM - 8/21/06 - * Added initialization for the new flush_in_progress and - * destroy in progress fields. - * - * JRM - 3/29/07 - * Added initialization for the new is_read_only and - * ro_ref_count fields. - * - * JRM - 6/25/07 - * Reworked function to use the new client callback - * functions that are needed to implement metadata - * journaling. Removed skip_file_checks parameter. - * - * JRM -- 10/12/07 - * Added initialization for the new magic field. - * - * JRM -- 3/26/08 - * Added initialization for the journaling related - * fields. - * - *------------------------------------------------------------------------- - */ - -static void * -H5C2_load_entry(H5F_t * f, - hid_t dxpl_id, - const H5C2_class_t * type, - haddr_t addr, - size_t len, - void * udata_ptr) -{ - hbool_t dirty = FALSE; - void * image_ptr = NULL; - void * thing = NULL; - H5C2_cache_entry_t * entry_ptr = NULL; - void * ret_value = NULL; - - FUNC_ENTER_NOAPI_NOINIT(H5C2_load_entry) - - HDassert( f ); - HDassert( f->shared ); - HDassert( f->shared->cache2 ); - HDassert( type ); - HDassert( H5F_addr_defined(addr) ); - HDassert( len > 0 ); - HDassert( type->deserialize ); - - /* Check for possible speculative read off the end of the file */ - /* (Assume speculative reads will only occur if an image_len callback is defined) */ - if ( type->image_len ) - { - - haddr_t eoa; /* End-of-allocation in the file */ - haddr_t base_addr; /* Base address of file data */ - - /* Get the file's end-of-allocation value */ - eoa = H5F_get_eoa(f); - HDassert(H5F_addr_defined(eoa)); - - /* Get the file's base address */ - base_addr = H5F_BASE_ADDR(f); - HDassert(H5F_addr_defined(base_addr)); - - /* Check for bad address in general */ - if ( (addr + base_addr) > eoa ) - { - - HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, NULL, \ - "address of object past end of allocation") - - } - - /* Check if the amount of data to read will be past the eoa */ - if ( ( addr + base_addr + len ) > eoa ) - { - - /* Trim down the length of the metadata */ - len = eoa - (addr + base_addr); - - } - } - - image_ptr = H5MM_malloc(len); - - if ( image_ptr == NULL ) { - - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, \ - "memory allocation failed for on disk image buffer.") - } - - if ( H5F_block_read(f, type->mem_type, addr, len, dxpl_id, image_ptr) < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTLOAD, NULL, "Can't read image*") - } - - thing = type->deserialize(addr, len, image_ptr, udata_ptr, &dirty); - - if ( thing == NULL ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTLOAD, NULL, "Can't deserialize image") - } - - /* If the client's cache has an image_len callback, check it */ - if ( type->image_len ) - { - size_t new_len; - - if ( type->image_len(thing, &new_len) != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTLOAD, NULL, "image_len() failed.\n"); - - } else if ( new_len == 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTLOAD, NULL, "new_len == 0\n") - } - else if ( new_len != len) - { - image_ptr = H5MM_realloc(image_ptr, new_len); - - if ( image_ptr == NULL ) { - - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, \ - "image_ptr null after H5MM_realloc().") - } - - /* If the thing's image needs to be bigger, free the thing - * and retry with new length - */ - if ( new_len > len) - { - if ( type->free_icr(addr, len, thing) != SUCCEED ) - { - HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, NULL, \ - "free_icr callback failed.") - } - - if ( H5F_block_read(f, type->mem_type, addr, new_len, - dxpl_id, image_ptr) < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTLOAD, NULL, \ - "Can't read image") - } - - thing = type->deserialize(addr, new_len, image_ptr, - udata_ptr, &dirty); - - if ( thing == NULL ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTLOAD, NULL, \ - "Can't deserialize image") - } - - } - - /* Retain adjusted size */ - len = new_len; - } - } - - entry_ptr = (H5C2_cache_entry_t *)thing; - - /* In general, an entry should be clean just after it is loaded. - * - * However, when this code is used in the metadata cache, it is - * possible that object headers will be dirty at this point, as - * the deserialize function will alter object headers if necessary to - * fix an old bug. - * - * In the following assert: - * - * HDassert( ( dirty == FALSE ) || ( type->id == 5 || type->id == 6 ) ); - * - * note that type ids 5 & 6 are associated with object headers in the metadata - * cache. - * - * When we get to using H5C2 for other purposes, we may wish to - * tighten up the assert so that the loophole only applies to the - * metadata cache. - */ - - HDassert( ( dirty == FALSE ) || ( type->id == 5 || type->id == 6) ); - HDassert( entry_ptr->size < H5C2_MAX_ENTRY_SIZE ); -#ifndef NDEBUG - entry_ptr->magic = H5C2__H5C2_CACHE_ENTRY_T_MAGIC; -#endif /* NDEBUG */ - entry_ptr->cache_ptr = f->shared->cache2; - entry_ptr->addr = addr; - entry_ptr->size = len; - entry_ptr->image_ptr = image_ptr; - entry_ptr->image_up_to_date = TRUE; - entry_ptr->type = type; - entry_ptr->is_dirty = dirty; - entry_ptr->dirtied = FALSE; - entry_ptr->is_protected = FALSE; - entry_ptr->is_read_only = FALSE; - entry_ptr->ro_ref_count = 0; - entry_ptr->is_pinned = FALSE; - entry_ptr->in_slist = FALSE; - entry_ptr->flush_marker = FALSE; -#ifdef H5_HAVE_PARALLEL - entry_ptr->clear_on_unprotect = FALSE; -#endif /* H5_HAVE_PARALLEL */ - entry_ptr->flush_in_progress = FALSE; - entry_ptr->destroy_in_progress = FALSE; - - entry_ptr->ht_next = NULL; - entry_ptr->ht_prev = NULL; - - entry_ptr->next = NULL; - entry_ptr->prev = NULL; - - entry_ptr->aux_next = NULL; - entry_ptr->aux_prev = NULL; - - entry_ptr->last_trans = 0; - entry_ptr->trans_next = NULL; - entry_ptr->trans_prev = NULL; - - H5C2__RESET_CACHE_ENTRY_STATS(entry_ptr); - - ret_value = thing; - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_load_entry() */ - - -/*------------------------------------------------------------------------- - * - * Function: H5C2_make_space_in_cache - * - * Purpose: Attempt to evict cache entries until the index_size - * is at least needed_space below max_cache_size. - * - * In passing, also attempt to bring cLRU_list_size to a - * value greater than min_clean_size. - * - * Depending on circumstances, both of these goals may - * be impossible, as in parallel mode, we must avoid generating - * a write as part of a read (to avoid deadlock in collective - * I/O), and in all cases, it is possible (though hopefully - * highly unlikely) that the protected list may exceed the - * maximum size of the cache. - * - * Thus the function simply does its best, returning success - * unless an error is encountered. - * - * The primary_dxpl_id and secondary_dxpl_id parameters - * specify the dxpl_ids used on the first write occasioned - * by the call (primary_dxpl_id), and on all subsequent - * writes (secondary_dxpl_id). This is useful in the metadata - * cache, but may not be needed elsewhere. If so, just use the - * same dxpl_id for both parameters. - * - * Observe that this function cannot occasion a read. - * - * Return: Non-negative on success/Negative on failure. - * - * Programmer: John Mainzer, 5/14/04 - * - * Modifications: - * - * JRM --7/21/04 - * Minor modifications in support of the addition of a hash - * table to facilitate lookups. - * - * JRM -- 11/22/04 - * Added the first_flush_ptr parameter, which replaces the - * old first_flush local variable. This allows the function - * to coordinate on the first flush issue with other functions. - * - * JRM -- 12/13/04 - * Added code to skip over epoch markers if present. - * - * JRM -- 1/3/06 - * Modified function to work correctly when the the cache - * is not full. This case occurs when we need to flush to - * min clean size before the cache has filled. - * - * JRM -- 3/29/07 - * Added sanity checks using the new is_read_only and - * ro_ref_count fields. - * - * JRM -- 8/24/07 - * Reworked parameter list and code for the removal of the - * secondary dxpl id, and the decision to store the file - * pointer f in *cache_ptr. - * - * JRM -- 10/12/07 - * Added code to detect the case in which the LRU list has - * been modified by a serialize callback, and cause the - * function to re-start its scan at the tail of the LRU. - * - *------------------------------------------------------------------------- - */ - -static herr_t -H5C2_make_space_in_cache(H5F_t * f, - hid_t dxpl_id, - H5C2_t * cache_ptr, - size_t space_needed, - hbool_t write_permitted) -{ - herr_t result; - int32_t entries_examined = 0; - int32_t initial_list_len; -#if H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS - size_t empty_space; -#endif /* H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ - hbool_t prev_is_dirty = FALSE; - hbool_t entry_is_epoch_maker = FALSE; - H5C2_cache_entry_t * entry_ptr; - H5C2_cache_entry_t * prev_ptr; - H5C2_cache_entry_t * next_ptr; - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI_NOINIT(H5C2_make_space_in_cache) - - HDassert( f ); - HDassert( cache_ptr ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - - if ( write_permitted ) { - - initial_list_len = cache_ptr->LRU_list_len; - entry_ptr = cache_ptr->LRU_tail_ptr; - - while ( ( (cache_ptr->index_size + space_needed) - > - cache_ptr->max_cache_size - ) - && - ( entries_examined <= (2 * initial_list_len) ) - && - ( entry_ptr != NULL ) - ) - { - HDassert( ! (entry_ptr->is_protected) ); - HDassert( ! (entry_ptr->is_read_only) ); - HDassert( (entry_ptr->ro_ref_count) == 0 ); - - next_ptr = entry_ptr->next; - prev_ptr = entry_ptr->prev; - - if ( prev_ptr != NULL ) { - - prev_is_dirty = prev_ptr->is_dirty; - } - - if ( (entry_ptr->type)->id != H5C2__EPOCH_MARKER_TYPE ) { - - entry_is_epoch_maker = FALSE; - - if ( entry_ptr->is_dirty ) { - - result = H5C2_flush_single_entry(f, - dxpl_id, - cache_ptr, - entry_ptr->type, - entry_ptr->addr, - H5C2__NO_FLAGS_SET, - FALSE); - } else { - - result = - H5C2_flush_single_entry(f, - dxpl_id, - cache_ptr, - entry_ptr->type, - entry_ptr->addr, - H5C2__FLUSH_INVALIDATE_FLAG, - TRUE); - } - } else { - - /* Skip epoch markers. Set result to SUCCEED to avoid - * triggering the error code below. - */ - entry_is_epoch_maker = TRUE; - result = SUCCEED; - } - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ - "unable to flush entry") - } - - if ( prev_ptr != NULL ) { -#ifndef NDEBUG - if ( prev_ptr->magic != H5C2__H5C2_CACHE_ENTRY_T_MAGIC ) { - - /* something horrible has happened to *prev_ptr -- - * scream and die. - */ - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "*prev_ptr corrupt 1") - - } else -#endif /* NDEBUG */ - if ( entry_is_epoch_maker ) { - - /* epoch markers don't get flushed, so the sanity checks - * on normal entries will fail -- thus just set entry_ptr - * to prev_ptr and go on. - */ - entry_ptr = prev_ptr; - - } else if ( ( prev_ptr->is_dirty != prev_is_dirty ) - || - ( prev_ptr->next != next_ptr ) - || - ( prev_ptr->is_protected ) - || - ( prev_ptr->is_pinned ) ) { - - /* something has happened to the LRU -- start over - * from the tail. - */ - entry_ptr = cache_ptr->LRU_tail_ptr; - - } else { - - entry_ptr = prev_ptr; - - } - } else { - - entry_ptr = NULL; - - } - - entries_examined++; - - } - -#if H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS - - entries_examined = 0; - initial_list_len = cache_ptr->dLRU_list_len; - entry_ptr = cache_ptr->dLRU_tail_ptr; - - if ( cache_ptr->index_size < cache_ptr->max_cache_size ) { - - empty_space = cache_ptr->max_cache_size - cache_ptr->index_size; - - } else { - - empty_space = 0; - } - - while ( ( (cache_ptr->cLRU_list_size + empty_space) - < cache_ptr->min_clean_size ) && - ( entries_examined <= initial_list_len ) && - ( entry_ptr != NULL ) - ) - { - HDassert( ! (entry_ptr->is_protected) ); - HDassert( ! (entry_ptr->is_read_only) ); - HDassert( (entry_ptr->ro_ref_count) == 0 ); - HDassert( entry_ptr->is_dirty ); - HDassert( entry_ptr->in_slist ); - - prev_ptr = entry_ptr->aux_prev; - - next_ptr = entry_ptr->aux_next; - - if ( prev_ptr != NULL ) { - - HDassert( prev_ptr->is_dirty ); - } - - result = H5C2_flush_single_entry(f, - dxpl_id, - cache_ptr, - entry_ptr->type, - entry_ptr->addr, - H5C2__NO_FLAGS_SET, - FALSE); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ - "unable to flush entry") - } - - if ( prev_ptr != NULL ) { -#ifndef NDEBUG - if (prev_ptr->magic != H5C2__H5C2_CACHE_ENTRY_T_MAGIC) { - - /* something horrible has happened to *prev_ptr -- - * scream and die. - */ - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "*prev_ptr corrupt 2") - - } else -#endif /* #ifndef NDEBUG */ - if ( ( ! ( prev_ptr->is_dirty ) ) - || - ( prev_ptr->aux_next != next_ptr ) - || - ( prev_ptr->is_protected ) - || - ( prev_ptr->is_pinned ) ) { - - /* something has happened to the dirty LRU -- start over - * from the tail. - */ - -#if 0 /* This debuging code may be useful in the future -- keep it for now. */ - if ( ! ( prev_ptr->is_dirty ) ) { - HDfprintf(stdout, "%s: ! prev_ptr->is_dirty\n", - FUNC); - } - if ( prev_ptr->aux_next != next_ptr ) { - HDfprintf(stdout, "%s: prev_ptr->next != next_ptr\n", - FUNC); - } - if ( prev_ptr->is_protected ) { - HDfprintf(stdout, "%s: prev_ptr->is_protected\n", - FUNC); - } - if ( prev_ptr->is_pinned ) { - HDfprintf(stdout, "%s:prev_ptr->is_pinned\n", - FUNC); - } - - HDfprintf(stdout, "%s: re-starting scan of dirty list\n", - FUNC); -#endif /* JRM */ - entry_ptr = cache_ptr->dLRU_tail_ptr; - - } else { - - entry_ptr = prev_ptr; - - } - } else { - - entry_ptr = NULL; - - } - - entries_examined++; - } - -#endif /* H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ - - } else { - - HDassert( H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS ); - - initial_list_len = cache_ptr->cLRU_list_len; - entry_ptr = cache_ptr->cLRU_tail_ptr; - - while ( ( (cache_ptr->index_size + space_needed) - > - cache_ptr->max_cache_size - ) - && - ( entries_examined <= initial_list_len ) - && - ( entry_ptr != NULL ) - ) - { - HDassert( ! (entry_ptr->is_protected) ); - HDassert( ! (entry_ptr->is_read_only) ); - HDassert( (entry_ptr->ro_ref_count) == 0 ); - HDassert( ! (entry_ptr->is_dirty) ); - - prev_ptr = entry_ptr->aux_prev; - - result = H5C2_flush_single_entry(f, - dxpl_id, - cache_ptr, - entry_ptr->type, - entry_ptr->addr, - H5C2__FLUSH_INVALIDATE_FLAG, - TRUE); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, \ - "unable to flush entry") - } - - /* we are scanning the clean LRU, so the serialize function - * will not be called on any entry -- thus there is no - * concern about the list being modified out from under - * this function. - */ - - entry_ptr = prev_ptr; - entries_examined++; - } - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_make_space_in_cache() */ - - -/*------------------------------------------------------------------------- - * - * Function: H5C2_validate_lru_list - * - * Purpose: Debugging function that scans the LRU list for errors. - * - * If an error is detected, the function generates a - * diagnostic and returns FAIL. If no error is detected, - * the function returns SUCCEED. - * - * Return: FAIL if error is detected, SUCCEED otherwise. - * - * Programmer: John Mainzer, 7/14/05 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -#if H5C2_DO_EXTREME_SANITY_CHECKS - -static herr_t -H5C2_validate_lru_list(H5C2_t * cache_ptr) -{ - herr_t ret_value = SUCCEED; /* Return value */ - int32_t len = 0; - size_t size = 0; - H5C2_cache_entry_t * entry_ptr = NULL; - - FUNC_ENTER_NOAPI_NOINIT(H5C2_validate_lru_list) - - HDassert( cache_ptr ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - - if ( ( ( cache_ptr->LRU_head_ptr == NULL ) - || - ( cache_ptr->LRU_tail_ptr == NULL ) - ) - && - ( cache_ptr->LRU_head_ptr != cache_ptr->LRU_tail_ptr ) - ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 1 failed") - } - - if ( ( cache_ptr->LRU_list_len < 0 ) || ( cache_ptr->LRU_list_size < 0 ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 2 failed") - } - - if ( ( cache_ptr->LRU_list_len == 1 ) - && - ( ( cache_ptr->LRU_head_ptr != cache_ptr->LRU_tail_ptr ) - || - ( cache_ptr->LRU_head_ptr == NULL ) - || - ( cache_ptr->LRU_head_ptr->size != cache_ptr->LRU_list_size ) - ) - ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 3 failed") - } - - if ( ( cache_ptr->LRU_list_len >= 1 ) - && - ( ( cache_ptr->LRU_head_ptr == NULL ) - || - ( cache_ptr->LRU_head_ptr->prev != NULL ) - || - ( cache_ptr->LRU_tail_ptr == NULL ) - || - ( cache_ptr->LRU_tail_ptr->next != NULL ) - ) - ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 4 failed") - } - - entry_ptr = cache_ptr->LRU_head_ptr; - while ( entry_ptr != NULL ) - { - - if ( ( entry_ptr != cache_ptr->LRU_head_ptr ) && - ( ( entry_ptr->prev == NULL ) || - ( entry_ptr->prev->next != entry_ptr ) ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 5 failed") - } - - if ( ( entry_ptr != cache_ptr->LRU_tail_ptr ) && - ( ( entry_ptr->next == NULL ) || - ( entry_ptr->next->prev != entry_ptr ) ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 6 failed") - } - - len++; - size += entry_ptr->size; - entry_ptr = entry_ptr->next; - } - - if ( ( cache_ptr->LRU_list_len != len ) || - ( cache_ptr->LRU_list_size != size ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Check 7 failed") - } - -done: - - if ( ret_value != SUCCEED ) { - - HDassert(0); - } - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_validate_lru_list() */ - -#endif /* H5C2_DO_EXTREME_SANITY_CHECKS */ - - -/*------------------------------------------------------------------------- - * - * Function: H5C2_verify_not_in_index - * - * Purpose: Debugging function that scans the hash table to verify - * that the specified instance of H5C2_cache_entry_t is not - * present. - * - * If an error is detected, the function generates a - * diagnostic and returns FAIL. If no error is detected, - * the function returns SUCCEED. - * - * Return: FAIL if error is detected, SUCCEED otherwise. - * - * Programmer: John Mainzer, 7/14/05 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -#if H5C2_DO_EXTREME_SANITY_CHECKS - -static herr_t -H5C2_verify_not_in_index(H5C2_t * cache_ptr, - H5C2_cache_entry_t * entry_ptr) -{ - herr_t ret_value = SUCCEED; /* Return value */ - int32_t i; - int32_t depth; - H5C2_cache_entry_t * scan_ptr = NULL; - - FUNC_ENTER_NOAPI_NOINIT(H5C2_verify_not_in_index) - - HDassert( cache_ptr != NULL ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - HDassert( entry_ptr != NULL ); - - for ( i = 0; i < H5C2__HASH_TABLE_LEN; i++ ) - { - depth = 0; - scan_ptr = cache_ptr->index[i]; - - while ( scan_ptr != NULL ) - { - if ( scan_ptr == entry_ptr ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "Entry already in index.") - } - depth++; - scan_ptr = scan_ptr->ht_next; - } - } - -done: - - if ( ret_value != SUCCEED ) { - - HDassert(0); - } - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_verify_not_in_index() */ - -#endif /* H5C2_DO_EXTREME_SANITY_CHECKS */ diff --git a/src/H5C2journal.c b/src/H5C2journal.c deleted file mode 100644 index a550cbd..0000000 --- a/src/H5C2journal.c +++ /dev/null @@ -1,8835 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * Copyright by the Board of Trustees of the University of Illinois. * - * All rights reserved. * - * * - * This file is part of HDF5. The full HDF5 copyright notice, including * - * terms governing use, modification, and redistribution, is contained in * - * the files COPYING and Copyright.html. COPYING can be found at the root * - * of the source code distribution tree; Copyright.html can be found at the * - * root level of an installed copy of the electronic HDF5 document set and * - * is linked from the top-level documents page. It can also be found at * - * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * - * access to either file, you may request a copy from help@hdfgroup.org. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/*------------------------------------------------------------------------- - * - * Created: H5C2journal.c - * Dec 6 2007 - * John Mainzer - * - * 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 - * 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. - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -#define H5F_PACKAGE /* suppress error about including H5Fpkg */ -#define H5C2_PACKAGE /* suppress error about including H5C2pkg */ - -#include "H5private.h" /* Generic Functions */ -#include "H5Eprivate.h" /* Error handling */ -#include "H5MMprivate.h" /* Memory management */ -#include "H5MFprivate.h" /* File memory management */ -#include "H5Fpkg.h" /* File access */ -#include "H5C2pkg.h" /* Cache */ -#include "H5Pprivate.h" /* Property lists */ - -/**************************************************************************/ -/***************************** global variables ***************************/ -/**************************************************************************/ - -/* In the test code, it is sometimes useful to skip the check for journaling - * in progress on open. The check_for_journaling global is used to support - * this. Note that we can't tuck this variable into H5C2_t, as the test - * takes place before H5Fopen() returns. - */ - -hbool_t H5C2__check_for_journaling = TRUE; - -/**************************************************************************/ -/******************************* local macros *****************************/ -/**************************************************************************/ -#define H5C2__TRANS_NUM_SIZE 8 -#define H5C2__CHECKSUM_SIZE 4 - -/**************************************************************************/ -/***************************** local prototypes ***************************/ -/**************************************************************************/ - -static herr_t H5C2_call_mdjsc_callbacks(H5C2_t * cache_ptr, - hid_t dxpl_id, - H5C2_mdj_config_t * config_ptr); - -static herr_t H5C2_get_journaling_in_progress(const H5F_t * f, - H5C2_t * cache_ptr); - -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); - -static herr_t H5C2_jb_bjf__end_transaction(H5C2_jbrb_t * struct_ptr, - uint64_t trans_num); - -static herr_t H5C2_jb_bjf__eoa(H5C2_jbrb_t * struct_ptr, - haddr_t eoa); - -static herr_t H5C2_jb_bjf__journal_entry(H5C2_jbrb_t * struct_ptr, - uint64_t trans_num, - haddr_t base_addr, - size_t length, - const uint8_t * body); - -static herr_t H5C2_jb_bjf__start_transaction(H5C2_jbrb_t * struct_ptr, - uint64_t trans_num); - -static herr_t H5C2_jb_bjf__write_buffer(H5C2_jbrb_t * struct_ptr, - size_t buf_size, - const char * buf_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); - -static herr_t H5C2_jb_bjf__write_length(H5C2_jbrb_t * struct_ptr, - size_t length, - hbool_t is_end_trans, - uint64_t trans_num); - -static herr_t H5C2_jb_bjf__write_offset(H5C2_jbrb_t * struct_ptr, - haddr_t offset, - 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); - -static herr_t H5C2_jb_bjf__write_trans_num(H5C2_jbrb_t * struct_ptr, - hbool_t is_end_trans, - uint64_t trans_num); - -static herr_t H5C2_jb_hrjf__comment(H5C2_jbrb_t * struct_ptr, - const char * comment_ptr); - -static herr_t H5C2_jb_hrjf__end_transaction(H5C2_jbrb_t * struct_ptr, - uint64_t trans_num); - -static herr_t H5C2_jb_hrjf__eoa(H5C2_jbrb_t * struct_ptr, - haddr_t eoa); - -static herr_t H5C2_jb_hrjf__journal_entry(H5C2_jbrb_t * struct_ptr, - uint64_t trans_num, - haddr_t base_addr, - size_t length, - const uint8_t * body); - -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); - - - -/**************************************************************************/ -/************************* journaling code proper *************************/ -/**************************************************************************/ - -/*------------------------------------------------------------------------- - * Function: H5C2_begin_journaling - * - * Purpose: Setup the metadata cache to begin journaling. - * - * Return: Success: SUCCEED - * Failure: FAIL - * - * Programmer: John Mainzer - * March 26, 2008 - * - * Changes: JRM -- 8/14/08 - * Reworked the function to use the H5C2_mdj_config_t - * structure. - * - * JRM -- 8/18/08 - * 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. - * - * 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. - * - *------------------------------------------------------------------------- - */ - -herr_t -H5C2_begin_journaling(H5F_t * f, - hid_t dxpl_id, - H5C2_t * cache_ptr, - H5C2_mdj_config_t * config_ptr) -{ - herr_t result; - herr_t ret_value = SUCCEED; /* Return value */ - int32_t journal_magic; - H5C2_mdj_config_t config; - - FUNC_ENTER_NOAPI(H5C2_begin_journaling, FAIL) - - HDassert( f != NULL ); - HDassert( f->name != NULL ); - HDassert( f->shared != NULL ); - HDassert( f->shared->sizeof_addr > 0 ); - HDassert( f->shared->sizeof_size > 0 ); - HDassert( cache_ptr != NULL ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - HDassert( cache_ptr->mdj_enabled == FALSE ); - HDassert( cache_ptr->trans_in_progress == FALSE ); - HDassert( cache_ptr->trans_num == 0 ); - HDassert( cache_ptr->last_trans_on_disk == 0 ); - HDassert( cache_ptr->tl_len == 0 ); - HDassert( cache_ptr->tl_size == 0 ); - HDassert( cache_ptr->tl_head_ptr == NULL ); - HDassert( cache_ptr->tl_tail_ptr == NULL ); - HDassert( cache_ptr->jwipl_len == 0 ); - HDassert( cache_ptr->jwipl_size == 0 ); - HDassert( cache_ptr->jwipl_head_ptr == NULL ); - HDassert( cache_ptr->jwipl_tail_ptr == NULL ); - HDassert( config_ptr != NULL ); - HDassert( config_ptr->jbrb_buf_size > 0 ); - HDassert( config_ptr->jbrb_num_bufs > 0 ); - HDassert( HDstrlen(config_ptr->journal_file_path) > 0 ); - - if ( cache_ptr->mdj_enabled ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "metadata journaling already enabled on entry.") - } - - result = H5C2_flush_cache(f, dxpl_id, H5C2__NO_FLAGS_SET); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_flush_cache() failed.") - } - - journal_magic = (int32_t)HDrand(); - - result = H5C2_jb__init(&(cache_ptr->mdj_jbrb), - journal_magic, - f->name, - config_ptr->journal_file_path, - config_ptr->jbrb_buf_size, - config_ptr->jbrb_num_bufs, - config_ptr->jbrb_use_aio, - config_ptr->jbrb_human_readable, - f->shared->sizeof_addr, - f->shared->sizeof_size); - - if ( result != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_jb__init() failed.") - } - - /* Note that this call flushes the HDF5 file in passing */ - result = H5C2_mark_journaling_in_progress(f, dxpl_id, journal_magic, - config_ptr->journal_file_path); - - if ( result != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_mark_journaling_in_progress() failed.") - } - - cache_ptr->mdj_enabled = TRUE; - - result = H5C2_get_journal_config(cache_ptr, &config); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_get_journal_config() failed.") - } - - result = H5C2_call_mdjsc_callbacks(cache_ptr, dxpl_id, &config); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_call_mdjsc_callbacks() failed.") - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_begin_journaling() */ - - -/*------------------------------------------------------------------------- - * 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: Success: SUCCEED - * Failure: FAIL - * - * Programmer: John Mainzer - * March 18, 2008 - * - *------------------------------------------------------------------------- - */ - -herr_t -H5C2_begin_transaction(H5C2_t * cache_ptr, - uint64_t * trans_num_ptr, - const char * api_call_name) -{ - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5C2_begin_transaction, FAIL) - - HDassert( cache_ptr != NULL ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - HDassert( cache_ptr->tl_len == 0 ); - HDassert( cache_ptr->tl_size == 0 ); - HDassert( cache_ptr->tl_head_ptr == NULL ); - HDassert( cache_ptr->tl_tail_ptr == NULL ); - HDassert( trans_num_ptr != NULL ); - HDassert( api_call_name != NULL ); - HDassert( HDstrlen(api_call_name) <= H5C2__MAX_API_NAME_LEN ); - - if ( cache_ptr->mdj_enabled ) { - - if ( cache_ptr->trans_in_progress ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "transaction already in progress?.") - } - - HDstrncpy(cache_ptr->trans_api_name, api_call_name, - (size_t)H5C2__MAX_API_NAME_LEN); - - (cache_ptr->trans_num)++; - - *trans_num_ptr = cache_ptr->trans_num; - - cache_ptr->trans_in_progress = TRUE; - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_begin_transaction() */ - - -/*------------------------------------------------------------------------- - * Function: H5C2_end_journaling - * - * Purpose: Shutdown metadata journaling. - * - * To do this we must: - * - * 1) Flush the cache. This will also flush and truncate the - * journal file. - * - * 2) Mark the superblock to indicate that we are no longer - * journaling. Note that this will flush the HDF5 file - * again in passing. - * - * 3) Tell the journal file write code to shutdown. This will - * also cause the journal file to be deleted. - * - * Return: Success: SUCCEED - * Failure: FAIL - * - * Programmer: John Mainzer - * April 12, 2008 - * - * Changes: Added code to call the metadata journaling status change - * callback function. - * JR -- 8/18/08 - * - *------------------------------------------------------------------------- - */ - -herr_t -H5C2_end_journaling(H5F_t * f, - hid_t dxpl_id, - H5C2_t * cache_ptr) -{ - herr_t result; - herr_t ret_value = SUCCEED; /* Return value */ - H5C2_mdj_config_t config; - - FUNC_ENTER_NOAPI(H5C2_end_journaling, FAIL) - - HDassert( f != NULL ); - HDassert( cache_ptr != NULL ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - - if ( cache_ptr->mdj_enabled ) { - - HDassert( cache_ptr->mdj_enabled ); - HDassert( cache_ptr->trans_in_progress == FALSE ); - HDassert( cache_ptr->tl_len == 0 ); - HDassert( cache_ptr->tl_size == 0 ); - HDassert( cache_ptr->tl_head_ptr == NULL ); - HDassert( cache_ptr->tl_tail_ptr == NULL ); - - result = H5C2_flush_cache(f, dxpl_id, H5C2__NO_FLAGS_SET); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_flush_cache() failed.") - } - - HDassert( cache_ptr->mdj_enabled ); - - /* Turn off journaling now, before attempting to modify the superblock - * extension (which is really an object header) and having the - * object header code call into the cache, which gets confused - * because there's no transaction in progress. -QAK - */ - cache_ptr->mdj_enabled = FALSE; - - /* Remove the journal configuration information from the superblock - * 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); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_unmark_journaling_in_progress() failed.") - } - - result = H5C2_jb__takedown(&(cache_ptr->mdj_jbrb)); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_jb__takedown() failed.") - } - - result = H5C2_get_journal_config(cache_ptr, &config); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_get_journal_config() failed.") - } - - result = H5C2_call_mdjsc_callbacks(cache_ptr, dxpl_id, &config); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_call_mdjsc_callbacks() failed.") - } - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_end_journaling() */ - - - -/*------------------------------------------------------------------------- - * Function: H5C2_end_transaction - * - * Purpose: Handle book keeping for the end of a transaction. - * - * Return: Success: SUCCEED - * Failure: FAIL - * - * Programmer: John Mainzer - * March 18, 2008 - * - *------------------------------------------------------------------------- - */ - -herr_t -H5C2_end_transaction(H5F_t * f, - hid_t dxpl_id, - H5C2_t * cache_ptr, - uint64_t trans_num, - const char * api_call_name) -{ - uint64_t new_last_trans_on_disk = 0; - herr_t result; - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5C2_end_transaction, FAIL) - - HDassert( cache_ptr != NULL ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - HDassert( api_call_name != NULL ); - HDassert( HDstrlen(api_call_name) <= H5C2__MAX_API_NAME_LEN ); - HDassert( ( ! ( cache_ptr->mdj_enabled ) ) || - ( HDstrcmp(api_call_name, cache_ptr->trans_api_name) == 0 ) ); - - if ( cache_ptr->mdj_enabled ) { - - if ( ! ( cache_ptr->trans_in_progress ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "transaction not in progress?!?!") - } - - if ( cache_ptr->trans_num != trans_num ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "trans_num mis-match?!?!") - } - - /* if the transaction list is not empty, generate journal messages, - * and remove all entries from the transaction list. - */ - if ( cache_ptr->tl_len > 0 ) { - - result = H5C2_journal_transaction(f, dxpl_id, cache_ptr); - - if ( result != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_journal_transaction() failed.") - } - } - - cache_ptr->trans_in_progress = FALSE; - - /* Get the last transaction on disk. If it has changed, remove - * all entries with completed journal writes from the journal write - * in progress list. - */ - - result = H5C2_jb__get_last_transaction_on_disk(&(cache_ptr->mdj_jbrb), - &new_last_trans_on_disk); - - if ( result != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_jb__get_last_transaction_on_disk() failed.") - } - - if ( cache_ptr->last_trans_on_disk < new_last_trans_on_disk ) { - - result = H5C2_update_for_new_last_trans_on_disk(cache_ptr, - new_last_trans_on_disk); - - if ( result != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_update_for_new_last_trans_on_disk() failed.") - } - } - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_end_transaction() */ - - -/*------------------------------------------------------------------------- - * Function: H5C2_get_journal_config - * - * Purpose: Return the current metadata journaling status in an - * instance of H5C2_mdj_config_t. - * - * 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 - * - * Programmer: John Mainzer - * April 13, 2008 - * - * Changes: - * - * JRM -- 8/14/08 - * Reworked function to use H5C2_mdj_config_t. - * - *------------------------------------------------------------------------- - */ - -herr_t -H5C2_get_journal_config(H5C2_t * cache_ptr, - H5C2_mdj_config_t * config_ptr) -{ - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5C2_get_journal_config, FAIL) - - HDassert( cache_ptr != NULL ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - - if ( config_ptr == NULL ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "config_ptr NULL on entry!?!.") - } - - if ( cache_ptr->mdj_enabled ) { - - config_ptr->enable_journaling = TRUE; - - HDstrncpy(&(config_ptr->journal_file_path[0]), - cache_ptr->jnl_file_name, - H5C2__MAX_JOURNAL_FILE_NAME_LEN); - - config_ptr->journal_file_path[H5C2__MAX_JOURNAL_FILE_NAME_LEN] = '\0'; - - config_ptr->jbrb_buf_size = (cache_ptr->mdj_jbrb).buf_size; - - config_ptr->jbrb_num_bufs = (cache_ptr->mdj_jbrb).num_bufs; - - 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; - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_get_journal_config() */ - - -/*------------------------------------------------------------------------- - * Function: H5C2_journal_post_flush() - * - * Purpose: Handle any journaling activities that are necessary - * after we flush the metadata cache. - * - * At present this means: - * - * 1) Verify that a transaction is still not in progress. - * - * 2) Verify that the journal write in progress list - * is still empty. - * - * 3) If the cache_is_clean parameter is true: - * - * a) Flush the HDF5 file - * - * b) Truncate the journal file - * - * c) Reset cache_ptr->trans_num and - * cache_ptr->last_trans_on_disk to zero. - * - * Return: Success: SUCCEED - * Failure: FAIL - * - * Programmer: John Mainzer - * April 10, 2008 - * - *------------------------------------------------------------------------- - */ - -herr_t -H5C2_journal_post_flush(H5F_t * f, - hid_t dxpl_id, - H5C2_t * cache_ptr, - hbool_t cache_is_clean) -{ - herr_t result; - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5C2_journal_post_flush, FAIL) - - HDassert( f != NULL ); - HDassert( cache_ptr != NULL ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - HDassert( cache_ptr->mdj_enabled ); - - if ( cache_ptr->trans_in_progress ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "Transaction in progress during flush?!?!?.") - } - - if ( cache_ptr->jwipl_len != 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "journal write in progress list isn't empty?!?!.") - } - - if ( cache_is_clean ) { - - /* Write the superblock to disk */ - - result = H5F_super_write(f, dxpl_id); - - if ( result != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_WRITEERROR, FAIL, \ - "unable to write superblock to file") - } - - result = H5FD_flush(f->shared->lf, dxpl_id, (unsigned)0); - - if ( result > 0 ) { - - HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, \ - "low level flush failed") - } - - result = H5C2_jb__trunc(&(cache_ptr->mdj_jbrb)); - - if ( result != SUCCEED ) { - - 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; - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_journal_post_flush() */ - - -/*------------------------------------------------------------------------- - * Function: H5C2_journal_pre_flush() - * - * Purpose: Handle any journaling activities that are necessary - * before we flush the metadata cache. - * - * At present this means: - * - * 1) Verify that a transaction is not in progress. - * - * 2) Flush the journal to disk. - * - * 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 - * 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 - * - * Programmer: John Mainzer - * April 10, 2008 - * - *------------------------------------------------------------------------- - */ - -herr_t -H5C2_journal_pre_flush(H5C2_t * cache_ptr) -{ - herr_t result; - uint64_t new_last_trans_on_disk; - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5C2_journal_pre_flush, FAIL) - - HDassert( cache_ptr != NULL ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - HDassert( cache_ptr->mdj_enabled ); - - if ( cache_ptr->trans_in_progress ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "Transaction in progress during flush?!?!?.") - } - - result = H5C2_jb__flush(&(cache_ptr->mdj_jbrb)); - - if ( result != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_jb__flush() failed.") - } - - result = H5C2_jb__get_last_transaction_on_disk(&(cache_ptr->mdj_jbrb), - &new_last_trans_on_disk); - if ( result != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_jb__get_last_transaction_on_disk() failed.") - } - - if ( cache_ptr->last_trans_on_disk < new_last_trans_on_disk ) { - - result = H5C2_update_for_new_last_trans_on_disk(cache_ptr, - new_last_trans_on_disk); - - if ( result != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_update_for_new_last_trans_on_disk() failed.") - } - } - - if ( cache_ptr->jwipl_len != 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "journal write in progress list isn't empty?!?!.") - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_journal_pre_flush() */ - - -/*------------------------------------------------------------------------- - * Function: H5C2_journal_transaction() - * - * Purpose: Generate journal messages for the current transaction. - * In passing, remove all entries from the transaction list. - * - * Return: Success: SUCCEED - * Failure: FAIL - * - * Programmer: John Mainzer - * April 3, 2008 - * - *------------------------------------------------------------------------- - */ - -herr_t -H5C2_journal_transaction(H5F_t * f, - hid_t dxpl_id, - H5C2_t * cache_ptr) - -{ - char buf[H5C2__MAX_API_NAME_LEN + 128]; - hbool_t resized; - hbool_t renamed; - H5C2_cache_entry_t * entry_ptr = NULL; - unsigned serialize_flags = 0; - haddr_t new_addr; - size_t new_len; - void * new_image_ptr; - void * thing; - 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 ); - HDassert( cache_ptr->trans_in_progress ); - HDassert( cache_ptr->tl_len > 0 ); - - HDsnprintf(buf, H5C2__MAX_API_NAME_LEN + 128, "Begin transaction on %s.", - cache_ptr->trans_api_name); - - result = H5C2_jb__comment(&(cache_ptr->mdj_jbrb), buf); - - if ( result != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_jb__comment() failed.") - } - - result = H5C2_jb__start_transaction(&(cache_ptr->mdj_jbrb), - cache_ptr->trans_num); - - if ( result != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_jb__start_transaction() failed.") - } - - entry_ptr = cache_ptr->tl_tail_ptr; - while ( entry_ptr != NULL ) - { - HDassert( entry_ptr->is_dirty ); - HDassert( entry_ptr->last_trans == cache_ptr->trans_num ); - - resized = FALSE; - renamed = FALSE; - - if ( entry_ptr->is_protected ) - { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "Protected entry in TL at transaction close.") - } - - if ( entry_ptr->image_ptr == NULL ) - { - entry_ptr->image_ptr = H5MM_malloc(entry_ptr->size); - - if ( entry_ptr->image_ptr == NULL ) - { - - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \ - "memory allocation failed for on disk image buffer.") - } - } - - /* 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). - */ - if ( ! ( entry_ptr->image_up_to_date ) ) { - - result = entry_ptr->type->serialize(f, - dxpl_id, - entry_ptr->addr, - entry_ptr->size, - entry_ptr->image_ptr, - (void *)entry_ptr, - &serialize_flags, - &new_addr, - &new_len, - &new_image_ptr); - - if ( result != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "unable to serialize entry") - } - - if ( serialize_flags != 0 ) { - - /* 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 - * handle it later. - */ - - resized = - (hbool_t)((serialize_flags & H5C2__SERIALIZE_RESIZED_FLAG) != 0); - renamed = - (hbool_t)((serialize_flags & H5C2__SERIALIZE_RENAMED_FLAG) != 0); - - if ( ( renamed ) && ( ! resized ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "entry renamed but not resized?!?!") - } - - if ( resized ) - { - /* in the following protect/unprotect, the dxpl_id - * is irrelement, as we know that the entry is in cache, - * and thus no I/O will take place. - */ - thing = H5C2_protect(f, dxpl_id, - entry_ptr->type, entry_ptr->addr, - entry_ptr->size, NULL, - H5C2__NO_FLAGS_SET); - - if ( thing == NULL ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_protect() failed.") - } - - result = H5C2_unprotect(f, dxpl_id, - entry_ptr->type, entry_ptr->addr, - thing, H5C2__SIZE_CHANGED_FLAG, - new_len); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_unprotect() failed.") - } - - entry_ptr->image_ptr = new_image_ptr; - } - - if ( renamed ) { - - result = H5C2_rename_entry(cache_ptr, entry_ptr->type, - entry_ptr->addr, new_addr); - - if ( result < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_rename_entr() failed.") - } - } - } - - entry_ptr->image_up_to_date = TRUE; - } - - /* if the entry hasn't been either resized or renamed, generate - * 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, - (uint8_t *)(entry_ptr->image_ptr)); - - if ( result != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_jb__journal_entry() failed.") - } - - H5C2__TRANS_DLL_REMOVE(entry_ptr, cache_ptr->tl_head_ptr, \ - cache_ptr->tl_tail_ptr, cache_ptr->tl_len, \ - cache_ptr->tl_size, FAIL); - } - entry_ptr = cache_ptr->tl_tail_ptr; - } - - result = H5C2_jb__end_transaction(&(cache_ptr->mdj_jbrb), - cache_ptr->trans_num); - - if ( result != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_jb__end_transaction() failed.") - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_journal_transaction() */ - - -/*------------------------------------------------------------------------- - * Function: H5C2_update_for_new_last_trans_on_disk() - * - * 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 - * *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 - * these entries from the journal write in progress list, - * set their last_trans fields to zero, and insert then into - * the eviction policy data structures. - * - * Similarly, scan the pinned entry list for entries whose - * 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 - * ceases to be the case, we will have re-visit this case. - * - * Return: Success: SUCCEED - * Failure: FAIL - * - * Programmer: John Mainzer - * April 3, 2008 - * - *------------------------------------------------------------------------- - */ - -herr_t -H5C2_update_for_new_last_trans_on_disk(H5C2_t * cache_ptr, - uint64_t new_last_trans_on_disk) -{ - H5C2_cache_entry_t * entry_ptr = NULL; - H5C2_cache_entry_t * prev_entry_ptr = NULL; - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5C2_update_for_new_last_trans_on_disk, FAIL) - - HDassert( cache_ptr != NULL ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - HDassert( cache_ptr->mdj_enabled ); - HDassert( cache_ptr->last_trans_on_disk <= new_last_trans_on_disk ); - - if ( cache_ptr->last_trans_on_disk < new_last_trans_on_disk ) { - - cache_ptr->last_trans_on_disk = new_last_trans_on_disk; - - entry_ptr = cache_ptr->jwipl_tail_ptr; - - while ( entry_ptr != NULL ) - { - prev_entry_ptr = entry_ptr->prev; - - HDassert( entry_ptr->last_trans > 0 ); - HDassert( entry_ptr->is_dirty ); - - if ( entry_ptr->last_trans <= cache_ptr->last_trans_on_disk ) { - - entry_ptr->last_trans = 0; - H5C2__UPDATE_RP_FOR_JOURNAL_WRITE_COMPLETE(cache_ptr, \ - entry_ptr, \ - FAIL) - } - - entry_ptr = prev_entry_ptr; - } - - /* now scan the pinned entry list */ - - entry_ptr = cache_ptr->pel_head_ptr; - - while ( entry_ptr != NULL ) { - - if ( entry_ptr->last_trans > 0 ) { - - HDassert( entry_ptr->is_dirty ); - - if ( entry_ptr->last_trans <= cache_ptr->last_trans_on_disk ) { - - entry_ptr->last_trans = 0; - } - } - entry_ptr = entry_ptr->next; - } - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_update_for_new_last_trans_on_disk() */ - - -/**************************************************************************/ -/************* superblock journaling message management code **************/ -/**************************************************************************/ - -/*------------------------------------------------------------------------- - * Function: H5C2_check_for_journaling() - * - * 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 - * 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 - * superblock extension. - * - * JRM -- 3/26/08 - * - * Return: Success: SUCCEED - * Failure: FAIL - * - * Programmer: John Mainzer - * March 26, 2008 - * - *------------------------------------------------------------------------- - */ - -herr_t -H5C2_check_for_journaling(H5F_t * f, - hid_t dxpl_id, - H5C2_t * cache_ptr, - hbool_t journal_recovered) -{ - const char * l0 = - "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 = - "journal recovery tool on this file. The journal was written \n"; - const char * l3 = "to \""; - const char * l4 = "\".\n"; - herr_t result; - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5C2_check_for_journaling, FAIL) - - HDassert( f ); - HDassert( cache_ptr ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - HDassert( cache_ptr->jnl_magic == 0 ); - HDassert( cache_ptr->jnl_file_name_len == 0 ); - - if ( H5C2__check_for_journaling ) { - - result = H5C2_get_journaling_in_progress(f, cache_ptr); - - if ( result != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_get_journaling_in_progress() failed.") - } - - if ( cache_ptr->jnl_file_name_len > 0 ) { /* journaling was in */ - /* progress */ - - if ( journal_recovered ) { - - /* Just forget that we were journaling. Do this by - * deleting the superblock extension message that says - * we were. - */ - - result = H5C2_unmark_journaling_in_progress(f, - dxpl_id, - cache_ptr); - - if ( result != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_unmark_journaling_in_progress() failed.") - } - } 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() - * 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, - cache_ptr->jnl_file_name, l4); - (void)H5E_dump_api_stack((int)H5_IS_API(FUNC)); - HGOTO_DONE(FAIL) - - } - } - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_check_for_journaling() */ - - -/*------------------------------------------------------------------------- - * 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 - * configuration fields in the cache structure accordingly. - * - * At least initially, the purpose of this function is - * to examine a newly opened HDF5 file, and determine - * whether journaling was enabled. If so, we can presume - * that the application crashed while journaling, and that - * we must refuse to open the file until the user runs the - * recovery utility on it. - * - * Hwever, this logic will be handled at a higher level. - * In this function, we just get the journaling configuration - * (if any) that has been saved in the file, and load it - * into *cache_ptr. - * - * Note that this function assumes that *cache_ptr has - * no journaling configuration set before the function - * is called. - * - * Return: Success: SUCCEED - * Failure: FAIL - * - * Programmer: John Mainzer - * 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 - * the metadata journaling superblock extension message. - * Note that the journaling configuration block no longer - * exists. - * - *------------------------------------------------------------------------- - */ - -herr_t -H5C2_get_journaling_in_progress(const H5F_t * f, - H5C2_t * cache_ptr) -{ - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI_NOINIT(H5C2_get_journaling_in_progress) - - HDassert( f ); - HDassert( f->shared != NULL ); - HDassert( cache_ptr ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - HDassert( cache_ptr->jnl_file_name_len == 0 ); - - if ( f->shared->mdc_jnl_enabled == TRUE ) { - - if ( f->shared->mdc_jnl_file_name_len <= 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "journaling enabled but jnl file name empty?!?.") - } - - if ( f->shared->mdc_jnl_file_name_len > - H5C2__MAX_JOURNAL_FILE_NAME_LEN ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "journal file name too long?!?.") - } - - cache_ptr->jnl_magic = f->shared->mdc_jnl_magic; - 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) != - (size_t)(cache_ptr->jnl_file_name_len) ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "bad jnl file name or name len?!?.") - } - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_get_journaling_in_progress() */ - - -/*------------------------------------------------------------------------- - * Function: H5C2_mark_journaling_in_progress() - * - * 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 - * close the file properly. - * - * Note that the function assumes that the file is not - * currently marked as having journaling in progress. - * - * Return: Success: SUCCEED - * Failure: FAIL - * - * Programmer: John Mainzer - * March 11, 2008 - * - * Changes: JRM -- 2/10/09 - * Added the journal_magic parameter and related code. - * - * JRM -- 2/20/09 - * Reworked function to reflect the move of the journal - * file name and magic to the super block extension message - * and out of the metadata journaling configuration block - * which no longer exists. - * - *------------------------------------------------------------------------- - */ - -herr_t -H5C2_mark_journaling_in_progress(H5F_t * f, - hid_t dxpl_id, - const int32_t journal_magic, - const char * journal_file_name_ptr) -{ - H5C2_t * cache_ptr; - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5C2_mark_journaling_in_progress, FAIL) - - HDassert( f != NULL ); - HDassert( f->shared != NULL ); - HDassert( ! f->shared->mdc_jnl_enabled ); - - cache_ptr = f->shared->cache2; - - HDassert( cache_ptr ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - HDassert( cache_ptr->jnl_file_name_len == 0 ); - HDassert( journal_file_name_ptr != NULL ); - - /* Can't journal a read only file, so verify that we are - * opened read/write and fail if we are not. - */ - if ( (f->shared->flags & H5F_ACC_RDWR) == 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "File is opened read only.") - } - - cache_ptr->jnl_magic = journal_magic; - cache_ptr->jnl_file_name_len = (int32_t)HDstrlen(journal_file_name_ptr); - - if ( cache_ptr->jnl_file_name_len <= 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "length of journal file name is zero.") - } - - if ( cache_ptr->jnl_file_name_len > H5C2__MAX_JOURNAL_FILE_NAME_LEN ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "journal file name too long.") - } - - HDstrncpy(cache_ptr->jnl_file_name, - journal_file_name_ptr, - (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. - */ - f->shared->mdc_jnl_enabled = TRUE; - f->shared->mdc_jnl_magic = journal_magic; - f->shared->mdc_jnl_file_name_len = (size_t)(cache_ptr->jnl_file_name_len); - HDstrncpy(f->shared->mdc_jnl_file_name, - journal_file_name_ptr, - (size_t)(cache_ptr->jnl_file_name_len + 1)); - - if ( H5F_super_write_mdj_msg(f, dxpl_id) < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5F_super_write_mdj_msg() failed.") - } - - /* Finally, flush the file to ensure that changes made it to disk. */ - - if ( H5F_flush(f, dxpl_id, H5F_SCOPE_GLOBAL, H5F_FLUSH_NONE) < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, "H5F_flush() failed.") - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_mark_journaling_in_progress() */ - - -/*------------------------------------------------------------------------- - * 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. - * - * 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 - * journaling. Once these messages are removed, we will - * be able to open the file without triggering a "journaling - * in progress" failure. - * - * Note that the function assumes that the file is - * currently marked as having journaling in progress. - * - * Return: Success: SUCCEED - * Failure: FAIL - * - * Programmer: John Mainzer - * March 11, 2008 - * - * Changes: JRM -- 2/20/09 - * 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 - * exists. - * - *------------------------------------------------------------------------- - */ - -herr_t -H5C2_unmark_journaling_in_progress(H5F_t * f, - hid_t dxpl_id, -#ifndef NDEBUG - H5C2_t * cache_ptr) -#else /* NDEBUG */ - H5C2_t UNUSED * cache_ptr) -#endif /* NDEBUG */ -{ - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5C2_unmark_journaling_in_progress, FAIL) - - HDassert( f != NULL ); - HDassert( f->shared != NULL ); - HDassert( f->shared->mdc_jnl_enabled ); - HDassert( f->shared->cache2 == cache_ptr ); - HDassert( cache_ptr ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - HDassert( cache_ptr->jnl_file_name_len > 0 ); - - - /* Can't journal a read only file, so verify that we are - * opened read/write and fail if we are not. - */ - if ( (f->shared->flags & H5F_ACC_RDWR) == 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "File is opened read only.") - } - - /* Discard the journal file name and magic in *cache_ptr */ - cache_ptr->jnl_magic = 0; - 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 - * progress, and then call H5F_super_write_mdj_msg() to write - * the changes to disk. - */ - f->shared->mdc_jnl_enabled = FALSE; - f->shared->mdc_jnl_magic = 0; - f->shared->mdc_jnl_file_name_len = 0; - (f->shared->mdc_jnl_file_name)[0] = '\0'; - - if ( H5F_super_write_mdj_msg(f, dxpl_id) < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5F_super_write_mdj_msg() failed.") - } - - /* Finally, flush the file to ensure that changes made it to disk. */ - - if ( H5F_flush(f, dxpl_id, H5F_SCOPE_GLOBAL, H5F_FLUSH_NONE) < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, "H5F_flush() failed.") - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_unmark_journaling_in_progress() */ - - -/**************************************************************************/ -/****** metadata journaling status change callback management code ********/ -/**************************************************************************/ - -/*------------------------------------------------------------------------- - * Function: H5C2_call_mdjsc_callbacks() - * - * Purpose: Call the metadata journaling status change callbacks. - * - * Return: Success: SUCCEED - * Failure: FAIL - * - * Programmer: John Mainzer - * August 15, 2008 - * - *------------------------------------------------------------------------- - */ - -static herr_t -H5C2_call_mdjsc_callbacks(H5C2_t * cache_ptr, - hid_t dxpl_id, - H5C2_mdj_config_t * config_ptr) -{ - herr_t ret_value = SUCCEED; /* Return value */ - int32_t i; - int32_t funcs_called = 0; - H5C2_mdj_status_change_func_t func_ptr; - void * data_ptr; - - FUNC_ENTER_NOAPI_NOINIT(H5C2_call_mdjsc_callbacks) - - HDassert( cache_ptr != NULL ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - HDassert( cache_ptr->mdjsc_cb_tbl != NULL ); - HDassert( cache_ptr->mdjsc_cb_tbl_len >= H5C2__MIN_MDJSC_CB_TBL_LEN ); - 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 ) - || - ( 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 > 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 >= - cache_ptr->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_max_idx_in_use != - cache_ptr->mdjsc_cb_tbl_len - 1 ) - ) - ) - || - ( ( cache_ptr->num_mdjsc_cbs < cache_ptr->mdjsc_cb_tbl_len ) - && - ( cache_ptr->mdjsc_cb_tbl_fl_head < 0 ) - ) - ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "mdjsc_cb_tbl corrupt(1)?!?!"); - } - - for ( i = 0; i <= cache_ptr->mdjsc_cb_tbl_max_idx_in_use; i++ ) - { - if ( ((cache_ptr->mdjsc_cb_tbl)[i]).fcn_ptr != NULL ) { - - func_ptr = ((cache_ptr->mdjsc_cb_tbl)[i]).fcn_ptr; - data_ptr = ((cache_ptr->mdjsc_cb_tbl)[i]).data_ptr; - - /* Try the callback */ - if(func_ptr(config_ptr, dxpl_id, data_ptr) < 0) - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "metadata journaling status change callback failed!"); - - funcs_called++; - } - } - - if ( funcs_called != cache_ptr->num_mdjsc_cbs ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "funcs_called != cache_ptr->num_mdjsc_cbs."); - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_call_mdjsc_callbacks() */ - - -/*------------------------------------------------------------------------- - * Function: H5C2_deregister_mdjsc_callback() - * - * Purpose: Deregister a metadata journaling status change callback, - * shrinking the metadata journaling status callback table - * as necessary. - * - * Return: Success: SUCCEED - * Failure: FAIL - * - * Programmer: John Mainzer - * August 15, 2008 - * - *------------------------------------------------------------------------- - */ - -herr_t -H5C2_deregister_mdjsc_callback(H5C2_t * cache_ptr, - int32_t idx) -{ - herr_t ret_value = SUCCEED; /* Return value */ - int32_t i; - double fraction_in_use; - - FUNC_ENTER_NOAPI(H5C2_deregister_mdjsc_callback, FAIL) - - if ( ( cache_ptr == NULL ) || - ( cache_ptr->magic != H5C2__H5C2_T_MAGIC ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "cache_ptr corrupt?!?"); - } - - if ( ( cache_ptr->mdjsc_cb_tbl == NULL ) || - ( ( 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->num_mdjsc_cbs != cache_ptr->mdjsc_cb_tbl_len ) ) || - ( cache_ptr->mdjsc_cb_tbl_len < H5C2__MIN_MDJSC_CB_TBL_LEN ) || - ( cache_ptr->mdjsc_cb_tbl_fl_head >= 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->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)?!?!"); - } - - if ( cache_ptr->num_mdjsc_cbs <= 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "mdjsc_cb_tbl empty(1)!?!"); - } - - if ( ( idx < 0 ) || - ( idx >= cache_ptr->mdjsc_cb_tbl_len ) || - ( idx > cache_ptr->mdjsc_cb_tbl_max_idx_in_use ) ) { - - 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_fl_head; - cache_ptr->mdjsc_cb_tbl_fl_head = idx; - (cache_ptr->num_mdjsc_cbs)--; - - if ( cache_ptr->num_mdjsc_cbs == 0 ) { - - cache_ptr->mdjsc_cb_tbl_max_idx_in_use = -1; - - } else if ( idx == cache_ptr->mdjsc_cb_tbl_max_idx_in_use ) { - - i = idx; - - while ( ( i >= 0 ) && - ( ((cache_ptr->mdjsc_cb_tbl)[i]).fcn_ptr == NULL ) ) { - - i--; - } - - if ( i < 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "mdjsc_cb_tbl empty(2)!?!"); - } - - cache_ptr->mdjsc_cb_tbl_max_idx_in_use = i; - } - - 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 > 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->mdjsc_cb_tbl_max_idx_in_use != -1 ) - ) - ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "mdjsc_cb_tbl corrupt(2)?!?!"); - } - - fraction_in_use = ((double)(cache_ptr->num_mdjsc_cbs)) / - ((double)(cache_ptr->mdjsc_cb_tbl_len)); - - 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_len / 2) ) ) { - herr_t result; - - result = H5C2_shrink_mdjsc_callback_table(cache_ptr); - - if ( result != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "H5C2_shrink_mdjsc_callback_table() failed."); - } - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_deregister_mdjsc_callback() */ - - -/*------------------------------------------------------------------------- - * Function: H5C2_grow_mdjsc_callback_table() - * - * Purpose: Double the size of the the metadata journaling status - * change callback table. Note that the table is assumed - * to be full on entry. - * - * Return: Success: SUCCEED - * Failure: FAIL - * - * Programmer: John Mainzer - * August 15, 2008 - * - *------------------------------------------------------------------------- - */ - -static herr_t -H5C2_grow_mdjsc_callback_table(H5C2_t * cache_ptr) -{ - herr_t ret_value = SUCCEED; /* Return value */ - int32_t i; - int32_t old_mdjsc_cb_tbl_len; - int64_t new_mdjsc_cb_tbl_len; - H5C2_mdjsc_record_t * old_mdjsc_cb_tbl = NULL; - H5C2_mdjsc_record_t * new_mdjsc_cb_tbl = NULL; - - FUNC_ENTER_NOAPI_NOINIT(H5C2_grow_mdjsc_callback_table) - - HDassert( cache_ptr != NULL ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - HDassert( cache_ptr->mdjsc_cb_tbl != NULL ); - HDassert( cache_ptr->mdjsc_cb_tbl_len >= H5C2__MIN_MDJSC_CB_TBL_LEN ); - HDassert( cache_ptr->mdjsc_cb_tbl_fl_head == -1 ); - HDassert( cache_ptr->num_mdjsc_cbs == cache_ptr->mdjsc_cb_tbl_len ); - - 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_len - 1 ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "unexpected mdjsc_cb_tbl status."); - } - - old_mdjsc_cb_tbl = cache_ptr->mdjsc_cb_tbl; - 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 = (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, \ - "can't alloc new mdjsc_cb_tbl.") - } - - for ( i = 0; i < old_mdjsc_cb_tbl_len; i++ ) - { - new_mdjsc_cb_tbl[i] = old_mdjsc_cb_tbl[i]; - } - - for ( i = old_mdjsc_cb_tbl_len; i < new_mdjsc_cb_tbl_len; i++ ) - { - new_mdjsc_cb_tbl[i].fcn_ptr = NULL; - new_mdjsc_cb_tbl[i].data_ptr = NULL; - new_mdjsc_cb_tbl[i].fl_next = i + 1; - } - new_mdjsc_cb_tbl[new_mdjsc_cb_tbl_len - 1].fl_next = -1; - - cache_ptr->mdjsc_cb_tbl = new_mdjsc_cb_tbl; - 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 = (H5C2_mdjsc_record_t *)H5MM_xfree(old_mdjsc_cb_tbl); - - if ( old_mdjsc_cb_tbl != NULL ) { - - HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, \ - "free of old_mdjsc_cb_tbl failed."); - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_grow_mdjsc_callback_table() */ - - -/*------------------------------------------------------------------------- - * - * Function: H5C2_register_mdjsc_callback() - * - * Purpose: Register a metadata journaling status change callback, - * growing the metadata journaling status callback table - * as necessary. - * - * Return: Success: SUCCEED - * Failure: FAIL - * - * Programmer: John Mainzer - * August 15, 2008 - * - *------------------------------------------------------------------------- - */ - -herr_t -H5C2_register_mdjsc_callback(H5C2_t * cache_ptr, - H5C2_mdj_status_change_func_t fcn_ptr, - void * data_ptr, - int32_t * idx_ptr) -{ - herr_t result; - herr_t ret_value = SUCCEED; /* Return value */ - int32_t i; - - FUNC_ENTER_NOAPI(H5C2_register_mdjsc_callback, FAIL) - - if ( ( cache_ptr == NULL ) || - ( cache_ptr->magic != H5C2__H5C2_T_MAGIC ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "bad cache_ptr on entry"); - } - - if ( cache_ptr->mdjsc_cb_tbl == NULL ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "cache_ptr->mdjsc_cb_tbl == NULL") - } - - if ( cache_ptr->mdjsc_cb_tbl_len < H5C2__MIN_MDJSC_CB_TBL_LEN ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "cache_ptr->mdjsc_cb_tbl_len too small") - } - - if ( ( cache_ptr->mdjsc_cb_tbl_fl_head == -1 ) && - ( cache_ptr->num_mdjsc_cbs < cache_ptr->mdjsc_cb_tbl_len ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "mdjsc callback table corrupt?") - } - - if ( fcn_ptr == NULL ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "fcn_ptr NULL on entry") - } - - if ( idx_ptr == NULL ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "idx_ptr NULL on entry") - } - - if ( cache_ptr->mdjsc_cb_tbl_len <= cache_ptr->num_mdjsc_cbs ) { - - result = H5C2_grow_mdjsc_callback_table(cache_ptr); - - if ( result != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "H5C2_grow_mdjsc_callback_table() failed."); - } - } - - if ( ( 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 >= cache_ptr->mdjsc_cb_tbl_len ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "mdjsc_cb_tbl corrupt(1)?!?!"); - } - - i = cache_ptr->mdjsc_cb_tbl_fl_head; - - cache_ptr->mdjsc_cb_tbl_fl_head = ((cache_ptr->mdjsc_cb_tbl)[i]).fl_next; - (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->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 >= cache_ptr->mdjsc_cb_tbl_len ) - ) - ) - ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "mdjsc_cb_tbl corrupt(2)?!?!"); - } - - ((cache_ptr->mdjsc_cb_tbl)[i]).fcn_ptr = fcn_ptr; - ((cache_ptr->mdjsc_cb_tbl)[i]).data_ptr = data_ptr; - ((cache_ptr->mdjsc_cb_tbl)[i]).fl_next = -1; - - if ( i > cache_ptr->mdjsc_cb_tbl_max_idx_in_use ) { - - cache_ptr->mdjsc_cb_tbl_max_idx_in_use = i; - } - - *idx_ptr = i; - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_register_mdjsc_callback() */ - - -/*------------------------------------------------------------------------- - * Function: H5C2_shrink_mdjsc_callback_table() - * - * Purpose: Half the size of the the metadata journaling status - * change callback table. Note that the table is assumed - * to be: - * - * 1) Not more than H5C2__MDJSC_CB_TBL_MIN_ACTIVE_RATIO * 100 - * percent full. - * - * 2) Of size H5C2__MIN_MDJSC_CB_TBL_LEN * 2 ** n, where - * n is a positive integer. - * - * 3) Contain no entries at index greater than or equal to - * cache_ptr->mdjsc_cb_tbl_len / 2. - * - * Return: Success: SUCCEED - * Failure: FAIL - * - * Programmer: John Mainzer - * August 15, 2008 - * - *------------------------------------------------------------------------- - */ - -static herr_t -H5C2_shrink_mdjsc_callback_table(H5C2_t * cache_ptr) -{ - herr_t ret_value = SUCCEED; /* Return value */ - int32_t i; - int32_t old_mdjsc_cb_tbl_len; - int32_t new_mdjsc_cb_tbl_len; - int32_t new_fl_head = -1; - int32_t last_free_entry = -1; - double fraction_in_use; - H5C2_mdjsc_record_t * old_mdjsc_cb_tbl = NULL; - H5C2_mdjsc_record_t * new_mdjsc_cb_tbl = NULL; - - FUNC_ENTER_NOAPI_NOINIT(H5C2_shrink_mdjsc_callback_table) - - HDassert( cache_ptr != NULL ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - HDassert( cache_ptr->mdjsc_cb_tbl != NULL ); - HDassert( cache_ptr->mdjsc_cb_tbl_len > H5C2__MIN_MDJSC_CB_TBL_LEN ); - HDassert( cache_ptr->mdjsc_cb_tbl_fl_head >= 0); - HDassert( cache_ptr->num_mdjsc_cbs < cache_ptr->mdjsc_cb_tbl_len / 2 ); - - fraction_in_use = ((double)(cache_ptr->num_mdjsc_cbs)) / - ((double)(cache_ptr->mdjsc_cb_tbl_len)); - - 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_len / 2 ) || - ( fraction_in_use >= H5C2__MDJSC_CB_TBL_MIN_ACTIVE_RATIO ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "unexpected mdjsc_cb_tbl status."); - } - - old_mdjsc_cb_tbl = cache_ptr->mdjsc_cb_tbl; - old_mdjsc_cb_tbl_len = cache_ptr->mdjsc_cb_tbl_len; - - 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)) <= - H5C2__MDJSC_CB_TBL_MIN_ACTIVE_RATIO ) && - ( (new_mdjsc_cb_tbl_len / 2) > - cache_ptr->mdjsc_cb_tbl_max_idx_in_use ) ) - { - new_mdjsc_cb_tbl_len /= 2; - } - - if ( ( new_mdjsc_cb_tbl_len < H5C2__MIN_MDJSC_CB_TBL_LEN ) || - ( new_mdjsc_cb_tbl_len < cache_ptr->mdjsc_cb_tbl_max_idx_in_use ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "error in computation of new_mdjsc_cb_tbl_len?!?!"); - } - - 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, \ - "can't alloc new mdjsc_cb_tbl.") - } - - /* now copy over the table, constructing the free list as we go */ - - for ( i = 0; i < new_mdjsc_cb_tbl_len; i++ ) - { - if ( old_mdjsc_cb_tbl[i].fcn_ptr == NULL ) { - - 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; - last_free_entry = i; - - } else { - - new_mdjsc_cb_tbl[last_free_entry].fl_next = i; - last_free_entry = i; - } - } else { - - new_mdjsc_cb_tbl[i] = old_mdjsc_cb_tbl[i]; - - } - } - - if ( new_fl_head == -1 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "table full after shrink!?!."); - - } - - cache_ptr->mdjsc_cb_tbl = new_mdjsc_cb_tbl; - 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 = ( H5C2_mdjsc_record_t *)H5MM_xfree(old_mdjsc_cb_tbl); - - if ( old_mdjsc_cb_tbl != NULL ) { - - HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, \ - "free of old_mdjsc_cb_tbl failed."); - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_shrink_mdjsc_callback_table() */ - - -/**************************************************************************/ -/********************** journal file management code **********************/ -/**************************************************************************/ - -/* 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 - * 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, \ - is_end_trans, \ - trans_num, \ - fail_return) \ -if ( H5C2_jb_bjf__write_buffer((struct_ptr), (buf_size), (buf_ptr), \ - (is_end_trans), (trans_num)) != SUCCEED ) { \ - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, (fail_return), \ - "H5C2_jb_bjf__write_buffer() failed."); \ -} - -#define H5C2_jb_BJF__WRITE_CHKSUM(struct_ptr, \ - is_end_trans, \ - trans_num, \ - fail_return) \ -if ( H5C2_jb_bjf__write_chksum((struct_ptr), (is_end_trans), (trans_num)) \ - != SUCCEED ) { \ - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, (fail_return), \ - "H5C2_jb_bjf__write_chksum() failed."); \ -} - -#define H5C2_JB_BJF__WRITE_LENGTH(struct_ptr, \ - length, \ - is_end_trans, \ - trans_num, \ - fail_return) \ -if ( H5C2_jb_bjf__write_length((struct_ptr), (length), (is_end_trans), \ - (trans_num)) != SUCCEED ) { \ - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, (fail_return), \ - "H5C2_jb_bjf__write_length() failed."); \ -} - -#define H5C2_JB_BJF__WRITE_OFFSET(struct_ptr, \ - offset, \ - is_end_trans, \ - trans_num, \ - fail_return) \ -if ( H5C2_jb_bjf__write_offset((struct_ptr), (offset), (is_end_trans), \ - (trans_num)) != SUCCEED ) { \ - HDfprintf(stdout, "%s: H5C2_jb_bjf__write_offset() failed.\n", FUNC); \ - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, (fail_return), \ - "H5C2_jb_bjf__write_offset() failed."); \ -} - -#define H5C2_JB_BJF__WRITE_SIG_AND_VER(struct_ptr, \ - sig_ptr, \ - version, \ - keep_chksum, \ - is_end_trans, \ - trans_num, \ - fail_return) \ -if(H5C2_jb_bjf__write_sig_and_ver((struct_ptr), (sig_ptr), (version), \ - (keep_chksum), (is_end_trans), (trans_num)) < 0) { \ - HDfprintf(stdout, "%s: H5C2_jb_bjf__write_sig_and_ver() failed.\n", FUNC); \ - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, (fail_return), "H5C2_jb_bjf__write_sig_and_ver() failed.") \ -} - -#define H5C2_JB_BJF__WRITE_TRANS_NUM(struct_ptr, \ - is_end_trans, \ - trans_num, \ - fail_return) \ -if ( H5C2_jb_bjf__write_trans_num((struct_ptr), (is_end_trans), \ - (trans_num)) != SUCCEED ) { \ - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, (fail_return), \ - "H5C2_jb_bjf__write_trans_num() failed."); \ -} - - -/****************************************************************************** - * - * 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 - * a no-op. Thus in this function, we simply verify - * that we are in fact writing a binary journal file, - * and then return. - * - * Returns: SUCCEED on success. - * - ******************************************************************************/ - -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 ); - HDassert( comment_ptr != NULL ); - - /* the following really should be an assert, but the FUNC ENTER/LEAVE - * macros are happier if we have at least one call to HGOTO_ERROR(). - */ - - if ( struct_ptr->human_readable ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "human_readable is TRUE?!?!\n") - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_jb_bjf__comment() */ - - -/***************************************************************************** - * - * Function: H5C2_jb_bjf__end_transaction - * - * Programmer: John Mainzer - * - * Purpose: Verify that the supplied transaction is in progress, - * and that at least one journal entry has been written - * under it. - * - * Then write an end transaction message to the ring - * buffer. - * - * Make note that the supplied transaction is closed, - * and that no transaction is in progress. - * - * Returns: SUCCEED on success. - * - * Changes: None. - * - *****************************************************************************/ - -static herr_t -H5C2_jb_bjf__end_transaction(H5C2_jbrb_t * struct_ptr, - uint64_t trans_num) -{ - herr_t ret_value = SUCCEED; - - FUNC_ENTER_NOAPI(H5C2_jb_bjf__end_transaction, FAIL) - - /* Check Arguments */ - 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 ) ) { - - 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 - */ - if ( struct_ptr->jentry_written != TRUE ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "Empty transaction -- at least one journal entry required.") - } /* end if */ - - /* Write end transaction message */ - H5C2_JB_BJF__WRITE_SIG_AND_VER(struct_ptr, \ - H5C2_BJNL__END_TRANS_SIG, \ - H5C2_BJNL__END_TRANS_VER, \ - /* keep_chksum */ FALSE, \ - /* is_end_trans */ FALSE, \ - trans_num, \ - /* fail_return */ FAIL) - - H5C2_JB_BJF__WRITE_TRANS_NUM(struct_ptr, \ - /* is_end_trans */ TRUE, \ - trans_num, \ - /* fail_return */ FAIL) - - /* reset boolean flag indicating that at least one journal entry has - * been written under transaction - */ - struct_ptr->jentry_written = FALSE; - - /* Close current transaction */ - struct_ptr->trans_in_prog = FALSE; - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* end H5C2_jb_bjf__end_transaction */ - - -/****************************************************************************** - * - * Function: H5C2_jb_bjf__eoa - * - * Programmer: John Mainzer - * - * 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 - * 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. - * - * Returns: SUCCEED on success. - * - * Changes: None. - * - ******************************************************************************/ - -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. - */ - 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 */ - - /* 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. - */ - - /* Write EOA message */ - H5C2_JB_BJF__WRITE_SIG_AND_VER(struct_ptr, \ - H5C2_BJNL__END_ADDR_SPACE_SIG, \ - H5C2_BJNL__END_ADDR_SPACE_VER, \ - /* keep_chksum */ FALSE, \ - /* is_end_trans */ FALSE, \ - struct_ptr->cur_trans, \ - /* fail_return */ FAIL) - - H5C2_JB_BJF__WRITE_OFFSET(struct_ptr, \ - eoa, \ - /* is_end_trans */ FALSE, \ - struct_ptr->cur_trans, \ - /* fail_return */ FAIL) - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* end H5C2_jb_bjf__eoa */ - - -/****************************************************************************** - * - * Function: H5C2_jb_bjf__journal_entry - * - * Programmer: John Mainzer - * - * Purpose: Verify that the specified transaction is open. Then - * write a binary journal file message to the ring buffer. - * - * Returns: SUCCEED on success. - * - ******************************************************************************/ - -static herr_t -H5C2_jb_bjf__journal_entry(H5C2_jbrb_t * struct_ptr, - uint64_t trans_num, - haddr_t base_addr, - size_t length, - const uint8_t * body) -{ - herr_t ret_value = SUCCEED; - - FUNC_ENTER_NOAPI(H5C2_jb_bjf__journal_entry, FAIL) - - /* Check Arguments */ - HDassert(struct_ptr); - 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 ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "Transaction not in progress or bad transaction number.") - } /* end if */ - - H5C2_JB_BJF__WRITE_SIG_AND_VER(struct_ptr, \ - H5C2_BJNL__JOURNAL_ENTRY_SIG, \ - H5C2_BJNL__JOURNAL_ENTRY_VER, \ - /* keep_chksum */ TRUE, \ - /* is_end_trans */ FALSE, \ - trans_num, \ - /* fail_return */ FAIL) - - H5C2_JB_BJF__WRITE_TRANS_NUM(struct_ptr, \ - /* is_end_trans */ FALSE, \ - trans_num, \ - /* fail_return */ FAIL) - - H5C2_JB_BJF__WRITE_OFFSET(struct_ptr, \ - base_addr, \ - /* is_end_trans */ FALSE, \ - trans_num, \ - /* fail_return */ FAIL) - - H5C2_JB_BJF__WRITE_LENGTH(struct_ptr, \ - length, \ - /* is_end_trans */ FALSE, \ - trans_num, \ - /* fail_return */ FAIL) - - H5C2_JB_BJF__WRITE_BUFFER(struct_ptr, \ - /* buf_size */ length, \ - /* buf_ptr */ (const char *)body, \ - /* is_end_trans */ FALSE, \ - trans_num, \ - /* fail_return */ FAIL) - - H5C2_jb_BJF__WRITE_CHKSUM(struct_ptr, \ - /* is_end_trans */ FALSE, \ - trans_num, \ - /* fail_return */ FAIL) - - /* Indicate that at least one journal entry has been written under - * this transaction - */ - struct_ptr->jentry_written = TRUE; - - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_jb_bjf__journal_entry() */ - - -/****************************************************************************** - * - * Function: H5C2_jb_bjf__start_transaction - * - * 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 is in progress. - * - * Returns: SUCCEED on success. - * - * Changes: None - * - ******************************************************************************/ - -static herr_t -H5C2_jb_bjf__start_transaction(H5C2_jbrb_t * struct_ptr, - uint64_t trans_num) - -{ - herr_t ret_value = SUCCEED; - - FUNC_ENTER_NOAPI(H5C2_jb_bjf__start_transaction, FAIL) - - /* Check Arguments */ - 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 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "Transaction already in progress.") - } /* end if */ - - /* Verify that the supplied transaction number greater than the last */ - if ( (struct_ptr->cur_trans) >= trans_num ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "New transaction out of sequence.") - } /* end if */ - - /* 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") - } - - } /* end if */ - - - /* Write start transaction message */ - H5C2_JB_BJF__WRITE_SIG_AND_VER(struct_ptr, \ - H5C2_BJNL__BEGIN_TRANS_SIG, \ - H5C2_BJNL__BEGIN_TRANS_VER, \ - /* keep_chksum */ FALSE, \ - /* is_end_trans */ FALSE, \ - trans_num, \ - /* fail_return */ FAIL) - - H5C2_JB_BJF__WRITE_TRANS_NUM(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 */ - - -/****************************************************************************** - * - * Function: H5C2_jb_bjf__write_buf - * - * Programmer: John Mainzer - * 4/24/09 - * - * 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 - * supplied buffer directly into the ring buffer buffer - * and update its fields accordingly. - * - * 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, - * update struct_ptr->msg_chksum. - * - * Note that this function will probably prove to be - * a hot spot in profiling, so we should more or less - * plan on converting it into a macro at some point. - * - * Returns: SUCCEED on success. - * FAIL on failure. - * - * Changes: Updated to updated fields used only in the SIO case - * only when SIO is selected. - * JRM -- 1/14/10 - * - ******************************************************************************/ - -static herr_t -H5C2_jb_bjf__write_buffer(H5C2_jbrb_t * struct_ptr, - size_t buf_size, - const char * buf_ptr, - hbool_t is_end_trans, - uint64_t trans_num) -{ - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5C2_jb_bjf__write_buffer, FAIL) - - HDassert( struct_ptr != NULL ); - HDassert( struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC ); - HDassert( buf_size > 0 ); - HDassert( buf_ptr != NULL ); - 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. - */ - - if ( ( is_end_trans ) && ( struct_ptr->chksum_cur_msg ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "is_end_trans and struct_ptr->chksum_cur_msg both true.") - } - - /* 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); - } - - if ( buf_size < struct_ptr->cur_buf_free_space ) { - - /* 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. - * - * 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 -- 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[buf_size]); - - /* update current buffer usage */ - struct_ptr->cur_buf_free_space -= 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(). - * If this proves too costly, further optimizations will be necessary. - */ - - if ( H5C2_jb__write_to_buffer(struct_ptr, buf_size, buf_ptr, - is_end_trans, trans_num) != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_jb__write_to_buffer() failed.") - } - } - - 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() */ - - -/****************************************************************************** - * - * Function: H5C2_jb_bjf__write_chksum - * - * Programmer: John Mainzer - * 4/24/09 - * - * 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 - * the message -- not the signature and version. - * - * 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. - * - * 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 - * a hot spot in profiling, so we should more or less - * plan on converting it into a macro at some point. - * - * Returns: SUCCEED on success. - * 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) -{ - uint8_t *p; - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5C2_jb_bjf__write_chksum, FAIL) - - /* Sanity check */ - HDassert(struct_ptr != NULL); - HDassert(struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC); - 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 ( 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. - * - * 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 */ - - p = (uint8_t *)(struct_ptr->head); - - UINT32ENCODE(p, struct_ptr->msg_chksum); - - HDassert( p == ((uint8_t *)(struct_ptr->head + H5C2__CHECKSUM_SIZE)) ); - - /* 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 current buffer usage */ - struct_ptr->cur_buf_free_space -= 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; - - HDassert( struct_ptr->cur_buf_free_space > 0 ); - - } /* 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, - * 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.") - } - } /* end else */ - - /* re-set the checksum computation fields */ - struct_ptr->chksum_cur_msg = FALSE; - struct_ptr->msg_chksum = 0; - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_jb_bjf__write_chksum() */ - - -/****************************************************************************** - * - * Function: H5C2_jb_bjf__write_length - * - * Programmer: John Mainzer - * 4/24/09 - * - * 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 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. - * - * In either case, if struct_ptr->chksum_cur_msg is TRUE, - * update struct_ptr->msg_chksum. - * - * Note that this function will probably prove to be - * a hot spot in profiling, so we should more or less - * plan on converting it into a macro at some point. - * - * Returns: SUCCEED on success. - * FAIL on failure. - * - * Changes: None. - * - ******************************************************************************/ - -static herr_t -H5C2_jb_bjf__write_length(H5C2_jbrb_t * struct_ptr, - size_t length, - hbool_t is_end_trans, - uint64_t trans_num) -{ - herr_t ret_value = SUCCEED; /* Return value */ - uint8_t * p; - size_t length_width; - - FUNC_ENTER_NOAPI(H5C2_jb_bjf__write_length, FAIL) - - HDassert( struct_ptr != NULL ); - HDassert( struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC ); - 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. - */ - - if ( ( is_end_trans ) && ( struct_ptr->chksum_cur_msg ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "is_end_trans and struct_ptr->chksum_cur_msg both true.") - } - - length_width = (size_t)(struct_ptr->length_width); - - 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. - * - * 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 */ - - p = (uint8_t *)(struct_ptr->head); - - switch ( length_width ) - { - case 2: - UINT16ENCODE(p, length); - break; - - case 4: - UINT32ENCODE(p, length); - break; - - case 8: - UINT64ENCODE(p, length); - break; - - default: - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "length_width out of range (1).") - break; - } - - HDassert( p == ((uint8_t *)(struct_ptr->head + length_width)) ); - - /* 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 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); - } - - /* update head pointer */ - struct_ptr->head = &(struct_ptr->head[length_width]); - - /* update current buffer usage */ - struct_ptr->cur_buf_free_space -= 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, - * further optimizations will be necessary. - */ - - uint8_t buf[17]; /* should be big enough for a long time. */ - - HDassert(length_width < sizeof(buf)); - p = buf; - switch(length_width) { - case 2: - UINT16ENCODE(p, length); - break; - - case 4: - UINT32ENCODE(p, length); - break; - - case 8: - UINT64ENCODE(p, length); - break; - - default: - 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, - (const char *)buf, - 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); - } - } /* end else */ - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_jb_bjf__write_length() */ - - -/****************************************************************************** - * - * Function: H5C2_jb_bjf__write_offset - * - * Programmer: John Mainzer - * 4/24/09 - * - * 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 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. - * - * In either case, if struct_ptr->chksum_cur_msg is TRUE, - * update struct_ptr->msg_chksum. - * - * Note that this function will probably prove to be - * a hot spot in profiling, so we should more or less - * plan on converting it into a macro at some point. - * - * Returns: SUCCEED on success. - * FAIL on failure. - * - * Changes: None. - * - ******************************************************************************/ - -static herr_t -H5C2_jb_bjf__write_offset(H5C2_jbrb_t * struct_ptr, - haddr_t offset, - hbool_t is_end_trans, - uint64_t trans_num) -{ - herr_t ret_value = SUCCEED; /* Return value */ - uint8_t * p; - size_t offset_width; - - FUNC_ENTER_NOAPI(H5C2_jb_bjf__write_offset, FAIL) - - 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 - * not used unless is_end_trans is TRUE, we make an exception for - * the eoa message. - */ - 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. - */ - - if ( ( is_end_trans ) && ( struct_ptr->chksum_cur_msg ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "is_end_trans and struct_ptr->chksum_cur_msg both true.") - } - - offset_width = (size_t)(struct_ptr->offset_width); - - 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. - * - * 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 */ - - p = (uint8_t *)(struct_ptr->head); - - switch ( offset_width ) - { - case 2: - UINT16ENCODE(p, offset); - break; - - case 4: - UINT32ENCODE(p, offset); - break; - - case 8: - UINT64ENCODE(p, offset); - break; - - default: - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "offset_width out of range (1).") - break; - } - - HDassert( p == ((uint8_t *)(struct_ptr->head + offset_width)) ); - - /* 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 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); - } - - /* update head pointer */ - struct_ptr->head = &(struct_ptr->head[offset_width]); - - /* update current buffer usage */ - struct_ptr->cur_buf_free_space -= 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, - * further optimizations will be necessary. - */ - - uint8_t buf[17]; /* should be big enough for a long time. */ - - HDassert( offset_width < 17 ) ; - - p = buf; - - switch ( offset_width ) - { - case 2: - UINT16ENCODE(p, offset); - break; - - case 4: - UINT32ENCODE(p, offset); - break; - - case 8: - UINT64ENCODE(p, offset); - break; - - default: - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "offset_width out of range (2).") - break; - } - - HDassert( p == &(buf[offset_width]) ); - - if ( H5C2_jb__write_to_buffer(struct_ptr, offset_width, - (const char *)buf, - 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), - offset_width, - struct_ptr->msg_chksum); - } - - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_jb_bjf__write_offset() */ - - -/****************************************************************************** - * - * Function: H5C2_jb_bjf__write_sig_and_ver - * - * 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 - * 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 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 - * signature and version. - * - * Note that this function will probably prove to be - * a hot spot in profiling, so we should more or less - * plan on converting it into a macro at some point. - * - * 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) -{ - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(H5C2_jb_bjf__write_sig_and_ver, FAIL) - - 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 - * 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. - * - * 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 the signature into journal buffer */ - HDmemcpy(struct_ptr->head, (const void *)sig_ptr, H5C2_BJNL__SIG_LEN); - - struct_ptr->head[H5C2_BJNL__SIG_LEN] = (char)version; - - /* update head pointer */ - struct_ptr->head = &(struct_ptr->head[H5C2_BJNL__SIG_LEN + 1]); - - /* 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 current buffer usage */ - struct_ptr->cur_buf_free_space -= 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 - * error if it is TRUE. - */ - 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 - * 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.") - } - } /* end else */ - - if ( struct_ptr->chksum_cur_msg ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "struct_ptr->chksum_cur_msg is already TRUE") - } - - 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() */ - - -/****************************************************************************** - * - * Function: H5C2_jb_bjf__write_trans_num() - * - * Programmer: John Mainzer - * 4/24/09 - * - * 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 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, - * update struct_ptr->msg_chksum. - * - * Note that this function will probably prove to be - * a hot spot in profiling, so we should more or less - * plan on converting it into a macro at some point. - * - * Returns: SUCCEED on success. - * FAIL on failure. - * - * Changes: None. - * - ******************************************************************************/ - -static herr_t -H5C2_jb_bjf__write_trans_num(H5C2_jbrb_t * struct_ptr, - hbool_t is_end_trans, - uint64_t trans_num) -{ - herr_t ret_value = SUCCEED; /* Return value */ - uint8_t * p; - - FUNC_ENTER_NOAPI(H5C2_jb_bjf__write_trans_num, FAIL) - - HDassert( struct_ptr != NULL ); - HDassert( struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC ); - 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. - */ - - if ( ( is_end_trans ) && ( struct_ptr->chksum_cur_msg ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "is_end_trans and struct_ptr->chksum_cur_msg both true.") - } - - 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. - * - * 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 */ - p = (uint8_t *)(struct_ptr->head); - UINT64ENCODE(p, trans_num); - - HDassert( p == ((uint8_t *)(struct_ptr->head + H5C2__TRANS_NUM_SIZE)) ); - - /* 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 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); - } - - /* update head pointer */ - struct_ptr->head = &(struct_ptr->head[H5C2__TRANS_NUM_SIZE]); - - /* update current buffer usage */ - struct_ptr->cur_buf_free_space -= 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 - * 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. - */ - - uint8_t buf[H5C2__TRANS_NUM_SIZE + 1]; - - p = buf; - - UINT64ENCODE(p, trans_num); - - HDassert( p == &(buf[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 ) { - - 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), - H5C2__TRANS_NUM_SIZE, - struct_ptr->msg_chksum); - } - - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_jb_bjf__write_trans_num() */ - - -/****************************************************************************** - * - * Function: H5C2_jb__bin2hex - * - * Programmer: Mike McGreevy - * Tuesday, March 4, 2008 - * - * Purpose: Convert binary data into hexadecimal. - * - * Returns: SUCCEED on success. - * - ******************************************************************************/ - -herr_t -H5C2_jb__bin2hex(const uint8_t * buf, - char * hexdata, - size_t * hexlength, - size_t buf_size) - -{ - size_t v; /* Local index variable */ - uint8_t c; - char * t; - - FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5C2_jb__bin2hex) - - t = hexdata; - t[0] = ' '; - for (v = 0; v < buf_size; v++) { - - t = &hexdata[v * 3 + 1]; - c = buf[v]; - HDsnprintf(t, (size_t)3, "%02x ", c); - t[2] = ' '; - - } /* end for */ - - t[3] = '\n'; - t[4] = '\0'; - - * hexlength = v * 3 + 2; - - FUNC_LEAVE_NOAPI(SUCCEED) - -} /* end H5C2_jb__bin2hex*/ - - -/****************************************************************************** - * - * Function: H5C2_jb__comment - * - * Programmer: Mike McGreevy - * Wednesday, February 6, 2008 - * - * 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. - * - * The original version of this file has been renamed - * to H5C2_jb_hrjf__comment(). - * - * JRM -- 4/2/09 - * - ******************************************************************************/ - -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 ); - HDassert( comment_ptr != NULL ); - - if ( struct_ptr->human_readable ) { - - if ( H5C2_jb_hrjf__comment(struct_ptr, comment_ptr) != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_jb_hrjf__comment() failed.") - } - } else { - - if ( H5C2_jb_bjf__comment(struct_ptr, comment_ptr) != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_jb_bjf__comment() failed.") - } - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* end H5C2_jb__comment */ - - -/***************************************************************************** - * - * Function: H5C2_jb__end_transaction - * - * Programmer: Mike McGreevy - * Wednesday, February 6, 2008 - * - * Purpose: Verify that the supplied transaction is in progress, - * 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 - * transaction is in progress. - * - * 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. - * - * The original version of this file has been renamed - * to H5C2_jb_hrjf__end_transaction(). - * - * JRM -- 4/2/09 - * - *****************************************************************************/ - -herr_t -H5C2_jb__end_transaction(H5C2_jbrb_t * struct_ptr, - uint64_t trans_num) -{ - herr_t ret_value = SUCCEED; - - FUNC_ENTER_NOAPI(H5C2_jb__end_transaction, FAIL) - - /* Check Arguments */ - HDassert( struct_ptr ); - HDassert( struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC ); - - if ( struct_ptr->human_readable ) { - - if ( H5C2_jb_hrjf__end_transaction(struct_ptr, trans_num) != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_jb_hrjf__end_transaction() failed.") - } - } else { - - if ( H5C2_jb_bjf__end_transaction(struct_ptr, trans_num) != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_jb_bjf__end_transaction() failed.") - } - } - - H5C2__JBRB__UPDATE_STATS_FOR_TRANS_COMPLETED(struct_ptr); - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* end H5C2_jb__end_transaction */ - - -/****************************************************************************** - * - * Function: H5C2_jb__eoa - * - * Programmer: Mike McGreevy - * July 29, 2008 - * - * Purpose: Insert the supplied EOA into the journal file. - * - * 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. - * - * The original version of this file has been renamed - * to H5C2_jb_hrjf__eoa(). - * - * JRM -- 4/2/09 - * - ******************************************************************************/ - -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 ); - HDassert( struct_ptr->hdf5_file_name ); - - if ( struct_ptr->human_readable ) { - - if ( H5C2_jb_hrjf__eoa(struct_ptr, eoa) != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_jb_hrjf__eoa() failed.") - } - } else { - - if ( H5C2_jb_bjf__eoa(struct_ptr, eoa) != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_jb_bjf__eoa() failed.") - } - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_jb__eoa() */ - - -/****************************************************************************** - * - * Function: H5C2_jb__flush - * - * Programmer: John Mainzer -- 1/14/10 - * - * Purpose: Determine whether AIO is enabled, and then call the - * appropriate flush routine. - * - * Returns: SUCCEED on success. - * - ******************************************************************************/ - -herr_t -H5C2_jb__flush(H5C2_jbrb_t * struct_ptr) -{ - herr_t ret_value = SUCCEED; - - FUNC_ENTER_NOAPI(H5C2_jb__flush, FAIL) - - /* 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) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "Attempt to flush buffers with transaction in progress.") - } /* end if */ - - if ( struct_ptr->use_aio ) { - - ret_value = H5C2_jb_aio__flush(struct_ptr); - - } else { - - ret_value = H5C2_jb_sio__flush(struct_ptr); - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_jb__flush() */ - - -/****************************************************************************** - * - * Function: H5C2_jb__get_last_transaction_on_disk - * - * Programmer: JRM -- 1/20/10 - * - * Purpose: Determine whether we are using aio for journal - * entry writes, and then call the appropriate - * function. - * - * Returns: SUCCEED on success. - * - ******************************************************************************/ - -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( struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC ); - HDassert( trans_num_ptr != NULL ); - - if ( struct_ptr->use_aio ) { - - 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 */ - - -/****************************************************************************** - * - * Function: H5C2_jb_hrjf__comment - * - * Programmer: Mike McGreevy - * Wednesday, February 6, 2008 - * - * 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(). - * - * JRM -- 5/2/09 - * - ******************************************************************************/ - -static herr_t -H5C2_jb_hrjf__comment(H5C2_jbrb_t * struct_ptr, - const char * comment_ptr) -{ - char * temp = NULL; - size_t temp_len; - 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. - */ - 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 */ - - temp_len = HDstrlen(comment_ptr) + 11; - - 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") - } - -done: - - 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) - -} /* H5C2_jb hrjf__comment() */ - - -/***************************************************************************** - * - * Function: H5C2_jb_hrjf__end_transaction - * - * Programmer: Mike McGreevy - * Wednesday, February 6, 2008 - * - * Purpose: Verify that the supplied transaction is in progress, - * 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 - * transaction is in progress. - * - * Returns: SUCCEED on success. - * - * Changes: Renamed H5C2_jb__end_transaction() to - * H5C2_jb_hrjf__end_transaction(). - * JRM -- 5/2/09 - * - *****************************************************************************/ - -static herr_t -H5C2_jb_hrjf__end_transaction(H5C2_jbrb_t * struct_ptr, - uint64_t trans_num) -{ - char temp[25]; - herr_t ret_value = SUCCEED; - - FUNC_ENTER_NOAPI(H5C2_jb_hrjf__end_transaction, FAIL) - - /* 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 ) ) { - - 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 - */ - if ( struct_ptr->jentry_written != TRUE ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "Empty transaction -- at least one journal entry required.") - } /* end if */ - - - /* Prepare end transaction message */ - 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, - 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 - */ - struct_ptr->jentry_written = FALSE; - - /* Close current transaction */ - struct_ptr->trans_in_prog = FALSE; - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* end H5C2_jb_hrjf__end_transaction */ - - -/****************************************************************************** - * - * Function: H5C2_jb_hrjf__eoa - * - * Programmer: Mike McGreevy - * July 29, 2008 - * - * Purpose: Insert the supplied EOA into the journal file. - * - * Returns: SUCCEED on success. - * - * Changes: Renamed H5C2_jb__eoa() to H5C2_jb_hrjf__eoa(). - * JRM -- 5/2/09 - * - ******************************************************************************/ - -static herr_t -H5C2_jb_hrjf__eoa(H5C2_jbrb_t * struct_ptr, - haddr_t eoa) -{ - char temp[41]; - size_t temp_len = 41; - 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. - */ - 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") - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_jb_hrjf__eoa() */ - - -/****************************************************************************** - * - * Function: H5C2_jb_hrjf__journal_entry - * - * Programmer: Mike McGreevy - * Wednesday, February 6, 2008 - * - * Purpose: Verify that the specified transaction is open. Then - * construct a journal entry recording the supplied base - * address, length, and body, and write it to the current - * journal buffer. - * - * Returns: SUCCEED on success. - * - * Changes: Renamed H5C2_jb__journal_entry() to - * H5C2_jb_hrjf__journal_entry(). - * JRM -- 5/2/09 - * - ******************************************************************************/ - -static herr_t -H5C2_jb_hrjf__journal_entry(H5C2_jbrb_t * struct_ptr, - uint64_t trans_num, - haddr_t base_addr, - size_t length, - const uint8_t * body) -{ - - char * temp = NULL; - char * hexdata = NULL; - size_t hexlength; - herr_t ret_value = SUCCEED; - uint8_t * bodydata; - - FUNC_ENTER_NOAPI(H5C2_jb_hrjf__journal_entry, FAIL) - - /* Check Arguments */ - HDassert(struct_ptr != NULL); - HDassert(struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC); - - /* Make a copy of body data */ - 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 ) ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "Transaction not in progress or bad transaction number.") - } /* end if */ - - if ( (temp = (char *)H5MM_malloc(length + 100)) == NULL ) { - - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \ - "allocation of assembly buffer failed."); - } - - 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, - (size_t)(length + 100), - "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 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_jb__write_to_buffer() failed.\n") - } /* end if */ - - /* 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 ) { - - 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 - */ - if ( struct_ptr->jentry_written == FALSE ) { - - struct_ptr->jentry_written = TRUE; - } - -done: - - 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 = (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 = (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) - -} /* H5C2_jb_hrjf__journal_entry() */ - - -/****************************************************************************** - * - * Function: H5C2_jb_hrjf__start_transaction - * - * Programmer: Mike McGreevy - * 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, - * 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(). - * JRM -- 5/2/09 - * - ******************************************************************************/ - -static herr_t -H5C2_jb_hrjf__start_transaction(H5C2_jbrb_t * struct_ptr, - uint64_t trans_num) - -{ - char temp[150]; - herr_t ret_value = SUCCEED; - - FUNC_ENTER_NOAPI(H5C2_jb_hrjf__start_transaction, FAIL) - - /* Check Arguments */ - 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 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "Transaction already in progress.") - } /* end if */ - - /* Verify that the supplied transaction number greater than the last */ - if ( (struct_ptr->cur_trans) >= trans_num ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "New transaction out of sequence.") - } /* end if */ - - /* 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") - } - - } /* end if */ - - /* 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 ) { - - 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() */ - - -/****************************************************************************** - * - * Function: H5C2_jb__init - * - * Programmer: Mike McGreevy - * Tuesday, February 5, 2008 - * - * Purpose: Initialize the supplied instance of H5C2_jbrb_t as - * specified by the buf_size and num_bufs fields. Open the - * journal file whose name is supplied in journal_file_name - * for either synchronous or asynchronous I/O as specified - * by use_aio. - * - * Returns: SUCCEED on success. - * - * Changes: JRM -- 2/10/09 - * 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 - * 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 - * 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, - 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, - hbool_t human_readable, - size_t sizeof_addr, - size_t sizeof_size) -{ - int i; - herr_t ret_value = SUCCEED; - - FUNC_ENTER_NOAPI(H5C2_jb__init, FAIL) - - /* Check Arguments */ - HDassert( struct_ptr ); - HDassert( HDF5_file_name ); - HDassert( journal_file_name ); - HDassert( buf_size > 0 ); - HDassert( num_bufs > 0 ); - HDassert( struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC ); - - /* Initialize Fields of H5C2_jbrb_t structure. Note that we will - * overwrite some of these initializations almost immediately. - */ - struct_ptr->journal_magic = journal_magic; - struct_ptr->journal_file_fd = -1; - 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; - struct_ptr->jentry_written = FALSE; - struct_ptr->use_aio = use_aio; - struct_ptr->human_readable = human_readable; - struct_ptr->offset_width = (int)sizeof_addr; - struct_ptr->length_width = (int)sizeof_size; - struct_ptr->chksum_cur_msg = FALSE; - 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); - - if ( struct_ptr->jname == NULL ) { - - 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); - - if ( struct_ptr->jname == NULL ) { - - 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 = (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; -/* Comment this out to work on the Mac, currently */ -#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 */ -#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 = (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] = (char *) - H5MM_malloc(struct_ptr->buf_size * (size_t)(struct_ptr->num_bufs)); - - if ( (*struct_ptr->buf)[0] == NULL ) { - - HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \ - "allocation of buffers failed."); - } /* end if */ - - /* Allocate space for the purposes of tracking the last - * transaction on disk - */ - 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; inum_bufs; i++) - { - (*struct_ptr->trans_tracking)[i] = 0; - } - - /* 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 * (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]; - - /* 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 */ - - -/****************************************************************************** - * - * Function: H5C2_jb__journal_entry - * - * Programmer: Mike McGreevy - * Wednesday, February 6, 2008 - * - * Purpose: Verify that the specified transaction is open. Then - * construct a journal entry recording the supplied base - * address, length, and body, and write it to the current - * journal buffer. - * - * 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. - * - * The original version of this file has been renamed - * to H5C2_jb_hrjf__journal_entry(). - * - * JRM -- 4/2/09 - * - ******************************************************************************/ - -herr_t -H5C2_jb__journal_entry(H5C2_jbrb_t * struct_ptr, - uint64_t trans_num, - haddr_t base_addr, - size_t length, - const uint8_t * body) -{ - herr_t ret_value = SUCCEED; - - FUNC_ENTER_NOAPI(H5C2_jb__journal_entry, FAIL) - - /* Check Arguments */ - HDassert( struct_ptr != NULL ); - HDassert( struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC ); - - if ( struct_ptr->human_readable ) { - - if ( H5C2_jb_hrjf__journal_entry(struct_ptr, trans_num, base_addr, - length, body) != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_jb_hrjf__journal_entry() failed.") - } - } else { - - if ( H5C2_jb_bjf__journal_entry(struct_ptr, trans_num, base_addr, - length, body) != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_jb_bjf__journal_entry() failed.") - } - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* H5C2_jb__journal_entry() */ - - -/****************************************************************************** - * - * Function: H5C2_jb_sio__flush - * - * Programmer: Mike McGreevy - * 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 - * 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 - * 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 - * 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; inum_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; iput+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 - * 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, - * 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: 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. - * - * The original version of this file has been renamed - * to H5C2_jb_hrjf__start_transaction(). - * - * JRM -- 4/2/09 - * - ******************************************************************************/ - -herr_t -H5C2_jb__start_transaction(H5C2_jbrb_t * struct_ptr, - uint64_t trans_num) - -{ - herr_t ret_value = SUCCEED; - - FUNC_ENTER_NOAPI(H5C2_jb__start_transaction, FAIL) - - /* Check Arguments */ - HDassert( struct_ptr != NULL ); - HDassert( struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC ); - - if ( struct_ptr->human_readable ) { - - if ( H5C2_jb_hrjf__start_transaction(struct_ptr, trans_num) - != SUCCEED ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5C2_jb_hrjf__start_transaction() failed.") - } - } else { - - 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() */ - - -/****************************************************************************** - * - * Function: H5C2_jb__takedown - * - * Programmer: Mike McGreevy - * Thursday, February 7, 2008 - * - * 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 - * *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 -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 */ - - /* Verify that the journal file has been truncated */ - if (struct_ptr->journal_is_empty != TRUE) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "Attempt to takedown with journal file not truncated.") - } /* end if */ - - /* 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, "Journal file close failed.") - } /* end if */ - - if ( HDremove(struct_ptr->jname) < 0) { - - 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 = (char *)H5MM_xfree(struct_ptr->jname); - - if ( struct_ptr->jname != NULL ) { - - HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, \ - "free of jname failed."); - } - } - - if ( struct_ptr->hdf5_file_name != NULL ) { - - struct_ptr->hdf5_file_name = - (char *)H5MM_xfree(struct_ptr->hdf5_file_name); - - if ( struct_ptr->hdf5_file_name != NULL ) { - - HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, \ - "free of hdf5_file_name failed."); - } - } - - if ( (*struct_ptr->buf)[0] != NULL ) { - - (*struct_ptr->buf)[0] = (char *)H5MM_xfree((*struct_ptr->buf)[0]); - if ( (*struct_ptr->buf)[0] != NULL ) { - - HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, \ - "free of buffers failed."); - } - } - - if ( struct_ptr->buf != NULL ) { - - struct_ptr->buf = (char *((*)[]))H5MM_xfree(struct_ptr->buf); - if ( struct_ptr->buf != NULL ) { - - HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, \ - "free of buffer pointer array failed."); - } - } - - if ( struct_ptr->trans_tracking != NULL ) { - - struct_ptr->trans_tracking = - (uint64_t (*)[])H5MM_xfree(struct_ptr->trans_tracking); - - if ( struct_ptr->trans_tracking != NULL ) { - - HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, \ - "free of transaction tracking array failed."); - } - } - - 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) - -} /* end H5C2_jb__takedown */ - - -/****************************************************************************** - * - * Function: H5C2_jb__trunc - * - * Programmer: Mike McGreevy - * Thursday, February 7, 2008 - * - * 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 -H5C2_jb__trunc(H5C2_jbrb_t * struct_ptr) - -{ - int i; - herr_t ret_value = SUCCEED; - - FUNC_ENTER_NOAPI(H5C2_jb__trunc, FAIL) - - /* 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 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "Attempt to truncate journal file while transaction in progress.") - } /* end if */ - - /* Verify that the journal buffers are empty */ - if ( struct_ptr->bufs_in_use != 0 ) { - - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ - "Attempt to truncate with non-empty buffers.") - } /* end if */ - - /* Truncate the journal file */ - if ( HDftruncate(struct_ptr->journal_file_fd, (off_t)0) < 0 ) { - - HGOTO_ERROR(H5E_IO, H5E_SYNCFAIL, FAIL, "Jounal file truncate failed.") - } /* end if */ - - /* 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; inum_bufs; i++) - { - (*struct_ptr->trans_tracking)[i] = 0; - } - - if ( HDlseek(struct_ptr->journal_file_fd, (off_t)0, SEEK_SET) == (off_t)-1 ) - { - HGOTO_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "Jounal file seek failed.") - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* end H5C2_jb__trunc */ - - -/****************************************************************************** - * - * Function: H5C2_jb__write_header_entry - * - * Programmer: John Mainzer - * 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 - * 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 - * string with underscores. - * - * JRM -- 4/16/09 - * Updated function to include the offset and length - * sizes in the header if human_readable is FALSE. - * - ******************************************************************************/ - -herr_t -H5C2_jb__write_header_entry(H5C2_jbrb_t * struct_ptr) - -{ - herr_t ret_value = SUCCEED; - char *buf; - char * p; - char time_buf[32]; - int chars_written; - int i; - size_t file_name_len; - size_t buf_len; - time_t current_date; - - FUNC_ENTER_NOAPI(H5C2_jb__write_header_entry, FAIL) - - /* Check Arguments */ - HDassert( struct_ptr ); - HDassert( struct_ptr->magic == H5C2__H5C2_JBRB_T_MAGIC ); - HDassert( struct_ptr->hdf5_file_name != NULL ); - HDassert( struct_ptr->header_present == FALSE ); - HDassert( struct_ptr->journal_is_empty == TRUE ); - - file_name_len = HDstrlen(struct_ptr->hdf5_file_name); - - HDassert( file_name_len > 0 ); - - buf_len = file_name_len + 256; - - /* Allocate space for journal buffers */ - 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); - - /* load ascii representation of current_date into time_buf[], - * replacing white space with underscores. - */ - time_buf[31] = '\0'; /* just to be safe */ - - if ( (p = HDctime(¤t_date)) == NULL ) { - - HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "Can't get ascii representation of current date.") - - } else { - - /* copy the string into time_buf, replacing white space with - * underscores. - * - * Do this to make parsing the header easier. - */ - i = 0; - - while ( ( i < 31 ) && ( *p != '\0' ) ) { - - if ( isspace(*p) ) { - - time_buf[i] = '_'; - - } else { - - time_buf[i] = *p; - } - - i++; - p++; - } - - time_buf[i] = '\0'; - } - - /* Format the header message in the temporary buffer */ - - if ( struct_ptr->human_readable ) { - - 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, - H5C2_JNL__TGT_FILE_NAME_TAG, - struct_ptr->hdf5_file_name, - H5C2_JNL__JNL_MAGIC_TAG, - (int)(struct_ptr->journal_magic), - H5C2_JNL__CREATION_DATE_TAG, - time_buf, - H5C2_JNL__HUMAN_READABLE_TAG, - struct_ptr->human_readable); - - } else { - - /* 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 - * - * 2) If we included it anyway, we would have to update the - * tests for the human readable journal file code. - */ - - 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, - H5C2_JNL__TGT_FILE_NAME_TAG, - struct_ptr->hdf5_file_name, - H5C2_JNL__JNL_MAGIC_TAG, - (int)(struct_ptr->journal_magic), - H5C2_JNL__CREATION_DATE_TAG, - time_buf, - H5C2_JNL__HUMAN_READABLE_TAG, - struct_ptr->human_readable, - H5C2_JNL__OFFSET_WIDTH_TAG, - struct_ptr->offset_width, - H5C2_JNL__LENGTH_WIDTH_TAG, - struct_ptr->length_width); - - } - - if ( chars_written >= (int)(buf_len - 1) ) { - - HGOTO_ERROR(H5E_RESOURCE, H5E_CANTCOPY, FAIL, \ - "tried to overwrite buffer."); - } - - 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, - (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 */ - - /* Update boolean flags */ - struct_ptr->header_present = TRUE; - struct_ptr->journal_is_empty = FALSE; - -done: - - 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() */ - - -/****************************************************************************** - * - * Function: H5C2_jb__write_to_buffer - * - * Programmer: John Mainzer - * 1/14/10 - * - * Purpose: Test to see whether AIO is enabled, and the - * call the appropriate version of the function. - * - * 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 ret_value = SUCCEED; - - FUNC_ENTER_NOAPI(H5C2_jb__write_to_buffer, FAIL) - - /* Check Arguments */ - 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 ( struct_ptr->use_aio ) { - - ret_value = H5C2_jb_aio__write_to_buffer(struct_ptr, - size, - data, - is_end_trans, - trans_num); - - } else { - - ret_value = H5C2_jb_sio__write_to_buffer(struct_ptr, - size, - data, - is_end_trans, - trans_num); - - } - -done: - - FUNC_LEAVE_NOAPI(ret_value) - -} /* end H5C2_jb__write_to_buffer */ - diff --git a/src/H5C2pkg.h b/src/H5C2pkg.h deleted file mode 100644 index 473636a..0000000 --- a/src/H5C2pkg.h +++ /dev/null @@ -1,4924 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * Copyright by the Board of Trustees of the University of Illinois. * - * All rights reserved. * - * * - * This file is part of HDF5. The full HDF5 copyright notice, including * - * terms governing use, modification, and redistribution, is contained in * - * the files COPYING and Copyright.html. COPYING can be found at the root * - * of the source code distribution tree; Copyright.html can be found at the * - * root level of an installed copy of the electronic HDF5 document set and * - * is linked from the top-level documents page. It can also be found at * - * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * - * access to either file, you may request a copy from help@hdfgroup.org. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* - * Programmer: John Mainzer -- 10/12/04 - * - * Purpose: This file contains declarations which are normally visible - * only within the H5C2 package (just H5C2.c at present). - * - * Source files outside the H5C2 package should include - * H5C2private.h instead. - * - * The one exception to this rule is test/cache2.c. The test - * code is easier to write if it can look at the cache's - * internal data structures. Indeed, this is the main - * reason why this file was created. - */ - -#ifndef H5C2_PACKAGE -#error "Do not include this file outside the H5C2 package!" -#endif - -#ifndef _H5C2pkg_H -#define _H5C2pkg_H - -#include -#include -#include - - -/* Get package's private header */ -#include "H5C2private.h" - - -/* Get needed headers */ -#include "H5SLprivate.h" /* Skip lists */ - - -/****************************************************************************** - * - * 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 - * Tuesday, February 5, 2008 - * - * Purpose: Instances of the H5C2_jbrb_t structure are used to - * implement a ring buffer of journal buffers. This - * structure is used in association with HDF5 File - * Recovery. It is used to journal metadata cache - * changes in an effort to be able to reproduce - * actions in the event of a crash during data writing. - * - * 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 - * validate pointers to instances of H5C2_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 - * journal, and refuse to run the journal if it does - * not. - * - * 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 - * must be at least 2 in the asynchronous case (one for - * storing journal entries as they are accumulated, and - * 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. - * - * 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 - * journal buffer). - * - * put: Number of the journal buffer that is currently being - * written to. - * - * jentry_written: Boolean flag that indiciates if a journal entry has - * been written under the current transaction. - * - * use_aio: Boolean flag that indicates whether synchronous or - * asynchronous writes will be used. - * - * 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 - * 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 - * 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 - * message checksum to date is stored in the msg_chksum - * (discussed below). - * - * 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. - * - * msg_chksum: uint32_t used to compile the checksum of a binary - * 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. - * - * 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. - * - * 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. - * - * cur_buf_free_space: The amount of space remaining in the currently active - * journal buffer. This is used to determine when the - * 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 - * 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. - * - * trans_tracking: An array of size num_bufs that reports the last - * transaction successfully written into each buffer. This - * 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 - * 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__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" -#define H5C2_JNL__TGT_FILE_NAME_TAG "target_file_name" -#define H5C2_JNL__JNL_MAGIC_TAG "journal_magic" -#define H5C2_JNL__CREATION_DATE_TAG "creation_date" -#define H5C2_JNL__HUMAN_READABLE_TAG "human_readable" -#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 - * messages in binary journal files. - */ - -#define H5C2_BJNL__SIG_LEN ((size_t)(4)) -#define H5C2_BJNL__BEGIN_TRANS_SIG "btrn" -#define H5C2_BJNL__BEGIN_TRANS_VER ((uint8_t)(0)) -#define H5C2_BJNL__JOURNAL_ENTRY_SIG "jent" -#define H5C2_BJNL__JOURNAL_ENTRY_VER ((uint8_t)(0)) -#define H5C2_BJNL__END_TRANS_SIG "etrn" -#define H5C2_BJNL__END_TRANS_VER ((uint8_t)(0)) -#define H5C2_BJNL__END_ADDR_SPACE_SIG "eoas" -#define H5C2_BJNL__END_ADDR_SPACE_VER ((uint8_t)(0)) - -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; - 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 - * 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 - * Quincey. I have applied a fudge factor of 2. - * - * -- JRM - */ - -#define H5C2__MAX_PASSES_ON_FLUSH 4 - - -/**************************************************************************** - * - * 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 - * there can be an arbitrary number. - * - * The fields in the structure are discussed individually below: - * - * fcn_ptr: Pointer to the instance of H5C2_mdj_status_change_func_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 - * 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 - * 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 - * if the entry is in use. - * - ****************************************************************************/ - -typedef struct H5C2_mdjsc_record_t -{ - H5C2_mdj_status_change_func_t fcn_ptr; - void * data_ptr; - int32_t fl_next; -} H5C2_mdjsc_record_t; - - -/**************************************************************************** - * - * structure H5C2_t - * - * Catchall structure for all variables specific to an instance of the cache. - * - * While the individual fields of the structure are discussed below, the - * following overview may be helpful. - * - * Entries in the cache are stored in an instance of H5TB_TREE, indexed on - * the entry's disk address. While the H5TB_TREE is less efficient than - * hash table, it keeps the entries in address sorted order. As flushes - * in parallel mode are more efficient if they are issued in increasing - * address order, this is a significant benefit. Also the H5TB_TREE code - * was readily available, which reduced development time. - * - * While the cache was designed with multiple replacement policies in mind, - * at present only a modified form of LRU is supported. - * - * JRM - 4/26/04 - * - * Profiling has indicated that searches in the instance of H5TB_TREE are - * too expensive. To deal with this issue, I have augmented the cache - * with a hash table in which all entries will be stored. Given the - * advantages of flushing entries in increasing address order, the TBBT - * is retained, but only dirty entries are stored in it. At least for - * now, we will leave entries in the TBBT after they are flushed. - * - * Note that index_size and index_len now refer to the total size of - * and number of entries in the hash table. - * - * JRM - 7/19/04 - * - * The TBBT has since been replaced with a skip list. This change - * greatly predates this note. - * - * 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 - * H5C2_t. - * - * 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 - * to record cache operations for use in simulations and design - * studies. This field will usually be NULL, indicating that - * 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 - * H5C2. Instead, H5AC reads the trace_file_ptr as needed. - * - * When we get to using H5C2 in other places, we may add - * code to write trace file data at the H5C2 level as well. - * - * aux_ptr: Pointer to void used to allow wrapper code to associate - * its data with an instance of H5C2_t. The H5C2 cache code - * sets this field to NULL, and otherwise leaves it alone. - * - * max_type_id: Integer field containing the maximum type id number assigned - * to a type of entry in the cache. All type ids from 0 to - * max_type_id inclusive must be defined. The names of the - * types are stored in the type_name_table discussed below, and - * indexed by the ids. - * - * type_name_table_ptr: Pointer to an array of pointer to char of length - * max_type_id + 1. The strings pointed to by the entries - * in the array are the names of the entry types associated - * with the indexing type IDs. - * - * max_cache_size: Nominal maximum number of bytes that may be stored in the - * cache. This value should be viewed as a soft limit, as the - * cache can exceed this value under the following circumstances: - * - * a) All entries in the cache are protected, and the cache is - * asked to insert a new entry. In this case the new entry - * will be created. If this causes the cache to exceed - * max_cache_size, it will do so. The cache will attempt - * to reduce its size as entries are unprotected. - * - * b) When running in parallel mode, the cache may not be - * permitted to flush a dirty entry in response to a read. - * If there are no clean entries available to evict, the - * cache will exceed its maximum size. Again the cache - * will attempt to reduce its size to the max_cache_size - * limit on the next cache write. - * - * c) When an entry increases in size, the cache may exceed - * the max_cache_size limit until the next time the cache - * attempts to load or insert an entry. - * - * min_clean_size: Nominal minimum number of clean bytes in the cache. - * The cache attempts to maintain this number of bytes of - * clean data so as to avoid case b) above. Again, this is - * a soft limit. - * - * - * In addition to the call back functions required for each entry, the - * cache requires the following call back functions for this instance of - * the cache as a whole: - * - * check_write_permitted: In certain applications, the cache may not - * be allowed to write to disk at certain time. If specified, - * the check_write_permitted function is used to determine if - * a write is permissible at any given point in time. - * - * If no such function is specified (i.e. this field is NULL), - * the cache uses the following write_permitted field to - * determine whether writes are permitted. - * - * write_permitted: If check_write_permitted is NULL, this boolean flag - * indicates whether writes are permitted. - * - * log_flush: If provided, this function is called whenever a dirty - * entry is flushed to disk. - * - * - * In cases where memory is plentiful, and performance is an issue, it - * is useful to disable all cache evictions, and thereby postpone metadata - * 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 - * 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. - * - * - * The cache requires an index to facilitate searching for entries. The - * following fields support that index. - * - * index_len: Number of entries currently in the hash table used to index - * the cache. - * - * index_size: Number of bytes of cache entries currently stored in the - * hash table used to index the cache. - * - * This value should not be mistaken for footprint of the - * cache in memory. The average cache entry is small, and - * the cache has a considerable overhead. Multiplying the - * index_size by two should yield a conservative estimate - * of the cache's memory footprint. - * - * index: Array of pointer to H5C2_cache_entry_t of size - * H5C2__HASH_TABLE_LEN. At present, this value is a power - * of two, not the usual prime number. - * - * I hope that the variable size of cache elements, the large - * hash table size, and the way in which HDF5 allocates space - * will combine to avoid problems with periodicity. If so, we - * can use a trivial hash function (a bit-and and a 3 bit left - * shift) with some small savings. - * - * If not, it will become evident in the statistics. Changing - * to the usual prime number length hash table will require - * changing the H5C2__HASH_FCN macro and the deletion of the - * H5C2__HASH_MASK #define. No other changes should be required. - * - * - * When we flush the cache, we need to write entries out in increasing - * address order. An instance of a skip list is used to store dirty entries in - * sorted order. Whether it is cheaper to sort the dirty entries as needed, - * or to maintain the list is an open question. At a guess, it depends - * on how frequently the cache is flushed. We will see how it goes. - * - * For now at least, I will not remove dirty entries from the list as they - * are flushed. (this has been changed -- dirty entries are now removed from - * the skip list as they are flushed. JRM - 10/25/05) - * - * slist_len: Number of entries currently in the skip list - * used to maintain a sorted list of dirty entries in the - * cache. - * - * slist_size: Number of bytes of cache entries currently stored in the - * skip list used to maintain a sorted list of - * dirty entries in the cache. - * - * slist_ptr: pointer to the instance of H5SL_t used maintain a sorted - * list of dirty entries in the cache. This sorted list has - * two uses: - * - * a) It allows us to flush dirty entries in increasing address - * order, which results in significant savings. - * - * b) It facilitates checking for adjacent dirty entries when - * attempting to evict entries from the cache. While we - * don't use this at present, I hope that this will allow - * some optimizations when I get to it. - * - * With the addition of the fractal heap, the cache must now deal with - * the case in which entries may be dirtied, renamed, or have their sizes - * changed during a flush. To allow sanity checks in this situation, the - * 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 since the last time this field was set to zero. - * - * slist_size_increase: Total size of all entries that have been added - * to the slist since the last time this field was set to - * zero. - * - * - * When a cache entry is protected, it must be removed from the LRU - * list(s) as it cannot be either flushed or evicted until it is unprotected. - * The following fields are used to implement the protected list (pl). - * - * pl_len: Number of entries currently residing on the protected list. - * - * pl_size: Number of bytes of cache entries currently residing on the - * protected list. - * - * pl_head_ptr: Pointer to the head of the doubly linked list of protected - * entries. Note that cache entries on this list are linked - * by their next and prev fields. - * - * This field is NULL if the list is empty. - * - * pl_tail_ptr: Pointer to the tail of the doubly linked list of protected - * entries. Note that cache entries on this list are linked - * by their next and prev fields. - * - * This field is NULL if the list is empty. - * - * - * For very frequently used entries, the protect/unprotect overhead can - * become burdensome. To avoid this overhead, I have modified the cache - * to allow entries to be "pinned". A pinned entry is similar to a - * protected entry, in the sense that it cannot be evicted, and that - * the entry can be modified at any time. - * - * Pinning an entry has the following implications: - * - * 1) A pinned entry cannot be evicted. Thus unprotected - * pinned entries reside in the pinned entry list, instead - * of the LRU list(s) (or other lists maintained by the current - * replacement policy code). - * - * 2) A pinned entry can be accessed or modified at any time. - * Therefore, the cache must check with the entry owner - * before flushing it. If permission is denied, the - * cache just skips the entry in the flush. - * - * 3) A pinned entry can be marked as dirty (and possibly - * change size) while it is unprotected. - * - * 4) The flush-destroy code must allow pinned entries to - * be unpinned (and possibly unprotected) during the - * flush. - * - * Since pinned entries cannot be evicted, they must be kept on a pinned - * entry list, instead of being entrusted to the replacement policy code. - * - * Maintaining the pinned entry list requires the following fields: - * - * pel_len: Number of entries currently residing on the pinned - * entry list. - * - * pel_size: Number of bytes of cache entries currently residing on - * the pinned entry list. - * - * pel_head_ptr: Pointer to the head of the doubly linked list of pinned - * but not protected entries. Note that cache entries on - * this list are linked by their next and prev fields. - * - * This field is NULL if the list is empty. - * - * pel_tail_ptr: Pointer to the tail of the doubly linked list of pinned - * but not protected entries. Note that cache entries on - * this list are linked by their next and prev fields. - * - * This field is NULL if the list is empty. - * - * - * The cache must have a replacement policy, and the fields supporting this - * policy must be accessible from this structure. - * - * While there has been interest in several replacement policies for - * this cache, the initial development schedule is tight. Thus I have - * elected to support only a modified LRU policy for the first cut. - * - * To further simplify matters, I have simply included the fields needed - * by the modified LRU in this structure. When and if we add support for - * other policies, it will probably be easiest to just add the necessary - * fields to this structure as well -- we only create one instance of this - * structure per file, so the overhead is not excessive. - * - * - * Fields supporting the modified LRU policy: - * - * See most any OS text for a discussion of the LRU replacement policy. - * - * When operating in parallel mode, we must ensure that a read does not - * cause a write. If it does, the process will hang, as the write will - * be collective and the other processes will not know to participate. - * - * To deal with this issue, I have modified the usual LRU policy by adding - * clean and dirty LRU lists to the usual LRU list. - * - * The clean LRU list is simply the regular LRU list with all dirty cache - * entries removed. - * - * Similarly, the dirty LRU list is the regular LRU list with all the clean - * cache entries removed. - * - * When reading in parallel mode, we evict from the clean LRU list only. - * This implies that we must try to ensure that the clean LRU list is - * reasonably well stocked at all times. - * - * We attempt to do this by trying to flush enough entries on each write - * to keep the cLRU_list_size >= min_clean_size. - * - * Even if we start with a completely clean cache, a sequence of protects - * without unprotects can empty the clean LRU list. In this case, the - * cache must grow temporarily. At the next write, we will attempt to - * evict enough entries to reduce index_size to less than max_cache_size. - * While this will usually be possible, all bets are off if enough entries - * are protected. - * - * Discussions of the individual fields used by the modified LRU replacement - * policy follow: - * - * LRU_list_len: Number of cache entries currently on the LRU list. - * - * Observe that LRU_list_len + pl_len must always equal - * index_len. - * - * LRU_list_size: Number of bytes of cache entries currently residing on the - * LRU list. - * - * Observe that LRU_list_size + pl_size must always equal - * index_size. - * - * LRU_head_ptr: Pointer to the head of the doubly linked LRU list. Cache - * entries on this list are linked by their next and prev fields. - * - * This field is NULL if the list is empty. - * - * LRU_tail_ptr: Pointer to the tail of the doubly linked LRU list. Cache - * entries on this list are linked by their next and prev fields. - * - * This field is NULL if the list is empty. - * - * cLRU_list_len: Number of cache entries currently on the clean LRU list. - * - * Observe that cLRU_list_len + dLRU_list_len must always - * equal LRU_list_len. - * - * cLRU_list_size: Number of bytes of cache entries currently residing on - * the clean LRU list. - * - * Observe that cLRU_list_size + dLRU_list_size must always - * equal LRU_list_size. - * - * cLRU_head_ptr: Pointer to the head of the doubly linked clean LRU list. - * Cache entries on this list are linked by their aux_next and - * aux_prev fields. - * - * This field is NULL if the list is empty. - * - * cLRU_tail_ptr: Pointer to the tail of the doubly linked clean LRU list. - * Cache entries on this list are linked by their aux_next and - * aux_prev fields. - * - * This field is NULL if the list is empty. - * - * dLRU_list_len: Number of cache entries currently on the dirty LRU list. - * - * Observe that cLRU_list_len + dLRU_list_len must always - * equal LRU_list_len. - * - * dLRU_list_size: Number of cache entries currently on the dirty LRU list. - * - * Observe that cLRU_list_len + dLRU_list_len must always - * equal LRU_list_len. - * - * dLRU_head_ptr: Pointer to the head of the doubly linked dirty LRU list. - * Cache entries on this list are linked by their aux_next and - * aux_prev fields. - * - * This field is NULL if the list is empty. - * - * dLRU_tail_ptr: Pointer to the tail of the doubly linked dirty LRU list. - * Cache entries on this list are linked by their aux_next and - * aux_prev fields. - * - * This field is NULL if the list is empty. - * - * - * Automatic cache size adjustment: - * - * While the default cache size is adequate for most cases, we can run into - * cases where the default is too small. Ideally, we will let the user - * adjust the cache size as required. However, this is not possible in all - * cases. Thus I have added automatic cache size adjustment code. - * - * The configuration for the automatic cache size adjustment is stored in - * the structure described below: - * - * size_increase_possible: Depending on the configuration data given - * in the resize_ctl field, it may or may not be possible - * to increase the size of the cache. Rather than test for - * all the ways this can happen, we simply set this flag when - * we receive a new configuration. - * - * flash_size_increase_possible: Depending on the configuration data given - * in the resize_ctl field, it may or may not be possible - * for a flash size increase to occur. We set this flag - * whenever we receive a new configuration so as to avoid - * repeated calculations. - * - * flash_size_increase_threshold: If a flash cache size increase is possible, - * this field is used to store the minimum size of a new entry - * or size increase needed to trigger a flash cache size - * increase. Note that this field must be updated whenever - * the size of the cache is changed. - * - * size_decrease_possible: Depending on the configuration data given - * in the resize_ctl field, it may or may not be possible - * to decrease the size of the cache. Rather than test for - * all the ways this can happen, we simply set this flag when - * we receive a new configuration. - * - * cache_full: Boolean flag used to keep track of whether the cache is - * full, so we can refrain from increasing the size of a - * cache which hasn't used up the space alotted to it. - * - * The field is initialized to FALSE, and then set to TRUE - * whenever we attempt to make space in the cache. - * - * resize_enabled: This is another convenience flag which is set whenever - * a new set of values for resize_ctl are provided. Very - * simply, - * - * resize_enabled = size_increase_possible || - * size_decrease_possible; - * - * size_decreased: Boolean flag set to TRUE whenever the maximun cache - * size is decreased. The flag triggers a call to - * H5C2_make_space_in_cache() on the next call to H5C2_protect(). - * - * resize_ctl: Instance of H5C2_auto_size_ctl_t containing configuration - * data for automatic cache resizing. - * - * epoch_markers_active: Integer field containing the number of epoch - * markers currently in use in the LRU list. This value - * must be in the range [0, H5C2__MAX_EPOCH_MARKERS - 1]. - * - * epoch_marker_active: Array of boolean of length H5C2__MAX_EPOCH_MARKERS. - * This array is used to track which epoch markers are currently - * in use. - * - * epoch_marker_ringbuf: Array of int of length H5C2__MAX_EPOCH_MARKERS + 1. - * - * To manage the epoch marker cache entries, it is necessary - * to track their order in the LRU list. This is done with - * epoch_marker_ringbuf. When markers are inserted at the - * head of the LRU list, the index of the marker in the - * epoch_markers array is inserted at the tail of the ring - * buffer. When it becomes the epoch_marker_active'th marker - * in the LRU list, it will have worked its way to the head - * of the ring buffer as well. This allows us to remove it - * without scanning the LRU list if such is required. - * - * epoch_marker_ringbuf_first: Integer field containing the index of the - * first entry in the ring buffer. - * - * epoch_marker_ringbuf_last: Integer field containing the index of the - * last entry in the ring buffer. - * - * epoch_marker_ringbuf_size: Integer field containing the number of entries - * in the ring buffer. - * - * epoch_markers: Array of instances of H5C2_cache_entry_t of length - * H5C2__MAX_EPOCH_MARKERS. The entries are used as markers - * in the LRU list to identify cache entries that haven't - * been accessed for some (small) specified number of - * epochs. These entries (if any) can then be evicted and - * the cache size reduced -- ideally without evicting any - * of the current working set. Needless to say, the epoch - * length and the number of epochs before an unused entry - * must be chosen so that all, or almost all, the working - * set will be accessed before the limit. - * - * Epoch markers only appear in the LRU list, never in - * the index or slist. While they are of type - * H5C2__EPOCH_MARKER_TYPE, and have associated class - * functions, these functions should never be called. - * - * The addr fields of these instances of H5C2_cache_entry_t - * are set to the index of the instance in the epoch_markers - * array, the size is set to 0, and the type field points - * to the constant structure epoch_marker_class defined - * in H5C2.c. The next and prev fields are used as usual - * to link the entry into the LRU list. - * - * All other fields are unused. - * - * - * Cache hit rate collection fields: - * - * We supply the current cache hit rate on request, so we must keep a - * simple cache hit rate computation regardless of whether statistics - * collection is enabled. The following fields support this capability. - * - * cache_hits: Number of cache hits since the last time the cache hit - * rate statistics were reset. Note that when automatic cache - * re-sizing is enabled, this field will be reset every automatic - * resize epoch. - * - * cache_accesses: Number of times the cache has been accessed while - * since the last since the last time the cache hit rate statistics - * were reset. Note that when automatic cache re-sizing is enabled, - * this field will be reset every automatic resize epoch. - * - * - * Metadata journaling fields: - * - * 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 is FALSE. - * - * trans_in_progress Boolean flag used to indicate whether a metadata - * 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. - * - * 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 - * current transaction. - * - * 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 transaction all of whose associated journal entries - * 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 - * the journal entries of all transactions in which it has - * been modified have been written to disk in the journal - * 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 - * 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 - * + 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 - * 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: - * - * tl_len: Number of entries currently residing on the transaction list. - * - * tl_size: Number of bytes of cache entries currently residing on the - * 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 - * 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 - * 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 - * 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 - * costly, so we store them on the journal write in progress list instead - * until all the journal entries for the specified transaction reaches - * disk. - * - * 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 - * 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 - * 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 - * 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 - * fields. - * - * This field is NULL if the list is empty. - * - * 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 - * cache must be clean when these function are called. - * - * 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 - * 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 - * disabled. - * - * mdjsc_cb_tbl_len: Number of entries currently allocated in *mdjsc_cb_tbl. - * - * num_mdjsc_cbs: Number of callbacks currently registered in the metadata - * journaling status change callback table. - * - * mdjsc_cb_tbl_fl_head: Index of the first free entry in the mdjsc_cb_tbl, - * 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 - * table is empty; - * - * Statistics collection fields: - * - * When enabled, these fields are used to collect statistics as described - * below. The first set are collected only when H5C2_COLLECT_CACHE_STATS - * is true. - * - * hits: 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 in cache when requested in - * the current epoch. - * - * misses: 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 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 - * 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 - * 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 - * in the current epoch. - * - * 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 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 into the cache in the current epoch. - * - * clears: 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 cleared in the current - * epoch. - * - * flushes: 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 written to disk in the - * current epoch. - * - * evictions: 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 evicted from the cache in - * the current epoch. - * - * 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 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 - * 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 - * with type id equal to the array index has been renamed - * during a cache flush in the current epoch. - * - * pins: 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 pinned in the current - * epoch. - * - * unpins: 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 unpinned in the current - * epoch. - * - * dirty_pins: 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 marked dirty while pinned - * in the current epoch. - * - * pinned_flushes: 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 flushed while - * pinned in the current epoch. - * - * pinned_cleared: 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 cleared while - * pinned in the current epoch. - * - * size_increases: 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 increased in - * size in the current epoch. - * - * size_decreases: 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 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 - * 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 - * array index has changed size during a cache flush - * - * total_ht_insertions: Number of times entries have been inserted into the - * hash table in the current epoch. - * - * total_ht_deletions: Number of times entries have been deleted from the - * hash table in the current epoch. - * - * successful_ht_searches: int64 containing the total number of successful - * searches of the hash table in the current epoch. - * - * total_successful_ht_search_depth: int64 containing the total number of - * entries other than the targets examined in successful - * searches of the hash table in the current epoch. - * - * failed_ht_searches: int64 containing the total number of unsuccessful - * searches of the hash table in the current epoch. - * - * total_failed_ht_search_depth: int64 containing the total number of - * entries examined in unsuccessful searches of the hash - * table in the current epoch. - * - * max_index_len: Largest value attained by the index_len field in the - * current epoch. - * - * max_index_size: Largest value attained by the index_size field in the - * current epoch. - * - * max_slist_len: Largest value attained by the slist_len field in the - * current epoch. - * - * max_slist_size: Largest value attained by the slist_size field in the - * current epoch. - * - * max_pl_len: Largest value attained by the pl_len field in the - * current epoch. - * - * max_pl_size: Largest value attained by the pl_size field in the - * current epoch. - * - * max_pel_len: Largest value attained by the pel_len field in the - * current epoch. - * - * max_pel_size: Largest value attained by the pel_size field in the - * current epoch. - * - * The remaining stats are collected only when both H5C2_COLLECT_CACHE_STATS - * and H5C2_COLLECT_CACHE_ENTRY_STATS are true. - * - * max_accesses: Array of int32 of length H5C2__MAX_NUM_TYPE_IDS + 1. The cells - * are used to record the maximum number of times any single - * entry with type id equal to the array index has been - * accessed in the current epoch. - * - * min_accesses: Array of int32 of length H5C2__MAX_NUM_TYPE_IDS + 1. The cells - * are used to record the minimum number of times any single - * entry with type id equal to the array index has been - * accessed in the current epoch. - * - * max_clears: Array of int32 of length H5C2__MAX_NUM_TYPE_IDS + 1. The cells - * are used to record the maximum number of times any single - * entry with type id equal to the array index has been cleared - * in the current epoch. - * - * max_flushes: Array of int32 of length H5C2__MAX_NUM_TYPE_IDS + 1. The cells - * are used to record the maximum number of times any single - * entry with type id equal to the array index has been - * flushed in the current epoch. - * - * max_size: Array of size_t of length H5C2__MAX_NUM_TYPE_IDS + 1. The cells - * are used to record the maximum size of any single entry - * with type id equal to the array index that has resided in - * the cache in the current epoch. - * - * max_pins: Array of size_t of length H5C2__MAX_NUM_TYPE_IDS + 1. The cells - * are used to record the maximum number of times that any single - * entry with type id equal to the array index that has been - * marked as pinned in the cache in the current epoch. - * - * - * Fields supporting testing: - * - * For test purposes, it is useful to turn off some asserts and sanity - * checks. The following flags support this. - * - * skip_file_checks: Boolean flag used to skip sanity checks on file - * parameters passed to the cache. In the test bed, there - * is no reason to have a file open, as the cache proper - * just passes these parameters through without using them. - * - * When this flag is set, all sanity checks on the file - * parameters are skipped. The field defaults to FALSE. - * - * skip_dxpl_id_checks: Boolean flag used to skip sanity checks on the - * dxpl_id parameters passed to the cache. These are not - * used directly by the cache, so skipping the checks - * simplifies the test bed. - * - * When this flag is set, all sanity checks on the dxpl_id - * parameters are skipped. The field defaults to FALSE. - * - * prefix Array of char used to prefix debugging output. The - * field is intended to allow marking of output of with - * the processes mpi rank. - * - ****************************************************************************/ - -#define H5C2__HASH_TABLE_LEN (64 * 1024) /* must be a power of 2 */ - -#define H5C2__H5C2_T_MAGIC 0x005CAC0F -#define H5C2__MAX_NUM_TYPE_IDS 18 -#define H5C2__PREFIX_LEN 32 -#define H5C2__MAX_API_NAME_LEN 128 - -#define H5C2__MIN_MDJSC_CB_TBL_LEN 16 -#define H5C2__MDJSC_CB_TBL_MIN_ACTIVE_RATIO 0.25 - -struct H5C2_t -{ - uint32_t magic; - - hbool_t flush_in_progress; - - FILE * trace_file_ptr; - - void * aux_ptr; - - int32_t max_type_id; - const char * (* type_name_table_ptr); - - size_t max_cache_size; - size_t min_clean_size; - - H5C2_write_permitted_func_t check_write_permitted; - hbool_t write_permitted; - - H5C2_log_flush_func_t log_flush; - - hbool_t evictions_enabled; - - int32_t index_len; - size_t index_size; - H5C2_cache_entry_t * (index[H5C2__HASH_TABLE_LEN]); - - - int32_t slist_len; - size_t slist_size; - H5SL_t * slist_ptr; -#if H5C2_DO_SANITY_CHECKS - int64_t slist_len_increase; - int64_t slist_size_increase; -#endif /* H5C2_DO_SANITY_CHECKS */ - - int32_t pl_len; - size_t pl_size; - H5C2_cache_entry_t * pl_head_ptr; - H5C2_cache_entry_t * pl_tail_ptr; - - int32_t pel_len; - size_t pel_size; - H5C2_cache_entry_t * pel_head_ptr; - H5C2_cache_entry_t * pel_tail_ptr; - - int32_t LRU_list_len; - size_t LRU_list_size; - H5C2_cache_entry_t * LRU_head_ptr; - H5C2_cache_entry_t * LRU_tail_ptr; - - int32_t cLRU_list_len; - size_t cLRU_list_size; - H5C2_cache_entry_t * cLRU_head_ptr; - H5C2_cache_entry_t * cLRU_tail_ptr; - - int32_t dLRU_list_len; - size_t dLRU_list_size; - H5C2_cache_entry_t * dLRU_head_ptr; - H5C2_cache_entry_t * dLRU_tail_ptr; - - hbool_t size_increase_possible; - hbool_t flash_size_increase_possible; - size_t flash_size_increase_threshold; - hbool_t size_decrease_possible; - hbool_t resize_enabled; - hbool_t cache_full; - hbool_t size_decreased; - H5C2_auto_size_ctl_t resize_ctl; - - int32_t epoch_markers_active; - hbool_t epoch_marker_active[H5C2__MAX_EPOCH_MARKERS]; - int32_t epoch_marker_ringbuf[H5C2__MAX_EPOCH_MARKERS+1]; - int32_t epoch_marker_ringbuf_first; - int32_t epoch_marker_ringbuf_last; - int32_t epoch_marker_ringbuf_size; - H5C2_cache_entry_t epoch_markers[H5C2__MAX_EPOCH_MARKERS]; - - 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]; - uint64_t trans_num; - 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 - + 1]; - struct H5C2_jbrb_t mdj_jbrb; - int32_t tl_len; - size_t tl_size; - H5C2_cache_entry_t * tl_head_ptr; - H5C2_cache_entry_t * tl_tail_ptr; - int32_t jwipl_len; - size_t jwipl_size; - H5C2_cache_entry_t * jwipl_head_ptr; - H5C2_cache_entry_t * jwipl_tail_ptr; - H5C2_mdjsc_record_t * mdjsc_cb_tbl; - int32_t mdjsc_cb_tbl_len; - 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 */ - int64_t hits[H5C2__MAX_NUM_TYPE_IDS + 1]; - int64_t misses[H5C2__MAX_NUM_TYPE_IDS + 1]; - int64_t write_protects[H5C2__MAX_NUM_TYPE_IDS + 1]; - int64_t read_protects[H5C2__MAX_NUM_TYPE_IDS + 1]; - int32_t max_read_protects[H5C2__MAX_NUM_TYPE_IDS + 1]; - int64_t insertions[H5C2__MAX_NUM_TYPE_IDS + 1]; - int64_t pinned_insertions[H5C2__MAX_NUM_TYPE_IDS + 1]; - int64_t clears[H5C2__MAX_NUM_TYPE_IDS + 1]; - int64_t flushes[H5C2__MAX_NUM_TYPE_IDS + 1]; - int64_t evictions[H5C2__MAX_NUM_TYPE_IDS + 1]; - int64_t renames[H5C2__MAX_NUM_TYPE_IDS + 1]; - int64_t entry_flush_renames[H5C2__MAX_NUM_TYPE_IDS + 1]; - int64_t cache_flush_renames[H5C2__MAX_NUM_TYPE_IDS + 1]; - int64_t pins[H5C2__MAX_NUM_TYPE_IDS + 1]; - int64_t unpins[H5C2__MAX_NUM_TYPE_IDS + 1]; - int64_t dirty_pins[H5C2__MAX_NUM_TYPE_IDS + 1]; - int64_t pinned_flushes[H5C2__MAX_NUM_TYPE_IDS + 1]; - int64_t pinned_clears[H5C2__MAX_NUM_TYPE_IDS + 1]; - int64_t size_increases[H5C2__MAX_NUM_TYPE_IDS + 1]; - int64_t size_decreases[H5C2__MAX_NUM_TYPE_IDS + 1]; - int64_t entry_flush_size_changes - [H5C2__MAX_NUM_TYPE_IDS + 1]; - int64_t cache_flush_size_changes - [H5C2__MAX_NUM_TYPE_IDS + 1]; - - int64_t total_ht_insertions; - int64_t total_ht_deletions; - int64_t successful_ht_searches; - int64_t total_successful_ht_search_depth; - int64_t failed_ht_searches; - int64_t total_failed_ht_search_depth; - - int32_t max_index_len; - size_t max_index_size; - - int32_t max_slist_len; - size_t max_slist_size; - - int32_t max_pl_len; - size_t max_pl_size; - - int32_t max_pel_len; - size_t max_pel_size; - -#if H5C2_COLLECT_CACHE_ENTRY_STATS - - int32_t max_accesses[H5C2__MAX_NUM_TYPE_IDS + 1]; - int32_t min_accesses[H5C2__MAX_NUM_TYPE_IDS + 1]; - int32_t max_clears[H5C2__MAX_NUM_TYPE_IDS + 1]; - int32_t max_flushes[H5C2__MAX_NUM_TYPE_IDS + 1]; - size_t max_size[H5C2__MAX_NUM_TYPE_IDS + 1]; - int32_t max_pins[H5C2__MAX_NUM_TYPE_IDS + 1]; - -#endif /* H5C2_COLLECT_CACHE_ENTRY_STATS */ - -#endif /* H5C2_COLLECT_CACHE_STATS */ - - hbool_t skip_file_checks; - hbool_t skip_dxpl_id_checks; - char prefix[H5C2__PREFIX_LEN]; -}; - - -/****************************************************************************/ -/***************************** Macro Definitions ****************************/ -/****************************************************************************/ - -/**************************************************************************** - * - * We maintain doubly linked lists of instances of H5C2_cache_entry_t for a - * variety of reasons -- protected list, LRU list, and the clean and dirty - * LRU lists at present. The following macros support linking and unlinking - * of instances of H5C2_cache_entry_t by both their regular and auxilary next - * and previous pointers. - * - * The size and length fields are also maintained. - * - * Note that the relevant pair of prev and next pointers are presumed to be - * NULL on entry in the insertion macros. - * - * Finally, observe that the sanity checking macros evaluate to the empty - * string when H5C2_DO_SANITY_CHECKS is FALSE. They also contain calls - * to the HGOTO_ERROR macro, which may not be appropriate in all cases. - * If so, we will need versions of the insertion and deletion macros which - * do not reference the sanity checking macros. - * JRM - 5/5/04 - * - * Changes: - * - * - Removed the line: - * - * ( ( (Size) == (entry_ptr)->size ) && ( (len) != 1 ) ) || - * - * from the H5C2__DLL_PRE_REMOVE_SC macro. With the addition of the - * epoch markers used in the age out based cache size reduction algorithm, - * this invarient need not hold, as the epoch markers are of size 0. - * - * One could argue that I should have given the epoch markers a positive - * size, but this would break the index_size = LRU_list_size + pl_size - * + pel_size invarient. - * - * Alternatively, I could pass the current decr_mode in to the macro, - * and just skip the check whenever epoch markers may be in use. - * - * However, any size errors should be caught when the cache is flushed - * and destroyed. Until we are tracking such an error, this should be - * good enough. - * JRM - 12/9/04 - * - * - * - In the H5C2__DLL_PRE_INSERT_SC macro, replaced the lines: - * - * ( ( (len) == 1 ) && - * ( ( (head_ptr) != (tail_ptr) ) || ( (Size) <= 0 ) || - * ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) ) - * ) - * ) || - * - * with: - * - * ( ( (len) == 1 ) && - * ( ( (head_ptr) != (tail_ptr) ) || - * ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) ) - * ) - * ) || - * - * Epoch markers have size 0, so we can now have a non-empty list with - * zero size. Hence the "( (Size) <= 0 )" clause cause false failures - * in the sanity check. Since "Size" is typically a size_t, it can't - * take on negative values, and thus the revised clause "( (Size) < 0 )" - * caused compiler warnings. - * JRM - 12/22/04 - * - * - In the H5C2__DLL_SC macro, replaced the lines: - * - * ( ( (len) == 1 ) && - * ( ( (head_ptr) != (tail_ptr) ) || ( (cache_ptr)->size <= 0 ) || - * ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) ) - * ) - * ) || - * - * with - * - * ( ( (len) == 1 ) && - * ( ( (head_ptr) != (tail_ptr) ) || - * ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) ) - * ) - * ) || - * - * Epoch markers have size 0, so we can now have a non-empty list with - * zero size. Hence the "( (Size) <= 0 )" clause cause false failures - * in the sanity check. Since "Size" is typically a size_t, it can't - * take on negative values, and thus the revised clause "( (Size) < 0 )" - * caused compiler warnings. - * JRM - 1/10/05 - * - * - Added the H5C2__DLL_UPDATE_FOR_SIZE_CHANGE macro and the associated - * sanity checking macros. These macro are used to update the size of - * a DLL when one of its entries changes size. - * - * 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 - * fields are used to maintain a list of entries that have been dirtied - * in the current transaction. At the end of the transaction, this - * list is used to generate the needed journal entries. - * - * JRM -- 3/27/08 - * - ****************************************************************************/ - -#if H5C2_DO_SANITY_CHECKS - -#define H5C2__DLL_PRE_REMOVE_SC(entry_ptr, head_ptr, tail_ptr, len, Size, fv) \ -if ( ( (head_ptr) == NULL ) || \ - ( (tail_ptr) == NULL ) || \ - ( (entry_ptr) == NULL ) || \ - ( (len) <= 0 ) || \ - ( (Size) < (entry_ptr)->size ) || \ - ( ( (entry_ptr)->prev == NULL ) && ( (head_ptr) != (entry_ptr) ) ) || \ - ( ( (entry_ptr)->next == NULL ) && ( (tail_ptr) != (entry_ptr) ) ) || \ - ( ( (len) == 1 ) && \ - ( ! ( ( (head_ptr) == (entry_ptr) ) && \ - ( (tail_ptr) == (entry_ptr) ) && \ - ( (entry_ptr)->next == NULL ) && \ - ( (entry_ptr)->prev == NULL ) && \ - ( (Size) == (entry_ptr)->size ) \ - ) \ - ) \ - ) \ - ) { \ - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "DLL pre remove SC failed") \ -} - -#define H5C2__DLL_SC(head_ptr, tail_ptr, len, Size, fv) \ -if ( ( ( ( (head_ptr) == NULL ) || ( (tail_ptr) == NULL ) ) && \ - ( (head_ptr) != (tail_ptr) ) \ - ) || \ - ( (len) < 0 ) || \ - ( (Size) < 0 ) || \ - ( ( (len) == 1 ) && \ - ( ( (head_ptr) != (tail_ptr) ) || \ - ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) ) \ - ) \ - ) || \ - ( ( (len) >= 1 ) && \ - ( ( (head_ptr) == NULL ) || ( (head_ptr)->prev != NULL ) || \ - ( (tail_ptr) == NULL ) || ( (tail_ptr)->next != NULL ) \ - ) \ - ) \ - ) { \ - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "DLL sanity check failed") \ -} - -#define H5C2__DLL_PRE_INSERT_SC(entry_ptr, head_ptr, tail_ptr, len, Size, fv) \ -if ( ( (entry_ptr) == NULL ) || \ - ( (entry_ptr)->next != NULL ) || \ - ( (entry_ptr)->prev != NULL ) || \ - ( ( ( (head_ptr) == NULL ) || ( (tail_ptr) == NULL ) ) && \ - ( (head_ptr) != (tail_ptr) ) \ - ) || \ - ( (len) < 0 ) || \ - ( ( (len) == 1 ) && \ - ( ( (head_ptr) != (tail_ptr) ) || \ - ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) ) \ - ) \ - ) || \ - ( ( (len) >= 1 ) && \ - ( ( (head_ptr) == NULL ) || ( (head_ptr)->prev != NULL ) || \ - ( (tail_ptr) == NULL ) || ( (tail_ptr)->next != NULL ) \ - ) \ - ) \ - ) { \ - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "DLL pre insert SC failed") \ -} - -#define H5C2__DLL_PRE_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size) \ -if ( ( (dll_len) <= 0 ) || \ - ( (dll_size) <= 0 ) || \ - ( (old_size) <= 0 ) || \ - ( (old_size) > (dll_size) ) || \ - ( (new_size) <= 0 ) || \ - ( ( (dll_len) == 1 ) && ( (old_size) != (dll_size) ) ) ) { \ - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "DLL pre size update SC failed") \ -} - -#define H5C2__DLL_POST_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size) \ -if ( ( (new_size) > (dll_size) ) || \ - ( ( (dll_len) == 1 ) && ( (new_size) != (dll_size) ) ) ) { \ - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "DLL post size update SC failed") \ -} - -#else /* H5C2_DO_SANITY_CHECKS */ - -#define H5C2__DLL_PRE_REMOVE_SC(entry_ptr, head_ptr, tail_ptr, len, Size, fv) -#define H5C2__DLL_SC(head_ptr, tail_ptr, len, Size, fv) -#define H5C2__DLL_PRE_INSERT_SC(entry_ptr, head_ptr, tail_ptr, len, Size, fv) -#define H5C2__DLL_PRE_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size) -#define H5C2__DLL_POST_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size) - -#endif /* H5C2_DO_SANITY_CHECKS */ - - -#define H5C2__DLL_APPEND(entry_ptr, head_ptr, tail_ptr, len, Size, fail_val) \ - H5C2__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)->next = (entry_ptr); \ - (entry_ptr)->prev = (tail_ptr); \ - (tail_ptr) = (entry_ptr); \ - } \ - (len)++; \ - (Size) += (entry_ptr)->size; - -#define H5C2__DLL_PREPEND(entry_ptr, head_ptr, tail_ptr, len, Size, fail_val) \ - H5C2__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 \ - { \ - (head_ptr)->prev = (entry_ptr); \ - (entry_ptr)->next = (head_ptr); \ - (head_ptr) = (entry_ptr); \ - } \ - (len)++; \ - (Size) += entry_ptr->size; - -#define H5C2__DLL_REMOVE(entry_ptr, head_ptr, tail_ptr, len, Size, fail_val) \ - H5C2__DLL_PRE_REMOVE_SC(entry_ptr, head_ptr, tail_ptr, len, Size, \ - fail_val) \ - { \ - if ( (head_ptr) == (entry_ptr) ) \ - { \ - (head_ptr) = (entry_ptr)->next; \ - if ( (head_ptr) != NULL ) \ - { \ - (head_ptr)->prev = NULL; \ - } \ - } \ - else \ - { \ - (entry_ptr)->prev->next = (entry_ptr)->next; \ - } \ - if ( (tail_ptr) == (entry_ptr) ) \ - { \ - (tail_ptr) = (entry_ptr)->prev; \ - if ( (tail_ptr) != NULL ) \ - { \ - (tail_ptr)->next = NULL; \ - } \ - } \ - else \ - { \ - (entry_ptr)->next->prev = (entry_ptr)->prev; \ - } \ - entry_ptr->next = NULL; \ - entry_ptr->prev = NULL; \ - (len)--; \ - (Size) -= entry_ptr->size; \ - } - -#define H5C2__DLL_UPDATE_FOR_SIZE_CHANGE(dll_len, dll_size, old_size, new_size) \ - H5C2__DLL_PRE_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size) \ - (dll_size) -= (old_size); \ - (dll_size) += (new_size); \ - H5C2__DLL_POST_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size) - -#if H5C2_DO_SANITY_CHECKS - -#define H5C2__AUX_DLL_PRE_REMOVE_SC(entry_ptr, hd_ptr, tail_ptr, len, Size, fv) \ -if ( ( (hd_ptr) == NULL ) || \ - ( (tail_ptr) == NULL ) || \ - ( (entry_ptr) == NULL ) || \ - ( (len) <= 0 ) || \ - ( (Size) < (entry_ptr)->size ) || \ - ( ( (Size) == (entry_ptr)->size ) && ( ! ( (len) == 1 ) ) ) || \ - ( ( (entry_ptr)->aux_prev == NULL ) && ( (hd_ptr) != (entry_ptr) ) ) || \ - ( ( (entry_ptr)->aux_next == NULL ) && ( (tail_ptr) != (entry_ptr) ) ) || \ - ( ( (len) == 1 ) && \ - ( ! ( ( (hd_ptr) == (entry_ptr) ) && ( (tail_ptr) == (entry_ptr) ) && \ - ( (entry_ptr)->aux_next == NULL ) && \ - ( (entry_ptr)->aux_prev == NULL ) && \ - ( (Size) == (entry_ptr)->size ) \ - ) \ - ) \ - ) \ - ) { \ - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "aux DLL pre remove SC failed") \ -} - -#define H5C2__AUX_DLL_SC(head_ptr, tail_ptr, len, Size, fv) \ -if ( ( ( ( (head_ptr) == NULL ) || ( (tail_ptr) == NULL ) ) && \ - ( (head_ptr) != (tail_ptr) ) \ - ) || \ - ( (len) < 0 ) || \ - ( (Size) < 0 ) || \ - ( ( (len) == 1 ) && \ - ( ( (head_ptr) != (tail_ptr) ) || ( (Size) <= 0 ) || \ - ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) ) \ - ) \ - ) || \ - ( ( (len) >= 1 ) && \ - ( ( (head_ptr) == NULL ) || ( (head_ptr)->aux_prev != NULL ) || \ - ( (tail_ptr) == NULL ) || ( (tail_ptr)->aux_next != NULL ) \ - ) \ - ) \ - ) { \ - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "AUX DLL sanity check failed") \ -} - -#define H5C2__AUX_DLL_PRE_INSERT_SC(entry_ptr, hd_ptr, tail_ptr, len, Size, fv)\ -if ( ( (entry_ptr) == NULL ) || \ - ( (entry_ptr)->aux_next != NULL ) || \ - ( (entry_ptr)->aux_prev != NULL ) || \ - ( ( ( (hd_ptr) == NULL ) || ( (tail_ptr) == NULL ) ) && \ - ( (hd_ptr) != (tail_ptr) ) \ - ) || \ - ( (len) < 0 ) || \ - ( ( (len) == 1 ) && \ - ( ( (hd_ptr) != (tail_ptr) ) || ( (Size) <= 0 ) || \ - ( (hd_ptr) == NULL ) || ( (hd_ptr)->size != (Size) ) \ - ) \ - ) || \ - ( ( (len) >= 1 ) && \ - ( ( (hd_ptr) == NULL ) || ( (hd_ptr)->aux_prev != NULL ) || \ - ( (tail_ptr) == NULL ) || ( (tail_ptr)->aux_next != NULL ) \ - ) \ - ) \ - ) { \ - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "AUX DLL pre insert SC failed") \ -} - -#else /* H5C2_DO_SANITY_CHECKS */ - -#define H5C2__AUX_DLL_PRE_REMOVE_SC(entry_ptr, hd_ptr, tail_ptr, len, Size, fv) -#define H5C2__AUX_DLL_SC(head_ptr, tail_ptr, len, Size, fv) -#define H5C2__AUX_DLL_PRE_INSERT_SC(entry_ptr, hd_ptr, tail_ptr, len, Size, fv) - -#endif /* H5C2_DO_SANITY_CHECKS */ - - -#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)++; \ - (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)++; \ - (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; \ - } - -#if H5C2_DO_SANITY_CHECKS - -#define H5C2__TRANS_DLL_PRE_REMOVE_SC(entry_ptr, hd_ptr, tail_ptr, \ - len, Size, fv) \ -if ( ( (hd_ptr) == NULL ) || \ - ( (tail_ptr) == NULL ) || \ - ( (entry_ptr) == NULL ) || \ - ( (len) <= 0 ) || \ - ( (Size) < (entry_ptr)->size ) || \ - ( ( (Size) == (entry_ptr)->size ) && ( ! ( (len) == 1 ) ) ) || \ - ( ( (entry_ptr)->trans_prev == NULL ) && ( (hd_ptr) != (entry_ptr) ) ) || \ - ( ( (entry_ptr)->trans_next == NULL ) && \ - ( (tail_ptr) != (entry_ptr) ) ) || \ - ( ( (len) == 1 ) && \ - ( ! ( ( (hd_ptr) == (entry_ptr) ) && ( (tail_ptr) == (entry_ptr) ) && \ - ( (entry_ptr)->trans_next == NULL ) && \ - ( (entry_ptr)->trans_prev == NULL ) && \ - ( (Size) == (entry_ptr)->size ) \ - ) \ - ) \ - ) \ - ) { \ - HDfprintf(stdout, "%s: TRANS DLL pre remove SC failed.\n", FUNC); \ - /* JRM */ /* Debugging code -- remove eventually */ \ - if ( (hd_ptr) == NULL ) HDfprintf(stdout, "( (hd_ptr) == NULL ).\n" );\ - if ( (tail_ptr) == NULL ) HDfprintf(stdout, "(tail_ptr) == NULL\n");\ - if ( (entry_ptr) == NULL ) HDfprintf(stdout, "(entry_ptr) == NULL\n");\ - if ( (len) <= 0 ) HDfprintf(stdout, "( (len) <= 0 )\n");\ - if ( (Size) < (entry_ptr)->size ) \ - HDfprintf(stdout,"( (Size) < (entry_ptr)->size )\n");\ - if ( ( (Size) == (entry_ptr)->size ) && ( ! ( (len) == 1 ) ) ) \ - HDfprintf(stdout, "(((Size)==(entry_ptr)->size)&&(!((len) == 1)))\n");\ - if ( ( (entry_ptr)->trans_prev == NULL ) && ( (hd_ptr) != (entry_ptr) ) ) \ - HDfprintf(stdout,"(((entry_ptr)->trans_prev==NULL)&&((hd_ptr)!=(entry_ptr)))\n");\ - if ( ((entry_ptr)->trans_next == NULL) && ((tail_ptr) != (entry_ptr)) ) \ - HDfprintf(stdout,"(((entry_ptr)->trans_next==NULL)&&((tail_ptr)!=(entry_ptr)))\n"); \ - if ( ( (len) == 1 ) && \ - ( ! ( ( (hd_ptr) == (entry_ptr) ) && ( (tail_ptr) == (entry_ptr) ) && \ - ( (entry_ptr)->trans_next == NULL ) && \ - ( (entry_ptr)->trans_prev == NULL ) && \ - ( (Size) == (entry_ptr)->size ) ) ) ) \ - HDfprintf(stdout,"long condition failed\n"); \ - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "TRANS DLL pre remove SC failed") \ -} - -#define H5C2__TRANS_DLL_SC(head_ptr, tail_ptr, len, Size, fv) \ -if ( ( ( ( (head_ptr) == NULL ) || ( (tail_ptr) == NULL ) ) && \ - ( (head_ptr) != (tail_ptr) ) \ - ) || \ - ( (len) < 0 ) || \ - ( (Size) < 0 ) || \ - ( ( (len) == 1 ) && \ - ( ( (head_ptr) != (tail_ptr) ) || ( (Size) <= 0 ) || \ - ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) ) \ - ) \ - ) || \ - ( ( (len) >= 1 ) && \ - ( ( (head_ptr) == NULL ) || ( (head_ptr)->trans_prev != NULL ) || \ - ( (tail_ptr) == NULL ) || ( (tail_ptr)->trans_next != NULL ) \ - ) \ - ) \ - ) { \ - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "TRANS DLL sanity check failed") \ -} - -#define H5C2__TRANS_DLL_PRE_INSERT_SC(entry_ptr, hd_ptr, tail_ptr, \ - len, Size, fv) \ -if ( ( (entry_ptr) == NULL ) || \ - ( ! ((entry_ptr)->is_dirty) ) || \ - ( (entry_ptr)->trans_next != NULL ) || \ - ( (entry_ptr)->trans_prev != NULL ) || \ - ( ( ( (hd_ptr) == NULL ) || ( (tail_ptr) == NULL ) ) && \ - ( (hd_ptr) != (tail_ptr) ) \ - ) || \ - ( (len) < 0 ) || \ - ( ( (len) == 1 ) && \ - ( ( (hd_ptr) != (tail_ptr) ) || ( (Size) <= 0 ) || \ - ( (hd_ptr) == NULL ) || ( (hd_ptr)->size != (Size) ) \ - ) \ - ) || \ - ( ( (len) >= 1 ) && \ - ( ( (hd_ptr) == NULL ) || ( (hd_ptr)->trans_prev != NULL ) || \ - ( (tail_ptr) == NULL ) || ( (tail_ptr)->trans_next != NULL ) \ - ) \ - ) \ - ) { \ - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "TRANS DLL pre insert SC failed") \ -} - -#else /* H5C2_DO_SANITY_CHECKS */ - -#define H5C2__TRANS_DLL_PRE_REMOVE_SC(entry_ptr, hd_ptr, tail_ptr, len, Size, fv) -#define H5C2__TRANS_DLL_SC(head_ptr, tail_ptr, len, Size, fv) -#define H5C2__TRANS_DLL_PRE_INSERT_SC(entry_ptr, hd_ptr, tail_ptr, len, Size, fv) - -#endif /* H5C2_DO_SANITY_CHECKS */ - - -#define H5C2__TRANS_DLL_APPEND(entry_ptr, head_ptr, tail_ptr, len, \ - Size, fail_val) \ - H5C2__TRANS_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)->trans_next = (entry_ptr); \ - (entry_ptr)->trans_prev = (tail_ptr); \ - (tail_ptr) = (entry_ptr); \ - } \ - (len)++; \ - (Size) += entry_ptr->size; - -#define H5C2__TRANS_DLL_PREPEND(entry_ptr, head_ptr, tail_ptr, len, Size, fv) \ - H5C2__TRANS_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)->trans_prev = (entry_ptr); \ - (entry_ptr)->trans_next = (head_ptr); \ - (head_ptr) = (entry_ptr); \ - } \ - (len)++; \ - (Size) += entry_ptr->size; - -#define H5C2__TRANS_DLL_REMOVE(entry_ptr, head_ptr, tail_ptr, len, Size, fv) \ - H5C2__TRANS_DLL_PRE_REMOVE_SC(entry_ptr, head_ptr, tail_ptr, len, \ - Size, fv) \ - { \ - if ( (head_ptr) == (entry_ptr) ) \ - { \ - (head_ptr) = (entry_ptr)->trans_next; \ - if ( (head_ptr) != NULL ) \ - { \ - (head_ptr)->trans_prev = NULL; \ - } \ - } \ - else \ - { \ - (entry_ptr)->trans_prev->trans_next = (entry_ptr)->trans_next; \ - } \ - if ( (tail_ptr) == (entry_ptr) ) \ - { \ - (tail_ptr) = (entry_ptr)->trans_prev; \ - if ( (tail_ptr) != NULL ) \ - { \ - (tail_ptr)->trans_next = NULL; \ - } \ - } \ - else \ - { \ - (entry_ptr)->trans_next->trans_prev = (entry_ptr)->trans_prev; \ - } \ - entry_ptr->trans_next = NULL; \ - entry_ptr->trans_prev = NULL; \ - (len)--; \ - (Size) -= entry_ptr->size; \ - } - - -/*********************************************************************** - * - * Stats collection macros - * - * The following macros must handle stats collection when this collection - * is enabled, and evaluate to the empty string when it is not. - * - * The sole exception to this rule is - * H5C2__UPDATE_CACHE_HIT_RATE_STATS(), which is always active as - * the cache hit rate stats are always collected and available. - * - * Changes: - * - * JRM -- 3/21/06 - * Added / updated macros for pinned entry related stats. - * - * JRM -- 8/9/06 - * More pinned entry stats related updates. - * - * JRM -- 3/31/07 - * Updated H5C2__UPDATE_STATS_FOR_PROTECT() to keep stats on - * read and write protects. - * - ***********************************************************************/ - -#define H5C2__UPDATE_CACHE_HIT_RATE_STATS(cache_ptr, hit) \ - (cache_ptr->cache_accesses)++; \ - if ( hit ) { \ - (cache_ptr->cache_hits)++; \ - } \ - -#if H5C2_COLLECT_CACHE_STATS - -#define H5C2__UPDATE_STATS_FOR_DIRTY_PIN(cache_ptr, entry_ptr) \ - (((cache_ptr)->dirty_pins)[(entry_ptr)->type->id])++; - -#define H5C2__UPDATE_STATS_FOR_UNPROTECT(cache_ptr) \ - if ( (cache_ptr)->slist_len > (cache_ptr)->max_slist_len ) \ - (cache_ptr)->max_slist_len = (cache_ptr)->slist_len; \ - if ( (cache_ptr)->slist_size > (cache_ptr)->max_slist_size ) \ - (cache_ptr)->max_slist_size = (cache_ptr)->slist_size; \ - if ( (cache_ptr)->pel_len > (cache_ptr)->max_pel_len ) \ - (cache_ptr)->max_pel_len = (cache_ptr)->pel_len; \ - if ( (cache_ptr)->pel_size > (cache_ptr)->max_pel_size ) \ - (cache_ptr)->max_pel_size = (cache_ptr)->pel_size; - -#define H5C2__UPDATE_STATS_FOR_RENAME(cache_ptr, entry_ptr) \ - if ( cache_ptr->flush_in_progress ) { \ - ((cache_ptr)->cache_flush_renames[(entry_ptr)->type->id])++; \ - } \ - if ( entry_ptr->flush_in_progress ) { \ - ((cache_ptr)->entry_flush_renames[(entry_ptr)->type->id])++; \ - } \ - (((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])++; \ - } - -#define H5C2__UPDATE_STATS_FOR_HT_INSERTION(cache_ptr) \ - (cache_ptr)->total_ht_insertions++; - -#define H5C2__UPDATE_STATS_FOR_HT_DELETION(cache_ptr) \ - (cache_ptr)->total_ht_deletions++; - -#define H5C2__UPDATE_STATS_FOR_HT_SEARCH(cache_ptr, success, depth) \ - if ( success ) { \ - (cache_ptr)->successful_ht_searches++; \ - (cache_ptr)->total_successful_ht_search_depth += depth; \ - } else { \ - (cache_ptr)->failed_ht_searches++; \ - (cache_ptr)->total_failed_ht_search_depth += depth; \ - } - -#define H5C2__UPDATE_STATS_FOR_UNPIN(cache_ptr, entry_ptr) \ - ((cache_ptr)->unpins)[(entry_ptr)->type->id]++; - -#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)->pins = 0; - -#define H5C2__UPDATE_STATS_FOR_CLEAR(cache_ptr, entry_ptr) \ - (((cache_ptr)->clears)[(entry_ptr)->type->id])++; \ - if ( (entry_ptr)->is_pinned ) { \ - (((cache_ptr)->pinned_clears)[(entry_ptr)->type->id])++; \ - } \ - ((entry_ptr)->clears)++; - -#define H5C2__UPDATE_STATS_FOR_FLUSH(cache_ptr, entry_ptr) \ - (((cache_ptr)->flushes)[(entry_ptr)->type->id])++; \ - if ( (entry_ptr)->is_pinned ) { \ - (((cache_ptr)->pinned_flushes)[(entry_ptr)->type->id])++; \ - } \ - ((entry_ptr)->flushes)++; - -#define H5C2__UPDATE_STATS_FOR_EVICTION(cache_ptr, entry_ptr) \ - (((cache_ptr)->evictions)[(entry_ptr)->type->id])++; \ - if ( (entry_ptr)->accesses > \ - ((cache_ptr)->max_accesses)[(entry_ptr)->type->id] ) { \ - ((cache_ptr)->max_accesses)[(entry_ptr)->type->id] \ - = (entry_ptr)->accesses; \ - } \ - if ( (entry_ptr)->accesses < \ - ((cache_ptr)->min_accesses)[(entry_ptr)->type->id] ) { \ - ((cache_ptr)->min_accesses)[(entry_ptr)->type->id] \ - = (entry_ptr)->accesses; \ - } \ - if ( (entry_ptr)->clears > \ - ((cache_ptr)->max_clears)[(entry_ptr)->type->id] ) { \ - ((cache_ptr)->max_clears)[(entry_ptr)->type->id] \ - = (entry_ptr)->clears; \ - } \ - if ( (entry_ptr)->flushes > \ - ((cache_ptr)->max_flushes)[(entry_ptr)->type->id] ) { \ - ((cache_ptr)->max_flushes)[(entry_ptr)->type->id] \ - = (entry_ptr)->flushes; \ - } \ - if ( (entry_ptr)->size > \ - ((cache_ptr)->max_size)[(entry_ptr)->type->id] ) { \ - ((cache_ptr)->max_size)[(entry_ptr)->type->id] \ - = (entry_ptr)->size; \ - } \ - if ( (entry_ptr)->pins > \ - ((cache_ptr)->max_pins)[(entry_ptr)->type->id] ) { \ - ((cache_ptr)->max_pins)[(entry_ptr)->type->id] \ - = (entry_ptr)->pins; \ - } - -#define H5C2__UPDATE_STATS_FOR_INSERTION(cache_ptr, entry_ptr) \ - (((cache_ptr)->insertions)[(entry_ptr)->type->id])++; \ - if ( (entry_ptr)->is_pinned ) { \ - (((cache_ptr)->pinned_insertions)[(entry_ptr)->type->id])++; \ - ((cache_ptr)->pins)[(entry_ptr)->type->id]++; \ - (entry_ptr)->pins++; \ - if ( (cache_ptr)->pel_len > (cache_ptr)->max_pel_len ) \ - (cache_ptr)->max_pel_len = (cache_ptr)->pel_len; \ - if ( (cache_ptr)->pel_size > (cache_ptr)->max_pel_size ) \ - (cache_ptr)->max_pel_size = (cache_ptr)->pel_size; \ - } \ - if ( (cache_ptr)->index_len > (cache_ptr)->max_index_len ) \ - (cache_ptr)->max_index_len = (cache_ptr)->index_len; \ - if ( (cache_ptr)->index_size > (cache_ptr)->max_index_size ) \ - (cache_ptr)->max_index_size = (cache_ptr)->index_size; \ - if ( (cache_ptr)->slist_len > (cache_ptr)->max_slist_len ) \ - (cache_ptr)->max_slist_len = (cache_ptr)->slist_len; \ - if ( (cache_ptr)->slist_size > (cache_ptr)->max_slist_size ) \ - (cache_ptr)->max_slist_size = (cache_ptr)->slist_size; \ - if ( (entry_ptr)->size > \ - ((cache_ptr)->max_size)[(entry_ptr)->type->id] ) { \ - ((cache_ptr)->max_size)[(entry_ptr)->type->id] \ - = (entry_ptr)->size; \ - } - -#define H5C2__UPDATE_STATS_FOR_PROTECT(cache_ptr, entry_ptr, hit) \ - if ( hit ) \ - ((cache_ptr)->hits)[(entry_ptr)->type->id]++; \ - else \ - ((cache_ptr)->misses)[(entry_ptr)->type->id]++; \ - if ( ! ((entry_ptr)->is_read_only) ) { \ - ((cache_ptr)->write_protects)[(entry_ptr)->type->id]++; \ - } else { \ - ((cache_ptr)->read_protects)[(entry_ptr)->type->id]++; \ - if ( ((entry_ptr)->ro_ref_count) > \ - ((cache_ptr)->max_read_protects)[(entry_ptr)->type->id] ) { \ - ((cache_ptr)->max_read_protects)[(entry_ptr)->type->id] = \ - ((entry_ptr)->ro_ref_count); \ - } \ - } \ - if ( (cache_ptr)->index_len > (cache_ptr)->max_index_len ) \ - (cache_ptr)->max_index_len = (cache_ptr)->index_len; \ - if ( (cache_ptr)->index_size > (cache_ptr)->max_index_size ) \ - (cache_ptr)->max_index_size = (cache_ptr)->index_size; \ - if ( (cache_ptr)->pl_len > (cache_ptr)->max_pl_len ) \ - (cache_ptr)->max_pl_len = (cache_ptr)->pl_len; \ - if ( (cache_ptr)->pl_size > (cache_ptr)->max_pl_size ) \ - (cache_ptr)->max_pl_size = (cache_ptr)->pl_size; \ - if ( (entry_ptr)->size > \ - ((cache_ptr)->max_size)[(entry_ptr)->type->id] ) { \ - ((cache_ptr)->max_size)[(entry_ptr)->type->id] \ - = (entry_ptr)->size; \ - } \ - ((entry_ptr)->accesses)++; - -#define H5C2__UPDATE_STATS_FOR_PIN(cache_ptr, entry_ptr) \ - ((cache_ptr)->pins)[(entry_ptr)->type->id]++; \ - (entry_ptr)->pins++; \ - if ( (cache_ptr)->pel_len > (cache_ptr)->max_pel_len ) \ - (cache_ptr)->max_pel_len = (cache_ptr)->pel_len; \ - if ( (cache_ptr)->pel_size > (cache_ptr)->max_pel_size ) \ - (cache_ptr)->max_pel_size = (cache_ptr)->pel_size; - -#else /* H5C2_COLLECT_CACHE_ENTRY_STATS */ - -#define H5C2__RESET_CACHE_ENTRY_STATS(entry_ptr) - -#define H5C2__UPDATE_STATS_FOR_CLEAR(cache_ptr, entry_ptr) \ - if ( (entry_ptr)->is_pinned ) { \ - (((cache_ptr)->pinned_clears)[(entry_ptr)->type->id])++; \ - } \ - (((cache_ptr)->clears)[(entry_ptr)->type->id])++; - -#define H5C2__UPDATE_STATS_FOR_FLUSH(cache_ptr, entry_ptr) \ - (((cache_ptr)->flushes)[(entry_ptr)->type->id])++; \ - if ( (entry_ptr)->is_pinned ) { \ - (((cache_ptr)->pinned_flushes)[(entry_ptr)->type->id])++; \ - } - -#define H5C2__UPDATE_STATS_FOR_EVICTION(cache_ptr, entry_ptr) \ - (((cache_ptr)->evictions)[(entry_ptr)->type->id])++; - -#define H5C2__UPDATE_STATS_FOR_INSERTION(cache_ptr, entry_ptr) \ - (((cache_ptr)->insertions)[(entry_ptr)->type->id])++; \ - if ( (entry_ptr)->is_pinned ) { \ - (((cache_ptr)->pinned_insertions)[(entry_ptr)->type->id])++; \ - ((cache_ptr)->pins)[(entry_ptr)->type->id]++; \ - if ( (cache_ptr)->pel_len > (cache_ptr)->max_pel_len ) \ - (cache_ptr)->max_pel_len = (cache_ptr)->pel_len; \ - if ( (cache_ptr)->pel_size > (cache_ptr)->max_pel_size ) \ - (cache_ptr)->max_pel_size = (cache_ptr)->pel_size; \ - } \ - if ( (cache_ptr)->index_len > (cache_ptr)->max_index_len ) \ - (cache_ptr)->max_index_len = (cache_ptr)->index_len; \ - if ( (cache_ptr)->index_size > (cache_ptr)->max_index_size ) \ - (cache_ptr)->max_index_size = (cache_ptr)->index_size; \ - if ( (cache_ptr)->slist_len > (cache_ptr)->max_slist_len ) \ - (cache_ptr)->max_slist_len = (cache_ptr)->slist_len; \ - if ( (cache_ptr)->slist_size > (cache_ptr)->max_slist_size ) \ - (cache_ptr)->max_slist_size = (cache_ptr)->slist_size; - -#define H5C2__UPDATE_STATS_FOR_PROTECT(cache_ptr, entry_ptr, hit) \ - if ( hit ) \ - ((cache_ptr)->hits)[(entry_ptr)->type->id]++; \ - else \ - ((cache_ptr)->misses)[(entry_ptr)->type->id]++; \ - if ( ! ((entry_ptr)->is_read_only) ) { \ - ((cache_ptr)->write_protects)[(entry_ptr)->type->id]++; \ - } else { \ - ((cache_ptr)->read_protects)[(entry_ptr)->type->id]++; \ - if ( ((entry_ptr)->ro_ref_count) > \ - ((cache_ptr)->max_read_protects)[(entry_ptr)->type->id] ) { \ - ((cache_ptr)->max_read_protects)[(entry_ptr)->type->id] = \ - ((entry_ptr)->ro_ref_count); \ - } \ - } \ - if ( (cache_ptr)->index_len > (cache_ptr)->max_index_len ) \ - (cache_ptr)->max_index_len = (cache_ptr)->index_len; \ - if ( (cache_ptr)->index_size > (cache_ptr)->max_index_size ) \ - (cache_ptr)->max_index_size = (cache_ptr)->index_size; \ - if ( (cache_ptr)->pl_len > (cache_ptr)->max_pl_len ) \ - (cache_ptr)->max_pl_len = (cache_ptr)->pl_len; \ - if ( (cache_ptr)->pl_size > (cache_ptr)->max_pl_size ) \ - (cache_ptr)->max_pl_size = (cache_ptr)->pl_size; - -#define H5C2__UPDATE_STATS_FOR_PIN(cache_ptr, entry_ptr) \ - ((cache_ptr)->pins)[(entry_ptr)->type->id]++; \ - if ( (cache_ptr)->pel_len > (cache_ptr)->max_pel_len ) \ - (cache_ptr)->max_pel_len = (cache_ptr)->pel_len; \ - if ( (cache_ptr)->pel_size > (cache_ptr)->max_pel_size ) \ - (cache_ptr)->max_pel_size = (cache_ptr)->pel_size; - -#endif /* H5C2_COLLECT_CACHE_ENTRY_STATS */ - -#else /* H5C2_COLLECT_CACHE_STATS */ - -#define H5C2__RESET_CACHE_ENTRY_STATS(entry_ptr) -#define H5C2__UPDATE_STATS_FOR_DIRTY_PIN(cache_ptr, entry_ptr) -#define H5C2__UPDATE_STATS_FOR_UNPROTECT(cache_ptr) -#define H5C2__UPDATE_STATS_FOR_RENAME(cache_ptr, entry_ptr) -#define H5C2__UPDATE_STATS_FOR_ENTRY_SIZE_CHANGE(cache_ptr, entry_ptr, new_size) -#define H5C2__UPDATE_STATS_FOR_HT_INSERTION(cache_ptr) -#define H5C2__UPDATE_STATS_FOR_HT_DELETION(cache_ptr) -#define H5C2__UPDATE_STATS_FOR_HT_SEARCH(cache_ptr, success, depth) -#define H5C2__UPDATE_STATS_FOR_INSERTION(cache_ptr, entry_ptr) -#define H5C2__UPDATE_STATS_FOR_CLEAR(cache_ptr, entry_ptr) -#define H5C2__UPDATE_STATS_FOR_FLUSH(cache_ptr, entry_ptr) -#define H5C2__UPDATE_STATS_FOR_EVICTION(cache_ptr, entry_ptr) -#define H5C2__UPDATE_STATS_FOR_PROTECT(cache_ptr, entry_ptr, hit) -#define H5C2__UPDATE_STATS_FOR_PIN(cache_ptr, entry_ptr) -#define H5C2__UPDATE_STATS_FOR_UNPIN(cache_ptr, entry_ptr) - -#endif /* H5C2_COLLECT_CACHE_STATS */ - - -/*********************************************************************** - * - * Hash table access and manipulation macros: - * - * The following macros handle searches, insertions, and deletion in - * the hash table. - * - * When modifying these macros, remember to modify the similar macros - * in tst/cache.c - * - ***********************************************************************/ - -/* H5C2__HASH_TABLE_LEN is defined in H5C2pkg.h. It mut be a power of two. */ - -#define H5C2__HASH_MASK ((size_t)(H5C2__HASH_TABLE_LEN - 1) << 3) - -#define H5C2__HASH_FCN(x) (int)(((x) & H5C2__HASH_MASK) >> 3) - -#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 ) || \ - ( (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") \ -} - -#define H5C2__PRE_HT_REMOVE_SC(cache_ptr, entry_ptr) \ -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_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))] \ - == NULL ) || \ - ( ( ((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))] == \ - (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) ) || \ - ( 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") \ -} - -#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") \ -} - -#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") \ -} - -#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 */ - -#define H5C2__PRE_HT_INSERT_SC(cache_ptr, entry_ptr, fail_val) -#define H5C2__PRE_HT_REMOVE_SC(cache_ptr, entry_ptr) -#define H5C2__PRE_HT_SEARCH_SC(cache_ptr, Addr, fail_val) -#define H5C2__POST_SUC_HT_SEARCH_SC(cache_ptr, entry_ptr, Addr, k, fail_val) -#define H5C2__POST_HT_SHIFT_TO_FRONT(cache_ptr, entry_ptr, k, fail_val) -#define H5C2__PRE_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size) -#define H5C2__POST_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size) - -#endif /* H5C2_DO_SANITY_CHECKS */ - - -#define H5C2__INSERT_IN_INDEX(cache_ptr, entry_ptr, fail_val) \ -{ \ - 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; \ - H5C2__UPDATE_STATS_FOR_HT_INSERTION(cache_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); \ - if ( (entry_ptr)->ht_next ) \ - { \ - (entry_ptr)->ht_next->ht_prev = (entry_ptr)->ht_prev; \ - } \ - if ( (entry_ptr)->ht_prev ) \ - { \ - (entry_ptr)->ht_prev->ht_next = (entry_ptr)->ht_next; \ - } \ - if ( ((cache_ptr)->index)[k] == (entry_ptr) ) \ - { \ - ((cache_ptr)->index)[k] = (entry_ptr)->ht_next; \ - } \ - (entry_ptr)->ht_next = 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) \ -} - -#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 ) \ - { \ - 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); \ - 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; \ - 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 ) \ - { \ - 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); \ - 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; \ - H5C2__POST_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size) \ -} - - -/************************************************************************** - * - * Skip list insertion and deletion macros: - * - * These used to be functions, but I converted them to macros to avoid some - * function call overhead. - * - **************************************************************************/ - -/*------------------------------------------------------------------------- - * - * Macro: H5C2__INSERT_ENTRY_IN_SLIST - * - * Purpose: Insert the specified instance of H5C2_cache_entry_t into - * the skip list in the specified instance of H5C2_t. Update - * the associated length and size fields. - * - * Return: N/A - * - * Programmer: John Mainzer, 5/10/04 - * - * Modifications: - * - * JRM -- 7/21/04 - * Updated function to set the in_tree flag when inserting - * an entry into the tree. Also modified the function to - * update the tree size and len fields instead of the similar - * index fields. - * - * All of this is part of the modifications to support the - * hash table. - * - * JRM -- 7/27/04 - * Converted the function H5C2_insert_entry_in_tree() into - * the macro H5C2__INSERT_ENTRY_IN_TREE in the hopes of - * wringing a little more speed out of the cache. - * - * Note that we don't bother to check if the entry is already - * in the tree -- if it is, H5SL_insert() will fail. - * - * QAK -- 11/27/04 - * Switched over to using skip list routines. - * - * JRM -- 6/27/06 - * Added fail_val parameter. - * - * JRM -- 8/25/06 - * Added the H5C2_DO_SANITY_CHECKS version of the macro. - * - * 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 - * flush. - * - *------------------------------------------------------------------------- - */ - -#if H5C2_DO_SANITY_CHECKS - -#define H5C2__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, fail_val) \ -{ \ - HDassert( (cache_ptr) ); \ - HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \ - HDassert( (entry_ptr) ); \ - HDassert( (entry_ptr)->size > 0 ); \ - HDassert( H5F_addr_defined((entry_ptr)->addr) ); \ - HDassert( !((entry_ptr)->in_slist) ); \ - \ - if ( H5SL_insert((cache_ptr)->slist_ptr, entry_ptr, &(entry_ptr)->addr) \ - < 0 ) \ - HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, (fail_val), \ - "Can't insert entry in skip list") \ - \ - (entry_ptr)->in_slist = TRUE; \ - (cache_ptr)->slist_len++; \ - (cache_ptr)->slist_size += (entry_ptr)->size; \ - (cache_ptr)->slist_len_increase++; \ - (cache_ptr)->slist_size_increase += (entry_ptr)->size; \ - \ - HDassert( (cache_ptr)->slist_len > 0 ); \ - HDassert( (cache_ptr)->slist_size > 0 ); \ - \ -} /* H5C2__INSERT_ENTRY_IN_SLIST */ - -#else /* H5C2_DO_SANITY_CHECKS */ - -#define H5C2__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, fail_val) \ -{ \ - HDassert( (cache_ptr) ); \ - HDassert( (cache_ptr)->magic == H5C2__H5C2_T_MAGIC ); \ - HDassert( (entry_ptr) ); \ - HDassert( (entry_ptr)->size > 0 ); \ - HDassert( H5F_addr_defined((entry_ptr)->addr) ); \ - HDassert( !((entry_ptr)->in_slist) ); \ - \ - if ( H5SL_insert((cache_ptr)->slist_ptr, entry_ptr, &(entry_ptr)->addr) \ - < 0 ) \ - HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, (fail_val), \ - "Can't insert entry in skip list") \ - \ - (entry_ptr)->in_slist = TRUE; \ - (cache_ptr)->slist_len++; \ - (cache_ptr)->slist_size += (entry_ptr)->size; \ - \ - HDassert( (cache_ptr)->slist_len > 0 ); \ - HDassert( (cache_ptr)->slist_size > 0 ); \ - \ -} /* H5C2__INSERT_ENTRY_IN_SLIST */ - -#endif /* H5C2_DO_SANITY_CHECKS */ - - -/*------------------------------------------------------------------------- - * - * Function: H5C2__REMOVE_ENTRY_FROM_SLIST - * - * Purpose: Remove the specified instance of H5C2_cache_entry_t from the - * index skip list in the specified instance of H5C2_t. Update - * the associated length and size fields. - * - * Return: N/A - * - * Programmer: John Mainzer, 5/10/04 - * - * Modifications: - * - * JRM -- 7/21/04 - * Updated function for the addition of the hash table. - * - * JRM - 7/27/04 - * Converted from the function H5C2_remove_entry_from_tree() - * to the macro H5C2__REMOVE_ENTRY_FROM_TREE in the hopes of - * wringing a little more performance out of the cache. - * - * QAK -- 11/27/04 - * Switched over to using skip list routines. - * - * JRM -- 3/28/07 - * 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) \ -{ \ - 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)->in_slist ); \ - HDassert( (cache_ptr)->slist_ptr ); \ - \ - if ( H5SL_remove((cache_ptr)->slist_ptr, &(entry_ptr)->addr) \ - != (entry_ptr) ) \ - \ - HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, \ - "Can't delete entry from skip list.") \ - \ - HDassert( (cache_ptr)->slist_len > 0 ); \ - (cache_ptr)->slist_len--; \ - HDassert( (cache_ptr)->slist_size >= (entry_ptr)->size ); \ - (cache_ptr)->slist_size -= (entry_ptr)->size; \ - (entry_ptr)->in_slist = FALSE; \ -} /* H5C2__REMOVE_ENTRY_FROM_SLIST */ - - -/*------------------------------------------------------------------------- - * - * Function: H5C2__UPDATE_SLIST_FOR_SIZE_CHANGE - * - * Purpose: Update cache_ptr->slist_size for a change in the size of - * and entry in the slist. - * - * Return: N/A - * - * Programmer: John Mainzer, 9/07/05 - * - * Modifications: - * - * JRM -- 8/27/06 - * Added the H5C2_DO_SANITY_CHECKS version of the macro. - * - * 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 - * flush. - * - *------------------------------------------------------------------------- - */ - -#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) ) ); \ -} /* 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) ) ); \ -} /* H5C2__REMOVE_ENTRY_FROM_SLIST */ - -#endif /* H5C2_DO_SANITY_CHECKS */ - - -/************************************************************************** - * - * Replacement policy update macros: - * - * These used to be functions, but I converted them to macros to avoid some - * function call overhead. - * - **************************************************************************/ - -/*------------------------------------------------------------------------- - * - * Macro: H5C2__FAKE_RP_FOR_MOST_RECENT_ACCESS - * - * Purpose: For efficiency, we sometimes change the order of flushes -- - * but doing so can confuse the replacement policy. This - * macro exists to allow us to specify an entry as the - * most recently touched so we can repair any such - * confusion. - * - * At present, we only support the modified LRU policy, so - * this function deals with that case unconditionally. If - * we ever support other replacement policies, the macro - * should switch on the current policy and act accordingly. - * - * Return: N/A - * - * Programmer: John Mainzer, 10/13/05 - * - * Modifications: - * - * JRM -- 3/20/06 - * Modified macro to ignore pinned entries. Pinned entries - * do not appear in the data structures maintained by the - * replacement policy code, and thus this macro has nothing - * to do if called for such an entry. - * - * JRM -- 3/28/07 - * Added sanity checks using the new is_read_only and - * ro_ref_count fields of struct H5C2_cache_entry_t. - * - * JRM -- 3/29/08 - * Added a sanity check to verify that the target entry - * does not have a pending journal entry write. - * - *------------------------------------------------------------------------- - */ - -#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. \ - */ \ - \ - 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, \ - (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)) \ - \ - 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_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, \ - (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 \ - */ \ - \ - 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, \ - (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 */ - - -/*------------------------------------------------------------------------- - * - * Macro: H5C2__UPDATE_RP_FOR_EVICTION - * - * Purpose: Update the replacement policy data structures for an - * eviction of the specified cache entry. - * - * At present, we only support the modified LRU policy, so - * this function deals with that case unconditionally. If - * we ever support other replacement policies, the function - * should switch on the current policy and act accordingly. - * - * Return: Non-negative on success/Negative on failure. - * - * Programmer: John Mainzer, 5/10/04 - * - * Modifications: - * - * JRM - 7/27/04 - * Converted the function H5C2_update_rp_for_eviction() to the - * macro H5C2__UPDATE_RP_FOR_EVICTION in an effort to squeeze - * a bit more performance out of the cache. - * - * At least for the first cut, I am leaving the comments and - * white space in the macro. If they cause dificulties with - * the pre-processor, I'll have to remove them. - * - * JRM - 7/28/04 - * Split macro into two version, one supporting the clean and - * dirty LRU lists, and the other not. Yet another attempt - * at optimization. - * - * JRM - 3/20/06 - * Pinned entries can't be evicted, so this entry should never - * 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 - * ro_ref_count fields of struct H5C2_cache_entry_t. - * - * JRM -- 3/29/08 - * Added sanity check to verify that the evicted entry - * does not have a pending journal entry write. - * - *------------------------------------------------------------------------- - */ - -#if H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS - -#define H5C2__UPDATE_RP_FOR_EVICTION(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)->is_pinned) ); \ - HDassert( (entry_ptr)->size > 0 ); \ - HDassert( (entry_ptr)->last_trans == 0 ); \ - \ - /* modified LRU specific code */ \ - \ - /* remove the entry from the LRU list. */ \ - \ - 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)) \ - \ - /* If the entry is clean when it is evicted, it should be on the \ - * clean LRU list, if it was dirty, it should be on the dirty LRU list. \ - * Remove it from the appropriate list according to the value of the \ - * dirty flag. \ - */ \ - \ - 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)) \ - } 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)) \ - } \ - \ -} /* H5C2__UPDATE_RP_FOR_EVICTION */ - -#else /* H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ - -#define H5C2__UPDATE_RP_FOR_EVICTION(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)->is_pinned) ); \ - HDassert( (entry_ptr)->size > 0 ); \ - HDassert( (entry_ptr)->last_trans == 0 ); \ - \ - /* modified LRU specific code */ \ - \ - /* remove the entry from the LRU list. */ \ - \ - 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__UPDATE_RP_FOR_EVICTION */ - -#endif /* H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ - - -/*------------------------------------------------------------------------- - * - * Macro: H5C2__UPDATE_RP_FOR_FLUSH - * - * Purpose: Update the replacement policy data structures for a flush - * of the specified cache entry. - * - * At present, we only support the modified LRU policy, so - * this function deals with that case unconditionally. If - * we ever support other replacement policies, the function - * should switch on the current policy and act accordingly. - * - * Return: N/A - * - * Programmer: John Mainzer, 5/6/04 - * - * Modifications: - * - * JRM - 7/27/04 - * Converted the function H5C2_update_rp_for_flush() to the - * macro H5C2__UPDATE_RP_FOR_FLUSH in an effort to squeeze - * a bit more performance out of the cache. - * - * At least for the first cut, I am leaving the comments and - * white space in the macro. If they cause dificulties with - * pre-processor, I'll have to remove them. - * - * JRM - 7/28/04 - * Split macro into two versions, one supporting the clean and - * dirty LRU lists, and the other not. Yet another attempt - * at optimization. - * - * JRM - 3/20/06 - * While pinned entries can be flushed, they don't reside in - * the replacement policy data structures when unprotected. - * Thus I modified this macro to do nothing if the entry is - * pinned. - * - * JRM - 3/28/07 - * 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 sanity check to verify that the flushed entry - * does not have a pending journal entry write. - * - *------------------------------------------------------------------------- - */ - -#if H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS - -#define H5C2__UPDATE_RP_FOR_FLUSH(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. \ - */ \ - \ - 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, \ - (cache_ptr)->LRU_tail_ptr, \ - (cache_ptr)->LRU_list_len, \ - (cache_ptr)->LRU_list_size, (fail_val)) \ - \ - /* since the entry is being flushed or cleared, one would think \ - * that it must be dirty -- but that need not be the case. 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 \ - * clean LRU list. \ - * \ - * The function presumes that a dirty entry will be either cleared \ - * or flushed shortly, so it is OK if we put a dirty entry on the \ - * clean LRU list. \ - */ \ - \ - 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)) \ - } 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)) \ - } \ - \ - 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. */ \ - } \ -} /* H5C2__UPDATE_RP_FOR_FLUSH */ - -#else /* H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ - -#define H5C2__UPDATE_RP_FOR_FLUSH(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. \ - */ \ - \ - 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, \ - (cache_ptr)->LRU_tail_ptr, \ - (cache_ptr)->LRU_list_len, \ - (cache_ptr)->LRU_list_size, (fail_val)) \ - \ - /* End modified LRU specific code. */ \ - } \ -} /* H5C2__UPDATE_RP_FOR_FLUSH */ - -#endif /* H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ - - -/*------------------------------------------------------------------------- - * - * Macro: H5C2__UPDATE_RP_FOR_INSERTION - * - * Purpose: Update the replacement policy data structures for an - * insertion of the specified cache entry. - * - * At present, we only support the modified LRU policy, so - * this function deals with that case unconditionally. If - * we ever support other replacement policies, the function - * should switch on the current policy and act accordingly. - * - * Return: N/A - * - * Programmer: John Mainzer, 5/17/04 - * - * Modifications: - * - * JRM - 7/27/04 - * Converted the function H5C2_update_rp_for_insertion() to the - * macro H5C2__UPDATE_RP_FOR_INSERTION in an effort to squeeze - * a bit more performance out of the cache. - * - * At least for the first cut, I am leaving the comments and - * white space in the macro. If they cause dificulties with - * pre-processor, I'll have to remove them. - * - * JRM - 7/28/04 - * Split macro into two version, one supporting the clean and - * dirty LRU lists, and the other not. Yet another attempt - * at optimization. - * - * JRM - 3/10/06 - * This macro should never be called on a pinned entry. - * Inserted an assert to verify this. - * - * JRM - 8/9/06 - * Not any more. We must now allow insertion of pinned - * entries. Updated macro to support this. - * - * JRM - 3/28/07 - * Added sanity checks using the new is_read_only and - * 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 - * journaling is disabled or a transaction is in progress. - * - * 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. - * - *------------------------------------------------------------------------- - */ - -#if H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS - -#define H5C2__UPDATE_RP_FOR_INSERTION(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 == (cache_ptr)->trans_num ); \ - HDassert( ( ! ((cache_ptr)->mdj_enabled) ) || \ - ( (cache_ptr)->trans_in_progress ) ); \ - \ - 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)) \ - \ - } else if ( (entry_ptr)->last_trans != 0 ) { \ - \ - HDassert( (cache_ptr)->mdj_enabled ); \ - HDassert( (cache_ptr)->trans_in_progress ); \ - H5C2__DLL_PREPEND((entry_ptr), \ - ((cache_ptr)->jwipl_head_ptr), \ - ((cache_ptr)->jwipl_tail_ptr), \ - ((cache_ptr)->jwipl_len), \ - ((cache_ptr)->jwipl_size), fail_val) \ - \ - } else { \ - \ - /* modified LRU specific code */ \ - \ - /* 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)) \ - \ - /* insert the entry at the head of the clean or dirty LRU list as \ - * appropriate. \ - */ \ - \ - 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)) \ - } 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)) \ - } \ - \ - /* End modified LRU specific code. */ \ - } \ -} - -#else /* H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ - -#define H5C2__UPDATE_RP_FOR_INSERTION(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 == (cache_ptr)->trans_num ); \ - HDassert( ( ! ((cache_ptr)->mdj_enabled) ) || \ - ( (cache_ptr)->trans_in_progress ) ); \ - \ - 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)) \ - \ - } else if ( (entry_ptr)->last_trans != 0 ) { \ - \ - HDassert( (cache_ptr)->mdj_enabled ); \ - HDassert( (cache_ptr)->trans_in_progress ); \ - H5C2__DLL_PREPEND((entry_ptr), \ - ((cache_ptr)->jwipl_head_ptr), \ - ((cache_ptr)->jwipl_tail_ptr), \ - ((cache_ptr)->jwipl_len), \ - ((cache_ptr)->jwipl_size), (fail_val)) \ - \ - } else { \ - \ - /* modified LRU specific code */ \ - \ - /* 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)) \ - \ - /* End modified LRU specific code. */ \ - } \ -} - -#endif /* H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ - - -/*------------------------------------------------------------------------- - * - * 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 - * 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 - * the data structures used by the current replacement policy. - * - * At present, we only support the modified LRU policy, so - * this function deals with that case unconditionally. If - * we ever support other replacement policies, the function - * should switch on the current policy and act accordingly. - * - * Note that the macro presumes that the entry's last_trans - * field is zero on entry. - * - * Return: N/A - * - * Programmer: John Mainzer, 3/31/08 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -#if H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS - -#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)->mdj_enabled ); \ - HDassert( (entry_ptr) ); \ - HDassert( !((entry_ptr)->is_protected) ); \ - HDassert( !((entry_ptr)->is_pinned) ); \ - HDassert( !((entry_ptr)->is_read_only) ); \ - HDassert( ((entry_ptr)->ro_ref_count) == 0 ); \ - HDassert( (entry_ptr)->size > 0 ); \ - HDassert( (entry_ptr)->is_dirty ); \ - HDassert( (entry_ptr)->last_trans == 0 ); \ - \ - H5C2__DLL_REMOVE((entry_ptr), \ - ((cache_ptr)->jwipl_head_ptr), \ - ((cache_ptr)->jwipl_tail_ptr), \ - ((cache_ptr)->jwipl_len), \ - ((cache_ptr)->jwipl_size), \ - (fail_val)) \ - \ - /* modified LRU specific code */ \ - \ - /* 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)) \ - \ - /* insert the entry at the head of the clean or dirty LRU list as \ - * appropriate. \ - */ \ - \ - 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)) \ - } 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)) \ - } \ - \ - /* End modified LRU specific code. */ \ - \ -} /* H5C2__UPDATE_RP_FOR_JOURNAL_WRITE_COMPLETE */ - -#else /* H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ - -#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)->mdj_enabled ); \ - HDassert( (entry_ptr) ); \ - HDassert( !((entry_ptr)->is_protected) ); \ - HDassert( !((entry_ptr)->is_pinned) ); \ - HDassert( !((entry_ptr)->is_read_only) ); \ - HDassert( ((entry_ptr)->ro_ref_count) == 0 ); \ - HDassert( (entry_ptr)->size > 0 ); \ - HDassert( (entry_ptr)->is_dirty ); \ - HDassert( (entry_ptr)->last_trans == 0 ); \ - \ - H5C2__DLL_REMOVE((entry_ptr), \ - ((cache_ptr)->jwipl_head_ptr), \ - ((cache_ptr)->jwipl_tail_ptr), \ - ((cache_ptr)->jwipl_len), \ - ((cache_ptr)->jwipl_size), \ - (fail_val)) \ - \ - /* modified LRU specific code */ \ - \ - /* 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)) \ - \ - /* End modified LRU specific code. */ \ - \ -} /* H5C2__UPDATE_RP_FOR_JOURNAL_WRITE_COMPLETE */ - -#endif /* H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ - - -/*------------------------------------------------------------------------- - * - * Macro: H5C2__UPDATE_RP_FOR_LOAD - * - * Purpose: Update the replacement policy data structures for a - * 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 - * significant number of cycles, we will have to re-work - * the code to avoid this step. - * - * At present, we only support the modified LRU policy, so - * this function deals with that case unconditionally. If - * we ever support other replacement policies, the function - * should switch on the current policy and act accordingly. - * - * In theory, the loaded entry should be clean, but due - * to a bug fix, it is possible that we will dirty it during - * the load. - * - * Return: N/A - * - * Programmer: John Mainzer, 5/02/08 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -#if H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS - -#define H5C2__UPDATE_RP_FOR_LOAD(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_pinned) ); \ - HDassert( !((entry_ptr)->is_read_only) ); \ - HDassert( ((entry_ptr)->ro_ref_count) == 0 ); \ - HDassert( (entry_ptr)->size > 0 ); \ - HDassert( (entry_ptr)->last_trans == 0 ); \ - \ - /* modified LRU specific code */ \ - \ - /* 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)) \ - \ - /* insert the entry at the head of the clean or dirty LRU list as \ - * appropriate. \ - */ \ - \ - 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)) \ - } 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)) \ - } \ - \ - /* End modified LRU specific code. */ \ -} - -#else /* H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ - -#define H5C2__UPDATE_RP_FOR_LOAD(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_pinned) ); \ - HDassert( !((entry_ptr)->is_read_only) ); \ - HDassert( ((entry_ptr)->ro_ref_count) == 0 ); \ - HDassert( (entry_ptr)->size > 0 ); \ - HDassert( (entry_ptr)->last_trans == 0 ); \ - \ - /* modified LRU specific code */ \ - \ - /* 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)) \ - \ - /* End modified LRU specific code. */ \ -} - -#endif /* H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ - - -/*------------------------------------------------------------------------- - * - * Macro: H5C2__UPDATE_RP_FOR_PROTECT - * - * Purpose: Update the replacement policy data structures for a - * protect of the specified cache entry. - * - * To do this, unlink the specified entry from any data - * structures used by the replacement policy, and add the - * entry to the protected list. - * - * At present, we only support the modified LRU policy, so - * this function deals with that case unconditionally. If - * we ever support other replacement policies, the function - * should switch on the current policy and act accordingly. - * - * Return: N/A - * - * Programmer: John Mainzer, 5/17/04 - * - * Modifications: - * - * JRM - 7/27/04 - * Converted the function H5C2_update_rp_for_protect() to the - * macro H5C2__UPDATE_RP_FOR_PROTECT in an effort to squeeze - * a bit more performance out of the cache. - * - * At least for the first cut, I am leaving the comments and - * white space in the macro. If they cause dificulties with - * pre-processor, I'll have to remove them. - * - * JRM - 7/28/04 - * Split macro into two version, one supporting the clean and - * dirty LRU lists, and the other not. Yet another attempt - * at optimization. - * - * JRM - 3/17/06 - * Modified macro to attempt to remove pinned entriese from - * the pinned entry list instead of from the data structures - * maintained by the replacement policy. - * - * JRM - 3/28/07 - * 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 remove the entry from the journal write in - * progress list if appropriate. Also related sanity checks. - * - *------------------------------------------------------------------------- - */ - -#if H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS - -#define H5C2__UPDATE_RP_FOR_PROTECT(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 ); \ - \ - if ( (entry_ptr)->is_pinned ) { \ - \ - 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)) \ - \ - } else if ( (entry_ptr)->last_trans != 0 ) { \ - \ - HDassert( (cache_ptr)->mdj_enabled ); \ - HDassert( (entry_ptr)->is_dirty ); \ - H5C2__DLL_REMOVE((entry_ptr), \ - ((cache_ptr)->jwipl_head_ptr), \ - ((cache_ptr)->jwipl_tail_ptr), \ - ((cache_ptr)->jwipl_len), \ - ((cache_ptr)->jwipl_size), \ - (fail_val)) \ - \ - } else { \ - \ - /* modified LRU specific code */ \ - \ - /* remove the entry from the LRU list. */ \ - \ - 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)) \ - \ - /* Similarly, remove the entry from the clean or dirty LRU list \ - * as appropriate. \ - */ \ - \ - 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)) \ - \ - } 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)) \ - } \ - \ - /* End modified LRU specific code. */ \ - } \ - \ - /* Regardless of the replacement policy, or whether the entry is \ - * 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__UPDATE_RP_FOR_PROTECT */ - -#else /* H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ - -#define H5C2__UPDATE_RP_FOR_PROTECT(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 ); \ - \ - if ( (entry_ptr)->is_pinned ) { \ - \ - 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)) \ - \ - } else if ( (entry_ptr)->last_trans != 0 ) { \ - \ - HDassert( (cache_ptr)->mdj_enabled ); \ - HDassert( (entry_ptr)->is_dirty ); \ - H5C2__DLL_REMOVE((entry_ptr), \ - ((cache_ptr)->jwipl_head_ptr), \ - ((cache_ptr)->jwipl_tail_ptr), \ - ((cache_ptr)->jwipl_len), \ - ((cache_ptr)->jwipl_size), \ - (fail_val)) \ - \ - } else { \ - \ - /* modified LRU specific code */ \ - \ - /* remove the entry from the LRU list. */ \ - \ - 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)) \ - \ - /* End modified LRU specific code. */ \ - } \ - \ - /* Regardless of the replacement policy, or whether the entry is \ - * 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__UPDATE_RP_FOR_PROTECT */ - -#endif /* H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ - - -/*------------------------------------------------------------------------- - * - * Macro: H5C2__UPDATE_RP_FOR_RENAME - * - * Purpose: Update the replacement policy data structures for a - * rename of the specified cache entry. - * - * At present, we only support the modified LRU policy, so - * this function deals with that case unconditionally. If - * we ever support other replacement policies, the function - * should switch on the current policy and act accordingly. - * - * Return: N/A - * - * Programmer: John Mainzer, 5/17/04 - * - * Modifications: - * - * JRM - 7/27/04 - * Converted the function H5C2_update_rp_for_rename() to the - * macro H5C2__UPDATE_RP_FOR_RENAME in an effort to squeeze - * a bit more performance out of the cache. - * - * At least for the first cut, I am leaving the comments and - * white space in the macro. If they cause dificulties with - * pre-processor, I'll have to remove them. - * - * JRM - 7/28/04 - * Split macro into two version, one supporting the clean and - * dirty LRU lists, and the other not. Yet another attempt - * at optimization. - * - * JRM - 6/23/05 - * Added the was_dirty parameter. It is possible that - * the entry was clean when it was renamed -- if so it - * it is in the clean LRU regardless of the current - * value of the is_dirty field. - * - * At present, all renamed entries are forced to be - * dirty. This macro is a bit more general that that, - * to allow it to function correctly should that policy - * be relaxed in the future. - * - * JRM - 3/17/06 - * Modified macro to do nothing if the entry is pinned. - * In this case, the entry is on the pinned entry list, not - * in the replacement policy data structures, so there is - * nothing to be done. - * - * JRM - 3/28/07 - * 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. - * - *------------------------------------------------------------------------- - */ - -#if H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS - -#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( (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 ); \ - /* read following as: had_jwip => (entry_ptr)->last_trans != 0 */ \ - HDassert( ( (entry_ptr)->last_trans != 0 ) || ( ! (had_jwip) ) ); \ - \ - if ( ! ( (entry_ptr)->is_pinned ) ) { \ - \ - /* remove the entry from either the jwip list, or from the current \ - * replacement policy data structures, as appropriate. \ - */ \ - if ( had_jwip ) { /* must be on jwip list */ \ - \ - HDassert( (cache_ptr)->mdj_enabled ); \ - HDassert( (cache_ptr)->trans_in_progress ); \ - HDassert( (entry_ptr)->last_trans != 0 ); \ - HDassert( was_dirty ); \ - HDassert( (entry_ptr)->is_dirty ); \ - H5C2__DLL_REMOVE((entry_ptr), \ - ((cache_ptr)->jwipl_head_ptr), \ - ((cache_ptr)->jwipl_tail_ptr), \ - ((cache_ptr)->jwipl_len), \ - ((cache_ptr)->jwipl_size), \ - (fail_val)) \ - \ - } else { /* must be in replacement policy data structures */ \ - \ - /* begin modified LRU specific code */ \ - \ - /* remove the entry from the LRU list */ \ - \ - 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)) \ - \ - /* remove the entry from either the clean or dirty LUR list as \ - * indicated by the was_dirty parameter \ - */ \ - if ( was_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)) \ - \ - } 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)) \ - } \ - /* end modified LRU specific code */ \ - } \ - /* insert in either jwip list, or replacement policy data structures \ - * as appropriate. \ - */ \ - if ( (entry_ptr)->last_trans != 0 ) { /* goes in jwip list */ \ - \ - HDassert( (cache_ptr)->mdj_enabled ); \ - HDassert( (cache_ptr)->trans_in_progress ); \ - HDassert( (entry_ptr)->is_dirty ); \ - H5C2__DLL_PREPEND((entry_ptr), \ - ((cache_ptr)->jwipl_head_ptr), \ - ((cache_ptr)->jwipl_tail_ptr), \ - ((cache_ptr)->jwipl_len), \ - ((cache_ptr)->jwipl_size), fail_val) \ - \ - } else { /* goes back in the replacement policy data structures */ \ - \ - /* begin modified LRU specific code */ \ - \ - 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)) \ - \ - /* insert the entry at the head of either the clean or dirty \ - * LRU list as appropriate. \ - */ \ - \ - 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)) \ - \ - } 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)) \ - } \ - \ - /* End modified LRU specific code. */ \ - } \ - } \ -} /* H5C2__UPDATE_RP_FOR_RENAME */ - -#else /* H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ - -#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( (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 ); \ - /* read following as: had_jwip => (entry_ptr)->last_trans != 0 */ \ - HDassert( ( (entry_ptr)->last_trans != 0 ) || ( ! (had_jwip) ) ); \ - \ - if ( ! ( (entry_ptr)->is_pinned ) ) { \ - \ - /* remove the entry from either the jwip list, or from the current \ - * replacement policy data structures, as appropriate. \ - */ \ - if ( had_jwip ) { /* must be on jwip list */ \ - \ - HDassert( (cache_ptr)->mdj_enabled ); \ - HDassert( (cache_ptr)->trans_in_progress ); \ - HDassert( (entry_ptr)->last_trans != 0 ); \ - HDassert( was_dirty ); \ - HDassert( (entry_ptr)->is_dirty ); \ - H5C2__DLL_REMOVE((entry_ptr), \ - ((cache_ptr)->jwipl_head_ptr), \ - ((cache_ptr)->jwipl_tail_ptr), \ - ((cache_ptr)->jwipl_len), \ - ((cache_ptr)->jwipl_size), \ - (fail_val)) \ - \ - } else { /* must be in replacement policy data structures */ \ - \ - /* begin modified LRU specific code */ \ - \ - /* remove the entry from the LRU list */ \ - \ - 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)) \ - \ - /* end modified LRU specific code */ \ - } \ - /* insert in either jwip list, or replacement policy data \ - * structures as appropriate. \ - */ \ - if ( (entry_ptr)->last_trans != 0 ) { /* goes in jwip list */ \ - \ - HDassert( (cache_ptr)->mdj_enabled ); \ - HDassert( (cache_ptr)->trans_in_progress ); \ - HDassert( (entry_ptr)->is_dirty ); \ - H5C2__DLL_PREPEND((entry_ptr), \ - ((cache_ptr)->jwipl_head_ptr), \ - ((cache_ptr)->jwipl_tail_ptr), \ - ((cache_ptr)->jwipl_len), \ - ((cache_ptr)->jwipl_size), fail_val) \ - \ - } else { /* goes back in the replacement policy data structures */ \ - \ - /* begin modified LRU specific code */ \ - \ - 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. */ \ - } \ - } \ -} /* H5C2__UPDATE_RP_FOR_RENAME */ - -#endif /* H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ - - -/*------------------------------------------------------------------------- - * - * Macro: H5C2__UPDATE_RP_FOR_SIZE_CHANGE - * - * Purpose: Update the replacement policy data structures for a - * size change of the specified cache entry. - * - * 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 - * replacement policy. Update the appropriate replacement - * policy data structures. - * - * At present, we only support the modified LRU policy, so - * this function deals with that case unconditionally. If - * we ever support other replacement policies, the function - * should switch on the current policy and act accordingly. - * - * Return: N/A - * - * Programmer: John Mainzer, 8/23/06 - * - * Modifications: - * - * JRM -- 3/28/07 - * 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 - * is, update the size of that list. If not, proceed as - * before. - * - *------------------------------------------------------------------------- - */ - -#if H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS - -#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( (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( new_size > 0 ); \ - \ - if ( (entry_ptr)->is_pinned ) { \ - \ - H5C2__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->pel_len, \ - (cache_ptr)->pel_size, \ - (entry_ptr)->size, \ - (new_size)); \ - \ - } else if ( (entry_ptr)->last_trans != 0 ) { \ - \ - HDassert( (cache_ptr)->mdj_enabled ); \ - HDassert( (entry_ptr)->is_dirty ); \ - H5C2__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->jwipl_len, \ - (cache_ptr)->jwipl_size, \ - (entry_ptr)->size, \ - (new_size)); \ - \ - } else { \ - \ - /* modified LRU specific code */ \ - \ - /* Update the size of the LRU list */ \ - \ - H5C2__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->LRU_list_len, \ - (cache_ptr)->LRU_list_size, \ - (entry_ptr)->size, \ - (new_size)); \ - \ - /* Similarly, update the size of the clean or dirty LRU list as \ - * appropriate. At present, the entry must be clean, but that \ - * could change. \ - */ \ - \ - if ( (entry_ptr)->is_dirty ) { \ - \ - 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, \ - (cache_ptr)->cLRU_list_size, \ - (entry_ptr)->size, \ - (new_size)); \ - } \ - \ - /* End modified LRU specific code. */ \ - } \ - \ -} /* H5C2__UPDATE_RP_FOR_SIZE_CHANGE */ - -#else /* H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ - -#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( (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( new_size > 0 ); \ - \ - if ( (entry_ptr)->is_pinned ) { \ - \ - H5C2__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->pel_len, \ - (cache_ptr)->pel_size, \ - (entry_ptr)->size, \ - (new_size)); \ - \ - } else if ( (entry_ptr)->last_trans != 0 ) { \ - \ - HDassert( (cache_ptr)->mdj_enabled ); \ - HDassert( (entry_ptr)->is_dirty ); \ - H5C2__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->jwipl_len, \ - (cache_ptr)->jwipl_size, \ - (entry_ptr)->size, \ - (new_size)); \ - \ - } else { \ - \ - /* modified LRU specific code */ \ - \ - /* Update the size of the LRU list */ \ - \ - H5C2__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->LRU_list_len, \ - (cache_ptr)->LRU_list_size, \ - (entry_ptr)->size, \ - (new_size)); \ - \ - /* End modified LRU specific code. */ \ - } \ - \ -} /* H5C2__UPDATE_RP_FOR_SIZE_CHANGE */ - -#endif /* H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ - - -/*------------------------------------------------------------------------- - * - * Macro: H5C2__UPDATE_RP_FOR_UNPIN - * - * Purpose: Update the replacement policy data structures for an - * unpin of the specified cache entry. - * - * To do this, unlink the specified entry from the protected - * entry list, and re-insert it in the data structures used - * by the current replacement policy. - * - * At present, we only support the modified LRU policy, so - * this function deals with that case unconditionally. If - * we ever support other replacement policies, the macro - * should switch on the current policy and act accordingly. - * - * Return: N/A - * - * Programmer: John Mainzer, 3/22/06 - * - * Modifications: - * - * JRM -- 3/28/07 - * 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 - * journal write pending list if appropriate. - * - *------------------------------------------------------------------------- - */ - -#if H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS - -#define H5C2__UPDATE_RP_FOR_UNPIN(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)->is_pinned); \ - HDassert( (entry_ptr)->size > 0 ); \ - \ - /* Regardless of the replacement policy, remove the entry from the \ - * pinned entry list. \ - */ \ - 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)) \ - \ - 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), \ - ((cache_ptr)->jwipl_head_ptr), \ - ((cache_ptr)->jwipl_tail_ptr), \ - ((cache_ptr)->jwipl_len), \ - ((cache_ptr)->jwipl_size), fail_val) \ - \ - } else { /* put entry in the replacement policy data structures */ \ - \ - /* modified LRU specific code */ \ - \ - /* 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)) \ - \ - /* Similarly, insert the entry at the head of either the clean \ - * or dirty LRU list as appropriate. \ - */ \ - \ - 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)) \ - \ - } 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)) \ - } \ - \ - /* End modified LRU specific code. */ \ - } \ - \ -} /* H5C2__UPDATE_RP_FOR_UNPIN */ - -#else /* H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ - -#define H5C2__UPDATE_RP_FOR_UNPIN(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)->is_pinned); \ - HDassert( (entry_ptr)->size > 0 ); \ - \ - /* Regardless of the replacement policy, remove the entry from the \ - * pinned entry list. \ - */ \ - 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)) \ - \ - 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), \ - ((cache_ptr)->jwipl_head_ptr), \ - ((cache_ptr)->jwipl_tail_ptr), \ - ((cache_ptr)->jwipl_len), \ - ((cache_ptr)->jwipl_size), fail_val) \ - \ - } else { /* put entry in the replacement policy data structures */ \ - \ - /* modified LRU specific code */ \ - \ - /* 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)) \ - \ - /* End modified LRU specific code. */ \ - } \ - \ -} /* H5C2__UPDATE_RP_FOR_UNPIN */ - -#endif /* H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ - - -/*------------------------------------------------------------------------- - * - * Macro: H5C2__UPDATE_RP_FOR_UNPROTECT - * - * Purpose: Update the replacement policy data structures for an - * unprotect of the specified cache entry. - * - * To do this, unlink the specified entry from the protected - * list, and re-insert it in the data structures used by the - * current replacement policy. - * - * At present, we only support the modified LRU policy, so - * this function deals with that case unconditionally. If - * we ever support other replacement policies, the function - * should switch on the current policy and act accordingly. - * - * Return: N/A - * - * Programmer: John Mainzer, 5/19/04 - * - * Modifications: - * - * JRM - 7/27/04 - * Converted the function H5C2_update_rp_for_unprotect() to - * the macro H5C2__UPDATE_RP_FOR_UNPROTECT in an effort to - * squeeze a bit more performance out of the cache. - * - * At least for the first cut, I am leaving the comments and - * white space in the macro. If they cause dificulties with - * pre-processor, I'll have to remove them. - * - * JRM - 7/28/04 - * Split macro into two version, one supporting the clean and - * dirty LRU lists, and the other not. Yet another attempt - * at optimization. - * - * JRM - 3/17/06 - * Modified macro to put pinned entries on the pinned entry - * list instead of inserting them in the data structures - * maintained by the replacement policy. - * - * JRM - 3/30/08 - * Modified macro to put un-pinned entries with pending - * journal writes on the journal write in progress list. - * - *------------------------------------------------------------------------- - */ - -#if H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS - -#define H5C2__UPDATE_RP_FOR_UNPROTECT(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)->size > 0 ); \ - \ - /* Regardless of the replacement policy, remove the entry from the \ - * protected list. \ - */ \ - 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)) \ - \ - } 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), \ - ((cache_ptr)->jwipl_head_ptr), \ - ((cache_ptr)->jwipl_tail_ptr), \ - ((cache_ptr)->jwipl_len), \ - ((cache_ptr)->jwipl_size), fail_val) \ - \ - } else { /* put the entry in the replacement policy data structures */ \ - \ - /* modified LRU specific code */ \ - \ - /* 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)) \ - \ - /* Similarly, insert the entry at the head of either the clean or \ - * dirty LRU list as appropriate. \ - */ \ - \ - 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)) \ - \ - } 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)) \ - } \ - \ - /* End modified LRU specific code. */ \ - } \ - \ -} /* H5C2__UPDATE_RP_FOR_UNPROTECT */ - -#else /* H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ - -#define H5C2__UPDATE_RP_FOR_UNPROTECT(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)->size > 0 ); \ - \ - /* Regardless of the replacement policy, remove the entry from the \ - * protected list. \ - */ \ - 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)) \ - \ - } 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), \ - ((cache_ptr)->jwipl_head_ptr), \ - ((cache_ptr)->jwipl_tail_ptr), \ - ((cache_ptr)->jwipl_len), \ - ((cache_ptr)->jwipl_size), fail_val) \ - \ - } else { \ - \ - /* modified LRU specific code */ \ - \ - /* 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)) \ - \ - /* End modified LRU specific code. */ \ - } \ -} /* H5C2__UPDATE_RP_FOR_UNPROTECT */ - -#endif /* H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ - - -/************************************************************************** - * - * Transaction list update macros: - * - * When journaling is enabled, we must maintain the transaction list -- the - * list of all entries that have been dirtied during the current - * transaction. - * - * The following macros exist to support this task. - * - **************************************************************************/ - -/*------------------------------------------------------------------------- - * - * Macro: H5C2__INSERT_ENTRY_IN_TL() - * - * Purpose: Check to see if journaling is enabled. - * - * If it is, set the last_trans field of the target entry - * to the current transaction number, and insert the entry - * in the transaction list. - * - * Return: N/A - * - * Programmer: John Mainzer, 3/31/08 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -#define H5C2__INSERT_ENTRY_IN_TL(cache_ptr, entry_ptr, fail_val) \ -if ( cache_ptr->mdj_enabled ) \ -{ \ - HDassert( cache_ptr->trans_in_progress ); \ - HDassert( entry_ptr->last_trans == 0 ); \ - \ - entry_ptr->last_trans = cache_ptr->trans_num; \ - \ - H5C2__TRANS_DLL_PREPEND((entry_ptr), (cache_ptr->tl_head_ptr), \ - (cache_ptr->tl_tail_ptr), \ - (cache_ptr->tl_len), (cache_ptr->tl_size), \ - (fail_val)); \ -} /* H5C2__INSERT_ENTRY_IN_TL */ - - -/*------------------------------------------------------------------------- - * - * Macro: H5C2__UPDATE_TL_FOR_ENTRY_CLEAR - * - * 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 - * last_trans field to zero. - * - * Return: N/A - * - * Programmer: John Mainzer, 3/31/08 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -#define H5C2__UPDATE_TL_FOR_ENTRY_CLEAR(cache_ptr, entry_ptr, fail_val) \ -if ( cache_ptr->mdj_enabled ) \ -{ \ - HDassert( cache_ptr->trans_in_progress ); \ - HDassert( entry_ptr->last_trans <= cache_ptr->trans_num ); \ - \ - if ( entry_ptr->last_trans == cache_ptr->trans_num ) { \ - \ - H5C2__TRANS_DLL_REMOVE((entry_ptr), (cache_ptr->tl_head_ptr), \ - (cache_ptr->tl_tail_ptr), \ - (cache_ptr->tl_len), \ - (cache_ptr->tl_size), (fail_val)); \ - entry_ptr->last_trans = 0; \ - } \ -} /* H5C2__UPDATE_TL_FOR_ENTRY_CLEAR */ - - -/*------------------------------------------------------------------------- - * - * Macro: H5C2__UPDATE_TL_FOR_ENTRY_DIRTY - * - * 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. If it isn't, - * set the entries last_trans field to the id of the current - * transaction. - * - * In either case, then insert the entry at the head of the - * transaction list. - * - * Return: N/A - * - * Programmer: John Mainzer, 3/31/08 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -#define H5C2__UPDATE_TL_FOR_ENTRY_DIRTY(cache_ptr, entry_ptr, fail_val) \ -if ( cache_ptr->mdj_enabled ) \ -{ \ - HDassert( cache_ptr->trans_in_progress ); \ - HDassert( entry_ptr->last_trans <= cache_ptr->trans_num ); \ - \ - if ( entry_ptr->last_trans == cache_ptr->trans_num ) { \ - \ - H5C2__TRANS_DLL_REMOVE((entry_ptr), (cache_ptr->tl_head_ptr), \ - (cache_ptr->tl_tail_ptr), \ - (cache_ptr->tl_len), \ - (cache_ptr->tl_size), (fail_val)); \ - } else { \ - entry_ptr->last_trans = cache_ptr->trans_num; \ - } \ - \ - H5C2__TRANS_DLL_PREPEND((entry_ptr), (cache_ptr->tl_head_ptr), \ - (cache_ptr->tl_tail_ptr), \ - (cache_ptr->tl_len), (cache_ptr->tl_size), \ - (fail_val)); \ -} /* H5C2__UPDATE_TL_FOR_ENTRY_DIRTY */ - - -/*------------------------------------------------------------------------- - * - * Macro: H5C2__UPDATE_TL_FOR_ENTRY_SIZE_CHANGE - * - * 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 - * transaction list if it should be. - * - * Return: N/A - * - * Programmer: John Mainzer, 3/31/08 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -#define H5C2__UPDATE_TL_FOR_ENTRY_SIZE_CHANGE(cache_ptr, entry_ptr, \ - old_size, new_size) \ -if ( ( (cache_ptr)->mdj_enabled ) && \ - ( (entry_ptr)->last_trans == (cache_ptr)->trans_num ) ) { \ - HDassert( (cache_ptr)->trans_in_progress ); \ - H5C2__DLL_UPDATE_FOR_SIZE_CHANGE(((cache_ptr)->tl_len), \ - ((cache_ptr)->tl_size), \ - (old_size), (new_size)); \ -} /* H5C2__UPDATE_TL_FOR_ENTRY_SIZE_CHANGE() */ - - -/*------------------------------------------------------------------------- - * - * 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 deleted file mode 100644 index 9ba6c93..0000000 --- a/src/H5C2private.h +++ /dev/null @@ -1,1688 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * Copyright by the Board of Trustees of the University of Illinois. * - * All rights reserved. * - * * - * This file is part of HDF5. The full HDF5 copyright notice, including * - * terms governing use, modification, and redistribution, is contained in * - * the files COPYING and Copyright.html. COPYING can be found at the root * - * of the source code distribution tree; Copyright.html can be found at the * - * root level of an installed copy of the electronic HDF5 document set and * - * is linked from the top-level documents page. It can also be found at * - * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * - * access to either file, you may request a copy from help@hdfgroup.org. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/*------------------------------------------------------------------------- - * - * Created: H5C2private.h - * 6/3/04 - * John Mainzer - * - * Purpose: Constants and typedefs available to the rest of the - * library. - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -#ifndef _H5C2private_H -#define _H5C2private_H - -#include "H5C2public.h" /* public prototypes */ - -/* Pivate headers needed by this header */ -#include "H5private.h" /* Generic Functions */ -#include "H5Fprivate.h" /* File access */ - - -#define H5C2_DO_SANITY_CHECKS 1 -#define H5C2_DO_EXTREME_SANITY_CHECKS 0 - -/* This sanity checking constant was picked out of the air. Increase - * or decrease it if appropriate. Its purposes is to detect corrupt - * object sizes, so it probably doesn't matter if it is a bit big. - * - * JRM - 5/17/04 - */ -#define H5C2_MAX_ENTRY_SIZE ((size_t)(10 * 1024 * 1024)) - -/* H5C2_COLLECT_CACHE_STATS controls overall collection of statistics - * on cache activity. In general, this #define should be set to 0. - */ -#define H5C2_COLLECT_CACHE_STATS 1 - -/* H5C2_COLLECT_CACHE_ENTRY_STATS controls collection of statistics - * in individual cache entries. - * - * H5C2_COLLECT_CACHE_ENTRY_STATS should only be defined to true if - * H5C2_COLLECT_CACHE_STATS is also defined to true. - */ -#if H5C2_COLLECT_CACHE_STATS - -#define H5C2_COLLECT_CACHE_ENTRY_STATS 1 - -#else - -#define H5C2_COLLECT_CACHE_ENTRY_STATS 0 - -#endif /* H5C2_COLLECT_CACHE_STATS */ - - -#ifdef H5_HAVE_PARALLEL - -/* we must maintain the clean and dirty LRU lists when we are compiled - * with parallel support. - */ -#define H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS 1 - -#else /* H5_HAVE_PARALLEL */ - -/* The clean and dirty LRU lists don't buy us anything here -- we may - * want them on for testing on occasion, but in general they should be - * off. - */ -#define H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS 0 /* JRM */ - -#endif /* H5_HAVE_PARALLEL */ - - -/* Typedef for the main structure for the cache (defined in H5C2pkg.h) */ - -typedef struct H5C2_t H5C2_t; - - -/*************************************************************************** - * - * Struct H5C2_class_t - * - * Instances of H5C2_class_t are used to specify the callback functions - * used by the metadata cache for each class of metadata cache entry. - * The fields of the structure are discussed below: - * - * id: Integer field containing the unique ID of the class of metadata - * cache entries. - * - * 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 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, - * and return a pointer to that representation. - * - * The typedef for the deserialize callback is as follows: - * - * typedef void *(*H5C2_deserialize_func_t)(haddr_t addr, - * size_t len, - * const void * image_ptr, - * void * udata_ptr, - * boolean * dirty_ptr); - * - * The parameters of the deserialize callback are as follows: - * - * addr: Base address in file of the image to be deserialized. - * - * 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 in bytes of the in file image to be deserialized. - * - * 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. - * - * 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 - * must be passed through to the deserialize callback. - * - * dirty_ptr: Pointer to boolean which the deserialize function - * must use to mark the entry dirty if it has to modify - * the entry to clean up file corruption left over from - * an old bug in the HDF5 library. - * - * 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 - * 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 - * 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 will be set to FALSE before the deserialize call. - * - * If the operation fails for any reason (i.e. bad data in buffer, bad - * buffer length, malloc failure, etc.) the function must return NULL and - * push error information on the error stack with the error API routines. - * - * If the protect call which occasioned the call to the deserialize - * callback had the check length flag set, after the deserialize call - * returns, the cache must call the image_len callback (see below) and - * update its on disk image length accordingly. - * - * - * image_len: Pointer to the image length callback. - * - * In the best of all possible worlds, we would not have this callback. - * It exists to allow clients to reduce the size of the on disk image of - * an entry in the deserialize callback. - * - * The typedef for the image_len callback is as follows: - * - * typedef herr_t (*H5C2_image_len_func_t)(void *thing, - * size_t *image_len_ptr); - * - * The parameters of the image_len callback are as follows: - * - * thing: Pointer to the in core representation of the entry. - * - * image_len_ptr: Pointer to size_t in which the callback will return - * the length of the on disk image of the cache entry. - * - * Processing in the image_len function should proceed as follows: - * - * If successful, the function will place the length of the on disk - * image associated with the in core representation provided in the - * thing parameter in *image_len_ptr, and then return SUCCEED. - * - * On failure, the function must return FAIL and push error information - * onto the error stack with the error API routines. - * - * - * 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 - * 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 - * metadata cache's internal structures accordingly. - * - * The typedef for the serialize callback is as follows: - * - * typedef herr_t (*H5C2_serialize_func_t)(const H5F_t *f, - * hid_t dxpl_id, - * haddr_t addr, - * size_t len, - * void * image_ptr, - * void * thing, - * unsigned * flags_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 - * 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 - * possibly other entries on serialize. - * - * addr: Base address in file of the entry to be serialized. - * - * 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 in bytes of the in file image of the entry to be - * serialized. Also the size of *image_ptr (below). - * - * 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. - * - * 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 - * 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 - * 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 - * 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 - * the serialize function, *new_image_ptr_ptr is undefined. - * - * 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. - * - * 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 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 fails for any reason, the function must return FAIL and - * 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 typedef for the free ICR callback is as follows: - * - * 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: - * - * 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. - * - * 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. - * - * 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: - * - * The free ICR function must free all memory allocated to the - * in core representation. - * - * 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. - * - * 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. - * - * 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. - * - * 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: - * - * typedef herr_t (*N5C_clear_dirty_bits_func_t)(haddr_t addr, - * size_t len, - * void * thing); - * - * The parameters of the clear callback are as follows: - * - * 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. - * - * 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: - * - * The function must clear any dirty bits associated with the ICR. - * - * 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 - * routines. - * - ***************************************************************************/ -typedef void *(*H5C2_deserialize_func_t)(haddr_t addr, - size_t len, - 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); - -#define H5C2__SERIALIZE_RESIZED_FLAG 0x1 -#define H5C2__SERIALIZE_RENAMED_FLAG 0x2 - -typedef herr_t (*H5C2_serialize_func_t)(const H5F_t *f, - hid_t dxpl_id, - haddr_t addr, - size_t len, - void * image_ptr, - void * thing, - 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, - size_t len, - void * thing); - -typedef herr_t (*H5C2_clear_dirty_bits_func_t)(haddr_t addr, - size_t len, - void * thing); - -typedef struct H5C2_class_t { - int id; - const char * name; - H5FD_mem_t mem_type; - H5C2_deserialize_func_t deserialize; - H5C2_image_len_func_t image_len; - H5C2_serialize_func_t serialize; - H5C2_free_icr_func_t free_icr; - H5C2_clear_dirty_bits_func_t clear_dirty_bits; -} H5C2_class_t; - - -/* Type defintions of call back functions used by the cache as a whole */ - -typedef herr_t (*H5C2_write_permitted_func_t)(const H5F_t *f, - hid_t dxpl_id, - hbool_t * write_permitted_ptr); - -typedef herr_t (*H5C2_log_flush_func_t)(H5C2_t * cache_ptr, - haddr_t addr, - hbool_t was_dirty, - unsigned flags, - int type_id); - -/* Upper and lower limits on cache size. These limits are picked - * out of a hat -- you should be able to change them as necessary. - * - * However, if you need a very big cache, you should also increase the - * size of the hash table (H5C2__HASH_TABLE_LEN in H5C2pkg.h). The current - * upper bound on cache size is rather large for the current hash table - * size. - */ - -#define H5C2__MAX_MAX_CACHE_SIZE ((size_t)(128 * 1024 * 1024)) -#define H5C2__MIN_MAX_CACHE_SIZE ((size_t)(1024)) - - -/* Default max cache size and min clean size are give here to make - * them generally accessable. - */ - -#define H5C2__DEFAULT_MAX_CACHE_SIZE ((size_t)(4 * 1024 * 1024)) -#define H5C2__DEFAULT_MIN_CLEAN_SIZE ((size_t)(2 * 1024 * 1024)) - - -/**************************************************************************** - * - * structure H5C2_cache_entry_t - * - * Instances of the H5C2_cache_entry_t structure are used to store cache - * entries in a hash table and sometimes in a skip list. - * See H5SL.c for the particulars of the skip list. - * - * In typical application, this structure is the first field in a - * structure to be cached. For historical reasons, the external module - * is responsible for managing the is_dirty field (this is no longer - * completely true. See the comment on the is_dirty field for details). - * All other fields are managed by the cache. - * - * The fields of this structure are discussed individually below: - * - * JRM - 4/26/04 - * - * 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 - * 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 - * 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 - * of the LRU when this situation occurs. - * - * cache_ptr: Pointer to the cache that this entry is contained within. - * - * addr: Base address of the cache entry on disk. - * - * size: Length of the cache entry on disk. Note that unlike normal - * caches, the entries in this cache are of variable length. - * The entries should never overlap, and when we do writebacks, - * we will want to writeback adjacent entries where possible. - * - * NB: At present, entries need not be contiguous on disk. Until - * we fix this, we can't do much with writing back adjacent - * entries. - * - * Update: This has now been changed -- all metadata cache - * entries must now be associated with a single contiguous - * 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 - * on disk image of the metadata cache entry is stored. - * - * If the entry is dirty, the serialize callback must be used - * to update this image before it is written to disk - * - * image_up_to_date: Boolean flag that is set to TRUE when *image_ptr - * is up to date, and set to false when the entry is dirtied. - * - * type: Pointer to the instance of H5C2_class_t containing pointers - * to the methods for cache entries of the current type. This - * field should be NULL when the instance of H5C2_cache_entry_t - * is not in use. - * - * The name is not particularly descriptive, but is retained - * to avoid changes in existing code. - * - * is_dirty: Boolean flag indicating whether the contents of the cache - * entry has been modified since the last time it was written - * to disk. - * - * NOTE: For historical reasons, this field is not maintained - * by the cache. Instead, the module using the cache - * sets this flag when it modifies the entry, and the - * flush and clear functions supplied by that module - * reset the dirty when appropriate. - * - * This is a bit quirky, so we may want to change this - * someday. However it will require a change in the - * cache interface. - * - * Update: Management of the is_dirty field has been largely - * moved into the cache. The only remaining exceptions - * are the flush and clear functions supplied by the - * modules using the cache. These still clear the - * is_dirty field as before. -- JRM 7/5/05 - * - * Update: Management of the is_dirty field is now entirely - * in the cache. -- JRM 7/5/07 - * - * dirtied: Boolean flag used to indicate that the entry has been - * dirtied while protected. - * - * This field is set to FALSE in the protect call, and may - * be set to TRUE by the - * H5C2_mark_pinned_or_protected_entry_dirty() - * call at an time prior to the unprotect call. - * - * The H5C2_mark_pinned_or_protected_entry_dirty() call exists - * as a convenience function for the fractal heap code which - * may not know if an entry is protected or pinned, but knows - * that is either protected or pinned. The dirtied field was - * added as in the parallel case, it is necessary to know - * whether a protected entry was dirty prior to the protect call. - * - * is_protected: Boolean flag indicating whether this entry is protected - * (or locked, to use more conventional terms). When it is - * protected, the entry cannot be flushed or accessed until - * it is unprotected (or unlocked -- again to use more - * conventional terms). - * - * 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 - * 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 - * protected more than once. - * - * 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 - * outstanding read only protects on this entry. This field - * must be zero whenever either is_protected or is_read_only - * are TRUE. - * - * is_pinned: Boolean flag indicating whether the entry has been pinned - * in the cache. - * - * For very hot entries, the protect / unprotect overhead - * can become excessive. Thus the cache has been extended - * to allow an entry to be "pinned" in the cache. - * - * Pinning an entry in the cache has several implications: - * - * 1) A pinned entry cannot be evicted. Thus unprotected - * pinned entries must be stored in the pinned entry - * list, instead of being managed by the replacement - * policy code (LRU at present). - * - * 2) A pinned entry can be accessed or modified at any time. - * Therefore, the cache must check with the entry owner - * before flushing it. If permission is denied, the - * cache does not flush the entry. - * - * 3) A pinned entry can be marked as dirty (and possibly - * change size) while it is unprotected. - * - * 4) The flush-destroy code must allow pinned entries to - * be unpinned (and possibly unprotected) during the - * flush. - * - * JRM -- 3/16/06 - * - * in_slist: Boolean flag indicating whether the entry is in the skip list - * As a general rule, entries are placed in the list when they - * are marked dirty. However they may remain in the list after - * being flushed. - * - * Update: Dirty entries are now removed from the skip list - * when they are flushed. - * - * flush_marker: Boolean flag indicating that the entry is to be flushed - * the next time H5C2_flush_cache() is called with the - * H5C2__FLUSH_MARKED_ENTRIES_FLAG. The flag is reset when - * the entry is flushed for whatever reason. - * - * clear_on_unprotect: Boolean flag used only in PHDF5. When H5C2 is used - * to implement the metadata cache In the parallel case, only - * the cache with mpi rank 0 is allowed to actually write to - * file -- all other caches must retain dirty entries until they - * are advised that the entry is clean. - * - * This flag is used in the case that such an advisory is - * received when the entry is protected. If it is set when an - * entry is unprotected, and the dirtied flag is not set in - * the unprotect, the entry's is_dirty flag is reset by flushing - * it with the H5C2__FLUSH_CLEAR_ONLY_FLAG. - * - * flush_in_progress: Boolean flag that is set to true iff the entry - * 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 - * is in the process of being flushed and destroyed. - * - * - * Fields supporting the hash table: - * - * Fields in the cache are indexed by a more or less conventional hash table. - * If there are multiple entries in any hash bin, they are stored in a doubly - * linked list. - * - * ht_next: Next pointer used by the hash table to store multiple - * entries in a single hash bin. This field points to the - * next entry in the doubly linked list of entries in the - * hash bin, or NULL if there is no next entry. - * - * ht_prev: Prev pointer used by the hash table to store multiple - * entries in a single hash bin. This field points to the - * previous entry in the doubly linked list of entries in - * the hash bin, or NULL if there is no previuos entry. - * - * - * Fields supporting replacement policies: - * - * The cache must have a replacement policy, and it will usually be - * necessary for this structure to contain fields supporting that policy. - * - * While there has been interest in several replacement policies for - * this cache, the initial development schedule is tight. Thus I have - * elected to support only a modified LRU policy for the first cut. - * - * When additional replacement policies are added, the fields in this - * section will be used in different ways or not at all. Thus the - * documentation of these fields is repeated for each replacement policy. - * - * Modified LRU: - * - * When operating in parallel mode, we must ensure that a read does not - * cause a write. If it does, the process will hang, as the write will - * be collective and the other processes will not know to participate. - * - * To deal with this issue, I have modified the usual LRU policy by adding - * clean and dirty LRU lists to the usual LRU list. When reading in - * parallel mode, we evict from the clean LRU list only. This implies - * that we must try to ensure that the clean LRU list is reasonably well - * stocked. See the comments on H5C2_t in H5C2pkg.h for more details. - * - * Note that even if we start with a completely clean cache, a sequence - * of protects without unprotects can empty the clean LRU list. In this - * case, the cache must grow temporarily. At the next write, we will - * attempt to evict enough entries to get the cache down to its nominal - * maximum size. - * - * The use of the replacement policy fields under the Modified LRU policy - * is discussed below: - * - * next: Next pointer in either the LRU or the protected list, - * depending on the current value of protected. If there - * is no next entry on the list, this field should be set - * to NULL. - * - * prev: Prev pointer in either the LRU or the protected list, - * depending on the current value of protected. If there - * is no previous entry on the list, this field should be - * set to NULL. - * - * aux_next: Next pointer on either the clean or dirty LRU lists. - * This entry should be NULL when protected is true. When - * protected is false, and dirty is true, it should point - * to the next item on the dirty LRU list. When protected - * is false, and dirty is false, it should point to the - * next item on the clean LRU list. In either case, when - * there is no next item, it should be NULL. - * - * aux_prev: Previous pointer on either the clean or dirty LRU lists. - * This entry should be NULL when protected is true. When - * protected is false, and dirty is true, it should point - * to the previous item on the dirty LRU list. When protected - * is false, and dirty is false, it should point to the - * previous item on the clean LRU list. In either case, when - * there is no previous item, it should be NULL. - * - * - * Fields supporting metadata journaling: - * - * last_trans: unit64_t containing the ID of the last transaction in - * which this entry was dirtied. If journaling is disabled, - * or if the entry has never been dirtied in a transaction, - * this field should be set to zero. Once we notice that - * 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 - * has made it to disk in the journal file. - * - * 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, - * 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 - * entry on the list. - * - * 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, - * 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 first - * entry on the list. - * - * - * Cache entry stats collection fields: - * - * These fields should only be compiled in when both H5C2_COLLECT_CACHE_STATS - * and H5C2_COLLECT_CACHE_ENTRY_STATS are true. When present, they allow - * collection of statistics on individual cache entries. - * - * accesses: int32_t containing the number of times this cache entry has - * been referenced in its lifetime. - * - * clears: int32_t containing the number of times this cache entry has - * been cleared in its life time. - * - * flushes: int32_t containing the number of times this cache entry has - * been flushed to file in its life time. - * - * pins: int32_t containing the number of times this cache entry has - * been pinned in cache in its life time. - * - ****************************************************************************/ - -#ifndef NDEBUG -#define H5C2__H5C2_CACHE_ENTRY_T_MAGIC 0x005CAC0A -#define H5C2__H5C2_CACHE_ENTRY_T_BAD_MAGIC 0xDeadBeef -#endif /* NDEBUG */ - -typedef struct H5C2_cache_entry_t -{ -#ifndef NDEBUG - uint32_t magic; -#endif /* NDEBUG */ - H5C2_t * cache_ptr; - haddr_t addr; - size_t size; - void * image_ptr; - hbool_t image_up_to_date; - const H5C2_class_t * type; - hbool_t is_dirty; - hbool_t dirtied; - hbool_t is_protected; - hbool_t is_read_only; - int ro_ref_count; - hbool_t is_pinned; - hbool_t in_slist; - hbool_t flush_marker; -#ifdef H5_HAVE_PARALLEL - hbool_t clear_on_unprotect; -#endif /* H5_HAVE_PARALLEL */ - hbool_t flush_in_progress; - hbool_t destroy_in_progress; - - /* fields supporting the hash table: */ - - struct H5C2_cache_entry_t * ht_next; - struct H5C2_cache_entry_t * ht_prev; - - /* fields supporting replacement policies: */ - - struct H5C2_cache_entry_t * next; - struct H5C2_cache_entry_t * prev; - struct H5C2_cache_entry_t * aux_next; - struct H5C2_cache_entry_t * aux_prev; - - - /* fields supporting journaling */ - - uint64_t last_trans; - struct H5C2_cache_entry_t * trans_next; - struct H5C2_cache_entry_t * trans_prev; - -#if H5C2_COLLECT_CACHE_ENTRY_STATS - - /* cache entry stats fields */ - - int32_t accesses; - int32_t clears; - int32_t flushes; - int32_t pins; - -#endif /* H5C2_COLLECT_CACHE_ENTRY_STATS */ - -} H5C2_cache_entry_t; - - -/**************************************************************************** - * - * structure H5C2_auto_size_ctl_t - * - * Instances of H5C2_auto_size_ctl_t are used to get and set the control - * fields for automatic cache re-sizing. - * - * The fields of the structure are discussed individually below: - * - * version: Integer field containing the version number of this version - * of the H5C2_auto_size_ctl_t structure. Any instance of - * H5C2_auto_size_ctl_t passed to the cache must have a known - * version number, or an error will be flagged. - * - * report_fcn: Pointer to the function that is to be called to report - * activities each time the auto cache resize code is executed. If the - * field is NULL, no call is made. - * - * If the field is not NULL, it must contain the address of a function - * of type H5C2_auto_resize_report_fcn. - * - * set_initial_size: Boolean flag indicating whether the size of the - * initial size of the cache is to be set to the value given in - * the initial_size field. If set_initial_size is FALSE, the - * initial_size field is ignored. - * - * initial_size: If enabled, this field contain the size the cache is - * to be set to upon receipt of this structure. Needless to say, - * initial_size must lie in the closed interval [min_size, max_size]. - * - * min_clean_fraction: double in the range 0 to 1 indicating the fraction - * of the cache that is to be kept clean. This field is only used - * in parallel mode. Typical values are 0.1 to 0.5. - * - * max_size: Maximum size to which the cache can be adjusted. The - * supplied value must fall in the closed interval - * [MIN_MAX_CACHE_SIZE, MAX_MAX_CACHE_SIZE]. Also, max_size must - * be greater than or equal to min_size. - * - * min_size: Minimum size to which the cache can be adjusted. The - * supplied value must fall in the closed interval - * [MIN_MAX_CACHE_SIZE, MAX_MAX_CACHE_SIZE]. Also, min_size must - * be less than or equal to max_size. - * - * epoch_length: Number of accesses on the cache over which to collect - * hit rate stats before running the automatic cache resize code, - * if it is enabled. - * - * At the end of an epoch, we discard prior hit rate data and start - * collecting afresh. The epoch_length must lie in the closed - * interval [H5C2__MIN_AR_EPOCH_LENGTH, H5C2__MAX_AR_EPOCH_LENGTH]. - * - * - * Cache size increase control fields: - * - * incr_mode: Instance of the H5C2_cache_incr_mode enumerated type whose - * value indicates how we determine whether the cache size should be - * increased. At present there are two possible values: - * - * H5C2_incr__off: Don't attempt to increase the size of the cache - * automatically. - * - * When this increment mode is selected, the remaining fields - * in the cache size increase section ar ignored. - * - * H5C2_incr__threshold: Attempt to increase the size of the cache - * whenever the average hit rate over the last epoch drops - * below the value supplied in the lower_hr_threshold - * field. - * - * Note that this attempt will fail if the cache is already - * at its maximum size, or if the cache is not already using - * all available space. - * - * lower_hr_threshold: Lower hit rate threshold. If the increment mode - * (incr_mode) is H5C2_incr__threshold and the hit rate drops below the - * value supplied in this field in an epoch, increment the cache size by - * size_increment. Note that cache size may not be incremented above - * max_size, and that the increment may be further restricted by the - * max_increment field if it is enabled. - * - * When enabled, this field must contain a value in the range [0.0, 1.0]. - * Depending on the incr_mode selected, it may also have to be less than - * upper_hr_threshold. - * - * increment: Double containing the multiplier used to derive the new - * cache size from the old if a cache size increment is triggered. - * The increment must be greater than 1.0, and should not exceed 2.0. - * - * The new cache size is obtained by multiplying the current max cache - * size by the increment, and then clamping to max_size and to stay - * within the max_increment as necessary. - * - * apply_max_increment: Boolean flag indicating whether the max_increment - * field should be used to limit the maximum cache size increment. - * - * max_increment: If enabled by the apply_max_increment field described - * above, this field contains the maximum number of bytes by which the - * cache size can be increased in a single re-size. - * - * flash_incr_mode: Instance of the H5C2_cache_flash_incr_mode enumerated - * type whose value indicates whether and by what algorithm we should - * make flash increases in the size of the cache to accomodate insertion - * of large entries and large increases in the size of a single entry. - * - * The addition of the flash increment mode was occasioned by performance - * problems that appear when a local heap is increased to a size in excess - * of the current cache size. While the existing re-size code dealt with - * this eventually, performance was very bad for the remainder of the - * epoch. - * - * At present, there are two possible values for the flash_incr_mode: - * - * H5C2_flash_incr__off: Don't perform flash increases in the size of - * the cache. - * - * H5C2_flash_incr__add_space: Let x be either the size of a newly - * newly inserted entry, or the number of bytes by which the - * size of an existing entry has been increased. - * - * If - * x > flash_threshold * current max cache size, - * - * increase the current maximum cache size by x * flash_multiple - * less any free space in the cache, and start a new epoch. For - * now at least, pay no attention to the maximum increment. - * - * - * With a little thought, it should be obvious that the above flash - * 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 - * the max cache size to at least double to maintain acceptable - * performance, however the above flash increment algorithm will not be - * triggered. - * - * Hopefully, the add space algorithm detailed above will be sufficient - * for the performance problems encountered to date. However, we should - * expect to revisit the issue. - * - * flash_multiple: Double containing the multiple described above in the - * H5C2_flash_incr__add_space section of the discussion of the - * flash_incr_mode section. This field is ignored unless flash_incr_mode - * is H5C2_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_incr_mode is H5C2_flash_incr__add_space. - * - * - * Cache size decrease control fields: - * - * decr_mode: Instance of the H5C2_cache_decr_mode enumerated type whose - * value indicates how we determine whether the cache size should be - * decreased. At present there are four possibilities. - * - * H5C2_decr__off: Don't attempt to decrease the size of the cache - * automatically. - * - * When this increment mode is selected, the remaining fields - * in the cache size decrease section are ignored. - * - * H5C2_decr__threshold: Attempt to decrease the size of the cache - * whenever the average hit rate over the last epoch rises - * above the value supplied in the upper_hr_threshold - * field. - * - * H5C2_decr__age_out: At the end of each epoch, search the cache for - * entries that have not been accessed for at least the number - * of epochs specified in the epochs_before_eviction field, and - * evict these entries. Conceptually, the maximum cache size - * is then decreased to match the new actual cache size. However, - * this reduction may be modified by the min_size, the - * max_decrement, and/or the empty_reserve. - * - * H5C2_decr__age_out_with_threshold: Same as age_out, but we only - * attempt to reduce the cache size when the hit rate observed - * over the last epoch exceeds the value provided in the - * upper_hr_threshold field. - * - * upper_hr_threshold: Upper hit rate threshold. The use of this field - * varies according to the current decr_mode: - * - * H5C2_decr__off or H5C2_decr__age_out: The value of this field is - * ignored. - * - * H5C2_decr__threshold: If the hit rate exceeds this threshold in any - * epoch, attempt to decrement the cache size by size_decrement. - * - * Note that cache size may not be decremented below min_size. - * - * Note also that if the upper_threshold is 1.0, the cache size - * will never be reduced. - * - * H5C2_decr__age_out_with_threshold: If the hit rate exceeds this - * threshold in any epoch, attempt to reduce the cache size - * by evicting entries that have not been accessed for more - * than the specified number of epochs. - * - * decrement: This field is only used when the decr_mode is - * H5C2_decr__threshold. - * - * The field is a double containing the multiplier used to derive the - * new cache size from the old if a cache size decrement is triggered. - * The decrement must be in the range 0.0 (in which case the cache will - * try to contract to its minimum size) to 1.0 (in which case the - * cache will never shrink). - * - * apply_max_decrement: Boolean flag used to determine whether decrements - * in cache size are to be limited by the max_decrement field. - * - * max_decrement: Maximum number of bytes by which the cache size can be - * decreased in a single re-size. Note that decrements may also be - * restricted by the min_size of the cache, and (in age out modes) by - * the empty_reserve field. - * - * epochs_before_eviction: Integer field used in H5C2_decr__age_out and - * H5C2_decr__age_out_with_threshold decrement modes. - * - * This field contains the number of epochs an entry must remain - * unaccessed before it is evicted in an attempt to reduce the - * cache size. If applicable, this field must lie in the range - * [1, H5C2__MAX_EPOCH_MARKERS]. - * - * apply_empty_reserve: Boolean field controlling whether the empty_reserve - * field is to be used in computing the new cache size when the - * decr_mode is H5C2_decr__age_out or H5C2_decr__age_out_with_threshold. - * - * empty_reserve: To avoid a constant racheting down of cache size by small - * amounts in the H5C2_decr__age_out and H5C2_decr__age_out_with_threshold - * modes, this field allows one to require that any cache size - * reductions leave the specified fraction of unused space in the cache. - * - * The value of this field must be in the range [0.0, 1.0]. I would - * expect typical values to be in the range of 0.01 to 0.1. - * - ****************************************************************************/ - -#define H5C2_RESIZE_CFG__VALIDATE_GENERAL 0x1 -#define H5C2_RESIZE_CFG__VALIDATE_INCREMENT 0x2 -#define H5C2_RESIZE_CFG__VALIDATE_DECREMENT 0x4 -#define H5C2_RESIZE_CFG__VALIDATE_INTERACTIONS 0x8 -#define H5C2_RESIZE_CFG__VALIDATE_ALL \ -( \ - H5C2_RESIZE_CFG__VALIDATE_GENERAL | \ - H5C2_RESIZE_CFG__VALIDATE_INCREMENT | \ - H5C2_RESIZE_CFG__VALIDATE_DECREMENT | \ - H5C2_RESIZE_CFG__VALIDATE_INTERACTIONS \ -) - -#define H5C2__CURR_AUTO_SIZE_CTL_VER 1 -#define H5C2__CURR_AUTO_RESIZE_RPT_FCN_VER 1 - -#define H5C2__MAX_EPOCH_MARKERS 10 - -#define H5C2__DEF_AR_UPPER_THRESHHOLD 0.9999 -#define H5C2__DEF_AR_LOWER_THRESHHOLD 0.9 -#define H5C2__DEF_AR_MAX_SIZE ((size_t)(16 * 1024 * 1024)) -#define H5C2__DEF_AR_INIT_SIZE ((size_t)( 1 * 1024 * 1024)) -#define H5C2__DEF_AR_MIN_SIZE ((size_t)( 1 * 1024 * 1024)) -#define H5C2__DEF_AR_MIN_CLEAN_FRAC 0.5 -#define H5C2__DEF_AR_INCREMENT 2.0 -#define H5C2__DEF_AR_MAX_INCREMENT ((size_t)( 2 * 1024 * 1024)) -#define H5C2__DEF_AR_FLASH_MULTIPLE 1.0 -#define H5C2__DEV_AR_FLASH_THRESHOLD 0.25 -#define H5C2__DEF_AR_DECREMENT 0.9 -#define H5C2__DEF_AR_MAX_DECREMENT ((size_t)( 1 * 1024 * 1024)) -#define H5C2__DEF_AR_EPCHS_B4_EVICT 3 -#define H5C2__DEF_AR_EMPTY_RESERVE 0.05 -#define H5C2__MIN_AR_EPOCH_LENGTH 100 -#define H5C2__DEF_AR_EPOCH_LENGTH 50000 -#define H5C2__MAX_AR_EPOCH_LENGTH 1000000 - -#define H5C2__MIN_JBRB_BUF_SIZE ((size_t)(1)) -#define H5C2__MAX_JBRB_BUF_SIZE ((size_t)(2 * 1024 * 1024)) - -#define H5C2__MIN_JBRB_NUM_BUFS 1 -#define H5C2__MAX_JBRB_NUM_BUFS 256 - -enum H5C2_resize_status -{ - in_spec2, - increase2, - flash_increase2, - decrease2, - at_max_size2, - at_min_size2, - increase_disabled2, - decrease_disabled2, - not_full2 -}; /* enum H5C2_resize_conditions */ - -typedef void (*H5C2_auto_resize_rpt_fcn)(H5C2_t * cache_ptr, - int32_t version, - double hit_rate, - enum H5C2_resize_status status, - size_t old_max_cache_size, - size_t new_max_cache_size, - size_t old_min_clean_size, - size_t new_min_clean_size); - -typedef struct H5C2_auto_size_ctl_t -{ - /* general configuration fields: */ - int32_t version; - H5C2_auto_resize_rpt_fcn rpt_fcn; - - hbool_t set_initial_size; - size_t initial_size; - - double min_clean_fraction; - - size_t max_size; - size_t min_size; - - int64_t epoch_length; - - - /* size increase control fields: */ - enum H5C2_cache_incr_mode incr_mode; - - double lower_hr_threshold; - - double increment; - - hbool_t apply_max_increment; - size_t max_increment; - - enum H5C2_cache_flash_incr_mode flash_incr_mode; - double flash_multiple; - double flash_threshold; - - - /* size decrease control fields: */ - enum H5C2_cache_decr_mode decr_mode; - - double upper_hr_threshold; - - double decrement; - - hbool_t apply_max_decrement; - size_t max_decrement; - - int32_t epochs_before_eviction; - - hbool_t apply_empty_reserve; - double empty_reserve; - -} 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. - * - * 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. - * - * The fields of the structure are discussed individually below. Note - * that the fields with the "jbrb_" prefix are used to configure the - * journal buffer ring buffer -- a ring buffer of buffers used to buffer - * output of journal messages. - * - * enable_journaling: Boolean flag that is set to TRUE if journaling is - * to be enabled, and to FALSE otherwise. - * - * When the cache configuration is reported, this field is TRUE iff - * journaling is enabled. - * - * journal_file_path: Full path of the file to be used to store the - * metadata journal. This field is only defined if enable_journaling - * is TRUE. - * - * 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). - * - * jbrb_buf_size: size_t containing the size of each individual buffer - * in the journal buffer ring buffer. This size should be chosen - * to be some multiple of the block size used by the file system - * on which the journal file will be written. - * - * jbrb_num_bufs: Integer containing the number of buffers in the journal - * buffer ring buffer. If synchronous I/O is used, one or two buffers - * is sufficient. If asynchronous I/O is used, the number of buffers - * should be sufficiently large that a write on buffer is likely to - * complete before that buffer is needed again. - * - * jbrb_use_aio: Boolean flag indicating whether we should use - * asynchronous I/O for journal entry writes. - * - * jbrb_human_readable: Boolean flag which determines whether the journal - * file will be written in human readable form. In general, this - * field should be set to false, as the human readable journal - * file is at least twice a large as the machine readable version. - * - ****************************************************************************/ - -#define H5C2__MAX_JOURNAL_FILE_NAME_LEN 1024 - -typedef struct H5C2_mdj_config_t -{ - hbool_t enable_journaling; - char journal_file_path[H5C2__MAX_JOURNAL_FILE_NAME_LEN + 1]; - size_t jbrb_buf_size; - int jbrb_num_bufs; - hbool_t jbrb_use_aio; - hbool_t jbrb_human_readable; - -} H5C2_mdj_config_t; - -/* The following typedef is used for callbacks on metadata journaling - * configuration changes. - */ - -typedef herr_t (*H5C2_mdj_status_change_func_t)(const H5C2_mdj_config_t * config_ptr, - hid_t dxpl_id, - void * data_ptr); - - -/* - * Library prototypes. - */ - -/* #defines of flags used in the flags parameters in some of the - * following function calls. Note that not all flags are applicable - * to all function calls. Flags that don't apply to a particular - * function are ignored in that function. - * - * These flags apply to all function calls: - * - * H5C2__NO_FLAGS_SET (generic "no flags set" for all fcn calls) - * - * - * These flags apply to H5C2_insert_entry(): - * - * H5C2__SET_FLUSH_MARKER_FLAG - * H5C2__PIN_ENTRY_FLAG - * - * These flags apply to H5C2_protect() - * - * H5C2__READ_ONLY_FLAG - * - * These flags apply to H5C2_unprotect(): - * - * H5C2__SET_FLUSH_MARKER_FLAG - * H5C2__DELETED_FLAG - * H5C2__DIRTIED_FLAG - * H5C2__SIZE_CHANGED_FLAG - * H5C2__PIN_ENTRY_FLAG - * H5C2__UNPIN_ENTRY_FLAG - * - * - * These flags apply to H5C2_flush_cache(): - * - * H5C2__FLUSH_INVALIDATE_FLAG - * H5C2__FLUSH_CLEAR_ONLY_FLAG - * H5C2__FLUSH_MARKED_ENTRIES_FLAG - * H5C2__FLUSH_IGNORE_PROTECTED_FLAG (can't use this flag in combination - * with H5C2__FLUSH_INVALIDATE_FLAG) - * - * These flags apply to H5C2_flush_single_entry(): - * - * H5C2__FLUSH_INVALIDATE_FLAG - * H5C2__FLUSH_CLEAR_ONLY_FLAG - * H5C2__FLUSH_MARKED_ENTRIES_FLAG - */ - -#define H5C2__NO_FLAGS_SET 0x0000 -#define H5C2__SET_FLUSH_MARKER_FLAG 0x0001 -#define H5C2__DELETED_FLAG 0x0002 -#define H5C2__DIRTIED_FLAG 0x0004 -#define H5C2__SIZE_CHANGED_FLAG 0x0008 -#define H5C2__PIN_ENTRY_FLAG 0x0010 -#define H5C2__UNPIN_ENTRY_FLAG 0x0020 -#define H5C2__FLUSH_INVALIDATE_FLAG 0x0040 -#define H5C2__FLUSH_CLEAR_ONLY_FLAG 0x0080 -#define H5C2__FLUSH_MARKED_ENTRIES_FLAG 0x0100 -#define H5C2__FLUSH_IGNORE_PROTECTED_FLAG 0x0200 -#define H5C2__READ_ONLY_FLAG 0x0400 - -H5_DLL H5C2_t * H5C2_create(size_t max_cache_size, - size_t min_clean_size, - int max_type_id, - const char * (* type_name_table_ptr), - H5C2_write_permitted_func_t check_write_permitted, - hbool_t write_permitted, - H5C2_log_flush_func_t log_flush, - void * aux_ptr); - -H5_DLL void H5C2_def_auto_resize_rpt_fcn(H5C2_t * cache_ptr, - int32_t version, - double hit_rate, - enum H5C2_resize_status status, - size_t old_max_cache_size, - size_t new_max_cache_size, - size_t old_min_clean_size, - size_t new_min_clean_size); - -H5_DLL herr_t H5C2_dest(H5F_t * f, - hid_t dxpl_id); - -H5_DLL herr_t H5C2_dest_empty(H5C2_t * cache_ptr); - -H5_DLL herr_t H5C2_expunge_entry(H5F_t * f, - hid_t dxpl_id, - const H5C2_class_t * type, - haddr_t addr); - -H5_DLL herr_t H5C2_flush_cache(H5F_t *f, hid_t dxpl_id, unsigned flags); - - -H5_DLL herr_t H5C2_flush_to_min_clean(H5F_t * f, - hid_t dxpl_id); - -H5_DLL herr_t H5C2_get_cache_auto_resize_config(const H5C2_t * cache_ptr, - H5C2_auto_size_ctl_t *config_ptr); - -H5_DLL herr_t H5C2_get_cache_size(H5C2_t * cache_ptr, - size_t * max_size_ptr, - size_t * min_clean_size_ptr, - size_t * cur_size_ptr, - int32_t * cur_num_entries_ptr); - -H5_DLL herr_t H5C2_get_cache_hit_rate(H5C2_t * cache_ptr, - double * hit_rate_ptr); - -H5_DLL herr_t H5C2_get_entry_status(const H5F_t * f, - haddr_t addr, - size_t * size_ptr, - hbool_t * in_cache_ptr, - hbool_t * is_dirty_ptr, - hbool_t * is_protected_ptr, - hbool_t * is_pinned_ptr); - -H5_DLL herr_t H5C2_get_evictions_enabled(const H5C2_t * cache_ptr, - hbool_t * evictions_enabled_ptr); - -H5_DLL herr_t H5C2_get_trace_file_ptr(const H5C2_t *cache_ptr, - FILE **trace_file_ptr_ptr); -H5_DLL herr_t H5C2_get_trace_file_ptr_from_entry(const H5C2_cache_entry_t *entry_ptr, - FILE ** trace_file_ptr_ptr); - -H5_DLL herr_t H5C2_insert_entry(H5F_t * f, - hid_t dxpl_id, - const H5C2_class_t * type, - haddr_t addr, - size_t len, - void * thing, - unsigned int flags); - -H5_DLL herr_t H5C2_mark_entries_as_clean(H5F_t * f, - hid_t dxpl_id, - int32_t ce_array_len, - haddr_t * ce_array_ptr); - -H5_DLL herr_t H5C2_mark_pinned_entry_dirty(void * thing, - hbool_t size_changed, - size_t new_size); - -H5_DLL herr_t H5C2_mark_pinned_or_protected_entry_dirty(void * thing); - -H5_DLL herr_t H5C2_rename_entry(H5C2_t * cache_ptr, - const H5C2_class_t * type, - haddr_t old_addr, - haddr_t new_addr); - -H5_DLL herr_t H5C2_pin_protected_entry(void * thing); - -H5_DLL void * H5C2_protect(H5F_t * f, - hid_t dxpl_id, - const H5C2_class_t * type, - haddr_t addr, - size_t len, - void * udata, - unsigned flags); - -H5_DLL herr_t H5C2_reset_cache_hit_rate_stats(H5C2_t * cache_ptr); - -H5_DLL herr_t H5C2_resize_pinned_entry(void * thing, - size_t new_size); - -H5_DLL herr_t H5C2_set_cache_auto_resize_config(H5C2_t * cache_ptr, - H5C2_auto_size_ctl_t *config_ptr); - -H5_DLL herr_t H5C2_set_evictions_enabled(H5C2_t * cache_ptr, - hbool_t evictions_enabled); - -H5_DLL herr_t H5C2_set_prefix(H5C2_t * cache_ptr, char * prefix); - -H5_DLL herr_t H5C2_set_skip_flags(H5C2_t * cache_ptr, - hbool_t skip_file_checks, - hbool_t skip_dxpl_id_checks); - -H5_DLL herr_t H5C2_set_trace_file_ptr(H5C2_t * cache_ptr, - FILE * trace_file_ptr); - -H5_DLL herr_t H5C2_stats(H5C2_t * cache_ptr, - const char * cache_name, - hbool_t display_detailed_stats); - -H5_DLL void H5C2_stats__reset(H5C2_t * cache_ptr); - -H5_DLL herr_t H5C2_unpin_entry(void * thing); - -H5_DLL herr_t H5C2_unprotect(H5F_t * f, - hid_t dxpl_id, - const H5C2_class_t * type, - haddr_t addr, - void * thing, - unsigned int flags, - size_t new_size); - -H5_DLL herr_t H5C2_validate_resize_config(H5C2_auto_size_ctl_t * config_ptr, - unsigned int tests); - - -/**************************************************************************/ -/***************** journaling function definitions proper: ****************/ -/**************************************************************************/ - -H5_DLL herr_t H5C2_begin_journaling(H5F_t * f, - hid_t dxpl_id, - H5C2_t * cache_ptr, - H5C2_mdj_config_t * config_ptr); - -H5_DLL herr_t H5C2_begin_transaction(H5C2_t * cache_ptr, - uint64_t * trans_num_ptr, - const char * api_call_name); - -H5_DLL herr_t H5C2_end_journaling(H5F_t * f, - hid_t dxpl_id, - H5C2_t * cache_ptr); - -H5_DLL herr_t H5C2_end_transaction(H5F_t * f, - hid_t dxpl_id, - H5C2_t * cache_ptr, - uint64_t trans_num, - const char * api_call_name); - -H5_DLL herr_t H5C2_get_journal_config(H5C2_t * cache_ptr, - H5C2_mdj_config_t * config_ptr); - -H5_DLL herr_t H5C2_journal_post_flush(H5F_t * f, - hid_t dxpl_id, - H5C2_t * cache_ptr, - hbool_t cache_is_clean); - -H5_DLL herr_t H5C2_journal_pre_flush(H5C2_t * cache_ptr); - -H5_DLL herr_t H5C2_journal_transaction(H5F_t * f, - hid_t dxpl_id, - H5C2_t * cache_ptr); - -H5_DLL herr_t H5C2_update_for_new_last_trans_on_disk(H5C2_t * cache_ptr, - uint64_t new_last_trans_on_disk); - - -/*****************************************************************************/ -/****************** journal buffer function definitions: *********************/ -/*****************************************************************************/ - -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, - size_t buf_size); - -H5_DLL herr_t H5C2_jb__comment(H5C2_jbrb_t * struct_ptr, - const char * comment_ptr); - -H5_DLL herr_t H5C2_jb__end_transaction(H5C2_jbrb_t * struct_ptr, - uint64_t trans_num); - -H5_DLL herr_t H5C2_jb__eoa(H5C2_jbrb_t * struct_ptr, - haddr_t eoa); - -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(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, - size_t length, - const uint8_t * body); - -H5_DLL 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, - hbool_t human_readable, - size_t sizeof_addr, - size_t sizeof_size); - -H5_DLL herr_t H5C2_jb__start_transaction(H5C2_jbrb_t * struct_ptr, - uint64_t trans_num); - -H5_DLL herr_t H5C2_jb__takedown(H5C2_jbrb_t * struct_ptr); - -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, - size_t size, - const char * data, - hbool_t is_end_trans, - uint64_t trans_num); - -/*****************************************************************************/ -/***** superblock journaling message management function definitions: ********/ -/*****************************************************************************/ - -H5_DLL herr_t H5C2_check_for_journaling(H5F_t * f, - hid_t dxpl_id, - H5C2_t * cache_ptr, - hbool_t journal_recovered); - -H5_DLL herr_t H5C2_mark_journaling_in_progress(H5F_t * f, - hid_t dxpl_id, - const int32_t journal_magic, - const char * journal_file_name_ptr); - -H5_DLL herr_t H5C2_unmark_journaling_in_progress(H5F_t * f, - hid_t dxpl_id, - H5C2_t * cache_ptr); - - -/**************************************************************************/ -/****** metadata journaling status change callback management code ********/ -/**************************************************************************/ - -H5_DLL herr_t H5C2_deregister_mdjsc_callback(H5C2_t * cache_ptr, - int32_t idx); - -H5_DLL herr_t H5C2_register_mdjsc_callback(H5C2_t * cache_ptr, - H5C2_mdj_status_change_func_t fcn_ptr, - void * data_ptr, - int32_t * idx_ptr); - -#endif /* !_H5C2private_H */ - diff --git a/src/H5C2public.h b/src/H5C2public.h deleted file mode 100644 index d293ccb..0000000 --- a/src/H5C2public.h +++ /dev/null @@ -1,62 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * Copyright by the Board of Trustees of the University of Illinois. * - * All rights reserved. * - * * - * This file is part of HDF5. The full HDF5 copyright notice, including * - * terms governing use, modification, and redistribution, is contained in * - * the files COPYING and Copyright.html. COPYING can be found at the root * - * of the source code distribution tree; Copyright.html can be found at the * - * root level of an installed copy of the electronic HDF5 document set and * - * is linked from the top-level documents page. It can also be found at * - * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * - * access to either file, you may request a copy from help@hdfgroup.org. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/*------------------------------------------------------------------------- - * - * Created: H5C2public.h - * June 4, 2005 - * John Mainzer - * - * Purpose: Public include file for cache functions. - * - * Modifications: - * - *------------------------------------------------------------------------- - */ -#ifndef _H5C2public_H -#define _H5C2public_H - -/* Public headers needed by this file */ -#include "H5public.h" - -#ifdef __cplusplus -extern "C" { -#endif - -enum H5C2_cache_incr_mode -{ - H5C2_incr__off, - H5C2_incr__threshold -}; - -enum H5C2_cache_flash_incr_mode -{ - H5C2_flash_incr__off, - H5C2_flash_incr__add_space -}; - - -enum H5C2_cache_decr_mode -{ - H5C2_decr__off, - H5C2_decr__threshold, - H5C2_decr__age_out, - H5C2_decr__age_out_with_threshold -}; - -#ifdef __cplusplus -} -#endif -#endif diff --git a/src/H5Cjournal.c b/src/H5Cjournal.c new file mode 100644 index 0000000..028f485 --- /dev/null +++ b/src/H5Cjournal.c @@ -0,0 +1,8835 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * Copyright by the Board of Trustees of the University of Illinois. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/*------------------------------------------------------------------------- + * + * Created: H5Cjournal.c + * Dec 6 2007 + * John Mainzer + * + * 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 + * 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. + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +#define H5F_PACKAGE /* suppress error about including H5Fpkg */ +#define H5C_PACKAGE /* suppress error about including H5Cpkg */ + +#include "H5private.h" /* Generic Functions */ +#include "H5Cpkg.h" /* Cache */ +#include "H5Eprivate.h" /* Error handling */ +#include "H5Fpkg.h" /* File access */ +#include "H5MFprivate.h" /* File memory management */ +#include "H5MMprivate.h" /* Memory management */ +#include "H5Pprivate.h" /* Property lists */ + +/**************************************************************************/ +/***************************** global variables ***************************/ +/**************************************************************************/ + +/* In the test code, it is sometimes useful to skip the check for journaling + * in progress on open. The check_for_journaling global is used to support + * this. Note that we can't tuck this variable into H5C_t, as the test + * takes place before H5Fopen() returns. + */ + +hbool_t H5C__check_for_journaling = TRUE; + +/**************************************************************************/ +/******************************* local macros *****************************/ +/**************************************************************************/ +#define H5C__TRANS_NUM_SIZE 8 +#define H5C__CHECKSUM_SIZE 4 + +/**************************************************************************/ +/***************************** local prototypes ***************************/ +/**************************************************************************/ + +static herr_t H5C_call_mdjsc_callbacks(H5C_t * cache_ptr, + hid_t dxpl_id, + H5C_mdj_config_t * config_ptr); + +static herr_t H5C_get_journaling_in_progress(const H5F_t * f, + H5C_t * cache_ptr); + +static herr_t H5C_grow_mdjsc_callback_table(H5C_t * cache_ptr); + +static herr_t H5C_jb_aio__await_buffer_write_completion( + H5C_jbrb_t * struct_ptr, + int buf_num); + +static herr_t H5C_jb_aio__await_async_fsync_completion( + H5C_jbrb_t * struct_ptr); + +static herr_t H5C_jb_aio__flush(H5C_jbrb_t * struct_ptr); + +static herr_t H5C_jb_aio__get_last_transaction_on_disk( + H5C_jbrb_t * struct_ptr, + uint64_t * trans_num_ptr); + +static herr_t H5C_jb_aio__make_space_in_ring_buffer(H5C_jbrb_t * struct_ptr); + +static herr_t H5C_jb_aio__note_completed_async_buffer_writes( + H5C_jbrb_t * struct_ptr); + +static herr_t H5C_jb_aio__note_completed_async_fsyncs( + H5C_jbrb_t * struct_ptr); + +static herr_t H5C_jb_aio__prep_next_buf_for_use(H5C_jbrb_t * struct_ptr, + uint64_t last_trans_in_ring_buffer); + +static herr_t H5C_jb_aio__queue_async_fsync(H5C_jbrb_t * struct_ptr); + +static herr_t H5C_jb_aio__queue_buffer_write(H5C_jbrb_t * struct_ptr, + int buf_num, + hbool_t partial_write_ok); + +static herr_t H5C_jb_aio__sync_file(H5C_jbrb_t * struct_ptr); + +static herr_t H5C_jb_aio__sync_q__append(H5C_jbrb_t * struct_ptr, + struct H5C_jbrb_sync_q_entry_t * entry_ptr); + +static herr_t H5C_jb_aio__sync_q__discard_head(H5C_jbrb_t * struct_ptr); + +static herr_t H5C_jb_aio__test_buffer_write_complete(H5C_jbrb_t * struct_ptr, + int buf_num, + hbool_t *complete_ptr); + +static herr_t H5C_jb_aio__test_next_async_fsync_complete( + H5C_jbrb_t * struct_ptr, + hbool_t *sync_complete_ptr); + +herr_t H5C_jb_aio__write_to_buffer(H5C_jbrb_t * struct_ptr, + size_t size, + const char * data, + hbool_t is_end_trans, + uint64_t trans_num); + +static herr_t H5C_jb_bjf__comment(H5C_jbrb_t * struct_ptr, + const char * comment_ptr); + +static herr_t H5C_jb_bjf__end_transaction(H5C_jbrb_t * struct_ptr, + uint64_t trans_num); + +static herr_t H5C_jb_bjf__eoa(H5C_jbrb_t * struct_ptr, + haddr_t eoa); + +static herr_t H5C_jb_bjf__journal_entry(H5C_jbrb_t * struct_ptr, + uint64_t trans_num, + haddr_t base_addr, + size_t length, + const uint8_t * body); + +static herr_t H5C_jb_bjf__start_transaction(H5C_jbrb_t * struct_ptr, + uint64_t trans_num); + +static herr_t H5C_jb_bjf__write_buffer(H5C_jbrb_t * struct_ptr, + size_t buf_size, + const char * buf_ptr, + hbool_t is_end_trans, + uint64_t trans_num); + +static herr_t H5C_jb_bjf__write_chksum(H5C_jbrb_t * struct_ptr, + hbool_t is_end_trans, + uint64_t trans_num); + +static herr_t H5C_jb_bjf__write_length(H5C_jbrb_t * struct_ptr, + size_t length, + hbool_t is_end_trans, + uint64_t trans_num); + +static herr_t H5C_jb_bjf__write_offset(H5C_jbrb_t * struct_ptr, + haddr_t offset, + hbool_t is_end_trans, + uint64_t trans_num); + +static herr_t H5C_jb_bjf__write_sig_and_ver(H5C_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 H5C_jb_bjf__write_trans_num(H5C_jbrb_t * struct_ptr, + hbool_t is_end_trans, + uint64_t trans_num); + +static herr_t H5C_jb_hrjf__comment(H5C_jbrb_t * struct_ptr, + const char * comment_ptr); + +static herr_t H5C_jb_hrjf__end_transaction(H5C_jbrb_t * struct_ptr, + uint64_t trans_num); + +static herr_t H5C_jb_hrjf__eoa(H5C_jbrb_t * struct_ptr, + haddr_t eoa); + +static herr_t H5C_jb_hrjf__journal_entry(H5C_jbrb_t * struct_ptr, + uint64_t trans_num, + haddr_t base_addr, + size_t length, + const uint8_t * body); + +static herr_t H5C_jb_sio__flush(H5C_jbrb_t * struct_ptr); + +static herr_t H5C_jb_sio__flush_full_buffers(H5C_jbrb_t * struct_ptr); + +static herr_t H5C_jb_sio__get_last_transaction_on_disk( + H5C_jbrb_t * struct_ptr, + uint64_t * trans_num_ptr); + +static herr_t H5C_jb_sio__write_to_buffer(H5C_jbrb_t * struct_ptr, + size_t size, + const char * data, + hbool_t is_end_trans, + uint64_t trans_num); + +herr_t H5C_jb_stats__dump(H5C_jbrb_t * struct_ptr); + +herr_t H5C_jb_stats__reset(H5C_jbrb_t * struct_ptr); + +static herr_t H5C_shrink_mdjsc_callback_table(H5C_t * cache_ptr); + + + +/**************************************************************************/ +/************************* journaling code proper *************************/ +/**************************************************************************/ + +/*------------------------------------------------------------------------- + * Function: H5C_begin_journaling + * + * Purpose: Setup the metadata cache to begin journaling. + * + * Return: Success: SUCCEED + * Failure: FAIL + * + * Programmer: John Mainzer + * March 26, 2008 + * + * Changes: JRM -- 8/14/08 + * Reworked the function to use the H5C_mdj_config_t + * structure. + * + * JRM -- 8/18/08 + * 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. + * + * 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. + * + *------------------------------------------------------------------------- + */ + +herr_t +H5C_begin_journaling(H5F_t * f, + hid_t dxpl_id, + H5C_t * cache_ptr, + H5C_mdj_config_t * config_ptr) +{ + herr_t result; + herr_t ret_value = SUCCEED; /* Return value */ + int32_t journal_magic; + H5C_mdj_config_t config; + + FUNC_ENTER_NOAPI(H5C_begin_journaling, FAIL) + + HDassert( f != NULL ); + HDassert( f->name != NULL ); + HDassert( f->shared != NULL ); + HDassert( f->shared->sizeof_addr > 0 ); + HDassert( f->shared->sizeof_size > 0 ); + HDassert( cache_ptr != NULL ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + HDassert( cache_ptr->mdj_enabled == FALSE ); + HDassert( cache_ptr->trans_in_progress == FALSE ); + HDassert( cache_ptr->trans_num == 0 ); + HDassert( cache_ptr->last_trans_on_disk == 0 ); + HDassert( cache_ptr->tl_len == 0 ); + HDassert( cache_ptr->tl_size == 0 ); + HDassert( cache_ptr->tl_head_ptr == NULL ); + HDassert( cache_ptr->tl_tail_ptr == NULL ); + HDassert( cache_ptr->jwipl_len == 0 ); + HDassert( cache_ptr->jwipl_size == 0 ); + HDassert( cache_ptr->jwipl_head_ptr == NULL ); + HDassert( cache_ptr->jwipl_tail_ptr == NULL ); + HDassert( config_ptr != NULL ); + HDassert( config_ptr->jbrb_buf_size > 0 ); + HDassert( config_ptr->jbrb_num_bufs > 0 ); + HDassert( HDstrlen(config_ptr->journal_file_path) > 0 ); + + if ( cache_ptr->mdj_enabled ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "metadata journaling already enabled on entry.") + } + + result = H5C_flush_cache(f, dxpl_id, H5C__NO_FLAGS_SET); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_flush_cache() failed.") + } + + journal_magic = (int32_t)HDrand(); + + result = H5C_jb__init(&(cache_ptr->mdj_jbrb), + journal_magic, + f->name, + config_ptr->journal_file_path, + config_ptr->jbrb_buf_size, + config_ptr->jbrb_num_bufs, + config_ptr->jbrb_use_aio, + config_ptr->jbrb_human_readable, + f->shared->sizeof_addr, + f->shared->sizeof_size); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_jb__init() failed.") + } + + /* Note that this call flushes the HDF5 file in passing */ + result = H5C_mark_journaling_in_progress(f, dxpl_id, journal_magic, + config_ptr->journal_file_path); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_mark_journaling_in_progress() failed.") + } + + cache_ptr->mdj_enabled = TRUE; + + result = H5C_get_journal_config(cache_ptr, &config); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_get_journal_config() failed.") + } + + result = H5C_call_mdjsc_callbacks(cache_ptr, dxpl_id, &config); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_call_mdjsc_callbacks() failed.") + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_begin_journaling() */ + + +/*------------------------------------------------------------------------- + * Function: H5C_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: Success: SUCCEED + * Failure: FAIL + * + * Programmer: John Mainzer + * March 18, 2008 + * + *------------------------------------------------------------------------- + */ + +herr_t +H5C_begin_transaction(H5C_t * cache_ptr, + uint64_t * trans_num_ptr, + const char * api_call_name) +{ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5C_begin_transaction, FAIL) + + HDassert( cache_ptr != NULL ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + HDassert( cache_ptr->tl_len == 0 ); + HDassert( cache_ptr->tl_size == 0 ); + HDassert( cache_ptr->tl_head_ptr == NULL ); + HDassert( cache_ptr->tl_tail_ptr == NULL ); + HDassert( trans_num_ptr != NULL ); + HDassert( api_call_name != NULL ); + HDassert( HDstrlen(api_call_name) <= H5C__MAX_API_NAME_LEN ); + + if ( cache_ptr->mdj_enabled ) { + + if ( cache_ptr->trans_in_progress ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "transaction already in progress?.") + } + + HDstrncpy(cache_ptr->trans_api_name, api_call_name, + (size_t)H5C__MAX_API_NAME_LEN); + + (cache_ptr->trans_num)++; + + *trans_num_ptr = cache_ptr->trans_num; + + cache_ptr->trans_in_progress = TRUE; + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_begin_transaction() */ + + +/*------------------------------------------------------------------------- + * Function: H5C_end_journaling + * + * Purpose: Shutdown metadata journaling. + * + * To do this we must: + * + * 1) Flush the cache. This will also flush and truncate the + * journal file. + * + * 2) Mark the superblock to indicate that we are no longer + * journaling. Note that this will flush the HDF5 file + * again in passing. + * + * 3) Tell the journal file write code to shutdown. This will + * also cause the journal file to be deleted. + * + * Return: Success: SUCCEED + * Failure: FAIL + * + * Programmer: John Mainzer + * April 12, 2008 + * + * Changes: Added code to call the metadata journaling status change + * callback function. + * JR -- 8/18/08 + * + *------------------------------------------------------------------------- + */ + +herr_t +H5C_end_journaling(H5F_t * f, + hid_t dxpl_id, + H5C_t * cache_ptr) +{ + herr_t result; + herr_t ret_value = SUCCEED; /* Return value */ + H5C_mdj_config_t config; + + FUNC_ENTER_NOAPI(H5C_end_journaling, FAIL) + + HDassert( f != NULL ); + HDassert( cache_ptr != NULL ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + + if ( cache_ptr->mdj_enabled ) { + + HDassert( cache_ptr->mdj_enabled ); + HDassert( cache_ptr->trans_in_progress == FALSE ); + HDassert( cache_ptr->tl_len == 0 ); + HDassert( cache_ptr->tl_size == 0 ); + HDassert( cache_ptr->tl_head_ptr == NULL ); + HDassert( cache_ptr->tl_tail_ptr == NULL ); + + result = H5C_flush_cache(f, dxpl_id, H5C__NO_FLAGS_SET); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_flush_cache() failed.") + } + + HDassert( cache_ptr->mdj_enabled ); + + /* Turn off journaling now, before attempting to modify the superblock + * extension (which is really an object header) and having the + * object header code call into the cache, which gets confused + * because there's no transaction in progress. -QAK + */ + cache_ptr->mdj_enabled = FALSE; + + /* Remove the journal configuration information from the superblock + * extension. In passing, also discard the cache's copies of the + * metadata journaling magic, and the journal file name. + */ + result = H5C_unmark_journaling_in_progress(f, dxpl_id, cache_ptr); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_unmark_journaling_in_progress() failed.") + } + + result = H5C_jb__takedown(&(cache_ptr->mdj_jbrb)); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_jb__takedown() failed.") + } + + result = H5C_get_journal_config(cache_ptr, &config); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_get_journal_config() failed.") + } + + result = H5C_call_mdjsc_callbacks(cache_ptr, dxpl_id, &config); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_call_mdjsc_callbacks() failed.") + } + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_end_journaling() */ + + + +/*------------------------------------------------------------------------- + * Function: H5C_end_transaction + * + * Purpose: Handle book keeping for the end of a transaction. + * + * Return: Success: SUCCEED + * Failure: FAIL + * + * Programmer: John Mainzer + * March 18, 2008 + * + *------------------------------------------------------------------------- + */ + +herr_t +H5C_end_transaction(H5F_t * f, + hid_t dxpl_id, + H5C_t * cache_ptr, + uint64_t trans_num, + const char * api_call_name) +{ + uint64_t new_last_trans_on_disk = 0; + herr_t result; + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5C_end_transaction, FAIL) + + HDassert( cache_ptr != NULL ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + HDassert( api_call_name != NULL ); + HDassert( HDstrlen(api_call_name) <= H5C__MAX_API_NAME_LEN ); + HDassert( ( ! ( cache_ptr->mdj_enabled ) ) || + ( HDstrcmp(api_call_name, cache_ptr->trans_api_name) == 0 ) ); + + if ( cache_ptr->mdj_enabled ) { + + if ( ! ( cache_ptr->trans_in_progress ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "transaction not in progress?!?!") + } + + if ( cache_ptr->trans_num != trans_num ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "trans_num mis-match?!?!") + } + + /* if the transaction list is not empty, generate journal messages, + * and remove all entries from the transaction list. + */ + if ( cache_ptr->tl_len > 0 ) { + + result = H5C_journal_transaction(f, dxpl_id, cache_ptr); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_journal_transaction() failed.") + } + } + + cache_ptr->trans_in_progress = FALSE; + + /* Get the last transaction on disk. If it has changed, remove + * all entries with completed journal writes from the journal write + * in progress list. + */ + + result = H5C_jb__get_last_transaction_on_disk(&(cache_ptr->mdj_jbrb), + &new_last_trans_on_disk); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_jb__get_last_transaction_on_disk() failed.") + } + + if ( cache_ptr->last_trans_on_disk < new_last_trans_on_disk ) { + + result = H5C_update_for_new_last_trans_on_disk(cache_ptr, + new_last_trans_on_disk); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_update_for_new_last_trans_on_disk() failed.") + } + } + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_end_transaction() */ + + +/*------------------------------------------------------------------------- + * Function: H5C_get_journal_config + * + * Purpose: Return the current metadata journaling status in an + * instance of H5C_mdj_config_t. + * + * 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 + * + * Programmer: John Mainzer + * April 13, 2008 + * + * Changes: + * + * JRM -- 8/14/08 + * Reworked function to use H5C_mdj_config_t. + * + *------------------------------------------------------------------------- + */ + +herr_t +H5C_get_journal_config(H5C_t * cache_ptr, + H5C_mdj_config_t * config_ptr) +{ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5C_get_journal_config, FAIL) + + HDassert( cache_ptr != NULL ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + + if ( config_ptr == NULL ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "config_ptr NULL on entry!?!.") + } + + if ( cache_ptr->mdj_enabled ) { + + config_ptr->enable_journaling = TRUE; + + HDstrncpy(&(config_ptr->journal_file_path[0]), + cache_ptr->jnl_file_name, + H5C__MAX_JOURNAL_FILE_NAME_LEN); + + config_ptr->journal_file_path[H5C__MAX_JOURNAL_FILE_NAME_LEN] = '\0'; + + config_ptr->jbrb_buf_size = (cache_ptr->mdj_jbrb).buf_size; + + config_ptr->jbrb_num_bufs = (cache_ptr->mdj_jbrb).num_bufs; + + 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; + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_get_journal_config() */ + + +/*------------------------------------------------------------------------- + * Function: H5C_journal_post_flush() + * + * Purpose: Handle any journaling activities that are necessary + * after we flush the metadata cache. + * + * At present this means: + * + * 1) Verify that a transaction is still not in progress. + * + * 2) Verify that the journal write in progress list + * is still empty. + * + * 3) If the cache_is_clean parameter is true: + * + * a) Flush the HDF5 file + * + * b) Truncate the journal file + * + * c) Reset cache_ptr->trans_num and + * cache_ptr->last_trans_on_disk to zero. + * + * Return: Success: SUCCEED + * Failure: FAIL + * + * Programmer: John Mainzer + * April 10, 2008 + * + *------------------------------------------------------------------------- + */ + +herr_t +H5C_journal_post_flush(H5F_t * f, + hid_t dxpl_id, + H5C_t * cache_ptr, + hbool_t cache_is_clean) +{ + herr_t result; + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5C_journal_post_flush, FAIL) + + HDassert( f != NULL ); + HDassert( cache_ptr != NULL ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + HDassert( cache_ptr->mdj_enabled ); + + if ( cache_ptr->trans_in_progress ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "Transaction in progress during flush?!?!?.") + } + + if ( cache_ptr->jwipl_len != 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "journal write in progress list isn't empty?!?!.") + } + + if ( cache_is_clean ) { + + /* Write the superblock to disk */ + + result = H5F_super_write(f, dxpl_id); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_WRITEERROR, FAIL, \ + "unable to write superblock to file") + } + + result = H5FD_flush(f->shared->lf, dxpl_id, (unsigned)0); + + if ( result > 0 ) { + + HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, \ + "low level flush failed") + } + + result = H5C_jb__trunc(&(cache_ptr->mdj_jbrb)); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_jb__trunc() failed.") + } + + cache_ptr->trans_num = (uint64_t)0; + cache_ptr->last_trans_on_disk = (uint64_t)0; + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_journal_post_flush() */ + + +/*------------------------------------------------------------------------- + * Function: H5C_journal_pre_flush() + * + * Purpose: Handle any journaling activities that are necessary + * before we flush the metadata cache. + * + * At present this means: + * + * 1) Verify that a transaction is not in progress. + * + * 2) Flush the journal to disk. + * + * 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 + * 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 + * + * Programmer: John Mainzer + * April 10, 2008 + * + *------------------------------------------------------------------------- + */ + +herr_t +H5C_journal_pre_flush(H5C_t * cache_ptr) +{ + herr_t result; + uint64_t new_last_trans_on_disk; + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5C_journal_pre_flush, FAIL) + + HDassert( cache_ptr != NULL ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + HDassert( cache_ptr->mdj_enabled ); + + if ( cache_ptr->trans_in_progress ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "Transaction in progress during flush?!?!?.") + } + + result = H5C_jb__flush(&(cache_ptr->mdj_jbrb)); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_jb__flush() failed.") + } + + result = H5C_jb__get_last_transaction_on_disk(&(cache_ptr->mdj_jbrb), + &new_last_trans_on_disk); + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_jb__get_last_transaction_on_disk() failed.") + } + + if ( cache_ptr->last_trans_on_disk < new_last_trans_on_disk ) { + + result = H5C_update_for_new_last_trans_on_disk(cache_ptr, + new_last_trans_on_disk); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_update_for_new_last_trans_on_disk() failed.") + } + } + + if ( cache_ptr->jwipl_len != 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "journal write in progress list isn't empty?!?!.") + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_journal_pre_flush() */ + + +/*------------------------------------------------------------------------- + * Function: H5C_journal_transaction() + * + * Purpose: Generate journal messages for the current transaction. + * In passing, remove all entries from the transaction list. + * + * Return: Success: SUCCEED + * Failure: FAIL + * + * Programmer: John Mainzer + * April 3, 2008 + * + *------------------------------------------------------------------------- + */ + +herr_t +H5C_journal_transaction(H5F_t * f, + hid_t dxpl_id, + H5C_t * cache_ptr) + +{ + char buf[H5C__MAX_API_NAME_LEN + 128]; + hbool_t resized; + hbool_t renamed; + H5C_cache_entry_t * entry_ptr = NULL; + unsigned serialize_flags = 0; + haddr_t new_addr; + size_t new_len; + void * new_image_ptr; + void * thing; + herr_t result; + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5C_journal_transaction, FAIL) + + HDassert( f != NULL ); + HDassert( cache_ptr != NULL ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + HDassert( cache_ptr->trans_in_progress ); + HDassert( cache_ptr->tl_len > 0 ); + + HDsnprintf(buf, H5C__MAX_API_NAME_LEN + 128, "Begin transaction on %s.", + cache_ptr->trans_api_name); + + result = H5C_jb__comment(&(cache_ptr->mdj_jbrb), buf); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_jb__comment() failed.") + } + + result = H5C_jb__start_transaction(&(cache_ptr->mdj_jbrb), + cache_ptr->trans_num); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_jb__start_transaction() failed.") + } + + entry_ptr = cache_ptr->tl_tail_ptr; + while ( entry_ptr != NULL ) + { + HDassert( entry_ptr->is_dirty ); + HDassert( entry_ptr->last_trans == cache_ptr->trans_num ); + + resized = FALSE; + renamed = FALSE; + + if ( entry_ptr->is_protected ) + { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "Protected entry in TL at transaction close.") + } + + if ( entry_ptr->image_ptr == NULL ) + { + entry_ptr->image_ptr = H5MM_malloc(entry_ptr->size); + + if ( entry_ptr->image_ptr == NULL ) + { + + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \ + "memory allocation failed for on disk image buffer.") + } + } + + /* 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). + */ + if ( ! ( entry_ptr->image_up_to_date ) ) { + + result = entry_ptr->type->serialize(f, + dxpl_id, + entry_ptr->addr, + entry_ptr->size, + entry_ptr->image_ptr, + (void *)entry_ptr, + &serialize_flags, + &new_addr, + &new_len, + &new_image_ptr); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "unable to serialize entry") + } + + if ( serialize_flags != 0 ) { + + /* 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 + * handle it later. + */ + + resized = + (hbool_t)((serialize_flags & H5C__SERIALIZE_RESIZED_FLAG) != 0); + renamed = + (hbool_t)((serialize_flags & H5C__SERIALIZE_RENAMED_FLAG) != 0); + + if ( ( renamed ) && ( ! resized ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "entry renamed but not resized?!?!") + } + + if ( resized ) + { + /* in the following protect/unprotect, the dxpl_id + * is irrelement, as we know that the entry is in cache, + * and thus no I/O will take place. + */ + thing = H5C_protect(f, dxpl_id, + entry_ptr->type, entry_ptr->addr, + entry_ptr->size, NULL, + H5C__NO_FLAGS_SET); + + if ( thing == NULL ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_protect() failed.") + } + + result = H5C_unprotect(f, dxpl_id, + entry_ptr->type, entry_ptr->addr, + thing, H5C__SIZE_CHANGED_FLAG, + new_len); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_unprotect() failed.") + } + + entry_ptr->image_ptr = new_image_ptr; + } + + if ( renamed ) { + + result = H5C_rename_entry(cache_ptr, entry_ptr->type, + entry_ptr->addr, new_addr); + + if ( result < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_rename_entr() failed.") + } + } + } + + entry_ptr->image_up_to_date = TRUE; + } + + /* if the entry hasn't been either resized or renamed, generate + * the journal entry, & remove from the transaction list. + */ + if ( ( ! resized ) && ( ! renamed ) ) { + + result = H5C_jb__journal_entry(&(cache_ptr->mdj_jbrb), + cache_ptr->trans_num, + entry_ptr->addr, + entry_ptr->size, + (uint8_t *)(entry_ptr->image_ptr)); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_jb__journal_entry() failed.") + } + + H5C__TRANS_DLL_REMOVE(entry_ptr, cache_ptr->tl_head_ptr, \ + cache_ptr->tl_tail_ptr, cache_ptr->tl_len, \ + cache_ptr->tl_size, FAIL); + } + entry_ptr = cache_ptr->tl_tail_ptr; + } + + result = H5C_jb__end_transaction(&(cache_ptr->mdj_jbrb), + cache_ptr->trans_num); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_jb__end_transaction() failed.") + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_journal_transaction() */ + + +/*------------------------------------------------------------------------- + * Function: H5C_update_for_new_last_trans_on_disk() + * + * 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 + * *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 + * these entries from the journal write in progress list, + * set their last_trans fields to zero, and insert then into + * the eviction policy data structures. + * + * Similarly, scan the pinned entry list for entries whose + * 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 + * ceases to be the case, we will have re-visit this case. + * + * Return: Success: SUCCEED + * Failure: FAIL + * + * Programmer: John Mainzer + * April 3, 2008 + * + *------------------------------------------------------------------------- + */ + +herr_t +H5C_update_for_new_last_trans_on_disk(H5C_t * cache_ptr, + uint64_t new_last_trans_on_disk) +{ + H5C_cache_entry_t * entry_ptr = NULL; + H5C_cache_entry_t * prev_entry_ptr = NULL; + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5C_update_for_new_last_trans_on_disk, FAIL) + + HDassert( cache_ptr != NULL ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + HDassert( cache_ptr->mdj_enabled ); + HDassert( cache_ptr->last_trans_on_disk <= new_last_trans_on_disk ); + + if ( cache_ptr->last_trans_on_disk < new_last_trans_on_disk ) { + + cache_ptr->last_trans_on_disk = new_last_trans_on_disk; + + entry_ptr = cache_ptr->jwipl_tail_ptr; + + while ( entry_ptr != NULL ) + { + prev_entry_ptr = entry_ptr->prev; + + HDassert( entry_ptr->last_trans > 0 ); + HDassert( entry_ptr->is_dirty ); + + if ( entry_ptr->last_trans <= cache_ptr->last_trans_on_disk ) { + + entry_ptr->last_trans = 0; + H5C__UPDATE_RP_FOR_JOURNAL_WRITE_COMPLETE(cache_ptr, \ + entry_ptr, \ + FAIL) + } + + entry_ptr = prev_entry_ptr; + } + + /* now scan the pinned entry list */ + + entry_ptr = cache_ptr->pel_head_ptr; + + while ( entry_ptr != NULL ) { + + if ( entry_ptr->last_trans > 0 ) { + + HDassert( entry_ptr->is_dirty ); + + if ( entry_ptr->last_trans <= cache_ptr->last_trans_on_disk ) { + + entry_ptr->last_trans = 0; + } + } + entry_ptr = entry_ptr->next; + } + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_update_for_new_last_trans_on_disk() */ + + +/**************************************************************************/ +/************* superblock journaling message management code **************/ +/**************************************************************************/ + +/*------------------------------------------------------------------------- + * Function: H5C_check_for_journaling() + * + * 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 + * 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 + * superblock extension. + * + * JRM -- 3/26/08 + * + * Return: Success: SUCCEED + * Failure: FAIL + * + * Programmer: John Mainzer + * March 26, 2008 + * + *------------------------------------------------------------------------- + */ + +herr_t +H5C_check_for_journaling(H5F_t * f, + hid_t dxpl_id, + H5C_t * cache_ptr, + hbool_t journal_recovered) +{ + const char * l0 = + "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 = + "journal recovery tool on this file. The journal was written \n"; + const char * l3 = "to \""; + const char * l4 = "\".\n"; + herr_t result; + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5C_check_for_journaling, FAIL) + + HDassert( f ); + HDassert( cache_ptr ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + HDassert( cache_ptr->jnl_magic == 0 ); + HDassert( cache_ptr->jnl_file_name_len == 0 ); + + if ( H5C__check_for_journaling ) { + + result = H5C_get_journaling_in_progress(f, cache_ptr); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_get_journaling_in_progress() failed.") + } + + if ( cache_ptr->jnl_file_name_len > 0 ) { /* journaling was in */ + /* progress */ + + if ( journal_recovered ) { + + /* Just forget that we were journaling. Do this by + * deleting the superblock extension message that says + * we were. + */ + + result = H5C_unmark_journaling_in_progress(f, + dxpl_id, + cache_ptr); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_unmark_journaling_in_progress() failed.") + } + } 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() + * 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, + cache_ptr->jnl_file_name, l4); + (void)H5E_dump_api_stack((int)H5_IS_API(FUNC)); + HGOTO_DONE(FAIL) + + } + } + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_check_for_journaling() */ + + +/*------------------------------------------------------------------------- + * Function: H5C_get_journaling_in_progress() + * + * Purpose: Query the HDF5 file to see if it is marked as having + * journaling in progress. Update the journaling + * configuration fields in the cache structure accordingly. + * + * At least initially, the purpose of this function is + * to examine a newly opened HDF5 file, and determine + * whether journaling was enabled. If so, we can presume + * that the application crashed while journaling, and that + * we must refuse to open the file until the user runs the + * recovery utility on it. + * + * Hwever, this logic will be handled at a higher level. + * In this function, we just get the journaling configuration + * (if any) that has been saved in the file, and load it + * into *cache_ptr. + * + * Note that this function assumes that *cache_ptr has + * no journaling configuration set before the function + * is called. + * + * Return: Success: SUCCEED + * Failure: FAIL + * + * Programmer: John Mainzer + * 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 + * the metadata journaling superblock extension message. + * Note that the journaling configuration block no longer + * exists. + * + *------------------------------------------------------------------------- + */ + +herr_t +H5C_get_journaling_in_progress(const H5F_t * f, + H5C_t * cache_ptr) +{ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI_NOINIT(H5C_get_journaling_in_progress) + + HDassert( f ); + HDassert( f->shared != NULL ); + HDassert( cache_ptr ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + HDassert( cache_ptr->jnl_file_name_len == 0 ); + + if ( f->shared->mdc_jnl_enabled == TRUE ) { + + if ( f->shared->mdc_jnl_file_name_len <= 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "journaling enabled but jnl file name empty?!?.") + } + + if ( f->shared->mdc_jnl_file_name_len > + H5C__MAX_JOURNAL_FILE_NAME_LEN ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "journal file name too long?!?.") + } + + cache_ptr->jnl_magic = f->shared->mdc_jnl_magic; + 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) != + (size_t)(cache_ptr->jnl_file_name_len) ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "bad jnl file name or name len?!?.") + } + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_get_journaling_in_progress() */ + + +/*------------------------------------------------------------------------- + * Function: H5C_mark_journaling_in_progress() + * + * 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 + * close the file properly. + * + * Note that the function assumes that the file is not + * currently marked as having journaling in progress. + * + * Return: Success: SUCCEED + * Failure: FAIL + * + * Programmer: John Mainzer + * March 11, 2008 + * + * Changes: JRM -- 2/10/09 + * Added the journal_magic parameter and related code. + * + * JRM -- 2/20/09 + * Reworked function to reflect the move of the journal + * file name and magic to the super block extension message + * and out of the metadata journaling configuration block + * which no longer exists. + * + *------------------------------------------------------------------------- + */ + +herr_t +H5C_mark_journaling_in_progress(H5F_t * f, + hid_t dxpl_id, + const int32_t journal_magic, + const char * journal_file_name_ptr) +{ + H5C_t * cache_ptr; + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5C_mark_journaling_in_progress, FAIL) + + HDassert( f != NULL ); + HDassert( f->shared != NULL ); + HDassert( ! f->shared->mdc_jnl_enabled ); + + cache_ptr = f->shared->cache; + + HDassert( cache_ptr ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + HDassert( cache_ptr->jnl_file_name_len == 0 ); + HDassert( journal_file_name_ptr != NULL ); + + /* Can't journal a read only file, so verify that we are + * opened read/write and fail if we are not. + */ + if ( (f->shared->flags & H5F_ACC_RDWR) == 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "File is opened read only.") + } + + cache_ptr->jnl_magic = journal_magic; + cache_ptr->jnl_file_name_len = (int32_t)HDstrlen(journal_file_name_ptr); + + if ( cache_ptr->jnl_file_name_len <= 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "length of journal file name is zero.") + } + + if ( cache_ptr->jnl_file_name_len > H5C__MAX_JOURNAL_FILE_NAME_LEN ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "journal file name too long.") + } + + HDstrncpy(cache_ptr->jnl_file_name, + journal_file_name_ptr, + (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. + */ + f->shared->mdc_jnl_enabled = TRUE; + f->shared->mdc_jnl_magic = journal_magic; + f->shared->mdc_jnl_file_name_len = (size_t)(cache_ptr->jnl_file_name_len); + HDstrncpy(f->shared->mdc_jnl_file_name, + journal_file_name_ptr, + (size_t)(cache_ptr->jnl_file_name_len + 1)); + + if ( H5F_super_write_mdj_msg(f, dxpl_id) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5F_super_write_mdj_msg() failed.") + } + + /* Finally, flush the file to ensure that changes made it to disk. */ + + if ( H5F_flush(f, dxpl_id, H5F_SCOPE_GLOBAL, H5F_FLUSH_NONE) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, "H5F_flush() failed.") + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_mark_journaling_in_progress() */ + + +/*------------------------------------------------------------------------- + * Function: H5C_unmark_journaling_in_progress() + * + * 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 + * journaling. Once these messages are removed, we will + * be able to open the file without triggering a "journaling + * in progress" failure. + * + * Note that the function assumes that the file is + * currently marked as having journaling in progress. + * + * Return: Success: SUCCEED + * Failure: FAIL + * + * Programmer: John Mainzer + * March 11, 2008 + * + * Changes: JRM -- 2/20/09 + * 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 + * exists. + * + *------------------------------------------------------------------------- + */ + +herr_t +H5C_unmark_journaling_in_progress(H5F_t * f, + hid_t dxpl_id, +#ifndef NDEBUG + H5C_t * cache_ptr) +#else /* NDEBUG */ + H5C_t UNUSED * cache_ptr) +#endif /* NDEBUG */ +{ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5C_unmark_journaling_in_progress, FAIL) + + HDassert( f != NULL ); + HDassert( f->shared != NULL ); + HDassert( f->shared->mdc_jnl_enabled ); + HDassert( f->shared->cache == cache_ptr ); + HDassert( cache_ptr ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + HDassert( cache_ptr->jnl_file_name_len > 0 ); + + + /* Can't journal a read only file, so verify that we are + * opened read/write and fail if we are not. + */ + if ( (f->shared->flags & H5F_ACC_RDWR) == 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "File is opened read only.") + } + + /* Discard the journal file name and magic in *cache_ptr */ + cache_ptr->jnl_magic = 0; + 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 + * progress, and then call H5F_super_write_mdj_msg() to write + * the changes to disk. + */ + f->shared->mdc_jnl_enabled = FALSE; + f->shared->mdc_jnl_magic = 0; + f->shared->mdc_jnl_file_name_len = 0; + (f->shared->mdc_jnl_file_name)[0] = '\0'; + + if ( H5F_super_write_mdj_msg(f, dxpl_id) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5F_super_write_mdj_msg() failed.") + } + + /* Finally, flush the file to ensure that changes made it to disk. */ + + if ( H5F_flush(f, dxpl_id, H5F_SCOPE_GLOBAL, H5F_FLUSH_NONE) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, "H5F_flush() failed.") + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_unmark_journaling_in_progress() */ + + +/**************************************************************************/ +/****** metadata journaling status change callback management code ********/ +/**************************************************************************/ + +/*------------------------------------------------------------------------- + * Function: H5C_call_mdjsc_callbacks() + * + * Purpose: Call the metadata journaling status change callbacks. + * + * Return: Success: SUCCEED + * Failure: FAIL + * + * Programmer: John Mainzer + * August 15, 2008 + * + *------------------------------------------------------------------------- + */ + +static herr_t +H5C_call_mdjsc_callbacks(H5C_t * cache_ptr, + hid_t dxpl_id, + H5C_mdj_config_t * config_ptr) +{ + herr_t ret_value = SUCCEED; /* Return value */ + int32_t i; + int32_t funcs_called = 0; + H5C_mdj_status_change_func_t func_ptr; + void * data_ptr; + + FUNC_ENTER_NOAPI_NOINIT(H5C_call_mdjsc_callbacks) + + HDassert( cache_ptr != NULL ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + HDassert( cache_ptr->mdjsc_cb_tbl != NULL ); + HDassert( cache_ptr->mdjsc_cb_tbl_len >= H5C__MIN_MDJSC_CB_TBL_LEN ); + 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 ) + || + ( 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 > 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 >= + cache_ptr->mdjsc_cb_tbl_len ) + || + ( cache_ptr->mdjsc_cb_tbl_len < H5C__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_max_idx_in_use != + cache_ptr->mdjsc_cb_tbl_len - 1 ) + ) + ) + || + ( ( cache_ptr->num_mdjsc_cbs < cache_ptr->mdjsc_cb_tbl_len ) + && + ( cache_ptr->mdjsc_cb_tbl_fl_head < 0 ) + ) + ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "mdjsc_cb_tbl corrupt(1)?!?!"); + } + + for ( i = 0; i <= cache_ptr->mdjsc_cb_tbl_max_idx_in_use; i++ ) + { + if ( ((cache_ptr->mdjsc_cb_tbl)[i]).fcn_ptr != NULL ) { + + func_ptr = ((cache_ptr->mdjsc_cb_tbl)[i]).fcn_ptr; + data_ptr = ((cache_ptr->mdjsc_cb_tbl)[i]).data_ptr; + + /* Try the callback */ + if(func_ptr(config_ptr, dxpl_id, data_ptr) < 0) + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "metadata journaling status change callback failed!"); + + funcs_called++; + } + } + + if ( funcs_called != cache_ptr->num_mdjsc_cbs ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "funcs_called != cache_ptr->num_mdjsc_cbs."); + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_call_mdjsc_callbacks() */ + + +/*------------------------------------------------------------------------- + * Function: H5C_deregister_mdjsc_callback() + * + * Purpose: Deregister a metadata journaling status change callback, + * shrinking the metadata journaling status callback table + * as necessary. + * + * Return: Success: SUCCEED + * Failure: FAIL + * + * Programmer: John Mainzer + * August 15, 2008 + * + *------------------------------------------------------------------------- + */ + +herr_t +H5C_deregister_mdjsc_callback(H5C_t * cache_ptr, + int32_t idx) +{ + herr_t ret_value = SUCCEED; /* Return value */ + int32_t i; + double fraction_in_use; + + FUNC_ENTER_NOAPI(H5C_deregister_mdjsc_callback, FAIL) + + if ( ( cache_ptr == NULL ) || + ( cache_ptr->magic != H5C__H5C_T_MAGIC ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "cache_ptr corrupt?!?"); + } + + if ( ( cache_ptr->mdjsc_cb_tbl == NULL ) || + ( ( 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->num_mdjsc_cbs != cache_ptr->mdjsc_cb_tbl_len ) ) || + ( cache_ptr->mdjsc_cb_tbl_len < H5C__MIN_MDJSC_CB_TBL_LEN ) || + ( cache_ptr->mdjsc_cb_tbl_fl_head >= 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->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)?!?!"); + } + + if ( cache_ptr->num_mdjsc_cbs <= 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "mdjsc_cb_tbl empty(1)!?!"); + } + + if ( ( idx < 0 ) || + ( idx >= cache_ptr->mdjsc_cb_tbl_len ) || + ( idx > cache_ptr->mdjsc_cb_tbl_max_idx_in_use ) ) { + + 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_fl_head; + cache_ptr->mdjsc_cb_tbl_fl_head = idx; + (cache_ptr->num_mdjsc_cbs)--; + + if ( cache_ptr->num_mdjsc_cbs == 0 ) { + + cache_ptr->mdjsc_cb_tbl_max_idx_in_use = -1; + + } else if ( idx == cache_ptr->mdjsc_cb_tbl_max_idx_in_use ) { + + i = idx; + + while ( ( i >= 0 ) && + ( ((cache_ptr->mdjsc_cb_tbl)[i]).fcn_ptr == NULL ) ) { + + i--; + } + + if ( i < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "mdjsc_cb_tbl empty(2)!?!"); + } + + cache_ptr->mdjsc_cb_tbl_max_idx_in_use = i; + } + + 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 > 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->mdjsc_cb_tbl_max_idx_in_use != -1 ) + ) + ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "mdjsc_cb_tbl corrupt(2)?!?!"); + } + + fraction_in_use = ((double)(cache_ptr->num_mdjsc_cbs)) / + ((double)(cache_ptr->mdjsc_cb_tbl_len)); + + if ( ( fraction_in_use < H5C__MDJSC_CB_TBL_MIN_ACTIVE_RATIO ) && + ( cache_ptr->mdjsc_cb_tbl_len > H5C__MIN_MDJSC_CB_TBL_LEN ) && + ( cache_ptr->mdjsc_cb_tbl_max_idx_in_use < + (cache_ptr->mdjsc_cb_tbl_len / 2) ) ) { + herr_t result; + + result = H5C_shrink_mdjsc_callback_table(cache_ptr); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_shrink_mdjsc_callback_table() failed."); + } + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_deregister_mdjsc_callback() */ + + +/*------------------------------------------------------------------------- + * Function: H5C_grow_mdjsc_callback_table() + * + * Purpose: Double the size of the the metadata journaling status + * change callback table. Note that the table is assumed + * to be full on entry. + * + * Return: Success: SUCCEED + * Failure: FAIL + * + * Programmer: John Mainzer + * August 15, 2008 + * + *------------------------------------------------------------------------- + */ + +static herr_t +H5C_grow_mdjsc_callback_table(H5C_t * cache_ptr) +{ + herr_t ret_value = SUCCEED; /* Return value */ + int32_t i; + int32_t old_mdjsc_cb_tbl_len; + int64_t new_mdjsc_cb_tbl_len; + H5C_mdjsc_record_t * old_mdjsc_cb_tbl = NULL; + H5C_mdjsc_record_t * new_mdjsc_cb_tbl = NULL; + + FUNC_ENTER_NOAPI_NOINIT(H5C_grow_mdjsc_callback_table) + + HDassert( cache_ptr != NULL ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + HDassert( cache_ptr->mdjsc_cb_tbl != NULL ); + HDassert( cache_ptr->mdjsc_cb_tbl_len >= H5C__MIN_MDJSC_CB_TBL_LEN ); + HDassert( cache_ptr->mdjsc_cb_tbl_fl_head == -1 ); + HDassert( cache_ptr->num_mdjsc_cbs == cache_ptr->mdjsc_cb_tbl_len ); + + 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_len - 1 ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "unexpected mdjsc_cb_tbl status."); + } + + old_mdjsc_cb_tbl = cache_ptr->mdjsc_cb_tbl; + 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 = (H5C_mdjsc_record_t *) + H5MM_malloc((size_t)new_mdjsc_cb_tbl_len * sizeof(H5C_mdjsc_record_t)); + if ( new_mdjsc_cb_tbl == NULL ) { + + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \ + "can't alloc new mdjsc_cb_tbl.") + } + + for ( i = 0; i < old_mdjsc_cb_tbl_len; i++ ) + { + new_mdjsc_cb_tbl[i] = old_mdjsc_cb_tbl[i]; + } + + for ( i = old_mdjsc_cb_tbl_len; i < new_mdjsc_cb_tbl_len; i++ ) + { + new_mdjsc_cb_tbl[i].fcn_ptr = NULL; + new_mdjsc_cb_tbl[i].data_ptr = NULL; + new_mdjsc_cb_tbl[i].fl_next = i + 1; + } + new_mdjsc_cb_tbl[new_mdjsc_cb_tbl_len - 1].fl_next = -1; + + cache_ptr->mdjsc_cb_tbl = new_mdjsc_cb_tbl; + 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 = (H5C_mdjsc_record_t *)H5MM_xfree(old_mdjsc_cb_tbl); + + if ( old_mdjsc_cb_tbl != NULL ) { + + HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, \ + "free of old_mdjsc_cb_tbl failed."); + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_grow_mdjsc_callback_table() */ + + +/*------------------------------------------------------------------------- + * + * Function: H5C_register_mdjsc_callback() + * + * Purpose: Register a metadata journaling status change callback, + * growing the metadata journaling status callback table + * as necessary. + * + * Return: Success: SUCCEED + * Failure: FAIL + * + * Programmer: John Mainzer + * August 15, 2008 + * + *------------------------------------------------------------------------- + */ + +herr_t +H5C_register_mdjsc_callback(H5C_t * cache_ptr, + H5C_mdj_status_change_func_t fcn_ptr, + void * data_ptr, + int32_t * idx_ptr) +{ + herr_t result; + herr_t ret_value = SUCCEED; /* Return value */ + int32_t i; + + FUNC_ENTER_NOAPI(H5C_register_mdjsc_callback, FAIL) + + if ( ( cache_ptr == NULL ) || + ( cache_ptr->magic != H5C__H5C_T_MAGIC ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "bad cache_ptr on entry"); + } + + if ( cache_ptr->mdjsc_cb_tbl == NULL ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "cache_ptr->mdjsc_cb_tbl == NULL") + } + + if ( cache_ptr->mdjsc_cb_tbl_len < H5C__MIN_MDJSC_CB_TBL_LEN ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "cache_ptr->mdjsc_cb_tbl_len too small") + } + + if ( ( cache_ptr->mdjsc_cb_tbl_fl_head == -1 ) && + ( cache_ptr->num_mdjsc_cbs < cache_ptr->mdjsc_cb_tbl_len ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "mdjsc callback table corrupt?") + } + + if ( fcn_ptr == NULL ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "fcn_ptr NULL on entry") + } + + if ( idx_ptr == NULL ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "idx_ptr NULL on entry") + } + + if ( cache_ptr->mdjsc_cb_tbl_len <= cache_ptr->num_mdjsc_cbs ) { + + result = H5C_grow_mdjsc_callback_table(cache_ptr); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_grow_mdjsc_callback_table() failed."); + } + } + + if ( ( 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 >= cache_ptr->mdjsc_cb_tbl_len ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "mdjsc_cb_tbl corrupt(1)?!?!"); + } + + i = cache_ptr->mdjsc_cb_tbl_fl_head; + + cache_ptr->mdjsc_cb_tbl_fl_head = ((cache_ptr->mdjsc_cb_tbl)[i]).fl_next; + (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->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 >= cache_ptr->mdjsc_cb_tbl_len ) + ) + ) + ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "mdjsc_cb_tbl corrupt(2)?!?!"); + } + + ((cache_ptr->mdjsc_cb_tbl)[i]).fcn_ptr = fcn_ptr; + ((cache_ptr->mdjsc_cb_tbl)[i]).data_ptr = data_ptr; + ((cache_ptr->mdjsc_cb_tbl)[i]).fl_next = -1; + + if ( i > cache_ptr->mdjsc_cb_tbl_max_idx_in_use ) { + + cache_ptr->mdjsc_cb_tbl_max_idx_in_use = i; + } + + *idx_ptr = i; + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_register_mdjsc_callback() */ + + +/*------------------------------------------------------------------------- + * Function: H5C_shrink_mdjsc_callback_table() + * + * Purpose: Half the size of the the metadata journaling status + * change callback table. Note that the table is assumed + * to be: + * + * 1) Not more than H5C__MDJSC_CB_TBL_MIN_ACTIVE_RATIO * 100 + * percent full. + * + * 2) Of size H5C__MIN_MDJSC_CB_TBL_LEN * 2 ** n, where + * n is a positive integer. + * + * 3) Contain no entries at index greater than or equal to + * cache_ptr->mdjsc_cb_tbl_len / 2. + * + * Return: Success: SUCCEED + * Failure: FAIL + * + * Programmer: John Mainzer + * August 15, 2008 + * + *------------------------------------------------------------------------- + */ + +static herr_t +H5C_shrink_mdjsc_callback_table(H5C_t * cache_ptr) +{ + herr_t ret_value = SUCCEED; /* Return value */ + int32_t i; + int32_t old_mdjsc_cb_tbl_len; + int32_t new_mdjsc_cb_tbl_len; + int32_t new_fl_head = -1; + int32_t last_free_entry = -1; + double fraction_in_use; + H5C_mdjsc_record_t * old_mdjsc_cb_tbl = NULL; + H5C_mdjsc_record_t * new_mdjsc_cb_tbl = NULL; + + FUNC_ENTER_NOAPI_NOINIT(H5C_shrink_mdjsc_callback_table) + + HDassert( cache_ptr != NULL ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + HDassert( cache_ptr->mdjsc_cb_tbl != NULL ); + HDassert( cache_ptr->mdjsc_cb_tbl_len > H5C__MIN_MDJSC_CB_TBL_LEN ); + HDassert( cache_ptr->mdjsc_cb_tbl_fl_head >= 0); + HDassert( cache_ptr->num_mdjsc_cbs < cache_ptr->mdjsc_cb_tbl_len / 2 ); + + fraction_in_use = ((double)(cache_ptr->num_mdjsc_cbs)) / + ((double)(cache_ptr->mdjsc_cb_tbl_len)); + + if ( ( cache_ptr->num_mdjsc_cbs >= cache_ptr->mdjsc_cb_tbl_len ) || + ( (cache_ptr->mdjsc_cb_tbl_len / 2) < H5C__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_len / 2 ) || + ( fraction_in_use >= H5C__MDJSC_CB_TBL_MIN_ACTIVE_RATIO ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "unexpected mdjsc_cb_tbl status."); + } + + old_mdjsc_cb_tbl = cache_ptr->mdjsc_cb_tbl; + old_mdjsc_cb_tbl_len = cache_ptr->mdjsc_cb_tbl_len; + + new_mdjsc_cb_tbl_len = old_mdjsc_cb_tbl_len / 2; + + while ( ( (new_mdjsc_cb_tbl_len / 2) >= H5C__MIN_MDJSC_CB_TBL_LEN ) && + ( (((double)(cache_ptr->num_mdjsc_cbs)) / + ((double)new_mdjsc_cb_tbl_len)) <= + H5C__MDJSC_CB_TBL_MIN_ACTIVE_RATIO ) && + ( (new_mdjsc_cb_tbl_len / 2) > + cache_ptr->mdjsc_cb_tbl_max_idx_in_use ) ) + { + new_mdjsc_cb_tbl_len /= 2; + } + + if ( ( new_mdjsc_cb_tbl_len < H5C__MIN_MDJSC_CB_TBL_LEN ) || + ( new_mdjsc_cb_tbl_len < cache_ptr->mdjsc_cb_tbl_max_idx_in_use ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "error in computation of new_mdjsc_cb_tbl_len?!?!"); + } + + new_mdjsc_cb_tbl = (H5C_mdjsc_record_t *) + H5MM_malloc((size_t)new_mdjsc_cb_tbl_len * sizeof(H5C_mdjsc_record_t)); + if ( new_mdjsc_cb_tbl == NULL ) { + + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \ + "can't alloc new mdjsc_cb_tbl.") + } + + /* now copy over the table, constructing the free list as we go */ + + for ( i = 0; i < new_mdjsc_cb_tbl_len; i++ ) + { + if ( old_mdjsc_cb_tbl[i].fcn_ptr == NULL ) { + + 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; + last_free_entry = i; + + } else { + + new_mdjsc_cb_tbl[last_free_entry].fl_next = i; + last_free_entry = i; + } + } else { + + new_mdjsc_cb_tbl[i] = old_mdjsc_cb_tbl[i]; + + } + } + + if ( new_fl_head == -1 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "table full after shrink!?!."); + + } + + cache_ptr->mdjsc_cb_tbl = new_mdjsc_cb_tbl; + 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 = ( H5C_mdjsc_record_t *)H5MM_xfree(old_mdjsc_cb_tbl); + + if ( old_mdjsc_cb_tbl != NULL ) { + + HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, \ + "free of old_mdjsc_cb_tbl failed."); + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_shrink_mdjsc_callback_table() */ + + +/**************************************************************************/ +/********************** journal file management code **********************/ +/**************************************************************************/ + +/* 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 + * conversion easier. + */ + +#if 1 /* JRM */ + /* remove print statements from these macros. -- JRM */ +#endif /* JRM */ + +#define H5C_JB_BJF__WRITE_BUFFER(struct_ptr, \ + buf_size, \ + buf_ptr, \ + is_end_trans, \ + trans_num, \ + fail_return) \ +if ( H5C_jb_bjf__write_buffer((struct_ptr), (buf_size), (buf_ptr), \ + (is_end_trans), (trans_num)) != SUCCEED ) { \ + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, (fail_return), \ + "H5C_jb_bjf__write_buffer() failed."); \ +} + +#define H5C_jb_BJF__WRITE_CHKSUM(struct_ptr, \ + is_end_trans, \ + trans_num, \ + fail_return) \ +if ( H5C_jb_bjf__write_chksum((struct_ptr), (is_end_trans), (trans_num)) \ + != SUCCEED ) { \ + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, (fail_return), \ + "H5C_jb_bjf__write_chksum() failed."); \ +} + +#define H5C_JB_BJF__WRITE_LENGTH(struct_ptr, \ + length, \ + is_end_trans, \ + trans_num, \ + fail_return) \ +if ( H5C_jb_bjf__write_length((struct_ptr), (length), (is_end_trans), \ + (trans_num)) != SUCCEED ) { \ + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, (fail_return), \ + "H5C_jb_bjf__write_length() failed."); \ +} + +#define H5C_JB_BJF__WRITE_OFFSET(struct_ptr, \ + offset, \ + is_end_trans, \ + trans_num, \ + fail_return) \ +if ( H5C_jb_bjf__write_offset((struct_ptr), (offset), (is_end_trans), \ + (trans_num)) != SUCCEED ) { \ + HDfprintf(stdout, "%s: H5C_jb_bjf__write_offset() failed.\n", FUNC); \ + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, (fail_return), \ + "H5C_jb_bjf__write_offset() failed."); \ +} + +#define H5C_JB_BJF__WRITE_SIG_AND_VER(struct_ptr, \ + sig_ptr, \ + version, \ + keep_chksum, \ + is_end_trans, \ + trans_num, \ + fail_return) \ +if(H5C_jb_bjf__write_sig_and_ver((struct_ptr), (sig_ptr), (version), \ + (keep_chksum), (is_end_trans), (trans_num)) < 0) { \ + HDfprintf(stdout, "%s: H5C_jb_bjf__write_sig_and_ver() failed.\n", FUNC); \ + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, (fail_return), "H5C_jb_bjf__write_sig_and_ver() failed.") \ +} + +#define H5C_JB_BJF__WRITE_TRANS_NUM(struct_ptr, \ + is_end_trans, \ + trans_num, \ + fail_return) \ +if ( H5C_jb_bjf__write_trans_num((struct_ptr), (is_end_trans), \ + (trans_num)) != SUCCEED ) { \ + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, (fail_return), \ + "H5C_jb_bjf__write_trans_num() failed."); \ +} + + +/****************************************************************************** + * + * Function: H5C_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 +H5C_jb_aio__await_buffer_write_completion(H5C_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(H5C_jb_aio__await_buffer_write_completion, FAIL) + + HDassert( struct_ptr != NULL ); + HDassert( struct_ptr->magic == H5C__H5C_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 */ + + H5C__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) + +} /* H5C_jb_aio__await_buffer_write_completion() */ + + +/****************************************************************************** + * + * Function: H5C_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 H5C_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 H5C_JB_AIO__AWAIT_ASYNC_FSYNC_COMPLETION__DEBUG 0 + +#if 1 +static herr_t +H5C_jb_aio__await_async_fsync_completion(H5C_jbrb_t * struct_ptr) +{ + int result; + herr_t ret_value = SUCCEED; + struct H5C_jbrb_sync_q_entry_t * head_ptr = NULL; + struct aiocb * aiocb_ptr = NULL; + + FUNC_ENTER_NOAPI(H5C_jb_aio__await_async_fsync_completion, FAIL) + + HDassert( struct_ptr != NULL ); + HDassert( struct_ptr->magic == H5C__H5C_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 == H5C__H5C_JBRB_SYNC_Q_T_MAGIC ); + + aiocb_ptr = &(head_ptr->ctl_blk); + + if ( aiocb_ptr->aio_fildes != struct_ptr->journal_file_fd ) { + +#if H5C_JB_AIO__AWAIT_ASYNC_FSYNC_COMPLETION__DEBUG + HDfprintf(stdout, "%s: bad fd in ctl blk?!?\n", FUNC); +#endif /* H5C_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 H5C_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 /* H5C_JB_AIO__AWAIT_ASYNC_FSYNC_COMPLETION__DEBUG */ + + HGOTO_ERROR(H5E_IO, H5E_SYNCFAIL, FAIL, \ + "aio_error() reports error.") + } + + H5C__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 H5C_JB_AIO__AWAIT_ASYNC_FSYNC_COMPLETION__DEBUG + HDfprintf(stdout, + "%s: aio_return() reports something other than success.\n", + FUNC); +#endif /* H5C_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 H5C_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 /* H5C_JB_AIO__AWAIT_ASYNC_FSYNC_COMPLETION__DEBUG */ + + H5C__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 ( H5C_jb_aio__sync_q__discard_head(struct_ptr) != SUCCEED ) { + +#if H5C_JB_AIO__AWAIT_ASYNC_FSYNC_COMPLETION__DEBUG + HDfprintf(stdout, + "%s: H5C_jb_aio__sync_q__discard_head() failed.\n", FUNC); +#endif /* H5C_JB_AIO__AWAIT_ASYNC_FSYNC_COMPLETION__DEBUG */ + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_jb_aio__sync_q__discard_head() failed.") + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_jb_aio__await_async_fsync_completion() */ +#else +static herr_t +H5C_jb_aio__await_async_fsync_completion(H5C_jbrb_t * struct_ptr) +{ + int result; + herr_t ret_value = SUCCEED; + struct H5C_jbrb_sync_q_entry_t * head_ptr = NULL; + struct aiocb * aiocb_ptr = NULL; + const struct aiocb * aiocb_list[1] = { NULL }; + + FUNC_ENTER_NOAPI(H5C_jb_aio__await_async_fsync_completion, FAIL) + + HDassert( struct_ptr != NULL ); + HDassert( struct_ptr->magic == H5C__H5C_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 == H5C__H5C_JBRB_SYNC_Q_T_MAGIC ); + + aiocb_ptr = &(head_ptr->ctl_blk); + + if ( aiocb_ptr->aio_fildes != struct_ptr->journal_file_fd ) { + +#if H5C_JB_AIO__AWAIT_ASYNC_FSYNC_COMPLETION__DEBUG + HDfprintf(stdout, "%s: bad fd in ctl blk?!?\n", FUNC); +#endif /* H5C_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 H5C_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 /* H5C_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 H5C_JB_AIO__AWAIT_ASYNC_FSYNC_COMPLETION__DEBUG + HDfprintf(stdout, + "%s: aio_error() reports error after aio_suspend() returns.\n", + FUNC); +#endif /* H5C_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 H5C_JB_AIO__AWAIT_ASYNC_FSYNC_COMPLETION__DEBUG + HDfprintf(stdout, + "%s: aio_return() reports something other than success.\n", + FUNC); +#endif /* H5C_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 H5C_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 /* H5C_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 ( H5C_jb_aio__sync_q__discard_head(struct_ptr) != SUCCEED ) { + +#if H5C_JB_AIO__AWAIT_ASYNC_FSYNC_COMPLETION__DEBUG + HDfprintf(stdout, + "%s: H5C_jb_aio__sync_q__discard_head() failed.\n", FUNC); +#endif /* H5C_JB_AIO__AWAIT_ASYNC_FSYNC_COMPLETION__DEBUG */ + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_jb_aio__sync_q__discard_head() failed.") + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_jb_aio__await_async_fsync_completion() */ +#endif + + +/****************************************************************************** + * + * Function: H5C_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 H5C_JB_AIO__AWAIT_COMPLETION_OF_ALL_ASYNC_FSYNCS__DEBUG 0 + +herr_t +H5C_jb_aio__await_completion_of_all_async_fsyncs(H5C_jbrb_t * struct_ptr) +{ + herr_t result; + herr_t ret_value = SUCCEED; + + FUNC_ENTER_NOAPI(H5C_jb_aio__await_completion_of_all_async_fsyncs, FAIL) + + HDassert( struct_ptr != NULL ); + HDassert( struct_ptr->magic == H5C__H5C_JBRB_T_MAGIC ); + HDassert( struct_ptr->use_aio ); + HDassert( struct_ptr->use_aio_fsync ); + +#if H5C_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 /* H5C_JB_AIO__AWAIT_COMPLETION_OF_ALL_ASYNC_FSYNCS__DEBUG */ + + while ( struct_ptr->aio_sync_q_len > 0 ) { + + result = H5C_jb_aio__await_async_fsync_completion(struct_ptr); + + if ( result != SUCCEED ) { + +#if H5C_JB_AIO__AWAIT_COMPLETION_OF_ALL_ASYNC_FSYNCS__DEBUG + HDfprintf(stdout, + "H5C_jb_aio__await_async_fsync_completion() failed.\n", + FUNC); +#endif /* H5C_JB_AIO__AWAIT_COMPLETION_OF_ALL_ASYNC_FSYNCS__DEBUG */ + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_jb_aio__await_async_fsync_completion() failed.") + } + } /* while */ + + HDassert( struct_ptr->aio_sync_q_len == 0 ); + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_jb_aio__await_completion_of_all_async_fsyncs() */ + + +/****************************************************************************** + * + * Function: H5C_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 H5C_JB_AIO__AWAIT_COMPLETION_OF_ALL_PENDING_WRITES__DEBUG 0 + +herr_t +H5C_jb_aio__await_completion_of_all_pending_writes(H5C_jbrb_t * struct_ptr) +{ + hbool_t done = FALSE; + int result; + herr_t ret_value = SUCCEED; + struct aiocb * aiocb_ptr = NULL; + + FUNC_ENTER_NOAPI(H5C_jb_aio__await_completion_of_all_pending_writes, FAIL) + + HDassert( struct_ptr != NULL ); + HDassert( struct_ptr->magic == H5C__H5C_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 = H5C_jb_aio__await_buffer_write_completion(struct_ptr, + struct_ptr->get); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_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 H5C_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 /* H5C_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) + +} /* H5C_jb_aio__await_completion_of_all_pending_writes() */ + + + +/****************************************************************************** + * + * Function: H5C_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 H5C_JB_AIO__FLUSH__DEBUG 0 + +static herr_t +H5C_jb_aio__flush(H5C_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(H5C_jb_aio__flush, FAIL) + + /* Check Arguments and status */ + HDassert( struct_ptr != NULL ); + HDassert( struct_ptr->magic == H5C__H5C_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 H5C_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 /* H5C_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 + * H5C_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 = H5C_jb_aio__queue_buffer_write(struct_ptr, + struct_ptr->put, + TRUE); + + if ( result != SUCCEED ) { + +#if H5C_JB_AIO__FLUSH__DEBUG + HDfprintf(stdout, + "%s: H5C_jb_aio__queue_buffer_write() failed.\n", + FUNC); +#endif /* H5C_JB_AIO__FLUSH__DEBUG */ + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_jb_aio__queue_buffer_write() failed."); + } + } + } + + /* await completion of all outstanding writes */ + + result = H5C_jb_aio__await_completion_of_all_pending_writes(struct_ptr); + + if ( result != SUCCEED ) { + +#if H5C_JB_AIO__FLUSH__DEBUG + HDfprintf(stdout, + "%s: H5C_jb_aio__await_completion_of_all_pending_writes() failed.\n", + FUNC); +#endif /* H5C_JB_AIO__FLUSH__DEBUG */ + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_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 = H5C_jb_aio__sync_file(struct_ptr); + + if ( result != SUCCEED ) { + +#if H5C_JB_AIO__FLUSH__DEBUG + HDfprintf(stdout, + "%s: H5C_jb_aio__sync_file() failed.\n", + FUNC); +#endif /* H5C_JB_AIO__FLUSH__DEBUG */ + + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_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 H5C_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, H5C_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) + +} /* H5C_jb_aio__flush() */ + + +/****************************************************************************** + * + * Function: H5C_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 +H5C_jb_aio__get_last_transaction_on_disk(H5C_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(H5C_jb_aio__get_last_transaction_on_disk, FAIL) + + /* Check Arguments */ + HDassert( struct_ptr != NULL ); + HDassert( struct_ptr->magic == H5C__H5C_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 = H5C_jb_aio__note_completed_async_buffer_writes(struct_ptr); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_jb_aio__note_completed_async_buffer_writes() failed.") + } + + result = H5C_jb_aio__note_completed_async_fsyncs(struct_ptr); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_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 = + H5C_jb_aio__await_completion_of_all_pending_writes(struct_ptr); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_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 = H5C_jb_aio__sync_file(struct_ptr); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_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 H5C_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, H5C_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) + +} /* H5C_jb_aio__get_last_transaction_on_disk */ + + +/****************************************************************************** + * + * Function: H5C_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 +H5C_jb_aio__make_space_in_ring_buffer(H5C_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(H5C_jb_aio__make_space_in_ring_buffer, FAIL) + + HDassert( struct_ptr != NULL ); + HDassert( struct_ptr->magic == H5C__H5C_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 = H5C_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, \ + "H5C_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 = H5C_jb_aio__prep_next_buf_for_use(struct_ptr, + last_trans_in_ring_buffer); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_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 = H5C_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, \ + "H5C_jb_aio__note_completed_async_buffer_writes() failed.") + } + +#else /* delete this branch if all goes well -- JRM */ + + while ( ! done ) { + + buf_write_complete = FALSE; + + result = H5C_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, \ + "H5C_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 = H5C_jb_aio__note_completed_async_fsyncs(struct_ptr); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_jb_aio__note_completed_async_fsyncs() failed.") + } + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_jb_aio__make_space_in_ring_buffer() */ + + +/****************************************************************************** + * + * Function: H5C_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 H5C_JB_AIO__NOTE_COMPLETED_ASYNC_BUFFER_WRITES__DEBUG 0 + +static herr_t +H5C_jb_aio__note_completed_async_buffer_writes(H5C_jbrb_t * struct_ptr) +{ + herr_t result; + herr_t ret_value = SUCCEED; + hbool_t write_completed = TRUE; + + FUNC_ENTER_NOAPI(H5C_jb_aio__note_completed_async_buffer_writes, FAIL) + + HDassert( struct_ptr != NULL ); + HDassert( struct_ptr->magic == H5C__H5C_JBRB_T_MAGIC ); + HDassert( struct_ptr->use_aio ); + + while ( ( struct_ptr->writes_in_progress > 0 ) && + ( write_completed ) ) { + + result = H5C_jb_aio__test_buffer_write_complete(struct_ptr, + struct_ptr->get, + &write_completed); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_jb_aio__test_buffer_write_complete() failed.") + } + + if ( write_completed ) { + + H5C__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 H5C_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 /* H5C_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) + +} /* H5C_jb_aio__note_completed_async_buffer_writes() */ + + +/****************************************************************************** + * + * Function: H5C_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 H5C_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 +H5C_jb_aio__note_completed_async_fsyncs(H5C_jbrb_t * struct_ptr) +{ + herr_t result; + herr_t ret_value = SUCCEED; + hbool_t sync_completed = TRUE; + + FUNC_ENTER_NOAPI(H5C_jb_aio__note_completed_async_fsyncs, FAIL) + + HDassert( struct_ptr != NULL ); + HDassert( struct_ptr->magic == H5C__H5C_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 = H5C_jb_aio__test_next_async_fsync_complete(struct_ptr, + &sync_completed); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_jb_aio__test_next_async_fsync_complete() failed.") + } + } /* while */ + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_jb_aio__note_completed_async_fsyncs() */ + + +/****************************************************************************** + * + * Function: H5C_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 +H5C_jb_aio__prep_next_buf_for_use(H5C_jbrb_t * struct_ptr, + uint64_t last_trans_in_ring_buffer) +{ + herr_t ret_value = SUCCEED; + + FUNC_ENTER_NOAPI(H5C_jb_aio__prep_next_buf_for_use, FAIL) + + HDassert( struct_ptr != NULL ); + HDassert( struct_ptr->magic == H5C__H5C_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) + +} /* H5C_jb_aio__prep_next_buf_for_use() */ + + +/****************************************************************************** + * + * Function: H5C_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 H5C_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 + * H5C_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 H5C_jbrb_sync_q_entry_t to the tail of + * the aio sync queue, and then return. + * + * If the instance of H5C_jbrb_sync_q_entry_t is + * allocated, but the call to aio_fsync() fails for + * any reason, discard the instance of + * H5C_jbrb_sync_q_entry_t before exiting. + * + * JRM -- 2/8/10 + * + * Returns: SUCCEED on success. + * + ******************************************************************************/ + +#define H5C_JB_AIO__QUEUE_ASYNC_FSYNC__DEBUG 0 +#define AIO_FSYNC_MAX_RETRIES 120 + +static herr_t +H5C_jb_aio__queue_async_fsync(H5C_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 H5C_jbrb_sync_q_entry_t * entry_ptr = NULL; + + HDassert( struct_ptr != NULL ); + HDassert( struct_ptr->magic == H5C__H5C_JBRB_T_MAGIC ); + HDassert( struct_ptr->journal_file_fd >= 0 ); + HDassert( struct_ptr->use_aio ); + HDassert( struct_ptr->use_aio_fsync ); + + FUNC_ENTER_NOAPI(H5C_jb_aio__queue_async_fsync, FAIL) + + entry_ptr = (struct H5C_jbrb_sync_q_entry_t *) + H5MM_malloc(sizeof(struct H5C_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 = H5C__H5C_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 H5C_JB_AIO__QUEUE_ASYNC_FSYNC__DEBUG + HDfprintf(stdout, + "%s: aio_fsync() not supported. errno = %d (%s)\n", + FUNC, errno, strerror(errno)); +#endif /* H5C_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 H5C_JB_AIO__QUEUE_ASYNC_FSYNC__DEBUG + HDfprintf(stdout, + "%s: retry limit on calls to aio_fsync() exceeded\n", + FUNC); +#endif /* H5C_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 = + H5C_jb_aio__test_next_async_fsync_complete(struct_ptr, + &sync_complete); + } + } else { + +#if H5C_JB_AIO__QUEUE_ASYNC_FSYNC__DEBUG + HDfprintf(stdout, + "%s: aio_fsync() failed. errno = %d (%s)\n", + FUNC, errno, strerror(errno)); +#endif /* H5C_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 = H5C_jb_aio__sync_q__append(struct_ptr, entry_ptr); + + if ( herr_result != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_jb_aio__sync_q__append() failed.") + + } + + sync_queued = TRUE; + + H5C__JBRB__UPDATE_STATS_FOR_ASYNC_SYNCS_QUEUED(struct_ptr); + +#if H5C_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 /* H5C_JB_AIO__QUEUE_ASYNC_FSYNC__DEBUG */ + + } +done: + + if ( ( entry_ptr != NULL ) && + ( ! sync_queued ) ) { /* discard *entry_ptr */ + + entry_ptr->magic = 0; + entry_ptr = (struct H5C_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) + +} /* H5C_jb_aio__queue_async_fsync() */ + + +/****************************************************************************** + * + * Function: H5C_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 H5C_JB_AIO__QUEUE_BUFFER_WRITE__DEBUG 0 +#define AIO_WRITE_MAX_RETRIES 120 + +static herr_t +H5C_jb_aio__queue_buffer_write(H5C_jbrb_t * struct_ptr, + int buf_num, + hbool_t partial_write_ok) +{ + hbool_t write_queued = FALSE; + int result; + int retries = -1; +#if H5C_JB_AIO__QUEUE_BUFFER_WRITE__DEBUG + static int writes_queued = 0; +#endif /* H5C_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 == H5C__H5C_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(H5C_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 H5C_JB_AIO__QUEUE_BUFFER_WRITE__DEBUG + HDfprintf(stdout, + "%s: buffer not full and partial_write_ok == FALSE.\n", + FUNC); +#endif /* H5C_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 H5C_JB_AIO__QUEUE_BUFFER_WRITE__DEBUG + HDfprintf(stdout, + "%s: AIO write alread in progress for target buffer?\n", + FUNC); +#endif /* H5C_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 H5C_JB_AIO__QUEUE_BUFFER_WRITE__DEBUG + HDfprintf(stdout, + "%s: ((*struct_ptr->buf)[buf_num]) == NULL?!?\n", + FUNC); +#endif /* H5C_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 H5C_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 /* H5C_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 H5C_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 /* H5C_JB_AIO__QUEUE_BUFFER_WRITE__DEBUG */ + + + if ( ( result != 0 ) && ( retries > AIO_WRITE_MAX_RETRIES ) ) { + +#if H5C_JB_AIO__QUEUE_BUFFER_WRITE__DEBUG + HDfprintf(stdout, "%s: retry limit on calls to aio_write() exceeded\n", + FUNC); +#endif /* H5C_JB_AIO__QUEUE_BUFFER_WRITE__DEBUG */ + + HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, \ + "retry limit on calls to aio_write() exceeded.") + } + +#if H5C_JB_AIO__QUEUE_BUFFER_WRITE__DEBUG + writes_queued++; +#endif /* H5C_JB_AIO__QUEUE_BUFFER_WRITE__DEBUG */ + + H5C__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 H5C_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 /* H5C_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 = H5C_jb_aio__queue_async_fsync(struct_ptr); + + if ( herr_result != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_jb_aio__queue_async_fsync() failed.") + } + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_jb_aio__queue_buffer_write() */ + + +/****************************************************************************** + * + * Function: H5C_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 H5C_JB_AIO__SYNC_FILE__DEBUG 0 + +static herr_t +H5C_jb_aio__sync_file(H5C_jbrb_t * struct_ptr) +{ + int result; + herr_t ret_value = SUCCEED; + + FUNC_ENTER_NOAPI(H5C_jb_aio__sync_file, FAIL) + + HDassert( struct_ptr != NULL ); + HDassert( struct_ptr->magic == H5C__H5C_JBRB_T_MAGIC ); + HDassert( struct_ptr->journal_file_fd >= 0 ); + HDassert( struct_ptr->use_aio ); + + if ( struct_ptr->writes_in_progress != 0 ) { + +#if H5C_JB_AIO__SYNC_FILE__DEBUG + HDfprintf(stdout, "%s: async write in progress on entry.\n", FUNC); +#endif /* H5C_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 = H5C_jb_aio__await_completion_of_all_async_fsyncs(struct_ptr); + + if ( result != 0 ) { + +#if H5C_JB_AIO__SYNC_FILE__DEBUG + HDfprintf(stdout, + "%s: H5C_jb_aio__await_completion_of_all_async_fsyncs() failed.\n", + FUNC); +#endif /* H5C_JB_AIO__SYNC_FILE__DEBUG */ + + HGOTO_ERROR(H5E_IO, H5E_SYNCFAIL, FAIL, \ + "H5C_jb_aio__await_completion_of_all_async_fsyncs() failed."); + } + } else { + + result = fsync(struct_ptr->journal_file_fd); + + if ( result != 0 ) { + +#if H5C_JB_AIO__SYNC_FILE__DEBUG + HDfprintf(stdout, "%s: fsync() failed.\n", FUNC); +#endif /* H5C_JB_AIO__SYNC_FILE__DEBUG */ + + HGOTO_ERROR(H5E_IO, H5E_SYNCFAIL, FAIL, "fsync() failed."); + } + + H5C__JBRB__UPDATE_STATS_FOR_CALL_TO_FSYNC(struct_ptr) + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_jb_aio__sync_file() */ + + +/****************************************************************************** + * + * Function: H5C_jb_aio__sync_q__append() + * + * Purpose: Append an instance of H5C_jbrb_sync_q_entry_t to + * the sync queue. + * + * Verify that AIO is enabled, and that the supplied + * instance of H5C_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 +H5C_jb_aio__sync_q__append(H5C_jbrb_t * struct_ptr, + struct H5C_jbrb_sync_q_entry_t * entry_ptr) +{ + herr_t ret_value = SUCCEED; + + FUNC_ENTER_NOAPI(H5C_jb_aio__sync_q__append, FAIL) + + HDassert( struct_ptr != NULL ); + HDassert( struct_ptr->magic == H5C__H5C_JBRB_T_MAGIC ); + HDassert( struct_ptr->use_aio ); + HDassert( entry_ptr != NULL ); + HDassert( entry_ptr->magic == H5C__H5C_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 == + H5C__H5C_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) + +} /* H5C_jb_aio__sync_q__append() */ + + +/****************************************************************************** + * + * Function: H5C_jb_aio__sync_q__append() + * + * Purpose: Append an instance of H5C_jbrb_sync_q_entry_t to + * the sync queue. + * + * Verify that AIO is enabled, and that the supplied + * instance of H5C_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 +H5C_jb_aio__sync_q__discard_head(H5C_jbrb_t * struct_ptr) +{ + herr_t ret_value = SUCCEED; + struct H5C_jbrb_sync_q_entry_t * head_ptr = NULL; + + FUNC_ENTER_NOAPI(H5C_jb_aio__sync_q__discard_head, FAIL) + + HDassert( struct_ptr != NULL ); + HDassert( struct_ptr->magic == H5C__H5C_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 == H5C__H5C_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 == H5C__H5C_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 H5C_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) + +} /* H5C_jb_aio__sync_q__discard_head() */ + + +/****************************************************************************** + * + * Function: H5C_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 +H5C_jb_aio__test_buffer_write_complete(H5C_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(H5C_jb_aio__test_buffer_write_complete, FAIL) + + HDassert( struct_ptr != NULL ); + HDassert( struct_ptr->magic == H5C__H5C_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) + +} /* H5C_jb_aio__test_buffer_write_complete() */ + + +/****************************************************************************** + * + * Function: H5C_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 + * H5C_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 H5C_JB_AIO__TEST_NEXT_ASYNC_FSYNC_COMPLETE__DEBUG 0 + +static herr_t +H5C_jb_aio__test_next_async_fsync_complete(H5C_jbrb_t * struct_ptr, + hbool_t *sync_complete_ptr) +{ + int result; + herr_t ret_value = SUCCEED; + struct H5C_jbrb_sync_q_entry_t * head_ptr = NULL; + struct aiocb * aiocb_ptr = NULL; + + FUNC_ENTER_NOAPI(H5C_jb_aio__test_next_async_fsync_complete, FAIL) + + HDassert( struct_ptr != NULL ); + HDassert( struct_ptr->magic == H5C__H5C_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 == H5C__H5C_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 H5C_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 /* H5C_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 H5C_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 /* H5C_JB_AIO__TEST_NEXT_ASYNC_FSYNC_COMPLETE__DEBUG */ + + H5C__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 ( H5C_jb_aio__sync_q__discard_head(struct_ptr) != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_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) + +} /* H5C_jb_aio__test_next_async_fsync_complete() */ + + +/****************************************************************************** + * + * Function: H5C_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 H5C_JB_AIO__WRITE_TO_BUFFER__DEBUG 0 + +herr_t +H5C_jb_aio__write_to_buffer(H5C_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(H5C_jb_aio__write_to_buffer, FAIL) + + /* Check Arguments */ + HDassert( struct_ptr != NULL ); + HDassert( struct_ptr->magic == H5C__H5C_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 + * H5C_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 = H5C_jb_aio__make_space_in_ring_buffer(struct_ptr); + + if ( result != SUCCEED ) { + +#if H5C_JB_AIO__WRITE_TO_BUFFER__DEBUG + HDfprintf(stdout, + "%s: H5C_jb_aio__make_space_in_ring_buffer(1) failed.\n", + FUNC); +#endif /* H5C_JB_AIO__WRITE_TO_BUFFER__DEBUG */ + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_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 H5C_JB_AIO__WRITE_TO_BUFFER__DEBUG + HDfprintf(stdout, "%s: set trans_tracking[%d] to %lld (1).\n", + FUNC, struct_ptr->put, trans_num); +#endif /* H5C_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 = H5C_jb_aio__queue_buffer_write(struct_ptr, + struct_ptr->put, + FALSE); + + if ( result != SUCCEED ) { + +#if H5C_JB_AIO__WRITE_TO_BUFFER__DEBUG + HDfprintf(stdout, + "%s: H5C_jb_aio__queue_buffer_write() failed.\n", + FUNC); +#endif /* H5C_JB_AIO__WRITE_TO_BUFFER__DEBUG */ + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_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 + * H5C_jb_aio__prep_next_buf_for_use(). + * + * otherwise, if we still have data to write, call + * H5C_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 H5C_JB_AIO__WRITE_TO_BUFFER__DEBUG + HDfprintf(stdout, "%s: set trans_tracking[%d] to %lld (2).\n", + FUNC, struct_ptr->put, trans_num); +#endif /* H5C_JB_AIO__WRITE_TO_BUFFER__DEBUG */ + + result = H5C_jb_aio__prep_next_buf_for_use(struct_ptr, + last_trans_in_ring_buffer); + + if ( result != SUCCEED ) { + +#if H5C_JB_AIO__WRITE_TO_BUFFER__DEBUG + HDfprintf(stdout, + "%s: H5C_jb_aio__prep_next_buf_for_use() failed.\n", + FUNC); +#endif /* H5C_JB_AIO__WRITE_TO_BUFFER__DEBUG */ + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_jb_aio__prep_next_buf_for_use() failed.") + } + } else if ( size_remaining > 0 ) { + + result = H5C_jb_aio__make_space_in_ring_buffer(struct_ptr); + + if ( result != SUCCEED ) { + +#if H5C_JB_AIO__WRITE_TO_BUFFER__DEBUG + HDfprintf(stdout, + "%s: H5C_jb_aio__make_space_in_ring_buffer() failed.\n", + FUNC); +#endif /* H5C_JB_AIO__WRITE_TO_BUFFER__DEBUG */ + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_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 H5C_JB_AIO__WRITE_TO_BUFFER__DEBUG + HDfprintf(stdout, "%s: set trans_tracking[%d] to %lld (3).\n", + FUNC, struct_ptr->put, trans_num); +#endif /* H5C_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) + +} /* H5C_jb_aio__write_to_buffer */ + + + +/****************************************************************************** + * + * Function: H5C_jb_bjf__comment + * + * Programmer: John Mainzer + * + * 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. + * + * Returns: SUCCEED on success. + * + ******************************************************************************/ + +static herr_t +H5C_jb_bjf__comment(H5C_jbrb_t * struct_ptr, + const char * comment_ptr) +{ + herr_t ret_value = SUCCEED; + + FUNC_ENTER_NOAPI(H5C_jb_bjf__comment, FAIL) + + /* Check Arguments */ + HDassert( struct_ptr != NULL ); + HDassert( struct_ptr->magic == H5C__H5C_JBRB_T_MAGIC ); + HDassert( comment_ptr != NULL ); + + /* the following really should be an assert, but the FUNC ENTER/LEAVE + * macros are happier if we have at least one call to HGOTO_ERROR(). + */ + + if ( struct_ptr->human_readable ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "human_readable is TRUE?!?!\n") + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_jb_bjf__comment() */ + + +/***************************************************************************** + * + * Function: H5C_jb_bjf__end_transaction + * + * Programmer: John Mainzer + * + * Purpose: Verify that the supplied transaction is in progress, + * and that at least one journal entry has been written + * under it. + * + * Then write an end transaction message to the ring + * buffer. + * + * Make note that the supplied transaction is closed, + * and that no transaction is in progress. + * + * Returns: SUCCEED on success. + * + * Changes: None. + * + *****************************************************************************/ + +static herr_t +H5C_jb_bjf__end_transaction(H5C_jbrb_t * struct_ptr, + uint64_t trans_num) +{ + herr_t ret_value = SUCCEED; + + FUNC_ENTER_NOAPI(H5C_jb_bjf__end_transaction, FAIL) + + /* Check Arguments */ + HDassert( struct_ptr != NULL ); + HDassert( struct_ptr->magic == H5C__H5C_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 ) ) { + + 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 + */ + if ( struct_ptr->jentry_written != TRUE ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "Empty transaction -- at least one journal entry required.") + } /* end if */ + + /* Write end transaction message */ + H5C_JB_BJF__WRITE_SIG_AND_VER(struct_ptr, \ + H5C_BJNL__END_TRANS_SIG, \ + H5C_BJNL__END_TRANS_VER, \ + /* keep_chksum */ FALSE, \ + /* is_end_trans */ FALSE, \ + trans_num, \ + /* fail_return */ FAIL) + + H5C_JB_BJF__WRITE_TRANS_NUM(struct_ptr, \ + /* is_end_trans */ TRUE, \ + trans_num, \ + /* fail_return */ FAIL) + + /* reset boolean flag indicating that at least one journal entry has + * been written under transaction + */ + struct_ptr->jentry_written = FALSE; + + /* Close current transaction */ + struct_ptr->trans_in_prog = FALSE; + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* end H5C_jb_bjf__end_transaction */ + + +/****************************************************************************** + * + * Function: H5C_jb_bjf__eoa + * + * Programmer: John Mainzer + * + * 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 + * transactions. Since H5C_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. + * + * Returns: SUCCEED on success. + * + * Changes: None. + * + ******************************************************************************/ + +static herr_t +H5C_jb_bjf__eoa(H5C_jbrb_t * struct_ptr, + haddr_t eoa) +{ + herr_t ret_value = SUCCEED; + FUNC_ENTER_NOAPI(H5C_jb_bjf__eoa, FAIL) + + /* Check Arguments */ + HDassert( struct_ptr != NULL ); + HDassert( struct_ptr->magic == H5C__H5C_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. + */ + if ( struct_ptr->header_present == FALSE ) { + + if ( H5C_jb__write_header_entry(struct_ptr) != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_jb__write_header_entry() failed.\n") + } + } /* end if */ + + /* Note that EOA messages are not generated by the metadata cache, and + * thus are not associated with transactions. Since + * H5C_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. + */ + + /* Write EOA message */ + H5C_JB_BJF__WRITE_SIG_AND_VER(struct_ptr, \ + H5C_BJNL__END_ADDR_SPACE_SIG, \ + H5C_BJNL__END_ADDR_SPACE_VER, \ + /* keep_chksum */ FALSE, \ + /* is_end_trans */ FALSE, \ + struct_ptr->cur_trans, \ + /* fail_return */ FAIL) + + H5C_JB_BJF__WRITE_OFFSET(struct_ptr, \ + eoa, \ + /* is_end_trans */ FALSE, \ + struct_ptr->cur_trans, \ + /* fail_return */ FAIL) + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* end H5C_jb_bjf__eoa */ + + +/****************************************************************************** + * + * Function: H5C_jb_bjf__journal_entry + * + * Programmer: John Mainzer + * + * Purpose: Verify that the specified transaction is open. Then + * write a binary journal file message to the ring buffer. + * + * Returns: SUCCEED on success. + * + ******************************************************************************/ + +static herr_t +H5C_jb_bjf__journal_entry(H5C_jbrb_t * struct_ptr, + uint64_t trans_num, + haddr_t base_addr, + size_t length, + const uint8_t * body) +{ + herr_t ret_value = SUCCEED; + + FUNC_ENTER_NOAPI(H5C_jb_bjf__journal_entry, FAIL) + + /* Check Arguments */ + HDassert(struct_ptr); + HDassert(struct_ptr->magic == H5C__H5C_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 ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "Transaction not in progress or bad transaction number.") + } /* end if */ + + H5C_JB_BJF__WRITE_SIG_AND_VER(struct_ptr, \ + H5C_BJNL__JOURNAL_ENTRY_SIG, \ + H5C_BJNL__JOURNAL_ENTRY_VER, \ + /* keep_chksum */ TRUE, \ + /* is_end_trans */ FALSE, \ + trans_num, \ + /* fail_return */ FAIL) + + H5C_JB_BJF__WRITE_TRANS_NUM(struct_ptr, \ + /* is_end_trans */ FALSE, \ + trans_num, \ + /* fail_return */ FAIL) + + H5C_JB_BJF__WRITE_OFFSET(struct_ptr, \ + base_addr, \ + /* is_end_trans */ FALSE, \ + trans_num, \ + /* fail_return */ FAIL) + + H5C_JB_BJF__WRITE_LENGTH(struct_ptr, \ + length, \ + /* is_end_trans */ FALSE, \ + trans_num, \ + /* fail_return */ FAIL) + + H5C_JB_BJF__WRITE_BUFFER(struct_ptr, \ + /* buf_size */ length, \ + /* buf_ptr */ (const char *)body, \ + /* is_end_trans */ FALSE, \ + trans_num, \ + /* fail_return */ FAIL) + + H5C_jb_BJF__WRITE_CHKSUM(struct_ptr, \ + /* is_end_trans */ FALSE, \ + trans_num, \ + /* fail_return */ FAIL) + + /* Indicate that at least one journal entry has been written under + * this transaction + */ + struct_ptr->jentry_written = TRUE; + + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_jb_bjf__journal_entry() */ + + +/****************************************************************************** + * + * Function: H5C_jb_bjf__start_transaction + * + * 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 is in progress. + * + * Returns: SUCCEED on success. + * + * Changes: None + * + ******************************************************************************/ + +static herr_t +H5C_jb_bjf__start_transaction(H5C_jbrb_t * struct_ptr, + uint64_t trans_num) + +{ + herr_t ret_value = SUCCEED; + + FUNC_ENTER_NOAPI(H5C_jb_bjf__start_transaction, FAIL) + + /* Check Arguments */ + HDassert(struct_ptr); + HDassert(struct_ptr->magic == H5C__H5C_JBRB_T_MAGIC); + HDassert(struct_ptr->human_readable == FALSE ); + + /* Verify that there is no transaction in progress */ + if ( struct_ptr->trans_in_prog != FALSE ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "Transaction already in progress.") + } /* end if */ + + /* Verify that the supplied transaction number greater than the last */ + if ( (struct_ptr->cur_trans) >= trans_num ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "New transaction out of sequence.") + } /* end if */ + + /* Verify that header message is present in journal file or ring buffer. + * If not, write it. + */ + if ( struct_ptr->header_present == FALSE ) { + + if ( H5C_jb__write_header_entry(struct_ptr) != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_jb__write_header_entry() failed.\n") + } + + } /* end if */ + + + /* Write start transaction message */ + H5C_JB_BJF__WRITE_SIG_AND_VER(struct_ptr, \ + H5C_BJNL__BEGIN_TRANS_SIG, \ + H5C_BJNL__BEGIN_TRANS_VER, \ + /* keep_chksum */ FALSE, \ + /* is_end_trans */ FALSE, \ + trans_num, \ + /* fail_return */ FAIL) + + H5C_JB_BJF__WRITE_TRANS_NUM(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 H5C_jb_bjf__start_transaction */ + + +/****************************************************************************** + * + * Function: H5C_jb_bjf__write_buf + * + * Programmer: John Mainzer + * 4/24/09 + * + * 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 + * supplied buffer directly into the ring buffer buffer + * and update its fields accordingly. + * + * If the supplied buffer will cross ring buffer buffer + * boundaries, for now just call + * H5C_jb__write_to_buffer(). + * + * In either case, if struct_ptr->chksum_cur_msg is TRUE, + * update struct_ptr->msg_chksum. + * + * Note that this function will probably prove to be + * a hot spot in profiling, so we should more or less + * plan on converting it into a macro at some point. + * + * Returns: SUCCEED on success. + * FAIL on failure. + * + * Changes: Updated to updated fields used only in the SIO case + * only when SIO is selected. + * JRM -- 1/14/10 + * + ******************************************************************************/ + +static herr_t +H5C_jb_bjf__write_buffer(H5C_jbrb_t * struct_ptr, + size_t buf_size, + const char * buf_ptr, + hbool_t is_end_trans, + uint64_t trans_num) +{ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5C_jb_bjf__write_buffer, FAIL) + + HDassert( struct_ptr != NULL ); + HDassert( struct_ptr->magic == H5C__H5C_JBRB_T_MAGIC ); + HDassert( buf_size > 0 ); + HDassert( buf_ptr != NULL ); + 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. + */ + + if ( ( is_end_trans ) && ( struct_ptr->chksum_cur_msg ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "is_end_trans and struct_ptr->chksum_cur_msg both true.") + } + + /* 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); + } + + if ( buf_size < struct_ptr->cur_buf_free_space ) { + + /* 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. + * + * 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 -- 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[buf_size]); + + /* update current buffer usage */ + struct_ptr->cur_buf_free_space -= 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 H5C_jb__write_to_buffer(). + * If this proves too costly, further optimizations will be necessary. + */ + + if ( H5C_jb__write_to_buffer(struct_ptr, buf_size, buf_ptr, + is_end_trans, trans_num) != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_jb__write_to_buffer() failed.") + } + } + + 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) + +} /* H5C_jb_bjf__write_buffer() */ + + +/****************************************************************************** + * + * Function: H5C_jb_bjf__write_chksum + * + * Programmer: John Mainzer + * 4/24/09 + * + * 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 + * the message -- not the signature and version. + * + * 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. + * + * If the chksum will cross ring buffer buffer boundaries, + * for now just call H5C_jb__write_to_buffer(). + * + * Note that this function will probably prove to be + * a hot spot in profiling, so we should more or less + * plan on converting it into a macro at some point. + * + * Returns: SUCCEED on success. + * FAIL on failure. + * + ******************************************************************************/ + +static herr_t +H5C_jb_bjf__write_chksum(H5C_jbrb_t * struct_ptr, + hbool_t is_end_trans, + uint64_t trans_num) +{ + uint8_t *p; + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5C_jb_bjf__write_chksum, FAIL) + + /* Sanity check */ + HDassert(struct_ptr != NULL); + HDassert(struct_ptr->magic == H5C__H5C_JBRB_T_MAGIC); + 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 ( H5C__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. + * + * 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 */ + + p = (uint8_t *)(struct_ptr->head); + + UINT32ENCODE(p, struct_ptr->msg_chksum); + + HDassert( p == ((uint8_t *)(struct_ptr->head + H5C__CHECKSUM_SIZE)) ); + + /* 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[H5C__CHECKSUM_SIZE]); + + /* update current buffer usage */ + struct_ptr->cur_buf_free_space -= H5C__CHECKSUM_SIZE; + + /* update fields used only with SIO: */ + if( ! struct_ptr->use_aio ) { + + /* update rb_free_space */ + struct_ptr->rb_free_space -= H5C__CHECKSUM_SIZE; + + /* update end of buffer space */ + struct_ptr->rb_space_to_rollover -= H5C__CHECKSUM_SIZE; + } + + if(is_end_trans) + (*struct_ptr->trans_tracking)[struct_ptr->put] = trans_num; + + HDassert( struct_ptr->cur_buf_free_space > 0 ); + + } /* end if */ + else { + + uint8_t buf[H5C__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 + * H5C_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[H5C__CHECKSUM_SIZE]) ); + + if ( H5C_jb__write_to_buffer(struct_ptr, + H5C__CHECKSUM_SIZE, + (const char *)buf, + is_end_trans, + trans_num) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_jb__write_to_buffer() failed.") + } + } /* end else */ + + /* re-set the checksum computation fields */ + struct_ptr->chksum_cur_msg = FALSE; + struct_ptr->msg_chksum = 0; + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_jb_bjf__write_chksum() */ + + +/****************************************************************************** + * + * Function: H5C_jb_bjf__write_length + * + * Programmer: John Mainzer + * 4/24/09 + * + * 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 binary representation of the length will + * touch buffer boundaries, create a buffer containing + * the binary representation of the length, and then + * call H5C_jb__write_to_buffer() to handle the write. + * + * In either case, if struct_ptr->chksum_cur_msg is TRUE, + * update struct_ptr->msg_chksum. + * + * Note that this function will probably prove to be + * a hot spot in profiling, so we should more or less + * plan on converting it into a macro at some point. + * + * Returns: SUCCEED on success. + * FAIL on failure. + * + * Changes: None. + * + ******************************************************************************/ + +static herr_t +H5C_jb_bjf__write_length(H5C_jbrb_t * struct_ptr, + size_t length, + hbool_t is_end_trans, + uint64_t trans_num) +{ + herr_t ret_value = SUCCEED; /* Return value */ + uint8_t * p; + size_t length_width; + + FUNC_ENTER_NOAPI(H5C_jb_bjf__write_length, FAIL) + + HDassert( struct_ptr != NULL ); + HDassert( struct_ptr->magic == H5C__H5C_JBRB_T_MAGIC ); + 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. + */ + + if ( ( is_end_trans ) && ( struct_ptr->chksum_cur_msg ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "is_end_trans and struct_ptr->chksum_cur_msg both true.") + } + + length_width = (size_t)(struct_ptr->length_width); + + 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. + * + * 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 */ + + p = (uint8_t *)(struct_ptr->head); + + switch ( length_width ) + { + case 2: + UINT16ENCODE(p, length); + break; + + case 4: + UINT32ENCODE(p, length); + break; + + case 8: + UINT64ENCODE(p, length); + break; + + default: + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "length_width out of range (1).") + break; + } + + HDassert( p == ((uint8_t *)(struct_ptr->head + length_width)) ); + + /* 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 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); + } + + /* update head pointer */ + struct_ptr->head = &(struct_ptr->head[length_width]); + + /* update current buffer usage */ + struct_ptr->cur_buf_free_space -= 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 + * H5C_jb__write_to_buffer(). If this proves too costly, + * further optimizations will be necessary. + */ + + uint8_t buf[17]; /* should be big enough for a long time. */ + + HDassert(length_width < sizeof(buf)); + p = buf; + switch(length_width) { + case 2: + UINT16ENCODE(p, length); + break; + + case 4: + UINT32ENCODE(p, length); + break; + + case 8: + UINT64ENCODE(p, length); + break; + + default: + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "length_width out of range (2).") + break; + } /* end switch */ + + HDassert( p == &(buf[length_width]) ); + + if ( H5C_jb__write_to_buffer(struct_ptr, length_width, + (const char *)buf, + is_end_trans, + trans_num) != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_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); + } + } /* end else */ + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_jb_bjf__write_length() */ + + +/****************************************************************************** + * + * Function: H5C_jb_bjf__write_offset + * + * Programmer: John Mainzer + * 4/24/09 + * + * 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 binary representation of the offset will + * touch buffer boundaries, create a buffer containing + * the binary representation of the offset, and then + * call H5C_jb__write_to_buffer() to handle the write. + * + * In either case, if struct_ptr->chksum_cur_msg is TRUE, + * update struct_ptr->msg_chksum. + * + * Note that this function will probably prove to be + * a hot spot in profiling, so we should more or less + * plan on converting it into a macro at some point. + * + * Returns: SUCCEED on success. + * FAIL on failure. + * + * Changes: None. + * + ******************************************************************************/ + +static herr_t +H5C_jb_bjf__write_offset(H5C_jbrb_t * struct_ptr, + haddr_t offset, + hbool_t is_end_trans, + uint64_t trans_num) +{ + herr_t ret_value = SUCCEED; /* Return value */ + uint8_t * p; + size_t offset_width; + + FUNC_ENTER_NOAPI(H5C_jb_bjf__write_offset, FAIL) + + HDassert( struct_ptr != NULL ); + HDassert( struct_ptr->magic == H5C__H5C_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 + * not used unless is_end_trans is TRUE, we make an exception for + * the eoa message. + */ + 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. + */ + + if ( ( is_end_trans ) && ( struct_ptr->chksum_cur_msg ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "is_end_trans and struct_ptr->chksum_cur_msg both true.") + } + + offset_width = (size_t)(struct_ptr->offset_width); + + 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. + * + * 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 */ + + p = (uint8_t *)(struct_ptr->head); + + switch ( offset_width ) + { + case 2: + UINT16ENCODE(p, offset); + break; + + case 4: + UINT32ENCODE(p, offset); + break; + + case 8: + UINT64ENCODE(p, offset); + break; + + default: + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "offset_width out of range (1).") + break; + } + + HDassert( p == ((uint8_t *)(struct_ptr->head + offset_width)) ); + + /* 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 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); + } + + /* update head pointer */ + struct_ptr->head = &(struct_ptr->head[offset_width]); + + /* update current buffer usage */ + struct_ptr->cur_buf_free_space -= 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 + * H5C_jb__write_to_buffer(). If this proves too costly, + * further optimizations will be necessary. + */ + + uint8_t buf[17]; /* should be big enough for a long time. */ + + HDassert( offset_width < 17 ) ; + + p = buf; + + switch ( offset_width ) + { + case 2: + UINT16ENCODE(p, offset); + break; + + case 4: + UINT32ENCODE(p, offset); + break; + + case 8: + UINT64ENCODE(p, offset); + break; + + default: + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "offset_width out of range (2).") + break; + } + + HDassert( p == &(buf[offset_width]) ); + + if ( H5C_jb__write_to_buffer(struct_ptr, offset_width, + (const char *)buf, + is_end_trans, trans_num) != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_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), + offset_width, + struct_ptr->msg_chksum); + } + + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_jb_bjf__write_offset() */ + + +/****************************************************************************** + * + * Function: H5C_jb_bjf__write_sig_and_ver + * + * 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 + * 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 the signature and version will cross buffer + * boundaries, for now just call + * H5C_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 + * signature and version. + * + * Note that this function will probably prove to be + * a hot spot in profiling, so we should more or less + * plan on converting it into a macro at some point. + * + * 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 +H5C_jb_bjf__write_sig_and_ver(H5C_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(H5C_jb_bjf__write_sig_and_ver, FAIL) + + HDassert( struct_ptr != NULL ); + HDassert( struct_ptr->magic == H5C__H5C_JBRB_T_MAGIC ); + HDassert( sig_ptr != NULL ); + HDassert( H5C_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 + * for the eoa message. + */ + HDassert((!is_end_trans) || (trans_num > 0)); + + if ( (H5C_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 + * majority of cases. + */ + + /* write the signature into journal buffer */ + HDmemcpy(struct_ptr->head, (const void *)sig_ptr, H5C_BJNL__SIG_LEN); + + struct_ptr->head[H5C_BJNL__SIG_LEN] = (char)version; + + /* update head pointer */ + struct_ptr->head = &(struct_ptr->head[H5C_BJNL__SIG_LEN + 1]); + + /* 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 current buffer usage */ + struct_ptr->cur_buf_free_space -= H5C_BJNL__SIG_LEN + 1; + + /* update fields used only with SIO: */ + if( ! struct_ptr->use_aio ) { + + /* update rb_free_space */ + struct_ptr->rb_free_space -= H5C_BJNL__SIG_LEN + 1; + + /* update end of buffer space */ + struct_ptr->rb_space_to_rollover -= H5C_BJNL__SIG_LEN + 1; + } + + /* 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.") + } + + HDassert( struct_ptr->cur_buf_free_space > 0 ); + + } /* end if */ + else { + + uint8_t buf[H5C_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 H5C_jb__write_to_buffer(). If this + * proves too costly, further optimizations will be necessary. + */ + + HDmemcpy(buf, (const void *)sig_ptr, H5C_BJNL__SIG_LEN); + + buf[H5C_BJNL__SIG_LEN] = version; + + if ( H5C_jb__write_to_buffer(struct_ptr, + H5C_BJNL__SIG_LEN + 1, + (const char *)buf, + is_end_trans, + trans_num) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_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 ( keep_chksum ) { + + struct_ptr->chksum_cur_msg = TRUE; + struct_ptr->msg_chksum = 0; + + } /* end if */ + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* end H5C_jb_bjf__write_sig_and_ver() */ + + +/****************************************************************************** + * + * Function: H5C_jb_bjf__write_trans_num() + * + * Programmer: John Mainzer + * 4/24/09 + * + * 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 transaction will cross or touch buffer + * boundaries, construct binary representation of the + * transaction number in a buffer, and pass it to + * H5C_jb__write_to_buffer(). + * + * In either case, if struct_ptr->chksum_cur_msg is TRUE, + * update struct_ptr->msg_chksum. + * + * Note that this function will probably prove to be + * a hot spot in profiling, so we should more or less + * plan on converting it into a macro at some point. + * + * Returns: SUCCEED on success. + * FAIL on failure. + * + * Changes: None. + * + ******************************************************************************/ + +static herr_t +H5C_jb_bjf__write_trans_num(H5C_jbrb_t * struct_ptr, + hbool_t is_end_trans, + uint64_t trans_num) +{ + herr_t ret_value = SUCCEED; /* Return value */ + uint8_t * p; + + FUNC_ENTER_NOAPI(H5C_jb_bjf__write_trans_num, FAIL) + + HDassert( struct_ptr != NULL ); + HDassert( struct_ptr->magic == H5C__H5C_JBRB_T_MAGIC ); + 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. + */ + + if ( ( is_end_trans ) && ( struct_ptr->chksum_cur_msg ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "is_end_trans and struct_ptr->chksum_cur_msg both true.") + } + + if ( H5C__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. + * + * 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 */ + p = (uint8_t *)(struct_ptr->head); + UINT64ENCODE(p, trans_num); + + HDassert( p == ((uint8_t *)(struct_ptr->head + H5C__TRANS_NUM_SIZE)) ); + + /* 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 the check sum if required */ + if ( struct_ptr->chksum_cur_msg ) { + + struct_ptr->msg_chksum = + H5_checksum_metadata((const void *)(struct_ptr->head), + H5C__TRANS_NUM_SIZE, + struct_ptr->msg_chksum); + } + + /* update head pointer */ + struct_ptr->head = &(struct_ptr->head[H5C__TRANS_NUM_SIZE]); + + /* update current buffer usage */ + struct_ptr->cur_buf_free_space -= H5C__TRANS_NUM_SIZE; + + /* update fields used only with SIO: */ + if( ! struct_ptr->use_aio ) { + + /* update rb_free_space */ + struct_ptr->rb_free_space -= H5C__TRANS_NUM_SIZE; + + /* update end of buffer space */ + struct_ptr->rb_space_to_rollover -= H5C__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 + * least, we will construct a buffer containing a binary representation + * of the transaction number, and then call H5C_jb__write_to_buffer(). + * If this proves too costly, further optimizations will be necessary. + */ + + uint8_t buf[H5C__TRANS_NUM_SIZE + 1]; + + p = buf; + + UINT64ENCODE(p, trans_num); + + HDassert( p == &(buf[H5C__TRANS_NUM_SIZE]) ); + + if ( H5C_jb__write_to_buffer(struct_ptr, + H5C__TRANS_NUM_SIZE, + (const char *)buf, + is_end_trans, + trans_num) != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_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), + H5C__TRANS_NUM_SIZE, + struct_ptr->msg_chksum); + } + + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_jb_bjf__write_trans_num() */ + + +/****************************************************************************** + * + * Function: H5C_jb__bin2hex + * + * Programmer: Mike McGreevy + * Tuesday, March 4, 2008 + * + * Purpose: Convert binary data into hexadecimal. + * + * Returns: SUCCEED on success. + * + ******************************************************************************/ + +herr_t +H5C_jb__bin2hex(const uint8_t * buf, + char * hexdata, + size_t * hexlength, + size_t buf_size) + +{ + size_t v; /* Local index variable */ + uint8_t c; + char * t; + + FUNC_ENTER_NOAPI_NOINIT_NOFUNC(H5C_jb__bin2hex) + + t = hexdata; + t[0] = ' '; + for (v = 0; v < buf_size; v++) { + + t = &hexdata[v * 3 + 1]; + c = buf[v]; + HDsnprintf(t, (size_t)3, "%02x ", c); + t[2] = ' '; + + } /* end for */ + + t[3] = '\n'; + t[4] = '\0'; + + * hexlength = v * 3 + 2; + + FUNC_LEAVE_NOAPI(SUCCEED) + +} /* end H5C_jb__bin2hex*/ + + +/****************************************************************************** + * + * Function: H5C_jb__comment + * + * Programmer: Mike McGreevy + * Wednesday, February 6, 2008 + * + * 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. + * + * The original version of this file has been renamed + * to H5C_jb_hrjf__comment(). + * + * JRM -- 4/2/09 + * + ******************************************************************************/ + +herr_t +H5C_jb__comment(H5C_jbrb_t * struct_ptr, + const char * comment_ptr) +{ + herr_t ret_value = SUCCEED; + + FUNC_ENTER_NOAPI(H5C_jb__comment, FAIL) + + /* Check Arguments */ + HDassert( struct_ptr != NULL ); + HDassert( struct_ptr->magic == H5C__H5C_JBRB_T_MAGIC ); + HDassert( comment_ptr != NULL ); + + if ( struct_ptr->human_readable ) { + + if ( H5C_jb_hrjf__comment(struct_ptr, comment_ptr) != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_jb_hrjf__comment() failed.") + } + } else { + + if ( H5C_jb_bjf__comment(struct_ptr, comment_ptr) != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_jb_bjf__comment() failed.") + } + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* end H5C_jb__comment */ + + +/***************************************************************************** + * + * Function: H5C_jb__end_transaction + * + * Programmer: Mike McGreevy + * Wednesday, February 6, 2008 + * + * Purpose: Verify that the supplied transaction is in progress, + * 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 + * transaction is in progress. + * + * 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. + * + * The original version of this file has been renamed + * to H5C_jb_hrjf__end_transaction(). + * + * JRM -- 4/2/09 + * + *****************************************************************************/ + +herr_t +H5C_jb__end_transaction(H5C_jbrb_t * struct_ptr, + uint64_t trans_num) +{ + herr_t ret_value = SUCCEED; + + FUNC_ENTER_NOAPI(H5C_jb__end_transaction, FAIL) + + /* Check Arguments */ + HDassert( struct_ptr ); + HDassert( struct_ptr->magic == H5C__H5C_JBRB_T_MAGIC ); + + if ( struct_ptr->human_readable ) { + + if ( H5C_jb_hrjf__end_transaction(struct_ptr, trans_num) != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_jb_hrjf__end_transaction() failed.") + } + } else { + + if ( H5C_jb_bjf__end_transaction(struct_ptr, trans_num) != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_jb_bjf__end_transaction() failed.") + } + } + + H5C__JBRB__UPDATE_STATS_FOR_TRANS_COMPLETED(struct_ptr); + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* end H5C_jb__end_transaction */ + + +/****************************************************************************** + * + * Function: H5C_jb__eoa + * + * Programmer: Mike McGreevy + * July 29, 2008 + * + * Purpose: Insert the supplied EOA into the journal file. + * + * 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. + * + * The original version of this file has been renamed + * to H5C_jb_hrjf__eoa(). + * + * JRM -- 4/2/09 + * + ******************************************************************************/ + +herr_t +H5C_jb__eoa(H5C_jbrb_t * struct_ptr, + haddr_t eoa) +{ + herr_t ret_value = SUCCEED; + + FUNC_ENTER_NOAPI(H5C_jb__eoa, FAIL) + + /* Check Arguments */ + HDassert( struct_ptr ); + HDassert( struct_ptr->magic == H5C__H5C_JBRB_T_MAGIC ); + HDassert( struct_ptr->hdf5_file_name ); + + if ( struct_ptr->human_readable ) { + + if ( H5C_jb_hrjf__eoa(struct_ptr, eoa) != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_jb_hrjf__eoa() failed.") + } + } else { + + if ( H5C_jb_bjf__eoa(struct_ptr, eoa) != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_jb_bjf__eoa() failed.") + } + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_jb__eoa() */ + + +/****************************************************************************** + * + * Function: H5C_jb__flush + * + * Programmer: John Mainzer -- 1/14/10 + * + * Purpose: Determine whether AIO is enabled, and then call the + * appropriate flush routine. + * + * Returns: SUCCEED on success. + * + ******************************************************************************/ + +herr_t +H5C_jb__flush(H5C_jbrb_t * struct_ptr) +{ + herr_t ret_value = SUCCEED; + + FUNC_ENTER_NOAPI(H5C_jb__flush, FAIL) + + /* Check Arguments */ + HDassert(struct_ptr); + HDassert(struct_ptr->magic == H5C__H5C_JBRB_T_MAGIC); + + /* 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->use_aio ) { + + ret_value = H5C_jb_aio__flush(struct_ptr); + + } else { + + ret_value = H5C_jb_sio__flush(struct_ptr); + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_jb__flush() */ + + +/****************************************************************************** + * + * Function: H5C_jb__get_last_transaction_on_disk + * + * Programmer: JRM -- 1/20/10 + * + * Purpose: Determine whether we are using aio for journal + * entry writes, and then call the appropriate + * function. + * + * Returns: SUCCEED on success. + * + ******************************************************************************/ + +herr_t +H5C_jb__get_last_transaction_on_disk(H5C_jbrb_t * struct_ptr, + uint64_t * trans_num_ptr) +{ + herr_t result; + herr_t ret_value = SUCCEED; + + FUNC_ENTER_NOAPI(H5C_jb__get_last_transaction_on_disk, FAIL) + + /* Check Arguments */ + HDassert( struct_ptr != NULL ); + HDassert( struct_ptr->magic == H5C__H5C_JBRB_T_MAGIC ); + HDassert( trans_num_ptr != NULL ); + + if ( struct_ptr->use_aio ) { + + result = H5C_jb_aio__get_last_transaction_on_disk(struct_ptr, + trans_num_ptr); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_jb_aio__get_last_transaction_on_disk failed") + } + + } else { + + result = H5C_jb_sio__get_last_transaction_on_disk(struct_ptr, + trans_num_ptr); + + if ( result != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_jb_sio__get_last_transaction_on_disk failed") + } + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* end H5C_jb__get_last_transaction_on_disk */ + + +/****************************************************************************** + * + * Function: H5C_jb_hrjf__comment + * + * Programmer: Mike McGreevy + * Wednesday, February 6, 2008 + * + * 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 H5C_jb__comment() to H5C_jb_hrjf__comment(). + * + * JRM -- 5/2/09 + * + ******************************************************************************/ + +static herr_t +H5C_jb_hrjf__comment(H5C_jbrb_t * struct_ptr, + const char * comment_ptr) +{ + char * temp = NULL; + size_t temp_len; + herr_t ret_value = SUCCEED; + + FUNC_ENTER_NOAPI(H5C_jb_hrjf__comment, FAIL) + + /* Check Arguments */ + HDassert(struct_ptr); + HDassert(comment_ptr); + HDassert(struct_ptr->magic == H5C__H5C_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. + */ + if ( struct_ptr->header_present == FALSE ) { + + if ( H5C_jb__write_header_entry(struct_ptr) != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_jb__write_header_entry() failed.\n") + } + + } /* end if */ + + temp_len = HDstrlen(comment_ptr) + 11; + + 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 ( H5C_jb__write_to_buffer(struct_ptr, + temp_len, + temp, + FALSE, + struct_ptr->cur_trans) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_jb__write_to_buffer() failed.\n") + } + +done: + + 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) + +} /* H5C_jb hrjf__comment() */ + + +/***************************************************************************** + * + * Function: H5C_jb_hrjf__end_transaction + * + * Programmer: Mike McGreevy + * Wednesday, February 6, 2008 + * + * Purpose: Verify that the supplied transaction is in progress, + * 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 + * transaction is in progress. + * + * Returns: SUCCEED on success. + * + * Changes: Renamed H5C_jb__end_transaction() to + * H5C_jb_hrjf__end_transaction(). + * JRM -- 5/2/09 + * + *****************************************************************************/ + +static herr_t +H5C_jb_hrjf__end_transaction(H5C_jbrb_t * struct_ptr, + uint64_t trans_num) +{ + char temp[25]; + herr_t ret_value = SUCCEED; + + FUNC_ENTER_NOAPI(H5C_jb_hrjf__end_transaction, FAIL) + + /* Check Arguments */ + HDassert(struct_ptr); + HDassert(struct_ptr->magic == H5C__H5C_JBRB_T_MAGIC); + + /* Verify that the supplied transaction is in progress */ + if ( ( struct_ptr->trans_in_prog != TRUE ) || + ( struct_ptr->cur_trans != trans_num ) ) { + + 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 + */ + if ( struct_ptr->jentry_written != TRUE ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "Empty transaction -- at least one journal entry required.") + } /* end if */ + + + /* Prepare end transaction message */ + HDsnprintf(temp, (size_t)25, "3 end_trans %llu\n", trans_num); + + /* Write end transaction message */ + if ( H5C_jb__write_to_buffer(struct_ptr, HDstrlen(temp), temp, + TRUE, trans_num ) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_jb__write_to_buffer() failed.\n") + } /* end if */ + + /* reset boolean flag indicating if at least one journal entry has + * been written under transaction + */ + struct_ptr->jentry_written = FALSE; + + /* Close current transaction */ + struct_ptr->trans_in_prog = FALSE; + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* end H5C_jb_hrjf__end_transaction */ + + +/****************************************************************************** + * + * Function: H5C_jb_hrjf__eoa + * + * Programmer: Mike McGreevy + * July 29, 2008 + * + * Purpose: Insert the supplied EOA into the journal file. + * + * Returns: SUCCEED on success. + * + * Changes: Renamed H5C_jb__eoa() to H5C_jb_hrjf__eoa(). + * JRM -- 5/2/09 + * + ******************************************************************************/ + +static herr_t +H5C_jb_hrjf__eoa(H5C_jbrb_t * struct_ptr, + haddr_t eoa) +{ + char temp[41]; + size_t temp_len = 41; + herr_t ret_value = SUCCEED; + + FUNC_ENTER_NOAPI(H5C_jb_hrjf__eoa, FAIL) + + /* Check Arguments */ + HDassert(struct_ptr); + HDassert(struct_ptr->magic == H5C__H5C_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. + */ + if ( struct_ptr->header_present == FALSE ) { + + if ( H5C_jb__write_header_entry(struct_ptr) != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_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 ( H5C_jb__write_to_buffer(struct_ptr, + HDstrlen(temp), + temp, + FALSE, + struct_ptr->cur_trans) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_jb__write_to_buffer() failed.\n") + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_jb_hrjf__eoa() */ + + +/****************************************************************************** + * + * Function: H5C_jb_hrjf__journal_entry + * + * Programmer: Mike McGreevy + * Wednesday, February 6, 2008 + * + * Purpose: Verify that the specified transaction is open. Then + * construct a journal entry recording the supplied base + * address, length, and body, and write it to the current + * journal buffer. + * + * Returns: SUCCEED on success. + * + * Changes: Renamed H5C_jb__journal_entry() to + * H5C_jb_hrjf__journal_entry(). + * JRM -- 5/2/09 + * + ******************************************************************************/ + +static herr_t +H5C_jb_hrjf__journal_entry(H5C_jbrb_t * struct_ptr, + uint64_t trans_num, + haddr_t base_addr, + size_t length, + const uint8_t * body) +{ + + char * temp = NULL; + char * hexdata = NULL; + size_t hexlength; + herr_t ret_value = SUCCEED; + uint8_t * bodydata; + + FUNC_ENTER_NOAPI(H5C_jb_hrjf__journal_entry, FAIL) + + /* Check Arguments */ + HDassert(struct_ptr != NULL); + HDassert(struct_ptr->magic == H5C__H5C_JBRB_T_MAGIC); + + /* Make a copy of body data */ + 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 ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "Transaction not in progress or bad transaction number.") + } /* end if */ + + if ( (temp = (char *)H5MM_malloc(length + 100)) == NULL ) { + + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \ + "allocation of assembly buffer failed."); + } + + 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, + (size_t)(length + 100), + "2 trans_num %llu length %zu base_addr 0x%lx body ", + trans_num, + length, + (unsigned long)base_addr); + + if ( H5C_jb__write_to_buffer(struct_ptr, + HDstrlen(temp), + temp, + FALSE, + trans_num) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_jb__write_to_buffer() failed.\n") + } /* end if */ + + /* Convert data from binary to hex */ + H5C_jb__bin2hex(bodydata, hexdata, &hexlength, length); + + if ( H5C_jb__write_to_buffer(struct_ptr, + hexlength, + hexdata, + FALSE, + trans_num) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_jb__write_to_buffer() failed.\n") + } /* end if */ + + /* Indicate that at least one journal entry has been written under + * this transaction + */ + if ( struct_ptr->jentry_written == FALSE ) { + + struct_ptr->jentry_written = TRUE; + } + +done: + + 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 = (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 = (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) + +} /* H5C_jb_hrjf__journal_entry() */ + + +/****************************************************************************** + * + * Function: H5C_jb_hrjf__start_transaction + * + * Programmer: Mike McGreevy + * 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, + * 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 H5C_jb__start_transaction() to + * H5C_jb_hrjf__start_transaction(). + * JRM -- 5/2/09 + * + ******************************************************************************/ + +static herr_t +H5C_jb_hrjf__start_transaction(H5C_jbrb_t * struct_ptr, + uint64_t trans_num) + +{ + char temp[150]; + herr_t ret_value = SUCCEED; + + FUNC_ENTER_NOAPI(H5C_jb_hrjf__start_transaction, FAIL) + + /* Check Arguments */ + HDassert( struct_ptr != NULL ); + HDassert( struct_ptr->magic == H5C__H5C_JBRB_T_MAGIC ); + + /* Verify that there is no transaction in progress */ + if ( struct_ptr->trans_in_prog != FALSE ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "Transaction already in progress.") + } /* end if */ + + /* Verify that the supplied transaction number greater than the last */ + if ( (struct_ptr->cur_trans) >= trans_num ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "New transaction out of sequence.") + } /* end if */ + + /* Verify that header message is present in journal file or ring buffer. + * If not, write it. + */ + if ( struct_ptr->header_present == FALSE ) { + + if ( H5C_jb__write_header_entry(struct_ptr) != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_jb__write_header_entry() failed.\n") + } + + } /* end if */ + + /* Write start transaction message */ + HDsnprintf(temp, (size_t)150, "1 bgn_trans %llu\n", trans_num); + + if ( H5C_jb__write_to_buffer(struct_ptr, + HDstrlen(temp), + temp, + FALSE, + trans_num) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_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) + +} /* H5C_jb_hrjf__start_transaction() */ + + +/****************************************************************************** + * + * Function: H5C_jb__init + * + * Programmer: Mike McGreevy + * Tuesday, February 5, 2008 + * + * Purpose: Initialize the supplied instance of H5C_jbrb_t as + * specified by the buf_size and num_bufs fields. Open the + * journal file whose name is supplied in journal_file_name + * for either synchronous or asynchronous I/O as specified + * by use_aio. + * + * Returns: SUCCEED on success. + * + * Changes: JRM -- 2/10/09 + * 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 + * 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 + * 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 + * H5C_jbrb_t. + * + * JRM -- 2/21/10 + * Added call to H5C_jb_stats__reset(); + * + ******************************************************************************/ + +herr_t +H5C_jb__init(H5C_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, + hbool_t human_readable, + size_t sizeof_addr, + size_t sizeof_size) +{ + int i; + herr_t ret_value = SUCCEED; + + FUNC_ENTER_NOAPI(H5C_jb__init, FAIL) + + /* Check Arguments */ + HDassert( struct_ptr ); + HDassert( HDF5_file_name ); + HDassert( journal_file_name ); + HDassert( buf_size > 0 ); + HDassert( num_bufs > 0 ); + HDassert( struct_ptr->magic == H5C__H5C_JBRB_T_MAGIC ); + + /* Initialize Fields of H5C_jbrb_t structure. Note that we will + * overwrite some of these initializations almost immediately. + */ + struct_ptr->journal_magic = journal_magic; + struct_ptr->journal_file_fd = -1; + 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 = H5C__JOURNAL_VERSION; + struct_ptr->get = 0; + struct_ptr->put = 0; + struct_ptr->jentry_written = FALSE; + struct_ptr->use_aio = use_aio; + struct_ptr->human_readable = human_readable; + struct_ptr->offset_width = (int)sizeof_addr; + struct_ptr->length_width = (int)sizeof_size; + struct_ptr->chksum_cur_msg = FALSE; + 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); + + if ( struct_ptr->jname == NULL ) { + + 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); + + if ( struct_ptr->jname == NULL ) { + + 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 = (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; +/* Comment this out to work on the Mac, currently */ +#if 0 + 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 */ +#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 = (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] = (char *) + H5MM_malloc(struct_ptr->buf_size * (size_t)(struct_ptr->num_bufs)); + + if ( (*struct_ptr->buf)[0] == NULL ) { + + HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, \ + "allocation of buffers failed."); + } /* end if */ + + /* Allocate space for the purposes of tracking the last + * transaction on disk + */ + 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; inum_bufs; i++) + { + (*struct_ptr->trans_tracking)[i] = 0; + } + + /* 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 * (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]; + + /* 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 ( H5C_jb_stats__reset(struct_ptr) != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_jb_stats__reset() failed.") + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* end H5C_jb__init */ + + +/****************************************************************************** + * + * Function: H5C_jb__journal_entry + * + * Programmer: Mike McGreevy + * Wednesday, February 6, 2008 + * + * Purpose: Verify that the specified transaction is open. Then + * construct a journal entry recording the supplied base + * address, length, and body, and write it to the current + * journal buffer. + * + * 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. + * + * The original version of this file has been renamed + * to H5C_jb_hrjf__journal_entry(). + * + * JRM -- 4/2/09 + * + ******************************************************************************/ + +herr_t +H5C_jb__journal_entry(H5C_jbrb_t * struct_ptr, + uint64_t trans_num, + haddr_t base_addr, + size_t length, + const uint8_t * body) +{ + herr_t ret_value = SUCCEED; + + FUNC_ENTER_NOAPI(H5C_jb__journal_entry, FAIL) + + /* Check Arguments */ + HDassert( struct_ptr != NULL ); + HDassert( struct_ptr->magic == H5C__H5C_JBRB_T_MAGIC ); + + if ( struct_ptr->human_readable ) { + + if ( H5C_jb_hrjf__journal_entry(struct_ptr, trans_num, base_addr, + length, body) != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_jb_hrjf__journal_entry() failed.") + } + } else { + + if ( H5C_jb_bjf__journal_entry(struct_ptr, trans_num, base_addr, + length, body) != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_jb_bjf__journal_entry() failed.") + } + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_jb__journal_entry() */ + + +/****************************************************************************** + * + * Function: H5C_jb_sio__flush + * + * Programmer: Mike McGreevy + * 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 H5C_jb__flush() to + * H5C_jb_sio__flush(). Added code to verify that + * SIO is selected. + * + * JRM -- 1/14/10 + * + ******************************************************************************/ + +static herr_t +H5C_jb_sio__flush(H5C_jbrb_t * struct_ptr) +{ + int result; + int i; + herr_t ret_value = SUCCEED; + + FUNC_ENTER_NOAPI(H5C_jb_sio__flush, FAIL) + + /* Check Arguments */ + HDassert(struct_ptr); + HDassert(struct_ptr->magic == H5C__H5C_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.") + } + + H5C__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 H5C_jb_sio__flush */ + + +/****************************************************************************** + * + * Function: H5C_jb_sio__flush_full_buffers + * + * Programmer: Mike McGreevy + * 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 H5C_jb__flush_full_buffers() to + * H5C_jb_sio__flush_full_buffers(). + * + * JRM -- 1/14/10 + * + ******************************************************************************/ + +static herr_t +H5C_jb_sio__flush_full_buffers(H5C_jbrb_t * struct_ptr) +{ + int result; + herr_t ret_value = SUCCEED; + + FUNC_ENTER_NOAPI(H5C_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 H5C_jb_sio__flush_full_buffers */ + + +/****************************************************************************** + * + * Function: H5C_jb_sio__get_last_transaction_on_disk + * + * Programmer: Mike McGreevy + * 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 + * + * H5C_jb__get_last_transaction_on_disk() + * + * to + * + * H5C_jb_sio__get_last_transaction_on_disk() + * + * and added some additional sanity checks. + * + * JRM -- 1/20/10 + * + ******************************************************************************/ + +static herr_t +H5C_jb_sio__get_last_transaction_on_disk(H5C_jbrb_t * struct_ptr, + uint64_t * trans_num_ptr) +{ + herr_t ret_value = SUCCEED; + + FUNC_ENTER_NOAPI(H5C_jb_sio__get_last_transaction_on_disk, FAIL) + + /* Check Arguments */ + HDassert( struct_ptr != NULL ); + HDassert( trans_num_ptr != NULL ); + HDassert( struct_ptr->magic == H5C__H5C_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.") + } + + H5C__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 H5C_jb_sio__get_last_transaction_on_disk */ + + +/****************************************************************************** + * + * Function: H5C_jb_sio__write_to_buffer + * + * Programmer: Mike McGreevy + * 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 + * H5C_jb__write_to_buffer() to + * H5C_jb_sio__write_to_buffer(). Added assert to + * verify that struct_ptr->use_aio is FALSE. + * + * JRM -- 1/14/10 + * + ******************************************************************************/ + +static herr_t +H5C_jb_sio__write_to_buffer(H5C_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(H5C_jb_sio__write_to_buffer, FAIL) + + /* Check Arguments */ + HDassert(struct_ptr); + HDassert(data); + HDassert(struct_ptr->magic == H5C__H5C_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; inum_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 ( H5C_jb_sio__flush_full_buffers(struct_ptr) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_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; iput+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 ( H5C_jb_sio__flush_full_buffers(struct_ptr) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_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 ( H5C_jb_sio__flush_full_buffers(struct_ptr) < 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_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 H5C_jb_sio__write_to_buffer */ + + +/****************************************************************************** + * + * Function: H5C_jb_stats__dump + * + * Programmer: JRM -- 2/21/20 + * + * Purpose: If H5C__JBRB__COLLECT_STATS is TRUE, dump the + * contents of the journal buffer ring buffer stats + * fields to stdout. + * + * If H5C__JBRB__COLLECT_STATS is FALSE, do nothing. + * + * Returns: void + * + * Changes: None. + * + ******************************************************************************/ + +herr_t +H5C_jb_stats__dump(H5C_jbrb_t * struct_ptr) +{ + herr_t ret_value = SUCCEED; /* Return value */ +#if H5C__JBRB__COLLECT_STATS + double calls_to_aio_error_per_async_sync_await = 0.0; +#endif /* H5C__JBRB__COLLECT_STATS */ + + FUNC_ENTER_NOAPI(H5C_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 != H5C__H5C_JBRB_T_MAGIC ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad struct_ptr on entry") + } + +#if H5C__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 /* H5C__JBRB__COLLECT_STATS */ + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_jb_stats__dump() */ + + +/****************************************************************************** + * + * Function: H5C_jb_stats__reset + * + * Programmer: JRM -- 2/21/20 + * + * Purpose: If H5C__JBRB__COLLECT_STATS is TRUE, reset the + * stats fields in the instance of H5C_jbrb_t + * pointed to by struct_ptr. + * + * If H5C__JBRB__COLLECT_STATS is FALSE, do nothing. + * + * Returns: void + * + * Changes: None. + * + ******************************************************************************/ + +herr_t +H5C_jb_stats__reset(H5C_jbrb_t * struct_ptr) +{ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(H5C_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 != H5C__H5C_JBRB_T_MAGIC ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "Bad struct_ptr") + } + +#if H5C__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 /* H5C__JBRB__COLLECT_STATS */ + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_jb_stats__reset() */ + + +/****************************************************************************** + * + * Function: H5C_jb__start_transaction + * + * Programmer: Mike McGreevy + * 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, + * 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: 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. + * + * The original version of this file has been renamed + * to H5C_jb_hrjf__start_transaction(). + * + * JRM -- 4/2/09 + * + ******************************************************************************/ + +herr_t +H5C_jb__start_transaction(H5C_jbrb_t * struct_ptr, + uint64_t trans_num) + +{ + herr_t ret_value = SUCCEED; + + FUNC_ENTER_NOAPI(H5C_jb__start_transaction, FAIL) + + /* Check Arguments */ + HDassert( struct_ptr != NULL ); + HDassert( struct_ptr->magic == H5C__H5C_JBRB_T_MAGIC ); + + if ( struct_ptr->human_readable ) { + + if ( H5C_jb_hrjf__start_transaction(struct_ptr, trans_num) + != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_jb_hrjf__start_transaction() failed.") + } + } else { + + if ( H5C_jb_bjf__start_transaction(struct_ptr, trans_num) + != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_jb_bjf__start_transaction() failed.") + } + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* H5C_jb__start_transaction() */ + + +/****************************************************************************** + * + * Function: H5C_jb__takedown + * + * Programmer: Mike McGreevy + * Thursday, February 7, 2008 + * + * 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 + * *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 H5C_jb_stats__dump(). + * + ******************************************************************************/ + +herr_t +H5C_jb__takedown(H5C_jbrb_t * struct_ptr) + +{ + herr_t ret_value = SUCCEED; + + FUNC_ENTER_NOAPI(H5C_jb__takedown, FAIL) + + /* Check Arguments */ + HDassert(struct_ptr); + HDassert(struct_ptr->magic == H5C__H5C_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 H5C__JBRB__DUMP_STATS_ON_TAKEDOWN + if ( H5C_jb_stats__dump(struct_ptr) != SUCCEED ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "H5C_jb_stats__dump() failed.") + } +#endif /* H5C__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 */ + + /* Verify that the journal file has been truncated */ + if (struct_ptr->journal_is_empty != TRUE) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "Attempt to takedown with journal file not truncated.") + } /* end if */ + + /* 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, "Journal file close failed.") + } /* end if */ + + if ( HDremove(struct_ptr->jname) < 0) { + + 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 = (char *)H5MM_xfree(struct_ptr->jname); + + if ( struct_ptr->jname != NULL ) { + + HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, \ + "free of jname failed."); + } + } + + if ( struct_ptr->hdf5_file_name != NULL ) { + + struct_ptr->hdf5_file_name = + (char *)H5MM_xfree(struct_ptr->hdf5_file_name); + + if ( struct_ptr->hdf5_file_name != NULL ) { + + HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, \ + "free of hdf5_file_name failed."); + } + } + + if ( (*struct_ptr->buf)[0] != NULL ) { + + (*struct_ptr->buf)[0] = (char *)H5MM_xfree((*struct_ptr->buf)[0]); + if ( (*struct_ptr->buf)[0] != NULL ) { + + HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, \ + "free of buffers failed."); + } + } + + if ( struct_ptr->buf != NULL ) { + + struct_ptr->buf = (char *((*)[]))H5MM_xfree(struct_ptr->buf); + if ( struct_ptr->buf != NULL ) { + + HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, \ + "free of buffer pointer array failed."); + } + } + + if ( struct_ptr->trans_tracking != NULL ) { + + struct_ptr->trans_tracking = + (uint64_t (*)[])H5MM_xfree(struct_ptr->trans_tracking); + + if ( struct_ptr->trans_tracking != NULL ) { + + HGOTO_ERROR(H5E_RESOURCE, H5E_CANTFREE, FAIL, \ + "free of transaction tracking array failed."); + } + } + + 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) + +} /* end H5C_jb__takedown */ + + +/****************************************************************************** + * + * Function: H5C_jb__trunc + * + * Programmer: Mike McGreevy + * Thursday, February 7, 2008 + * + * 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 +H5C_jb__trunc(H5C_jbrb_t * struct_ptr) + +{ + int i; + herr_t ret_value = SUCCEED; + + FUNC_ENTER_NOAPI(H5C_jb__trunc, FAIL) + + /* Check Arguments */ + HDassert(struct_ptr); + HDassert(struct_ptr->magic == H5C__H5C_JBRB_T_MAGIC); + + /* Verify that there is no transaction in progress */ + if ( struct_ptr->trans_in_prog != FALSE ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "Attempt to truncate journal file while transaction in progress.") + } /* end if */ + + /* Verify that the journal buffers are empty */ + if ( struct_ptr->bufs_in_use != 0 ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "Attempt to truncate with non-empty buffers.") + } /* end if */ + + /* Truncate the journal file */ + if ( HDftruncate(struct_ptr->journal_file_fd, (off_t)0) < 0 ) { + + HGOTO_ERROR(H5E_IO, H5E_SYNCFAIL, FAIL, "Jounal file truncate failed.") + } /* end if */ + + /* 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; inum_bufs; i++) + { + (*struct_ptr->trans_tracking)[i] = 0; + } + + if ( HDlseek(struct_ptr->journal_file_fd, (off_t)0, SEEK_SET) == (off_t)-1 ) + { + HGOTO_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "Jounal file seek failed.") + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* end H5C_jb__trunc */ + + +/****************************************************************************** + * + * Function: H5C_jb__write_header_entry + * + * Programmer: John Mainzer + * 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 + * 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 + * string with underscores. + * + * JRM -- 4/16/09 + * Updated function to include the offset and length + * sizes in the header if human_readable is FALSE. + * + ******************************************************************************/ + +herr_t +H5C_jb__write_header_entry(H5C_jbrb_t * struct_ptr) + +{ + herr_t ret_value = SUCCEED; + char *buf; + char * p; + char time_buf[32]; + int chars_written; + int i; + size_t file_name_len; + size_t buf_len; + time_t current_date; + + FUNC_ENTER_NOAPI(H5C_jb__write_header_entry, FAIL) + + /* Check Arguments */ + HDassert( struct_ptr ); + HDassert( struct_ptr->magic == H5C__H5C_JBRB_T_MAGIC ); + HDassert( struct_ptr->hdf5_file_name != NULL ); + HDassert( struct_ptr->header_present == FALSE ); + HDassert( struct_ptr->journal_is_empty == TRUE ); + + file_name_len = HDstrlen(struct_ptr->hdf5_file_name); + + HDassert( file_name_len > 0 ); + + buf_len = file_name_len + 256; + + /* Allocate space for journal buffers */ + 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); + + /* load ascii representation of current_date into time_buf[], + * replacing white space with underscores. + */ + time_buf[31] = '\0'; /* just to be safe */ + + if ( (p = HDctime(¤t_date)) == NULL ) { + + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "Can't get ascii representation of current date.") + + } else { + + /* copy the string into time_buf, replacing white space with + * underscores. + * + * Do this to make parsing the header easier. + */ + i = 0; + + while ( ( i < 31 ) && ( *p != '\0' ) ) { + + if ( isspace(*p) ) { + + time_buf[i] = '_'; + + } else { + + time_buf[i] = *p; + } + + i++; + p++; + } + + time_buf[i] = '\0'; + } + + /* Format the header message in the temporary buffer */ + + if ( struct_ptr->human_readable ) { + + chars_written = + HDsnprintf(buf, + buf_len - 1, + "0 %s %ld %s %s %s %d %s %10.10s %s %d\n", + H5C_JNL__VER_NUM_TAG, + struct_ptr->jvers, + H5C_JNL__TGT_FILE_NAME_TAG, + struct_ptr->hdf5_file_name, + H5C_JNL__JNL_MAGIC_TAG, + (int)(struct_ptr->journal_magic), + H5C_JNL__CREATION_DATE_TAG, + time_buf, + H5C_JNL__HUMAN_READABLE_TAG, + struct_ptr->human_readable); + + } else { + + /* 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 + * + * 2) If we included it anyway, we would have to update the + * tests for the human readable journal file code. + */ + + chars_written = + HDsnprintf(buf, + buf_len - 1, + "0 %s %ld %s %s %s %d %s %10.10s %s %d %s %d %s %d\n", + H5C_JNL__VER_NUM_TAG, + struct_ptr->jvers, + H5C_JNL__TGT_FILE_NAME_TAG, + struct_ptr->hdf5_file_name, + H5C_JNL__JNL_MAGIC_TAG, + (int)(struct_ptr->journal_magic), + H5C_JNL__CREATION_DATE_TAG, + time_buf, + H5C_JNL__HUMAN_READABLE_TAG, + struct_ptr->human_readable, + H5C_JNL__OFFSET_WIDTH_TAG, + struct_ptr->offset_width, + H5C_JNL__LENGTH_WIDTH_TAG, + struct_ptr->length_width); + + } + + if ( chars_written >= (int)(buf_len - 1) ) { + + HGOTO_ERROR(H5E_RESOURCE, H5E_CANTCOPY, FAIL, \ + "tried to overwrite buffer."); + } + + HDassert( HDstrlen(buf) < buf_len ); + + /* Write the header message into the ring buffer */ + if ( H5C_jb__write_to_buffer(struct_ptr, HDstrlen(buf), buf, FALSE, + (uint64_t)0) < 0) { +#if 1 /* JRM */ + HDfprintf(stdout, "%s: H5C_jb__write_to_buffer() failed.\n", FUNC); +#endif /* JRM */ + HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ + "H5C_jb__write_to_buffer() failed.\n") + } /* end if */ + + /* Update boolean flags */ + struct_ptr->header_present = TRUE; + struct_ptr->journal_is_empty = FALSE; + +done: + + 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 H5C_jb__write_header_entry() */ + + +/****************************************************************************** + * + * Function: H5C_jb__write_to_buffer + * + * Programmer: John Mainzer + * 1/14/10 + * + * Purpose: Test to see whether AIO is enabled, and the + * call the appropriate version of the function. + * + * At some point we may wish to replace this switch + * function with a function pointer in struct H5C_jbrb_t. + * + * Returns: SUCCEED on success. + * + ******************************************************************************/ + +herr_t +H5C_jb__write_to_buffer(H5C_jbrb_t * struct_ptr, + size_t size, + const char * data, + hbool_t is_end_trans, + uint64_t trans_num) +{ + herr_t ret_value = SUCCEED; + + FUNC_ENTER_NOAPI(H5C_jb__write_to_buffer, FAIL) + + /* Check Arguments */ + if ( ( struct_ptr == NULL ) || + ( struct_ptr->magic != H5C__H5C_JBRB_T_MAGIC ) ) { + + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, \ + "bad struct_ptr on entry.") + } + + if ( struct_ptr->use_aio ) { + + ret_value = H5C_jb_aio__write_to_buffer(struct_ptr, + size, + data, + is_end_trans, + trans_num); + + } else { + + ret_value = H5C_jb_sio__write_to_buffer(struct_ptr, + size, + data, + is_end_trans, + trans_num); + + } + +done: + + FUNC_LEAVE_NOAPI(ret_value) + +} /* end H5C_jb__write_to_buffer */ + diff --git a/src/H5Cpkg.h b/src/H5Cpkg.h new file mode 100644 index 0000000..08581e6 --- /dev/null +++ b/src/H5Cpkg.h @@ -0,0 +1,4924 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * Copyright by the Board of Trustees of the University of Illinois. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * Programmer: John Mainzer -- 10/12/04 + * + * Purpose: This file contains declarations which are normally visible + * only within the H5C package. + * + * Source files outside the H5C package should include + * H5Cprivate.h instead. + * + * The one exception to this rule is test/cache.c. The test + * code is easier to write if it can look at the cache's + * internal data structures. Indeed, this is the main + * reason why this file was created. + */ + +#ifndef H5C_PACKAGE +#error "Do not include this file outside the H5C package!" +#endif + +#ifndef _H5Cpkg_H +#define _H5Cpkg_H + +#include +#include +#include + + +/* Get package's private header */ +#include "H5Cprivate.h" + + +/* Get needed headers */ +#include "H5SLprivate.h" /* Skip lists */ + + +/****************************************************************************** + * + * Structure: H5C_jbrb_sync_q_entry_t + * + * Programmer: John Mainzer + * 2/6/10 + * + * Purpose: Instances of the H5C_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 + * H5C__H5C_JBRB_SYNC_Q_T_MAGIC. This field is used + * to validate pointers to instances of + * H5C_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 + * H5C_jbrb_sync_q_entry_t in the list of same, + * or NULL if there is no next instance. + * + ******************************************************************************/ + +#define H5C__H5C_JBRB_SYNC_Q_T_MAGIC (unsigned)0x00DA030 + +struct H5C_jbrb_sync_q_entry_t +{ + uint32_t magic; + uint64_t last_trans_in_sync; + struct aiocb ctl_blk; + struct H5C_jbrb_sync_q_entry_t * next; +}; + +/****************************************************************************** + * + * Structure: H5C_jbrb_t + * + * Programmer: Mike McGreevy + * Tuesday, February 5, 2008 + * + * Purpose: Instances of the H5C_jbrb_t structure are used to + * implement a ring buffer of journal buffers. This + * structure is used in association with HDF5 File + * Recovery. It is used to journal metadata cache + * changes in an effort to be able to reproduce + * actions in the event of a crash during data writing. + * + * The fields of this structure are discussed below: + * + * + * magic: Unsigned 32-bit integer always set to + * H5C__H5C_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 + * journal, and refuse to run the journal if it does + * not. + * + * 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 + * must be at least 2 in the asynchronous case (one for + * storing journal entries as they are accumulated, and + * 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. + * + * 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 + * journal buffer). + * + * put: Number of the journal buffer that is currently being + * written to. + * + * jentry_written: Boolean flag that indiciates if a journal entry has + * been written under the current transaction. + * + * use_aio: Boolean flag that indicates whether synchronous or + * asynchronous writes will be used. + * + * 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 + * 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 + * 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 + * message checksum to date is stored in the msg_chksum + * (discussed below). + * + * 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. + * + * msg_chksum: uint32_t used to compile the checksum of a binary + * 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. + * + * 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. + * + * 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. + * + * cur_buf_free_space: The amount of space remaining in the currently active + * journal buffer. This is used to determine when the + * 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 + * 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. + * + * trans_tracking: An array of size num_bufs that reports the last + * transaction successfully written into each buffer. This + * 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 + * 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 + * H5C__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 + * H5C_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 H5C__H5C_JBRB_T_MAGIC (unsigned)0x00D0A03 +#define H5C__JOURNAL_VERSION 1 +#define H5C__JBRB__COLLECT_STATS 0 +#define H5C__JBRB__DUMP_STATS_ON_TAKEDOWN 0 + +/* tags used to mark entries in the journal file header */ +#define H5C_JNL__VER_NUM_TAG "ver_num" +#define H5C_JNL__TGT_FILE_NAME_TAG "target_file_name" +#define H5C_JNL__JNL_MAGIC_TAG "journal_magic" +#define H5C_JNL__CREATION_DATE_TAG "creation_date" +#define H5C_JNL__HUMAN_READABLE_TAG "human_readable" +#define H5C_JNL__OFFSET_WIDTH_TAG "offset_width" +#define H5C_JNL__LENGTH_WIDTH_TAG "length_width" + +/* signatures and versions used to mark the beginnings of journal file + * messages in binary journal files. + */ + +#define H5C_BJNL__SIG_LEN ((size_t)(4)) +#define H5C_BJNL__BEGIN_TRANS_SIG "btrn" +#define H5C_BJNL__BEGIN_TRANS_VER ((uint8_t)(0)) +#define H5C_BJNL__JOURNAL_ENTRY_SIG "jent" +#define H5C_BJNL__JOURNAL_ENTRY_VER ((uint8_t)(0)) +#define H5C_BJNL__END_TRANS_SIG "etrn" +#define H5C_BJNL__END_TRANS_VER ((uint8_t)(0)) +#define H5C_BJNL__END_ADDR_SPACE_SIG "eoas" +#define H5C_BJNL__END_ADDR_SPACE_VER ((uint8_t)(0)) + +struct H5C_jbrb_t +{ + 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 H5C_jbrb_sync_q_entry_t * aio_sync_q_head; + struct H5C_jbrb_sync_q_entry_t * aio_sync_q_tail; + uint64_t aio_sync_q_len; + char *((*buf)[]); +#if H5C__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 /* H5C__JBRB__COLLECT_STATS */ +}; + + +/* 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 H5C__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 + * Quincey. I have applied a fudge factor of 2. + * + * -- JRM + */ + +#define H5C__MAX_PASSES_ON_FLUSH 4 + + +/**************************************************************************** + * + * structure H5C_mdjsc_record_t + * + * A dynamically allocate array of instances of H5C_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: + * + * fcn_ptr: Pointer to the instance of H5C_mdj_status_change_func_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 + * 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 + * 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 + * if the entry is in use. + * + ****************************************************************************/ + +typedef struct H5C_mdjsc_record_t +{ + H5C_mdj_status_change_func_t fcn_ptr; + void * data_ptr; + int32_t fl_next; +} H5C_mdjsc_record_t; + + +/**************************************************************************** + * + * structure H5C_t + * + * Catchall structure for all variables specific to an instance of the cache. + * + * While the individual fields of the structure are discussed below, the + * following overview may be helpful. + * + * Entries in the cache are stored in an instance of H5TB_TREE, indexed on + * the entry's disk address. While the H5TB_TREE is less efficient than + * hash table, it keeps the entries in address sorted order. As flushes + * in parallel mode are more efficient if they are issued in increasing + * address order, this is a significant benefit. Also the H5TB_TREE code + * was readily available, which reduced development time. + * + * While the cache was designed with multiple replacement policies in mind, + * at present only a modified form of LRU is supported. + * + * JRM - 4/26/04 + * + * Profiling has indicated that searches in the instance of H5TB_TREE are + * too expensive. To deal with this issue, I have augmented the cache + * with a hash table in which all entries will be stored. Given the + * advantages of flushing entries in increasing address order, the TBBT + * is retained, but only dirty entries are stored in it. At least for + * now, we will leave entries in the TBBT after they are flushed. + * + * Note that index_size and index_len now refer to the total size of + * and number of entries in the hash table. + * + * JRM - 7/19/04 + * + * The TBBT has since been replaced with a skip list. This change + * greatly predates this note. + * + * JRM - 9/26/05 + * + * magic: Unsigned 32 bit integer always set to H5C__H5C_T_MAGIC. + * This field is used to validate pointers to instances of + * H5C_t. + * + * 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 + * to record cache operations for use in simulations and design + * studies. This field will usually be NULL, indicating that + * 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 + * H5C. Instead, H5AC reads the trace_file_ptr as needed. + * + * When we get to using H5C in other places, we may add + * code to write trace file data at the H5C level as well. + * + * aux_ptr: Pointer to void used to allow wrapper code to associate + * its data with an instance of H5C_t. The H5C cache code + * sets this field to NULL, and otherwise leaves it alone. + * + * max_type_id: Integer field containing the maximum type id number assigned + * to a type of entry in the cache. All type ids from 0 to + * max_type_id inclusive must be defined. The names of the + * types are stored in the type_name_table discussed below, and + * indexed by the ids. + * + * type_name_table_ptr: Pointer to an array of pointer to char of length + * max_type_id + 1. The strings pointed to by the entries + * in the array are the names of the entry types associated + * with the indexing type IDs. + * + * max_cache_size: Nominal maximum number of bytes that may be stored in the + * cache. This value should be viewed as a soft limit, as the + * cache can exceed this value under the following circumstances: + * + * a) All entries in the cache are protected, and the cache is + * asked to insert a new entry. In this case the new entry + * will be created. If this causes the cache to exceed + * max_cache_size, it will do so. The cache will attempt + * to reduce its size as entries are unprotected. + * + * b) When running in parallel mode, the cache may not be + * permitted to flush a dirty entry in response to a read. + * If there are no clean entries available to evict, the + * cache will exceed its maximum size. Again the cache + * will attempt to reduce its size to the max_cache_size + * limit on the next cache write. + * + * c) When an entry increases in size, the cache may exceed + * the max_cache_size limit until the next time the cache + * attempts to load or insert an entry. + * + * min_clean_size: Nominal minimum number of clean bytes in the cache. + * The cache attempts to maintain this number of bytes of + * clean data so as to avoid case b) above. Again, this is + * a soft limit. + * + * + * In addition to the call back functions required for each entry, the + * cache requires the following call back functions for this instance of + * the cache as a whole: + * + * check_write_permitted: In certain applications, the cache may not + * be allowed to write to disk at certain time. If specified, + * the check_write_permitted function is used to determine if + * a write is permissible at any given point in time. + * + * If no such function is specified (i.e. this field is NULL), + * the cache uses the following write_permitted field to + * determine whether writes are permitted. + * + * write_permitted: If check_write_permitted is NULL, this boolean flag + * indicates whether writes are permitted. + * + * log_flush: If provided, this function is called whenever a dirty + * entry is flushed to disk. + * + * + * In cases where memory is plentiful, and performance is an issue, it + * is useful to disable all cache evictions, and thereby postpone metadata + * 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 + * 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. + * + * + * The cache requires an index to facilitate searching for entries. The + * following fields support that index. + * + * index_len: Number of entries currently in the hash table used to index + * the cache. + * + * index_size: Number of bytes of cache entries currently stored in the + * hash table used to index the cache. + * + * This value should not be mistaken for footprint of the + * cache in memory. The average cache entry is small, and + * the cache has a considerable overhead. Multiplying the + * index_size by two should yield a conservative estimate + * of the cache's memory footprint. + * + * index: Array of pointer to H5C_cache_entry_t of size + * H5C__HASH_TABLE_LEN. At present, this value is a power + * of two, not the usual prime number. + * + * I hope that the variable size of cache elements, the large + * hash table size, and the way in which HDF5 allocates space + * will combine to avoid problems with periodicity. If so, we + * can use a trivial hash function (a bit-and and a 3 bit left + * shift) with some small savings. + * + * If not, it will become evident in the statistics. Changing + * to the usual prime number length hash table will require + * changing the H5C__HASH_FCN macro and the deletion of the + * H5C__HASH_MASK #define. No other changes should be required. + * + * + * When we flush the cache, we need to write entries out in increasing + * address order. An instance of a skip list is used to store dirty entries in + * sorted order. Whether it is cheaper to sort the dirty entries as needed, + * or to maintain the list is an open question. At a guess, it depends + * on how frequently the cache is flushed. We will see how it goes. + * + * For now at least, I will not remove dirty entries from the list as they + * are flushed. (this has been changed -- dirty entries are now removed from + * the skip list as they are flushed. JRM - 10/25/05) + * + * slist_len: Number of entries currently in the skip list + * used to maintain a sorted list of dirty entries in the + * cache. + * + * slist_size: Number of bytes of cache entries currently stored in the + * skip list used to maintain a sorted list of + * dirty entries in the cache. + * + * slist_ptr: pointer to the instance of H5SL_t used maintain a sorted + * list of dirty entries in the cache. This sorted list has + * two uses: + * + * a) It allows us to flush dirty entries in increasing address + * order, which results in significant savings. + * + * b) It facilitates checking for adjacent dirty entries when + * attempting to evict entries from the cache. While we + * don't use this at present, I hope that this will allow + * some optimizations when I get to it. + * + * With the addition of the fractal heap, the cache must now deal with + * the case in which entries may be dirtied, renamed, or have their sizes + * changed during a flush. To allow sanity checks in this situation, the + * following two fields have been added. They are only compiled in when + * H5C_DO_SANITY_CHECKS is TRUE. + * + * 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 + * to the slist since the last time this field was set to + * zero. + * + * + * When a cache entry is protected, it must be removed from the LRU + * list(s) as it cannot be either flushed or evicted until it is unprotected. + * The following fields are used to implement the protected list (pl). + * + * pl_len: Number of entries currently residing on the protected list. + * + * pl_size: Number of bytes of cache entries currently residing on the + * protected list. + * + * pl_head_ptr: Pointer to the head of the doubly linked list of protected + * entries. Note that cache entries on this list are linked + * by their next and prev fields. + * + * This field is NULL if the list is empty. + * + * pl_tail_ptr: Pointer to the tail of the doubly linked list of protected + * entries. Note that cache entries on this list are linked + * by their next and prev fields. + * + * This field is NULL if the list is empty. + * + * + * For very frequently used entries, the protect/unprotect overhead can + * become burdensome. To avoid this overhead, I have modified the cache + * to allow entries to be "pinned". A pinned entry is similar to a + * protected entry, in the sense that it cannot be evicted, and that + * the entry can be modified at any time. + * + * Pinning an entry has the following implications: + * + * 1) A pinned entry cannot be evicted. Thus unprotected + * pinned entries reside in the pinned entry list, instead + * of the LRU list(s) (or other lists maintained by the current + * replacement policy code). + * + * 2) A pinned entry can be accessed or modified at any time. + * Therefore, the cache must check with the entry owner + * before flushing it. If permission is denied, the + * cache just skips the entry in the flush. + * + * 3) A pinned entry can be marked as dirty (and possibly + * change size) while it is unprotected. + * + * 4) The flush-destroy code must allow pinned entries to + * be unpinned (and possibly unprotected) during the + * flush. + * + * Since pinned entries cannot be evicted, they must be kept on a pinned + * entry list, instead of being entrusted to the replacement policy code. + * + * Maintaining the pinned entry list requires the following fields: + * + * pel_len: Number of entries currently residing on the pinned + * entry list. + * + * pel_size: Number of bytes of cache entries currently residing on + * the pinned entry list. + * + * pel_head_ptr: Pointer to the head of the doubly linked list of pinned + * but not protected entries. Note that cache entries on + * this list are linked by their next and prev fields. + * + * This field is NULL if the list is empty. + * + * pel_tail_ptr: Pointer to the tail of the doubly linked list of pinned + * but not protected entries. Note that cache entries on + * this list are linked by their next and prev fields. + * + * This field is NULL if the list is empty. + * + * + * The cache must have a replacement policy, and the fields supporting this + * policy must be accessible from this structure. + * + * While there has been interest in several replacement policies for + * this cache, the initial development schedule is tight. Thus I have + * elected to support only a modified LRU policy for the first cut. + * + * To further simplify matters, I have simply included the fields needed + * by the modified LRU in this structure. When and if we add support for + * other policies, it will probably be easiest to just add the necessary + * fields to this structure as well -- we only create one instance of this + * structure per file, so the overhead is not excessive. + * + * + * Fields supporting the modified LRU policy: + * + * See most any OS text for a discussion of the LRU replacement policy. + * + * When operating in parallel mode, we must ensure that a read does not + * cause a write. If it does, the process will hang, as the write will + * be collective and the other processes will not know to participate. + * + * To deal with this issue, I have modified the usual LRU policy by adding + * clean and dirty LRU lists to the usual LRU list. + * + * The clean LRU list is simply the regular LRU list with all dirty cache + * entries removed. + * + * Similarly, the dirty LRU list is the regular LRU list with all the clean + * cache entries removed. + * + * When reading in parallel mode, we evict from the clean LRU list only. + * This implies that we must try to ensure that the clean LRU list is + * reasonably well stocked at all times. + * + * We attempt to do this by trying to flush enough entries on each write + * to keep the cLRU_list_size >= min_clean_size. + * + * Even if we start with a completely clean cache, a sequence of protects + * without unprotects can empty the clean LRU list. In this case, the + * cache must grow temporarily. At the next write, we will attempt to + * evict enough entries to reduce index_size to less than max_cache_size. + * While this will usually be possible, all bets are off if enough entries + * are protected. + * + * Discussions of the individual fields used by the modified LRU replacement + * policy follow: + * + * LRU_list_len: Number of cache entries currently on the LRU list. + * + * Observe that LRU_list_len + pl_len must always equal + * index_len. + * + * LRU_list_size: Number of bytes of cache entries currently residing on the + * LRU list. + * + * Observe that LRU_list_size + pl_size must always equal + * index_size. + * + * LRU_head_ptr: Pointer to the head of the doubly linked LRU list. Cache + * entries on this list are linked by their next and prev fields. + * + * This field is NULL if the list is empty. + * + * LRU_tail_ptr: Pointer to the tail of the doubly linked LRU list. Cache + * entries on this list are linked by their next and prev fields. + * + * This field is NULL if the list is empty. + * + * cLRU_list_len: Number of cache entries currently on the clean LRU list. + * + * Observe that cLRU_list_len + dLRU_list_len must always + * equal LRU_list_len. + * + * cLRU_list_size: Number of bytes of cache entries currently residing on + * the clean LRU list. + * + * Observe that cLRU_list_size + dLRU_list_size must always + * equal LRU_list_size. + * + * cLRU_head_ptr: Pointer to the head of the doubly linked clean LRU list. + * Cache entries on this list are linked by their aux_next and + * aux_prev fields. + * + * This field is NULL if the list is empty. + * + * cLRU_tail_ptr: Pointer to the tail of the doubly linked clean LRU list. + * Cache entries on this list are linked by their aux_next and + * aux_prev fields. + * + * This field is NULL if the list is empty. + * + * dLRU_list_len: Number of cache entries currently on the dirty LRU list. + * + * Observe that cLRU_list_len + dLRU_list_len must always + * equal LRU_list_len. + * + * dLRU_list_size: Number of cache entries currently on the dirty LRU list. + * + * Observe that cLRU_list_len + dLRU_list_len must always + * equal LRU_list_len. + * + * dLRU_head_ptr: Pointer to the head of the doubly linked dirty LRU list. + * Cache entries on this list are linked by their aux_next and + * aux_prev fields. + * + * This field is NULL if the list is empty. + * + * dLRU_tail_ptr: Pointer to the tail of the doubly linked dirty LRU list. + * Cache entries on this list are linked by their aux_next and + * aux_prev fields. + * + * This field is NULL if the list is empty. + * + * + * Automatic cache size adjustment: + * + * While the default cache size is adequate for most cases, we can run into + * cases where the default is too small. Ideally, we will let the user + * adjust the cache size as required. However, this is not possible in all + * cases. Thus I have added automatic cache size adjustment code. + * + * The configuration for the automatic cache size adjustment is stored in + * the structure described below: + * + * size_increase_possible: Depending on the configuration data given + * in the resize_ctl field, it may or may not be possible + * to increase the size of the cache. Rather than test for + * all the ways this can happen, we simply set this flag when + * we receive a new configuration. + * + * flash_size_increase_possible: Depending on the configuration data given + * in the resize_ctl field, it may or may not be possible + * for a flash size increase to occur. We set this flag + * whenever we receive a new configuration so as to avoid + * repeated calculations. + * + * flash_size_increase_threshold: If a flash cache size increase is possible, + * this field is used to store the minimum size of a new entry + * or size increase needed to trigger a flash cache size + * increase. Note that this field must be updated whenever + * the size of the cache is changed. + * + * size_decrease_possible: Depending on the configuration data given + * in the resize_ctl field, it may or may not be possible + * to decrease the size of the cache. Rather than test for + * all the ways this can happen, we simply set this flag when + * we receive a new configuration. + * + * cache_full: Boolean flag used to keep track of whether the cache is + * full, so we can refrain from increasing the size of a + * cache which hasn't used up the space alotted to it. + * + * The field is initialized to FALSE, and then set to TRUE + * whenever we attempt to make space in the cache. + * + * resize_enabled: This is another convenience flag which is set whenever + * a new set of values for resize_ctl are provided. Very + * simply, + * + * resize_enabled = size_increase_possible || + * size_decrease_possible; + * + * size_decreased: Boolean flag set to TRUE whenever the maximun cache + * size is decreased. The flag triggers a call to + * H5C_make_space_in_cache() on the next call to H5C_protect(). + * + * resize_ctl: Instance of H5C_auto_size_ctl_t containing configuration + * data for automatic cache resizing. + * + * epoch_markers_active: Integer field containing the number of epoch + * markers currently in use in the LRU list. This value + * must be in the range [0, H5C__MAX_EPOCH_MARKERS - 1]. + * + * epoch_marker_active: Array of boolean of length H5C__MAX_EPOCH_MARKERS. + * This array is used to track which epoch markers are currently + * in use. + * + * epoch_marker_ringbuf: Array of int of length H5C__MAX_EPOCH_MARKERS + 1. + * + * To manage the epoch marker cache entries, it is necessary + * to track their order in the LRU list. This is done with + * epoch_marker_ringbuf. When markers are inserted at the + * head of the LRU list, the index of the marker in the + * epoch_markers array is inserted at the tail of the ring + * buffer. When it becomes the epoch_marker_active'th marker + * in the LRU list, it will have worked its way to the head + * of the ring buffer as well. This allows us to remove it + * without scanning the LRU list if such is required. + * + * epoch_marker_ringbuf_first: Integer field containing the index of the + * first entry in the ring buffer. + * + * epoch_marker_ringbuf_last: Integer field containing the index of the + * last entry in the ring buffer. + * + * epoch_marker_ringbuf_size: Integer field containing the number of entries + * in the ring buffer. + * + * epoch_markers: Array of instances of H5C_cache_entry_t of length + * H5C__MAX_EPOCH_MARKERS. The entries are used as markers + * in the LRU list to identify cache entries that haven't + * been accessed for some (small) specified number of + * epochs. These entries (if any) can then be evicted and + * the cache size reduced -- ideally without evicting any + * of the current working set. Needless to say, the epoch + * length and the number of epochs before an unused entry + * must be chosen so that all, or almost all, the working + * set will be accessed before the limit. + * + * Epoch markers only appear in the LRU list, never in + * the index or slist. While they are of type + * H5C__EPOCH_MARKER_TYPE, and have associated class + * functions, these functions should never be called. + * + * The addr fields of these instances of H5C_cache_entry_t + * are set to the index of the instance in the epoch_markers + * array, the size is set to 0, and the type field points + * to the constant structure epoch_marker_class defined + * in H5C.c. The next and prev fields are used as usual + * to link the entry into the LRU list. + * + * All other fields are unused. + * + * + * Cache hit rate collection fields: + * + * We supply the current cache hit rate on request, so we must keep a + * simple cache hit rate computation regardless of whether statistics + * collection is enabled. The following fields support this capability. + * + * cache_hits: Number of cache hits since the last time the cache hit + * rate statistics were reset. Note that when automatic cache + * re-sizing is enabled, this field will be reset every automatic + * resize epoch. + * + * cache_accesses: Number of times the cache has been accessed while + * since the last since the last time the cache hit rate statistics + * were reset. Note that when automatic cache re-sizing is enabled, + * this field will be reset every automatic resize epoch. + * + * + * Metadata journaling fields: + * + * 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 is FALSE. + * + * trans_in_progress Boolean flag used to indicate whether a metadata + * 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. + * + * At least to begin with, transactions will be closely tied + * to user level API calls. + * + * trans_api_name: Array of char of length H5C__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 + * 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 transaction all of whose associated journal entries + * 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 + * the journal entries of all transactions in which it has + * been modified have been written to disk in the journal + * 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 + * 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 H5C__MAX_JOURNAL_FILE_NAME_LEN + * + 1 used to store the journal file path. + * + * mdj_jbrb: Instance of H5C_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 + * 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: + * + * tl_len: Number of entries currently residing on the transaction list. + * + * tl_size: Number of bytes of cache entries currently residing on the + * 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 + * 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 + * 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 + * 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 + * costly, so we store them on the journal write in progress list instead + * until all the journal entries for the specified transaction reaches + * disk. + * + * 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 + * 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 + * 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 + * 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 + * fields. + * + * This field is NULL if the list is empty. + * + * 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 + * cache must be clean when these function are called. + * + * The metadata journaling status change callback table is initaly allocated + * with H5C__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 + * H5C__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 H5C_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. + * + * num_mdjsc_cbs: Number of callbacks currently registered in the metadata + * journaling status change callback table. + * + * mdjsc_cb_tbl_fl_head: Index of the first free entry in the mdjsc_cb_tbl, + * 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 + * table is empty; + * + * Statistics collection fields: + * + * When enabled, these fields are used to collect statistics as described + * below. The first set are collected only when H5C_COLLECT_CACHE_STATS + * is true. + * + * hits: Array of int64 of length H5C__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 in cache when requested in + * the current epoch. + * + * misses: Array of int64 of length H5C__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 not been in cache when + * requested in the current epoch. + * + * write_protects: Array of int64 of length H5C__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 H5C__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 H5C__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 H5C__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 into the + * cache in the current epoch. + * + * pinned_insertions: Array of int64 of length H5C__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 H5C__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 cleared in the current + * epoch. + * + * flushes: Array of int64 of length H5C__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 written to disk in the + * current epoch. + * + * evictions: Array of int64 of length H5C__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 evicted from the cache in + * the current epoch. + * + * renames: Array of int64 of length H5C__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 in the current + * epoch. + * + * entry_flush_renames: Array of int64 of length H5C__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 H5C__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. + * + * pins: Array of int64 of length H5C__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 pinned in the current + * epoch. + * + * unpins: Array of int64 of length H5C__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 unpinned in the current + * epoch. + * + * dirty_pins: Array of int64 of length H5C__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 marked dirty while pinned + * in the current epoch. + * + * pinned_flushes: Array of int64 of length H5C__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 flushed while + * pinned in the current epoch. + * + * pinned_cleared: Array of int64 of length H5C__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 cleared while + * pinned in the current epoch. + * + * size_increases: Array of int64 of length H5C__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 increased in + * size in the current epoch. + * + * size_decreases: Array of int64 of length H5C__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 decreased in + * size in the current epoch. + * + * entry_flush_size_changes: Array of int64 of length + * H5C__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 + * H5C__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 + * hash table in the current epoch. + * + * total_ht_deletions: Number of times entries have been deleted from the + * hash table in the current epoch. + * + * successful_ht_searches: int64 containing the total number of successful + * searches of the hash table in the current epoch. + * + * total_successful_ht_search_depth: int64 containing the total number of + * entries other than the targets examined in successful + * searches of the hash table in the current epoch. + * + * failed_ht_searches: int64 containing the total number of unsuccessful + * searches of the hash table in the current epoch. + * + * total_failed_ht_search_depth: int64 containing the total number of + * entries examined in unsuccessful searches of the hash + * table in the current epoch. + * + * max_index_len: Largest value attained by the index_len field in the + * current epoch. + * + * max_index_size: Largest value attained by the index_size field in the + * current epoch. + * + * max_slist_len: Largest value attained by the slist_len field in the + * current epoch. + * + * max_slist_size: Largest value attained by the slist_size field in the + * current epoch. + * + * max_pl_len: Largest value attained by the pl_len field in the + * current epoch. + * + * max_pl_size: Largest value attained by the pl_size field in the + * current epoch. + * + * max_pel_len: Largest value attained by the pel_len field in the + * current epoch. + * + * max_pel_size: Largest value attained by the pel_size field in the + * current epoch. + * + * The remaining stats are collected only when both H5C_COLLECT_CACHE_STATS + * and H5C_COLLECT_CACHE_ENTRY_STATS are true. + * + * max_accesses: Array of int32 of length H5C__MAX_NUM_TYPE_IDS + 1. The cells + * are used to record the maximum number of times any single + * entry with type id equal to the array index has been + * accessed in the current epoch. + * + * min_accesses: Array of int32 of length H5C__MAX_NUM_TYPE_IDS + 1. The cells + * are used to record the minimum number of times any single + * entry with type id equal to the array index has been + * accessed in the current epoch. + * + * max_clears: Array of int32 of length H5C__MAX_NUM_TYPE_IDS + 1. The cells + * are used to record the maximum number of times any single + * entry with type id equal to the array index has been cleared + * in the current epoch. + * + * max_flushes: Array of int32 of length H5C__MAX_NUM_TYPE_IDS + 1. The cells + * are used to record the maximum number of times any single + * entry with type id equal to the array index has been + * flushed in the current epoch. + * + * max_size: Array of size_t of length H5C__MAX_NUM_TYPE_IDS + 1. The cells + * are used to record the maximum size of any single entry + * with type id equal to the array index that has resided in + * the cache in the current epoch. + * + * max_pins: Array of size_t of length H5C__MAX_NUM_TYPE_IDS + 1. The cells + * are used to record the maximum number of times that any single + * entry with type id equal to the array index that has been + * marked as pinned in the cache in the current epoch. + * + * + * Fields supporting testing: + * + * For test purposes, it is useful to turn off some asserts and sanity + * checks. The following flags support this. + * + * skip_file_checks: Boolean flag used to skip sanity checks on file + * parameters passed to the cache. In the test bed, there + * is no reason to have a file open, as the cache proper + * just passes these parameters through without using them. + * + * When this flag is set, all sanity checks on the file + * parameters are skipped. The field defaults to FALSE. + * + * skip_dxpl_id_checks: Boolean flag used to skip sanity checks on the + * dxpl_id parameters passed to the cache. These are not + * used directly by the cache, so skipping the checks + * simplifies the test bed. + * + * When this flag is set, all sanity checks on the dxpl_id + * parameters are skipped. The field defaults to FALSE. + * + * prefix Array of char used to prefix debugging output. The + * field is intended to allow marking of output of with + * the processes mpi rank. + * + ****************************************************************************/ + +#define H5C__HASH_TABLE_LEN (64 * 1024) /* must be a power of 2 */ + +#define H5C__H5C_T_MAGIC 0x005CAC0F +#define H5C__MAX_NUM_TYPE_IDS 18 +#define H5C__PREFIX_LEN 32 +#define H5C__MAX_API_NAME_LEN 128 + +#define H5C__MIN_MDJSC_CB_TBL_LEN 16 +#define H5C__MDJSC_CB_TBL_MIN_ACTIVE_RATIO 0.25 + +struct H5C_t +{ + uint32_t magic; + + hbool_t flush_in_progress; + + FILE * trace_file_ptr; + + void * aux_ptr; + + int32_t max_type_id; + const char * (* type_name_table_ptr); + + size_t max_cache_size; + size_t min_clean_size; + + H5C_write_permitted_func_t check_write_permitted; + hbool_t write_permitted; + + H5C_log_flush_func_t log_flush; + + hbool_t evictions_enabled; + + int32_t index_len; + size_t index_size; + H5C_cache_entry_t * (index[H5C__HASH_TABLE_LEN]); + + + int32_t slist_len; + size_t slist_size; + H5SL_t * slist_ptr; +#if H5C_DO_SANITY_CHECKS + int64_t slist_len_increase; + int64_t slist_size_increase; +#endif /* H5C_DO_SANITY_CHECKS */ + + int32_t pl_len; + size_t pl_size; + H5C_cache_entry_t * pl_head_ptr; + H5C_cache_entry_t * pl_tail_ptr; + + int32_t pel_len; + size_t pel_size; + H5C_cache_entry_t * pel_head_ptr; + H5C_cache_entry_t * pel_tail_ptr; + + int32_t LRU_list_len; + size_t LRU_list_size; + H5C_cache_entry_t * LRU_head_ptr; + H5C_cache_entry_t * LRU_tail_ptr; + + int32_t cLRU_list_len; + size_t cLRU_list_size; + H5C_cache_entry_t * cLRU_head_ptr; + H5C_cache_entry_t * cLRU_tail_ptr; + + int32_t dLRU_list_len; + size_t dLRU_list_size; + H5C_cache_entry_t * dLRU_head_ptr; + H5C_cache_entry_t * dLRU_tail_ptr; + + hbool_t size_increase_possible; + hbool_t flash_size_increase_possible; + size_t flash_size_increase_threshold; + hbool_t size_decrease_possible; + hbool_t resize_enabled; + hbool_t cache_full; + hbool_t size_decreased; + H5C_auto_size_ctl_t resize_ctl; + + int32_t epoch_markers_active; + hbool_t epoch_marker_active[H5C__MAX_EPOCH_MARKERS]; + int32_t epoch_marker_ringbuf[H5C__MAX_EPOCH_MARKERS+1]; + int32_t epoch_marker_ringbuf_first; + int32_t epoch_marker_ringbuf_last; + int32_t epoch_marker_ringbuf_size; + H5C_cache_entry_t epoch_markers[H5C__MAX_EPOCH_MARKERS]; + + int64_t cache_hits; + int64_t cache_accesses; + + hbool_t mdj_enabled; + hbool_t trans_in_progress; + char trans_api_name[H5C__MAX_API_NAME_LEN]; + uint64_t trans_num; + uint64_t last_trans_on_disk; + int32_t jnl_magic; + int32_t jnl_file_name_len; + char jnl_file_name[H5C__MAX_JOURNAL_FILE_NAME_LEN + + 1]; + struct H5C_jbrb_t mdj_jbrb; + int32_t tl_len; + size_t tl_size; + H5C_cache_entry_t * tl_head_ptr; + H5C_cache_entry_t * tl_tail_ptr; + int32_t jwipl_len; + size_t jwipl_size; + H5C_cache_entry_t * jwipl_head_ptr; + H5C_cache_entry_t * jwipl_tail_ptr; + H5C_mdjsc_record_t * mdjsc_cb_tbl; + int32_t mdjsc_cb_tbl_len; + int32_t num_mdjsc_cbs; + int32_t mdjsc_cb_tbl_fl_head; + int32_t mdjsc_cb_tbl_max_idx_in_use; + +#if H5C_COLLECT_CACHE_STATS + + /* stats fields */ + int64_t hits[H5C__MAX_NUM_TYPE_IDS + 1]; + int64_t misses[H5C__MAX_NUM_TYPE_IDS + 1]; + int64_t write_protects[H5C__MAX_NUM_TYPE_IDS + 1]; + int64_t read_protects[H5C__MAX_NUM_TYPE_IDS + 1]; + int32_t max_read_protects[H5C__MAX_NUM_TYPE_IDS + 1]; + int64_t insertions[H5C__MAX_NUM_TYPE_IDS + 1]; + int64_t pinned_insertions[H5C__MAX_NUM_TYPE_IDS + 1]; + int64_t clears[H5C__MAX_NUM_TYPE_IDS + 1]; + int64_t flushes[H5C__MAX_NUM_TYPE_IDS + 1]; + int64_t evictions[H5C__MAX_NUM_TYPE_IDS + 1]; + int64_t renames[H5C__MAX_NUM_TYPE_IDS + 1]; + int64_t entry_flush_renames[H5C__MAX_NUM_TYPE_IDS + 1]; + int64_t cache_flush_renames[H5C__MAX_NUM_TYPE_IDS + 1]; + int64_t pins[H5C__MAX_NUM_TYPE_IDS + 1]; + int64_t unpins[H5C__MAX_NUM_TYPE_IDS + 1]; + int64_t dirty_pins[H5C__MAX_NUM_TYPE_IDS + 1]; + int64_t pinned_flushes[H5C__MAX_NUM_TYPE_IDS + 1]; + int64_t pinned_clears[H5C__MAX_NUM_TYPE_IDS + 1]; + int64_t size_increases[H5C__MAX_NUM_TYPE_IDS + 1]; + int64_t size_decreases[H5C__MAX_NUM_TYPE_IDS + 1]; + int64_t entry_flush_size_changes + [H5C__MAX_NUM_TYPE_IDS + 1]; + int64_t cache_flush_size_changes + [H5C__MAX_NUM_TYPE_IDS + 1]; + + int64_t total_ht_insertions; + int64_t total_ht_deletions; + int64_t successful_ht_searches; + int64_t total_successful_ht_search_depth; + int64_t failed_ht_searches; + int64_t total_failed_ht_search_depth; + + int32_t max_index_len; + size_t max_index_size; + + int32_t max_slist_len; + size_t max_slist_size; + + int32_t max_pl_len; + size_t max_pl_size; + + int32_t max_pel_len; + size_t max_pel_size; + +#if H5C_COLLECT_CACHE_ENTRY_STATS + + int32_t max_accesses[H5C__MAX_NUM_TYPE_IDS + 1]; + int32_t min_accesses[H5C__MAX_NUM_TYPE_IDS + 1]; + int32_t max_clears[H5C__MAX_NUM_TYPE_IDS + 1]; + int32_t max_flushes[H5C__MAX_NUM_TYPE_IDS + 1]; + size_t max_size[H5C__MAX_NUM_TYPE_IDS + 1]; + int32_t max_pins[H5C__MAX_NUM_TYPE_IDS + 1]; + +#endif /* H5C_COLLECT_CACHE_ENTRY_STATS */ + +#endif /* H5C_COLLECT_CACHE_STATS */ + + hbool_t skip_file_checks; + hbool_t skip_dxpl_id_checks; + char prefix[H5C__PREFIX_LEN]; +}; + + +/****************************************************************************/ +/***************************** Macro Definitions ****************************/ +/****************************************************************************/ + +/**************************************************************************** + * + * We maintain doubly linked lists of instances of H5C_cache_entry_t for a + * variety of reasons -- protected list, LRU list, and the clean and dirty + * LRU lists at present. The following macros support linking and unlinking + * of instances of H5C_cache_entry_t by both their regular and auxilary next + * and previous pointers. + * + * The size and length fields are also maintained. + * + * Note that the relevant pair of prev and next pointers are presumed to be + * NULL on entry in the insertion macros. + * + * Finally, observe that the sanity checking macros evaluate to the empty + * string when H5C_DO_SANITY_CHECKS is FALSE. They also contain calls + * to the HGOTO_ERROR macro, which may not be appropriate in all cases. + * If so, we will need versions of the insertion and deletion macros which + * do not reference the sanity checking macros. + * JRM - 5/5/04 + * + * Changes: + * + * - Removed the line: + * + * ( ( (Size) == (entry_ptr)->size ) && ( (len) != 1 ) ) || + * + * from the H5C__DLL_PRE_REMOVE_SC macro. With the addition of the + * epoch markers used in the age out based cache size reduction algorithm, + * this invarient need not hold, as the epoch markers are of size 0. + * + * One could argue that I should have given the epoch markers a positive + * size, but this would break the index_size = LRU_list_size + pl_size + * + pel_size invarient. + * + * Alternatively, I could pass the current decr_mode in to the macro, + * and just skip the check whenever epoch markers may be in use. + * + * However, any size errors should be caught when the cache is flushed + * and destroyed. Until we are tracking such an error, this should be + * good enough. + * JRM - 12/9/04 + * + * + * - In the H5C__DLL_PRE_INSERT_SC macro, replaced the lines: + * + * ( ( (len) == 1 ) && + * ( ( (head_ptr) != (tail_ptr) ) || ( (Size) <= 0 ) || + * ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) ) + * ) + * ) || + * + * with: + * + * ( ( (len) == 1 ) && + * ( ( (head_ptr) != (tail_ptr) ) || + * ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) ) + * ) + * ) || + * + * Epoch markers have size 0, so we can now have a non-empty list with + * zero size. Hence the "( (Size) <= 0 )" clause cause false failures + * in the sanity check. Since "Size" is typically a size_t, it can't + * take on negative values, and thus the revised clause "( (Size) < 0 )" + * caused compiler warnings. + * JRM - 12/22/04 + * + * - In the H5C__DLL_SC macro, replaced the lines: + * + * ( ( (len) == 1 ) && + * ( ( (head_ptr) != (tail_ptr) ) || ( (cache_ptr)->size <= 0 ) || + * ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) ) + * ) + * ) || + * + * with + * + * ( ( (len) == 1 ) && + * ( ( (head_ptr) != (tail_ptr) ) || + * ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) ) + * ) + * ) || + * + * Epoch markers have size 0, so we can now have a non-empty list with + * zero size. Hence the "( (Size) <= 0 )" clause cause false failures + * in the sanity check. Since "Size" is typically a size_t, it can't + * take on negative values, and thus the revised clause "( (Size) < 0 )" + * caused compiler warnings. + * JRM - 1/10/05 + * + * - Added the H5C__DLL_UPDATE_FOR_SIZE_CHANGE macro and the associated + * sanity checking macros. These macro are used to update the size of + * a DLL when one of its entries changes size. + * + * JRM - 9/8/05 + * + * - Added a set of macros supporting doubly linked lists using the new + * trans_next and trans_prev fields in H5C_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 + * list is used to generate the needed journal entries. + * + * JRM -- 3/27/08 + * + ****************************************************************************/ + +#if H5C_DO_SANITY_CHECKS + +#define H5C__DLL_PRE_REMOVE_SC(entry_ptr, head_ptr, tail_ptr, len, Size, fv) \ +if ( ( (head_ptr) == NULL ) || \ + ( (tail_ptr) == NULL ) || \ + ( (entry_ptr) == NULL ) || \ + ( (len) <= 0 ) || \ + ( (Size) < (entry_ptr)->size ) || \ + ( ( (entry_ptr)->prev == NULL ) && ( (head_ptr) != (entry_ptr) ) ) || \ + ( ( (entry_ptr)->next == NULL ) && ( (tail_ptr) != (entry_ptr) ) ) || \ + ( ( (len) == 1 ) && \ + ( ! ( ( (head_ptr) == (entry_ptr) ) && \ + ( (tail_ptr) == (entry_ptr) ) && \ + ( (entry_ptr)->next == NULL ) && \ + ( (entry_ptr)->prev == NULL ) && \ + ( (Size) == (entry_ptr)->size ) \ + ) \ + ) \ + ) \ + ) { \ + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "DLL pre remove SC failed") \ +} + +#define H5C__DLL_SC(head_ptr, tail_ptr, len, Size, fv) \ +if ( ( ( ( (head_ptr) == NULL ) || ( (tail_ptr) == NULL ) ) && \ + ( (head_ptr) != (tail_ptr) ) \ + ) || \ + ( (len) < 0 ) || \ + ( (Size) < 0 ) || \ + ( ( (len) == 1 ) && \ + ( ( (head_ptr) != (tail_ptr) ) || \ + ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) ) \ + ) \ + ) || \ + ( ( (len) >= 1 ) && \ + ( ( (head_ptr) == NULL ) || ( (head_ptr)->prev != NULL ) || \ + ( (tail_ptr) == NULL ) || ( (tail_ptr)->next != NULL ) \ + ) \ + ) \ + ) { \ + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "DLL sanity check failed") \ +} + +#define H5C__DLL_PRE_INSERT_SC(entry_ptr, head_ptr, tail_ptr, len, Size, fv) \ +if ( ( (entry_ptr) == NULL ) || \ + ( (entry_ptr)->next != NULL ) || \ + ( (entry_ptr)->prev != NULL ) || \ + ( ( ( (head_ptr) == NULL ) || ( (tail_ptr) == NULL ) ) && \ + ( (head_ptr) != (tail_ptr) ) \ + ) || \ + ( (len) < 0 ) || \ + ( ( (len) == 1 ) && \ + ( ( (head_ptr) != (tail_ptr) ) || \ + ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) ) \ + ) \ + ) || \ + ( ( (len) >= 1 ) && \ + ( ( (head_ptr) == NULL ) || ( (head_ptr)->prev != NULL ) || \ + ( (tail_ptr) == NULL ) || ( (tail_ptr)->next != NULL ) \ + ) \ + ) \ + ) { \ + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "DLL pre insert SC failed") \ +} + +#define H5C__DLL_PRE_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size) \ +if ( ( (dll_len) <= 0 ) || \ + ( (dll_size) <= 0 ) || \ + ( (old_size) <= 0 ) || \ + ( (old_size) > (dll_size) ) || \ + ( (new_size) <= 0 ) || \ + ( ( (dll_len) == 1 ) && ( (old_size) != (dll_size) ) ) ) { \ + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "DLL pre size update SC failed") \ +} + +#define H5C__DLL_POST_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size) \ +if ( ( (new_size) > (dll_size) ) || \ + ( ( (dll_len) == 1 ) && ( (new_size) != (dll_size) ) ) ) { \ + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "DLL post size update SC failed") \ +} + +#else /* H5C_DO_SANITY_CHECKS */ + +#define H5C__DLL_PRE_REMOVE_SC(entry_ptr, head_ptr, tail_ptr, len, Size, fv) +#define H5C__DLL_SC(head_ptr, tail_ptr, len, Size, fv) +#define H5C__DLL_PRE_INSERT_SC(entry_ptr, head_ptr, tail_ptr, len, Size, fv) +#define H5C__DLL_PRE_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size) +#define H5C__DLL_POST_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size) + +#endif /* H5C_DO_SANITY_CHECKS */ + + +#define H5C__DLL_APPEND(entry_ptr, head_ptr, tail_ptr, len, Size, fail_val) \ + H5C__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)->next = (entry_ptr); \ + (entry_ptr)->prev = (tail_ptr); \ + (tail_ptr) = (entry_ptr); \ + } \ + (len)++; \ + (Size) += (entry_ptr)->size; + +#define H5C__DLL_PREPEND(entry_ptr, head_ptr, tail_ptr, len, Size, fail_val) \ + H5C__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 \ + { \ + (head_ptr)->prev = (entry_ptr); \ + (entry_ptr)->next = (head_ptr); \ + (head_ptr) = (entry_ptr); \ + } \ + (len)++; \ + (Size) += entry_ptr->size; + +#define H5C__DLL_REMOVE(entry_ptr, head_ptr, tail_ptr, len, Size, fail_val) \ + H5C__DLL_PRE_REMOVE_SC(entry_ptr, head_ptr, tail_ptr, len, Size, \ + fail_val) \ + { \ + if ( (head_ptr) == (entry_ptr) ) \ + { \ + (head_ptr) = (entry_ptr)->next; \ + if ( (head_ptr) != NULL ) \ + { \ + (head_ptr)->prev = NULL; \ + } \ + } \ + else \ + { \ + (entry_ptr)->prev->next = (entry_ptr)->next; \ + } \ + if ( (tail_ptr) == (entry_ptr) ) \ + { \ + (tail_ptr) = (entry_ptr)->prev; \ + if ( (tail_ptr) != NULL ) \ + { \ + (tail_ptr)->next = NULL; \ + } \ + } \ + else \ + { \ + (entry_ptr)->next->prev = (entry_ptr)->prev; \ + } \ + entry_ptr->next = NULL; \ + entry_ptr->prev = NULL; \ + (len)--; \ + (Size) -= entry_ptr->size; \ + } + +#define H5C__DLL_UPDATE_FOR_SIZE_CHANGE(dll_len, dll_size, old_size, new_size) \ + H5C__DLL_PRE_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size) \ + (dll_size) -= (old_size); \ + (dll_size) += (new_size); \ + H5C__DLL_POST_SIZE_UPDATE_SC(dll_len, dll_size, old_size, new_size) + +#if H5C_DO_SANITY_CHECKS + +#define H5C__AUX_DLL_PRE_REMOVE_SC(entry_ptr, hd_ptr, tail_ptr, len, Size, fv) \ +if ( ( (hd_ptr) == NULL ) || \ + ( (tail_ptr) == NULL ) || \ + ( (entry_ptr) == NULL ) || \ + ( (len) <= 0 ) || \ + ( (Size) < (entry_ptr)->size ) || \ + ( ( (Size) == (entry_ptr)->size ) && ( ! ( (len) == 1 ) ) ) || \ + ( ( (entry_ptr)->aux_prev == NULL ) && ( (hd_ptr) != (entry_ptr) ) ) || \ + ( ( (entry_ptr)->aux_next == NULL ) && ( (tail_ptr) != (entry_ptr) ) ) || \ + ( ( (len) == 1 ) && \ + ( ! ( ( (hd_ptr) == (entry_ptr) ) && ( (tail_ptr) == (entry_ptr) ) && \ + ( (entry_ptr)->aux_next == NULL ) && \ + ( (entry_ptr)->aux_prev == NULL ) && \ + ( (Size) == (entry_ptr)->size ) \ + ) \ + ) \ + ) \ + ) { \ + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "aux DLL pre remove SC failed") \ +} + +#define H5C__AUX_DLL_SC(head_ptr, tail_ptr, len, Size, fv) \ +if ( ( ( ( (head_ptr) == NULL ) || ( (tail_ptr) == NULL ) ) && \ + ( (head_ptr) != (tail_ptr) ) \ + ) || \ + ( (len) < 0 ) || \ + ( (Size) < 0 ) || \ + ( ( (len) == 1 ) && \ + ( ( (head_ptr) != (tail_ptr) ) || ( (Size) <= 0 ) || \ + ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) ) \ + ) \ + ) || \ + ( ( (len) >= 1 ) && \ + ( ( (head_ptr) == NULL ) || ( (head_ptr)->aux_prev != NULL ) || \ + ( (tail_ptr) == NULL ) || ( (tail_ptr)->aux_next != NULL ) \ + ) \ + ) \ + ) { \ + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "AUX DLL sanity check failed") \ +} + +#define H5C__AUX_DLL_PRE_INSERT_SC(entry_ptr, hd_ptr, tail_ptr, len, Size, fv)\ +if ( ( (entry_ptr) == NULL ) || \ + ( (entry_ptr)->aux_next != NULL ) || \ + ( (entry_ptr)->aux_prev != NULL ) || \ + ( ( ( (hd_ptr) == NULL ) || ( (tail_ptr) == NULL ) ) && \ + ( (hd_ptr) != (tail_ptr) ) \ + ) || \ + ( (len) < 0 ) || \ + ( ( (len) == 1 ) && \ + ( ( (hd_ptr) != (tail_ptr) ) || ( (Size) <= 0 ) || \ + ( (hd_ptr) == NULL ) || ( (hd_ptr)->size != (Size) ) \ + ) \ + ) || \ + ( ( (len) >= 1 ) && \ + ( ( (hd_ptr) == NULL ) || ( (hd_ptr)->aux_prev != NULL ) || \ + ( (tail_ptr) == NULL ) || ( (tail_ptr)->aux_next != NULL ) \ + ) \ + ) \ + ) { \ + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "AUX DLL pre insert SC failed") \ +} + +#else /* H5C_DO_SANITY_CHECKS */ + +#define H5C__AUX_DLL_PRE_REMOVE_SC(entry_ptr, hd_ptr, tail_ptr, len, Size, fv) +#define H5C__AUX_DLL_SC(head_ptr, tail_ptr, len, Size, fv) +#define H5C__AUX_DLL_PRE_INSERT_SC(entry_ptr, hd_ptr, tail_ptr, len, Size, fv) + +#endif /* H5C_DO_SANITY_CHECKS */ + + +#define H5C__AUX_DLL_APPEND(entry_ptr, head_ptr, tail_ptr, len, Size, fail_val)\ + H5C__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)++; \ + (Size) += entry_ptr->size; + +#define H5C__AUX_DLL_PREPEND(entry_ptr, head_ptr, tail_ptr, len, Size, fv) \ + H5C__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)++; \ + (Size) += entry_ptr->size; + +#define H5C__AUX_DLL_REMOVE(entry_ptr, head_ptr, tail_ptr, len, Size, fv) \ + H5C__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; \ + } + +#if H5C_DO_SANITY_CHECKS + +#define H5C__TRANS_DLL_PRE_REMOVE_SC(entry_ptr, hd_ptr, tail_ptr, \ + len, Size, fv) \ +if ( ( (hd_ptr) == NULL ) || \ + ( (tail_ptr) == NULL ) || \ + ( (entry_ptr) == NULL ) || \ + ( (len) <= 0 ) || \ + ( (Size) < (entry_ptr)->size ) || \ + ( ( (Size) == (entry_ptr)->size ) && ( ! ( (len) == 1 ) ) ) || \ + ( ( (entry_ptr)->trans_prev == NULL ) && ( (hd_ptr) != (entry_ptr) ) ) || \ + ( ( (entry_ptr)->trans_next == NULL ) && \ + ( (tail_ptr) != (entry_ptr) ) ) || \ + ( ( (len) == 1 ) && \ + ( ! ( ( (hd_ptr) == (entry_ptr) ) && ( (tail_ptr) == (entry_ptr) ) && \ + ( (entry_ptr)->trans_next == NULL ) && \ + ( (entry_ptr)->trans_prev == NULL ) && \ + ( (Size) == (entry_ptr)->size ) \ + ) \ + ) \ + ) \ + ) { \ + HDfprintf(stdout, "%s: TRANS DLL pre remove SC failed.\n", FUNC); \ + /* JRM */ /* Debugging code -- remove eventually */ \ + if ( (hd_ptr) == NULL ) HDfprintf(stdout, "( (hd_ptr) == NULL ).\n" );\ + if ( (tail_ptr) == NULL ) HDfprintf(stdout, "(tail_ptr) == NULL\n");\ + if ( (entry_ptr) == NULL ) HDfprintf(stdout, "(entry_ptr) == NULL\n");\ + if ( (len) <= 0 ) HDfprintf(stdout, "( (len) <= 0 )\n");\ + if ( (Size) < (entry_ptr)->size ) \ + HDfprintf(stdout,"( (Size) < (entry_ptr)->size )\n");\ + if ( ( (Size) == (entry_ptr)->size ) && ( ! ( (len) == 1 ) ) ) \ + HDfprintf(stdout, "(((Size)==(entry_ptr)->size)&&(!((len) == 1)))\n");\ + if ( ( (entry_ptr)->trans_prev == NULL ) && ( (hd_ptr) != (entry_ptr) ) ) \ + HDfprintf(stdout,"(((entry_ptr)->trans_prev==NULL)&&((hd_ptr)!=(entry_ptr)))\n");\ + if ( ((entry_ptr)->trans_next == NULL) && ((tail_ptr) != (entry_ptr)) ) \ + HDfprintf(stdout,"(((entry_ptr)->trans_next==NULL)&&((tail_ptr)!=(entry_ptr)))\n"); \ + if ( ( (len) == 1 ) && \ + ( ! ( ( (hd_ptr) == (entry_ptr) ) && ( (tail_ptr) == (entry_ptr) ) && \ + ( (entry_ptr)->trans_next == NULL ) && \ + ( (entry_ptr)->trans_prev == NULL ) && \ + ( (Size) == (entry_ptr)->size ) ) ) ) \ + HDfprintf(stdout,"long condition failed\n"); \ + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "TRANS DLL pre remove SC failed") \ +} + +#define H5C__TRANS_DLL_SC(head_ptr, tail_ptr, len, Size, fv) \ +if ( ( ( ( (head_ptr) == NULL ) || ( (tail_ptr) == NULL ) ) && \ + ( (head_ptr) != (tail_ptr) ) \ + ) || \ + ( (len) < 0 ) || \ + ( (Size) < 0 ) || \ + ( ( (len) == 1 ) && \ + ( ( (head_ptr) != (tail_ptr) ) || ( (Size) <= 0 ) || \ + ( (head_ptr) == NULL ) || ( (head_ptr)->size != (Size) ) \ + ) \ + ) || \ + ( ( (len) >= 1 ) && \ + ( ( (head_ptr) == NULL ) || ( (head_ptr)->trans_prev != NULL ) || \ + ( (tail_ptr) == NULL ) || ( (tail_ptr)->trans_next != NULL ) \ + ) \ + ) \ + ) { \ + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "TRANS DLL sanity check failed") \ +} + +#define H5C__TRANS_DLL_PRE_INSERT_SC(entry_ptr, hd_ptr, tail_ptr, \ + len, Size, fv) \ +if ( ( (entry_ptr) == NULL ) || \ + ( ! ((entry_ptr)->is_dirty) ) || \ + ( (entry_ptr)->trans_next != NULL ) || \ + ( (entry_ptr)->trans_prev != NULL ) || \ + ( ( ( (hd_ptr) == NULL ) || ( (tail_ptr) == NULL ) ) && \ + ( (hd_ptr) != (tail_ptr) ) \ + ) || \ + ( (len) < 0 ) || \ + ( ( (len) == 1 ) && \ + ( ( (hd_ptr) != (tail_ptr) ) || ( (Size) <= 0 ) || \ + ( (hd_ptr) == NULL ) || ( (hd_ptr)->size != (Size) ) \ + ) \ + ) || \ + ( ( (len) >= 1 ) && \ + ( ( (hd_ptr) == NULL ) || ( (hd_ptr)->trans_prev != NULL ) || \ + ( (tail_ptr) == NULL ) || ( (tail_ptr)->trans_next != NULL ) \ + ) \ + ) \ + ) { \ + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, (fv), "TRANS DLL pre insert SC failed") \ +} + +#else /* H5C_DO_SANITY_CHECKS */ + +#define H5C__TRANS_DLL_PRE_REMOVE_SC(entry_ptr, hd_ptr, tail_ptr, len, Size, fv) +#define H5C__TRANS_DLL_SC(head_ptr, tail_ptr, len, Size, fv) +#define H5C__TRANS_DLL_PRE_INSERT_SC(entry_ptr, hd_ptr, tail_ptr, len, Size, fv) + +#endif /* H5C_DO_SANITY_CHECKS */ + + +#define H5C__TRANS_DLL_APPEND(entry_ptr, head_ptr, tail_ptr, len, \ + Size, fail_val) \ + H5C__TRANS_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)->trans_next = (entry_ptr); \ + (entry_ptr)->trans_prev = (tail_ptr); \ + (tail_ptr) = (entry_ptr); \ + } \ + (len)++; \ + (Size) += entry_ptr->size; + +#define H5C__TRANS_DLL_PREPEND(entry_ptr, head_ptr, tail_ptr, len, Size, fv) \ + H5C__TRANS_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)->trans_prev = (entry_ptr); \ + (entry_ptr)->trans_next = (head_ptr); \ + (head_ptr) = (entry_ptr); \ + } \ + (len)++; \ + (Size) += entry_ptr->size; + +#define H5C__TRANS_DLL_REMOVE(entry_ptr, head_ptr, tail_ptr, len, Size, fv) \ + H5C__TRANS_DLL_PRE_REMOVE_SC(entry_ptr, head_ptr, tail_ptr, len, \ + Size, fv) \ + { \ + if ( (head_ptr) == (entry_ptr) ) \ + { \ + (head_ptr) = (entry_ptr)->trans_next; \ + if ( (head_ptr) != NULL ) \ + { \ + (head_ptr)->trans_prev = NULL; \ + } \ + } \ + else \ + { \ + (entry_ptr)->trans_prev->trans_next = (entry_ptr)->trans_next; \ + } \ + if ( (tail_ptr) == (entry_ptr) ) \ + { \ + (tail_ptr) = (entry_ptr)->trans_prev; \ + if ( (tail_ptr) != NULL ) \ + { \ + (tail_ptr)->trans_next = NULL; \ + } \ + } \ + else \ + { \ + (entry_ptr)->trans_next->trans_prev = (entry_ptr)->trans_prev; \ + } \ + entry_ptr->trans_next = NULL; \ + entry_ptr->trans_prev = NULL; \ + (len)--; \ + (Size) -= entry_ptr->size; \ + } + + +/*********************************************************************** + * + * Stats collection macros + * + * The following macros must handle stats collection when this collection + * is enabled, and evaluate to the empty string when it is not. + * + * The sole exception to this rule is + * H5C__UPDATE_CACHE_HIT_RATE_STATS(), which is always active as + * the cache hit rate stats are always collected and available. + * + * Changes: + * + * JRM -- 3/21/06 + * Added / updated macros for pinned entry related stats. + * + * JRM -- 8/9/06 + * More pinned entry stats related updates. + * + * JRM -- 3/31/07 + * Updated H5C__UPDATE_STATS_FOR_PROTECT() to keep stats on + * read and write protects. + * + ***********************************************************************/ + +#define H5C__UPDATE_CACHE_HIT_RATE_STATS(cache_ptr, hit) \ + (cache_ptr->cache_accesses)++; \ + if ( hit ) { \ + (cache_ptr->cache_hits)++; \ + } \ + +#if H5C_COLLECT_CACHE_STATS + +#define H5C__UPDATE_STATS_FOR_DIRTY_PIN(cache_ptr, entry_ptr) \ + (((cache_ptr)->dirty_pins)[(entry_ptr)->type->id])++; + +#define H5C__UPDATE_STATS_FOR_UNPROTECT(cache_ptr) \ + if ( (cache_ptr)->slist_len > (cache_ptr)->max_slist_len ) \ + (cache_ptr)->max_slist_len = (cache_ptr)->slist_len; \ + if ( (cache_ptr)->slist_size > (cache_ptr)->max_slist_size ) \ + (cache_ptr)->max_slist_size = (cache_ptr)->slist_size; \ + if ( (cache_ptr)->pel_len > (cache_ptr)->max_pel_len ) \ + (cache_ptr)->max_pel_len = (cache_ptr)->pel_len; \ + if ( (cache_ptr)->pel_size > (cache_ptr)->max_pel_size ) \ + (cache_ptr)->max_pel_size = (cache_ptr)->pel_size; + +#define H5C__UPDATE_STATS_FOR_RENAME(cache_ptr, entry_ptr) \ + if ( cache_ptr->flush_in_progress ) { \ + ((cache_ptr)->cache_flush_renames[(entry_ptr)->type->id])++; \ + } \ + if ( entry_ptr->flush_in_progress ) { \ + ((cache_ptr)->entry_flush_renames[(entry_ptr)->type->id])++; \ + } \ + (((cache_ptr)->renames)[(entry_ptr)->type->id])++; + +#define H5C__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])++; \ + } + +#define H5C__UPDATE_STATS_FOR_HT_INSERTION(cache_ptr) \ + (cache_ptr)->total_ht_insertions++; + +#define H5C__UPDATE_STATS_FOR_HT_DELETION(cache_ptr) \ + (cache_ptr)->total_ht_deletions++; + +#define H5C__UPDATE_STATS_FOR_HT_SEARCH(cache_ptr, success, depth) \ + if ( success ) { \ + (cache_ptr)->successful_ht_searches++; \ + (cache_ptr)->total_successful_ht_search_depth += depth; \ + } else { \ + (cache_ptr)->failed_ht_searches++; \ + (cache_ptr)->total_failed_ht_search_depth += depth; \ + } + +#define H5C__UPDATE_STATS_FOR_UNPIN(cache_ptr, entry_ptr) \ + ((cache_ptr)->unpins)[(entry_ptr)->type->id]++; + +#if H5C_COLLECT_CACHE_ENTRY_STATS + +#define H5C__RESET_CACHE_ENTRY_STATS(entry_ptr) \ + (entry_ptr)->accesses = 0; \ + (entry_ptr)->clears = 0; \ + (entry_ptr)->flushes = 0; \ + (entry_ptr)->pins = 0; + +#define H5C__UPDATE_STATS_FOR_CLEAR(cache_ptr, entry_ptr) \ + (((cache_ptr)->clears)[(entry_ptr)->type->id])++; \ + if ( (entry_ptr)->is_pinned ) { \ + (((cache_ptr)->pinned_clears)[(entry_ptr)->type->id])++; \ + } \ + ((entry_ptr)->clears)++; + +#define H5C__UPDATE_STATS_FOR_FLUSH(cache_ptr, entry_ptr) \ + (((cache_ptr)->flushes)[(entry_ptr)->type->id])++; \ + if ( (entry_ptr)->is_pinned ) { \ + (((cache_ptr)->pinned_flushes)[(entry_ptr)->type->id])++; \ + } \ + ((entry_ptr)->flushes)++; + +#define H5C__UPDATE_STATS_FOR_EVICTION(cache_ptr, entry_ptr) \ + (((cache_ptr)->evictions)[(entry_ptr)->type->id])++; \ + if ( (entry_ptr)->accesses > \ + ((cache_ptr)->max_accesses)[(entry_ptr)->type->id] ) { \ + ((cache_ptr)->max_accesses)[(entry_ptr)->type->id] \ + = (entry_ptr)->accesses; \ + } \ + if ( (entry_ptr)->accesses < \ + ((cache_ptr)->min_accesses)[(entry_ptr)->type->id] ) { \ + ((cache_ptr)->min_accesses)[(entry_ptr)->type->id] \ + = (entry_ptr)->accesses; \ + } \ + if ( (entry_ptr)->clears > \ + ((cache_ptr)->max_clears)[(entry_ptr)->type->id] ) { \ + ((cache_ptr)->max_clears)[(entry_ptr)->type->id] \ + = (entry_ptr)->clears; \ + } \ + if ( (entry_ptr)->flushes > \ + ((cache_ptr)->max_flushes)[(entry_ptr)->type->id] ) { \ + ((cache_ptr)->max_flushes)[(entry_ptr)->type->id] \ + = (entry_ptr)->flushes; \ + } \ + if ( (entry_ptr)->size > \ + ((cache_ptr)->max_size)[(entry_ptr)->type->id] ) { \ + ((cache_ptr)->max_size)[(entry_ptr)->type->id] \ + = (entry_ptr)->size; \ + } \ + if ( (entry_ptr)->pins > \ + ((cache_ptr)->max_pins)[(entry_ptr)->type->id] ) { \ + ((cache_ptr)->max_pins)[(entry_ptr)->type->id] \ + = (entry_ptr)->pins; \ + } + +#define H5C__UPDATE_STATS_FOR_INSERTION(cache_ptr, entry_ptr) \ + (((cache_ptr)->insertions)[(entry_ptr)->type->id])++; \ + if ( (entry_ptr)->is_pinned ) { \ + (((cache_ptr)->pinned_insertions)[(entry_ptr)->type->id])++; \ + ((cache_ptr)->pins)[(entry_ptr)->type->id]++; \ + (entry_ptr)->pins++; \ + if ( (cache_ptr)->pel_len > (cache_ptr)->max_pel_len ) \ + (cache_ptr)->max_pel_len = (cache_ptr)->pel_len; \ + if ( (cache_ptr)->pel_size > (cache_ptr)->max_pel_size ) \ + (cache_ptr)->max_pel_size = (cache_ptr)->pel_size; \ + } \ + if ( (cache_ptr)->index_len > (cache_ptr)->max_index_len ) \ + (cache_ptr)->max_index_len = (cache_ptr)->index_len; \ + if ( (cache_ptr)->index_size > (cache_ptr)->max_index_size ) \ + (cache_ptr)->max_index_size = (cache_ptr)->index_size; \ + if ( (cache_ptr)->slist_len > (cache_ptr)->max_slist_len ) \ + (cache_ptr)->max_slist_len = (cache_ptr)->slist_len; \ + if ( (cache_ptr)->slist_size > (cache_ptr)->max_slist_size ) \ + (cache_ptr)->max_slist_size = (cache_ptr)->slist_size; \ + if ( (entry_ptr)->size > \ + ((cache_ptr)->max_size)[(entry_ptr)->type->id] ) { \ + ((cache_ptr)->max_size)[(entry_ptr)->type->id] \ + = (entry_ptr)->size; \ + } + +#define H5C__UPDATE_STATS_FOR_PROTECT(cache_ptr, entry_ptr, hit) \ + if ( hit ) \ + ((cache_ptr)->hits)[(entry_ptr)->type->id]++; \ + else \ + ((cache_ptr)->misses)[(entry_ptr)->type->id]++; \ + if ( ! ((entry_ptr)->is_read_only) ) { \ + ((cache_ptr)->write_protects)[(entry_ptr)->type->id]++; \ + } else { \ + ((cache_ptr)->read_protects)[(entry_ptr)->type->id]++; \ + if ( ((entry_ptr)->ro_ref_count) > \ + ((cache_ptr)->max_read_protects)[(entry_ptr)->type->id] ) { \ + ((cache_ptr)->max_read_protects)[(entry_ptr)->type->id] = \ + ((entry_ptr)->ro_ref_count); \ + } \ + } \ + if ( (cache_ptr)->index_len > (cache_ptr)->max_index_len ) \ + (cache_ptr)->max_index_len = (cache_ptr)->index_len; \ + if ( (cache_ptr)->index_size > (cache_ptr)->max_index_size ) \ + (cache_ptr)->max_index_size = (cache_ptr)->index_size; \ + if ( (cache_ptr)->pl_len > (cache_ptr)->max_pl_len ) \ + (cache_ptr)->max_pl_len = (cache_ptr)->pl_len; \ + if ( (cache_ptr)->pl_size > (cache_ptr)->max_pl_size ) \ + (cache_ptr)->max_pl_size = (cache_ptr)->pl_size; \ + if ( (entry_ptr)->size > \ + ((cache_ptr)->max_size)[(entry_ptr)->type->id] ) { \ + ((cache_ptr)->max_size)[(entry_ptr)->type->id] \ + = (entry_ptr)->size; \ + } \ + ((entry_ptr)->accesses)++; + +#define H5C__UPDATE_STATS_FOR_PIN(cache_ptr, entry_ptr) \ + ((cache_ptr)->pins)[(entry_ptr)->type->id]++; \ + (entry_ptr)->pins++; \ + if ( (cache_ptr)->pel_len > (cache_ptr)->max_pel_len ) \ + (cache_ptr)->max_pel_len = (cache_ptr)->pel_len; \ + if ( (cache_ptr)->pel_size > (cache_ptr)->max_pel_size ) \ + (cache_ptr)->max_pel_size = (cache_ptr)->pel_size; + +#else /* H5C_COLLECT_CACHE_ENTRY_STATS */ + +#define H5C__RESET_CACHE_ENTRY_STATS(entry_ptr) + +#define H5C__UPDATE_STATS_FOR_CLEAR(cache_ptr, entry_ptr) \ + if ( (entry_ptr)->is_pinned ) { \ + (((cache_ptr)->pinned_clears)[(entry_ptr)->type->id])++; \ + } \ + (((cache_ptr)->clears)[(entry_ptr)->type->id])++; + +#define H5C__UPDATE_STATS_FOR_FLUSH(cache_ptr, entry_ptr) \ + (((cache_ptr)->flushes)[(entry_ptr)->type->id])++; \ + if ( (entry_ptr)->is_pinned ) { \ + (((cache_ptr)->pinned_flushes)[(entry_ptr)->type->id])++; \ + } + +#define H5C__UPDATE_STATS_FOR_EVICTION(cache_ptr, entry_ptr) \ + (((cache_ptr)->evictions)[(entry_ptr)->type->id])++; + +#define H5C__UPDATE_STATS_FOR_INSERTION(cache_ptr, entry_ptr) \ + (((cache_ptr)->insertions)[(entry_ptr)->type->id])++; \ + if ( (entry_ptr)->is_pinned ) { \ + (((cache_ptr)->pinned_insertions)[(entry_ptr)->type->id])++; \ + ((cache_ptr)->pins)[(entry_ptr)->type->id]++; \ + if ( (cache_ptr)->pel_len > (cache_ptr)->max_pel_len ) \ + (cache_ptr)->max_pel_len = (cache_ptr)->pel_len; \ + if ( (cache_ptr)->pel_size > (cache_ptr)->max_pel_size ) \ + (cache_ptr)->max_pel_size = (cache_ptr)->pel_size; \ + } \ + if ( (cache_ptr)->index_len > (cache_ptr)->max_index_len ) \ + (cache_ptr)->max_index_len = (cache_ptr)->index_len; \ + if ( (cache_ptr)->index_size > (cache_ptr)->max_index_size ) \ + (cache_ptr)->max_index_size = (cache_ptr)->index_size; \ + if ( (cache_ptr)->slist_len > (cache_ptr)->max_slist_len ) \ + (cache_ptr)->max_slist_len = (cache_ptr)->slist_len; \ + if ( (cache_ptr)->slist_size > (cache_ptr)->max_slist_size ) \ + (cache_ptr)->max_slist_size = (cache_ptr)->slist_size; + +#define H5C__UPDATE_STATS_FOR_PROTECT(cache_ptr, entry_ptr, hit) \ + if ( hit ) \ + ((cache_ptr)->hits)[(entry_ptr)->type->id]++; \ + else \ + ((cache_ptr)->misses)[(entry_ptr)->type->id]++; \ + if ( ! ((entry_ptr)->is_read_only) ) { \ + ((cache_ptr)->write_protects)[(entry_ptr)->type->id]++; \ + } else { \ + ((cache_ptr)->read_protects)[(entry_ptr)->type->id]++; \ + if ( ((entry_ptr)->ro_ref_count) > \ + ((cache_ptr)->max_read_protects)[(entry_ptr)->type->id] ) { \ + ((cache_ptr)->max_read_protects)[(entry_ptr)->type->id] = \ + ((entry_ptr)->ro_ref_count); \ + } \ + } \ + if ( (cache_ptr)->index_len > (cache_ptr)->max_index_len ) \ + (cache_ptr)->max_index_len = (cache_ptr)->index_len; \ + if ( (cache_ptr)->index_size > (cache_ptr)->max_index_size ) \ + (cache_ptr)->max_index_size = (cache_ptr)->index_size; \ + if ( (cache_ptr)->pl_len > (cache_ptr)->max_pl_len ) \ + (cache_ptr)->max_pl_len = (cache_ptr)->pl_len; \ + if ( (cache_ptr)->pl_size > (cache_ptr)->max_pl_size ) \ + (cache_ptr)->max_pl_size = (cache_ptr)->pl_size; + +#define H5C__UPDATE_STATS_FOR_PIN(cache_ptr, entry_ptr) \ + ((cache_ptr)->pins)[(entry_ptr)->type->id]++; \ + if ( (cache_ptr)->pel_len > (cache_ptr)->max_pel_len ) \ + (cache_ptr)->max_pel_len = (cache_ptr)->pel_len; \ + if ( (cache_ptr)->pel_size > (cache_ptr)->max_pel_size ) \ + (cache_ptr)->max_pel_size = (cache_ptr)->pel_size; + +#endif /* H5C_COLLECT_CACHE_ENTRY_STATS */ + +#else /* H5C_COLLECT_CACHE_STATS */ + +#define H5C__RESET_CACHE_ENTRY_STATS(entry_ptr) +#define H5C__UPDATE_STATS_FOR_DIRTY_PIN(cache_ptr, entry_ptr) +#define H5C__UPDATE_STATS_FOR_UNPROTECT(cache_ptr) +#define H5C__UPDATE_STATS_FOR_RENAME(cache_ptr, entry_ptr) +#define H5C__UPDATE_STATS_FOR_ENTRY_SIZE_CHANGE(cache_ptr, entry_ptr, new_size) +#define H5C__UPDATE_STATS_FOR_HT_INSERTION(cache_ptr) +#define H5C__UPDATE_STATS_FOR_HT_DELETION(cache_ptr) +#define H5C__UPDATE_STATS_FOR_HT_SEARCH(cache_ptr, success, depth) +#define H5C__UPDATE_STATS_FOR_INSERTION(cache_ptr, entry_ptr) +#define H5C__UPDATE_STATS_FOR_CLEAR(cache_ptr, entry_ptr) +#define H5C__UPDATE_STATS_FOR_FLUSH(cache_ptr, entry_ptr) +#define H5C__UPDATE_STATS_FOR_EVICTION(cache_ptr, entry_ptr) +#define H5C__UPDATE_STATS_FOR_PROTECT(cache_ptr, entry_ptr, hit) +#define H5C__UPDATE_STATS_FOR_PIN(cache_ptr, entry_ptr) +#define H5C__UPDATE_STATS_FOR_UNPIN(cache_ptr, entry_ptr) + +#endif /* H5C_COLLECT_CACHE_STATS */ + + +/*********************************************************************** + * + * Hash table access and manipulation macros: + * + * The following macros handle searches, insertions, and deletion in + * the hash table. + * + * When modifying these macros, remember to modify the similar macros + * in tst/cache.c + * + ***********************************************************************/ + +/* H5C__HASH_TABLE_LEN is defined in H5Cpkg.h. It mut be a power of two. */ + +#define H5C__HASH_MASK ((size_t)(H5C__HASH_TABLE_LEN - 1) << 3) + +#define H5C__HASH_FCN(x) (int)(((x) & H5C__HASH_MASK) >> 3) + +#if H5C_DO_SANITY_CHECKS + +#define H5C__PRE_HT_INSERT_SC(cache_ptr, entry_ptr, fail_val) \ +if ( ( (cache_ptr) == NULL ) || \ + ( (cache_ptr)->magic != H5C__H5C_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 = H5C__HASH_FCN((entry_ptr)->addr)) < 0 ) || \ + ( k >= H5C__HASH_TABLE_LEN ) ) { \ + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, fail_val, \ + "Pre HT insert SC failed") \ +} + +#define H5C__PRE_HT_REMOVE_SC(cache_ptr, entry_ptr) \ +if ( ( (cache_ptr) == NULL ) || \ + ( (cache_ptr)->magic != H5C__H5C_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 ) || \ + ( H5C__HASH_FCN((entry_ptr)->addr) < 0 ) || \ + ( H5C__HASH_FCN((entry_ptr)->addr) >= H5C__HASH_TABLE_LEN ) || \ + ( ((cache_ptr)->index)[(H5C__HASH_FCN((entry_ptr)->addr))] \ + == NULL ) || \ + ( ( ((cache_ptr)->index)[(H5C__HASH_FCN((entry_ptr)->addr))] \ + != (entry_ptr) ) && \ + ( (entry_ptr)->ht_prev == NULL ) ) || \ + ( ( ((cache_ptr)->index)[(H5C__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 H5C__PRE_HT_SEARCH_SC(cache_ptr, Addr, fail_val) \ +if ( ( (cache_ptr) == NULL ) || \ + ( (cache_ptr)->magic != H5C__H5C_T_MAGIC ) || \ + ( ! H5F_addr_defined(Addr) ) || \ + ( H5C__HASH_FCN(Addr) < 0 ) || \ + ( H5C__HASH_FCN(Addr) >= H5C__HASH_TABLE_LEN ) ) { \ + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, fail_val, "Pre HT search SC failed") \ +} + +#define H5C__POST_SUC_HT_SEARCH_SC(cache_ptr, entry_ptr, Addr, k, fail_val) \ +if ( ( (cache_ptr) == NULL ) || \ + ( (cache_ptr)->magic != H5C__H5C_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 H5C__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 H5C__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") \ +} + +#define H5C__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 /* H5C_DO_SANITY_CHECKS */ + +#define H5C__PRE_HT_INSERT_SC(cache_ptr, entry_ptr, fail_val) +#define H5C__PRE_HT_REMOVE_SC(cache_ptr, entry_ptr) +#define H5C__PRE_HT_SEARCH_SC(cache_ptr, Addr, fail_val) +#define H5C__POST_SUC_HT_SEARCH_SC(cache_ptr, entry_ptr, Addr, k, fail_val) +#define H5C__POST_HT_SHIFT_TO_FRONT(cache_ptr, entry_ptr, k, fail_val) +#define H5C__PRE_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size) +#define H5C__POST_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size) + +#endif /* H5C_DO_SANITY_CHECKS */ + + +#define H5C__INSERT_IN_INDEX(cache_ptr, entry_ptr, fail_val) \ +{ \ + int k; \ + H5C__PRE_HT_INSERT_SC(cache_ptr, entry_ptr, fail_val) \ + k = H5C__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; \ + H5C__UPDATE_STATS_FOR_HT_INSERTION(cache_ptr) \ +} + +#define H5C__DELETE_FROM_INDEX(cache_ptr, entry_ptr) \ +{ \ + int k; \ + H5C__PRE_HT_REMOVE_SC(cache_ptr, entry_ptr) \ + k = H5C__HASH_FCN((entry_ptr)->addr); \ + if ( (entry_ptr)->ht_next ) \ + { \ + (entry_ptr)->ht_next->ht_prev = (entry_ptr)->ht_prev; \ + } \ + if ( (entry_ptr)->ht_prev ) \ + { \ + (entry_ptr)->ht_prev->ht_next = (entry_ptr)->ht_next; \ + } \ + if ( ((cache_ptr)->index)[k] == (entry_ptr) ) \ + { \ + ((cache_ptr)->index)[k] = (entry_ptr)->ht_next; \ + } \ + (entry_ptr)->ht_next = NULL; \ + (entry_ptr)->ht_prev = NULL; \ + (cache_ptr)->index_len--; \ + (cache_ptr)->index_size -= (entry_ptr)->size; \ + H5C__UPDATE_STATS_FOR_HT_DELETION(cache_ptr) \ +} + +#define H5C__SEARCH_INDEX(cache_ptr, Addr, entry_ptr, fail_val) \ +{ \ + int k; \ + int depth = 0; \ + H5C__PRE_HT_SEARCH_SC(cache_ptr, Addr, fail_val) \ + k = H5C__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 ) \ + { \ + H5C__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); \ + H5C__POST_HT_SHIFT_TO_FRONT(cache_ptr, entry_ptr, k, fail_val) \ + } \ + } \ + H5C__UPDATE_STATS_FOR_HT_SEARCH(cache_ptr, (entry_ptr != NULL), depth) \ +} + +#define H5C__SEARCH_INDEX_NO_STATS(cache_ptr, Addr, entry_ptr, fail_val) \ +{ \ + int k; \ + int depth = 0; \ + H5C__PRE_HT_SEARCH_SC(cache_ptr, Addr, fail_val) \ + k = H5C__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 ) \ + { \ + H5C__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); \ + H5C__POST_HT_SHIFT_TO_FRONT(cache_ptr, entry_ptr, k, fail_val) \ + } \ + } \ +} + +#define H5C__UPDATE_INDEX_FOR_SIZE_CHANGE(cache_ptr, old_size, new_size) \ +{ \ + H5C__PRE_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size) \ + (cache_ptr)->index_size -= old_size; \ + (cache_ptr)->index_size += new_size; \ + H5C__POST_HT_ENTRY_SIZE_CHANGE_SC(cache_ptr, old_size, new_size) \ +} + + +/************************************************************************** + * + * Skip list insertion and deletion macros: + * + * These used to be functions, but I converted them to macros to avoid some + * function call overhead. + * + **************************************************************************/ + +/*------------------------------------------------------------------------- + * + * Macro: H5C__INSERT_ENTRY_IN_SLIST + * + * Purpose: Insert the specified instance of H5C_cache_entry_t into + * the skip list in the specified instance of H5C_t. Update + * the associated length and size fields. + * + * Return: N/A + * + * Programmer: John Mainzer, 5/10/04 + * + * Modifications: + * + * JRM -- 7/21/04 + * Updated function to set the in_tree flag when inserting + * an entry into the tree. Also modified the function to + * update the tree size and len fields instead of the similar + * index fields. + * + * All of this is part of the modifications to support the + * hash table. + * + * JRM -- 7/27/04 + * Converted the function H5C_insert_entry_in_tree() into + * the macro H5C__INSERT_ENTRY_IN_TREE in the hopes of + * wringing a little more speed out of the cache. + * + * Note that we don't bother to check if the entry is already + * in the tree -- if it is, H5SL_insert() will fail. + * + * QAK -- 11/27/04 + * Switched over to using skip list routines. + * + * JRM -- 6/27/06 + * Added fail_val parameter. + * + * JRM -- 8/25/06 + * Added the H5C_DO_SANITY_CHECKS version of the macro. + * + * 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 + * flush. + * + *------------------------------------------------------------------------- + */ + +#if H5C_DO_SANITY_CHECKS + +#define H5C__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, fail_val) \ +{ \ + HDassert( (cache_ptr) ); \ + HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC ); \ + HDassert( (entry_ptr) ); \ + HDassert( (entry_ptr)->size > 0 ); \ + HDassert( H5F_addr_defined((entry_ptr)->addr) ); \ + HDassert( !((entry_ptr)->in_slist) ); \ + \ + if ( H5SL_insert((cache_ptr)->slist_ptr, entry_ptr, &(entry_ptr)->addr) \ + < 0 ) \ + HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, (fail_val), \ + "Can't insert entry in skip list") \ + \ + (entry_ptr)->in_slist = TRUE; \ + (cache_ptr)->slist_len++; \ + (cache_ptr)->slist_size += (entry_ptr)->size; \ + (cache_ptr)->slist_len_increase++; \ + (cache_ptr)->slist_size_increase += (entry_ptr)->size; \ + \ + HDassert( (cache_ptr)->slist_len > 0 ); \ + HDassert( (cache_ptr)->slist_size > 0 ); \ + \ +} /* H5C__INSERT_ENTRY_IN_SLIST */ + +#else /* H5C_DO_SANITY_CHECKS */ + +#define H5C__INSERT_ENTRY_IN_SLIST(cache_ptr, entry_ptr, fail_val) \ +{ \ + HDassert( (cache_ptr) ); \ + HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC ); \ + HDassert( (entry_ptr) ); \ + HDassert( (entry_ptr)->size > 0 ); \ + HDassert( H5F_addr_defined((entry_ptr)->addr) ); \ + HDassert( !((entry_ptr)->in_slist) ); \ + \ + if ( H5SL_insert((cache_ptr)->slist_ptr, entry_ptr, &(entry_ptr)->addr) \ + < 0 ) \ + HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, (fail_val), \ + "Can't insert entry in skip list") \ + \ + (entry_ptr)->in_slist = TRUE; \ + (cache_ptr)->slist_len++; \ + (cache_ptr)->slist_size += (entry_ptr)->size; \ + \ + HDassert( (cache_ptr)->slist_len > 0 ); \ + HDassert( (cache_ptr)->slist_size > 0 ); \ + \ +} /* H5C__INSERT_ENTRY_IN_SLIST */ + +#endif /* H5C_DO_SANITY_CHECKS */ + + +/*------------------------------------------------------------------------- + * + * Function: H5C__REMOVE_ENTRY_FROM_SLIST + * + * Purpose: Remove the specified instance of H5C_cache_entry_t from the + * index skip list in the specified instance of H5C_t. Update + * the associated length and size fields. + * + * Return: N/A + * + * Programmer: John Mainzer, 5/10/04 + * + * Modifications: + * + * JRM -- 7/21/04 + * Updated function for the addition of the hash table. + * + * JRM - 7/27/04 + * Converted from the function H5C_remove_entry_from_tree() + * to the macro H5C__REMOVE_ENTRY_FROM_TREE in the hopes of + * wringing a little more performance out of the cache. + * + * QAK -- 11/27/04 + * Switched over to using skip list routines. + * + * JRM -- 3/28/07 + * Updated sanity checks for the new is_read_only and + * ro_ref_count fields in H5C_cache_entry_t. + * + *------------------------------------------------------------------------- + */ + +#define H5C__REMOVE_ENTRY_FROM_SLIST(cache_ptr, entry_ptr) \ +{ \ + HDassert( (cache_ptr) ); \ + HDassert( (cache_ptr)->magic == H5C__H5C_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)->in_slist ); \ + HDassert( (cache_ptr)->slist_ptr ); \ + \ + if ( H5SL_remove((cache_ptr)->slist_ptr, &(entry_ptr)->addr) \ + != (entry_ptr) ) \ + \ + HGOTO_ERROR(H5E_CACHE, H5E_BADVALUE, FAIL, \ + "Can't delete entry from skip list.") \ + \ + HDassert( (cache_ptr)->slist_len > 0 ); \ + (cache_ptr)->slist_len--; \ + HDassert( (cache_ptr)->slist_size >= (entry_ptr)->size ); \ + (cache_ptr)->slist_size -= (entry_ptr)->size; \ + (entry_ptr)->in_slist = FALSE; \ +} /* H5C__REMOVE_ENTRY_FROM_SLIST */ + + +/*------------------------------------------------------------------------- + * + * Function: H5C__UPDATE_SLIST_FOR_SIZE_CHANGE + * + * Purpose: Update cache_ptr->slist_size for a change in the size of + * and entry in the slist. + * + * Return: N/A + * + * Programmer: John Mainzer, 9/07/05 + * + * Modifications: + * + * JRM -- 8/27/06 + * Added the H5C_DO_SANITY_CHECKS version of the macro. + * + * 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 + * flush. + * + *------------------------------------------------------------------------- + */ + +#if H5C_DO_SANITY_CHECKS + +#define H5C__UPDATE_SLIST_FOR_SIZE_CHANGE(cache_ptr, old_size, new_size) \ +{ \ + HDassert( (cache_ptr) ); \ + HDassert( (cache_ptr)->magic == H5C__H5C_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) ) ); \ +} /* H5C__REMOVE_ENTRY_FROM_SLIST */ + +#else /* H5C_DO_SANITY_CHECKS */ + +#define H5C__UPDATE_SLIST_FOR_SIZE_CHANGE(cache_ptr, old_size, new_size) \ +{ \ + HDassert( (cache_ptr) ); \ + HDassert( (cache_ptr)->magic == H5C__H5C_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) ) ); \ +} /* H5C__REMOVE_ENTRY_FROM_SLIST */ + +#endif /* H5C_DO_SANITY_CHECKS */ + + +/************************************************************************** + * + * Replacement policy update macros: + * + * These used to be functions, but I converted them to macros to avoid some + * function call overhead. + * + **************************************************************************/ + +/*------------------------------------------------------------------------- + * + * Macro: H5C__FAKE_RP_FOR_MOST_RECENT_ACCESS + * + * Purpose: For efficiency, we sometimes change the order of flushes -- + * but doing so can confuse the replacement policy. This + * macro exists to allow us to specify an entry as the + * most recently touched so we can repair any such + * confusion. + * + * At present, we only support the modified LRU policy, so + * this function deals with that case unconditionally. If + * we ever support other replacement policies, the macro + * should switch on the current policy and act accordingly. + * + * Return: N/A + * + * Programmer: John Mainzer, 10/13/05 + * + * Modifications: + * + * JRM -- 3/20/06 + * Modified macro to ignore pinned entries. Pinned entries + * do not appear in the data structures maintained by the + * replacement policy code, and thus this macro has nothing + * to do if called for such an entry. + * + * JRM -- 3/28/07 + * Added sanity checks using the new is_read_only and + * ro_ref_count fields of struct H5C_cache_entry_t. + * + * JRM -- 3/29/08 + * Added a sanity check to verify that the target entry + * does not have a pending journal entry write. + * + *------------------------------------------------------------------------- + */ + +#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS + +#define H5C__FAKE_RP_FOR_MOST_RECENT_ACCESS(cache_ptr, entry_ptr, fail_val) \ +{ \ + HDassert( (cache_ptr) ); \ + HDassert( (cache_ptr)->magic == H5C__H5C_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. \ + */ \ + \ + H5C__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)) \ + \ + H5C__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 ) { \ + H5C__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)) \ + \ + H5C__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 { \ + H5C__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)) \ + \ + H5C__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. */ \ + } \ +} /* H5C__FAKE_RP_FOR_MOST_RECENT_ACCESS */ + +#else /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ + +#define H5C__FAKE_RP_FOR_MOST_RECENT_ACCESS(cache_ptr, entry_ptr, fail_val) \ +{ \ + HDassert( (cache_ptr) ); \ + HDassert( (cache_ptr)->magic == H5C__H5C_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 \ + */ \ + \ + H5C__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)) \ + \ + H5C__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. */ \ + } \ +} /* H5C__FAKE_RP_FOR_MOST_RECENT_ACCESS */ + +#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ + + +/*------------------------------------------------------------------------- + * + * Macro: H5C__UPDATE_RP_FOR_EVICTION + * + * Purpose: Update the replacement policy data structures for an + * eviction of the specified cache entry. + * + * At present, we only support the modified LRU policy, so + * this function deals with that case unconditionally. If + * we ever support other replacement policies, the function + * should switch on the current policy and act accordingly. + * + * Return: Non-negative on success/Negative on failure. + * + * Programmer: John Mainzer, 5/10/04 + * + * Modifications: + * + * JRM - 7/27/04 + * Converted the function H5C_update_rp_for_eviction() to the + * macro H5C__UPDATE_RP_FOR_EVICTION in an effort to squeeze + * a bit more performance out of the cache. + * + * At least for the first cut, I am leaving the comments and + * white space in the macro. If they cause dificulties with + * the pre-processor, I'll have to remove them. + * + * JRM - 7/28/04 + * Split macro into two version, one supporting the clean and + * dirty LRU lists, and the other not. Yet another attempt + * at optimization. + * + * JRM - 3/20/06 + * Pinned entries can't be evicted, so this entry should never + * 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 + * ro_ref_count fields of struct H5C_cache_entry_t. + * + * JRM -- 3/29/08 + * Added sanity check to verify that the evicted entry + * does not have a pending journal entry write. + * + *------------------------------------------------------------------------- + */ + +#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS + +#define H5C__UPDATE_RP_FOR_EVICTION(cache_ptr, entry_ptr, fail_val) \ +{ \ + HDassert( (cache_ptr) ); \ + HDassert( (cache_ptr)->magic == H5C__H5C_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)->is_pinned) ); \ + HDassert( (entry_ptr)->size > 0 ); \ + HDassert( (entry_ptr)->last_trans == 0 ); \ + \ + /* modified LRU specific code */ \ + \ + /* remove the entry from the LRU list. */ \ + \ + H5C__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)) \ + \ + /* If the entry is clean when it is evicted, it should be on the \ + * clean LRU list, if it was dirty, it should be on the dirty LRU list. \ + * Remove it from the appropriate list according to the value of the \ + * dirty flag. \ + */ \ + \ + if ( (entry_ptr)->is_dirty ) { \ + \ + H5C__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 { \ + H5C__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)) \ + } \ + \ +} /* H5C__UPDATE_RP_FOR_EVICTION */ + +#else /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ + +#define H5C__UPDATE_RP_FOR_EVICTION(cache_ptr, entry_ptr, fail_val) \ +{ \ + HDassert( (cache_ptr) ); \ + HDassert( (cache_ptr)->magic == H5C__H5C_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)->is_pinned) ); \ + HDassert( (entry_ptr)->size > 0 ); \ + HDassert( (entry_ptr)->last_trans == 0 ); \ + \ + /* modified LRU specific code */ \ + \ + /* remove the entry from the LRU list. */ \ + \ + H5C__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)) \ + \ +} /* H5C__UPDATE_RP_FOR_EVICTION */ + +#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ + + +/*------------------------------------------------------------------------- + * + * Macro: H5C__UPDATE_RP_FOR_FLUSH + * + * Purpose: Update the replacement policy data structures for a flush + * of the specified cache entry. + * + * At present, we only support the modified LRU policy, so + * this function deals with that case unconditionally. If + * we ever support other replacement policies, the function + * should switch on the current policy and act accordingly. + * + * Return: N/A + * + * Programmer: John Mainzer, 5/6/04 + * + * Modifications: + * + * JRM - 7/27/04 + * Converted the function H5C_update_rp_for_flush() to the + * macro H5C__UPDATE_RP_FOR_FLUSH in an effort to squeeze + * a bit more performance out of the cache. + * + * At least for the first cut, I am leaving the comments and + * white space in the macro. If they cause dificulties with + * pre-processor, I'll have to remove them. + * + * JRM - 7/28/04 + * Split macro into two versions, one supporting the clean and + * dirty LRU lists, and the other not. Yet another attempt + * at optimization. + * + * JRM - 3/20/06 + * While pinned entries can be flushed, they don't reside in + * the replacement policy data structures when unprotected. + * Thus I modified this macro to do nothing if the entry is + * pinned. + * + * JRM - 3/28/07 + * Added sanity checks based on the new is_read_only and + * ro_ref_count fields of struct H5C_cache_entry_t. + * + * JRM -- 3/29/08 + * Added sanity check to verify that the flushed entry + * does not have a pending journal entry write. + * + *------------------------------------------------------------------------- + */ + +#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS + +#define H5C__UPDATE_RP_FOR_FLUSH(cache_ptr, entry_ptr, fail_val) \ +{ \ + HDassert( (cache_ptr) ); \ + HDassert( (cache_ptr)->magic == H5C__H5C_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. \ + */ \ + \ + H5C__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)) \ + \ + H5C__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)) \ + \ + /* since the entry is being flushed or cleared, one would think \ + * that it must be dirty -- but that need not be the case. 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 \ + * clean LRU list. \ + * \ + * The function presumes that a dirty entry will be either cleared \ + * or flushed shortly, so it is OK if we put a dirty entry on the \ + * clean LRU list. \ + */ \ + \ + if ( (entry_ptr)->is_dirty ) { \ + H5C__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 { \ + H5C__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)) \ + } \ + \ + H5C__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. */ \ + } \ +} /* H5C__UPDATE_RP_FOR_FLUSH */ + +#else /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ + +#define H5C__UPDATE_RP_FOR_FLUSH(cache_ptr, entry_ptr, fail_val) \ +{ \ + HDassert( (cache_ptr) ); \ + HDassert( (cache_ptr)->magic == H5C__H5C_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. \ + */ \ + \ + H5C__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)) \ + \ + H5C__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. */ \ + } \ +} /* H5C__UPDATE_RP_FOR_FLUSH */ + +#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ + + +/*------------------------------------------------------------------------- + * + * Macro: H5C__UPDATE_RP_FOR_INSERTION + * + * Purpose: Update the replacement policy data structures for an + * insertion of the specified cache entry. + * + * At present, we only support the modified LRU policy, so + * this function deals with that case unconditionally. If + * we ever support other replacement policies, the function + * should switch on the current policy and act accordingly. + * + * Return: N/A + * + * Programmer: John Mainzer, 5/17/04 + * + * Modifications: + * + * JRM - 7/27/04 + * Converted the function H5C_update_rp_for_insertion() to the + * macro H5C__UPDATE_RP_FOR_INSERTION in an effort to squeeze + * a bit more performance out of the cache. + * + * At least for the first cut, I am leaving the comments and + * white space in the macro. If they cause dificulties with + * pre-processor, I'll have to remove them. + * + * JRM - 7/28/04 + * Split macro into two version, one supporting the clean and + * dirty LRU lists, and the other not. Yet another attempt + * at optimization. + * + * JRM - 3/10/06 + * This macro should never be called on a pinned entry. + * Inserted an assert to verify this. + * + * JRM - 8/9/06 + * Not any more. We must now allow insertion of pinned + * entries. Updated macro to support this. + * + * JRM - 3/28/07 + * Added sanity checks using the new is_read_only and + * ro_ref_count fields of struct H5C_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 + * journaling is disabled or a transaction is in progress. + * + * 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. + * + *------------------------------------------------------------------------- + */ + +#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS + +#define H5C__UPDATE_RP_FOR_INSERTION(cache_ptr, entry_ptr, fail_val) \ +{ \ + HDassert( (cache_ptr) ); \ + HDassert( (cache_ptr)->magic == H5C__H5C_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 == (cache_ptr)->trans_num ); \ + HDassert( ( ! ((cache_ptr)->mdj_enabled) ) || \ + ( (cache_ptr)->trans_in_progress ) ); \ + \ + if ( (entry_ptr)->is_pinned ) { \ + \ + H5C__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 ) { \ + \ + HDassert( (cache_ptr)->mdj_enabled ); \ + HDassert( (cache_ptr)->trans_in_progress ); \ + H5C__DLL_PREPEND((entry_ptr), \ + ((cache_ptr)->jwipl_head_ptr), \ + ((cache_ptr)->jwipl_tail_ptr), \ + ((cache_ptr)->jwipl_len), \ + ((cache_ptr)->jwipl_size), fail_val) \ + \ + } else { \ + \ + /* modified LRU specific code */ \ + \ + /* insert the entry at the head of the LRU list. */ \ + \ + H5C__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)) \ + \ + /* insert the entry at the head of the clean or dirty LRU list as \ + * appropriate. \ + */ \ + \ + if ( entry_ptr->is_dirty ) { \ + H5C__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 { \ + H5C__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. */ \ + } \ +} + +#else /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ + +#define H5C__UPDATE_RP_FOR_INSERTION(cache_ptr, entry_ptr, fail_val) \ +{ \ + HDassert( (cache_ptr) ); \ + HDassert( (cache_ptr)->magic == H5C__H5C_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 == (cache_ptr)->trans_num ); \ + HDassert( ( ! ((cache_ptr)->mdj_enabled) ) || \ + ( (cache_ptr)->trans_in_progress ) ); \ + \ + if ( (entry_ptr)->is_pinned ) { \ + \ + H5C__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 ) { \ + \ + HDassert( (cache_ptr)->mdj_enabled ); \ + HDassert( (cache_ptr)->trans_in_progress ); \ + H5C__DLL_PREPEND((entry_ptr), \ + ((cache_ptr)->jwipl_head_ptr), \ + ((cache_ptr)->jwipl_tail_ptr), \ + ((cache_ptr)->jwipl_len), \ + ((cache_ptr)->jwipl_size), (fail_val)) \ + \ + } else { \ + \ + /* modified LRU specific code */ \ + \ + /* insert the entry at the head of the LRU list. */ \ + \ + H5C__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. */ \ + } \ +} + +#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ + + +/*------------------------------------------------------------------------- + * + * Macro: H5C__UPDATE_RP_FOR_JOURNAL_WRITE_COMPLETE + * + * 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 + * the data structures used by the current replacement policy. + * + * At present, we only support the modified LRU policy, so + * this function deals with that case unconditionally. If + * we ever support other replacement policies, the function + * should switch on the current policy and act accordingly. + * + * Note that the macro presumes that the entry's last_trans + * field is zero on entry. + * + * Return: N/A + * + * Programmer: John Mainzer, 3/31/08 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS + +#define H5C__UPDATE_RP_FOR_JOURNAL_WRITE_COMPLETE(cache_ptr, entry_ptr, \ + fail_val) \ +{ \ + HDassert( (cache_ptr) ); \ + HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC ); \ + HDassert( (cache_ptr)->mdj_enabled ); \ + HDassert( (entry_ptr) ); \ + HDassert( !((entry_ptr)->is_protected) ); \ + HDassert( !((entry_ptr)->is_pinned) ); \ + HDassert( !((entry_ptr)->is_read_only) ); \ + HDassert( ((entry_ptr)->ro_ref_count) == 0 ); \ + HDassert( (entry_ptr)->size > 0 ); \ + HDassert( (entry_ptr)->is_dirty ); \ + HDassert( (entry_ptr)->last_trans == 0 ); \ + \ + H5C__DLL_REMOVE((entry_ptr), \ + ((cache_ptr)->jwipl_head_ptr), \ + ((cache_ptr)->jwipl_tail_ptr), \ + ((cache_ptr)->jwipl_len), \ + ((cache_ptr)->jwipl_size), \ + (fail_val)) \ + \ + /* modified LRU specific code */ \ + \ + /* insert the entry at the head of the LRU list. */ \ + \ + H5C__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)) \ + \ + /* insert the entry at the head of the clean or dirty LRU list as \ + * appropriate. \ + */ \ + \ + if ( entry_ptr->is_dirty ) { \ + H5C__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 { \ + H5C__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. */ \ + \ +} /* H5C__UPDATE_RP_FOR_JOURNAL_WRITE_COMPLETE */ + +#else /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ + +#define H5C__UPDATE_RP_FOR_JOURNAL_WRITE_COMPLETE(cache_ptr, entry_ptr, \ + fail_val) \ +{ \ + HDassert( (cache_ptr) ); \ + HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC ); \ + HDassert( (cache_ptr)->mdj_enabled ); \ + HDassert( (entry_ptr) ); \ + HDassert( !((entry_ptr)->is_protected) ); \ + HDassert( !((entry_ptr)->is_pinned) ); \ + HDassert( !((entry_ptr)->is_read_only) ); \ + HDassert( ((entry_ptr)->ro_ref_count) == 0 ); \ + HDassert( (entry_ptr)->size > 0 ); \ + HDassert( (entry_ptr)->is_dirty ); \ + HDassert( (entry_ptr)->last_trans == 0 ); \ + \ + H5C__DLL_REMOVE((entry_ptr), \ + ((cache_ptr)->jwipl_head_ptr), \ + ((cache_ptr)->jwipl_tail_ptr), \ + ((cache_ptr)->jwipl_len), \ + ((cache_ptr)->jwipl_size), \ + (fail_val)) \ + \ + /* modified LRU specific code */ \ + \ + /* insert the entry at the head of the LRU list. */ \ + \ + H5C__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. */ \ + \ +} /* H5C__UPDATE_RP_FOR_JOURNAL_WRITE_COMPLETE */ + +#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ + + +/*------------------------------------------------------------------------- + * + * Macro: H5C__UPDATE_RP_FOR_LOAD + * + * Purpose: Update the replacement policy data structures for a + * 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 + * significant number of cycles, we will have to re-work + * the code to avoid this step. + * + * At present, we only support the modified LRU policy, so + * this function deals with that case unconditionally. If + * we ever support other replacement policies, the function + * should switch on the current policy and act accordingly. + * + * In theory, the loaded entry should be clean, but due + * to a bug fix, it is possible that we will dirty it during + * the load. + * + * Return: N/A + * + * Programmer: John Mainzer, 5/02/08 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS + +#define H5C__UPDATE_RP_FOR_LOAD(cache_ptr, entry_ptr, fail_val) \ +{ \ + HDassert( (cache_ptr) ); \ + HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC ); \ + HDassert( (entry_ptr) ); \ + HDassert( !((entry_ptr)->is_protected) ); \ + HDassert( !((entry_ptr)->is_pinned) ); \ + HDassert( !((entry_ptr)->is_read_only) ); \ + HDassert( ((entry_ptr)->ro_ref_count) == 0 ); \ + HDassert( (entry_ptr)->size > 0 ); \ + HDassert( (entry_ptr)->last_trans == 0 ); \ + \ + /* modified LRU specific code */ \ + \ + /* insert the entry at the head of the LRU list. */ \ + \ + H5C__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)) \ + \ + /* insert the entry at the head of the clean or dirty LRU list as \ + * appropriate. \ + */ \ + \ + if ( entry_ptr->is_dirty ) { \ + H5C__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 { \ + H5C__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. */ \ +} + +#else /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ + +#define H5C__UPDATE_RP_FOR_LOAD(cache_ptr, entry_ptr, fail_val) \ +{ \ + HDassert( (cache_ptr) ); \ + HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC ); \ + HDassert( (entry_ptr) ); \ + HDassert( !((entry_ptr)->is_protected) ); \ + HDassert( !((entry_ptr)->is_pinned) ); \ + HDassert( !((entry_ptr)->is_read_only) ); \ + HDassert( ((entry_ptr)->ro_ref_count) == 0 ); \ + HDassert( (entry_ptr)->size > 0 ); \ + HDassert( (entry_ptr)->last_trans == 0 ); \ + \ + /* modified LRU specific code */ \ + \ + /* insert the entry at the head of the LRU list. */ \ + \ + H5C__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. */ \ +} + +#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ + + +/*------------------------------------------------------------------------- + * + * Macro: H5C__UPDATE_RP_FOR_PROTECT + * + * Purpose: Update the replacement policy data structures for a + * protect of the specified cache entry. + * + * To do this, unlink the specified entry from any data + * structures used by the replacement policy, and add the + * entry to the protected list. + * + * At present, we only support the modified LRU policy, so + * this function deals with that case unconditionally. If + * we ever support other replacement policies, the function + * should switch on the current policy and act accordingly. + * + * Return: N/A + * + * Programmer: John Mainzer, 5/17/04 + * + * Modifications: + * + * JRM - 7/27/04 + * Converted the function H5C_update_rp_for_protect() to the + * macro H5C__UPDATE_RP_FOR_PROTECT in an effort to squeeze + * a bit more performance out of the cache. + * + * At least for the first cut, I am leaving the comments and + * white space in the macro. If they cause dificulties with + * pre-processor, I'll have to remove them. + * + * JRM - 7/28/04 + * Split macro into two version, one supporting the clean and + * dirty LRU lists, and the other not. Yet another attempt + * at optimization. + * + * JRM - 3/17/06 + * Modified macro to attempt to remove pinned entriese from + * the pinned entry list instead of from the data structures + * maintained by the replacement policy. + * + * JRM - 3/28/07 + * Added sanity checks based on the new is_read_only and + * ro_ref_count fields of struct H5C_cache_entry_t. + * + * JRM - 3/29/08 + * Added code to remove the entry from the journal write in + * progress list if appropriate. Also related sanity checks. + * + *------------------------------------------------------------------------- + */ + +#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS + +#define H5C__UPDATE_RP_FOR_PROTECT(cache_ptr, entry_ptr, fail_val) \ +{ \ + HDassert( (cache_ptr) ); \ + HDassert( (cache_ptr)->magic == H5C__H5C_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 ); \ + \ + if ( (entry_ptr)->is_pinned ) { \ + \ + H5C__DLL_REMOVE((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 ) { \ + \ + HDassert( (cache_ptr)->mdj_enabled ); \ + HDassert( (entry_ptr)->is_dirty ); \ + H5C__DLL_REMOVE((entry_ptr), \ + ((cache_ptr)->jwipl_head_ptr), \ + ((cache_ptr)->jwipl_tail_ptr), \ + ((cache_ptr)->jwipl_len), \ + ((cache_ptr)->jwipl_size), \ + (fail_val)) \ + \ + } else { \ + \ + /* modified LRU specific code */ \ + \ + /* remove the entry from the LRU list. */ \ + \ + H5C__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)) \ + \ + /* Similarly, remove the entry from the clean or dirty LRU list \ + * as appropriate. \ + */ \ + \ + if ( (entry_ptr)->is_dirty ) { \ + \ + H5C__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 { \ + \ + H5C__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)) \ + } \ + \ + /* End modified LRU specific code. */ \ + } \ + \ + /* Regardless of the replacement policy, or whether the entry is \ + * pinned, now add the entry to the protected list. \ + */ \ + \ + H5C__DLL_APPEND((entry_ptr), (cache_ptr)->pl_head_ptr, \ + (cache_ptr)->pl_tail_ptr, \ + (cache_ptr)->pl_len, \ + (cache_ptr)->pl_size, (fail_val)) \ +} /* H5C__UPDATE_RP_FOR_PROTECT */ + +#else /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ + +#define H5C__UPDATE_RP_FOR_PROTECT(cache_ptr, entry_ptr, fail_val) \ +{ \ + HDassert( (cache_ptr) ); \ + HDassert( (cache_ptr)->magic == H5C__H5C_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 ); \ + \ + if ( (entry_ptr)->is_pinned ) { \ + \ + H5C__DLL_REMOVE((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 ) { \ + \ + HDassert( (cache_ptr)->mdj_enabled ); \ + HDassert( (entry_ptr)->is_dirty ); \ + H5C__DLL_REMOVE((entry_ptr), \ + ((cache_ptr)->jwipl_head_ptr), \ + ((cache_ptr)->jwipl_tail_ptr), \ + ((cache_ptr)->jwipl_len), \ + ((cache_ptr)->jwipl_size), \ + (fail_val)) \ + \ + } else { \ + \ + /* modified LRU specific code */ \ + \ + /* remove the entry from the LRU list. */ \ + \ + H5C__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)) \ + \ + /* End modified LRU specific code. */ \ + } \ + \ + /* Regardless of the replacement policy, or whether the entry is \ + * pinned, now add the entry to the protected list. \ + */ \ + \ + H5C__DLL_APPEND((entry_ptr), (cache_ptr)->pl_head_ptr, \ + (cache_ptr)->pl_tail_ptr, \ + (cache_ptr)->pl_len, \ + (cache_ptr)->pl_size, (fail_val)) \ +} /* H5C__UPDATE_RP_FOR_PROTECT */ + +#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ + + +/*------------------------------------------------------------------------- + * + * Macro: H5C__UPDATE_RP_FOR_RENAME + * + * Purpose: Update the replacement policy data structures for a + * rename of the specified cache entry. + * + * At present, we only support the modified LRU policy, so + * this function deals with that case unconditionally. If + * we ever support other replacement policies, the function + * should switch on the current policy and act accordingly. + * + * Return: N/A + * + * Programmer: John Mainzer, 5/17/04 + * + * Modifications: + * + * JRM - 7/27/04 + * Converted the function H5C_update_rp_for_rename() to the + * macro H5C__UPDATE_RP_FOR_RENAME in an effort to squeeze + * a bit more performance out of the cache. + * + * At least for the first cut, I am leaving the comments and + * white space in the macro. If they cause dificulties with + * pre-processor, I'll have to remove them. + * + * JRM - 7/28/04 + * Split macro into two version, one supporting the clean and + * dirty LRU lists, and the other not. Yet another attempt + * at optimization. + * + * JRM - 6/23/05 + * Added the was_dirty parameter. It is possible that + * the entry was clean when it was renamed -- if so it + * it is in the clean LRU regardless of the current + * value of the is_dirty field. + * + * At present, all renamed entries are forced to be + * dirty. This macro is a bit more general that that, + * to allow it to function correctly should that policy + * be relaxed in the future. + * + * JRM - 3/17/06 + * Modified macro to do nothing if the entry is pinned. + * In this case, the entry is on the pinned entry list, not + * in the replacement policy data structures, so there is + * nothing to be done. + * + * JRM - 3/28/07 + * Added sanity checks using the new is_read_only and + * ro_ref_count fields of struct H5C_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. + * + *------------------------------------------------------------------------- + */ + +#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS + +#define H5C__UPDATE_RP_FOR_RENAME(cache_ptr, entry_ptr, was_dirty, \ + had_jwip, fail_val) \ +{ \ + HDassert( (cache_ptr) ); \ + HDassert( (cache_ptr)->magic == H5C__H5C_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 ); \ + /* read following as: had_jwip => (entry_ptr)->last_trans != 0 */ \ + HDassert( ( (entry_ptr)->last_trans != 0 ) || ( ! (had_jwip) ) ); \ + \ + if ( ! ( (entry_ptr)->is_pinned ) ) { \ + \ + /* remove the entry from either the jwip list, or from the current \ + * replacement policy data structures, as appropriate. \ + */ \ + if ( had_jwip ) { /* must be on jwip list */ \ + \ + HDassert( (cache_ptr)->mdj_enabled ); \ + HDassert( (cache_ptr)->trans_in_progress ); \ + HDassert( (entry_ptr)->last_trans != 0 ); \ + HDassert( was_dirty ); \ + HDassert( (entry_ptr)->is_dirty ); \ + H5C__DLL_REMOVE((entry_ptr), \ + ((cache_ptr)->jwipl_head_ptr), \ + ((cache_ptr)->jwipl_tail_ptr), \ + ((cache_ptr)->jwipl_len), \ + ((cache_ptr)->jwipl_size), \ + (fail_val)) \ + \ + } else { /* must be in replacement policy data structures */ \ + \ + /* begin modified LRU specific code */ \ + \ + /* remove the entry from the LRU list */ \ + \ + H5C__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)) \ + \ + /* remove the entry from either the clean or dirty LUR list as \ + * indicated by the was_dirty parameter \ + */ \ + if ( was_dirty ) { \ + \ + H5C__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 { \ + \ + H5C__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)) \ + } \ + /* end modified LRU specific code */ \ + } \ + /* insert in either jwip list, or replacement policy data structures \ + * as appropriate. \ + */ \ + if ( (entry_ptr)->last_trans != 0 ) { /* goes in jwip list */ \ + \ + HDassert( (cache_ptr)->mdj_enabled ); \ + HDassert( (cache_ptr)->trans_in_progress ); \ + HDassert( (entry_ptr)->is_dirty ); \ + H5C__DLL_PREPEND((entry_ptr), \ + ((cache_ptr)->jwipl_head_ptr), \ + ((cache_ptr)->jwipl_tail_ptr), \ + ((cache_ptr)->jwipl_len), \ + ((cache_ptr)->jwipl_size), fail_val) \ + \ + } else { /* goes back in the replacement policy data structures */ \ + \ + /* begin modified LRU specific code */ \ + \ + H5C__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)) \ + \ + /* insert the entry at the head of either the clean or dirty \ + * LRU list as appropriate. \ + */ \ + \ + if ( (entry_ptr)->is_dirty ) { \ + \ + H5C__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 { \ + \ + H5C__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. */ \ + } \ + } \ +} /* H5C__UPDATE_RP_FOR_RENAME */ + +#else /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ + +#define H5C__UPDATE_RP_FOR_RENAME(cache_ptr, entry_ptr, was_dirty, \ + had_jwip, fail_val) \ +{ \ + HDassert( (cache_ptr) ); \ + HDassert( (cache_ptr)->magic == H5C__H5C_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 ); \ + /* read following as: had_jwip => (entry_ptr)->last_trans != 0 */ \ + HDassert( ( (entry_ptr)->last_trans != 0 ) || ( ! (had_jwip) ) ); \ + \ + if ( ! ( (entry_ptr)->is_pinned ) ) { \ + \ + /* remove the entry from either the jwip list, or from the current \ + * replacement policy data structures, as appropriate. \ + */ \ + if ( had_jwip ) { /* must be on jwip list */ \ + \ + HDassert( (cache_ptr)->mdj_enabled ); \ + HDassert( (cache_ptr)->trans_in_progress ); \ + HDassert( (entry_ptr)->last_trans != 0 ); \ + HDassert( was_dirty ); \ + HDassert( (entry_ptr)->is_dirty ); \ + H5C__DLL_REMOVE((entry_ptr), \ + ((cache_ptr)->jwipl_head_ptr), \ + ((cache_ptr)->jwipl_tail_ptr), \ + ((cache_ptr)->jwipl_len), \ + ((cache_ptr)->jwipl_size), \ + (fail_val)) \ + \ + } else { /* must be in replacement policy data structures */ \ + \ + /* begin modified LRU specific code */ \ + \ + /* remove the entry from the LRU list */ \ + \ + H5C__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)) \ + \ + /* end modified LRU specific code */ \ + } \ + /* insert in either jwip list, or replacement policy data \ + * structures as appropriate. \ + */ \ + if ( (entry_ptr)->last_trans != 0 ) { /* goes in jwip list */ \ + \ + HDassert( (cache_ptr)->mdj_enabled ); \ + HDassert( (cache_ptr)->trans_in_progress ); \ + HDassert( (entry_ptr)->is_dirty ); \ + H5C__DLL_PREPEND((entry_ptr), \ + ((cache_ptr)->jwipl_head_ptr), \ + ((cache_ptr)->jwipl_tail_ptr), \ + ((cache_ptr)->jwipl_len), \ + ((cache_ptr)->jwipl_size), fail_val) \ + \ + } else { /* goes back in the replacement policy data structures */ \ + \ + /* begin modified LRU specific code */ \ + \ + H5C__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. */ \ + } \ + } \ +} /* H5C__UPDATE_RP_FOR_RENAME */ + +#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ + + +/*------------------------------------------------------------------------- + * + * Macro: H5C__UPDATE_RP_FOR_SIZE_CHANGE + * + * Purpose: Update the replacement policy data structures for a + * size change of the specified cache entry. + * + * 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 + * replacement policy. Update the appropriate replacement + * policy data structures. + * + * At present, we only support the modified LRU policy, so + * this function deals with that case unconditionally. If + * we ever support other replacement policies, the function + * should switch on the current policy and act accordingly. + * + * Return: N/A + * + * Programmer: John Mainzer, 8/23/06 + * + * Modifications: + * + * JRM -- 3/28/07 + * Added sanity checks based on the new is_read_only and + * ro_ref_count fields of struct H5C_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 + * is, update the size of that list. If not, proceed as + * before. + * + *------------------------------------------------------------------------- + */ + +#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS + +#define H5C__UPDATE_RP_FOR_SIZE_CHANGE(cache_ptr, entry_ptr, new_size) \ +{ \ + HDassert( (cache_ptr) ); \ + HDassert( (cache_ptr)->magic == H5C__H5C_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( new_size > 0 ); \ + \ + if ( (entry_ptr)->is_pinned ) { \ + \ + H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->pel_len, \ + (cache_ptr)->pel_size, \ + (entry_ptr)->size, \ + (new_size)); \ + \ + } else if ( (entry_ptr)->last_trans != 0 ) { \ + \ + HDassert( (cache_ptr)->mdj_enabled ); \ + HDassert( (entry_ptr)->is_dirty ); \ + H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->jwipl_len, \ + (cache_ptr)->jwipl_size, \ + (entry_ptr)->size, \ + (new_size)); \ + \ + } else { \ + \ + /* modified LRU specific code */ \ + \ + /* Update the size of the LRU list */ \ + \ + H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->LRU_list_len, \ + (cache_ptr)->LRU_list_size, \ + (entry_ptr)->size, \ + (new_size)); \ + \ + /* Similarly, update the size of the clean or dirty LRU list as \ + * appropriate. At present, the entry must be clean, but that \ + * could change. \ + */ \ + \ + if ( (entry_ptr)->is_dirty ) { \ + \ + H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->dLRU_list_len, \ + (cache_ptr)->dLRU_list_size, \ + (entry_ptr)->size, \ + (new_size)); \ + \ + } else { \ + \ + H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->cLRU_list_len, \ + (cache_ptr)->cLRU_list_size, \ + (entry_ptr)->size, \ + (new_size)); \ + } \ + \ + /* End modified LRU specific code. */ \ + } \ + \ +} /* H5C__UPDATE_RP_FOR_SIZE_CHANGE */ + +#else /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ + +#define H5C__UPDATE_RP_FOR_SIZE_CHANGE(cache_ptr, entry_ptr, new_size) \ +{ \ + HDassert( (cache_ptr) ); \ + HDassert( (cache_ptr)->magic == H5C__H5C_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( new_size > 0 ); \ + \ + if ( (entry_ptr)->is_pinned ) { \ + \ + H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->pel_len, \ + (cache_ptr)->pel_size, \ + (entry_ptr)->size, \ + (new_size)); \ + \ + } else if ( (entry_ptr)->last_trans != 0 ) { \ + \ + HDassert( (cache_ptr)->mdj_enabled ); \ + HDassert( (entry_ptr)->is_dirty ); \ + H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->jwipl_len, \ + (cache_ptr)->jwipl_size, \ + (entry_ptr)->size, \ + (new_size)); \ + \ + } else { \ + \ + /* modified LRU specific code */ \ + \ + /* Update the size of the LRU list */ \ + \ + H5C__DLL_UPDATE_FOR_SIZE_CHANGE((cache_ptr)->LRU_list_len, \ + (cache_ptr)->LRU_list_size, \ + (entry_ptr)->size, \ + (new_size)); \ + \ + /* End modified LRU specific code. */ \ + } \ + \ +} /* H5C__UPDATE_RP_FOR_SIZE_CHANGE */ + +#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ + + +/*------------------------------------------------------------------------- + * + * Macro: H5C__UPDATE_RP_FOR_UNPIN + * + * Purpose: Update the replacement policy data structures for an + * unpin of the specified cache entry. + * + * To do this, unlink the specified entry from the protected + * entry list, and re-insert it in the data structures used + * by the current replacement policy. + * + * At present, we only support the modified LRU policy, so + * this function deals with that case unconditionally. If + * we ever support other replacement policies, the macro + * should switch on the current policy and act accordingly. + * + * Return: N/A + * + * Programmer: John Mainzer, 3/22/06 + * + * Modifications: + * + * JRM -- 3/28/07 + * Added sanity checks based on the new is_read_only and + * ro_ref_count fields of struct H5C_cache_entry_t. + * + * JRM -- 3/30/08 + * Added code to place the newly unpinned entry on the + * journal write pending list if appropriate. + * + *------------------------------------------------------------------------- + */ + +#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS + +#define H5C__UPDATE_RP_FOR_UNPIN(cache_ptr, entry_ptr, fail_val) \ +{ \ + HDassert( (cache_ptr) ); \ + HDassert( (cache_ptr)->magic == H5C__H5C_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)->is_pinned); \ + HDassert( (entry_ptr)->size > 0 ); \ + \ + /* Regardless of the replacement policy, remove the entry from the \ + * pinned entry list. \ + */ \ + H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->pel_head_ptr, \ + (cache_ptr)->pel_tail_ptr, (cache_ptr)->pel_len, \ + (cache_ptr)->pel_size, (fail_val)) \ + \ + if ( (entry_ptr)->last_trans != 0 ) { \ + \ + /* put the entry in the jwip list */ \ + HDassert( (cache_ptr)->mdj_enabled ); \ + HDassert( (entry_ptr)->is_dirty ); \ + H5C__DLL_PREPEND((entry_ptr), \ + ((cache_ptr)->jwipl_head_ptr), \ + ((cache_ptr)->jwipl_tail_ptr), \ + ((cache_ptr)->jwipl_len), \ + ((cache_ptr)->jwipl_size), fail_val) \ + \ + } else { /* put entry in the replacement policy data structures */ \ + \ + /* modified LRU specific code */ \ + \ + /* insert the entry at the head of the LRU list. */ \ + \ + H5C__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. \ + */ \ + \ + if ( (entry_ptr)->is_dirty ) { \ + \ + H5C__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 { \ + \ + H5C__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. */ \ + } \ + \ +} /* H5C__UPDATE_RP_FOR_UNPIN */ + +#else /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ + +#define H5C__UPDATE_RP_FOR_UNPIN(cache_ptr, entry_ptr, fail_val) \ +{ \ + HDassert( (cache_ptr) ); \ + HDassert( (cache_ptr)->magic == H5C__H5C_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)->is_pinned); \ + HDassert( (entry_ptr)->size > 0 ); \ + \ + /* Regardless of the replacement policy, remove the entry from the \ + * pinned entry list. \ + */ \ + H5C__DLL_REMOVE((entry_ptr), (cache_ptr)->pel_head_ptr, \ + (cache_ptr)->pel_tail_ptr, (cache_ptr)->pel_len, \ + (cache_ptr)->pel_size, (fail_val)) \ + \ + if ( (entry_ptr)->last_trans != 0 ) { \ + \ + /* put the entry in the jwip list */ \ + HDassert( (cache_ptr)->mdj_enabled ); \ + HDassert( (entry_ptr)->is_dirty ); \ + H5C__DLL_PREPEND((entry_ptr), \ + ((cache_ptr)->jwipl_head_ptr), \ + ((cache_ptr)->jwipl_tail_ptr), \ + ((cache_ptr)->jwipl_len), \ + ((cache_ptr)->jwipl_size), fail_val) \ + \ + } else { /* put entry in the replacement policy data structures */ \ + \ + /* modified LRU specific code */ \ + \ + /* insert the entry at the head of the LRU list. */ \ + \ + H5C__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. */ \ + } \ + \ +} /* H5C__UPDATE_RP_FOR_UNPIN */ + +#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ + + +/*------------------------------------------------------------------------- + * + * Macro: H5C__UPDATE_RP_FOR_UNPROTECT + * + * Purpose: Update the replacement policy data structures for an + * unprotect of the specified cache entry. + * + * To do this, unlink the specified entry from the protected + * list, and re-insert it in the data structures used by the + * current replacement policy. + * + * At present, we only support the modified LRU policy, so + * this function deals with that case unconditionally. If + * we ever support other replacement policies, the function + * should switch on the current policy and act accordingly. + * + * Return: N/A + * + * Programmer: John Mainzer, 5/19/04 + * + * Modifications: + * + * JRM - 7/27/04 + * Converted the function H5C_update_rp_for_unprotect() to + * the macro H5C__UPDATE_RP_FOR_UNPROTECT in an effort to + * squeeze a bit more performance out of the cache. + * + * At least for the first cut, I am leaving the comments and + * white space in the macro. If they cause dificulties with + * pre-processor, I'll have to remove them. + * + * JRM - 7/28/04 + * Split macro into two version, one supporting the clean and + * dirty LRU lists, and the other not. Yet another attempt + * at optimization. + * + * JRM - 3/17/06 + * Modified macro to put pinned entries on the pinned entry + * list instead of inserting them in the data structures + * maintained by the replacement policy. + * + * JRM - 3/30/08 + * Modified macro to put un-pinned entries with pending + * journal writes on the journal write in progress list. + * + *------------------------------------------------------------------------- + */ + +#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS + +#define H5C__UPDATE_RP_FOR_UNPROTECT(cache_ptr, entry_ptr, fail_val) \ +{ \ + HDassert( (cache_ptr) ); \ + HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC ); \ + HDassert( (entry_ptr) ); \ + HDassert( (entry_ptr)->is_protected); \ + HDassert( (entry_ptr)->size > 0 ); \ + \ + /* Regardless of the replacement policy, remove the entry from the \ + * protected list. \ + */ \ + H5C__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 ) { \ + \ + H5C__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 ); \ + H5C__DLL_PREPEND((entry_ptr), \ + ((cache_ptr)->jwipl_head_ptr), \ + ((cache_ptr)->jwipl_tail_ptr), \ + ((cache_ptr)->jwipl_len), \ + ((cache_ptr)->jwipl_size), fail_val) \ + \ + } else { /* put the entry in the replacement policy data structures */ \ + \ + /* modified LRU specific code */ \ + \ + /* insert the entry at the head of the LRU list. */ \ + \ + H5C__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. \ + */ \ + \ + if ( (entry_ptr)->is_dirty ) { \ + \ + H5C__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 { \ + \ + H5C__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. */ \ + } \ + \ +} /* H5C__UPDATE_RP_FOR_UNPROTECT */ + +#else /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ + +#define H5C__UPDATE_RP_FOR_UNPROTECT(cache_ptr, entry_ptr, fail_val) \ +{ \ + HDassert( (cache_ptr) ); \ + HDassert( (cache_ptr)->magic == H5C__H5C_T_MAGIC ); \ + HDassert( (entry_ptr) ); \ + HDassert( (entry_ptr)->is_protected); \ + HDassert( (entry_ptr)->size > 0 ); \ + \ + /* Regardless of the replacement policy, remove the entry from the \ + * protected list. \ + */ \ + H5C__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 ) { \ + \ + H5C__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 ); \ + H5C__DLL_PREPEND((entry_ptr), \ + ((cache_ptr)->jwipl_head_ptr), \ + ((cache_ptr)->jwipl_tail_ptr), \ + ((cache_ptr)->jwipl_len), \ + ((cache_ptr)->jwipl_size), fail_val) \ + \ + } else { \ + \ + /* modified LRU specific code */ \ + \ + /* insert the entry at the head of the LRU list. */ \ + \ + H5C__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. */ \ + } \ +} /* H5C__UPDATE_RP_FOR_UNPROTECT */ + +#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ + + +/************************************************************************** + * + * Transaction list update macros: + * + * When journaling is enabled, we must maintain the transaction list -- the + * list of all entries that have been dirtied during the current + * transaction. + * + * The following macros exist to support this task. + * + **************************************************************************/ + +/*------------------------------------------------------------------------- + * + * Macro: H5C__INSERT_ENTRY_IN_TL() + * + * Purpose: Check to see if journaling is enabled. + * + * If it is, set the last_trans field of the target entry + * to the current transaction number, and insert the entry + * in the transaction list. + * + * Return: N/A + * + * Programmer: John Mainzer, 3/31/08 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +#define H5C__INSERT_ENTRY_IN_TL(cache_ptr, entry_ptr, fail_val) \ +if ( cache_ptr->mdj_enabled ) \ +{ \ + HDassert( cache_ptr->trans_in_progress ); \ + HDassert( entry_ptr->last_trans == 0 ); \ + \ + entry_ptr->last_trans = cache_ptr->trans_num; \ + \ + H5C__TRANS_DLL_PREPEND((entry_ptr), (cache_ptr->tl_head_ptr), \ + (cache_ptr->tl_tail_ptr), \ + (cache_ptr->tl_len), (cache_ptr->tl_size), \ + (fail_val)); \ +} /* H5C__INSERT_ENTRY_IN_TL */ + + +/*------------------------------------------------------------------------- + * + * Macro: H5C__UPDATE_TL_FOR_ENTRY_CLEAR + * + * 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 + * last_trans field to zero. + * + * Return: N/A + * + * Programmer: John Mainzer, 3/31/08 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +#define H5C__UPDATE_TL_FOR_ENTRY_CLEAR(cache_ptr, entry_ptr, fail_val) \ +if ( cache_ptr->mdj_enabled ) \ +{ \ + HDassert( cache_ptr->trans_in_progress ); \ + HDassert( entry_ptr->last_trans <= cache_ptr->trans_num ); \ + \ + if ( entry_ptr->last_trans == cache_ptr->trans_num ) { \ + \ + H5C__TRANS_DLL_REMOVE((entry_ptr), (cache_ptr->tl_head_ptr), \ + (cache_ptr->tl_tail_ptr), \ + (cache_ptr->tl_len), \ + (cache_ptr->tl_size), (fail_val)); \ + entry_ptr->last_trans = 0; \ + } \ +} /* H5C__UPDATE_TL_FOR_ENTRY_CLEAR */ + + +/*------------------------------------------------------------------------- + * + * Macro: H5C__UPDATE_TL_FOR_ENTRY_DIRTY + * + * 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. If it isn't, + * set the entries last_trans field to the id of the current + * transaction. + * + * In either case, then insert the entry at the head of the + * transaction list. + * + * Return: N/A + * + * Programmer: John Mainzer, 3/31/08 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +#define H5C__UPDATE_TL_FOR_ENTRY_DIRTY(cache_ptr, entry_ptr, fail_val) \ +if ( cache_ptr->mdj_enabled ) \ +{ \ + HDassert( cache_ptr->trans_in_progress ); \ + HDassert( entry_ptr->last_trans <= cache_ptr->trans_num ); \ + \ + if ( entry_ptr->last_trans == cache_ptr->trans_num ) { \ + \ + H5C__TRANS_DLL_REMOVE((entry_ptr), (cache_ptr->tl_head_ptr), \ + (cache_ptr->tl_tail_ptr), \ + (cache_ptr->tl_len), \ + (cache_ptr->tl_size), (fail_val)); \ + } else { \ + entry_ptr->last_trans = cache_ptr->trans_num; \ + } \ + \ + H5C__TRANS_DLL_PREPEND((entry_ptr), (cache_ptr->tl_head_ptr), \ + (cache_ptr->tl_tail_ptr), \ + (cache_ptr->tl_len), (cache_ptr->tl_size), \ + (fail_val)); \ +} /* H5C__UPDATE_TL_FOR_ENTRY_DIRTY */ + + +/*------------------------------------------------------------------------- + * + * Macro: H5C__UPDATE_TL_FOR_ENTRY_SIZE_CHANGE + * + * 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 + * transaction list if it should be. + * + * Return: N/A + * + * Programmer: John Mainzer, 3/31/08 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +#define H5C__UPDATE_TL_FOR_ENTRY_SIZE_CHANGE(cache_ptr, entry_ptr, \ + old_size, new_size) \ +if ( ( (cache_ptr)->mdj_enabled ) && \ + ( (entry_ptr)->last_trans == (cache_ptr)->trans_num ) ) { \ + HDassert( (cache_ptr)->trans_in_progress ); \ + H5C__DLL_UPDATE_FOR_SIZE_CHANGE(((cache_ptr)->tl_len), \ + ((cache_ptr)->tl_size), \ + (old_size), (new_size)); \ +} /* H5C__UPDATE_TL_FOR_ENTRY_SIZE_CHANGE() */ + + +/*------------------------------------------------------------------------- + * + * Macro: H5C__JBRB__UPDATE_STATS_FOR* macros + * + * Purpose: This set of macros exists to update the various journal + * buffer ring buffer stats fields when + * H5C__JBRB__COLLECT_STATS is TRUE, and do nothing when + * it is false. + * + * Return: N/A + * + * Programmer: John Mainzer, 2/21/10 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + + +#if H5C__JBRB__COLLECT_STATS + +#define H5C__JBRB__UPDATE_STATS_FOR_TRANS_COMPLETED(struct_ptr) \ + ((struct_ptr)->transactions_completed)++; + +#define H5C__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 H5C__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 H5C__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 H5C__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 H5C__JBRB__UPDATE_STATS_FOR_AIO_ERROR_CALL_AWAITING_SYNC(struct_ptr) \ + ((struct_ptr)->calls_to_aio_error_awaiting_sync)++; + +#define H5C__JBRB__UPDATE_STATS_FOR_CALL_TO_FSYNC(struct_ptr) \ + ((struct_ptr)->calls_to_fsync)++; + +#else /* H5C__JBRB__COLLECT_STATS */ + +#define H5C__JBRB__UPDATE_STATS_FOR_TRANS_COMPLETED(struct_ptr) + +#define H5C__JBRB__UPDATE_STATS_FOR_BUF_WRITE_QUEUED(struct_ptr, partial) + +#define H5C__JBRB__UPDATE_STATS_FOR_BUF_WRITE_COMPLETE(struct_ptr, await) + +#define H5C__JBRB__UPDATE_STATS_FOR_ASYNC_SYNCS_QUEUED(struct_ptr) + +#define H5C__JBRB__UPDATE_STATS_FOR_ASYNC_SYNC_COMPLETED(struct_ptr, await) + +#define H5C__JBRB__UPDATE_STATS_FOR_AIO_ERROR_CALL_AWAITING_SYNC(struct_ptr) + +#define H5C__JBRB__UPDATE_STATS_FOR_CALL_TO_FSYNC(struct_ptr) + +#endif /* H5C__JBRB__COLLECT_STATS */ +#endif /* _H5Cpkg_H */ diff --git a/src/H5Cprivate.h b/src/H5Cprivate.h new file mode 100644 index 0000000..453113a --- /dev/null +++ b/src/H5Cprivate.h @@ -0,0 +1,1688 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * Copyright by the Board of Trustees of the University of Illinois. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/*------------------------------------------------------------------------- + * + * Created: H5Cprivate.h + * 6/3/04 + * John Mainzer + * + * Purpose: Constants and typedefs available to the rest of the + * library. + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +#ifndef _H5Cprivate_H +#define _H5Cprivate_H + +#include "H5Cpublic.h" /* public prototypes */ + +/* Pivate headers needed by this header */ +#include "H5private.h" /* Generic Functions */ +#include "H5Fprivate.h" /* File access */ + + +#define H5C_DO_SANITY_CHECKS 1 +#define H5C_DO_EXTREME_SANITY_CHECKS 0 + +/* This sanity checking constant was picked out of the air. Increase + * or decrease it if appropriate. Its purposes is to detect corrupt + * object sizes, so it probably doesn't matter if it is a bit big. + * + * JRM - 5/17/04 + */ +#define H5C_MAX_ENTRY_SIZE ((size_t)(10 * 1024 * 1024)) + +/* H5C_COLLECT_CACHE_STATS controls overall collection of statistics + * on cache activity. In general, this #define should be set to 0. + */ +#define H5C_COLLECT_CACHE_STATS 1 + +/* H5C_COLLECT_CACHE_ENTRY_STATS controls collection of statistics + * in individual cache entries. + * + * H5C_COLLECT_CACHE_ENTRY_STATS should only be defined to true if + * H5C_COLLECT_CACHE_STATS is also defined to true. + */ +#if H5C_COLLECT_CACHE_STATS + +#define H5C_COLLECT_CACHE_ENTRY_STATS 1 + +#else + +#define H5C_COLLECT_CACHE_ENTRY_STATS 0 + +#endif /* H5C_COLLECT_CACHE_STATS */ + + +#ifdef H5_HAVE_PARALLEL + +/* we must maintain the clean and dirty LRU lists when we are compiled + * with parallel support. + */ +#define H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS 1 + +#else /* H5_HAVE_PARALLEL */ + +/* The clean and dirty LRU lists don't buy us anything here -- we may + * want them on for testing on occasion, but in general they should be + * off. + */ +#define H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS 0 /* JRM */ + +#endif /* H5_HAVE_PARALLEL */ + + +/* Typedef for the main structure for the cache (defined in H5Cpkg.h) */ + +typedef struct H5C_t H5C_t; + + +/*************************************************************************** + * + * Struct H5C_class_t + * + * Instances of H5C_class_t are used to specify the callback functions + * used by the metadata cache for each class of metadata cache entry. + * The fields of the structure are discussed below: + * + * id: Integer field containing the unique ID of the class of metadata + * cache entries. + * + * 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 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, + * and return a pointer to that representation. + * + * The typedef for the deserialize callback is as follows: + * + * typedef void *(*H5C_deserialize_func_t)(haddr_t addr, + * size_t len, + * const void * image_ptr, + * void * udata_ptr, + * boolean * dirty_ptr); + * + * The parameters of the deserialize callback are as follows: + * + * addr: Base address in file of the image to be deserialized. + * + * 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 in bytes of the in file image to be deserialized. + * + * 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. + * + * 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 + * must be passed through to the deserialize callback. + * + * dirty_ptr: Pointer to boolean which the deserialize function + * must use to mark the entry dirty if it has to modify + * the entry to clean up file corruption left over from + * an old bug in the HDF5 library. + * + * 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 H5C_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 + * 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 will be set to FALSE before the deserialize call. + * + * If the operation fails for any reason (i.e. bad data in buffer, bad + * buffer length, malloc failure, etc.) the function must return NULL and + * push error information on the error stack with the error API routines. + * + * If the protect call which occasioned the call to the deserialize + * callback had the check length flag set, after the deserialize call + * returns, the cache must call the image_len callback (see below) and + * update its on disk image length accordingly. + * + * + * image_len: Pointer to the image length callback. + * + * In the best of all possible worlds, we would not have this callback. + * It exists to allow clients to reduce the size of the on disk image of + * an entry in the deserialize callback. + * + * The typedef for the image_len callback is as follows: + * + * typedef herr_t (*H5C_image_len_func_t)(void *thing, + * size_t *image_len_ptr); + * + * The parameters of the image_len callback are as follows: + * + * thing: Pointer to the in core representation of the entry. + * + * image_len_ptr: Pointer to size_t in which the callback will return + * the length of the on disk image of the cache entry. + * + * Processing in the image_len function should proceed as follows: + * + * If successful, the function will place the length of the on disk + * image associated with the in core representation provided in the + * thing parameter in *image_len_ptr, and then return SUCCEED. + * + * On failure, the function must return FAIL and push error information + * onto the error stack with the error API routines. + * + * + * 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 + * 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 H5C, 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: + * + * typedef herr_t (*H5C_serialize_func_t)(const H5F_t *f, + * hid_t dxpl_id, + * haddr_t addr, + * size_t len, + * void * image_ptr, + * void * thing, + * unsigned * flags_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 + * 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 + * possibly other entries on serialize. + * + * addr: Base address in file of the entry to be serialized. + * + * 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 in bytes of the in file image of the entry to be + * serialized. Also the size of *image_ptr (below). + * + * 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. + * + * 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 + * 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 + * 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. + * H5C__SERIALIZE_RESIZED_FLAG and H5C__SERIALIZE_RENAMED_FLAG + * must be set to indicate a resize and a rename respectively. + * + * If the H5C__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 H5C__SERIALIZE_RENAMED_FLAG flag is also set, the + * new image base address must be stored in *new_addr_ptr. + * Observe that the H5C__SERIALIZE_RENAMED_FLAG must not + * appear without the H5C__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: + * + * 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 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 + * H5C__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 H5C__SERIALIZE_RENAMED_FLAG + * in *flags_ptr. + * + * 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 + * 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 typedef for the free ICR callback is as follows: + * + * 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: + * + * 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. + * + * 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. + * + * 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: + * + * The free ICR function must free all memory allocated to the + * in core representation. + * + * 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. + * + * 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. + * + * 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. + * + * 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: + * + * typedef herr_t (*N5C_clear_dirty_bits_func_t)(haddr_t addr, + * size_t len, + * void * thing); + * + * The parameters of the clear callback are as follows: + * + * 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. + * + * 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: + * + * The function must clear any dirty bits associated with the ICR. + * + * 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 + * routines. + * + ***************************************************************************/ +typedef void *(*H5C_deserialize_func_t)(haddr_t addr, + size_t len, + const void * image_ptr, + void * udata_ptr, + hbool_t * dirty_ptr); + +typedef herr_t (*H5C_image_len_func_t)(const void *thing, + size_t *image_len_ptr); + +#define H5C__SERIALIZE_RESIZED_FLAG 0x1 +#define H5C__SERIALIZE_RENAMED_FLAG 0x2 + +typedef herr_t (*H5C_serialize_func_t)(const H5F_t *f, + hid_t dxpl_id, + haddr_t addr, + size_t len, + void * image_ptr, + void * thing, + unsigned * flags_ptr, + haddr_t * new_addr_ptr, + size_t * new_len_ptr, + void ** new_image_ptr_ptr); + +typedef herr_t (*H5C_free_icr_func_t)(haddr_t addr, + size_t len, + void * thing); + +typedef herr_t (*H5C_clear_dirty_bits_func_t)(haddr_t addr, + size_t len, + void * thing); + +typedef struct H5C_class_t { + int id; + const char * name; + H5FD_mem_t mem_type; + H5C_deserialize_func_t deserialize; + H5C_image_len_func_t image_len; + H5C_serialize_func_t serialize; + H5C_free_icr_func_t free_icr; + H5C_clear_dirty_bits_func_t clear_dirty_bits; +} H5C_class_t; + + +/* Type defintions of call back functions used by the cache as a whole */ + +typedef herr_t (*H5C_write_permitted_func_t)(const H5F_t *f, + hid_t dxpl_id, + hbool_t * write_permitted_ptr); + +typedef herr_t (*H5C_log_flush_func_t)(H5C_t * cache_ptr, + haddr_t addr, + hbool_t was_dirty, + unsigned flags, + int type_id); + +/* Upper and lower limits on cache size. These limits are picked + * out of a hat -- you should be able to change them as necessary. + * + * However, if you need a very big cache, you should also increase the + * size of the hash table (H5C__HASH_TABLE_LEN in H5Cpkg.h). The current + * upper bound on cache size is rather large for the current hash table + * size. + */ + +#define H5C__MAX_MAX_CACHE_SIZE ((size_t)(128 * 1024 * 1024)) +#define H5C__MIN_MAX_CACHE_SIZE ((size_t)(1024)) + + +/* Default max cache size and min clean size are give here to make + * them generally accessable. + */ + +#define H5C__DEFAULT_MAX_CACHE_SIZE ((size_t)(4 * 1024 * 1024)) +#define H5C__DEFAULT_MIN_CLEAN_SIZE ((size_t)(2 * 1024 * 1024)) + + +/**************************************************************************** + * + * structure H5C_cache_entry_t + * + * Instances of the H5C_cache_entry_t structure are used to store cache + * entries in a hash table and sometimes in a skip list. + * See H5SL.c for the particulars of the skip list. + * + * In typical application, this structure is the first field in a + * structure to be cached. For historical reasons, the external module + * is responsible for managing the is_dirty field (this is no longer + * completely true. See the comment on the is_dirty field for details). + * All other fields are managed by the cache. + * + * The fields of this structure are discussed individually below: + * + * JRM - 4/26/04 + * + * magic: Unsigned 32 bit integer that must always be set to + * H5C__H5C_CACHE_ENTRY_T_MAGIC when the entry is valid. + * The field must be set to H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC + * just before the entry is freed. + * + * This is necessary, as the LRU list can be changed out + * from under H5C_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 + * H5C_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 H5C_make_space_in_cache() to + * 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. + * + * addr: Base address of the cache entry on disk. + * + * size: Length of the cache entry on disk. Note that unlike normal + * caches, the entries in this cache are of variable length. + * The entries should never overlap, and when we do writebacks, + * we will want to writeback adjacent entries where possible. + * + * NB: At present, entries need not be contiguous on disk. Until + * we fix this, we can't do much with writing back adjacent + * entries. + * + * Update: This has now been changed -- all metadata cache + * entries must now be associated with a single contiguous + * 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 + * on disk image of the metadata cache entry is stored. + * + * If the entry is dirty, the serialize callback must be used + * to update this image before it is written to disk + * + * image_up_to_date: Boolean flag that is set to TRUE when *image_ptr + * is up to date, and set to false when the entry is dirtied. + * + * type: Pointer to the instance of H5C_class_t containing pointers + * to the methods for cache entries of the current type. This + * field should be NULL when the instance of H5C_cache_entry_t + * is not in use. + * + * The name is not particularly descriptive, but is retained + * to avoid changes in existing code. + * + * is_dirty: Boolean flag indicating whether the contents of the cache + * entry has been modified since the last time it was written + * to disk. + * + * NOTE: For historical reasons, this field is not maintained + * by the cache. Instead, the module using the cache + * sets this flag when it modifies the entry, and the + * flush and clear functions supplied by that module + * reset the dirty when appropriate. + * + * This is a bit quirky, so we may want to change this + * someday. However it will require a change in the + * cache interface. + * + * Update: Management of the is_dirty field has been largely + * moved into the cache. The only remaining exceptions + * are the flush and clear functions supplied by the + * modules using the cache. These still clear the + * is_dirty field as before. -- JRM 7/5/05 + * + * Update: Management of the is_dirty field is now entirely + * in the cache. -- JRM 7/5/07 + * + * dirtied: Boolean flag used to indicate that the entry has been + * dirtied while protected. + * + * This field is set to FALSE in the protect call, and may + * be set to TRUE by the + * H5C_mark_pinned_or_protected_entry_dirty() + * call at an time prior to the unprotect call. + * + * The H5C_mark_pinned_or_protected_entry_dirty() call exists + * as a convenience function for the fractal heap code which + * may not know if an entry is protected or pinned, but knows + * that is either protected or pinned. The dirtied field was + * added as in the parallel case, it is necessary to know + * whether a protected entry was dirty prior to the protect call. + * + * is_protected: Boolean flag indicating whether this entry is protected + * (or locked, to use more conventional terms). When it is + * protected, the entry cannot be flushed or accessed until + * it is unprotected (or unlocked -- again to use more + * conventional terms). + * + * 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 + * 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 + * protected more than once. + * + * 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 + * outstanding read only protects on this entry. This field + * must be zero whenever either is_protected or is_read_only + * are TRUE. + * + * is_pinned: Boolean flag indicating whether the entry has been pinned + * in the cache. + * + * For very hot entries, the protect / unprotect overhead + * can become excessive. Thus the cache has been extended + * to allow an entry to be "pinned" in the cache. + * + * Pinning an entry in the cache has several implications: + * + * 1) A pinned entry cannot be evicted. Thus unprotected + * pinned entries must be stored in the pinned entry + * list, instead of being managed by the replacement + * policy code (LRU at present). + * + * 2) A pinned entry can be accessed or modified at any time. + * Therefore, the cache must check with the entry owner + * before flushing it. If permission is denied, the + * cache does not flush the entry. + * + * 3) A pinned entry can be marked as dirty (and possibly + * change size) while it is unprotected. + * + * 4) The flush-destroy code must allow pinned entries to + * be unpinned (and possibly unprotected) during the + * flush. + * + * JRM -- 3/16/06 + * + * in_slist: Boolean flag indicating whether the entry is in the skip list + * As a general rule, entries are placed in the list when they + * are marked dirty. However they may remain in the list after + * being flushed. + * + * Update: Dirty entries are now removed from the skip list + * when they are flushed. + * + * flush_marker: Boolean flag indicating that the entry is to be flushed + * the next time H5C_flush_cache() is called with the + * H5C__FLUSH_MARKED_ENTRIES_FLAG. The flag is reset when + * the entry is flushed for whatever reason. + * + * clear_on_unprotect: Boolean flag used only in PHDF5. When H5C is used + * to implement the metadata cache In the parallel case, only + * the cache with mpi rank 0 is allowed to actually write to + * file -- all other caches must retain dirty entries until they + * are advised that the entry is clean. + * + * This flag is used in the case that such an advisory is + * received when the entry is protected. If it is set when an + * entry is unprotected, and the dirtied flag is not set in + * the unprotect, the entry's is_dirty flag is reset by flushing + * it with the H5C__FLUSH_CLEAR_ONLY_FLAG. + * + * flush_in_progress: Boolean flag that is set to true iff the entry + * 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 + * is in the process of being flushed and destroyed. + * + * + * Fields supporting the hash table: + * + * Fields in the cache are indexed by a more or less conventional hash table. + * If there are multiple entries in any hash bin, they are stored in a doubly + * linked list. + * + * ht_next: Next pointer used by the hash table to store multiple + * entries in a single hash bin. This field points to the + * next entry in the doubly linked list of entries in the + * hash bin, or NULL if there is no next entry. + * + * ht_prev: Prev pointer used by the hash table to store multiple + * entries in a single hash bin. This field points to the + * previous entry in the doubly linked list of entries in + * the hash bin, or NULL if there is no previuos entry. + * + * + * Fields supporting replacement policies: + * + * The cache must have a replacement policy, and it will usually be + * necessary for this structure to contain fields supporting that policy. + * + * While there has been interest in several replacement policies for + * this cache, the initial development schedule is tight. Thus I have + * elected to support only a modified LRU policy for the first cut. + * + * When additional replacement policies are added, the fields in this + * section will be used in different ways or not at all. Thus the + * documentation of these fields is repeated for each replacement policy. + * + * Modified LRU: + * + * When operating in parallel mode, we must ensure that a read does not + * cause a write. If it does, the process will hang, as the write will + * be collective and the other processes will not know to participate. + * + * To deal with this issue, I have modified the usual LRU policy by adding + * clean and dirty LRU lists to the usual LRU list. When reading in + * parallel mode, we evict from the clean LRU list only. This implies + * that we must try to ensure that the clean LRU list is reasonably well + * stocked. See the comments on H5C_t in H5Cpkg.h for more details. + * + * Note that even if we start with a completely clean cache, a sequence + * of protects without unprotects can empty the clean LRU list. In this + * case, the cache must grow temporarily. At the next write, we will + * attempt to evict enough entries to get the cache down to its nominal + * maximum size. + * + * The use of the replacement policy fields under the Modified LRU policy + * is discussed below: + * + * next: Next pointer in either the LRU or the protected list, + * depending on the current value of protected. If there + * is no next entry on the list, this field should be set + * to NULL. + * + * prev: Prev pointer in either the LRU or the protected list, + * depending on the current value of protected. If there + * is no previous entry on the list, this field should be + * set to NULL. + * + * aux_next: Next pointer on either the clean or dirty LRU lists. + * This entry should be NULL when protected is true. When + * protected is false, and dirty is true, it should point + * to the next item on the dirty LRU list. When protected + * is false, and dirty is false, it should point to the + * next item on the clean LRU list. In either case, when + * there is no next item, it should be NULL. + * + * aux_prev: Previous pointer on either the clean or dirty LRU lists. + * This entry should be NULL when protected is true. When + * protected is false, and dirty is true, it should point + * to the previous item on the dirty LRU list. When protected + * is false, and dirty is false, it should point to the + * previous item on the clean LRU list. In either case, when + * there is no previous item, it should be NULL. + * + * + * Fields supporting metadata journaling: + * + * last_trans: unit64_t containing the ID of the last transaction in + * which this entry was dirtied. If journaling is disabled, + * or if the entry has never been dirtied in a transaction, + * this field should be set to zero. Once we notice that + * 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 + * has made it to disk in the journal file. + * + * 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, + * 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 + * entry on the list. + * + * 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, + * 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 first + * entry on the list. + * + * + * Cache entry stats collection fields: + * + * These fields should only be compiled in when both H5C_COLLECT_CACHE_STATS + * and H5C_COLLECT_CACHE_ENTRY_STATS are true. When present, they allow + * collection of statistics on individual cache entries. + * + * accesses: int32_t containing the number of times this cache entry has + * been referenced in its lifetime. + * + * clears: int32_t containing the number of times this cache entry has + * been cleared in its life time. + * + * flushes: int32_t containing the number of times this cache entry has + * been flushed to file in its life time. + * + * pins: int32_t containing the number of times this cache entry has + * been pinned in cache in its life time. + * + ****************************************************************************/ + +#ifndef NDEBUG +#define H5C__H5C_CACHE_ENTRY_T_MAGIC 0x005CAC0A +#define H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC 0xDeadBeef +#endif /* NDEBUG */ + +typedef struct H5C_cache_entry_t +{ +#ifndef NDEBUG + uint32_t magic; +#endif /* NDEBUG */ + H5C_t * cache_ptr; + haddr_t addr; + size_t size; + void * image_ptr; + hbool_t image_up_to_date; + const H5C_class_t * type; + hbool_t is_dirty; + hbool_t dirtied; + hbool_t is_protected; + hbool_t is_read_only; + int ro_ref_count; + hbool_t is_pinned; + hbool_t in_slist; + hbool_t flush_marker; +#ifdef H5_HAVE_PARALLEL + hbool_t clear_on_unprotect; +#endif /* H5_HAVE_PARALLEL */ + hbool_t flush_in_progress; + hbool_t destroy_in_progress; + + /* fields supporting the hash table: */ + + struct H5C_cache_entry_t * ht_next; + struct H5C_cache_entry_t * ht_prev; + + /* fields supporting replacement policies: */ + + struct H5C_cache_entry_t * next; + struct H5C_cache_entry_t * prev; + struct H5C_cache_entry_t * aux_next; + struct H5C_cache_entry_t * aux_prev; + + + /* fields supporting journaling */ + + uint64_t last_trans; + struct H5C_cache_entry_t * trans_next; + struct H5C_cache_entry_t * trans_prev; + +#if H5C_COLLECT_CACHE_ENTRY_STATS + + /* cache entry stats fields */ + + int32_t accesses; + int32_t clears; + int32_t flushes; + int32_t pins; + +#endif /* H5C_COLLECT_CACHE_ENTRY_STATS */ + +} H5C_cache_entry_t; + + +/**************************************************************************** + * + * structure H5C_auto_size_ctl_t + * + * Instances of H5C_auto_size_ctl_t are used to get and set the control + * fields for automatic cache re-sizing. + * + * The fields of the structure are discussed individually below: + * + * version: Integer field containing the version number of this version + * of the H5C_auto_size_ctl_t structure. Any instance of + * H5C_auto_size_ctl_t passed to the cache must have a known + * version number, or an error will be flagged. + * + * report_fcn: Pointer to the function that is to be called to report + * activities each time the auto cache resize code is executed. If the + * field is NULL, no call is made. + * + * If the field is not NULL, it must contain the address of a function + * of type H5C_auto_resize_report_fcn. + * + * set_initial_size: Boolean flag indicating whether the size of the + * initial size of the cache is to be set to the value given in + * the initial_size field. If set_initial_size is FALSE, the + * initial_size field is ignored. + * + * initial_size: If enabled, this field contain the size the cache is + * to be set to upon receipt of this structure. Needless to say, + * initial_size must lie in the closed interval [min_size, max_size]. + * + * min_clean_fraction: double in the range 0 to 1 indicating the fraction + * of the cache that is to be kept clean. This field is only used + * in parallel mode. Typical values are 0.1 to 0.5. + * + * max_size: Maximum size to which the cache can be adjusted. The + * supplied value must fall in the closed interval + * [MIN_MAX_CACHE_SIZE, MAX_MAX_CACHE_SIZE]. Also, max_size must + * be greater than or equal to min_size. + * + * min_size: Minimum size to which the cache can be adjusted. The + * supplied value must fall in the closed interval + * [MIN_MAX_CACHE_SIZE, MAX_MAX_CACHE_SIZE]. Also, min_size must + * be less than or equal to max_size. + * + * epoch_length: Number of accesses on the cache over which to collect + * hit rate stats before running the automatic cache resize code, + * if it is enabled. + * + * At the end of an epoch, we discard prior hit rate data and start + * collecting afresh. The epoch_length must lie in the closed + * interval [H5C__MIN_AR_EPOCH_LENGTH, H5C__MAX_AR_EPOCH_LENGTH]. + * + * + * Cache size increase control fields: + * + * incr_mode: Instance of the H5C_cache_incr_mode enumerated type whose + * value indicates how we determine whether the cache size should be + * increased. At present there are two possible values: + * + * H5C_incr__off: Don't attempt to increase the size of the cache + * automatically. + * + * When this increment mode is selected, the remaining fields + * in the cache size increase section ar ignored. + * + * H5C_incr__threshold: Attempt to increase the size of the cache + * whenever the average hit rate over the last epoch drops + * below the value supplied in the lower_hr_threshold + * field. + * + * Note that this attempt will fail if the cache is already + * at its maximum size, or if the cache is not already using + * all available space. + * + * lower_hr_threshold: Lower hit rate threshold. If the increment mode + * (incr_mode) is H5C_incr__threshold and the hit rate drops below the + * value supplied in this field in an epoch, increment the cache size by + * size_increment. Note that cache size may not be incremented above + * max_size, and that the increment may be further restricted by the + * max_increment field if it is enabled. + * + * When enabled, this field must contain a value in the range [0.0, 1.0]. + * Depending on the incr_mode selected, it may also have to be less than + * upper_hr_threshold. + * + * increment: Double containing the multiplier used to derive the new + * cache size from the old if a cache size increment is triggered. + * The increment must be greater than 1.0, and should not exceed 2.0. + * + * The new cache size is obtained by multiplying the current max cache + * size by the increment, and then clamping to max_size and to stay + * within the max_increment as necessary. + * + * apply_max_increment: Boolean flag indicating whether the max_increment + * field should be used to limit the maximum cache size increment. + * + * max_increment: If enabled by the apply_max_increment field described + * above, this field contains the maximum number of bytes by which the + * cache size can be increased in a single re-size. + * + * flash_incr_mode: Instance of the H5C_cache_flash_incr_mode enumerated + * type whose value indicates whether and by what algorithm we should + * make flash increases in the size of the cache to accomodate insertion + * of large entries and large increases in the size of a single entry. + * + * The addition of the flash increment mode was occasioned by performance + * problems that appear when a local heap is increased to a size in excess + * of the current cache size. While the existing re-size code dealt with + * this eventually, performance was very bad for the remainder of the + * epoch. + * + * At present, there are two possible values for the flash_incr_mode: + * + * H5C_flash_incr__off: Don't perform flash increases in the size of + * the cache. + * + * H5C_flash_incr__add_space: Let x be either the size of a newly + * newly inserted entry, or the number of bytes by which the + * size of an existing entry has been increased. + * + * If + * x > flash_threshold * current max cache size, + * + * increase the current maximum cache size by x * flash_multiple + * less any free space in the cache, and start a new epoch. For + * now at least, pay no attention to the maximum increment. + * + * + * With a little thought, it should be obvious that the above flash + * 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 + * the max cache size to at least double to maintain acceptable + * performance, however the above flash increment algorithm will not be + * triggered. + * + * Hopefully, the add space algorithm detailed above will be sufficient + * for the performance problems encountered to date. However, we should + * expect to revisit the issue. + * + * flash_multiple: Double containing the multiple described above in the + * H5C_flash_incr__add_space section of the discussion of the + * 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_incr_mode is H5C_flash_incr__add_space. + * + * + * Cache size decrease control fields: + * + * decr_mode: Instance of the H5C_cache_decr_mode enumerated type whose + * value indicates how we determine whether the cache size should be + * decreased. At present there are four possibilities. + * + * H5C_decr__off: Don't attempt to decrease the size of the cache + * automatically. + * + * When this increment mode is selected, the remaining fields + * in the cache size decrease section are ignored. + * + * H5C_decr__threshold: Attempt to decrease the size of the cache + * whenever the average hit rate over the last epoch rises + * above the value supplied in the upper_hr_threshold + * field. + * + * H5C_decr__age_out: At the end of each epoch, search the cache for + * entries that have not been accessed for at least the number + * of epochs specified in the epochs_before_eviction field, and + * evict these entries. Conceptually, the maximum cache size + * is then decreased to match the new actual cache size. However, + * this reduction may be modified by the min_size, the + * max_decrement, and/or the empty_reserve. + * + * H5C_decr__age_out_with_threshold: Same as age_out, but we only + * attempt to reduce the cache size when the hit rate observed + * over the last epoch exceeds the value provided in the + * upper_hr_threshold field. + * + * upper_hr_threshold: Upper hit rate threshold. The use of this field + * varies according to the current decr_mode: + * + * H5C_decr__off or H5C_decr__age_out: The value of this field is + * ignored. + * + * H5C_decr__threshold: If the hit rate exceeds this threshold in any + * epoch, attempt to decrement the cache size by size_decrement. + * + * Note that cache size may not be decremented below min_size. + * + * Note also that if the upper_threshold is 1.0, the cache size + * will never be reduced. + * + * H5C_decr__age_out_with_threshold: If the hit rate exceeds this + * threshold in any epoch, attempt to reduce the cache size + * by evicting entries that have not been accessed for more + * than the specified number of epochs. + * + * decrement: This field is only used when the decr_mode is + * H5C_decr__threshold. + * + * The field is a double containing the multiplier used to derive the + * new cache size from the old if a cache size decrement is triggered. + * The decrement must be in the range 0.0 (in which case the cache will + * try to contract to its minimum size) to 1.0 (in which case the + * cache will never shrink). + * + * apply_max_decrement: Boolean flag used to determine whether decrements + * in cache size are to be limited by the max_decrement field. + * + * max_decrement: Maximum number of bytes by which the cache size can be + * decreased in a single re-size. Note that decrements may also be + * restricted by the min_size of the cache, and (in age out modes) by + * the empty_reserve field. + * + * epochs_before_eviction: Integer field used in H5C_decr__age_out and + * H5C_decr__age_out_with_threshold decrement modes. + * + * This field contains the number of epochs an entry must remain + * unaccessed before it is evicted in an attempt to reduce the + * cache size. If applicable, this field must lie in the range + * [1, H5C__MAX_EPOCH_MARKERS]. + * + * apply_empty_reserve: Boolean field controlling whether the empty_reserve + * field is to be used in computing the new cache size when the + * decr_mode is H5C_decr__age_out or H5C_decr__age_out_with_threshold. + * + * empty_reserve: To avoid a constant racheting down of cache size by small + * amounts in the H5C_decr__age_out and H5C_decr__age_out_with_threshold + * modes, this field allows one to require that any cache size + * reductions leave the specified fraction of unused space in the cache. + * + * The value of this field must be in the range [0.0, 1.0]. I would + * expect typical values to be in the range of 0.01 to 0.1. + * + ****************************************************************************/ + +#define H5C_RESIZE_CFG__VALIDATE_GENERAL 0x1 +#define H5C_RESIZE_CFG__VALIDATE_INCREMENT 0x2 +#define H5C_RESIZE_CFG__VALIDATE_DECREMENT 0x4 +#define H5C_RESIZE_CFG__VALIDATE_INTERACTIONS 0x8 +#define H5C_RESIZE_CFG__VALIDATE_ALL \ +( \ + H5C_RESIZE_CFG__VALIDATE_GENERAL | \ + H5C_RESIZE_CFG__VALIDATE_INCREMENT | \ + H5C_RESIZE_CFG__VALIDATE_DECREMENT | \ + H5C_RESIZE_CFG__VALIDATE_INTERACTIONS \ +) + +#define H5C__CURR_AUTO_SIZE_CTL_VER 1 +#define H5C__CURR_AUTO_RESIZE_RPT_FCN_VER 1 + +#define H5C__MAX_EPOCH_MARKERS 10 + +#define H5C__DEF_AR_UPPER_THRESHHOLD 0.9999 +#define H5C__DEF_AR_LOWER_THRESHHOLD 0.9 +#define H5C__DEF_AR_MAX_SIZE ((size_t)(16 * 1024 * 1024)) +#define H5C__DEF_AR_INIT_SIZE ((size_t)( 1 * 1024 * 1024)) +#define H5C__DEF_AR_MIN_SIZE ((size_t)( 1 * 1024 * 1024)) +#define H5C__DEF_AR_MIN_CLEAN_FRAC 0.5 +#define H5C__DEF_AR_INCREMENT 2.0 +#define H5C__DEF_AR_MAX_INCREMENT ((size_t)( 2 * 1024 * 1024)) +#define H5C__DEF_AR_FLASH_MULTIPLE 1.0 +#define H5C__DEV_AR_FLASH_THRESHOLD 0.25 +#define H5C__DEF_AR_DECREMENT 0.9 +#define H5C__DEF_AR_MAX_DECREMENT ((size_t)( 1 * 1024 * 1024)) +#define H5C__DEF_AR_EPCHS_B4_EVICT 3 +#define H5C__DEF_AR_EMPTY_RESERVE 0.05 +#define H5C__MIN_AR_EPOCH_LENGTH 100 +#define H5C__DEF_AR_EPOCH_LENGTH 50000 +#define H5C__MAX_AR_EPOCH_LENGTH 1000000 + +#define H5C__MIN_JBRB_BUF_SIZE ((size_t)(1)) +#define H5C__MAX_JBRB_BUF_SIZE ((size_t)(2 * 1024 * 1024)) + +#define H5C__MIN_JBRB_NUM_BUFS 1 +#define H5C__MAX_JBRB_NUM_BUFS 256 + +enum H5C_resize_status +{ + in_spec2, + increase2, + flash_increase2, + decrease2, + at_max_size2, + at_min_size2, + increase_disabled2, + decrease_disabled2, + not_full2 +}; /* enum H5C_resize_conditions */ + +typedef void (*H5C_auto_resize_rpt_fcn)(H5C_t * cache_ptr, + int32_t version, + double hit_rate, + enum H5C_resize_status status, + size_t old_max_cache_size, + size_t new_max_cache_size, + size_t old_min_clean_size, + size_t new_min_clean_size); + +typedef struct H5C_auto_size_ctl_t +{ + /* general configuration fields: */ + int32_t version; + H5C_auto_resize_rpt_fcn rpt_fcn; + + hbool_t set_initial_size; + size_t initial_size; + + double min_clean_fraction; + + size_t max_size; + size_t min_size; + + int64_t epoch_length; + + + /* size increase control fields: */ + enum H5C_cache_incr_mode incr_mode; + + double lower_hr_threshold; + + double increment; + + hbool_t apply_max_increment; + size_t max_increment; + + enum H5C_cache_flash_incr_mode flash_incr_mode; + double flash_multiple; + double flash_threshold; + + + /* size decrease control fields: */ + enum H5C_cache_decr_mode decr_mode; + + double upper_hr_threshold; + + double decrement; + + hbool_t apply_max_decrement; + size_t max_decrement; + + int32_t epochs_before_eviction; + + hbool_t apply_empty_reserve; + double empty_reserve; + +} H5C_auto_size_ctl_t; + + +/**************************************************************************** + * + * structure H5C_mdj_config_t + * + * H5C_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 H5AC_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 H5AC_jnl_config_t + * structure. + * + * The fields of the structure are discussed individually below. Note + * that the fields with the "jbrb_" prefix are used to configure the + * journal buffer ring buffer -- a ring buffer of buffers used to buffer + * output of journal messages. + * + * enable_journaling: Boolean flag that is set to TRUE if journaling is + * to be enabled, and to FALSE otherwise. + * + * When the cache configuration is reported, this field is TRUE iff + * journaling is enabled. + * + * journal_file_path: Full path of the file to be used to store the + * metadata journal. This field is only defined if enable_journaling + * is TRUE. + * + * At present, the length of the journal file path is restricted to + * no more than H5C__MAX_JOURNAL_FILE_NAME_LEN (which must equal + * H5AC__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 + * to be some multiple of the block size used by the file system + * on which the journal file will be written. + * + * jbrb_num_bufs: Integer containing the number of buffers in the journal + * buffer ring buffer. If synchronous I/O is used, one or two buffers + * is sufficient. If asynchronous I/O is used, the number of buffers + * should be sufficiently large that a write on buffer is likely to + * complete before that buffer is needed again. + * + * jbrb_use_aio: Boolean flag indicating whether we should use + * asynchronous I/O for journal entry writes. + * + * jbrb_human_readable: Boolean flag which determines whether the journal + * file will be written in human readable form. In general, this + * field should be set to false, as the human readable journal + * file is at least twice a large as the machine readable version. + * + ****************************************************************************/ + +#define H5C__MAX_JOURNAL_FILE_NAME_LEN 1024 + +typedef struct H5C_mdj_config_t +{ + hbool_t enable_journaling; + char journal_file_path[H5C__MAX_JOURNAL_FILE_NAME_LEN + 1]; + size_t jbrb_buf_size; + int jbrb_num_bufs; + hbool_t jbrb_use_aio; + hbool_t jbrb_human_readable; + +} H5C_mdj_config_t; + +/* The following typedef is used for callbacks on metadata journaling + * configuration changes. + */ + +typedef herr_t (*H5C_mdj_status_change_func_t)(const H5C_mdj_config_t * config_ptr, + hid_t dxpl_id, + void * data_ptr); + + +/* + * Library prototypes. + */ + +/* #defines of flags used in the flags parameters in some of the + * following function calls. Note that not all flags are applicable + * to all function calls. Flags that don't apply to a particular + * function are ignored in that function. + * + * These flags apply to all function calls: + * + * H5C__NO_FLAGS_SET (generic "no flags set" for all fcn calls) + * + * + * These flags apply to H5C_insert_entry(): + * + * H5C__SET_FLUSH_MARKER_FLAG + * H5C__PIN_ENTRY_FLAG + * + * These flags apply to H5C_protect() + * + * H5C__READ_ONLY_FLAG + * + * These flags apply to H5C_unprotect(): + * + * H5C__SET_FLUSH_MARKER_FLAG + * H5C__DELETED_FLAG + * H5C__DIRTIED_FLAG + * H5C__SIZE_CHANGED_FLAG + * H5C__PIN_ENTRY_FLAG + * H5C__UNPIN_ENTRY_FLAG + * + * + * These flags apply to H5C_flush_cache(): + * + * H5C__FLUSH_INVALIDATE_FLAG + * H5C__FLUSH_CLEAR_ONLY_FLAG + * H5C__FLUSH_MARKED_ENTRIES_FLAG + * H5C__FLUSH_IGNORE_PROTECTED_FLAG (can't use this flag in combination + * with H5C__FLUSH_INVALIDATE_FLAG) + * + * These flags apply to H5C_flush_single_entry(): + * + * H5C__FLUSH_INVALIDATE_FLAG + * H5C__FLUSH_CLEAR_ONLY_FLAG + * H5C__FLUSH_MARKED_ENTRIES_FLAG + */ + +#define H5C__NO_FLAGS_SET 0x0000 +#define H5C__SET_FLUSH_MARKER_FLAG 0x0001 +#define H5C__DELETED_FLAG 0x0002 +#define H5C__DIRTIED_FLAG 0x0004 +#define H5C__SIZE_CHANGED_FLAG 0x0008 +#define H5C__PIN_ENTRY_FLAG 0x0010 +#define H5C__UNPIN_ENTRY_FLAG 0x0020 +#define H5C__FLUSH_INVALIDATE_FLAG 0x0040 +#define H5C__FLUSH_CLEAR_ONLY_FLAG 0x0080 +#define H5C__FLUSH_MARKED_ENTRIES_FLAG 0x0100 +#define H5C__FLUSH_IGNORE_PROTECTED_FLAG 0x0200 +#define H5C__READ_ONLY_FLAG 0x0400 + +H5_DLL H5C_t * H5C_create(size_t max_cache_size, + size_t min_clean_size, + int max_type_id, + const char * (* type_name_table_ptr), + H5C_write_permitted_func_t check_write_permitted, + hbool_t write_permitted, + H5C_log_flush_func_t log_flush, + void * aux_ptr); + +H5_DLL void H5C_def_auto_resize_rpt_fcn(H5C_t * cache_ptr, + int32_t version, + double hit_rate, + enum H5C_resize_status status, + size_t old_max_cache_size, + size_t new_max_cache_size, + size_t old_min_clean_size, + size_t new_min_clean_size); + +H5_DLL herr_t H5C_dest(H5F_t * f, + hid_t dxpl_id); + +H5_DLL herr_t H5C_dest_empty(H5C_t * cache_ptr); + +H5_DLL herr_t H5C_expunge_entry(H5F_t * f, + hid_t dxpl_id, + const H5C_class_t * type, + haddr_t addr); + +H5_DLL herr_t H5C_flush_cache(H5F_t *f, hid_t dxpl_id, unsigned flags); + + +H5_DLL herr_t H5C_flush_to_min_clean(H5F_t * f, + hid_t dxpl_id); + +H5_DLL herr_t H5C_get_cache_auto_resize_config(const H5C_t * cache_ptr, + H5C_auto_size_ctl_t *config_ptr); + +H5_DLL herr_t H5C_get_cache_size(H5C_t * cache_ptr, + size_t * max_size_ptr, + size_t * min_clean_size_ptr, + size_t * cur_size_ptr, + int32_t * cur_num_entries_ptr); + +H5_DLL herr_t H5C_get_cache_hit_rate(H5C_t * cache_ptr, + double * hit_rate_ptr); + +H5_DLL herr_t H5C_get_entry_status(const H5F_t * f, + haddr_t addr, + size_t * size_ptr, + hbool_t * in_cache_ptr, + hbool_t * is_dirty_ptr, + hbool_t * is_protected_ptr, + hbool_t * is_pinned_ptr); + +H5_DLL herr_t H5C_get_evictions_enabled(const H5C_t * cache_ptr, + hbool_t * evictions_enabled_ptr); + +H5_DLL herr_t H5C_get_trace_file_ptr(const H5C_t *cache_ptr, + FILE **trace_file_ptr_ptr); +H5_DLL herr_t H5C_get_trace_file_ptr_from_entry(const H5C_cache_entry_t *entry_ptr, + FILE ** trace_file_ptr_ptr); + +H5_DLL herr_t H5C_insert_entry(H5F_t * f, + hid_t dxpl_id, + const H5C_class_t * type, + haddr_t addr, + size_t len, + void * thing, + unsigned int flags); + +H5_DLL herr_t H5C_mark_entries_as_clean(H5F_t * f, + hid_t dxpl_id, + int32_t ce_array_len, + haddr_t * ce_array_ptr); + +H5_DLL herr_t H5C_mark_pinned_entry_dirty(void * thing, + hbool_t size_changed, + size_t new_size); + +H5_DLL herr_t H5C_mark_pinned_or_protected_entry_dirty(void * thing); + +H5_DLL herr_t H5C_rename_entry(H5C_t * cache_ptr, + const H5C_class_t * type, + haddr_t old_addr, + haddr_t new_addr); + +H5_DLL herr_t H5C_pin_protected_entry(void * thing); + +H5_DLL void * H5C_protect(H5F_t * f, + hid_t dxpl_id, + const H5C_class_t * type, + haddr_t addr, + size_t len, + void * udata, + unsigned flags); + +H5_DLL herr_t H5C_reset_cache_hit_rate_stats(H5C_t * cache_ptr); + +H5_DLL herr_t H5C_resize_pinned_entry(void * thing, + size_t new_size); + +H5_DLL herr_t H5C_set_cache_auto_resize_config(H5C_t * cache_ptr, + H5C_auto_size_ctl_t *config_ptr); + +H5_DLL herr_t H5C_set_evictions_enabled(H5C_t * cache_ptr, + hbool_t evictions_enabled); + +H5_DLL herr_t H5C_set_prefix(H5C_t * cache_ptr, char * prefix); + +H5_DLL herr_t H5C_set_skip_flags(H5C_t * cache_ptr, + hbool_t skip_file_checks, + hbool_t skip_dxpl_id_checks); + +H5_DLL herr_t H5C_set_trace_file_ptr(H5C_t * cache_ptr, + FILE * trace_file_ptr); + +H5_DLL herr_t H5C_stats(H5C_t * cache_ptr, + const char * cache_name, + hbool_t display_detailed_stats); + +H5_DLL void H5C_stats__reset(H5C_t * cache_ptr); + +H5_DLL herr_t H5C_unpin_entry(void * thing); + +H5_DLL herr_t H5C_unprotect(H5F_t * f, + hid_t dxpl_id, + const H5C_class_t * type, + haddr_t addr, + void * thing, + unsigned int flags, + size_t new_size); + +H5_DLL herr_t H5C_validate_resize_config(H5C_auto_size_ctl_t * config_ptr, + unsigned int tests); + + +/**************************************************************************/ +/***************** journaling function definitions proper: ****************/ +/**************************************************************************/ + +H5_DLL herr_t H5C_begin_journaling(H5F_t * f, + hid_t dxpl_id, + H5C_t * cache_ptr, + H5C_mdj_config_t * config_ptr); + +H5_DLL herr_t H5C_begin_transaction(H5C_t * cache_ptr, + uint64_t * trans_num_ptr, + const char * api_call_name); + +H5_DLL herr_t H5C_end_journaling(H5F_t * f, + hid_t dxpl_id, + H5C_t * cache_ptr); + +H5_DLL herr_t H5C_end_transaction(H5F_t * f, + hid_t dxpl_id, + H5C_t * cache_ptr, + uint64_t trans_num, + const char * api_call_name); + +H5_DLL herr_t H5C_get_journal_config(H5C_t * cache_ptr, + H5C_mdj_config_t * config_ptr); + +H5_DLL herr_t H5C_journal_post_flush(H5F_t * f, + hid_t dxpl_id, + H5C_t * cache_ptr, + hbool_t cache_is_clean); + +H5_DLL herr_t H5C_journal_pre_flush(H5C_t * cache_ptr); + +H5_DLL herr_t H5C_journal_transaction(H5F_t * f, + hid_t dxpl_id, + H5C_t * cache_ptr); + +H5_DLL herr_t H5C_update_for_new_last_trans_on_disk(H5C_t * cache_ptr, + uint64_t new_last_trans_on_disk); + + +/*****************************************************************************/ +/****************** journal buffer function definitions: *********************/ +/*****************************************************************************/ + +typedef struct H5C_jbrb_t H5C_jbrb_t; + +/* Note that H5C_jb_aio_await_completion_of_all_async_fsyncs() and + * H5C_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/cache_journal.c + */ +H5_DLL herr_t H5C_jb_aio__await_completion_of_all_async_fsyncs( + H5C_jbrb_t * struct_ptr); + +H5_DLL herr_t H5C_jb_aio__await_completion_of_all_pending_writes( + H5C_jbrb_t * struct_ptr); + + +H5_DLL herr_t H5C_jb__bin2hex(const uint8_t * buf, + char * hexdata, + size_t * hexlength, + size_t buf_size); + +H5_DLL herr_t H5C_jb__comment(H5C_jbrb_t * struct_ptr, + const char * comment_ptr); + +H5_DLL herr_t H5C_jb__end_transaction(H5C_jbrb_t * struct_ptr, + uint64_t trans_num); + +H5_DLL herr_t H5C_jb__eoa(H5C_jbrb_t * struct_ptr, + haddr_t eoa); + +H5_DLL herr_t H5C_jb__get_last_transaction_on_disk(H5C_jbrb_t * struct_ptr, + uint64_t * trans_num_ptr); + +H5_DLL herr_t H5C_jb__flush(H5C_jbrb_t * struct_ptr); + + +H5_DLL herr_t H5C_jb__journal_entry(H5C_jbrb_t * struct_ptr, + uint64_t trans_num, + haddr_t base_addr, + size_t length, + const uint8_t * body); + +H5_DLL herr_t H5C_jb__init(H5C_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, + hbool_t human_readable, + size_t sizeof_addr, + size_t sizeof_size); + +H5_DLL herr_t H5C_jb__start_transaction(H5C_jbrb_t * struct_ptr, + uint64_t trans_num); + +H5_DLL herr_t H5C_jb__takedown(H5C_jbrb_t * struct_ptr); + +H5_DLL herr_t H5C_jb__trunc(H5C_jbrb_t * struct_ptr); + +H5_DLL herr_t H5C_jb__write_header_entry(H5C_jbrb_t * struct_ptr); + +H5_DLL herr_t H5C_jb__write_to_buffer(H5C_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: ********/ +/*****************************************************************************/ + +H5_DLL herr_t H5C_check_for_journaling(H5F_t * f, + hid_t dxpl_id, + H5C_t * cache_ptr, + hbool_t journal_recovered); + +H5_DLL herr_t H5C_mark_journaling_in_progress(H5F_t * f, + hid_t dxpl_id, + const int32_t journal_magic, + const char * journal_file_name_ptr); + +H5_DLL herr_t H5C_unmark_journaling_in_progress(H5F_t * f, + hid_t dxpl_id, + H5C_t * cache_ptr); + + +/**************************************************************************/ +/****** metadata journaling status change callback management code ********/ +/**************************************************************************/ + +H5_DLL herr_t H5C_deregister_mdjsc_callback(H5C_t * cache_ptr, + int32_t idx); + +H5_DLL herr_t H5C_register_mdjsc_callback(H5C_t * cache_ptr, + H5C_mdj_status_change_func_t fcn_ptr, + void * data_ptr, + int32_t * idx_ptr); + +#endif /* !_H5Cprivate_H */ + diff --git a/src/H5Cpublic.h b/src/H5Cpublic.h new file mode 100644 index 0000000..9ade25c --- /dev/null +++ b/src/H5Cpublic.h @@ -0,0 +1,62 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * Copyright by the Board of Trustees of the University of Illinois. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/*------------------------------------------------------------------------- + * + * Created: H5Cpublic.h + * June 4, 2005 + * John Mainzer + * + * Purpose: Public include file for cache functions. + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +#ifndef _H5Cpublic_H +#define _H5Cpublic_H + +/* Public headers needed by this file */ +#include "H5public.h" + +#ifdef __cplusplus +extern "C" { +#endif + +enum H5C_cache_incr_mode +{ + H5C_incr__off, + H5C_incr__threshold +}; + +enum H5C_cache_flash_incr_mode +{ + H5C_flash_incr__off, + H5C_flash_incr__add_space +}; + + +enum H5C_cache_decr_mode +{ + H5C_decr__off, + H5C_decr__threshold, + H5C_decr__age_out, + H5C_decr__age_out_with_threshold +}; + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/H5D.c b/src/H5D.c index 7ecf7cd..d78a1bb 100644 --- a/src/H5D.c +++ b/src/H5D.c @@ -27,7 +27,7 @@ /* Headers */ /***********/ #include "H5private.h" /* Generic Functions */ -#include "H5AC2private.h" /* Metadata cache */ +#include "H5ACprivate.h" /* Metadata cache */ #include "H5Dpkg.h" /* Datasets */ #include "H5Eprivate.h" /* Error handling */ #include "H5FLprivate.h" /* Free lists */ @@ -133,7 +133,7 @@ H5Dcreate2(hid_t loc_id, const char *name, hid_t type_id, hid_t space_id, const H5S_t *space; /* Dataspace for dataset */ hid_t ret_value; /* Return value */ - FUNC_ENTER_API_META(H5Dcreate2, loc_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Dcreate2, loc_id, H5AC_dxpl_id, FAIL) H5TRACE7("i", "i*siiiii", loc_id, name, type_id, space_id, lcpl_id, dcpl_id, dapl_id); @@ -168,7 +168,7 @@ H5Dcreate2(hid_t loc_id, const char *name, hid_t type_id, hid_t space_id, /* Create the new dataset & get its ID */ if(NULL == (dset = H5D_create_named(&loc, name, type_id, space, lcpl_id, - dcpl_id, dapl_id, H5AC2_dxpl_id))) + dcpl_id, dapl_id, H5AC_dxpl_id))) HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to create dataset") if((ret_value = H5I_register(H5I_DATASET, dset)) < 0) HGOTO_ERROR(H5E_DATASET, H5E_CANTREGISTER, FAIL, "unable to register dataset") @@ -226,7 +226,7 @@ H5Dcreate_anon(hid_t loc_id, hid_t type_id, hid_t space_id, hid_t dcpl_id, const H5S_t *space; /* Dataspace for dataset */ hid_t ret_value; /* Return value */ - FUNC_ENTER_API_META(H5Dcreate_anon, loc_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Dcreate_anon, loc_id, H5AC_dxpl_id, FAIL) H5TRACE5("i", "iiiii", loc_id, type_id, space_id, dcpl_id, dapl_id); /* Check arguments */ @@ -250,7 +250,7 @@ H5Dcreate_anon(hid_t loc_id, hid_t type_id, hid_t space_id, hid_t dcpl_id, HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not dataset access property list") /* build and open the new dataset */ - if(NULL == (dset = H5D_create(loc.oloc->file, type_id, space, dcpl_id, H5AC2_dxpl_id))) + if(NULL == (dset = H5D_create(loc.oloc->file, type_id, space, dcpl_id, H5AC_dxpl_id))) HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to create dataset") /* Register the new dataset to get an ID for it */ @@ -293,7 +293,7 @@ H5Dopen2(hid_t loc_id, const char *name, hid_t dapl_id) H5O_loc_t oloc; /* Dataset object location */ H5O_type_t obj_type; /* Type of object at location */ hbool_t loc_found = FALSE; /* Location at 'name' found */ - hid_t dxpl_id = H5AC2_dxpl_id; /* dxpl to use to open datset */ + hid_t dxpl_id = H5AC_dxpl_id; /* dxpl to use to open datset */ hid_t ret_value; FUNC_ENTER_API(H5Dopen2, FAIL) @@ -372,7 +372,7 @@ H5Dclose(hid_t dset_id) H5D_t *dset; /* Dataset object to release */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_API_META(H5Dclose, dset_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Dclose, dset_id, H5AC_dxpl_id, FAIL) H5TRACE1("e", "i", dset_id); /* Check args */ @@ -469,7 +469,7 @@ H5Dget_space_status(hid_t dset_id, H5D_space_status_t *allocation) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataset") /* Read data space address and return */ - if(FAIL==(ret_value=H5D_get_space_status(dset, allocation, H5AC2_ind_dxpl_id))) + if(FAIL==(ret_value=H5D_get_space_status(dset, allocation, H5AC_ind_dxpl_id))) HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to get space status") done: @@ -578,7 +578,7 @@ H5Dget_create_plist(hid_t dset_id) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list") /* Retrieve any object creation properties */ - if(H5O_get_create_plist(&dset->oloc, H5AC2_ind_dxpl_id, new_plist) < 0) + if(H5O_get_create_plist(&dset->oloc, H5AC_ind_dxpl_id, new_plist) < 0) HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get object creation info") /* Get the fill value property */ @@ -594,7 +594,7 @@ H5Dget_create_plist(hid_t dset_id) HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to copy dataset datatype for fill value") /* Set up type conversion function */ - if(NULL == (tpath = H5T_path_find(dset->shared->type, copied_fill.type, NULL, NULL, H5AC2_ind_dxpl_id, FALSE))) + if(NULL == (tpath = H5T_path_find(dset->shared->type, copied_fill.type, NULL, NULL, H5AC_ind_dxpl_id, FALSE))) HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "unable to convert between src and dest data types") /* Convert disk form of fill value into memory form */ @@ -622,7 +622,7 @@ H5Dget_create_plist(hid_t dset_id) } /* end if */ /* Convert fill value */ - if(H5T_convert(tpath, src_id, dst_id, (size_t)1, (size_t)0, (size_t)0, copied_fill.buf, bkg_buf, H5AC2_ind_dxpl_id) < 0) { + if(H5T_convert(tpath, src_id, dst_id, (size_t)1, (size_t)0, (size_t)0, copied_fill.buf, bkg_buf, H5AC_ind_dxpl_id) < 0) { H5I_dec_ref(src_id); H5I_dec_ref(dst_id); if(bkg_buf) @@ -686,7 +686,7 @@ H5Dget_storage_size(hid_t dset_id) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, 0, "not a dataset") /* Set return value */ - ret_value = H5D_get_storage_size(dset,H5AC2_ind_dxpl_id); + ret_value = H5D_get_storage_size(dset,H5AC_ind_dxpl_id); done: FUNC_LEAVE_API(ret_value) @@ -994,7 +994,7 @@ H5Dset_extent(hid_t dset_id, const hsize_t size[]) H5D_t *dset; /* Dataset for this operation */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_API_META(H5Dset_extent, dset_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Dset_extent, dset_id, H5AC_dxpl_id, FAIL) H5TRACE2("e", "i*h", dset_id, size); /* Check args */ @@ -1004,7 +1004,7 @@ H5Dset_extent(hid_t dset_id, const hsize_t size[]) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no size specified") /* Private function */ - if(H5D_set_extent(dset, size, H5AC2_dxpl_id) < 0) + if(H5D_set_extent(dset, size, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to set extend dataset") done: diff --git a/src/H5Dchunk.c b/src/H5Dchunk.c index 0eef948..bb75fff 100644 --- a/src/H5Dchunk.c +++ b/src/H5Dchunk.c @@ -25,7 +25,7 @@ /***********/ #include "H5private.h" /* Generic Functions */ #ifdef H5_HAVE_PARALLEL -#include "H5AC2private.h" /* Metadata cache */ +#include "H5ACprivate.h" /* Metadata cache */ #endif /* H5_HAVE_PARALLEL */ #include "H5Dpkg.h" /* Dataset functions */ #include "H5Eprivate.h" /* Error handling */ @@ -2908,7 +2908,7 @@ H5D_chunk_allocate(H5D_t *dset, hid_t dxpl_id, hbool_t full_overwrite) using_mpi = TRUE; /* Use the internal "independent" DXPL */ - data_dxpl_id = H5AC2_ind_dxpl_id; + data_dxpl_id = H5AC_ind_dxpl_id; } /* end if */ else { #endif /* H5_HAVE_PARALLEL */ @@ -4381,7 +4381,7 @@ done: * * Purpose: Print raw data cache statistics to the debug stream. If * HEADERS is non-zero then print table column headers, - * otherwise assume that the H5AC2 layer has already printed them. + * otherwise assume that the H5AC layer has already printed them. * * Return: Non-negative on success/Negative on failure * @@ -4414,8 +4414,8 @@ H5D_chunk_stats(const H5D_t *dset, hbool_t headers) #ifdef H5AC1_DEBUG if (H5DEBUG(AC1)) headers = TRUE; #endif -#ifdef H5AC2_DEBUG - if (H5DEBUG(AC2)) headers = TRUE; +#ifdef H5AC_DEBUG + if (H5DEBUG(AC)) headers = TRUE; #endif if (headers) { diff --git a/src/H5Dcontig.c b/src/H5Dcontig.c index 7d3a7fa..779071f 100644 --- a/src/H5Dcontig.c +++ b/src/H5Dcontig.c @@ -34,7 +34,7 @@ /* Headers */ /***********/ #include "H5private.h" /* Generic Functions */ -#include "H5AC2private.h" /* Metadata cache */ +#include "H5ACprivate.h" /* Metadata cache */ #include "H5Dpkg.h" /* Dataset functions */ #include "H5Eprivate.h" /* Error handling */ #include "H5Fprivate.h" /* Files */ @@ -196,7 +196,7 @@ H5D_contig_fill(H5D_t *dset, hid_t dxpl_id) using_mpi = TRUE; /* Use the internal "independent" DXPL */ - my_dxpl_id = H5AC2_ind_dxpl_id; + my_dxpl_id = H5AC_ind_dxpl_id; } /* end if */ else { #endif /* H5_HAVE_PARALLEL */ diff --git a/src/H5Ddbg.c b/src/H5Ddbg.c index 13b8d2a..7abfc81 100644 --- a/src/H5Ddbg.c +++ b/src/H5Ddbg.c @@ -27,7 +27,7 @@ /* Headers */ /***********/ #include "H5private.h" /* Generic Functions */ -#include "H5AC2private.h" /* Metadata cache */ +#include "H5ACprivate.h" /* Metadata cache */ #include "H5Dpkg.h" /* Datasets */ #include "H5Eprivate.h" /* Error handling */ #include "H5Iprivate.h" /* IDs */ @@ -114,7 +114,7 @@ H5Ddebug(hid_t dset_id) /* Print B-tree information */ if(H5D_CHUNKED == dset->shared->layout.type) - (void)H5D_chunk_dump_index(dset, H5AC2_dxpl_id, stdout); + (void)H5D_chunk_dump_index(dset, H5AC_dxpl_id, stdout); else if(H5D_CONTIGUOUS == dset->shared->layout.type) HDfprintf(stdout, " %-10s %a\n", "Address:", dset->shared->layout.u.contig.addr); diff --git a/src/H5Ddeprec.c b/src/H5Ddeprec.c index 496c0f1..8f53ec2 100644 --- a/src/H5Ddeprec.c +++ b/src/H5Ddeprec.c @@ -41,7 +41,7 @@ /* Headers */ /***********/ #include "H5private.h" /* Generic Functions */ -#include "H5AC2private.h" /* Metadata cache */ +#include "H5ACprivate.h" /* Metadata cache */ #include "H5Dpkg.h" /* Datasets */ #include "H5Eprivate.h" /* Error handling */ #include "H5Iprivate.h" /* IDs */ @@ -147,7 +147,7 @@ H5Dcreate1(hid_t loc_id, const char *name, hid_t type_id, hid_t space_id, const H5S_t *space; /* Dataspace for dataset */ hid_t ret_value; /* Return value */ - FUNC_ENTER_API_META(H5Dcreate1, loc_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Dcreate1, loc_id, H5AC_dxpl_id, FAIL) H5TRACE5("i", "i*siii", loc_id, name, type_id, space_id, dcpl_id); /* Check arguments */ @@ -167,7 +167,7 @@ H5Dcreate1(hid_t loc_id, const char *name, hid_t type_id, hid_t space_id, /* Build and open the new dataset */ if(NULL == (dset = H5D_create_named(&loc, name, type_id, space, - H5P_LINK_CREATE_DEFAULT, dcpl_id, H5P_DATASET_ACCESS_DEFAULT, H5AC2_dxpl_id))) + H5P_LINK_CREATE_DEFAULT, dcpl_id, H5P_DATASET_ACCESS_DEFAULT, H5AC_dxpl_id))) HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to create dataset") /* Register the new dataset to get an ID for it */ @@ -210,7 +210,7 @@ H5Dopen1(hid_t loc_id, const char *name) H5O_loc_t oloc; /* Dataset object location */ H5O_type_t obj_type; /* Type of object at location */ hbool_t loc_found = FALSE; /* Location at 'name' found */ - hid_t dxpl_id = H5AC2_dxpl_id; /* dxpl to use to open datset */ + hid_t dxpl_id = H5AC_dxpl_id; /* dxpl to use to open datset */ hid_t ret_value; FUNC_ENTER_API(H5Dopen1, FAIL) @@ -284,7 +284,7 @@ H5Dextend(hid_t dset_id, const hsize_t size[]) H5D_t *dset; herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_API_META(H5Dextend, dset_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Dextend, dset_id, H5AC_dxpl_id, FAIL) H5TRACE2("e", "i*h", dset_id, size); /* Check args */ @@ -294,7 +294,7 @@ H5Dextend(hid_t dset_id, const hsize_t size[]) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no size specified") /* Increase size */ - if(H5D_extend(dset, size, H5AC2_dxpl_id) < 0) + if(H5D_extend(dset, size, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to extend dataset") done: diff --git a/src/H5Dfill.c b/src/H5Dfill.c index 8635da3..d0b4c81 100644 --- a/src/H5Dfill.c +++ b/src/H5Dfill.c @@ -34,7 +34,7 @@ /* Headers */ /***********/ #include "H5private.h" /* Generic Functions */ -#include "H5AC2private.h" /* Metadata cache */ +#include "H5ACprivate.h" /* Metadata cache */ #include "H5Dpkg.h" /* Dataset functions */ #include "H5Eprivate.h" /* Error handling */ #include "H5FLprivate.h" /* Free Lists */ @@ -132,7 +132,7 @@ H5Dfill(const void *fill, hid_t fill_type_id, void *buf, hid_t buf_type_id, hid_ HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, 0, "not a datatype") /* Fill the selection in the memory buffer */ - if(H5D_fill(fill, fill_type, buf, buf_type, space, H5AC2_dxpl_id) < 0) + if(H5D_fill(fill, fill_type, buf, buf_type, space, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_DATASET, H5E_CANTENCODE, FAIL, "filling selection failed") done: diff --git a/src/H5Dint.c b/src/H5Dint.c index 024f66b..803694d 100644 --- a/src/H5Dint.c +++ b/src/H5Dint.c @@ -515,7 +515,7 @@ done: *------------------------------------------------------------------------- */ static herr_t -H5D_journal_status_cb(const H5C2_mdj_config_t *mdj_config, hid_t dxpl_id, +H5D_journal_status_cb(const H5C_mdj_config_t *mdj_config, hid_t dxpl_id, void *udata) { H5D_t *dset = (H5D_t *)udata; /* User callback data */ @@ -887,7 +887,7 @@ H5D_update_oh_info(H5F_t *file, hid_t dxpl_id, H5D_t *dset) HDassert(file == dset->oloc.file); /* Get a pointer to the object header itself */ - if(NULL == (oh = H5O_protect(oloc, dxpl_id, H5AC2_WRITE))) + if(NULL == (oh = H5O_protect(oloc, dxpl_id, H5AC_WRITE))) HGOTO_ERROR(H5E_DATASET, H5E_CANTPROTECT, FAIL, "unable to protect dataset object header") /* Pin the object header */ @@ -895,7 +895,7 @@ H5D_update_oh_info(H5F_t *file, hid_t dxpl_id, H5D_t *dset) HGOTO_ERROR(H5E_DATASET, H5E_CANTPIN, FAIL, "unable to pin dataset object header") /* Unprotect the object header */ - if(H5O_unprotect(oloc, dxpl_id, oh, H5AC2__NO_FLAGS_SET) < 0) + if(H5O_unprotect(oloc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_DATASET, H5E_CANTUNPROTECT, FAIL, "unable to unprotect dataset object header") /* Write new fill value message */ @@ -958,7 +958,7 @@ H5D_update_oh_info(H5F_t *file, hid_t dxpl_id, H5D_t *dset) HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "unable to create EFL file name heap") /* Pin the heap down in memory */ - if(NULL == (heap = H5HL_protect(file, dxpl_id, efl->heap_addr, H5AC2_WRITE))) + if(NULL == (heap = H5HL_protect(file, dxpl_id, efl->heap_addr, H5AC_WRITE))) HGOTO_ERROR(H5E_DATASET, H5E_CANTPROTECT, FAIL, "unable to protect EFL file name heap") /* Insert "empty" name first */ @@ -1205,7 +1205,7 @@ H5D_create(H5F_t *file, hid_t type_id, const H5S_t *space, hid_t dcpl_id, new_dset->shared->fo_count = 1; /* Register callback for this dataset with cache, when journaling status changes */ - if(H5AC2_register_mdjsc_callback(new_dset->oloc.file, H5D_journal_status_cb, new_dset, &new_dset->mdjsc_idx, NULL) < 0) + if(H5AC_register_mdjsc_callback(new_dset->oloc.file, H5D_journal_status_cb, new_dset, &new_dset->mdjsc_idx, NULL) < 0) HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL, "can't register journal status callback") /* Success */ @@ -1298,7 +1298,7 @@ H5D_open(const H5G_loc_t *loc, hid_t dxpl_id) HGOTO_ERROR(H5E_DATASET, H5E_NOTFOUND, NULL, "not found") /* Register callback for this dataset with cache, when journaling status changes */ - if(H5AC2_register_mdjsc_callback(dataset->oloc.file, H5D_journal_status_cb, dataset, &dataset->mdjsc_idx, NULL) < 0) + if(H5AC_register_mdjsc_callback(dataset->oloc.file, H5D_journal_status_cb, dataset, &dataset->mdjsc_idx, NULL) < 0) HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, NULL, "can't register journal status callback") /* Add the dataset to the list of opened objects in the file */ @@ -1622,13 +1622,13 @@ H5D_close(H5D_t *dataset) /* Deregister journaling status change cache callback for this dataset */ if(dataset->mdjsc_idx >= 0) - if(H5AC2_deregister_mdjsc_callback(dataset->oloc.file, dataset->mdjsc_idx) < 0) + if(H5AC_deregister_mdjsc_callback(dataset->oloc.file, dataset->mdjsc_idx) < 0) HGOTO_ERROR(H5E_DATASET, H5E_CANTRELEASE, FAIL, "can't deregister journal status callback") dataset->shared->fo_count--; if(dataset->shared->fo_count == 0) { /* Flush the dataset's information */ - if(H5D_flush_real(dataset, H5AC2_dxpl_id, H5F_FLUSH_NONE) < 0) + if(H5D_flush_real(dataset, H5AC_dxpl_id, H5F_FLUSH_NONE) < 0) HGOTO_ERROR(H5E_DATASET, H5E_WRITEERROR, FAIL, "unable to flush cached dataset info") /* Free the data sieve buffer, if it's been allocated */ @@ -1664,7 +1664,7 @@ H5D_close(H5D_t *dataset) } /* end if */ /* Flush and destroy chunks in the cache */ - if(H5D_chunk_dest(dataset->oloc.file, H5AC2_dxpl_id, dataset) < 0) + if(H5D_chunk_dest(dataset->oloc.file, H5AC_dxpl_id, dataset) < 0) HGOTO_ERROR(H5E_DATASET, H5E_CANTRELEASE, FAIL, "unable to destroy chunk cache") break; @@ -1690,7 +1690,7 @@ H5D_close(H5D_t *dataset) /* Remove the dataset from the list of opened objects in the file */ if(H5FO_top_decr(dataset->oloc.file, dataset->oloc.addr) < 0) HGOTO_ERROR(H5E_DATASET, H5E_CANTRELEASE, FAIL, "can't decrement count for object") - if(H5FO_delete(dataset->oloc.file, H5AC2_dxpl_id, dataset->oloc.addr) < 0) + if(H5FO_delete(dataset->oloc.file, H5AC_dxpl_id, dataset->oloc.addr) < 0) HGOTO_ERROR(H5E_DATASET, H5E_CANTRELEASE, FAIL, "can't remove dataset from list of open objects") /* Close the dataset object */ @@ -2504,7 +2504,7 @@ H5D_flush_real(H5D_t *dataset, hid_t dxpl_id, unsigned flags) unsigned update_flags = H5O_UPDATE_TIME; /* Modification time flag */ /* Get a pointer to the dataset's object header */ - if((oh = H5O_protect(&dataset->oloc, dxpl_id, H5AC2_WRITE)) == NULL) + if((oh = H5O_protect(&dataset->oloc, dxpl_id, H5AC_WRITE)) == NULL) HGOTO_ERROR(H5E_DATASET, H5E_CANTPROTECT, FAIL, "unable to protect dataset object header") /* Pin the object header */ @@ -2512,7 +2512,7 @@ H5D_flush_real(H5D_t *dataset, hid_t dxpl_id, unsigned flags) HGOTO_ERROR(H5E_DATASET, H5E_CANTPIN, FAIL, "unable to pin dataset object header") /* Unprotect the object header */ - if(H5O_unprotect(&dataset->oloc, dxpl_id, oh, H5AC2__NO_FLAGS_SET) < 0) + if(H5O_unprotect(&dataset->oloc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_DATASET, H5E_CANTUNPROTECT, FAIL, "unable to unprotect dataset object header") /* Update the layout on disk, if it's been changed */ diff --git a/src/H5Dio.c b/src/H5Dio.c index 41f1021..992a4e6 100644 --- a/src/H5Dio.c +++ b/src/H5Dio.c @@ -24,7 +24,7 @@ /* Headers */ /***********/ #include "H5private.h" /* Generic Functions */ -#include "H5AC2private.h" /* Metadata cache */ +#include "H5ACprivate.h" /* Metadata cache */ #include "H5Dpkg.h" /* Dataset functions */ #include "H5Eprivate.h" /* Error handling */ #include "H5FLprivate.h" /* Free Lists */ diff --git a/src/H5F.c b/src/H5F.c index 51464fb..8194c25 100644 --- a/src/H5F.c +++ b/src/H5F.c @@ -23,7 +23,7 @@ #include "H5private.h" /* Generic Functions */ #include "H5Aprivate.h" /* Attributes */ #include "H5AC1private.h" /* Metadata cache */ -#include "H5AC2private.h" /* Metadata cache2 */ +#include "H5ACprivate.h" /* Metadata cache */ #include "H5Dprivate.h" /* Datasets */ #include "H5Eprivate.h" /* Error handling */ #include "H5Fpkg.h" /* File access */ @@ -778,7 +778,7 @@ H5Fis_hdf5(const char *name) HGOTO_ERROR(H5E_IO, H5E_CANTINIT, FAIL, "unable to open file") /* The file is an hdf5 file if the hdf5 file signature can be found */ - ret_value = (HADDR_UNDEF!=H5F_locate_signature(file, H5AC2_ind_dxpl_id)); + ret_value = (HADDR_UNDEF!=H5F_locate_signature(file, H5AC_ind_dxpl_id)); done: /* Close the file */ @@ -822,7 +822,7 @@ done: * * J Mainzer, Jun 30, 2005 * Added lf parameter so the shared->lf field can be - * initialized prior to the call to H5AC2_create() if a + * initialized prior to the call to H5AC_create() if a * new instance of H5F_file_t is created. lf should be * NULL if shared isn't, and vise versa. * @@ -938,14 +938,14 @@ H5F_new(H5F_file_t *shared, hid_t fcpl_id, hid_t fapl_id, H5FD_t *lf) * the access property list should be updated to reflect that. */ if(SUCCEED != H5AC1_create(f, &(f->shared->mdc_initCacheCfg))) - HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "unable to create metadata cache") + HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "unable to create metadata cache1") /* Create a metadata cache with modified API along side the regular * version. For now, this is just for testing. Once we get it * fully in use, we will delete the old version. */ - if(H5AC2_create(f, (H5AC2_cache_config_t *)&(f->shared->mdc_initCacheCfg)) < 0) - HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "unable to create meta data cache2") + if(H5AC_create(f, (H5AC_cache_config_t *)&(f->shared->mdc_initCacheCfg)) < 0) + HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "unable to create metadata cache") /* Create the file's "open object" information */ if(H5FO_create(f) < 0) @@ -1017,13 +1017,13 @@ H5F_dest(H5F_t *f, hid_t dxpl_id) /* Dump debugging info */ H5AC1_stats(f); #endif /* H5AC1_DUMP_STATS_ON_CLOSE */ -#if H5AC2_DUMP_STATS_ON_CLOSE +#if H5AC_DUMP_STATS_ON_CLOSE /* Dump debugging info */ - H5AC2_stats(f); -#endif /* H5AC2_DUMP_STATS_ON_CLOSE */ + H5AC_stats(f); +#endif /* H5AC_DUMP_STATS_ON_CLOSE */ /* shut down metadata journaling if it is enabled. */ - if(H5C2_end_journaling(f, dxpl_id, f->shared->cache2) < 0) + if(H5C_end_journaling(f, dxpl_id, f->shared->cache) < 0) /* Push error, but keep going*/ HDONE_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to shutdown metadata journaling") @@ -1059,7 +1059,7 @@ H5F_dest(H5F_t *f, hid_t dxpl_id) /* Push error, but keep going*/ HDONE_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "problems closing file") /* also destroy the new cache */ - if(H5AC2_dest(f, dxpl_id) < 0) + if(H5AC_dest(f, dxpl_id) < 0) /* Push error, but keep going*/ HDONE_ERROR(H5E_FILE, H5E_CANTRELEASE, FAIL, "problems closing file") if(H5FO_dest(f) < 0) @@ -1393,16 +1393,16 @@ H5F_open(const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id, hid_t d HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "unable to build extpath") { - H5AC2_jnl_config_t * config_ptr = NULL; + H5AC_jnl_config_t * config_ptr = NULL; config_ptr = &(file->shared->initJnlCfg); - if(H5AC2_check_for_journaling(file, dxpl_id, file->shared->cache2, + if(H5AC_check_for_journaling(file, dxpl_id, file->shared->cache, config_ptr->journal_recovered) < 0 ) - HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "H5AC2_check_for_journaling() reports failure.") + HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "H5AC_check_for_journaling() reports failure.") - if(H5AC2_set_jnl_config(file, dxpl_id, config_ptr, TRUE) < 0 ) - HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "H5AC2_set_jnl_config() failed.") + if(H5AC_set_jnl_config(file, dxpl_id, config_ptr, TRUE) < 0 ) + HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, NULL, "H5AC_set_jnl_config() failed.") } /* Success */ @@ -1515,7 +1515,7 @@ H5Fcreate(const char *filename, unsigned flags, hid_t fcpl_id, hid_t fapl_id) /* * Create a new file or truncate an existing file. */ - if(NULL == (new_file = H5F_open(filename, flags, fcpl_id, fapl_id, H5AC2_dxpl_id))) + if(NULL == (new_file = H5F_open(filename, flags, fcpl_id, fapl_id, H5AC_dxpl_id))) HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to create file") /* Get an atom for the file */ @@ -1602,7 +1602,7 @@ H5Fopen(const char *filename, unsigned flags, hid_t fapl_id) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not file access property list") /* Open the file */ - if(NULL == (new_file = H5F_open(filename, flags, H5P_FILE_CREATE_DEFAULT, fapl_id, H5AC2_dxpl_id))) + if(NULL == (new_file = H5F_open(filename, flags, H5P_FILE_CREATE_DEFAULT, fapl_id, H5AC_dxpl_id))) HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "unable to open file") /* Get an atom for the file */ @@ -1700,7 +1700,7 @@ H5Fflush(hid_t object_id, H5F_scope_t scope) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "object is not associated with a file") /* Flush the file */ - if(H5F_flush(f, H5AC2_dxpl_id, scope, H5F_FLUSH_NONE) < 0) + if(H5F_flush(f, H5AC_dxpl_id, scope, H5F_FLUSH_NONE) < 0) HGOTO_ERROR(H5E_FILE, H5E_CANTINIT, FAIL, "flush failed") done: @@ -1729,7 +1729,7 @@ H5F_flush(H5F_t *f, hid_t dxpl_id, H5F_scope_t scope, unsigned flags) unsigned nerrors = 0; /* Errors from nested flushes */ unsigned i; /* Index variable */ unsigned int H5AC1_flags; /* translated flags for H5AC1_flush() */ - unsigned int H5AC2_flags; /* translated flags for H5AC2_flush() */ + unsigned int H5AC_flags; /* translated flags for H5AC_flush() */ herr_t ret_value; /* Return value */ FUNC_ENTER_NOAPI_NOINIT(H5F_flush) @@ -1768,12 +1768,12 @@ H5F_flush(H5F_t *f, hid_t dxpl_id, H5F_scope_t scope, unsigned flags) if((flags & H5F_FLUSH_INVALIDATE) != 0 ) H5AC1_flags |= H5AC1__FLUSH_INVALIDATE_FLAG; if(H5AC1_flush(f, dxpl_id, H5AC1_flags) < 0) - HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush metadata cache") - H5AC2_flags = 0; + HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush metadata cache1") + H5AC_flags = 0; if((flags & H5F_FLUSH_INVALIDATE) != 0 ) - H5AC2_flags |= H5AC2__FLUSH_INVALIDATE_FLAG; - if(H5AC2_flush(f, dxpl_id, H5AC2_flags) < 0) - HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush metadata cache2") + H5AC_flags |= H5AC__FLUSH_INVALIDATE_FLAG; + if(H5AC_flush(f, dxpl_id, H5AC_flags) < 0) + HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush metadata cache") /* * If we are invalidating everything (which only happens just before @@ -2007,7 +2007,7 @@ H5F_try_close(H5F_t *f) */ if(f->intent&H5F_ACC_RDWR) { /* Flush and destroy all caches */ - if(H5F_flush(f, H5AC2_dxpl_id, H5F_SCOPE_LOCAL, H5F_FLUSH_NONE) < 0) + if(H5F_flush(f, H5AC_dxpl_id, H5F_SCOPE_LOCAL, H5F_FLUSH_NONE) < 0) HGOTO_ERROR(H5E_CACHE, H5E_CANTFLUSH, FAIL, "unable to flush cache") } /* end if */ @@ -2016,7 +2016,7 @@ H5F_try_close(H5F_t *f) * shared H5F_file_t struct. If the reference count for the H5F_file_t * struct reaches zero then destroy it also. */ - if(H5F_dest(f, H5AC2_dxpl_id) < 0) + if(H5F_dest(f, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "problems closing file") done: @@ -2125,7 +2125,7 @@ H5Freopen(hid_t file_id) done: if(ret_value < 0 && new_file) - if(H5F_dest(new_file, H5AC2_dxpl_id) < 0) + if(H5F_dest(new_file, H5AC_dxpl_id) < 0) HDONE_ERROR(H5E_FILE, H5E_CANTCLOSEFILE, FAIL, "can't close file") FUNC_LEAVE_API(ret_value) @@ -3393,22 +3393,22 @@ done: * * Changes: John Mainzer * 8/4/08 - * Reworked function to use the new H5AC2_jnl_config_t - * structure and H5AC2_get_jnl_config(). + * Reworked function to use the new H5AC_jnl_config_t + * structure and H5AC_get_jnl_config(). * *------------------------------------------------------------------------- */ htri_t H5F_is_journaling_enabled(const H5F_t *f) { - H5AC2_jnl_config_t config; /* Current journaling configuration */ + H5AC_jnl_config_t config; /* Current journaling configuration */ htri_t ret_value; /* Return value */ FUNC_ENTER_NOAPI(H5F_is_journaling_enabled, FAIL) /* Retrieve the current cache information */ - config.version = H5AC2__CURR_JNL_CONFIG_VER; - if(H5AC2_get_jnl_config(f->shared->cache2, &config) < 0) + config.version = H5AC__CURR_JNL_CONFIG_VER; + if(H5AC_get_jnl_config(f->shared->cache, &config) < 0) HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "can't retrieve journaling configuration") /* Set return value */ @@ -3438,7 +3438,7 @@ done: *------------------------------------------------------------------------- */ herr_t -H5Fget_jnl_config(hid_t file_id, H5AC2_jnl_config_t *config_ptr) +H5Fget_jnl_config(hid_t file_id, H5AC_jnl_config_t *config_ptr) { H5F_t *file; /* File object for file ID */ herr_t ret_value = SUCCEED; /* Return value */ @@ -3449,12 +3449,12 @@ H5Fget_jnl_config(hid_t file_id, H5AC2_jnl_config_t *config_ptr) /* Check args */ if(NULL == (file = H5I_object_verify(file_id, H5I_FILE)) ) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file ID") - if((NULL == config_ptr) || (!H5AC2_validate_jnl_config_ver(config_ptr->version))) + if((NULL == config_ptr) || (!H5AC_validate_jnl_config_ver(config_ptr->version))) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Bad config_ptr") /* Go get the journaling configuration */ - if(H5AC2_get_jnl_config(file->shared->cache2, config_ptr) < 0) - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5AC2_get_jnl_config() failed.") + if(H5AC_get_jnl_config(file->shared->cache, config_ptr) < 0) + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5AC_get_jnl_config() failed.") done: FUNC_LEAVE_API(ret_value) @@ -3465,7 +3465,7 @@ done: * Function: H5Fset_jnl_config * * Purpose: Sets the current journaling configuration, using the - * contents of the instance of H5AC2_jnl_config_t pointed + * contents of the instance of H5AC_jnl_config_t pointed * to by config_ptr. * * Return: Success: SUCCEED @@ -3477,7 +3477,7 @@ done: *------------------------------------------------------------------------- */ herr_t -H5Fset_jnl_config(hid_t file_id, const H5AC2_jnl_config_t *config_ptr) +H5Fset_jnl_config(hid_t file_id, const H5AC_jnl_config_t *config_ptr) { H5F_t *file; /* File object for file ID */ herr_t ret_value = SUCCEED; /* Return value */ @@ -3490,8 +3490,8 @@ H5Fset_jnl_config(hid_t file_id, const H5AC2_jnl_config_t *config_ptr) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file ID") /* Set the resize configuration */ - if(H5AC2_set_jnl_config(file, H5P_DATASET_XFER_DEFAULT, config_ptr, FALSE) < 0) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "H5AC2_set_jnl_config() failed.") + if(H5AC_set_jnl_config(file, H5P_DATASET_XFER_DEFAULT, config_ptr, FALSE) < 0) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "H5AC_set_jnl_config() failed.") done: FUNC_LEAVE_API(ret_value) @@ -3528,12 +3528,12 @@ H5Fget_mdc_config(hid_t file_id, H5AC1_cache_config_t *config_ptr) /* Check args */ if(NULL == (file = H5I_object_verify(file_id, H5I_FILE))) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file ID") - if((NULL == config_ptr) || !H5AC2_validate_cache_config_ver(config_ptr->version)) + if((NULL == config_ptr) || !H5AC_validate_cache_config_ver(config_ptr->version)) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Bad config_ptr") /* Go get the resize configuration */ - if(H5AC2_get_cache_auto_resize_config(file->shared->cache2, (H5AC2_cache_config_t *)config_ptr) < 0) - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5AC2_get_cache_auto_resize_config() failed.") + if(H5AC_get_cache_auto_resize_config(file->shared->cache, (H5AC_cache_config_t *)config_ptr) < 0) + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5AC_get_cache_auto_resize_config() failed.") done: FUNC_LEAVE_API(ret_value) @@ -3569,12 +3569,12 @@ H5Fset_mdc_config(hid_t file_id, H5AC1_cache_config_t *config_ptr) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file ID") /* set the resize configuration */ - if(H5AC1_set_cache_auto_resize_config(file->shared->cache, config_ptr) < 0) + if(H5AC1_set_cache_auto_resize_config(file->shared->cache1, config_ptr) < 0) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "H5AC1_set_cache_auto_resize_config() failed.") /* pass the resize configuration to the modified cache as well. */ - if(H5AC2_set_cache_auto_resize_config(file->shared->cache2, (H5AC2_cache_config_t *)config_ptr) < 0) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "H5AC2_set_cache_auto_resize_config() failed.") + if(H5AC_set_cache_auto_resize_config(file->shared->cache, (H5AC_cache_config_t *)config_ptr) < 0) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "H5AC_set_cache_auto_resize_config() failed.") done: FUNC_LEAVE_API(ret_value) @@ -3613,8 +3613,8 @@ H5Fget_mdc_hit_rate(hid_t file_id, double *hit_rate_ptr) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "NULL hit rate pointer") /* Go get the current hit rate */ - if(H5AC2_get_cache_hit_rate(file->shared->cache2, hit_rate_ptr) < 0) - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5AC2_get_cache_hit_rate() failed.") + if(H5AC_get_cache_hit_rate(file->shared->cache, hit_rate_ptr) < 0) + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5AC_get_cache_hit_rate() failed.") done: FUNC_LEAVE_API(ret_value) @@ -3655,9 +3655,9 @@ H5Fget_mdc_size(hid_t file_id, size_t *max_size_ptr, size_t *min_clean_size_ptr, HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file ID") /* Go get the size data */ - if(H5AC2_get_cache_size(file->shared->cache2, max_size_ptr, + if(H5AC_get_cache_size(file->shared->cache, max_size_ptr, min_clean_size_ptr, cur_size_ptr, &cur_num_entries) < 0) - HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5AC2_get_cache_size() failed.") + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "H5AC_get_cache_size() failed.") if(cur_num_entries_ptr != NULL) *cur_num_entries_ptr = (int)cur_num_entries; @@ -3701,7 +3701,7 @@ H5Freset_mdc_hit_rate_stats(hid_t file_id) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "not a file ID") /* Reset the hit rate statistic */ - if(H5AC2_reset_cache_hit_rate_stats(file->shared->cache2) < 0) + if(H5AC_reset_cache_hit_rate_stats(file->shared->cache) < 0) HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "can't reset cache hit rate") done: @@ -3821,12 +3821,12 @@ H5Fget_info(hid_t obj_id, H5F_info_t *finfo) /* Check for superblock extension info */ if(H5F_addr_defined(f->shared->extension_addr)) - if(H5F_super_ext_size(f, H5AC2_ind_dxpl_id, &finfo->super_ext_size) < 0) + if(H5F_super_ext_size(f, H5AC_ind_dxpl_id, &finfo->super_ext_size) < 0) HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "Unable to retrieve superblock extension size") /* Check for SOHM info */ if(H5F_addr_defined(f->shared->sohm_addr)) - if(H5SM_ih_size(f, H5AC2_ind_dxpl_id, finfo) < 0) + if(H5SM_ih_size(f, H5AC_ind_dxpl_id, finfo) < 0) HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "Unable to retrieve SOHM btree & heap storage info") done: diff --git a/src/H5FDmpiposix.c b/src/H5FDmpiposix.c index 3951eca..5aa1a12 100644 --- a/src/H5FDmpiposix.c +++ b/src/H5FDmpiposix.c @@ -1260,8 +1260,8 @@ H5FD_mpiposix_write(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, * we are flushing out a bunch of metadata. Then, we block before the * first write and don't block for further writes in the sequence. */ - if(H5P_exist_plist(plist,H5AC2_BLOCK_BEFORE_META_WRITE_NAME)>0) - if(H5P_get(plist,H5AC2_BLOCK_BEFORE_META_WRITE_NAME,&block_before_meta_write)<0) + if(H5P_exist_plist(plist,H5AC_BLOCK_BEFORE_META_WRITE_NAME)>0) + if(H5P_get(plist,H5AC_BLOCK_BEFORE_META_WRITE_NAME,&block_before_meta_write)<0) HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get H5AC property") #if 0 /* JRM */ diff --git a/src/H5FS.c b/src/H5FS.c index 172adae..89817d0 100644 --- a/src/H5FS.c +++ b/src/H5FS.c @@ -33,7 +33,7 @@ /* Headers */ /***********/ #include "H5private.h" /* Generic Functions */ -#include "H5AC2private.h" /* Metadata cache */ +#include "H5ACprivate.h" /* Metadata cache */ #include "H5Eprivate.h" /* Error handling */ #include "H5FSpkg.h" /* File free space */ #include "H5MFprivate.h" /* File memory management */ @@ -136,7 +136,7 @@ HDfprintf(stderr, "%s: Creating free space manager, nclasses = %Zu\n", FUNC, ncl fspace->max_sect_size = fs_create->max_sect_size; /* Cache the new free space header (pinned) */ - if(H5AC2_set(f, dxpl_id, H5AC2_FSPACE_HDR, fspace->addr, H5FS_HEADER_SIZE(f), fspace, H5AC2__PIN_ENTRY_FLAG) < 0) + if(H5AC_set(f, dxpl_id, H5AC_FSPACE_HDR, fspace->addr, H5FS_HEADER_SIZE(f), fspace, H5AC__PIN_ENTRY_FLAG) < 0) HGOTO_ERROR(H5E_FSPACE, H5E_CANTINIT, NULL, "can't add free space header to cache") /* Set the return value */ @@ -192,7 +192,7 @@ HDfprintf(stderr, "%s: Opening free space manager, nclasses = %Zu\n", FUNC, ncla cache_udata.f = f; /* Protect the free space header */ - if(NULL == (fspace = H5AC2_protect(f, dxpl_id, H5AC2_FSPACE_HDR, fs_addr, H5FS_HEADER_SIZE(f), &cache_udata, H5AC2_READ))) + if(NULL == (fspace = H5AC_protect(f, dxpl_id, H5AC_FSPACE_HDR, fs_addr, H5FS_HEADER_SIZE(f), &cache_udata, H5AC_READ))) HGOTO_ERROR(H5E_FSPACE, H5E_CANTPROTECT, NULL, "unable to load free space header") #ifdef QAK HDfprintf(stderr, "%s: fspace->sect_addr = %a\n", FUNC, fspace->sect_addr); @@ -202,19 +202,19 @@ HDfprintf(stderr, "%s: fspace->sinfo = %p\n", FUNC, fspace->sinfo); #endif /* QAK */ /* Check the free space header's status in the metadata cache */ - if(H5AC2_get_entry_status(f, fs_addr, &fspace_status) < 0) + if(H5AC_get_entry_status(f, fs_addr, &fspace_status) < 0) HGOTO_ERROR(H5E_FSPACE, H5E_CANTGET, NULL, "unable to check metadata cache status for free space header") /* If the free space header isn't already pinned, pin it now */ /* (could still be pinned from it's section info still hanging around in the cache) */ - if(!(fspace_status & H5AC2_ES__IS_PINNED)) { + if(!(fspace_status & H5AC_ES__IS_PINNED)) { /* Pin free space header in the cache */ - if(H5AC2_pin_protected_entry(fspace) < 0) + if(H5AC_pin_protected_entry(fspace) < 0) HGOTO_ERROR(H5E_FSPACE, H5E_CANTPIN, NULL, "unable to pin free space header") } /* end if */ /* Unlock free space header, now pinned */ - if(H5AC2_unprotect(f, dxpl_id, H5AC2_FSPACE_HDR, fs_addr, (size_t)0, fspace, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_FSPACE_HDR, fs_addr, (size_t)0, fspace, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_FSPACE, H5E_CANTUNPROTECT, NULL, "unable to release free space header") /* Set return value */ @@ -265,7 +265,7 @@ HDfprintf(stderr, "%s: Deleting free space manager\n", FUNC); cache_udata.f = f; /* Protect the free space header */ - if(NULL == (fspace = H5AC2_protect(f, dxpl_id, H5AC2_FSPACE_HDR, fs_addr, H5FS_HEADER_SIZE(f), &cache_udata, H5AC2_WRITE))) + if(NULL == (fspace = H5AC_protect(f, dxpl_id, H5AC_FSPACE_HDR, fs_addr, H5FS_HEADER_SIZE(f), &cache_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_FSPACE, H5E_CANTPROTECT, FAIL, "unable to protect free space header") /* Delete serialized section storage, if there are any */ @@ -280,20 +280,20 @@ HDfprintf(stderr, "%s: fspace->sect_addr = %a\n", FUNC, fspace->sect_addr); HDassert(fspace->sect_size > 0); /* Check the free space section info's status in the metadata cache */ - if(H5AC2_get_entry_status(f, fspace->sect_addr, &sinfo_status) < 0) + if(H5AC_get_entry_status(f, fspace->sect_addr, &sinfo_status) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "unable to check metadata cache status for free space section info") /* If the free space section info is in the cache, expunge it now */ - if(sinfo_status & H5AC2_ES__IN_CACHE) { + if(sinfo_status & H5AC_ES__IN_CACHE) { /* Sanity checks on direct block */ - HDassert(!(sinfo_status & H5AC2_ES__IS_PINNED)); - HDassert(!(sinfo_status & H5AC2_ES__IS_PROTECTED)); + HDassert(!(sinfo_status & H5AC_ES__IS_PINNED)); + HDassert(!(sinfo_status & H5AC_ES__IS_PROTECTED)); #ifdef QAK HDfprintf(stderr, "%s: Expunging free space section info from cache\n", FUNC); #endif /* QAK */ /* Evict the free space section info from the metadata cache */ - if(H5AC2_expunge_entry(f, dxpl_id, H5AC2_FSPACE_SINFO, fspace->sect_addr) < 0) + if(H5AC_expunge_entry(f, dxpl_id, H5AC_FSPACE_SINFO, fspace->sect_addr) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTREMOVE, FAIL, "unable to remove free space section info from cache") #ifdef QAK HDfprintf(stderr, "%s: Done expunging free space section info from cache\n", FUNC); @@ -310,7 +310,7 @@ HDfprintf(stderr, "%s: Done expunging free space section info from cache\n", FUN HGOTO_ERROR(H5E_FSPACE, H5E_CANTFREE, FAIL, "unable to release free space header") /* Release the free space header */ - if(H5AC2_unprotect(f, dxpl_id, H5AC2_FSPACE_HDR, fs_addr, (size_t)0, fspace, H5AC2__DELETED_FLAG) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_FSPACE_HDR, fs_addr, (size_t)0, fspace, H5AC__DELETED_FLAG) < 0) HGOTO_ERROR(H5E_FSPACE, H5E_CANTUNPROTECT, FAIL, "unable to release free space header") fspace = NULL; @@ -353,7 +353,7 @@ HDfprintf(stderr, "%s: Entering, fspace = %p, fspace->sinfo = %p\n", FUNC, fspac HDassert(H5F_addr_defined(fspace->sect_addr)); /* Unpin the free space section info in the cache */ - if(H5AC2_unpin_entry(fspace->sinfo) < 0) + if(H5AC_unpin_entry(fspace->sinfo) < 0) HGOTO_ERROR(H5E_FSPACE, H5E_CANTUNPIN, FAIL, "unable to unpin free space section info") /* If there aren't any sections being managed, free the space for the sections */ @@ -376,11 +376,11 @@ HDfprintf(stderr, "%s: fspace->tot_sect_count = %Hu\n", FUNC, fspace->tot_sect_c fspace->alloc_sect_size = fspace->sect_size = 0; /* Mark free space header as dirty */ - if(H5AC2_mark_pinned_or_protected_entry_dirty(fspace) < 0) + if(H5AC_mark_pinned_or_protected_entry_dirty(fspace) < 0) HGOTO_ERROR(H5E_FSPACE, H5E_CANTMARKDIRTY, FAIL, "unable to mark free space header as dirty") /* Evict the section info from the metadata cache */ - if(H5AC2_expunge_entry(f, dxpl_id, H5AC2_FSPACE_SINFO, old_addr) < 0) + if(H5AC_expunge_entry(f, dxpl_id, H5AC_FSPACE_SINFO, old_addr) < 0) HGOTO_ERROR(H5E_FSPACE, H5E_CANTREMOVE, FAIL, "unable to remove free space section info from cache") } /* end if */ } /* end if */ @@ -388,17 +388,17 @@ HDfprintf(stderr, "%s: fspace->tot_sect_count = %Hu\n", FUNC, fspace->tot_sect_c unsigned sect_status = 0; /* Free space section's status in the metadata cache */ /* Check if we've allocated any section info in the file & if it's still in the cache */ - if(H5F_addr_defined(fspace->sect_addr) && H5AC2_get_entry_status(f, fspace->sect_addr, §_status) < 0) + if(H5F_addr_defined(fspace->sect_addr) && H5AC_get_entry_status(f, fspace->sect_addr, §_status) < 0) HGOTO_ERROR(H5E_FSPACE, H5E_CANTGET, FAIL, "unable to check metadata cache status for free space header") /* If this free list header's section info exists and is still in the * cache, don't unpin the header - let the section info do it, * when the section info is evicted from the cache. -QAK */ - if(!(sect_status & H5AC2_ES__IN_CACHE)) { + if(!(sect_status & H5AC_ES__IN_CACHE)) { /* Unpin the free space header in the cache */ /* (the section info destructor would unpin it if the section info existed) */ - if(H5AC2_unpin_entry(fspace) < 0) + if(H5AC_unpin_entry(fspace) < 0) HGOTO_ERROR(H5E_FSPACE, H5E_CANTUNPIN, FAIL, "unable to unpin free space header") } /* end if */ } /* end else */ @@ -670,7 +670,7 @@ H5FS_cache_sinfo_dest(H5FS_sinfo_t *sinfo) /* (make certain this is last action with section info, to allow for header * disappearing immediately) */ - if(H5AC2_unpin_entry(sinfo->fspace) < 0) + if(H5AC_unpin_entry(sinfo->fspace) < 0) HGOTO_ERROR(H5E_FSPACE, H5E_CANTUNPIN, FAIL, "unable to unpin free space header") /* Release free space section info */ diff --git a/src/H5FScache.c b/src/H5FScache.c index 4c85824..234e639 100644 --- a/src/H5FScache.c +++ b/src/H5FScache.c @@ -34,7 +34,7 @@ /* Headers */ /***********/ #include "H5private.h" /* Generic Functions */ -#include "H5AC2private.h" /* Metadata cache */ +#include "H5ACprivate.h" /* Metadata cache */ #include "H5Eprivate.h" /* Error handling */ #include "H5FSpkg.h" /* File free space */ #include "H5Vprivate.h" /* Vectors and arrays */ @@ -94,9 +94,9 @@ static herr_t H5FS_cache_sinfo_free_icr(haddr_t addr, size_t len, void *thing); /* Package Variables */ /*********************/ -/* H5FS header inherits cache-like properties from H5AC2 */ -const H5AC2_class_t H5AC2_FSPACE_HDR[1] = {{ - H5AC2_FSPACE_HDR_ID, +/* H5FS header inherits cache-like properties from H5AC */ +const H5AC_class_t H5AC_FSPACE_HDR[1] = {{ + H5AC_FSPACE_HDR_ID, "Free space header", H5FD_MEM_FSPACE_HDR, H5FS_cache_hdr_deserialize, @@ -106,9 +106,9 @@ const H5AC2_class_t H5AC2_FSPACE_HDR[1] = {{ NULL, /* H5FS_cache_hdr_clear_dirty_bits, */ }}; -/* H5FS serialized sections inherit cache-like properties from H5AC2 */ -const H5AC2_class_t H5AC2_FSPACE_SINFO[1] = {{ - H5AC2_FSPACE_SINFO_ID, +/* H5FS serialized sections inherit cache-like properties from H5AC */ +const H5AC_class_t H5AC_FSPACE_SINFO[1] = {{ + H5AC_FSPACE_SINFO_ID, "Free space section info", H5FD_MEM_FSPACE_SINFO, H5FS_cache_sinfo_deserialize, diff --git a/src/H5FSdbg.c b/src/H5FSdbg.c index cb7dfe3..b9b6c14 100644 --- a/src/H5FSdbg.c +++ b/src/H5FSdbg.c @@ -116,7 +116,7 @@ H5FS_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, int /* * Load the free space header. */ - if(NULL == (fspace = H5AC2_protect(f, dxpl_id, H5AC2_FSPACE_HDR, addr, H5FS_HEADER_SIZE(f), &cache_udata, H5AC2_READ))) + if(NULL == (fspace = H5AC_protect(f, dxpl_id, H5AC_FSPACE_HDR, addr, H5FS_HEADER_SIZE(f), &cache_udata, H5AC_READ))) HGOTO_ERROR(H5E_FSPACE, H5E_CANTLOAD, FAIL, "unable to load free space header") /* Print opening message */ @@ -166,7 +166,7 @@ H5FS_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, int fspace->alloc_sect_size); done: - if(fspace && H5AC2_unprotect(f, dxpl_id, H5AC2_FSPACE_HDR, addr, (size_t)0, fspace, H5AC2__NO_FLAGS_SET) < 0) + if(fspace && H5AC_unprotect(f, dxpl_id, H5AC_FSPACE_HDR, addr, (size_t)0, fspace, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_FSPACE, H5E_PROTECT, FAIL, "unable to release free space header") FUNC_LEAVE_NOAPI(ret_value) @@ -258,14 +258,14 @@ H5FS_sects_debug(H5F_t *f, hid_t dxpl_id, haddr_t UNUSED addr, FILE *stream, int /* * Load the free space header. */ - if(NULL == (fspace = H5AC2_protect(f, dxpl_id, H5AC2_FSPACE_HDR, fs_addr, H5FS_HEADER_SIZE(f), &cache_udata, H5AC2_READ))) + if(NULL == (fspace = H5AC_protect(f, dxpl_id, H5AC_FSPACE_HDR, fs_addr, H5FS_HEADER_SIZE(f), &cache_udata, H5AC_READ))) HGOTO_ERROR(H5E_FSPACE, H5E_CANTLOAD, FAIL, "unable to load free space header") /* Retrieve the client id */ client = fspace->client; /* Release the free space header */ - if(H5AC2_unprotect(f, dxpl_id, H5AC2_FSPACE_HDR, fs_addr, (size_t)0, fspace, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_FSPACE_HDR, fs_addr, (size_t)0, fspace, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_FSPACE, H5E_PROTECT, FAIL, "unable to release free space header") fspace = NULL; @@ -287,7 +287,7 @@ H5FS_sects_debug(H5F_t *f, hid_t dxpl_id, haddr_t UNUSED addr, FILE *stream, int } /* end switch */ done: - if(fspace && H5AC2_unprotect(f, dxpl_id, H5AC2_FSPACE_HDR, fs_addr, (size_t)0, fspace, H5AC2__NO_FLAGS_SET) < 0) + if(fspace && H5AC_unprotect(f, dxpl_id, H5AC_FSPACE_HDR, fs_addr, (size_t)0, fspace, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_FSPACE, H5E_PROTECT, FAIL, "unable to release free space header") FUNC_LEAVE_NOAPI(ret_value) diff --git a/src/H5FSpkg.h b/src/H5FSpkg.h index 2ed1996..ece1964 100644 --- a/src/H5FSpkg.h +++ b/src/H5FSpkg.h @@ -35,7 +35,7 @@ #include "H5FSprivate.h" /* File free space */ /* Other private headers needed by this file */ -#include "H5AC2private.h" /* Metadata cache */ +#include "H5ACprivate.h" /* Metadata cache */ #include "H5SLprivate.h" /* Skip lists */ /**************************/ @@ -133,7 +133,7 @@ typedef struct H5FS_node_t { /* Information about sections managed */ typedef struct H5FS_sinfo_t { /* Information for H5AC cache functions, _must_ be first field in structure */ - H5AC2_info_t cache_info; + H5AC_info_t cache_info; /* Stored information */ H5FS_bin_t *bins; /* Array of lists of lists of free sections */ @@ -156,7 +156,7 @@ typedef struct H5FS_sinfo_t { /* Main free space info */ struct H5FS_t { /* Information for H5AC cache functions, _must_ be first field in structure */ - H5AC2_info_t cache_info; + H5AC_info_t cache_info; /* Stored information */ /* Statistics about sections managed */ @@ -192,10 +192,10 @@ struct H5FS_t { /*****************************/ /* H5FS header inherits cache-like properties from H5AC */ -H5_DLLVAR const H5AC2_class_t H5AC2_FSPACE_HDR[1]; +H5_DLLVAR const H5AC_class_t H5AC_FSPACE_HDR[1]; /* H5FS section info inherits cache-like properties from H5AC */ -H5_DLLVAR const H5AC2_class_t H5AC2_FSPACE_SINFO[1]; +H5_DLLVAR const H5AC_class_t H5AC_FSPACE_SINFO[1]; /* Declare a free list to manage the H5FS_node_t struct */ H5FL_EXTERN(H5FS_node_t); diff --git a/src/H5FSsection.c b/src/H5FSsection.c index aa6d71e..9930223 100644 --- a/src/H5FSsection.c +++ b/src/H5FSsection.c @@ -222,11 +222,11 @@ HDfprintf(stderr, "%s: New section info, addr = %a, size = %Hu\n", FUNC, fspace- #endif /* QAK */ /* Cache the new free space section info (pinned) */ - if(H5AC2_set(f, dxpl_id, H5AC2_FSPACE_SINFO, fspace->sect_addr, (size_t)fspace->alloc_sect_size, sinfo, H5AC2__PIN_ENTRY_FLAG) < 0) + if(H5AC_set(f, dxpl_id, H5AC_FSPACE_SINFO, fspace->sect_addr, (size_t)fspace->alloc_sect_size, sinfo, H5AC__PIN_ENTRY_FLAG) < 0) HGOTO_ERROR(H5E_FSPACE, H5E_CANTINIT, NULL, "can't add free space sections to cache") /* Mark free space header as dirty */ - if(H5AC2_mark_pinned_or_protected_entry_dirty(fspace) < 0) + if(H5AC_mark_pinned_or_protected_entry_dirty(fspace) < 0) HGOTO_ERROR(H5E_FSPACE, H5E_CANTMARKDIRTY, NULL, "unable to mark free space header as dirty") } /* end if */ else { @@ -239,15 +239,15 @@ HDfprintf(stderr, "%s: Reading in existing sections, fspace->sect_addr = %a\n", cache_udata.dxpl_id = dxpl_id; /* Protect the free space sections */ - if(NULL == (sinfo = H5AC2_protect(f, dxpl_id, H5AC2_FSPACE_SINFO, fspace->sect_addr, (size_t)fspace->alloc_sect_size, &cache_udata, H5AC2_WRITE))) + if(NULL == (sinfo = H5AC_protect(f, dxpl_id, H5AC_FSPACE_SINFO, fspace->sect_addr, (size_t)fspace->alloc_sect_size, &cache_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_FSPACE, H5E_CANTPROTECT, NULL, "unable to load free space sections") /* Pin them in the cache */ - if(H5AC2_pin_protected_entry(sinfo) < 0) + if(H5AC_pin_protected_entry(sinfo) < 0) HGOTO_ERROR(H5E_FSPACE, H5E_CANTPIN, NULL, "unable to pin free space sections") /* Unlock free space sections, now pinned */ - if(H5AC2_unprotect(f, dxpl_id, H5AC2_FSPACE_SINFO, fspace->sect_addr, (size_t)0, sinfo, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_FSPACE_SINFO, fspace->sect_addr, (size_t)0, sinfo, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_FSPACE, H5E_CANTUNPROTECT, NULL, "unable to release free space sections") } /* end else */ #ifdef QAK @@ -324,7 +324,7 @@ HDfprintf(stderr, "%s: cls->serial_size = %Zu\n", FUNC, cls->serial_size); } /* end else */ /* Mark free space header as dirty */ - if(H5AC2_mark_pinned_or_protected_entry_dirty(fspace) < 0) + if(H5AC_mark_pinned_or_protected_entry_dirty(fspace) < 0) HGOTO_ERROR(H5E_FSPACE, H5E_CANTMARKDIRTY, FAIL, "unable to mark free space header as dirty") done: @@ -387,7 +387,7 @@ HDfprintf(stderr, "%s: cls->serial_size = %Zu\n", FUNC, cls->serial_size); } /* end else */ /* Mark free space header as dirty */ - if(H5AC2_mark_pinned_or_protected_entry_dirty(fspace) < 0) + if(H5AC_mark_pinned_or_protected_entry_dirty(fspace) < 0) HGOTO_ERROR(H5E_FSPACE, H5E_CANTMARKDIRTY, FAIL, "unable to mark free space header as dirty") done: @@ -592,7 +592,7 @@ HDfprintf(stderr, "%s: fspace->tot_space = %Hu\n", FUNC, fspace->tot_space); fspace->tot_space -= sect->size; /* Mark free space sections as changed */ - if(H5AC2_mark_pinned_or_protected_entry_dirty(fspace->sinfo) < 0) + if(H5AC_mark_pinned_or_protected_entry_dirty(fspace->sinfo) < 0) HGOTO_ERROR(H5E_FSPACE, H5E_CANTMARKDIRTY, FAIL, "unable to mark free space sections as dirty") done: @@ -1103,7 +1103,7 @@ HDfprintf(stderr, "%s: fspace->hdr->tot_space = %Hu\n", FUNC, fspace->tot_space) /* Mark free space sections as changed */ /* (if adding sections while deserializing sections, don't set the flag) */ if(!(flags & H5FS_ADD_DESERIALIZING)) { - if(H5AC2_mark_pinned_or_protected_entry_dirty(fspace->sinfo) < 0) + if(H5AC_mark_pinned_or_protected_entry_dirty(fspace->sinfo) < 0) HGOTO_ERROR(H5E_FSPACE, H5E_CANTMARKDIRTY, FAIL, "unable to mark free space sections as dirty") } /* end if */ @@ -1372,23 +1372,23 @@ HDfprintf(stderr, "%s: old_addr = %a, fspace->sect_addr = %a\n", FUNC, old_addr, /* Resize pinned section info in the cache, if its changed size */ if(old_alloc_sect_size != fspace->alloc_sect_size) { - if(H5AC2_resize_pinned_entry(fspace->sinfo, (size_t)fspace->alloc_sect_size) < 0) + if(H5AC_resize_pinned_entry(fspace->sinfo, (size_t)fspace->alloc_sect_size) < 0) HGOTO_ERROR(H5E_FSPACE, H5E_CANTRESIZE, FAIL, "unable to resize free space section info") } /* end if */ /* Move object in cache, if it actually was relocated */ if(H5F_addr_ne(fspace->sect_addr, old_addr)) { - if(H5AC2_rename(f, H5AC2_FSPACE_SINFO, old_addr, fspace->sect_addr) < 0) + if(H5AC_rename(f, H5AC_FSPACE_SINFO, old_addr, fspace->sect_addr) < 0) HGOTO_ERROR(H5E_FSPACE, H5E_CANTRENAME, FAIL, "unable to move free space section info") } /* end if */ else { /* Mark free space section as dirty */ - if(H5AC2_mark_pinned_or_protected_entry_dirty(fspace->sinfo) < 0) + if(H5AC_mark_pinned_or_protected_entry_dirty(fspace->sinfo) < 0) HGOTO_ERROR(H5E_FSPACE, H5E_CANTMARKDIRTY, FAIL, "unable to mark free space section info as dirty") } /* end else */ /* Mark free space header as dirty */ - if(H5AC2_mark_pinned_or_protected_entry_dirty(fspace) < 0) + if(H5AC_mark_pinned_or_protected_entry_dirty(fspace) < 0) HGOTO_ERROR(H5E_FSPACE, H5E_CANTMARKDIRTY, FAIL, "unable to mark free space header as dirty") } /* end if */ else { @@ -1437,23 +1437,23 @@ HDfprintf(stderr, "%s: Allocating space for smaller serialized sections, new_siz /* Resize pinned section info in the cache, if its changed size */ if(old_alloc_sect_size != fspace->alloc_sect_size) { - if(H5AC2_resize_pinned_entry(fspace->sinfo, (size_t)fspace->alloc_sect_size) < 0) + if(H5AC_resize_pinned_entry(fspace->sinfo, (size_t)fspace->alloc_sect_size) < 0) HGOTO_ERROR(H5E_FSPACE, H5E_CANTRESIZE, FAIL, "unable to resize free space section info") } /* end if */ /* Move object in cache, if it actually was relocated */ if(H5F_addr_ne(fspace->sect_addr, old_addr)) { - if(H5AC2_rename(f, H5AC2_FSPACE_SINFO, old_addr, fspace->sect_addr) < 0) + if(H5AC_rename(f, H5AC_FSPACE_SINFO, old_addr, fspace->sect_addr) < 0) HGOTO_ERROR(H5E_FSPACE, H5E_CANTRENAME, FAIL, "unable to move free space section info") } /* end if */ else { /* Mark free space section as dirty */ - if(H5AC2_mark_pinned_or_protected_entry_dirty(fspace->sinfo) < 0) + if(H5AC_mark_pinned_or_protected_entry_dirty(fspace->sinfo) < 0) HGOTO_ERROR(H5E_FSPACE, H5E_CANTMARKDIRTY, FAIL, "unable to mark free space section info as dirty") } /* end else */ /* Mark free space header as dirty */ - if(H5AC2_mark_pinned_or_protected_entry_dirty(fspace) < 0) + if(H5AC_mark_pinned_or_protected_entry_dirty(fspace) < 0) HGOTO_ERROR(H5E_FSPACE, H5E_CANTMARKDIRTY, FAIL, "unable to mark free space header as dirty") } /* end if */ } /* end else */ @@ -1792,7 +1792,7 @@ HDfprintf(stderr, "%s: removing object from merge list, sect->type = %u\n", FUNC HGOTO_ERROR(H5E_FSPACE, H5E_CANTCOMPUTE, FAIL, "can't adjust free space section size on disk") /* Mark free space sections as dirty */ - if(H5AC2_mark_pinned_or_protected_entry_dirty(fspace->sinfo) < 0) + if(H5AC_mark_pinned_or_protected_entry_dirty(fspace->sinfo) < 0) HGOTO_ERROR(H5E_FSPACE, H5E_CANTMARKDIRTY, FAIL, "unable to mark free space sections as dirty") done: diff --git a/src/H5Fmount.c b/src/H5Fmount.c index d666556..5f59a57 100644 --- a/src/H5Fmount.c +++ b/src/H5Fmount.c @@ -21,7 +21,7 @@ /* Packages needed by this file... */ #include "H5private.h" /* Generic Functions */ -#include "H5AC2private.h" /* Metadata cache */ +#include "H5ACprivate.h" /* Metadata cache */ #include "H5Eprivate.h" /* Error handling */ #include "H5Fpkg.h" /* File access */ #include "H5Gprivate.h" /* Groups */ @@ -471,7 +471,7 @@ H5Fmount(hid_t loc_id, const char *name, hid_t child_id, hid_t plist_id) * Also we must work out how we are going to deal with journaling * in such cases. */ - FUNC_ENTER_API_META(H5Fmount, loc_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Fmount, loc_id, H5AC_dxpl_id, FAIL) H5TRACE4("e", "i*sii", loc_id, name, child_id, plist_id); /* Check arguments */ @@ -488,7 +488,7 @@ H5Fmount(hid_t loc_id, const char *name, hid_t child_id, hid_t plist_id) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not property list") /* Do the mount */ - if(H5F_mount(&loc, name, child, plist_id, H5AC2_dxpl_id) < 0) + if(H5F_mount(&loc, name, child, plist_id, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_FILE, H5E_MOUNT, FAIL, "unable to mount file") done: @@ -526,7 +526,7 @@ H5Funmount(hid_t loc_id, const char *name) * Also, must decide how we are going to deal with journaling * in such cases. */ - FUNC_ENTER_API_META(H5Funmount, loc_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Funmount, loc_id, H5AC_dxpl_id, FAIL) H5TRACE2("e", "i*s", loc_id, name); /* Check args */ @@ -536,7 +536,7 @@ H5Funmount(hid_t loc_id, const char *name) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name") /* Unmount */ - if (H5F_unmount(&loc, name, H5AC2_dxpl_id) < 0) + if (H5F_unmount(&loc, name, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_FILE, H5E_MOUNT, FAIL, "unable to unmount file") done: diff --git a/src/H5Fpkg.h b/src/H5Fpkg.h index 6f38a65..dc1efd8 100644 --- a/src/H5Fpkg.h +++ b/src/H5Fpkg.h @@ -37,7 +37,7 @@ /* Other private headers needed by this file */ #include "H5private.h" /* Generic Functions */ #include "H5AC1private.h" /* Metadata cache */ -#include "H5AC2private.h" /* Metadata cache */ +#include "H5ACprivate.h" /* Metadata cache */ #include "H5FLprivate.h" /* Free Lists */ #include "H5FOprivate.h" /* File objects */ #include "H5Gprivate.h" /* Groups */ @@ -109,14 +109,14 @@ typedef struct H5F_file_t { haddr_t driver_addr; /* File driver information block address*/ haddr_t maxaddr; /* Maximum address for file */ - H5AC1_t *cache; /* The object cache */ - H5AC2_t *cache2; /* test cache */ + H5AC1_t *cache1; /* The object cache */ + H5AC_t *cache; /* The object cache */ H5AC1_cache_config_t mdc_initCacheCfg; /* initial configuration for the */ /* metadata cache. This structure is */ /* fixed at creation time and should */ /* not change thereafter. */ - H5AC2_jnl_config_t + H5AC_jnl_config_t initJnlCfg; /* Initial journaling configuration for */ /* the file. At least in its initial */ /* incarnation, this structure contains */ @@ -141,7 +141,7 @@ typedef struct H5F_file_t { hbool_t mdc_jnl_enabled; /* TRUE iff journaling is in progress */ int32_t mdc_jnl_magic; /* journal file magic -- if defined */ size_t mdc_jnl_file_name_len; /* journal file name length */ - char mdc_jnl_file_name[H5C2__MAX_JOURNAL_FILE_NAME_LEN + 1]; + char mdc_jnl_file_name[H5C__MAX_JOURNAL_FILE_NAME_LEN + 1]; /* journal file name -- if defined */ } H5F_file_t; diff --git a/src/H5Fpublic.h b/src/H5Fpublic.h index afcb200..2826036 100644 --- a/src/H5Fpublic.h +++ b/src/H5Fpublic.h @@ -22,7 +22,7 @@ /* Public header files needed by this file */ #include "H5public.h" #include "H5AC1public.h" -#include "H5AC2public.h" +#include "H5ACpublic.h" #include "H5C1public.h" #include "H5Ipublic.h" @@ -138,9 +138,9 @@ H5_DLL herr_t H5Funmount(hid_t loc, const char *name); H5_DLL hssize_t H5Fget_freespace(hid_t file_id); H5_DLL herr_t H5Fget_filesize(hid_t file_id, hsize_t *size); H5_DLL herr_t H5Fget_jnl_config(hid_t file_id, - H5AC2_jnl_config_t *config_ptr); + H5AC_jnl_config_t *config_ptr); H5_DLL herr_t H5Fset_jnl_config(hid_t file_id, - const H5AC2_jnl_config_t *config_ptr); + const H5AC_jnl_config_t *config_ptr); H5_DLL herr_t H5Fget_mdc_config(hid_t file_id, H5AC1_cache_config_t * config_ptr); H5_DLL herr_t H5Fset_mdc_config(hid_t file_id, diff --git a/src/H5Fsuper.c b/src/H5Fsuper.c index 37a34a3..134aedd 100644 --- a/src/H5Fsuper.c +++ b/src/H5Fsuper.c @@ -716,7 +716,7 @@ H5F_super_read(H5F_t *f, hid_t dxpl_id, H5G_loc_t *root_loc) /* Sanity check value */ if(shared->mdc_jnl_file_name_len <= 0) HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "journaling enabled, but journal file path empty?!?") - if(shared->mdc_jnl_file_name_len > H5C2__MAX_JOURNAL_FILE_NAME_LEN) + if(shared->mdc_jnl_file_name_len > H5C__MAX_JOURNAL_FILE_NAME_LEN) HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "journal file path too long") HDstrncpy(shared->mdc_jnl_file_name, @@ -1211,7 +1211,7 @@ H5F_super_write_mdj_msg(H5F_t *f, hid_t dxpl_id) /* Sanity check journal file name */ if(f->shared->mdc_jnl_file_name_len == 0) HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "journaling enabled, but journal file path empty?!?") - if(f->shared->mdc_jnl_file_name_len > H5C2__MAX_JOURNAL_FILE_NAME_LEN) + if(f->shared->mdc_jnl_file_name_len > H5C__MAX_JOURNAL_FILE_NAME_LEN) HGOTO_ERROR(H5E_FILE, H5E_CANTOPENFILE, FAIL, "journal file path too long?!?") /* Copy journal file name into message to store */ diff --git a/src/H5Ftest.c b/src/H5Ftest.c index 3344d78..67ea5f7 100644 --- a/src/H5Ftest.c +++ b/src/H5Ftest.c @@ -106,7 +106,7 @@ H5F_get_sohm_mesg_count_test(hid_t file_id, unsigned type_id, HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file") /* Retrieve count for message type */ - if(H5SM_get_mesg_count_test(file, H5AC2_ind_dxpl_id, type_id, mesg_count) < 0) + if(H5SM_get_mesg_count_test(file, H5AC_ind_dxpl_id, type_id, mesg_count) < 0) HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "can't retrieve shared message count") done: diff --git a/src/H5G.c b/src/H5G.c index 00fd378..9fb8092 100644 --- a/src/H5G.c +++ b/src/H5G.c @@ -83,7 +83,7 @@ /* Packages needed by this file... */ #include "H5private.h" /* Generic Functions */ -#include "H5AC2private.h" /* Metadata cache */ +#include "H5ACprivate.h" /* Metadata cache */ #include "H5Eprivate.h" /* Error handling */ #include "H5Fpkg.h" /* File access */ #include "H5Gpkg.h" /* Groups */ @@ -177,7 +177,7 @@ H5Gcreate2(hid_t loc_id, const char *name, hid_t lcpl_id, hid_t gcpl_id, H5G_t *grp = NULL; /* New group created */ hid_t ret_value; /* Return value */ - FUNC_ENTER_API_META(H5Gcreate2, loc_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Gcreate2, loc_id, H5AC_dxpl_id, FAIL) H5TRACE5("i", "i*siii", loc_id, name, lcpl_id, gcpl_id, gapl_id); /* Check arguments */ @@ -208,7 +208,7 @@ H5Gcreate2(hid_t loc_id, const char *name, hid_t lcpl_id, hid_t gcpl_id, HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not group access property list") /* Create the new group & get its ID */ - if(NULL == (grp = H5G_create_named(&loc, name, lcpl_id, gcpl_id, gapl_id, H5AC2_dxpl_id))) + if(NULL == (grp = H5G_create_named(&loc, name, lcpl_id, gcpl_id, gapl_id, H5AC_dxpl_id))) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to create group") if((ret_value = H5I_register(H5I_GROUP, grp)) < 0) HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register group") @@ -317,7 +317,7 @@ H5Gcreate_anon(hid_t loc_id, hid_t gcpl_id, hid_t gapl_id) H5G_t *grp = NULL; hid_t ret_value; - FUNC_ENTER_API_META(H5Gcreate_anon, loc_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Gcreate_anon, loc_id, H5AC_dxpl_id, FAIL) H5TRACE3("i", "iii", loc_id, gcpl_id, gapl_id); /* Check arguments */ @@ -339,7 +339,7 @@ H5Gcreate_anon(hid_t loc_id, hid_t gcpl_id, hid_t gapl_id) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not group access property list") /* Create the new group & get its ID */ - if(NULL == (grp = H5G_create(loc.oloc->file, gcpl_id, H5AC2_dxpl_id))) + if(NULL == (grp = H5G_create(loc.oloc->file, gcpl_id, H5AC_dxpl_id))) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to create group") if((ret_value = H5I_register(H5I_GROUP, grp)) < 0) HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register group") @@ -394,7 +394,7 @@ H5Gopen2(hid_t loc_id, const char *name, hid_t gapl_id) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not group access property list") /* Open the group */ - if((grp = H5G_open_name(&loc, name, gapl_id, H5AC2_dxpl_id)) == NULL) + if((grp = H5G_open_name(&loc, name, gapl_id, H5AC_dxpl_id)) == NULL) HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open group") /* Register an ID for the group */ @@ -454,17 +454,17 @@ H5Gget_create_plist(hid_t group_id) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list") /* Retrieve any object creation properties */ - if(H5O_get_create_plist(&grp->oloc, H5AC2_ind_dxpl_id, new_plist) < 0) + if(H5O_get_create_plist(&grp->oloc, H5AC_ind_dxpl_id, new_plist) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't get object creation info") /* Check for the group having a group info message */ - if((ginfo_exists = H5O_msg_exists(&(grp->oloc), H5O_GINFO_ID, H5AC2_ind_dxpl_id)) < 0) + if((ginfo_exists = H5O_msg_exists(&(grp->oloc), H5O_GINFO_ID, H5AC_ind_dxpl_id)) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header") if(ginfo_exists) { H5O_ginfo_t ginfo; /* Group info message */ /* Read the group info */ - if(NULL == H5O_msg_read(&(grp->oloc), H5O_GINFO_ID, &ginfo, H5AC2_ind_dxpl_id)) + if(NULL == H5O_msg_read(&(grp->oloc), H5O_GINFO_ID, &ginfo, H5AC_ind_dxpl_id)) HGOTO_ERROR(H5E_SYM, H5E_BADMESG, FAIL, "can't get group info") /* Set the group info for the property list */ @@ -473,13 +473,13 @@ H5Gget_create_plist(hid_t group_id) } /* end if */ /* Check for the group having a link info message */ - if((linfo_exists = H5O_msg_exists(&(grp->oloc), H5O_LINFO_ID, H5AC2_ind_dxpl_id)) < 0) + if((linfo_exists = H5O_msg_exists(&(grp->oloc), H5O_LINFO_ID, H5AC_ind_dxpl_id)) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header") if(linfo_exists) { H5O_linfo_t linfo; /* Link info message */ /* Read the link info */ - if(NULL == H5G_obj_get_linfo(&(grp->oloc), &linfo, H5AC2_ind_dxpl_id)) + if(NULL == H5G_obj_get_linfo(&(grp->oloc), &linfo, H5AC_ind_dxpl_id)) HGOTO_ERROR(H5E_SYM, H5E_BADMESG, FAIL, "can't get link info") /* Set the link info for the property list */ @@ -535,7 +535,7 @@ H5Gget_info(hid_t grp_id, H5G_info_t *grp_info) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location") /* Retrieve the group's information */ - if(H5G_obj_info(loc.oloc, grp_info/*out*/, H5AC2_ind_dxpl_id) < 0) + if(H5G_obj_info(loc.oloc, grp_info/*out*/, H5AC_ind_dxpl_id) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't retrieve group info") done: @@ -589,12 +589,12 @@ H5Gget_info_by_name(hid_t loc_id, const char *name, H5G_info_t *grp_info, H5G_loc_reset(&grp_loc); /* Find the group object */ - if(H5G_loc_find(&loc, name, &grp_loc/*out*/, lapl_id, H5AC2_ind_dxpl_id) < 0) + if(H5G_loc_find(&loc, name, &grp_loc/*out*/, lapl_id, H5AC_ind_dxpl_id) < 0) HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "group not found") loc_found = TRUE; /* Retrieve the group's information */ - if(H5G_obj_info(grp_loc.oloc, grp_info/*out*/, H5AC2_ind_dxpl_id) < 0) + if(H5G_obj_info(grp_loc.oloc, grp_info/*out*/, H5AC_ind_dxpl_id) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't retrieve group info") done: @@ -657,12 +657,12 @@ H5Gget_info_by_idx(hid_t loc_id, const char *group_name, H5_index_t idx_type, H5G_loc_reset(&grp_loc); /* Find the object's location, according to the order in the index */ - if(H5G_loc_find_by_idx(&loc, group_name, idx_type, order, n, &grp_loc/*out*/, lapl_id, H5AC2_ind_dxpl_id) < 0) + if(H5G_loc_find_by_idx(&loc, group_name, idx_type, order, n, &grp_loc/*out*/, lapl_id, H5AC_ind_dxpl_id) < 0) HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "group not found") loc_found = TRUE; /* Retrieve the group's information */ - if(H5G_obj_info(grp_loc.oloc, grp_info/*out*/, H5AC2_ind_dxpl_id) < 0) + if(H5G_obj_info(grp_loc.oloc, grp_info/*out*/, H5AC_ind_dxpl_id) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't retrieve group info") done: @@ -693,7 +693,7 @@ H5Gclose(hid_t group_id) herr_t ret_value = SUCCEED; /* Return value */ /* Can this change metadata? If not, no need for a transaction. */ - FUNC_ENTER_API_META(H5Gclose, group_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Gclose, group_id, H5AC_dxpl_id, FAIL) H5TRACE1("e", "i", group_id); /* Check args */ @@ -1270,7 +1270,7 @@ H5G_close(H5G_t *grp) /* Remove the group from the list of opened objects in the file */ if(H5FO_top_decr(grp->oloc.file, grp->oloc.addr) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "can't decrement count for object") - if(H5FO_delete(grp->oloc.file, H5AC2_dxpl_id, grp->oloc.addr) < 0) + if(H5FO_delete(grp->oloc.file, H5AC_dxpl_id, grp->oloc.addr) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTRELEASE, FAIL, "can't remove group from list of open objects") if(H5O_close(&(grp->oloc)) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to close") diff --git a/src/H5Gdeprec.c b/src/H5Gdeprec.c index 24dc549..7f6f426 100644 --- a/src/H5Gdeprec.c +++ b/src/H5Gdeprec.c @@ -41,7 +41,7 @@ /* Headers */ /***********/ #include "H5private.h" /* Generic Functions */ -#include "H5AC2private.h" /* Metadata cache */ +#include "H5ACprivate.h" /* Metadata cache */ #include "H5Eprivate.h" /* Error handling */ #include "H5Gpkg.h" /* Groups */ #include "H5Iprivate.h" /* IDs */ @@ -204,7 +204,7 @@ H5Gcreate1(hid_t loc_id, const char *name, size_t size_hint) hid_t tmp_gcpl = (-1); /* Temporary group creation property list */ hid_t ret_value; /* Return value */ - FUNC_ENTER_API_META(H5Gcreate1, loc_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Gcreate1, loc_id, H5AC_dxpl_id, FAIL) H5TRACE3("i", "i*sz", loc_id, name, size_hint); /* Check arguments */ @@ -244,7 +244,7 @@ H5Gcreate1(hid_t loc_id, const char *name, size_t size_hint) /* Create the new group & get its ID */ if(NULL == (grp = H5G_create_named(&loc, name, H5P_LINK_CREATE_DEFAULT, - tmp_gcpl, H5P_GROUP_ACCESS_DEFAULT, H5AC2_dxpl_id))) + tmp_gcpl, H5P_GROUP_ACCESS_DEFAULT, H5AC_dxpl_id))) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to create group") if((ret_value = H5I_register(H5I_GROUP, grp)) < 0) HGOTO_ERROR(H5E_ATOM, H5E_CANTREGISTER, FAIL, "unable to register group") @@ -296,7 +296,7 @@ H5Gopen1(hid_t loc_id, const char *name) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name") /* Open the group */ - if((grp = H5G_open_name(&loc, name, H5P_DEFAULT, H5AC2_dxpl_id)) == NULL) + if((grp = H5G_open_name(&loc, name, H5P_DEFAULT, H5AC_dxpl_id)) == NULL) HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open group") /* Register an atom for the group */ @@ -326,7 +326,7 @@ H5Glink(hid_t cur_loc_id, H5G_link_t type, const char *cur_name, const char *new { herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_API_META(H5Glink, cur_loc_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Glink, cur_loc_id, H5AC_dxpl_id, FAIL) H5TRACE4("e", "iLl*s*s", cur_loc_id, type, cur_name, new_name); /* Check arguments */ @@ -347,7 +347,7 @@ H5Glink(hid_t cur_loc_id, H5G_link_t type, const char *cur_name, const char *new HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location") /* Create the link */ - if(H5L_create_soft(cur_name, &cur_loc, new_name, H5P_DEFAULT, H5P_DEFAULT, H5AC2_dxpl_id) < 0) + if(H5L_create_soft(cur_name, &cur_loc, new_name, H5P_DEFAULT, H5P_DEFAULT, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "unable to create link") } /* end else if */ else @@ -372,7 +372,7 @@ H5Glink2(hid_t cur_loc_id, const char *cur_name, H5G_link_t type, { herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_API_META(H5Glink2, cur_loc_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Glink2, cur_loc_id, H5AC_dxpl_id, FAIL) H5TRACE5("e", "i*sLli*s", cur_loc_id, cur_name, type, new_loc_id, new_name); /* Check arguments */ @@ -398,7 +398,7 @@ H5Glink2(hid_t cur_loc_id, const char *cur_name, H5G_link_t type, HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location") /* Create the link */ - if(H5L_create_soft(cur_name, &new_loc, new_name, H5P_DEFAULT, H5P_DEFAULT, H5AC2_dxpl_id) < 0) + if(H5L_create_soft(cur_name, &new_loc, new_name, H5P_DEFAULT, H5P_DEFAULT, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "unable to create link") } /* end else if */ else @@ -455,7 +455,7 @@ H5G_link_hard(hid_t cur_loc_id, const char *cur_name, hid_t new_loc_id, /* Create the link */ if(H5L_create_hard(cur_loc_p, cur_name, new_loc_p, new_name, - H5P_DEFAULT, H5P_DEFAULT, H5AC2_dxpl_id) < 0) + H5P_DEFAULT, H5P_DEFAULT, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "unable to create link") done: @@ -475,7 +475,7 @@ H5Gmove(hid_t src_loc_id, const char *src_name, const char *dst_name) { herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_API_META(H5Gmove, src_loc_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Gmove, src_loc_id, H5AC_dxpl_id, FAIL) H5TRACE3("e", "i*s*s", src_loc_id, src_name, dst_name); /* Call common routine to move the link */ @@ -500,7 +500,7 @@ H5Gmove2(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id, { herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_API_META(H5Gmove2, dst_loc_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Gmove2, dst_loc_id, H5AC_dxpl_id, FAIL) H5TRACE4("e", "i*si*s", src_loc_id, src_name, dst_loc_id, dst_name); /* Call common routine to move the link */ @@ -561,7 +561,7 @@ H5G_move(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id, /* Move the link */ if(H5L_move(src_loc_p, src_name, dst_loc_p, dst_name, FALSE, H5P_DEFAULT, - H5P_DEFAULT, H5AC2_dxpl_id) < 0) + H5P_DEFAULT, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_LINK, H5E_CANTMOVE, FAIL, "unable to move link") done: @@ -582,7 +582,7 @@ H5Gunlink(hid_t loc_id, const char *name) H5G_loc_t loc; /* Group's location */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_API_META(H5Gunlink, loc_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Gunlink, loc_id, H5AC_dxpl_id, FAIL) H5TRACE2("e", "i*s", loc_id, name); /* Check arguments */ @@ -592,7 +592,7 @@ H5Gunlink(hid_t loc_id, const char *name) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name") /* Call H5L routine... */ - if(H5L_delete(&loc, name, H5P_DEFAULT, H5AC2_dxpl_id) < 0) + if(H5L_delete(&loc, name, H5P_DEFAULT, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_LINK, H5E_CANTDELETE, FAIL, "couldn't delete link") done: @@ -624,7 +624,7 @@ H5Gget_linkval(hid_t loc_id, const char *name, size_t size, char *buf/*out*/) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name specified") /* Call the new link routine which provides this capability */ - if(H5L_get_val(&loc, name, buf, size, H5P_DEFAULT, H5AC2_ind_dxpl_id) < 0) + if(H5L_get_val(&loc, name, buf, size, H5P_DEFAULT, H5AC_ind_dxpl_id) < 0) HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "couldn't get link info") done: @@ -655,7 +655,7 @@ H5Gset_comment(hid_t loc_id, const char *name, const char *comment) H5G_loc_t loc; herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_API_META(H5Gset_comment, loc_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Gset_comment, loc_id, H5AC_dxpl_id, FAIL) H5TRACE3("e", "i*s*s", loc_id, name, comment); if(H5G_loc(loc_id, &loc) < 0) @@ -663,7 +663,7 @@ H5Gset_comment(hid_t loc_id, const char *name, const char *comment) if(!name || !*name) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name specified") - if(H5G_loc_set_comment(&loc, name, comment, H5P_DEFAULT, H5AC2_dxpl_id) < 0) + if(H5G_loc_set_comment(&loc, name, comment, H5P_DEFAULT, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to set comment value") done: @@ -710,7 +710,7 @@ H5Gget_comment(hid_t loc_id, const char *name, size_t bufsize, char *buf) if(bufsize > 0 && !buf) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no buffer specified") - if((ret_value = (int)H5G_loc_get_comment(&loc, name, buf, bufsize, H5P_DEFAULT, H5AC2_ind_dxpl_id)) < 0) + if((ret_value = (int)H5G_loc_get_comment(&loc, name, buf, bufsize, H5P_DEFAULT, H5AC_ind_dxpl_id)) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to get comment value") done: @@ -774,7 +774,7 @@ H5Giterate(hid_t loc_id, const char *name, int *idx_p, H5G_iterate_t op, lnk_op.op_func.op_old = op; /* Call private function. */ - if((ret_value = H5G_iterate(loc_id, name, H5_INDEX_NAME, H5_ITER_INC, idx, &last_obj, &lnk_op, op_data, H5P_DEFAULT, H5AC2_ind_dxpl_id)) < 0) + if((ret_value = H5G_iterate(loc_id, name, H5_INDEX_NAME, H5_ITER_INC, idx, &last_obj, &lnk_op, op_data, H5P_DEFAULT, H5AC_ind_dxpl_id)) < 0) HGOTO_ERROR(H5E_SYM, H5E_BADITER, FAIL, "group iteration failed") /* Set the index we stopped at */ @@ -816,7 +816,7 @@ H5Gget_num_objs(hid_t loc_id, hsize_t *num_objs) /* Check args */ if(H5G_loc(loc_id, &loc) < 0) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location ID") - if(H5O_obj_type(loc.oloc, &obj_type, H5AC2_ind_dxpl_id) < 0) + if(H5O_obj_type(loc.oloc, &obj_type, H5AC_ind_dxpl_id) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't get object type") if(obj_type != H5O_TYPE_GROUP) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group") @@ -824,7 +824,7 @@ H5Gget_num_objs(hid_t loc_id, hsize_t *num_objs) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "bad pointer to # of objects") /* Retrieve information about the group */ - if(H5G_obj_info(loc.oloc, &grp_info, H5AC2_ind_dxpl_id) < 0) + if(H5G_obj_info(loc.oloc, &grp_info, H5AC_ind_dxpl_id) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTCOUNT, FAIL, "can't determine") /* Set the number of objects [sic: links] in the group */ @@ -869,7 +869,7 @@ H5Gget_objinfo(hid_t loc_id, const char *name, hbool_t follow_link, HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name specified") /* Get info */ - if(H5G_get_objinfo(&loc, name, follow_link, statbuf, H5AC2_ind_dxpl_id) < 0) + if(H5G_get_objinfo(&loc, name, follow_link, statbuf, H5AC_ind_dxpl_id) < 0) HGOTO_ERROR(H5E_ARGS, H5E_CANTINIT, FAIL, "cannot stat object") done: @@ -1062,13 +1062,13 @@ H5Gget_objname_by_idx(hid_t loc_id, hsize_t idx, char *name, size_t size) /* Check args */ if(H5G_loc(loc_id, &loc) < 0) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location ID") - if(H5O_obj_type(loc.oloc, &obj_type, H5AC2_ind_dxpl_id) < 0) + if(H5O_obj_type(loc.oloc, &obj_type, H5AC_ind_dxpl_id) < 0) HGOTO_ERROR(H5E_DATASET, H5E_CANTGET, FAIL, "can't get object type") if(obj_type != H5O_TYPE_GROUP) HGOTO_ERROR(H5E_DATASET, H5E_BADTYPE, FAIL, "not a group") /* Call internal function */ - if((ret_value = H5G_obj_get_name_by_idx(loc.oloc, H5_INDEX_NAME, H5_ITER_INC, idx, name, size, H5AC2_ind_dxpl_id)) < 0) + if((ret_value = H5G_obj_get_name_by_idx(loc.oloc, H5_INDEX_NAME, H5_ITER_INC, idx, name, size, H5AC_ind_dxpl_id)) < 0) HGOTO_ERROR(H5E_SYM, H5E_BADTYPE, FAIL, "can't get object name") done: @@ -1104,13 +1104,13 @@ H5Gget_objtype_by_idx(hid_t loc_id, hsize_t idx) /* Check args */ if(H5G_loc(loc_id, &loc) < 0) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5G_UNKNOWN, "not a location ID") - if(H5O_obj_type(loc.oloc, &obj_type, H5AC2_ind_dxpl_id) < 0) + if(H5O_obj_type(loc.oloc, &obj_type, H5AC_ind_dxpl_id) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTGET, H5G_UNKNOWN, "can't get object type") if(obj_type != H5O_TYPE_GROUP) HGOTO_ERROR(H5E_SYM, H5E_BADTYPE, H5G_UNKNOWN, "not a group") /* Call internal function*/ - if((ret_value = H5G_obj_get_type_by_idx(loc.oloc, idx, H5AC2_ind_dxpl_id)) == H5G_UNKNOWN) + if((ret_value = H5G_obj_get_type_by_idx(loc.oloc, idx, H5AC_ind_dxpl_id)) == H5G_UNKNOWN) HGOTO_ERROR(H5E_SYM, H5E_BADTYPE, H5G_UNKNOWN, "can't get object type") done: diff --git a/src/H5Gnode.c b/src/H5Gnode.c index b1426b7..af94a77 100644 --- a/src/H5Gnode.c +++ b/src/H5Gnode.c @@ -32,7 +32,7 @@ /* Packages needed by this file... */ #include "H5private.h" /* Generic Functions */ -#include "H5AC2private.h" /* Metadata cache #2 */ +#include "H5ACprivate.h" /* Metadata cache */ #include "H5Eprivate.h" /* Error handling */ #include "H5Fpkg.h" /* File access */ #include "H5FLprivate.h" /* Free Lists */ @@ -59,7 +59,7 @@ typedef struct H5G_node_key_t { * table or group. */ typedef struct H5G_node_t { - H5AC2_info_t cache_info; /* Information for H5AC cache functions, _must_ be */ + H5AC_info_t cache_info; /* Information for H5AC cache functions, _must_ be */ /* first field in structure */ unsigned nsyms; /*number of symbols */ H5G_entry_t *entry; /*array of symbol table entries */ @@ -105,9 +105,9 @@ static herr_t H5G_node_encode_key(const H5B_shared_t *shared, uint8_t *raw, cons static herr_t H5G_node_debug_key(FILE *stream, int indent, int fwidth, const void *key, const void *udata); -/* H5G symbol table node inherits cache-like properties from H5AC2 */ -const H5AC2_class_t H5AC2_SNODE[1] = {{ - H5AC2_SNODE_ID, +/* H5G symbol table node inherits cache-like properties from H5AC */ +const H5AC_class_t H5AC_SNODE[1] = {{ + H5AC_SNODE_ID, "symbol table node", H5FD_MEM_BTREE, H5G_node_deserialize, @@ -580,7 +580,7 @@ H5G_node_create(H5F_t *f, hid_t dxpl_id, H5B_ins_t UNUSED op, void *_lt_key, if(NULL == ( sym->entry = H5FL_SEQ_CALLOC(H5G_entry_t, (size_t)(2 * H5F_SYM_LEAF_K(f))))) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed") H5_CHECK_OVERFLOW(size, /* vartype */hsize_t, /* casttype */size_t); - if(H5AC2_set(f, dxpl_id, H5AC2_SNODE, *addr_p, (size_t)size, sym, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_set(f, dxpl_id, H5AC_SNODE, *addr_p, (size_t)size, sym, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to cache symbol table leaf node") /* * The left and right symbols in an empty tree are both the @@ -774,7 +774,7 @@ H5G_node_found(H5F_t *f, hid_t dxpl_id, haddr_t addr, const void UNUSED *_lt_key /* * Load the symbol table node for exclusive access. */ - if(NULL == (sn = H5AC2_protect(f, dxpl_id, H5AC2_SNODE, addr, H5G_node_size_real(f), (void *)f, H5AC2_READ))) + if(NULL == (sn = H5AC_protect(f, dxpl_id, H5AC_SNODE, addr, H5G_node_size_real(f), (void *)f, H5AC_READ))) HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, FAIL, "unable to protect symbol table node") /* Get base address of heap */ @@ -804,7 +804,7 @@ H5G_node_found(H5F_t *f, hid_t dxpl_id, haddr_t addr, const void UNUSED *_lt_key HGOTO_ERROR(H5E_SYM, H5E_BADITER, FAIL, "iterator callback failed") done: - if(sn && H5AC2_unprotect(f, dxpl_id, H5AC2_SNODE, addr, (size_t)0, sn, H5AC2__NO_FLAGS_SET) < 0) + if(sn && H5AC_unprotect(f, dxpl_id, H5AC_SNODE, addr, (size_t)0, sn, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to release symbol table node") FUNC_LEAVE_NOAPI(ret_value) @@ -856,7 +856,7 @@ H5G_node_insert(H5F_t *f, hid_t dxpl_id, haddr_t addr, H5G_node_key_t *rt_key = (H5G_node_key_t *) _rt_key; H5G_bt_ins_t *udata = (H5G_bt_ins_t *) _udata; H5G_node_t *sn = NULL, *snrt = NULL; - unsigned sn_flags = H5AC2__NO_FLAGS_SET, snrt_flags = H5AC2__NO_FLAGS_SET; + unsigned sn_flags = H5AC__NO_FLAGS_SET, snrt_flags = H5AC__NO_FLAGS_SET; const char *s; const char *base; /* Base of heap */ unsigned lt = 0, rt; /* Binary search cntrs */ @@ -880,7 +880,7 @@ H5G_node_insert(H5F_t *f, hid_t dxpl_id, haddr_t addr, /* * Load the symbol node. */ - if(NULL == (sn = H5AC2_protect(f, dxpl_id, H5AC2_SNODE, addr, H5G_node_size_real(f), (void *)f, H5AC2_WRITE))) + if(NULL == (sn = H5AC_protect(f, dxpl_id, H5AC_SNODE, addr, H5G_node_size_real(f), (void *)f, H5AC_WRITE))) HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, H5B_INS_ERROR, "unable to protect symbol table node") /* Get base address of heap */ @@ -923,19 +923,19 @@ H5G_node_insert(H5F_t *f, hid_t dxpl_id, haddr_t addr, if(H5G_node_create(f, dxpl_id, H5B_INS_FIRST, NULL, NULL, NULL, new_node_p/*out*/) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, H5B_INS_ERROR, "unable to split symbol table node") - if(NULL == (snrt = H5AC2_protect(f, dxpl_id, H5AC2_SNODE, *new_node_p, H5G_node_size_real(f), (void *)f, H5AC2_WRITE))) + if(NULL == (snrt = H5AC_protect(f, dxpl_id, H5AC_SNODE, *new_node_p, H5G_node_size_real(f), (void *)f, H5AC_WRITE))) HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, H5B_INS_ERROR, "unable to split symbol table node") HDmemcpy(snrt->entry, sn->entry + H5F_SYM_LEAF_K(f), H5F_SYM_LEAF_K(f) * sizeof(H5G_entry_t)); snrt->nsyms = H5F_SYM_LEAF_K(f); - snrt_flags |= H5AC2__DIRTIED_FLAG; + snrt_flags |= H5AC__DIRTIED_FLAG; /* The left node */ HDmemset(sn->entry + H5F_SYM_LEAF_K(f), 0, H5F_SYM_LEAF_K(f) * sizeof(H5G_entry_t)); sn->nsyms = H5F_SYM_LEAF_K(f); - sn_flags |= H5AC2__DIRTIED_FLAG; + sn_flags |= H5AC__DIRTIED_FLAG; /* The middle key */ md_key->offset = sn->entry[sn->nsyms - 1].name_off; @@ -956,7 +956,7 @@ H5G_node_insert(H5F_t *f, hid_t dxpl_id, haddr_t addr, } else { /* Where to insert the new entry? */ ret_value = H5B_INS_NOOP; - sn_flags |= H5AC2__DIRTIED_FLAG; + sn_flags |= H5AC__DIRTIED_FLAG; insert_into = sn; if(idx == (int)sn->nsyms) { rt_key->offset = ent.name_off; @@ -978,9 +978,9 @@ H5G_node_insert(H5F_t *f, hid_t dxpl_id, haddr_t addr, insert_into->nsyms += 1; done: - if(snrt && H5AC2_unprotect(f, dxpl_id, H5AC2_SNODE, *new_node_p, (size_t)0, snrt, snrt_flags) < 0) + if(snrt && H5AC_unprotect(f, dxpl_id, H5AC_SNODE, *new_node_p, (size_t)0, snrt, snrt_flags) < 0) HDONE_ERROR(H5E_SYM, H5E_PROTECT, H5B_INS_ERROR, "unable to release symbol table node") - if(sn && H5AC2_unprotect(f, dxpl_id, H5AC2_SNODE, addr, (size_t)0, sn, sn_flags) < 0) + if(sn && H5AC_unprotect(f, dxpl_id, H5AC_SNODE, addr, (size_t)0, sn, sn_flags) < 0) HDONE_ERROR(H5E_SYM, H5E_PROTECT, H5B_INS_ERROR, "unable to release symbol table node") FUNC_LEAVE_NOAPI(ret_value) @@ -1025,7 +1025,7 @@ H5G_node_remove(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_lt_key/*in,out*/, H5G_node_key_t *rt_key = (H5G_node_key_t *)_rt_key; H5G_bt_rm_t *udata = (H5G_bt_rm_t *)_udata; H5G_node_t *sn = NULL; - unsigned sn_flags = H5AC2__NO_FLAGS_SET; + unsigned sn_flags = H5AC__NO_FLAGS_SET; unsigned lt = 0, rt, idx = 0; int cmp = 1; H5B_ins_t ret_value = H5B_INS_ERROR; @@ -1040,7 +1040,7 @@ H5G_node_remove(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_lt_key/*in,out*/, HDassert(udata && udata->common.heap); /* Load the symbol table */ - if(NULL == (sn = H5AC2_protect(f, dxpl_id, H5AC2_SNODE, addr, H5G_node_size_real(f), (void *)f, H5AC2_WRITE))) + if(NULL == (sn = H5AC_protect(f, dxpl_id, H5AC_SNODE, addr, H5G_node_size_real(f), (void *)f, H5AC_WRITE))) HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, H5B_INS_ERROR, "unable to protect symbol table node") /* "Normal" removal of a single entry from the symbol table node */ @@ -1129,7 +1129,7 @@ H5G_node_remove(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_lt_key/*in,out*/, *rt_key_changed = TRUE; sn->nsyms = 0; if(H5MF_xfree(f, H5FD_MEM_BTREE, dxpl_id, addr, (hsize_t)H5G_node_size_real(f)) < 0 - || H5AC2_unprotect(f, dxpl_id, H5AC2_SNODE, addr, (size_t)0, sn, H5AC2__DIRTIED_FLAG | H5AC2__DELETED_FLAG) < 0) { + || H5AC_unprotect(f, dxpl_id, H5AC_SNODE, addr, (size_t)0, sn, H5AC__DIRTIED_FLAG | H5AC__DELETED_FLAG) < 0) { sn = NULL; HGOTO_ERROR(H5E_SYM, H5E_PROTECT, H5B_INS_ERROR, "unable to free symbol table node") } /* end if */ @@ -1143,7 +1143,7 @@ H5G_node_remove(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_lt_key/*in,out*/, * change. */ sn->nsyms -= 1; - sn_flags |= H5AC2__DIRTIED_FLAG; + sn_flags |= H5AC__DIRTIED_FLAG; HDmemmove(sn->entry + idx, sn->entry + idx + 1, (sn->nsyms-idx) * sizeof(H5G_entry_t)); ret_value = H5B_INS_NOOP; @@ -1155,7 +1155,7 @@ H5G_node_remove(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_lt_key/*in,out*/, * should be changed to reflect the new right-most entry. */ sn->nsyms -= 1; - sn_flags |= H5AC2__DIRTIED_FLAG; + sn_flags |= H5AC__DIRTIED_FLAG; rt_key->offset = sn->entry[sn->nsyms - 1].name_off; *rt_key_changed = TRUE; ret_value = H5B_INS_NOOP; @@ -1166,7 +1166,7 @@ H5G_node_remove(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_lt_key/*in,out*/, * node. */ sn->nsyms -= 1; - sn_flags |= H5AC2__DIRTIED_FLAG; + sn_flags |= H5AC__DIRTIED_FLAG; HDmemmove(sn->entry + idx, sn->entry + idx + 1, (sn->nsyms - idx) * sizeof(H5G_entry_t)); ret_value = H5B_INS_NOOP; @@ -1201,7 +1201,7 @@ H5G_node_remove(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_lt_key/*in,out*/, *rt_key_changed = TRUE; sn->nsyms = 0; if(H5MF_xfree(f, H5FD_MEM_BTREE, dxpl_id, addr, (hsize_t)H5G_node_size_real(f)) < 0 - || H5AC2_unprotect(f, dxpl_id, H5AC2_SNODE, addr, (size_t)0, sn, H5AC2__DIRTIED_FLAG | H5AC2__DELETED_FLAG) < 0) { + || H5AC_unprotect(f, dxpl_id, H5AC_SNODE, addr, (size_t)0, sn, H5AC__DIRTIED_FLAG | H5AC__DELETED_FLAG) < 0) { sn = NULL; HGOTO_ERROR(H5E_SYM, H5E_PROTECT, H5B_INS_ERROR, "unable to free symbol table node") } /* end if */ @@ -1210,7 +1210,7 @@ H5G_node_remove(H5F_t *f, hid_t dxpl_id, haddr_t addr, void *_lt_key/*in,out*/, } /* end else */ done: - if(sn && H5AC2_unprotect(f, dxpl_id, H5AC2_SNODE, addr, (size_t)0, sn, sn_flags) < 0) + if(sn && H5AC_unprotect(f, dxpl_id, H5AC_SNODE, addr, (size_t)0, sn, sn_flags) < 0) HDONE_ERROR(H5E_SYM, H5E_CANTUNPROTECT, H5B_INS_ERROR, "unable to release symbol table node") FUNC_LEAVE_NOAPI(ret_value) @@ -1250,7 +1250,7 @@ H5G_node_iterate(H5F_t *f, hid_t dxpl_id, const void UNUSED *_lt_key, haddr_t ad HDassert(udata && udata->heap); /* Protect the symbol table node & local heap while we iterate over entries */ - if(NULL == (sn = H5AC2_protect(f, dxpl_id, H5AC2_SNODE, addr, H5G_node_size_real(f), (void *)f, H5AC2_READ))) + if(NULL == (sn = H5AC_protect(f, dxpl_id, H5AC_SNODE, addr, H5G_node_size_real(f), (void *)f, H5AC_READ))) HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, H5_ITER_ERROR, "unable to load symbol table node") /* @@ -1289,7 +1289,7 @@ H5G_node_iterate(H5F_t *f, hid_t dxpl_id, const void UNUSED *_lt_key, haddr_t ad done: /* Release resources */ - if(sn && H5AC2_unprotect(f, dxpl_id, H5AC2_SNODE, addr, (size_t)0, sn, H5AC2__NO_FLAGS_SET) < 0) + if(sn && H5AC_unprotect(f, dxpl_id, H5AC_SNODE, addr, (size_t)0, sn, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_SYM, H5E_PROTECT, H5_ITER_ERROR, "unable to release object header") FUNC_LEAVE_NOAPI(ret_value) @@ -1327,13 +1327,13 @@ H5G_node_sumup(H5F_t *f, hid_t dxpl_id, const void UNUSED *_lt_key, haddr_t addr HDassert(num_objs); /* Find the object node and add the number of symbol entries. */ - if(NULL == (sn = H5AC2_protect(f, dxpl_id, H5AC2_SNODE, addr, H5G_node_size_real(f), (void *)f, H5AC2_READ))) + if(NULL == (sn = H5AC_protect(f, dxpl_id, H5AC_SNODE, addr, H5G_node_size_real(f), (void *)f, H5AC_READ))) HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, H5_ITER_ERROR, "unable to load symbol table node") *num_objs += sn->nsyms; done: - if(sn && H5AC2_unprotect(f, dxpl_id, H5AC2_SNODE, addr, (size_t)0, sn, H5AC2__NO_FLAGS_SET) < 0) + if(sn && H5AC_unprotect(f, dxpl_id, H5AC_SNODE, addr, (size_t)0, sn, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_SYM, H5E_PROTECT, H5_ITER_ERROR, "unable to release object header") FUNC_LEAVE_NOAPI(ret_value) @@ -1372,7 +1372,7 @@ H5G_node_by_idx(H5F_t *f, hid_t dxpl_id, const void UNUSED *_lt_key, haddr_t add HDassert(udata); /* Get a pointer to the symbol table node */ - if(NULL == (sn = H5AC2_protect(f, dxpl_id, H5AC2_SNODE, addr, H5G_node_size_real(f), (void *)f, H5AC2_READ))) + if(NULL == (sn = H5AC_protect(f, dxpl_id, H5AC_SNODE, addr, H5G_node_size_real(f), (void *)f, H5AC_READ))) HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, H5_ITER_ERROR, "unable to load symbol table node"); /* Find the node, locate the object symbol table entry and retrieve the name */ @@ -1394,7 +1394,7 @@ H5G_node_by_idx(H5F_t *f, hid_t dxpl_id, const void UNUSED *_lt_key, haddr_t add udata->num_objs += sn->nsyms; done: - if(sn && H5AC2_unprotect(f, dxpl_id, H5AC2_SNODE, addr, (size_t)0, sn, H5AC2__NO_FLAGS_SET) < 0) + if(sn && H5AC_unprotect(f, dxpl_id, H5AC_SNODE, addr, (size_t)0, sn, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_SYM, H5E_PROTECT, H5_ITER_ERROR, "unable to release object header") FUNC_LEAVE_NOAPI(ret_value) @@ -1510,11 +1510,11 @@ H5G_node_copy(H5F_t *f, hid_t dxpl_id, const void UNUSED *_lt_key, haddr_t addr, HDassert(udata); /* load the symbol table into memory from the source file */ - if(NULL == (sn = H5AC2_protect(f, dxpl_id, H5AC2_SNODE, addr, H5G_node_size_real(f), (void *)f, H5AC2_READ))) + if(NULL == (sn = H5AC_protect(f, dxpl_id, H5AC_SNODE, addr, H5G_node_size_real(f), (void *)f, H5AC_READ))) HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, H5_ITER_ERROR, "unable to load symbol table node") /* get the base address of the heap */ - if(NULL == (heap = H5HL_protect(f, dxpl_id, udata->src_heap_addr, H5AC2_READ))) + if(NULL == (heap = H5HL_protect(f, dxpl_id, udata->src_heap_addr, H5AC_READ))) HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, H5_ITER_ERROR, "unable to protect symbol name") /* copy object in this node one by one */ @@ -1603,7 +1603,7 @@ done: if(heap && H5HL_unprotect(heap) < 0) HDONE_ERROR(H5E_SYM, H5E_PROTECT, H5_ITER_ERROR, "unable to unprotect symbol name") - if(sn && H5AC2_unprotect(f, dxpl_id, H5AC2_SNODE, addr, (size_t)0, sn, H5AC2__NO_FLAGS_SET) < 0) + if(sn && H5AC_unprotect(f, dxpl_id, H5AC_SNODE, addr, (size_t)0, sn, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_SYM, H5E_PROTECT, H5_ITER_ERROR, "unable to release object header") FUNC_LEAVE_NOAPI(ret_value) @@ -1645,7 +1645,7 @@ H5G_node_build_table(H5F_t *f, hid_t dxpl_id, const void UNUSED *_lt_key, haddr_ * Save information about the symbol table node since we can't lock it * because we're about to call an application function. */ - if(NULL == (sn = H5AC2_protect(f, dxpl_id, H5AC2_SNODE, addr, H5G_node_size_real(f), (void *)f, H5AC2_READ))) + if(NULL == (sn = H5AC_protect(f, dxpl_id, H5AC_SNODE, addr, H5G_node_size_real(f), (void *)f, H5AC_READ))) HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, H5_ITER_ERROR, "unable to load symbol table node") /* Check if the link table needs to be extended */ @@ -1678,7 +1678,7 @@ H5G_node_build_table(H5F_t *f, hid_t dxpl_id, const void UNUSED *_lt_key, haddr_ done: /* Release the locked items */ - if(sn && H5AC2_unprotect(f, dxpl_id, H5AC2_SNODE, addr, (size_t)0, sn, H5AC2__NO_FLAGS_SET) < 0) + if(sn && H5AC_unprotect(f, dxpl_id, H5AC_SNODE, addr, (size_t)0, sn, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_SYM, H5E_PROTECT, H5_ITER_ERROR, "unable to release object header") FUNC_LEAVE_NOAPI(ret_value) @@ -1752,14 +1752,14 @@ H5G_node_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE * stream, int indent, /* Pin the heap down in memory */ if(heap_addr > 0 && H5F_addr_defined(heap_addr)) - if(NULL == (heap = H5HL_protect(f, dxpl_id, heap_addr, H5AC2_READ))) + if(NULL == (heap = H5HL_protect(f, dxpl_id, heap_addr, H5AC_READ))) HGOTO_ERROR(H5E_SYM, H5E_CANTLOAD, FAIL, "unable to protect symbol table heap") /* * If we couldn't load the symbol table node, then try loading the * B-tree node. */ - if (NULL == (sn = H5AC2_protect(f, dxpl_id, H5AC2_SNODE, addr, H5G_node_size_real(f), (void *)f, H5AC2_READ))) { + if (NULL == (sn = H5AC_protect(f, dxpl_id, H5AC_SNODE, addr, H5G_node_size_real(f), (void *)f, H5AC_READ))) { H5G_bt_common_t udata; /*data to pass through B-tree */ H5E_clear_stack(NULL); /* discard that error */ @@ -1797,7 +1797,7 @@ H5G_node_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE * stream, int indent, } /* end if */ done: - if(sn && H5AC2_unprotect(f, dxpl_id, H5AC2_SNODE, addr, (size_t)0, sn, H5AC2__NO_FLAGS_SET) < 0) + if(sn && H5AC_unprotect(f, dxpl_id, H5AC_SNODE, addr, (size_t)0, sn, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to release symbol table node") if(heap && H5HL_unprotect(heap) < 0) HDONE_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to unprotect symbol table heap") diff --git a/src/H5Gobj.c b/src/H5Gobj.c index d79710e..70f1c34 100644 --- a/src/H5Gobj.c +++ b/src/H5Gobj.c @@ -888,7 +888,7 @@ H5G_obj_remove_update_linfo(H5O_loc_t *oloc, H5O_linfo_t *linfo, hid_t dxpl_id) HGOTO_ERROR(H5E_SYM, H5E_CANTNEXT, FAIL, "error iterating over links") /* Get a pointer to the object header itself */ - if((oh = H5O_protect(oloc, dxpl_id, H5AC2_WRITE)) == NULL) + if((oh = H5O_protect(oloc, dxpl_id, H5AC_WRITE)) == NULL) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to protect group object header") /* Pin the object header */ @@ -896,7 +896,7 @@ H5G_obj_remove_update_linfo(H5O_loc_t *oloc, H5O_linfo_t *linfo, hid_t dxpl_id) HGOTO_ERROR(H5E_SYM, H5E_CANTPIN, FAIL, "unable to pin group object header") /* Unprotect the object header */ - if(H5O_unprotect(oloc, dxpl_id, oh, H5AC2__NO_FLAGS_SET) < 0) + if(H5O_unprotect(oloc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTUNPROTECT, FAIL, "unable to unprotect group object header") /* Inspect links in table for ones that can't be converted back diff --git a/src/H5Gstab.c b/src/H5Gstab.c index 4521321..856e2e8 100644 --- a/src/H5Gstab.c +++ b/src/H5Gstab.c @@ -121,7 +121,7 @@ H5G_stab_create_components(H5F_t *f, H5O_stab_t *stab, size_t size_hint, hid_t d HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "can't create heap") /* Pin the heap down in memory */ - if(NULL == (heap = H5HL_protect(f, dxpl_id, stab->heap_addr, H5AC2_WRITE))) + if(NULL == (heap = H5HL_protect(f, dxpl_id, stab->heap_addr, H5AC_WRITE))) HGOTO_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to protect symbol table heap") /* Insert name into the heap */ @@ -236,7 +236,7 @@ H5G_stab_insert_real(H5F_t *f, H5O_stab_t *stab, const char *name, HDassert(obj_lnk); /* Pin the heap down in memory */ - if(NULL == (heap = H5HL_protect(f, dxpl_id, stab->heap_addr, H5AC2_WRITE))) + if(NULL == (heap = H5HL_protect(f, dxpl_id, stab->heap_addr, H5AC_WRITE))) HGOTO_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to protect symbol table heap") /* Initialize data to pass through B-tree */ @@ -329,7 +329,7 @@ H5G_stab_remove(H5O_loc_t *loc, hid_t dxpl_id, H5RS_str_t *grp_full_path_r, HGOTO_ERROR(H5E_SYM, H5E_BADMESG, FAIL, "not a symbol table") /* Pin the heap down in memory */ - if(NULL == (heap = H5HL_protect(loc->file, dxpl_id, stab.heap_addr, H5AC2_WRITE))) + if(NULL == (heap = H5HL_protect(loc->file, dxpl_id, stab.heap_addr, H5AC_WRITE))) HGOTO_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to protect symbol table heap") /* Initialize data to pass through B-tree */ @@ -387,7 +387,7 @@ H5G_stab_remove_by_idx(H5O_loc_t *grp_oloc, hid_t dxpl_id, H5RS_str_t *grp_full_ HGOTO_ERROR(H5E_SYM, H5E_BADMESG, FAIL, "not a symbol table") /* Pin the heap down in memory */ - if(NULL == (heap = H5HL_protect(grp_oloc->file, dxpl_id, stab.heap_addr, H5AC2_WRITE))) + if(NULL == (heap = H5HL_protect(grp_oloc->file, dxpl_id, stab.heap_addr, H5AC_WRITE))) HGOTO_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to protect symbol table heap") /* Initialize data to pass through B-tree */ @@ -441,7 +441,7 @@ H5G_stab_delete(H5F_t *f, hid_t dxpl_id, const H5O_stab_t *stab) HDassert(H5F_addr_defined(stab->heap_addr)); /* Pin the heap down in memory */ - if(NULL == (heap = H5HL_protect(f, dxpl_id, stab->heap_addr, H5AC2_WRITE))) + if(NULL == (heap = H5HL_protect(f, dxpl_id, stab->heap_addr, H5AC_WRITE))) HGOTO_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to protect symbol table heap") /* Set up user data for B-tree deletion */ @@ -502,7 +502,7 @@ H5G_stab_iterate(const H5O_loc_t *oloc, hid_t dxpl_id, H5_iter_order_t order, HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "unable to determine local heap address") /* Pin the heap down in memory */ - if(NULL == (heap = H5HL_protect(oloc->file, dxpl_id, stab.heap_addr, H5AC2_READ))) + if(NULL == (heap = H5HL_protect(oloc->file, dxpl_id, stab.heap_addr, H5AC_READ))) HGOTO_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to protect symbol table heap") /* Check on iteration order */ @@ -718,7 +718,7 @@ H5G_stab_get_name_by_idx(H5O_loc_t *oloc, H5_iter_order_t order, hsize_t n, HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "unable to determine local heap address") /* Pin the heap down in memory */ - if(NULL == (heap = H5HL_protect(oloc->file, dxpl_id, stab.heap_addr, H5AC2_READ))) + if(NULL == (heap = H5HL_protect(oloc->file, dxpl_id, stab.heap_addr, H5AC_READ))) HGOTO_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to protect symbol table heap") /* Remap index for decreasing iteration order */ @@ -839,7 +839,7 @@ H5G_stab_lookup(H5O_loc_t *grp_oloc, const char *name, H5O_link_t *lnk, HGOTO_ERROR(H5E_SYM, H5E_BADMESG, FAIL, "can't read message") /* Pin the heap down in memory */ - if(NULL == (heap = H5HL_protect(grp_oloc->file, dxpl_id, stab.heap_addr, H5AC2_READ))) + if(NULL == (heap = H5HL_protect(grp_oloc->file, dxpl_id, stab.heap_addr, H5AC_READ))) HGOTO_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to protect symbol table heap") /* Set up user data to pass to 'find' operation callback */ @@ -940,7 +940,7 @@ H5G_stab_lookup_by_idx(H5O_loc_t *grp_oloc, H5_iter_order_t order, hsize_t n, HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "unable to determine local heap address") /* Pin the heap down in memory */ - if(NULL == (heap = H5HL_protect(grp_oloc->file, dxpl_id, stab.heap_addr, H5AC2_READ))) + if(NULL == (heap = H5HL_protect(grp_oloc->file, dxpl_id, stab.heap_addr, H5AC_READ))) HGOTO_ERROR(H5E_SYM, H5E_PROTECT, FAIL, "unable to protect symbol table heap") /* Remap index for decreasing iteration order */ diff --git a/src/H5Gtest.c b/src/H5Gtest.c index 7400355..2921bf0 100644 --- a/src/H5Gtest.c +++ b/src/H5Gtest.c @@ -108,11 +108,11 @@ H5G_is_empty_test(hid_t gid) /* "New format" checks */ /* Check if the group has any link messages */ - if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_LINK_ID, H5AC2_dxpl_id)) < 0) + if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_LINK_ID, H5AC_dxpl_id)) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header") if(msg_exists > 0) { /* Sanity check that new group format shouldn't have old messages */ - if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_STAB_ID, H5AC2_dxpl_id)) < 0) + if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_STAB_ID, H5AC_dxpl_id)) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header") if(msg_exists > 0) HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "both symbol table and link messages found") @@ -121,19 +121,19 @@ H5G_is_empty_test(hid_t gid) } /* end if */ /* Check for a link info message */ - if((linfo_exists = H5O_msg_exists(&(grp->oloc), H5O_LINFO_ID, H5AC2_dxpl_id)) < 0) + if((linfo_exists = H5O_msg_exists(&(grp->oloc), H5O_LINFO_ID, H5AC_dxpl_id)) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header") if(linfo_exists > 0) { H5O_linfo_t linfo; /* Link info message */ /* Sanity check that new group format shouldn't have old messages */ - if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_STAB_ID, H5AC2_dxpl_id)) < 0) + if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_STAB_ID, H5AC_dxpl_id)) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header") if(msg_exists > 0) HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "both symbol table and link info messages found") /* Get the link info */ - if(NULL == H5G_obj_get_linfo(&(grp->oloc), &linfo, H5AC2_dxpl_id)) + if(NULL == H5G_obj_get_linfo(&(grp->oloc), &linfo, H5AC_dxpl_id)) HGOTO_ERROR(H5E_SYM, H5E_BADMESG, FAIL, "can't get link info") /* Check for 'dense' link storage file addresses being defined */ @@ -152,7 +152,7 @@ H5G_is_empty_test(hid_t gid) /* "Old format" checks */ /* Check if the group has a symbol table message */ - if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_STAB_ID, H5AC2_dxpl_id)) < 0) + if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_STAB_ID, H5AC_dxpl_id)) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header") if(msg_exists > 0) { H5O_stab_t stab; /* Info about local heap & B-tree */ @@ -161,17 +161,17 @@ H5G_is_empty_test(hid_t gid) /* Sanity check that old group format shouldn't have new messages */ if(linfo_exists > 0) HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "both symbol table and link info messages found") - if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_GINFO_ID, H5AC2_dxpl_id)) < 0) + if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_GINFO_ID, H5AC_dxpl_id)) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header") if(msg_exists > 0) HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "both symbol table and group info messages found") /* Get the B-tree & local heap info */ - if(NULL == H5O_msg_read(&(grp->oloc), H5O_STAB_ID, &stab, H5AC2_dxpl_id)) + if(NULL == H5O_msg_read(&(grp->oloc), H5O_STAB_ID, &stab, H5AC_dxpl_id)) HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "unable to read symbol table message") /* Get the count of links in the group */ - if(H5G_stab_count(&(grp->oloc), &nlinks, H5AC2_dxpl_id) < 0) + if(H5G_stab_count(&(grp->oloc), &nlinks, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "unable to count links") /* Check for link count */ @@ -217,13 +217,13 @@ H5G_has_links_test(hid_t gid, unsigned *nmsgs) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group") /* Check if the group has any link messages */ - if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_LINK_ID, H5AC2_dxpl_id)) < 0) + if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_LINK_ID, H5AC_dxpl_id)) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header") if(msg_exists == 0) HGOTO_DONE(FALSE) /* Check if the group has a symbol table message */ - if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_STAB_ID, H5AC2_dxpl_id)) < 0) + if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_STAB_ID, H5AC_dxpl_id)) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header") if(msg_exists > 0) HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "both symbol table and link messages found") @@ -233,7 +233,7 @@ H5G_has_links_test(hid_t gid, unsigned *nmsgs) int msg_count; /* Number of messages of a type */ /* Check how many link messages there are */ - if((msg_count = H5O_msg_count(&(grp->oloc), H5O_LINK_ID, H5AC2_dxpl_id)) < 0) + if((msg_count = H5O_msg_count(&(grp->oloc), H5O_LINK_ID, H5AC_dxpl_id)) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTCOUNT, FAIL, "unable to count link messages") *nmsgs = (unsigned)msg_count; } /* end if */ @@ -275,13 +275,13 @@ H5G_has_stab_test(hid_t gid) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group") /* Check if the group has a symbol table message */ - if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_STAB_ID, H5AC2_dxpl_id)) < 0) + if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_STAB_ID, H5AC_dxpl_id)) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header") if(msg_exists == 0) HGOTO_DONE(FALSE) /* Check if the group has any link messages */ - if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_LINK_ID, H5AC2_dxpl_id)) < 0) + if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_LINK_ID, H5AC_dxpl_id)) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header") if(msg_exists > 0) HGOTO_ERROR(H5E_SYM, H5E_BADVALUE, FAIL, "both symbol table and link messages found") @@ -325,25 +325,25 @@ H5G_is_new_dense_test(hid_t gid) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group") /* Check if the group has a symbol table message */ - if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_STAB_ID, H5AC2_dxpl_id)) < 0) + if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_STAB_ID, H5AC_dxpl_id)) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header") if(msg_exists > 0) HGOTO_DONE(FALSE) /* Check if the group has any link messages */ - if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_LINK_ID, H5AC2_dxpl_id)) < 0) + if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_LINK_ID, H5AC_dxpl_id)) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header") if(msg_exists > 0) HGOTO_DONE(FALSE) /* Check if the group has link info message */ - if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_LINFO_ID, H5AC2_dxpl_id)) < 0) + if((msg_exists = H5O_msg_exists(&(grp->oloc), H5O_LINFO_ID, H5AC_dxpl_id)) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read object header") if(msg_exists > 0) { H5O_linfo_t linfo; /* Link info message */ /* Get the link info */ - if(NULL == H5G_obj_get_linfo(&(grp->oloc), &linfo, H5AC2_dxpl_id)) + if(NULL == H5G_obj_get_linfo(&(grp->oloc), &linfo, H5AC_dxpl_id)) HGOTO_ERROR(H5E_SYM, H5E_BADMESG, FAIL, "can't get link info") /* Check for 'dense' link storage file addresses being defined */ @@ -393,7 +393,7 @@ H5G_new_dense_info_test(hid_t gid, hsize_t *name_count, hsize_t *corder_count) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group") /* Get the link info */ - if(NULL == H5G_obj_get_linfo(&(grp->oloc), &linfo, H5AC2_dxpl_id)) + if(NULL == H5G_obj_get_linfo(&(grp->oloc), &linfo, H5AC_dxpl_id)) HGOTO_ERROR(H5E_SYM, H5E_BADMESG, FAIL, "can't get link info") /* Check for 'dense' link storage file addresses being defined */ @@ -403,13 +403,13 @@ H5G_new_dense_info_test(hid_t gid, hsize_t *name_count, hsize_t *corder_count) HGOTO_DONE(FAIL) /* Retrieve # of records in name index */ - if(H5B2_get_nrec(grp->oloc.file, H5AC2_dxpl_id, H5G_BT2_NAME, linfo.name_bt2_addr, name_count) < 0) + if(H5B2_get_nrec(grp->oloc.file, H5AC_dxpl_id, H5G_BT2_NAME, linfo.name_bt2_addr, name_count) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTCOUNT, FAIL, "unable to retrieve # of records from name index") /* Check if there is a creation order index */ if(H5F_addr_defined(linfo.corder_bt2_addr)) { /* Retrieve # of records in creation order index */ - if(H5B2_get_nrec(grp->oloc.file, H5AC2_dxpl_id, H5G_BT2_CORDER, linfo.corder_bt2_addr, corder_count) < 0) + if(H5B2_get_nrec(grp->oloc.file, H5AC_dxpl_id, H5G_BT2_CORDER, linfo.corder_bt2_addr, corder_count) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTCOUNT, FAIL, "unable to retrieve # of records from creation order index") } /* end if */ else @@ -453,11 +453,11 @@ H5G_lheap_size_test(hid_t gid, size_t *lheap_size) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group") /* Make certain the group has a symbol table message */ - if(NULL == H5O_msg_read(&(grp->oloc), H5O_STAB_ID, &stab, H5AC2_dxpl_id)) + if(NULL == H5O_msg_read(&(grp->oloc), H5O_STAB_ID, &stab, H5AC_dxpl_id)) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to read symbol table message") /* Check the size of the local heap for the group */ - if(H5HL_get_size(grp->oloc.file, H5AC2_dxpl_id, stab.heap_addr, lheap_size) < 0) + if(H5HL_get_size(grp->oloc.file, H5AC_dxpl_id, stab.heap_addr, lheap_size) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTGETSIZE, FAIL, "can't query local heap size") done: diff --git a/src/H5HF.c b/src/H5HF.c index 0987a02..26f935b 100644 --- a/src/H5HF.c +++ b/src/H5HF.c @@ -180,7 +180,7 @@ HDfprintf(stderr, "%s: Called\n", FUNC); cache_udata.dxpl_id = dxpl_id; /* Lock the heap header into memory */ - if(NULL == (hdr = H5AC2_protect(f, dxpl_id, H5AC2_FHEAP_HDR, fh_addr, (size_t)H5HF_SPEC_READ_SIZE(f), &cache_udata, H5AC2_WRITE))) + if(NULL == (hdr = H5AC_protect(f, dxpl_id, H5AC_FHEAP_HDR, fh_addr, (size_t)H5HF_SPEC_READ_SIZE(f), &cache_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, NULL, "unable to load fractal heap header") /* Point fractal heap wrapper at header and bump it's ref count */ @@ -198,7 +198,7 @@ HDfprintf(stderr, "%s: Called\n", FUNC); ret_value = fh; done: - if(hdr && H5AC2_unprotect(f, dxpl_id, H5AC2_FHEAP_HDR, fh_addr, (size_t)0, hdr, H5AC2__NO_FLAGS_SET) < 0) + if(hdr && H5AC_unprotect(f, dxpl_id, H5AC_FHEAP_HDR, fh_addr, (size_t)0, hdr, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, NULL, "unable to release fractal heap header") if(!ret_value) { if(fh) @@ -247,7 +247,7 @@ H5HF_open(H5F_t *f, hid_t dxpl_id, haddr_t fh_addr) #ifdef QAK HDfprintf(stderr, "%s: fh_addr = %a\n", FUNC, fh_addr); #endif /* QAK */ - if(NULL == (hdr = H5AC2_protect(f, dxpl_id, H5AC2_FHEAP_HDR, fh_addr, (size_t)H5HF_SPEC_READ_SIZE(f), &cache_udata, H5AC2_READ))) + if(NULL == (hdr = H5AC_protect(f, dxpl_id, H5AC_FHEAP_HDR, fh_addr, (size_t)H5HF_SPEC_READ_SIZE(f), &cache_udata, H5AC_READ))) HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, NULL, "unable to load fractal heap header") #ifdef QAK HDfprintf(stderr, "%s: hdr->rc = %u, hdr->fspace = %p\n", FUNC, hdr->rc, hdr->fspace); @@ -277,7 +277,7 @@ HDfprintf(stderr, "%s: hdr->rc = %u, hdr->fspace = %p\n", FUNC, hdr->rc, hdr->fs ret_value = fh; done: - if(hdr && H5AC2_unprotect(f, dxpl_id, H5AC2_FHEAP_HDR, fh_addr, (size_t)0, hdr, H5AC2__NO_FLAGS_SET) < 0) + if(hdr && H5AC_unprotect(f, dxpl_id, H5AC_FHEAP_HDR, fh_addr, (size_t)0, hdr, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, NULL, "unable to release fractal heap header") if(!ret_value) { if(fh) @@ -869,7 +869,7 @@ HDfprintf(stderr, "%s; After iterator reset fh->hdr->rc = %Zu\n", FUNC, fh->hdr- cache_udata.dxpl_id = dxpl_id; /* Lock the heap header into memory */ - if(NULL == (hdr = H5AC2_protect(fh->f, dxpl_id, H5AC2_FHEAP_HDR, heap_addr, (size_t)H5HF_SPEC_READ_SIZE(fh->f), &cache_udata, H5AC2_WRITE))) + if(NULL == (hdr = H5AC_protect(fh->f, dxpl_id, H5AC_FHEAP_HDR, heap_addr, (size_t)H5HF_SPEC_READ_SIZE(fh->f), &cache_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, FAIL, "unable to load fractal heap header") /* Set the shared heap header's file context for this operation */ @@ -924,7 +924,7 @@ H5HF_delete(H5F_t *f, hid_t dxpl_id, haddr_t fh_addr) #ifdef QAK HDfprintf(stderr, "%s: fh_addr = %a\n", FUNC, fh_addr); #endif /* QAK */ - if(NULL == (hdr = H5AC2_protect(f, dxpl_id, H5AC2_FHEAP_HDR, fh_addr, (size_t)H5HF_SPEC_READ_SIZE(f), &cache_udata, H5AC2_WRITE))) + if(NULL == (hdr = H5AC_protect(f, dxpl_id, H5AC_FHEAP_HDR, fh_addr, (size_t)H5HF_SPEC_READ_SIZE(f), &cache_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, FAIL, "unable to load fractal heap header") /* Check for files using shared heap header */ @@ -939,7 +939,7 @@ HDfprintf(stderr, "%s: fh_addr = %a\n", FUNC, fh_addr); done: /* Unprotect the header, if an error occurred */ - if(hdr && H5AC2_unprotect(f, dxpl_id, H5AC2_FHEAP_HDR, fh_addr, (size_t)0, hdr, H5AC2__NO_FLAGS_SET) < 0) + if(hdr && H5AC_unprotect(f, dxpl_id, H5AC_FHEAP_HDR, fh_addr, (size_t)0, hdr, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap header") FUNC_LEAVE_NOAPI(ret_value) diff --git a/src/H5HFcache.c b/src/H5HFcache.c index f9634b0..ffc1e92 100644 --- a/src/H5HFcache.c +++ b/src/H5HFcache.c @@ -34,7 +34,7 @@ /* Headers */ /***********/ #include "H5private.h" /* Generic Functions */ -#include "H5AC2private.h" +#include "H5ACprivate.h" /* Metadata cache */ #include "H5Eprivate.h" /* Error handling */ #include "H5HFpkg.h" /* Fractal heaps */ #include "H5MFprivate.h" /* File memory management */ @@ -76,7 +76,7 @@ static herr_t H5HF_dtable_encode(H5F_t *f, uint8_t **pp, const H5HF_dtable_t *dtable); static herr_t H5HF_dtable_decode(H5F_t *f, const uint8_t **pp, H5HF_dtable_t *dtable); -/* Metadata cache (H5AC2) callbacks */ +/* Metadata cache (H5AC) callbacks */ static void *H5HF_cache_hdr_deserialize(haddr_t addr, size_t len, const void *image, void *udata, hbool_t *dirty); static herr_t H5HF_cache_hdr_serialize(const H5F_t *f, hid_t dxpl_id, @@ -104,9 +104,9 @@ static herr_t H5HF_cache_dblock_free_icr(haddr_t addr, size_t len, void *thing); /* Package Variables */ /*********************/ -/* H5HF header inherits cache-like properties from H5AC2 */ -const H5AC2_class_t H5AC2_FHEAP_HDR[1] = {{ - H5AC2_FHEAP_HDR_ID, +/* H5HF header inherits cache-like properties from H5AC */ +const H5AC_class_t H5AC_FHEAP_HDR[1] = {{ + H5AC_FHEAP_HDR_ID, "fractal heap header", H5FD_MEM_FHEAP_HDR, H5HF_cache_hdr_deserialize, @@ -116,9 +116,9 @@ const H5AC2_class_t H5AC2_FHEAP_HDR[1] = {{ NULL, }}; -/* H5HF indirect block inherits cache-like properties from H5AC2 */ -const H5AC2_class_t H5AC2_FHEAP_IBLOCK[1] = {{ - H5AC2_FHEAP_IBLOCK_ID, +/* H5HF indirect block inherits cache-like properties from H5AC */ +const H5AC_class_t H5AC_FHEAP_IBLOCK[1] = {{ + H5AC_FHEAP_IBLOCK_ID, "fractal heap indirect block", H5FD_MEM_FHEAP_IBLOCK, H5HF_cache_iblock_deserialize, @@ -128,9 +128,9 @@ const H5AC2_class_t H5AC2_FHEAP_IBLOCK[1] = {{ NULL, }}; -/* H5HF direct block inherits cache-like properties from H5AC2 */ -const H5AC2_class_t H5AC2_FHEAP_DBLOCK[1] = {{ - H5AC2_FHEAP_DBLOCK_ID, +/* H5HF direct block inherits cache-like properties from H5AC */ +const H5AC_class_t H5AC_FHEAP_DBLOCK[1] = {{ + H5AC_FHEAP_DBLOCK_ID, "fractal head direct block", H5FD_MEM_FHEAP_DBLOCK, H5HF_cache_dblock_deserialize, @@ -641,7 +641,7 @@ H5HF_cache_iblock_deserialize(haddr_t UNUSED addr, size_t UNUSED len, /* Allocate space for the fractal heap indirect block */ if(NULL == (iblock = H5FL_CALLOC(H5HF_indirect_t))) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed") - HDmemset(&iblock->cache_info, 0, sizeof(H5AC2_info_t)); + HDmemset(&iblock->cache_info, 0, sizeof(H5AC_info_t)); /* Get the pointer to the shared heap header */ hdr = udata->par_info->hdr; @@ -988,7 +988,7 @@ H5HF_cache_dblock_deserialize(haddr_t addr, size_t len, const void *image, /* Allocate space for the fractal heap direct block */ if(NULL == (dblock = H5FL_MALLOC(H5HF_direct_t))) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed") - HDmemset(&dblock->cache_info, 0, sizeof(H5AC2_info_t)); + HDmemset(&dblock->cache_info, 0, sizeof(H5AC_info_t)); par_info = (H5HF_parent_t *)(&(udata->par_info)); @@ -1261,12 +1261,12 @@ H5HF_cache_dblock_serialize(const H5F_t *f, hid_t dxpl_id, haddr_t addr, if(HADDR_UNDEF == (addr = H5MF_alloc(f, H5FD_MEM_FHEAP_DBLOCK, dxpl_id, (hsize_t)write_size))) HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "file allocation failed for fractal heap direct block") - *flags |= H5AC2__SERIALIZE_RESIZED_FLAG; + *flags |= H5AC__SERIALIZE_RESIZED_FLAG; *new_len = write_size; /* Let the metadata cache know, if the block moved */ if(!H5F_addr_eq(hdr->man_dtable.table_addr, addr)) { - *flags |= H5AC2__SERIALIZE_RENAMED_FLAG; + *flags |= H5AC__SERIALIZE_RENAMED_FLAG; *new_addr = addr; } /* end if */ @@ -1314,12 +1314,12 @@ H5HF_cache_dblock_serialize(const H5F_t *f, hid_t dxpl_id, haddr_t addr, if(HADDR_UNDEF == (addr = H5MF_alloc(f, H5FD_MEM_FHEAP_DBLOCK, dxpl_id, (hsize_t)write_size))) HGOTO_ERROR(H5E_HEAP, H5E_NOSPACE, FAIL, "file allocation failed for fractal heap direct block") - *flags |= H5AC2__SERIALIZE_RESIZED_FLAG; + *flags |= H5AC__SERIALIZE_RESIZED_FLAG; *new_len = write_size; /* Let the metadata cache know, if the block moved */ if(!H5F_addr_eq(par_iblock->ents[par_entry].addr, addr)) { - *flags |= H5AC2__SERIALIZE_RENAMED_FLAG; + *flags |= H5AC__SERIALIZE_RENAMED_FLAG; *new_addr = addr; } /* end if */ diff --git a/src/H5HFdbg.c b/src/H5HFdbg.c index 0c45e4f..0893e28 100644 --- a/src/H5HFdbg.c +++ b/src/H5HFdbg.c @@ -209,7 +209,7 @@ H5HF_hdr_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, /* * Load the fractal heap header. */ - if(NULL == (hdr = H5AC2_protect(f, dxpl_id, H5AC2_FHEAP_HDR, addr, (size_t)H5HF_SPEC_READ_SIZE(f), &cache_udata, H5AC2_READ))) + if(NULL == (hdr = H5AC_protect(f, dxpl_id, H5AC_FHEAP_HDR, addr, (size_t)H5HF_SPEC_READ_SIZE(f), &cache_udata, H5AC_READ))) HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, FAIL, "unable to load fractal heap header") /* Print opening message */ @@ -289,7 +289,7 @@ H5HF_hdr_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, } /* end if */ done: - if(hdr && H5AC2_unprotect(f, dxpl_id, H5AC2_FHEAP_HDR, addr, (size_t)0, hdr, H5AC2__NO_FLAGS_SET) < 0) + if(hdr && H5AC_unprotect(f, dxpl_id, H5AC_FHEAP_HDR, addr, (size_t)0, hdr, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_HEAP, H5E_PROTECT, FAIL, "unable to release fractal heap header") FUNC_LEAVE_NOAPI(ret_value) @@ -425,13 +425,13 @@ H5HF_dblock_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, /* * Load the fractal heap header. */ - if(NULL == (hdr = H5AC2_protect(f, dxpl_id, H5AC2_FHEAP_HDR, hdr_addr, (size_t)H5HF_SPEC_READ_SIZE(f), &cache_udata, H5AC2_READ))) + if(NULL == (hdr = H5AC_protect(f, dxpl_id, H5AC_FHEAP_HDR, hdr_addr, (size_t)H5HF_SPEC_READ_SIZE(f), &cache_udata, H5AC_READ))) HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, FAIL, "unable to load fractal heap header") /* * Load the heap direct block */ - if(NULL == (dblock = H5HF_man_dblock_protect(hdr, dxpl_id, addr, block_size, NULL, 0, H5AC2_READ))) + if(NULL == (dblock = H5HF_man_dblock_protect(hdr, dxpl_id, addr, block_size, NULL, 0, H5AC_READ))) HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, FAIL, "unable to load fractal heap direct block") /* Print opening message */ @@ -507,9 +507,9 @@ H5HF_dblock_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, H5_buffer_dump(stream, indent, dblock->blk, marker, (size_t)0, dblock->size); done: - if(dblock && H5AC2_unprotect(f, dxpl_id, H5AC2_FHEAP_DBLOCK, addr, (size_t)0, dblock, H5AC2__NO_FLAGS_SET) < 0) + if(dblock && H5AC_unprotect(f, dxpl_id, H5AC_FHEAP_DBLOCK, addr, (size_t)0, dblock, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_HEAP, H5E_PROTECT, FAIL, "unable to release fractal heap direct block") - if(hdr && H5AC2_unprotect(f, dxpl_id, H5AC2_FHEAP_HDR, hdr_addr, (size_t)0, hdr, H5AC2__NO_FLAGS_SET) < 0) + if(hdr && H5AC_unprotect(f, dxpl_id, H5AC_FHEAP_HDR, hdr_addr, (size_t)0, hdr, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_HEAP, H5E_PROTECT, FAIL, "unable to release fractal heap header") H5MM_xfree(marker); @@ -562,13 +562,13 @@ H5HF_iblock_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, /* * Load the fractal heap header. */ - if(NULL == (hdr = H5AC2_protect(f, dxpl_id, H5AC2_FHEAP_HDR, hdr_addr, (size_t)H5HF_SPEC_READ_SIZE(f), &cache_udata, H5AC2_READ))) + if(NULL == (hdr = H5AC_protect(f, dxpl_id, H5AC_FHEAP_HDR, hdr_addr, (size_t)H5HF_SPEC_READ_SIZE(f), &cache_udata, H5AC_READ))) HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, FAIL, "unable to load fractal heap header") /* * Load the heap indirect block */ - if(NULL == (iblock = H5HF_man_iblock_protect(hdr, dxpl_id, addr, nrows, NULL, 0, FALSE, H5AC2_READ, &did_protect))) + if(NULL == (iblock = H5HF_man_iblock_protect(hdr, dxpl_id, addr, nrows, NULL, 0, FALSE, H5AC_READ, &did_protect))) HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, FAIL, "unable to load fractal heap indirect block") /* Print opening message */ @@ -648,9 +648,9 @@ H5HF_iblock_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, ""); done: - if(iblock && H5HF_man_iblock_unprotect(iblock, dxpl_id, H5AC2__NO_FLAGS_SET, did_protect) < 0) + if(iblock && H5HF_man_iblock_unprotect(iblock, dxpl_id, H5AC__NO_FLAGS_SET, did_protect) < 0) HDONE_ERROR(H5E_HEAP, H5E_PROTECT, FAIL, "unable to release fractal heap direct block") - if(hdr && H5AC2_unprotect(f, dxpl_id, H5AC2_FHEAP_HDR, hdr_addr, (size_t)0, hdr, H5AC2__NO_FLAGS_SET) < 0) + if(hdr && H5AC_unprotect(f, dxpl_id, H5AC_FHEAP_HDR, hdr_addr, (size_t)0, hdr, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_HEAP, H5E_PROTECT, FAIL, "unable to release fractal heap header") FUNC_LEAVE_NOAPI(ret_value) @@ -751,7 +751,7 @@ H5HF_sects_debug(H5F_t *f, hid_t dxpl_id, haddr_t fh_addr, /* * Load the fractal heap header. */ - if(NULL == (hdr = H5AC2_protect(f, dxpl_id, H5AC2_FHEAP_HDR, fh_addr, (size_t)H5HF_SPEC_READ_SIZE(f), &cache_udata, H5AC2_READ))) + if(NULL == (hdr = H5AC_protect(f, dxpl_id, H5AC_FHEAP_HDR, fh_addr, (size_t)H5HF_SPEC_READ_SIZE(f), &cache_udata, H5AC_READ))) HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, FAIL, "unable to load fractal heap header") /* Initialize the free space information for the heap */ @@ -778,7 +778,7 @@ H5HF_sects_debug(H5F_t *f, hid_t dxpl_id, haddr_t fh_addr, } /* end if */ done: - if(hdr && H5AC2_unprotect(f, dxpl_id, H5AC2_FHEAP_HDR, fh_addr, (size_t)0, hdr, H5AC2__NO_FLAGS_SET) < 0) + if(hdr && H5AC_unprotect(f, dxpl_id, H5AC_FHEAP_HDR, fh_addr, (size_t)0, hdr, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_HEAP, H5E_PROTECT, FAIL, "unable to release fractal heap header") FUNC_LEAVE_NOAPI(ret_value) diff --git a/src/H5HFdblock.c b/src/H5HFdblock.c index 4ceb0c2..99f4aba 100644 --- a/src/H5HFdblock.c +++ b/src/H5HFdblock.c @@ -115,7 +115,7 @@ H5HF_man_dblock_create(hid_t dxpl_id, H5HF_hdr_t *hdr, H5HF_indirect_t *par_iblo HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for fractal heap direct block") /* Reset the metadata cache info for the heap header */ - HDmemset(&dblock->cache_info, 0, sizeof(H5AC2_info_t)); + HDmemset(&dblock->cache_info, 0, sizeof(H5AC_info_t)); /* Share common heap information */ dblock->hdr = hdr; @@ -175,7 +175,7 @@ HDmemset(dblock->blk, 0, dblock->size); } /* end else */ /* Cache the new fractal heap direct block */ - if(H5AC2_set(hdr->f, dxpl_id, H5AC2_FHEAP_DBLOCK, dblock_addr, dblock->size, dblock, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_set(hdr->f, dxpl_id, H5AC_FHEAP_DBLOCK, dblock_addr, dblock->size, dblock, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't add fractal heap direct block to cache") /* Increase the allocated heap size */ @@ -301,7 +301,7 @@ H5HF_man_dblock_destroy(H5HF_hdr_t *hdr, hid_t dxpl_id, H5HF_direct_t *dblock, HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to free fractal heap direct block") /* Remove direct block from metadata cache */ - if(H5AC2_unprotect(hdr->f, dxpl_id, H5AC2_FHEAP_DBLOCK, dblock_addr, (size_t)0, dblock, H5AC2__DIRTIED_FLAG|H5AC2__DELETED_FLAG) < 0) + if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_FHEAP_DBLOCK, dblock_addr, (size_t)0, dblock, H5AC__DIRTIED_FLAG|H5AC__DELETED_FLAG) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap direct block") dblock = NULL; @@ -411,8 +411,8 @@ done: /*------------------------------------------------------------------------- * Function: H5HF_man_dblock_protect * - * Purpose: Convenience wrapper around H5AC2_protect on a direct block - * (Use H5AC2_unprotect to unprotect it for now) + * Purpose: Convenience wrapper around H5AC_protect on a direct block + * (Use H5AC_unprotect to unprotect it for now) * * Return: Pointer to direct block on success, NULL on failure * @@ -425,7 +425,7 @@ done: H5HF_direct_t * H5HF_man_dblock_protect(H5HF_hdr_t *hdr, hid_t dxpl_id, haddr_t dblock_addr, size_t dblock_size, H5HF_indirect_t *par_iblock, unsigned par_entry, - H5AC2_protect_t rw) + H5AC_protect_t rw) { H5HF_direct_t *dblock; /* Direct block from cache */ H5HF_dblock_cache_ud_t udata; /* parent and other infor for deserializing direct block */ @@ -479,7 +479,7 @@ H5HF_man_dblock_protect(H5HF_hdr_t *hdr, hid_t dxpl_id, haddr_t dblock_addr, odi_size = dblock_size; /* Protect the direct block */ - if(NULL == (dblock = H5AC2_protect(hdr->f, dxpl_id, H5AC2_FHEAP_DBLOCK, dblock_addr, odi_size, (void *)&udata, rw))) + if(NULL == (dblock = H5AC_protect(hdr->f, dxpl_id, H5AC_FHEAP_DBLOCK, dblock_addr, odi_size, (void *)&udata, rw))) HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, NULL, "unable to protect fractal heap direct block") /* Set the return value */ @@ -506,7 +506,7 @@ done: herr_t H5HF_man_dblock_locate(H5HF_hdr_t *hdr, hid_t dxpl_id, hsize_t obj_off, H5HF_indirect_t **ret_iblock, unsigned *ret_entry, hbool_t *ret_did_protect, - H5AC2_protect_t rw) + H5AC_protect_t rw) { haddr_t iblock_addr; /* Indirect block's address */ H5HF_indirect_t *iblock; /* Pointer to indirect block */ @@ -541,7 +541,7 @@ H5HF_man_dblock_locate(H5HF_hdr_t *hdr, hid_t dxpl_id, hsize_t obj_off, H5HF_indirect_t *new_iblock; /* Pointer to new indirect block */ hbool_t new_did_protect; /* Whether we protected the indirect block or not */ unsigned nrows; /* Number of rows in new indirect block */ - unsigned cache_flags = H5AC2__NO_FLAGS_SET; /* Flags for unprotecting parent indirect block */ + unsigned cache_flags = H5AC__NO_FLAGS_SET; /* Flags for unprotecting parent indirect block */ /* Compute # of rows in child indirect block */ nrows = (H5V_log2_gen(hdr->man_dtable.row_block_size[row]) - hdr->man_dtable.first_row_bits) + 1; @@ -559,7 +559,7 @@ H5HF_man_dblock_locate(H5HF_hdr_t *hdr, hid_t dxpl_id, hsize_t obj_off, HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, FAIL, "can't allocate fractal heap indirect block") /* Indicate that the parent indirect block was modified */ - cache_flags |= H5AC2__DIRTIED_FLAG; + cache_flags |= H5AC__DIRTIED_FLAG; } /* end if */ /* Lock child indirect block */ @@ -625,17 +625,17 @@ H5HF_man_dblock_delete(H5F_t *f, hid_t dxpl_id, haddr_t dblock_addr, HDassert(H5F_addr_defined(dblock_addr)); /* Check the direct block's status in the metadata cache */ - if(H5AC2_get_entry_status(f, dblock_addr, &dblock_status) < 0) + if(H5AC_get_entry_status(f, dblock_addr, &dblock_status) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "unable to check metadata cache status for direct block") /* If the direct block is in the cache, expunge it now */ - if(dblock_status & H5AC2_ES__IN_CACHE) { + if(dblock_status & H5AC_ES__IN_CACHE) { /* Sanity checks on direct block */ - HDassert(!(dblock_status & H5AC2_ES__IS_PINNED)); - HDassert(!(dblock_status & H5AC2_ES__IS_PROTECTED)); + HDassert(!(dblock_status & H5AC_ES__IS_PINNED)); + HDassert(!(dblock_status & H5AC_ES__IS_PROTECTED)); /* Evict the direct block from the metadata cache */ - if(H5AC2_expunge_entry(f, dxpl_id, H5AC2_FHEAP_DBLOCK, dblock_addr) < 0) + if(H5AC_expunge_entry(f, dxpl_id, H5AC_FHEAP_DBLOCK, dblock_addr) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTREMOVE, FAIL, "unable to remove direct block from cache") } /* end if */ diff --git a/src/H5HFhdr.c b/src/H5HFhdr.c index 06ab19a..f2127a1 100644 --- a/src/H5HFhdr.c +++ b/src/H5HFhdr.c @@ -489,7 +489,7 @@ H5HF_hdr_create(H5F_t *f, hid_t dxpl_id, const H5HF_create_t *cparam) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, HADDR_UNDEF, "file allocation failed for fractal heap header") /* Cache the new fractal heap header */ - if(H5AC2_set(f, dxpl_id, H5AC2_FHEAP_HDR, hdr->heap_addr, (size_t)hdr->heap_size, hdr, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_set(f, dxpl_id, H5AC_FHEAP_HDR, hdr->heap_addr, (size_t)hdr->heap_size, hdr, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, HADDR_UNDEF, "can't add fractal heap header to cache") /* Set address of heap header to return */ @@ -529,7 +529,7 @@ H5HF_hdr_incr(H5HF_hdr_t *hdr) /* Mark header as un-evictable when a block is depending on it */ if(hdr->rc == 0) - if(H5AC2_pin_protected_entry(hdr) < 0) + if(H5AC_pin_protected_entry(hdr) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTPIN, FAIL, "unable to pin fractal heap header") /* Increment reference count on shared header */ @@ -570,7 +570,7 @@ H5HF_hdr_decr(H5HF_hdr_t *hdr) /* Mark header as evictable again when no child blocks depend on it */ if(hdr->rc == 0) { HDassert(hdr->file_rc == 0); - if(H5AC2_unpin_entry(hdr) < 0) + if(H5AC_unpin_entry(hdr) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPIN, FAIL, "unable to unpin fractal heap header") } /* end if */ @@ -661,12 +661,12 @@ H5HF_hdr_dirty(H5HF_hdr_t *hdr) /* Resize pinned header in cache if I/O filter is present. */ if(hdr->filter_len > 0) { - if(H5AC2_resize_pinned_entry(hdr, (size_t)hdr->heap_size) < 0) + if(H5AC_resize_pinned_entry(hdr, (size_t)hdr->heap_size) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTRESIZE, FAIL, "unable to resize fractal heap header") } /* end if */ /* Mark header as dirty in cache */ - if(H5AC2_mark_pinned_or_protected_entry_dirty(hdr) < 0) + if(H5AC_mark_pinned_or_protected_entry_dirty(hdr) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTMARKDIRTY, FAIL, "unable to mark fractal heap header as dirty") /* Set the dirty flags for the heap header */ @@ -1053,7 +1053,7 @@ H5HF_hdr_update_iter(H5HF_hdr_t *hdr, hid_t dxpl_id, size_t min_dblock_size) HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, FAIL, "can't allocate fractal heap indirect block") /* Lock new indirect block */ - if(NULL == (new_iblock = H5HF_man_iblock_protect(hdr, dxpl_id, new_iblock_addr, child_nrows, iblock, next_entry, FALSE, H5AC2_WRITE, &did_protect))) + if(NULL == (new_iblock = H5HF_man_iblock_protect(hdr, dxpl_id, new_iblock_addr, child_nrows, iblock, next_entry, FALSE, H5AC_WRITE, &did_protect))) HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap indirect block") /* Move iterator down one level (pins indirect block) */ @@ -1073,7 +1073,7 @@ H5HF_hdr_update_iter(H5HF_hdr_t *hdr, hid_t dxpl_id, size_t min_dblock_size) } /* end if */ /* Unprotect child indirect block */ - if(H5HF_man_iblock_unprotect(new_iblock, dxpl_id, H5AC2__NO_FLAGS_SET, did_protect) < 0) + if(H5HF_man_iblock_unprotect(new_iblock, dxpl_id, H5AC__NO_FLAGS_SET, did_protect) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap indirect block") } /* end else */ @@ -1247,7 +1247,7 @@ H5HF_hdr_reverse_iter(H5HF_hdr_t *hdr, hid_t dxpl_id, haddr_t dblock_addr) child_nrows = H5HF_dtable_size_to_rows(&hdr->man_dtable, hdr->man_dtable.row_block_size[row]); /* Lock child indirect block */ - if(NULL == (child_iblock = H5HF_man_iblock_protect(hdr, dxpl_id, iblock->ents[curr_entry].addr, child_nrows, iblock, curr_entry, FALSE, H5AC2_WRITE, &did_protect))) + if(NULL == (child_iblock = H5HF_man_iblock_protect(hdr, dxpl_id, iblock->ents[curr_entry].addr, child_nrows, iblock, curr_entry, FALSE, H5AC_WRITE, &did_protect))) HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap indirect block") /* Set the current location of the iterator */ @@ -1263,7 +1263,7 @@ H5HF_hdr_reverse_iter(H5HF_hdr_t *hdr, hid_t dxpl_id, haddr_t dblock_addr) curr_entry = (child_iblock->nrows * hdr->man_dtable.cparam.width) - 1; /* Unprotect child indirect block */ - if(H5HF_man_iblock_unprotect(child_iblock, dxpl_id, H5AC2__NO_FLAGS_SET, did_protect) < 0) + if(H5HF_man_iblock_unprotect(child_iblock, dxpl_id, H5AC__NO_FLAGS_SET, did_protect) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap indirect block") /* Note that we walked down */ @@ -1356,12 +1356,12 @@ H5HF_hdr_delete(H5HF_hdr_t *hdr, hid_t dxpl_id) unsigned hdr_status = 0; /* Heap header's status in the metadata cache */ /* Check the heap header's status in the metadata cache */ - if(H5AC2_get_entry_status(hdr->f, hdr->heap_addr, &hdr_status) < 0) + if(H5AC_get_entry_status(hdr->f, hdr->heap_addr, &hdr_status) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "unable to check metadata cache status for heap header") /* Sanity checks on heap header */ - HDassert(hdr_status & H5AC2_ES__IN_CACHE); - HDassert(hdr_status & H5AC2_ES__IS_PROTECTED); + HDassert(hdr_status & H5AC_ES__IN_CACHE); + HDassert(hdr_status & H5AC_ES__IS_PROTECTED); } /* end block */ #endif /* NDEBUG */ @@ -1414,13 +1414,13 @@ H5HF_hdr_delete(H5HF_hdr_t *hdr, hid_t dxpl_id) HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to release fractal heap header") /* Finished deleting header */ - if(H5AC2_unprotect(hdr->f, dxpl_id, H5AC2_FHEAP_HDR, hdr->heap_addr, (size_t)0, hdr, H5AC2__DIRTIED_FLAG|H5AC2__DELETED_FLAG) < 0) + if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_FHEAP_HDR, hdr->heap_addr, (size_t)0, hdr, H5AC__DIRTIED_FLAG|H5AC__DELETED_FLAG) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap header") hdr = NULL; done: /* Unprotect the header, if an error occurred */ - if(hdr && H5AC2_unprotect(hdr->f, dxpl_id, H5AC2_FHEAP_HDR, hdr->heap_addr, (size_t)0, hdr, H5AC2__NO_FLAGS_SET) < 0) + if(hdr && H5AC_unprotect(hdr->f, dxpl_id, H5AC_FHEAP_HDR, hdr->heap_addr, (size_t)0, hdr, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap header") FUNC_LEAVE_NOAPI(ret_value) diff --git a/src/H5HFiblock.c b/src/H5HFiblock.c index defda1f..1b4345e 100644 --- a/src/H5HFiblock.c +++ b/src/H5HFiblock.c @@ -115,7 +115,7 @@ H5HF_iblock_pin(H5HF_indirect_t *iblock) HDassert(iblock); /* Mark block as un-evictable */ - if(H5AC2_pin_protected_entry(iblock) < 0) + if(H5AC_pin_protected_entry(iblock) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTPIN, FAIL, "unable to pin fractal heap indirect block") /* If this indirect block has a parent, update it's child iblock pointer */ @@ -199,7 +199,7 @@ H5HF_iblock_unpin(H5HF_indirect_t *iblock) } /* end if */ /* Mark block as evictable again */ - if(H5AC2_unpin_entry(iblock) < 0) + if(H5AC_unpin_entry(iblock) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPIN, FAIL, "unable to unpin fractal heap indirect block") done: @@ -290,18 +290,18 @@ H5HF_iblock_decr(H5HF_indirect_t *iblock) /* Detach from parent indirect block */ if(iblock->parent) { /* Detach from parent indirect block */ - if(H5HF_man_iblock_detach(iblock->parent, H5AC2_dxpl_id, iblock->par_entry) < 0) + if(H5HF_man_iblock_detach(iblock->parent, H5AC_dxpl_id, iblock->par_entry) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTATTACH, FAIL, "can't detach from parent indirect block") iblock->parent = NULL; iblock->par_entry = 0; } /* end if */ /* Release space for indirect block on disk */ - if(H5MF_xfree(iblock->hdr->f, H5FD_MEM_FHEAP_IBLOCK, H5AC2_dxpl_id, iblock->addr, (hsize_t)iblock->size) < 0) + if(H5MF_xfree(iblock->hdr->f, H5FD_MEM_FHEAP_IBLOCK, H5AC_dxpl_id, iblock->addr, (hsize_t)iblock->size) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTFREE, FAIL, "unable to free fractal heap indirect block disk space") /* Evict the indirect block from the metadata cache */ - if(H5AC2_expunge_entry(iblock->hdr->f, H5AC2_dxpl_id, H5AC2_FHEAP_IBLOCK, iblock->addr) < 0) + if(H5AC_expunge_entry(iblock->hdr->f, H5AC_dxpl_id, H5AC_FHEAP_IBLOCK, iblock->addr) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTREMOVE, FAIL, "unable to remove indirect block from cache") } /* end if */ } /* end if */ @@ -335,7 +335,7 @@ H5HF_iblock_dirty(H5HF_indirect_t *iblock) HDassert(iblock); /* Mark indirect block as dirty in cache */ - if(H5AC2_mark_pinned_or_protected_entry_dirty(iblock) < 0) + if(H5AC_mark_pinned_or_protected_entry_dirty(iblock) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTMARKDIRTY, FAIL, "unable to mark fractal heap indirect block as dirty") done: @@ -394,7 +394,7 @@ H5HF_man_iblock_root_create(H5HF_hdr_t *hdr, hid_t dxpl_id, size_t min_dblock_si /* Move current direct block (used as root) into new indirect block */ /* Lock new indirect block */ - if(NULL == (iblock = H5HF_man_iblock_protect(hdr, dxpl_id, iblock_addr, nrows, NULL, 0, FALSE, H5AC2_WRITE, &did_protect))) + if(NULL == (iblock = H5HF_man_iblock_protect(hdr, dxpl_id, iblock_addr, nrows, NULL, 0, FALSE, H5AC_WRITE, &did_protect))) HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap indirect block") /* Check if there's already a direct block as root) */ @@ -403,7 +403,7 @@ H5HF_man_iblock_root_create(H5HF_hdr_t *hdr, hid_t dxpl_id, size_t min_dblock_si H5HF_direct_t *dblock; /* Pointer to direct block to query */ /* Lock first (root) direct block */ - if(NULL == (dblock = H5HF_man_dblock_protect(hdr, dxpl_id, hdr->man_dtable.table_addr, hdr->man_dtable.cparam.start_block_size, NULL, 0, H5AC2_WRITE))) + if(NULL == (dblock = H5HF_man_dblock_protect(hdr, dxpl_id, hdr->man_dtable.table_addr, hdr->man_dtable.cparam.start_block_size, NULL, 0, H5AC_WRITE))) HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap direct block") /* Attach direct block to new root indirect block */ @@ -424,7 +424,7 @@ H5HF_man_iblock_root_create(H5HF_hdr_t *hdr, hid_t dxpl_id, size_t min_dblock_si } /* end if */ /* Unlock first (previously the root) direct block */ - if(H5AC2_unprotect(hdr->f, dxpl_id, H5AC2_FHEAP_DBLOCK, hdr->man_dtable.table_addr, (size_t)0, dblock, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_unprotect(hdr->f, dxpl_id, H5AC_FHEAP_DBLOCK, hdr->man_dtable.table_addr, (size_t)0, dblock, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap direct block") dblock = NULL; } /* end if */ @@ -446,7 +446,7 @@ H5HF_man_iblock_root_create(H5HF_hdr_t *hdr, hid_t dxpl_id, size_t min_dblock_si HGOTO_ERROR(H5E_HEAP, H5E_CANTDIRTY, FAIL, "can't mark indirect block as dirty") /* Unprotect root indirect block (it's pinned by the iterator though) */ - if(H5HF_man_iblock_unprotect(iblock, dxpl_id, H5AC2__DIRTIED_FLAG, did_protect) < 0) + if(H5HF_man_iblock_unprotect(iblock, dxpl_id, H5AC__DIRTIED_FLAG, did_protect) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap indirect block") iblock = NULL; @@ -559,13 +559,13 @@ H5HF_man_iblock_root_double(H5HF_hdr_t *hdr, hid_t dxpl_id, size_t min_dblock_si /* Resize pinned indirect block in the cache, if its changed size */ if(old_iblock_size != iblock->size) { - if(H5AC2_resize_pinned_entry(iblock, (size_t)iblock->size) < 0) + if(H5AC_resize_pinned_entry(iblock, (size_t)iblock->size) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTRESIZE, FAIL, "unable to resize fractal heap indirect block") } /* end if */ /* Move object in cache, if it actually was relocated */ if(H5F_addr_ne(iblock->addr, new_addr)) { - if(H5AC2_rename(hdr->f, H5AC2_FHEAP_IBLOCK, iblock->addr, new_addr) < 0) + if(H5AC_rename(hdr->f, H5AC_FHEAP_IBLOCK, iblock->addr, new_addr) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTRENAME, FAIL, "unable to move fractal heap root indirect block") iblock->addr = new_addr; } /* end if */ @@ -718,13 +718,13 @@ H5HF_man_iblock_root_halve(H5HF_indirect_t *iblock, hid_t dxpl_id) /* Resize pinned indirect block in the cache, if it has changed size */ if(old_size != iblock->size) { - if(H5AC2_resize_pinned_entry(iblock, (size_t)iblock->size) < 0) + if(H5AC_resize_pinned_entry(iblock, (size_t)iblock->size) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTRESIZE, FAIL, "unable to resize fractal heap indirect block") } /* end if */ /* Move object in cache, if it actually was relocated */ if(H5F_addr_ne(iblock->addr, new_addr)) { - if(H5AC2_rename(hdr->f, H5AC2_FHEAP_IBLOCK, iblock->addr, new_addr) < 0) + if(H5AC_rename(hdr->f, H5AC_FHEAP_IBLOCK, iblock->addr, new_addr) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTSPLIT, FAIL, "unable to move fractal heap root indirect block") iblock->addr = new_addr; } /* end if */ @@ -812,7 +812,7 @@ H5HF_man_iblock_root_revert(H5HF_indirect_t *root_iblock, hid_t dxpl_id) dblock_size = hdr->man_dtable.cparam.start_block_size; /* Get pointer to last direct block */ - if(NULL == (dblock = H5HF_man_dblock_protect(hdr, dxpl_id, dblock_addr, dblock_size, root_iblock, 0, H5AC2_WRITE))) + if(NULL == (dblock = H5HF_man_dblock_protect(hdr, dxpl_id, dblock_addr, dblock_size, root_iblock, 0, H5AC_WRITE))) HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap direct block") HDassert(dblock->parent == root_iblock); HDassert(dblock->par_entry == 0); @@ -843,7 +843,7 @@ H5HF_man_iblock_root_revert(H5HF_indirect_t *root_iblock, hid_t dxpl_id) HGOTO_ERROR(H5E_HEAP, H5E_CANTEXTEND, FAIL, "can't increase space to cover root direct block") done: - if(dblock && H5AC2_unprotect(hdr->f, dxpl_id, H5AC2_FHEAP_DBLOCK, dblock_addr, (size_t)0, dblock, H5AC2__NO_FLAGS_SET) < 0) + if(dblock && H5AC_unprotect(hdr->f, dxpl_id, H5AC_FHEAP_DBLOCK, dblock_addr, (size_t)0, dblock, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap direct block") FUNC_LEAVE_NOAPI(ret_value) @@ -955,7 +955,7 @@ H5HF_man_iblock_create(H5HF_hdr_t *hdr, hid_t dxpl_id, H5HF_indirect_t *par_iblo HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for fractal heap indirect block") /* Reset the metadata cache info for the heap header */ - HDmemset(&iblock->cache_info, 0, sizeof(H5AC2_info_t)); + HDmemset(&iblock->cache_info, 0, sizeof(H5AC_info_t)); /* Share common heap information */ iblock->hdr = hdr; @@ -1033,7 +1033,7 @@ H5HF_man_iblock_create(H5HF_hdr_t *hdr, hid_t dxpl_id, H5HF_indirect_t *par_iblo iblock->max_child = 0; /* Cache the new indirect block */ - if(H5AC2_set(hdr->f, dxpl_id, H5AC2_FHEAP_IBLOCK, *addr_p, (size_t)iblock->size, iblock, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_set(hdr->f, dxpl_id, H5AC_FHEAP_IBLOCK, *addr_p, (size_t)iblock->size, iblock, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "can't add fractal heap indirect block to cache") done: @@ -1048,7 +1048,7 @@ done: /*------------------------------------------------------------------------- * Function: H5HF_man_iblock_protect * - * Purpose: Convenience wrapper around H5AC2_protect on an indirect block + * Purpose: Convenience wrapper around H5AC_protect on an indirect block * * Return: Pointer to indirect block on success, NULL on failure * @@ -1061,7 +1061,7 @@ done: H5HF_indirect_t * H5HF_man_iblock_protect(H5HF_hdr_t *hdr, hid_t dxpl_id, haddr_t iblock_addr, unsigned iblock_nrows, H5HF_indirect_t *par_iblock, unsigned par_entry, - hbool_t must_protect, H5AC2_protect_t rw, hbool_t *did_protect) + hbool_t must_protect, H5AC_protect_t rw, hbool_t *did_protect) { H5HF_parent_t par_info; /* Parent info for loading block */ H5HF_indirect_t *iblock = NULL; /* Indirect block from cache */ @@ -1128,7 +1128,7 @@ H5HF_man_iblock_protect(H5HF_hdr_t *hdr, hid_t dxpl_id, haddr_t iblock_addr, cache_udata.nrows = &iblock_nrows; /* Protect the indirect block */ - if(NULL == (iblock = H5AC2_protect(hdr->f, dxpl_id, H5AC2_FHEAP_IBLOCK, iblock_addr, H5HF_IBLOCK_SIZE(hdr, iblock_nrows), &cache_udata, rw))) + if(NULL == (iblock = H5AC_protect(hdr->f, dxpl_id, H5AC_FHEAP_IBLOCK, iblock_addr, H5HF_IBLOCK_SIZE(hdr, iblock_nrows), &cache_udata, rw))) HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, NULL, "unable to protect fractal heap indirect block") *did_protect = TRUE; } /* end if */ @@ -1146,7 +1146,7 @@ done: /*------------------------------------------------------------------------- * Function: H5HF_man_iblock_unprotect * - * Purpose: Convenience wrapper around H5AC2_unprotect on an indirect block + * Purpose: Convenience wrapper around H5AC_unprotect on an indirect block * * Return: SUCCEED/FAIL * @@ -1173,7 +1173,7 @@ H5HF_man_iblock_unprotect(H5HF_indirect_t *iblock, hid_t dxpl_id, /* (as opposed to using an existing pointer to a pinned child indirect block) */ if(did_protect) { /* Unprotect the indirect block */ - if(H5AC2_unprotect(iblock->hdr->f, dxpl_id, H5AC2_FHEAP_IBLOCK, iblock->addr, (size_t)0, iblock, cache_flags) < 0) + if(H5AC_unprotect(iblock->hdr->f, dxpl_id, H5AC_FHEAP_IBLOCK, iblock->addr, (size_t)0, iblock, cache_flags) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap indirect block") } /* end if */ @@ -1418,7 +1418,7 @@ H5HF_man_iblock_delete(H5HF_hdr_t *hdr, hid_t dxpl_id, haddr_t iblock_addr, HDassert(iblock_nrows > 0); /* Lock indirect block */ - if(NULL == (iblock = H5HF_man_iblock_protect(hdr, dxpl_id, iblock_addr, iblock_nrows, par_iblock, par_entry, TRUE, H5AC2_WRITE, &did_protect))) + if(NULL == (iblock = H5HF_man_iblock_protect(hdr, dxpl_id, iblock_addr, iblock_nrows, par_iblock, par_entry, TRUE, H5AC_WRITE, &did_protect))) HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap indirect block") HDassert(iblock->nchildren > 0); HDassert(did_protect == TRUE); @@ -1472,16 +1472,16 @@ H5HF_man_iblock_delete(H5HF_hdr_t *hdr, hid_t dxpl_id, haddr_t iblock_addr, unsigned iblock_status = 0; /* Indirect block's status in the metadata cache */ /* Check the indirect block's status in the metadata cache */ - if(H5AC2_get_entry_status(hdr->f, iblock_addr, &iblock_status) < 0) + if(H5AC_get_entry_status(hdr->f, iblock_addr, &iblock_status) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "unable to check metadata cache status for indirect block") /* Check if indirect block is pinned */ - HDassert(!(iblock_status & H5AC2_ES__IS_PINNED)); + HDassert(!(iblock_status & H5AC_ES__IS_PINNED)); } #endif /* NDEBUG */ /* Finished deleting indirect block in metadata cache */ - if(H5HF_man_iblock_unprotect(iblock, dxpl_id, H5AC2__DIRTIED_FLAG|H5AC2__DELETED_FLAG, did_protect) < 0) + if(H5HF_man_iblock_unprotect(iblock, dxpl_id, H5AC__DIRTIED_FLAG|H5AC__DELETED_FLAG, did_protect) < 0) HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap indirect block") iblock = NULL; @@ -1521,7 +1521,7 @@ H5HF_man_iblock_size(H5F_t *f, hid_t dxpl_id, H5HF_hdr_t *hdr, haddr_t iblock_ad HDassert(heap_size); /* Protect the indirect block */ - if(NULL == (iblock = H5HF_man_iblock_protect(hdr, dxpl_id, iblock_addr, nrows, par_iblock, par_entry, FALSE, H5AC2_READ, &did_protect))) + if(NULL == (iblock = H5HF_man_iblock_protect(hdr, dxpl_id, iblock_addr, nrows, par_iblock, par_entry, FALSE, H5AC_READ, &did_protect))) HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, FAIL, "unable to load fractal heap indirect block") /* Accumulate size of this indirect block */ @@ -1551,7 +1551,7 @@ H5HF_man_iblock_size(H5F_t *f, hid_t dxpl_id, H5HF_hdr_t *hdr, haddr_t iblock_ad done: /* Release the indirect block */ - if(iblock && H5HF_man_iblock_unprotect(iblock, dxpl_id, H5AC2__NO_FLAGS_SET, did_protect) < 0) + if(iblock && H5HF_man_iblock_unprotect(iblock, dxpl_id, H5AC__NO_FLAGS_SET, did_protect) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap indirect block") iblock = NULL; diff --git a/src/H5HFiter.c b/src/H5HFiter.c index d69e314..4dbb186 100644 --- a/src/H5HFiter.c +++ b/src/H5HFiter.c @@ -216,7 +216,7 @@ H5HF_man_iter_start_offset(H5HF_hdr_t *hdr, hid_t dxpl_id, } /* end else */ /* Load indirect block for this context location */ - if(NULL == (iblock = H5HF_man_iblock_protect(hdr, dxpl_id, iblock_addr, iblock_nrows, iblock_parent, iblock_par_entry, FALSE, H5AC2_WRITE, &did_protect))) + if(NULL == (iblock = H5HF_man_iblock_protect(hdr, dxpl_id, iblock_addr, iblock_nrows, iblock_parent, iblock_par_entry, FALSE, H5AC_WRITE, &did_protect))) HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap indirect block") /* Make indirect block the context for the current location */ @@ -227,7 +227,7 @@ H5HF_man_iter_start_offset(H5HF_hdr_t *hdr, hid_t dxpl_id, HGOTO_ERROR(H5E_HEAP, H5E_CANTINC, FAIL, "can't increment reference count on shared indirect block") /* Release the current indirect block */ - if(H5HF_man_iblock_unprotect(iblock, dxpl_id, H5AC2__NO_FLAGS_SET, did_protect) < 0) + if(H5HF_man_iblock_unprotect(iblock, dxpl_id, H5AC__NO_FLAGS_SET, did_protect) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap indirect block") iblock = NULL; diff --git a/src/H5HFman.c b/src/H5HFman.c index 09b13ec..add8efd 100644 --- a/src/H5HFman.c +++ b/src/H5HFman.c @@ -145,7 +145,7 @@ H5HF_man_insert(H5HF_hdr_t *hdr, hid_t dxpl_id, size_t obj_size, const void *obj HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't retrieve direct block information") /* Lock direct block */ - if(NULL == (dblock = H5HF_man_dblock_protect(hdr, dxpl_id, dblock_addr, dblock_size, sec_node->u.single.parent, sec_node->u.single.par_entry, H5AC2_WRITE))) + if(NULL == (dblock = H5HF_man_dblock_protect(hdr, dxpl_id, dblock_addr, dblock_size, sec_node->u.single.parent, sec_node->u.single.par_entry, H5AC_WRITE))) HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to load fractal heap direct block") /* Insert object into block */ @@ -187,7 +187,7 @@ H5HF_man_insert(H5HF_hdr_t *hdr, hid_t dxpl_id, size_t obj_size, const void *obj done: /* Release the direct block (marked as dirty) */ - if(dblock && H5AC2_unprotect(hdr->f, dxpl_id, H5AC2_FHEAP_DBLOCK, dblock_addr, (size_t)0, dblock, H5AC2__DIRTIED_FLAG) < 0) + if(dblock && H5AC_unprotect(hdr->f, dxpl_id, H5AC_FHEAP_DBLOCK, dblock_addr, (size_t)0, dblock, H5AC__DIRTIED_FLAG) < 0) HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap direct block") FUNC_LEAVE_NOAPI(ret_value) @@ -213,7 +213,7 @@ H5HF_man_op_real(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id, H5HF_operator_t op, void *op_data, unsigned op_flags) { H5HF_direct_t *dblock = NULL; /* Pointer to direct block to query */ - H5AC2_protect_t dblock_access; /* Access method for direct block */ + H5AC_protect_t dblock_access; /* Access method for direct block */ haddr_t dblock_addr; /* Direct block address */ size_t dblock_size; /* Direct block size */ unsigned dblock_cache_flags; /* Flags for unprotecting direct block */ @@ -234,12 +234,12 @@ H5HF_man_op_real(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id, /* Set the access mode for the direct block */ if(op_flags & H5HF_OP_MODIFY) { - dblock_access = H5AC2_WRITE; - dblock_cache_flags = H5AC2__DIRTIED_FLAG; + dblock_access = H5AC_WRITE; + dblock_cache_flags = H5AC__DIRTIED_FLAG; } /* end if */ else { - dblock_access = H5AC2_READ; - dblock_cache_flags = H5AC2__NO_FLAGS_SET; + dblock_access = H5AC_READ; + dblock_cache_flags = H5AC__NO_FLAGS_SET; } /* end else */ /* Skip over the flag byte */ @@ -275,7 +275,7 @@ H5HF_man_op_real(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id, unsigned entry; /* Entry of block */ /* Look up indirect block containing direct block */ - if(H5HF_man_dblock_locate(hdr, dxpl_id, obj_off, &iblock, &entry, &did_protect, H5AC2_READ) < 0) + if(H5HF_man_dblock_locate(hdr, dxpl_id, obj_off, &iblock, &entry, &did_protect, H5AC_READ) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTCOMPUTE, FAIL, "can't compute row & column of section") /* Set direct block info */ @@ -285,7 +285,7 @@ H5HF_man_op_real(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id, /* Check for offset of invalid direct block */ if(!H5F_addr_defined(dblock_addr)) { /* Unlock indirect block */ - if(H5HF_man_iblock_unprotect(iblock, dxpl_id, H5AC2__NO_FLAGS_SET, did_protect) < 0) + if(H5HF_man_iblock_unprotect(iblock, dxpl_id, H5AC__NO_FLAGS_SET, did_protect) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap indirect block") HGOTO_ERROR(H5E_HEAP, H5E_BADRANGE, FAIL, "fractal heap ID not in allocated direct block") @@ -294,14 +294,14 @@ H5HF_man_op_real(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id, /* Lock direct block */ if(NULL == (dblock = H5HF_man_dblock_protect(hdr, dxpl_id, dblock_addr, dblock_size, iblock, entry, dblock_access))) { /* Unlock indirect block */ - if(H5HF_man_iblock_unprotect(iblock, dxpl_id, H5AC2__NO_FLAGS_SET, did_protect) < 0) + if(H5HF_man_iblock_unprotect(iblock, dxpl_id, H5AC__NO_FLAGS_SET, did_protect) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap indirect block") HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap direct block") } /* end if */ /* Unlock indirect block */ - if(H5HF_man_iblock_unprotect(iblock, dxpl_id, H5AC2__NO_FLAGS_SET, did_protect) < 0) + if(H5HF_man_iblock_unprotect(iblock, dxpl_id, H5AC__NO_FLAGS_SET, did_protect) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap indirect block") iblock = NULL; } /* end else */ @@ -327,7 +327,7 @@ H5HF_man_op_real(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id, done: /* Unlock direct block */ - if(dblock && H5AC2_unprotect(hdr->f, dxpl_id, H5AC2_FHEAP_DBLOCK, dblock_addr, (size_t)0, dblock, dblock_cache_flags) < 0) + if(dblock && H5AC_unprotect(hdr->f, dxpl_id, H5AC_FHEAP_DBLOCK, dblock_addr, (size_t)0, dblock, dblock_cache_flags) < 0) HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap direct block") FUNC_LEAVE_NOAPI(ret_value) @@ -506,7 +506,7 @@ H5HF_man_remove(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id) } /* end if */ else { /* Look up indirect block containing direct block */ - if(H5HF_man_dblock_locate(hdr, dxpl_id, obj_off, &iblock, &dblock_entry, &did_protect, H5AC2_WRITE) < 0) + if(H5HF_man_dblock_locate(hdr, dxpl_id, obj_off, &iblock, &dblock_entry, &did_protect, H5AC_WRITE) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTCOMPUTE, FAIL, "can't compute row & column of section") /* Check for offset of invalid direct block */ @@ -541,7 +541,7 @@ H5HF_man_remove(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id) /* Unlock indirect block */ if(iblock) { - if(H5HF_man_iblock_unprotect(iblock, dxpl_id, H5AC2__NO_FLAGS_SET, did_protect) < 0) + if(H5HF_man_iblock_unprotect(iblock, dxpl_id, H5AC__NO_FLAGS_SET, did_protect) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap indirect block") iblock = NULL; } /* end if */ @@ -560,7 +560,7 @@ H5HF_man_remove(H5HF_hdr_t *hdr, hid_t dxpl_id, const uint8_t *id) done: if(ret_value < 0) { /* Unlock indirect block */ - if(iblock && H5HF_man_iblock_unprotect(iblock, dxpl_id, H5AC2__NO_FLAGS_SET, did_protect) < 0) + if(iblock && H5HF_man_iblock_unprotect(iblock, dxpl_id, H5AC__NO_FLAGS_SET, did_protect) < 0) HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap indirect block") } /* end if */ diff --git a/src/H5HFpkg.h b/src/H5HFpkg.h index 74324ef..41a8ffc 100644 --- a/src/H5HFpkg.h +++ b/src/H5HFpkg.h @@ -32,7 +32,7 @@ #include "H5HFprivate.h" /* Other private headers needed by this file */ -#include "H5AC2private.h" /* Metadata cache */ +#include "H5ACprivate.h" /* Metadata cache */ #include "H5B2private.h" /* v2 B-trees */ #include "H5FLprivate.h" /* Free Lists */ #include "H5FSprivate.h" /* File free space */ @@ -360,7 +360,7 @@ typedef struct H5HF_free_section_t { */ typedef struct H5HF_hdr_t { /* Information for H5AC cache functions, _must_ be first field in structure */ - H5AC2_info_t cache_info; + H5AC_info_t cache_info; /* General header information (stored in header) */ unsigned id_len; /* Size of heap IDs (in bytes) */ @@ -405,7 +405,7 @@ typedef struct H5HF_hdr_t { hbool_t dirty; /* Shared info is modified */ haddr_t heap_addr; /* Address of heap header in the file */ size_t heap_size; /* Size of heap header in the file */ - H5AC2_protect_t mode; /* Access mode for heap */ + H5AC_protect_t mode; /* Access mode for heap */ H5F_t *f; /* Pointer to file for heap */ size_t file_rc; /* Reference count of files using heap header */ hbool_t pending_delete; /* Heap is pending deletion */ @@ -439,7 +439,7 @@ typedef struct H5HF_indirect_filt_ent_t { /* Fractal heap indirect block */ struct H5HF_indirect_t { /* Information for H5AC cache functions, _must_ be first field in structure */ - H5AC2_info_t cache_info; + H5AC_info_t cache_info; /* Internal heap information (not stored) */ size_t rc; /* Reference count of objects using this block */ @@ -463,7 +463,7 @@ struct H5HF_indirect_t { /* A fractal heap direct block */ typedef struct H5HF_direct_t { /* Information for H5AC cache functions, _must_ be first field in structure */ - H5AC2_info_t cache_info; + H5AC_info_t cache_info; /* Internal heap information */ H5HF_hdr_t *hdr; /* Shared heap header info */ @@ -568,13 +568,13 @@ typedef struct H5HF_dblock_cache_ud_t { /*****************************/ /* H5HF header inherits cache-like properties from H5AC */ -H5_DLLVAR const H5AC2_class_t H5AC2_FHEAP_HDR[1]; +H5_DLLVAR const H5AC_class_t H5AC_FHEAP_HDR[1]; /* H5HF indirect block inherits cache-like properties from H5AC */ -H5_DLLVAR const H5AC2_class_t H5AC2_FHEAP_IBLOCK[1]; +H5_DLLVAR const H5AC_class_t H5AC_FHEAP_IBLOCK[1]; /* H5HF direct block inherits cache-like properties from H5AC */ -H5_DLLVAR const H5AC2_class_t H5AC2_FHEAP_DBLOCK[1]; +H5_DLLVAR const H5AC_class_t H5AC_FHEAP_DBLOCK[1]; /* The v2 B-tree class for tracking indirectly accessed 'huge' objects */ H5_DLLVAR const H5B2_class_t H5HF_BT2_INDIR[1]; @@ -679,7 +679,7 @@ H5_DLL herr_t H5HF_man_iblock_create(H5HF_hdr_t *hdr, hid_t dxpl_id, H5_DLL H5HF_indirect_t *H5HF_man_iblock_protect(H5HF_hdr_t *hdr, hid_t dxpl_id, haddr_t iblock_addr, unsigned iblock_nrows, H5HF_indirect_t *par_iblock, unsigned par_entry, hbool_t must_protect, - H5AC2_protect_t rw, hbool_t *did_protect); + H5AC_protect_t rw, hbool_t *did_protect); H5_DLL herr_t H5HF_man_iblock_unprotect(H5HF_indirect_t *iblock, hid_t dxpl_id, unsigned cache_flags, hbool_t did_protect); H5_DLL herr_t H5HF_man_iblock_attach(H5HF_indirect_t *iblock, unsigned entry, @@ -705,10 +705,10 @@ H5_DLL herr_t H5HF_man_dblock_destroy(H5HF_hdr_t *hdr, hid_t dxpl_id, H5_DLL H5HF_direct_t *H5HF_man_dblock_protect(H5HF_hdr_t *hdr, hid_t dxpl_id, haddr_t dblock_addr, size_t dblock_size, H5HF_indirect_t *par_iblock, unsigned par_entry, - H5AC2_protect_t rw); + H5AC_protect_t rw); H5_DLL herr_t H5HF_man_dblock_locate(H5HF_hdr_t *hdr, hid_t dxpl_id, hsize_t obj_off, H5HF_indirect_t **par_iblock, - unsigned *par_entry, hbool_t *par_did_protect, H5AC2_protect_t rw); + unsigned *par_entry, hbool_t *par_did_protect, H5AC_protect_t rw); H5_DLL herr_t H5HF_man_dblock_delete(H5F_t *f, hid_t dxpl_id, haddr_t dblock_addr, hsize_t dblock_size); H5_DLL herr_t H5HF_man_dblock_dest(H5HF_direct_t *dblock); diff --git a/src/H5HFsection.c b/src/H5HFsection.c index fd75a3b..680487c 100644 --- a/src/H5HFsection.c +++ b/src/H5HFsection.c @@ -561,7 +561,7 @@ H5HF_sect_single_locate_parent(H5HF_hdr_t *hdr, hid_t dxpl_id, hbool_t refresh, HDassert(sect); /* Look up indirect block containing direct blocks for range */ - if(H5HF_man_dblock_locate(hdr, dxpl_id, sect->sect_info.addr, &sec_iblock, &sec_entry, &did_protect, H5AC2_READ) < 0) + if(H5HF_man_dblock_locate(hdr, dxpl_id, sect->sect_info.addr, &sec_iblock, &sec_entry, &did_protect, H5AC_READ) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTCOMPUTE, FAIL, "can't compute row & column of section") /* Increment reference count on indirect block that free section is in */ @@ -582,7 +582,7 @@ H5HF_sect_single_locate_parent(H5HF_hdr_t *hdr, hid_t dxpl_id, hbool_t refresh, sect->u.single.par_entry = sec_entry; /* Unlock indirect block */ - if(H5HF_man_iblock_unprotect(sec_iblock, dxpl_id, H5AC2__NO_FLAGS_SET, did_protect) < 0) + if(H5HF_man_iblock_unprotect(sec_iblock, dxpl_id, H5AC__NO_FLAGS_SET, did_protect) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap indirect block") sec_iblock = NULL; @@ -821,7 +821,7 @@ H5HF_sect_single_full_dblock(H5HF_hdr_t *hdr, hid_t dxpl_id, hdr->man_dtable.curr_root_rows > 0) { H5HF_direct_t *dblock; /* Pointer to direct block for section */ - if(NULL == (dblock = H5HF_man_dblock_protect(hdr, dxpl_id, dblock_addr, dblock_size, sect->u.single.parent, sect->u.single.par_entry, H5AC2_WRITE))) + if(NULL == (dblock = H5HF_man_dblock_protect(hdr, dxpl_id, dblock_addr, dblock_size, sect->u.single.parent, sect->u.single.par_entry, H5AC_WRITE))) HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to load fractal heap direct block") HDassert(H5F_addr_eq(dblock->block_off + dblock_overhead, sect->sect_info.addr)); @@ -1139,7 +1139,7 @@ H5HF_sect_single_shrink(H5FS_section_info_t **_sect, void UNUSED *_udata) /* (should be a root direct block) */ HDassert(dblock_addr == hdr->man_dtable.table_addr); if(NULL == (dblock = H5HF_man_dblock_protect(hdr, dxpl_id, dblock_addr, - dblock_size, (*sect)->u.single.parent, (*sect)->u.single.par_entry, H5AC2_WRITE))) + dblock_size, (*sect)->u.single.parent, (*sect)->u.single.par_entry, H5AC_WRITE))) HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to load fractal heap direct block") HDassert(H5F_addr_eq(dblock->block_off + dblock_size, (*sect)->sect_info.addr + (*sect)->sect_info.size)); @@ -1242,7 +1242,7 @@ H5HF_sect_single_valid(const H5FS_section_class_t UNUSED *cls, const H5FS_sectio /* Retrieve direct block address from section */ /* (Casting away const OK - QAK) */ - status = H5HF_sect_single_dblock_info(iblock->hdr, H5AC2_dxpl_id, (H5HF_free_section_t *)sect, &dblock_addr, &dblock_size); + status = H5HF_sect_single_dblock_info(iblock->hdr, H5AC_dxpl_id, (H5HF_free_section_t *)sect, &dblock_addr, &dblock_size); HDassert(status >= 0); HDassert(H5F_addr_eq(iblock->ents[sect->u.single.par_entry].addr, dblock_addr)); HDassert(dblock_size > 0); @@ -1255,18 +1255,18 @@ H5HF_sect_single_valid(const H5FS_section_class_t UNUSED *cls, const H5FS_sectio HDassert((sect->sect_info.size + dblock_overhead) < dblock_size); /* Check the direct block's status in the metadata cache */ - status = H5AC2_get_entry_status(iblock->hdr->f, dblock_addr, &dblock_status); + status = H5AC_get_entry_status(iblock->hdr->f, dblock_addr, &dblock_status); HDassert(status >= 0); /* If the direct block for the section isn't already protected, * protect it here in order to check single section's sanity * against it. */ - if(!(dblock_status & H5AC2_ES__IS_PROTECTED)) { + if(!(dblock_status & H5AC_ES__IS_PROTECTED)) { H5HF_direct_t *dblock; /* Direct block for section */ /* Protect the direct block for the section */ - dblock = H5HF_man_dblock_protect(iblock->hdr, H5AC2_dxpl_id, dblock_addr, dblock_size, iblock, sect->u.single.par_entry, H5AC2_READ); + dblock = H5HF_man_dblock_protect(iblock->hdr, H5AC_dxpl_id, dblock_addr, dblock_size, iblock, sect->u.single.par_entry, H5AC_READ); HDassert(dblock); /* Sanity check settings for section */ @@ -1277,7 +1277,7 @@ H5HF_sect_single_valid(const H5FS_section_class_t UNUSED *cls, const H5FS_sectio (sect->sect_info.addr + sect->sect_info.size))); /* Release direct block */ - status = H5AC2_unprotect(iblock->hdr->f, H5AC2_dxpl_id, H5AC2_FHEAP_DBLOCK, dblock_addr, (size_t)0, dblock, H5AC2__NO_FLAGS_SET); + status = H5AC_unprotect(iblock->hdr->f, H5AC_dxpl_id, H5AC_FHEAP_DBLOCK, dblock_addr, (size_t)0, dblock, H5AC__NO_FLAGS_SET); HDassert(status >= 0); } /* end if */ } /* end if */ @@ -2588,7 +2588,7 @@ H5HF_sect_indirect_init_rows(H5HF_hdr_t *hdr, hid_t dxpl_id, /* If the child indirect block's address is defined, protect it */ if(H5F_addr_defined(child_iblock_addr)) { - if(NULL == (child_iblock = H5HF_man_iblock_protect(hdr, dxpl_id, child_iblock_addr, child_nrows, sect->u.indirect.u.iblock, curr_entry, FALSE, H5AC2_WRITE, &did_protect))) + if(NULL == (child_iblock = H5HF_man_iblock_protect(hdr, dxpl_id, child_iblock_addr, child_nrows, sect->u.indirect.u.iblock, curr_entry, FALSE, H5AC_WRITE, &did_protect))) HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to protect fractal heap indirect block") } /* end if */ else @@ -2611,7 +2611,7 @@ H5HF_sect_indirect_init_rows(H5HF_hdr_t *hdr, hid_t dxpl_id, /* If we have a valid child indirect block, release it now */ /* (will be pinned, if rows reference it) */ if(child_iblock) - if(H5HF_man_iblock_unprotect(child_iblock, dxpl_id, H5AC2__NO_FLAGS_SET, did_protect) < 0) + if(H5HF_man_iblock_unprotect(child_iblock, dxpl_id, H5AC__NO_FLAGS_SET, did_protect) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap indirect block") /* Attach child section to this section */ @@ -2816,7 +2816,7 @@ H5HF_sect_indirect_revive_row(H5HF_hdr_t *hdr, hid_t dxpl_id, H5HF_free_section_ HDassert(sect->sect_info.state == H5FS_SECT_SERIALIZED); /* Look up indirect block containing indirect blocks for section */ - if(H5HF_man_dblock_locate(hdr, dxpl_id, sect->sect_info.addr, &sec_iblock, NULL, &did_protect, H5AC2_READ) < 0) + if(H5HF_man_dblock_locate(hdr, dxpl_id, sect->sect_info.addr, &sec_iblock, NULL, &did_protect, H5AC_READ) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTCOMPUTE, FAIL, "can't compute row & column of section") /* Increment reference count on indirect block that free section is in */ @@ -2831,7 +2831,7 @@ H5HF_sect_indirect_revive_row(H5HF_hdr_t *hdr, hid_t dxpl_id, H5HF_free_section_ sect->u.indirect.u.iblock->max_rows; /* Unlock indirect block */ - if(H5HF_man_iblock_unprotect(sec_iblock, dxpl_id, H5AC2__NO_FLAGS_SET, did_protect) < 0) + if(H5HF_man_iblock_unprotect(sec_iblock, dxpl_id, H5AC__NO_FLAGS_SET, did_protect) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release fractal heap indirect block") sec_iblock = NULL; diff --git a/src/H5HG.c b/src/H5HG.c index 50b71eb..4f495f1 100644 --- a/src/H5HG.c +++ b/src/H5HG.c @@ -230,7 +230,7 @@ HDmemset(heap->chunk, 0, size); } /* Add the heap to the cache */ - if(H5AC2_set(f, dxpl_id, H5AC2_GHEAP, addr, (size_t)size, heap, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_set(f, dxpl_id, H5AC_GHEAP, addr, (size_t)size, heap, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, HADDR_UNDEF, "unable to cache global heap collection") ret_value = addr; @@ -357,7 +357,7 @@ H5HG_alloc (H5F_t *f, H5HG_heap_t *heap, size_t size, unsigned * heap_flags_ptr) } /* Mark the heap as dirty */ - *heap_flags_ptr |= H5AC2__DIRTIED_FLAG; + *heap_flags_ptr |= H5AC__DIRTIED_FLAG; /* Set the return value */ ret_value=idx; @@ -386,7 +386,7 @@ done: * * John Mainzer, 6/8/05 * Modified the function to use the new dirtied parameter of - * of H5AC2_unprotect() instead of modifying the is_dirty + * of H5AC_unprotect() instead of modifying the is_dirty * field of the cache info. * * In this case, that required adding the new heap_dirtied_ptr @@ -460,7 +460,7 @@ HDmemset(new_chunk + heap->size, 0, need); assert(H5HG_ISALIGNED(heap->obj[0].size)); /* Mark the heap as dirty */ - *heap_flags_ptr |= H5AC2__DIRTIED_FLAG; + *heap_flags_ptr |= H5AC__DIRTIED_FLAG; done: FUNC_LEAVE_NOAPI(ret_value) @@ -497,7 +497,7 @@ H5HG_insert(H5F_t *f, hid_t dxpl_id, size_t size, void *obj, H5HG_t *hobj/*out*/ size_t idx; haddr_t addr = HADDR_UNDEF; H5HG_heap_t *heap = NULL; - unsigned heap_flags = H5AC2__NO_FLAGS_SET; + unsigned heap_flags = H5AC__NO_FLAGS_SET; hbool_t found = FALSE; /* Flag to indicate a heap with enough space was found */ herr_t ret_value = SUCCEED; /* Return value */ @@ -591,7 +591,7 @@ H5HG_insert(H5F_t *f, hid_t dxpl_id, size_t size, void *obj, H5HG_t *hobj/*out*/ } /* end if */ } /* end else */ HDassert(H5F_addr_defined(addr)); - if(NULL == (heap = (H5HG_heap_t *)H5AC2_protect(f, dxpl_id, H5AC2_GHEAP, addr, (size_t)H5HG_SPEC_READ_SIZE, f, H5AC2_WRITE))) + if(NULL == (heap = (H5HG_heap_t *)H5AC_protect(f, dxpl_id, H5AC_GHEAP, addr, (size_t)H5HG_SPEC_READ_SIZE, f, H5AC_WRITE))) HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, FAIL, "unable to load heap") /* Split the free space to make room for the new object */ @@ -606,14 +606,14 @@ H5HG_insert(H5F_t *f, hid_t dxpl_id, size_t size, void *obj, H5HG_t *hobj/*out*/ need - (H5HG_SIZEOF_OBJHDR(f) + size)); #endif /* OLD_WAY */ } /* end if */ - heap_flags |= H5AC2__DIRTIED_FLAG; + heap_flags |= H5AC__DIRTIED_FLAG; /* Return value */ hobj->addr = heap->addr; hobj->idx = idx; done: - if(heap && H5AC2_unprotect(f, dxpl_id, H5AC2_GHEAP, heap->addr, (size_t)0, heap, heap_flags) < 0) + if(heap && H5AC_unprotect(f, dxpl_id, H5AC_GHEAP, heap->addr, (size_t)0, heap, heap_flags) < 0) HDONE_ERROR(H5E_HEAP, H5E_PROTECT, FAIL, "unable to unprotect heap.") FUNC_LEAVE_NOAPI(ret_value) @@ -653,7 +653,7 @@ H5HG_read(H5F_t *f, hid_t dxpl_id, H5HG_t *hobj, void *object/*out*/, HDassert(hobj); /* Load the heap */ - if(NULL == (heap = (H5HG_heap_t *)H5AC2_protect(f, dxpl_id, H5AC2_GHEAP, hobj->addr, (size_t)H5HG_SPEC_READ_SIZE, f, H5AC2_READ))) + if(NULL == (heap = (H5HG_heap_t *)H5AC_protect(f, dxpl_id, H5AC_GHEAP, hobj->addr, (size_t)H5HG_SPEC_READ_SIZE, f, H5AC_READ))) HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, NULL, "unable to load heap") HDassert(hobj->idx < heap->nused); @@ -667,7 +667,7 @@ H5HG_read(H5F_t *f, hid_t dxpl_id, H5HG_t *hobj, void *object/*out*/, /* * Advance the heap in the CWFS list. We might have done this already - * with the H5AC2_protect(), but it won't hurt to do it twice. + * with the H5AC_protect(), but it won't hurt to do it twice. */ if(heap->obj[0].begin) { int i; @@ -690,7 +690,7 @@ H5HG_read(H5F_t *f, hid_t dxpl_id, H5HG_t *hobj, void *object/*out*/, ret_value = object; done: - if(heap && H5AC2_unprotect(f, dxpl_id, H5AC2_GHEAP, hobj->addr, (size_t)0, heap, H5AC2__NO_FLAGS_SET) < 0) + if(heap && H5AC_unprotect(f, dxpl_id, H5AC_GHEAP, hobj->addr, (size_t)0, heap, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_HEAP, H5E_PROTECT, NULL, "unable to release object header") FUNC_LEAVE_NOAPI(ret_value) @@ -717,7 +717,7 @@ done: * * John Mainzer - 6/8/05 * Modified function to use the dirtied parameter of - * H5AC2_unprotect() instead of modifying the is_dirty + * H5AC_unprotect() instead of modifying the is_dirty * field of the cache info. * *------------------------------------------------------------------------- @@ -726,7 +726,7 @@ int H5HG_link (H5F_t *f, hid_t dxpl_id, const H5HG_t *hobj, int adjust) { H5HG_heap_t *heap = NULL; - unsigned heap_flags = H5AC2__NO_FLAGS_SET; + unsigned heap_flags = H5AC__NO_FLAGS_SET; int ret_value; /* Return value */ FUNC_ENTER_NOAPI(H5HG_link, FAIL); @@ -739,7 +739,7 @@ H5HG_link (H5F_t *f, hid_t dxpl_id, const H5HG_t *hobj, int adjust) if(adjust!=0) { /* Load the heap */ - if (NULL == (heap = (H5HG_heap_t *)H5AC2_protect(f, dxpl_id, H5AC2_GHEAP, hobj->addr, (size_t)H5HG_SPEC_READ_SIZE, f, H5AC2_WRITE))) + if (NULL == (heap = (H5HG_heap_t *)H5AC_protect(f, dxpl_id, H5AC_GHEAP, hobj->addr, (size_t)H5HG_SPEC_READ_SIZE, f, H5AC_WRITE))) HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, FAIL, "unable to load heap") assert (hobj->idxnused); @@ -749,14 +749,14 @@ H5HG_link (H5F_t *f, hid_t dxpl_id, const H5HG_t *hobj, int adjust) if (heap->obj[hobj->idx].nrefs+adjust>H5HG_MAXLINK) HGOTO_ERROR (H5E_HEAP, H5E_BADVALUE, FAIL, "new link count would be out of range") heap->obj[hobj->idx].nrefs += adjust; - heap_flags |= H5AC2__DIRTIED_FLAG; + heap_flags |= H5AC__DIRTIED_FLAG; } /* end if */ /* Set return value */ ret_value=heap->obj[hobj->idx].nrefs; done: - if(heap && H5AC2_unprotect(f, dxpl_id, H5AC2_GHEAP, hobj->addr, (size_t)0, heap, heap_flags) < 0) + if(heap && H5AC_unprotect(f, dxpl_id, H5AC_GHEAP, hobj->addr, (size_t)0, heap, heap_flags) < 0) HDONE_ERROR(H5E_HEAP, H5E_PROTECT, FAIL, "unable to release object header") FUNC_LEAVE_NOAPI(ret_value); @@ -777,7 +777,7 @@ done: * * John Mainzer - 6/8/05 * Modified function to use the dirtied parameter of - * H5AC2_unprotect() instead of modifying the is_dirty + * H5AC_unprotect() instead of modifying the is_dirty * field of the cache info. * *------------------------------------------------------------------------- @@ -789,7 +789,7 @@ H5HG_remove (H5F_t *f, hid_t dxpl_id, H5HG_t *hobj) uint8_t *p = NULL, *obj_start = NULL; size_t need; unsigned u; - unsigned flags = H5AC2__NO_FLAGS_SET;/* Whether the heap gets deleted */ + unsigned flags = H5AC__NO_FLAGS_SET;/* Whether the heap gets deleted */ herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI(H5HG_remove, FAIL); @@ -801,7 +801,7 @@ H5HG_remove (H5F_t *f, hid_t dxpl_id, H5HG_t *hobj) HGOTO_ERROR(H5E_HEAP, H5E_WRITEERROR, FAIL, "no write intent on file") /* Load the heap */ - if(NULL == (heap = (H5HG_heap_t *)H5AC2_protect(f, dxpl_id, H5AC2_GHEAP, hobj->addr, (size_t)H5HG_SPEC_READ_SIZE, f, H5AC2_WRITE))) + if(NULL == (heap = (H5HG_heap_t *)H5AC_protect(f, dxpl_id, H5AC_GHEAP, hobj->addr, (size_t)H5HG_SPEC_READ_SIZE, f, H5AC_WRITE))) HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, FAIL, "unable to load heap") HDassert(hobj->idx < heap->nused); @@ -831,7 +831,7 @@ H5HG_remove (H5F_t *f, hid_t dxpl_id, H5HG_t *hobj) H5F_ENCODE_LENGTH (f, p, heap->obj[0].size); } /* end if */ HDmemset(heap->obj + hobj->idx, 0, sizeof(H5HG_obj_t)); - flags |= H5AC2__DIRTIED_FLAG; + flags |= H5AC__DIRTIED_FLAG; if((heap->obj[0].size + H5HG_SIZEOF_HDR(f)) == heap->size) { /* @@ -840,14 +840,14 @@ H5HG_remove (H5F_t *f, hid_t dxpl_id, H5HG_t *hobj) */ H5_CHECK_OVERFLOW(heap->size, size_t, hsize_t); H5MF_xfree(f, H5FD_MEM_GHEAP, dxpl_id, heap->addr, (hsize_t)heap->size); - flags |= H5AC2__DELETED_FLAG; /* Indicate that the object was deleted, for the unprotect call */ + flags |= H5AC__DELETED_FLAG; /* Indicate that the object was deleted, for the unprotect call */ } /* end if */ else { int i; /* Local index variable */ /* * If the heap is in the CWFS list then advance it one position. The - * H5AC2_protect() might have done that too, but that's okay. If the + * H5AC_protect() might have done that too, but that's okay. If the * heap isn't on the CWFS list then add it to the end. */ for(i = 0; i < f->shared->ncwfs; i++) @@ -865,7 +865,7 @@ H5HG_remove (H5F_t *f, hid_t dxpl_id, H5HG_t *hobj) } /* end else */ done: - if(heap && H5AC2_unprotect(f, dxpl_id, H5AC2_GHEAP, hobj->addr, (size_t)0, heap, flags) < 0) + if(heap && H5AC_unprotect(f, dxpl_id, H5AC_GHEAP, hobj->addr, (size_t)0, heap, flags) < 0) HDONE_ERROR(H5E_HEAP, H5E_PROTECT, FAIL, "unable to release object header") FUNC_LEAVE_NOAPI(ret_value); diff --git a/src/H5HGcache.c b/src/H5HGcache.c index 9938c32..c99f97c 100755 --- a/src/H5HGcache.c +++ b/src/H5HGcache.c @@ -76,10 +76,10 @@ static herr_t H5HG_free_icr(haddr_t addr, size_t len, void *thing); /*********************/ /* - * H5HG inherits cache-like properties from H5AC2 + * H5HG inherits cache-like properties from H5AC */ -const H5AC2_class_t H5AC2_GHEAP[1] = {{ - H5AC2_GHEAP_ID, +const H5AC_class_t H5AC_GHEAP[1] = {{ + H5AC_GHEAP_ID, "global heap", H5FD_MEM_GHEAP, H5HG_deserialize, @@ -329,7 +329,7 @@ H5HG_serialize(const H5F_t *f, hid_t UNUSED dxpl_id, haddr_t UNUSED addr, *new_len = heap->size; /* specify in flags that image has been resized */ - *flags = H5AC2__SERIALIZE_RESIZED_FLAG; + *flags = H5AC__SERIALIZE_RESIZED_FLAG; } /* end if */ else { /* copy the heap->chunk into the image buffer */ diff --git a/src/H5HGdbg.c b/src/H5HGdbg.c index 91e0f1e..22b6008d 100644 --- a/src/H5HGdbg.c +++ b/src/H5HGdbg.c @@ -22,7 +22,7 @@ #include "H5private.h" /* Generic Functions */ -#include "H5AC2private.h" /* Metadata cache */ +#include "H5ACprivate.h" /* Metadata cache */ #include "H5Eprivate.h" /* Error handling */ #include "H5HGpkg.h" /* Global heaps */ #include "H5Iprivate.h" /* ID Functions */ @@ -48,7 +48,7 @@ * * John Mainzer, 6/17/05 * Modified the function to use the new dirtied parameter of - * of H5AC2_unprotect() instead of modifying the is_dirty + * of H5AC_unprotect() instead of modifying the is_dirty * field of the cache info. * *------------------------------------------------------------------------- @@ -73,7 +73,7 @@ H5HG_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, assert(indent >= 0); assert(fwidth >= 0); - if (NULL == (h = (H5HG_heap_t *)H5AC2_protect(f, dxpl_id, H5AC2_GHEAP, addr, fwidth, f, H5AC2_READ))) + if (NULL == (h = (H5HG_heap_t *)H5AC_protect(f, dxpl_id, H5AC_GHEAP, addr, fwidth, f, H5AC_READ))) HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, FAIL, "unable to load global heap collection"); fprintf(stream, "%*sGlobal Heap Collection...\n", indent, ""); @@ -135,7 +135,7 @@ H5HG_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, } done: - if (h && H5AC2_unprotect(f, dxpl_id, H5AC2_GHEAP, addr, (size_t)0, h, H5AC2__NO_FLAGS_SET) < 0) + if (h && H5AC_unprotect(f, dxpl_id, H5AC_GHEAP, addr, (size_t)0, h, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_HEAP, H5E_PROTECT, FAIL, "unable to release object header"); FUNC_LEAVE_NOAPI(ret_value); diff --git a/src/H5HGpkg.h b/src/H5HGpkg.h index 0e34d57..d83d618 100644 --- a/src/H5HGpkg.h +++ b/src/H5HGpkg.h @@ -32,7 +32,7 @@ #include "H5HGprivate.h" /* Other private headers needed by this file */ -#include "H5AC2private.h" /* Metadata cache */ +#include "H5ACprivate.h" /* Metadata cache */ #include "H5FLprivate.h" /* Free lists */ #define H5F_PACKAGE @@ -43,7 +43,7 @@ /*****************************/ /* The cache subclass */ -H5_DLLVAR const H5AC2_class_t H5AC2_GHEAP[1]; +H5_DLLVAR const H5AC_class_t H5AC_GHEAP[1]; /* Declare extern the free list to manage the H5HG_t struct */ H5FL_EXTERN(H5HG_heap_t); @@ -132,7 +132,7 @@ typedef struct H5HG_obj_t { } H5HG_obj_t; struct H5HG_heap_t { - H5AC2_info_t cache_info; /* Information for H5AC2 cache functions, _must_ be */ + H5AC_info_t cache_info; /* Information for H5AC cache functions, _must_ be */ /* first field in structure */ haddr_t addr; /*collection address */ size_t size; /*total size of collection */ diff --git a/src/H5HL.c b/src/H5HL.c index bcb62eb..5090c4d 100644 --- a/src/H5HL.c +++ b/src/H5HL.c @@ -169,7 +169,7 @@ H5HL_create(H5F_t *f, hid_t dxpl_id, size_t size_hint, haddr_t *addr_p/*out*/) HGOTO_ERROR(H5E_HEAP, H5E_CANTALLOC, FAIL, "memory allocation failed") /* Add to cache */ - if(H5AC2_set(f, dxpl_id, H5AC2_LHEAP_PRFX, heap->prfx_addr, (size_t)total_size, prfx, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_set(f, dxpl_id, H5AC_LHEAP_PRFX, heap->prfx_addr, (size_t)total_size, prfx, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "unable to cache local heap prefix") /* Set address to return */ @@ -244,7 +244,7 @@ H5HL_dblk_realloc(H5F_t *f, hid_t dxpl_id, H5HL_t *heap, size_t new_heap_size) HDassert(heap->prfx); /* Resize the heap prefix in the cache */ - if(H5AC2_resize_pinned_entry(heap->prfx, (size_t)(heap->prfx_size + new_heap_size)) < 0) + if(H5AC_resize_pinned_entry(heap->prfx, (size_t)(heap->prfx_size + new_heap_size)) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTRESIZE, FAIL, "unable to resize heap in cache") } /* end if */ else { @@ -253,7 +253,7 @@ H5HL_dblk_realloc(H5F_t *f, hid_t dxpl_id, H5HL_t *heap, size_t new_heap_size) HDassert(heap->dblk); /* Resize the heap data block in the cache */ - if(H5AC2_resize_pinned_entry(heap->dblk, (size_t)new_heap_size) < 0) + if(H5AC_resize_pinned_entry(heap->dblk, (size_t)new_heap_size) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTRESIZE, FAIL, "unable to resize heap in cache") } /* end else */ } /* end if */ @@ -266,11 +266,11 @@ H5HL_dblk_realloc(H5F_t *f, hid_t dxpl_id, H5HL_t *heap, size_t new_heap_size) /* Resize current heap prefix */ heap->prfx_size = H5HL_SIZEOF_HDR(f); - if(H5AC2_resize_pinned_entry(heap->prfx, (size_t)heap->prfx_size) < 0) + if(H5AC_resize_pinned_entry(heap->prfx, (size_t)heap->prfx_size) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTRESIZE, FAIL, "unable to resize heap prefix in cache") /* Insert data block into cache (pinned) */ - if(H5AC2_set(f, dxpl_id, H5AC2_LHEAP_DBLK, new_addr, (size_t)new_heap_size, dblk, H5AC2__PIN_ENTRY_FLAG) < 0) + if(H5AC_set(f, dxpl_id, H5AC_LHEAP_DBLK, new_addr, (size_t)new_heap_size, dblk, H5AC__PIN_ENTRY_FLAG) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTINIT, FAIL, "unable to cache local heap data block") dblk = NULL; @@ -282,11 +282,11 @@ H5HL_dblk_realloc(H5F_t *f, hid_t dxpl_id, H5HL_t *heap, size_t new_heap_size) /* (ignore [unlikely] case where heap data block ends up * contiguous w/heap prefix again. */ - if(H5AC2_resize_pinned_entry(heap->dblk, (size_t)new_heap_size) < 0) + if(H5AC_resize_pinned_entry(heap->dblk, (size_t)new_heap_size) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTRESIZE, FAIL, "unable to resize heap data block in cache") /* Relocate the heap data block in the cache */ - if(H5AC2_rename(f, H5AC2_LHEAP_DBLK, old_addr, new_addr) < 0) + if(H5AC_rename(f, H5AC_LHEAP_DBLK, old_addr, new_addr) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTRENAME, FAIL, "unable to move heap data block in cache") } /* end else */ } /* end else */ @@ -425,7 +425,7 @@ done: /*------------------------------------------------------------------------- * Function: H5HL_protect * - * Purpose: This function is a wrapper for the H5AC2_protect call. + * Purpose: This function is a wrapper for the H5AC_protect call. * * Return: Success: Non-NULL pointer to the local heap prefix. * Failure: NULL @@ -437,14 +437,14 @@ done: *------------------------------------------------------------------------- */ H5HL_t * -H5HL_protect(H5F_t *f, hid_t dxpl_id, haddr_t addr, H5AC2_protect_t rw) +H5HL_protect(H5F_t *f, hid_t dxpl_id, haddr_t addr, H5AC_protect_t rw) { H5HL_cache_prfx_ud_t prfx_udata; /* User data for protecting local heap prefix */ H5HL_prfx_t *prfx = NULL; /* Local heap prefix */ H5HL_dblk_t *dblk = NULL; /* Local heap data block */ H5HL_t *heap; /* Heap data structure */ - unsigned prfx_cache_flags = H5AC2__NO_FLAGS_SET; /* Cache flags for unprotecting prefix entry */ - unsigned dblk_cache_flags = H5AC2__NO_FLAGS_SET; /* Cache flags for unprotecting data block entry */ + unsigned prfx_cache_flags = H5AC__NO_FLAGS_SET; /* Cache flags for unprotecting prefix entry */ + unsigned dblk_cache_flags = H5AC__NO_FLAGS_SET; /* Cache flags for unprotecting data block entry */ H5HL_t *ret_value; /* Return value */ FUNC_ENTER_NOAPI(H5HL_protect, NULL) @@ -462,7 +462,7 @@ H5HL_protect(H5F_t *f, hid_t dxpl_id, haddr_t addr, H5AC2_protect_t rw) prfx_udata.free_block = H5HL_FREE_NULL; /* Protect the local heap prefix */ - if(NULL == (prfx = (H5HL_prfx_t *)H5AC2_protect(f, dxpl_id, H5AC2_LHEAP_PRFX, addr, H5HL_SPEC_READ_SIZE, &prfx_udata, rw))) + if(NULL == (prfx = (H5HL_prfx_t *)H5AC_protect(f, dxpl_id, H5AC_LHEAP_PRFX, addr, H5HL_SPEC_READ_SIZE, &prfx_udata, rw))) HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, NULL, "unable to load heap prefix") /* Get the pointer to the heap */ @@ -474,7 +474,7 @@ H5HL_protect(H5F_t *f, hid_t dxpl_id, haddr_t addr, H5AC2_protect_t rw) /* Check if heap has separate data block */ if(heap->single_cache_obj) { /* Set the flag for pinning the prefix when unprotecting it */ - prfx_cache_flags |= H5AC2__PIN_ENTRY_FLAG; + prfx_cache_flags |= H5AC__PIN_ENTRY_FLAG; } /* end if */ else { H5HL_cache_dblk_ud_t dblk_udata; /* User data for protecting local heap data block */ @@ -486,15 +486,15 @@ H5HL_protect(H5F_t *f, hid_t dxpl_id, haddr_t addr, H5AC2_protect_t rw) dblk_udata.loaded = FALSE; /* Protect the local heap data block */ - if(NULL == (dblk = (H5HL_dblk_t *)H5AC2_protect(f, dxpl_id, H5AC2_LHEAP_DBLK, heap->dblk_addr, heap->dblk_size, &dblk_udata, rw))) + if(NULL == (dblk = (H5HL_dblk_t *)H5AC_protect(f, dxpl_id, H5AC_LHEAP_DBLK, heap->dblk_addr, heap->dblk_size, &dblk_udata, rw))) HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, NULL, "unable to load heap data block") /* Pin the prefix, if the data block was loaded from file */ if(dblk_udata.loaded) - prfx_cache_flags |= H5AC2__PIN_ENTRY_FLAG; + prfx_cache_flags |= H5AC__PIN_ENTRY_FLAG; /* Set the flag for pinning the data block when unprotecting it */ - dblk_cache_flags |= H5AC2__PIN_ENTRY_FLAG; + dblk_cache_flags |= H5AC__PIN_ENTRY_FLAG; } /* end if */ } /* end if */ @@ -506,11 +506,11 @@ H5HL_protect(H5F_t *f, hid_t dxpl_id, haddr_t addr, H5AC2_protect_t rw) done: /* Release the prefix from the cache, now pinned */ - if(prfx && H5AC2_unprotect(f, dxpl_id, H5AC2_LHEAP_PRFX, heap->prfx_addr, (size_t)0, prfx, prfx_cache_flags) < 0) + if(prfx && H5AC_unprotect(f, dxpl_id, H5AC_LHEAP_PRFX, heap->prfx_addr, (size_t)0, prfx, prfx_cache_flags) < 0) HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, NULL, "unable to release local heap prefix") /* Release the data block from the cache, now pinned */ - if(dblk && H5AC2_unprotect(f, dxpl_id, H5AC2_LHEAP_DBLK, heap->dblk_addr, (size_t)0, dblk, dblk_cache_flags) < 0) + if(dblk && H5AC_unprotect(f, dxpl_id, H5AC_LHEAP_DBLK, heap->dblk_addr, (size_t)0, dblk, dblk_cache_flags) < 0) HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, NULL, "unable to release local heap data block") FUNC_LEAVE_NOAPI(ret_value) @@ -581,7 +581,7 @@ H5HL_unprotect(H5HL_t *heap) /* Check for separate heap data block */ if(heap->single_cache_obj) { /* Mark local heap prefix as evictable again */ - if(H5AC2_unpin_entry(heap->prfx) < 0) + if(H5AC_unpin_entry(heap->prfx) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPIN, FAIL, "unable to unpin local heap data block") } /* end if */ else { @@ -590,7 +590,7 @@ H5HL_unprotect(H5HL_t *heap) /* Mark local heap data block as evictable again */ /* (data block still pins prefix) */ - if(H5AC2_unpin_entry(heap->dblk) < 0) + if(H5AC_unpin_entry(heap->dblk) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPIN, FAIL, "unable to unpin local heap data block") } /* end else */ } /* end if */ @@ -661,12 +661,12 @@ H5HL_dirty(H5HL_t *heap) /* Sanity check */ HDassert(heap->dblk); - if(H5AC2_mark_pinned_or_protected_entry_dirty(heap->dblk) < 0) + if(H5AC_mark_pinned_or_protected_entry_dirty(heap->dblk) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTMARKDIRTY, FAIL, "unable to mark heap data block as dirty") } /* end if */ /* Mark heap prefix as dirty */ - if(H5AC2_mark_pinned_or_protected_entry_dirty(heap->prfx) < 0) + if(H5AC_mark_pinned_or_protected_entry_dirty(heap->prfx) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTMARKDIRTY, FAIL, "unable to mark heap prefix as dirty") done: @@ -794,12 +794,12 @@ H5HL_insert(H5F_t *f, hid_t dxpl_id, H5HL_t *heap, size_t buf_size, const void * /* Check for prefix & data block contiguous */ if(heap->single_cache_obj) { /* Resize prefix+data block */ - if(H5AC2_resize_pinned_entry(heap->prfx, (size_t)(heap->prfx_size + new_dblk_size)) < 0) + if(H5AC_resize_pinned_entry(heap->prfx, (size_t)(heap->prfx_size + new_dblk_size)) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTRESIZE, UFAIL, "unable to resize heap prefix in cache") } /* end if */ else { /* Resize 'standalone' data block */ - if(H5AC2_resize_pinned_entry(heap->dblk, (size_t)new_dblk_size) < 0) + if(H5AC_resize_pinned_entry(heap->dblk, (size_t)new_dblk_size) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTRESIZE, UFAIL, "unable to resize heap data block in cache") } /* end else */ @@ -1065,7 +1065,7 @@ H5HL_delete(H5F_t *f, hid_t dxpl_id, haddr_t addr) H5HL_prfx_t *prfx = NULL; /* Local heap prefix */ H5HL_dblk_t *dblk = NULL; /* Local heap data block */ H5HL_t *heap; /* Heap data structure */ - unsigned cache_flags = H5AC2__NO_FLAGS_SET; /* Cache flags for unprotecting entries */ + unsigned cache_flags = H5AC__NO_FLAGS_SET; /* Cache flags for unprotecting entries */ herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI(H5HL_delete, FAIL) @@ -1083,7 +1083,7 @@ H5HL_delete(H5F_t *f, hid_t dxpl_id, haddr_t addr) prfx_udata.free_block = H5HL_FREE_NULL; /* Protect the local heap prefix */ - if(NULL == (prfx = (H5HL_prfx_t *)H5AC2_protect(f, dxpl_id, H5AC2_LHEAP_PRFX, addr, H5HL_SPEC_READ_SIZE, &prfx_udata, H5AC2_WRITE))) + if(NULL == (prfx = (H5HL_prfx_t *)H5AC_protect(f, dxpl_id, H5AC_LHEAP_PRFX, addr, H5HL_SPEC_READ_SIZE, &prfx_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to load heap prefix") /* Get the pointer to the heap */ @@ -1100,12 +1100,12 @@ H5HL_delete(H5F_t *f, hid_t dxpl_id, haddr_t addr) dblk_udata.loaded = FALSE; /* Protect the local heap data block */ - if(NULL == (dblk = (H5HL_dblk_t *)H5AC2_protect(f, dxpl_id, H5AC2_LHEAP_DBLK, heap->dblk_addr, heap->dblk_size, &dblk_udata, H5AC2_WRITE))) + if(NULL == (dblk = (H5HL_dblk_t *)H5AC_protect(f, dxpl_id, H5AC_LHEAP_DBLK, heap->dblk_addr, heap->dblk_size, &dblk_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to load heap data block") /* Pin the prefix, if the data block was loaded from file */ if(dblk_udata.loaded) { - if(H5AC2_pin_protected_entry(prfx) < 0) + if(H5AC_pin_protected_entry(prfx) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTPIN, FAIL, "unable to pin local heap prefix") } /* end if */ } /* end if */ @@ -1130,15 +1130,15 @@ H5HL_delete(H5F_t *f, hid_t dxpl_id, haddr_t addr) } /* end else */ /* Set the flags for releasing the prefix and data block */ - cache_flags |= H5AC2__DIRTIED_FLAG | H5AC2__DELETED_FLAG; + cache_flags |= H5AC__DIRTIED_FLAG | H5AC__DELETED_FLAG; done: /* Release the data block from the cache, now deleted */ - if(dblk && H5AC2_unprotect(f, dxpl_id, H5AC2_LHEAP_DBLK, heap->dblk_addr, (size_t)0, dblk, cache_flags) < 0) + if(dblk && H5AC_unprotect(f, dxpl_id, H5AC_LHEAP_DBLK, heap->dblk_addr, (size_t)0, dblk, cache_flags) < 0) HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release local heap data block") /* Release the prefix from the cache, now deleted */ - if(prfx && H5AC2_unprotect(f, dxpl_id, H5AC2_LHEAP_PRFX, heap->prfx_addr, (size_t)0, prfx, cache_flags) < 0) + if(prfx && H5AC_unprotect(f, dxpl_id, H5AC_LHEAP_PRFX, heap->prfx_addr, (size_t)0, prfx, cache_flags) < 0) HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release local heap prefix") FUNC_LEAVE_NOAPI(ret_value) @@ -1182,7 +1182,7 @@ H5HL_get_size(H5F_t *f, hid_t dxpl_id, haddr_t addr, size_t *size) prfx_udata.free_block = H5HL_FREE_NULL; /* Protect the local heap prefix */ - if(NULL == (prfx = (H5HL_prfx_t *)H5AC2_protect(f, dxpl_id, H5AC2_LHEAP_PRFX, addr, H5HL_SPEC_READ_SIZE, &prfx_udata, H5AC2_READ))) + if(NULL == (prfx = (H5HL_prfx_t *)H5AC_protect(f, dxpl_id, H5AC_LHEAP_PRFX, addr, H5HL_SPEC_READ_SIZE, &prfx_udata, H5AC_READ))) HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to load heap prefix") /* Get the pointer to the heap */ @@ -1192,7 +1192,7 @@ H5HL_get_size(H5F_t *f, hid_t dxpl_id, haddr_t addr, size_t *size) *size = heap->dblk_size; done: - if(prfx && H5AC2_unprotect(f, dxpl_id, H5AC2_LHEAP_PRFX, heap->prfx_addr, (size_t)0, prfx, H5AC2__NO_FLAGS_SET) < 0) + if(prfx && H5AC_unprotect(f, dxpl_id, H5AC_LHEAP_PRFX, heap->prfx_addr, (size_t)0, prfx, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release local heap prefix") FUNC_LEAVE_NOAPI(ret_value) @@ -1236,7 +1236,7 @@ H5HL_heapsize(H5F_t *f, hid_t dxpl_id, haddr_t addr, hsize_t *heap_size) prfx_udata.free_block = H5HL_FREE_NULL; /* Protect the local heap prefix */ - if(NULL == (prfx = (H5HL_prfx_t *)H5AC2_protect(f, dxpl_id, H5AC2_LHEAP_PRFX, addr, H5HL_SPEC_READ_SIZE, &prfx_udata, H5AC2_READ))) + if(NULL == (prfx = (H5HL_prfx_t *)H5AC_protect(f, dxpl_id, H5AC_LHEAP_PRFX, addr, H5HL_SPEC_READ_SIZE, &prfx_udata, H5AC_READ))) HGOTO_ERROR(H5E_HEAP, H5E_CANTPROTECT, FAIL, "unable to load heap prefix") /* Get the pointer to the heap */ @@ -1246,7 +1246,7 @@ H5HL_heapsize(H5F_t *f, hid_t dxpl_id, haddr_t addr, hsize_t *heap_size) *heap_size += (hsize_t)(heap->prfx_size + heap->dblk_size); done: - if(prfx && H5AC2_unprotect(f, dxpl_id, H5AC2_LHEAP_PRFX, heap->prfx_addr, (size_t)0, prfx, H5AC2__NO_FLAGS_SET) < 0) + if(prfx && H5AC_unprotect(f, dxpl_id, H5AC_LHEAP_PRFX, heap->prfx_addr, (size_t)0, prfx, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_HEAP, H5E_CANTUNPROTECT, FAIL, "unable to release local heap prefix") FUNC_LEAVE_NOAPI(ret_value) diff --git a/src/H5HLcache.c b/src/H5HLcache.c index cf5668f..42f29c9 100644 --- a/src/H5HLcache.c +++ b/src/H5HLcache.c @@ -86,10 +86,10 @@ static herr_t H5HL_dblk_free_icr(haddr_t addr, size_t len, void *thing); /*********************/ /* - * H5HL prefix inherits cache-like properties from H5AC2 + * H5HL prefix inherits cache-like properties from H5AC */ -const H5AC2_class_t H5AC2_LHEAP_PRFX[1] = {{ - H5AC2_LHEAP_PRFX_ID, +const H5AC_class_t H5AC_LHEAP_PRFX[1] = {{ + H5AC_LHEAP_PRFX_ID, "local heap prefix", H5FD_MEM_LHEAP, H5HL_prfx_deserialize, @@ -100,10 +100,10 @@ const H5AC2_class_t H5AC2_LHEAP_PRFX[1] = {{ }}; /* - * H5HL data block inherits cache-like properties from H5AC2 + * H5HL data block inherits cache-like properties from H5AC */ -const H5AC2_class_t H5AC2_LHEAP_DBLK[1] = {{ - H5AC2_LHEAP_DBLK_ID, +const H5AC_class_t H5AC_LHEAP_DBLK[1] = {{ + H5AC_LHEAP_DBLK_ID, "local heap data block", H5FD_MEM_LHEAP, H5HL_dblk_deserialize, diff --git a/src/H5HLdbg.c b/src/H5HLdbg.c index cb9d070..b8a8d35 100644 --- a/src/H5HLdbg.c +++ b/src/H5HLdbg.c @@ -45,7 +45,7 @@ * * John Mainzer, 6/17/05 * Modified the function to use the new dirtied parameter of - * of H5AC2_unprotect() instead of modifying the is_dirty + * of H5AC_unprotect() instead of modifying the is_dirty * field of the cache info. * *------------------------------------------------------------------------- @@ -69,7 +69,7 @@ H5HL_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE * stream, int indent, int HDassert(indent >= 0); HDassert(fwidth >= 0); - if(NULL == (h = (H5HL_t *)H5HL_protect(f, dxpl_id, addr, H5AC2_READ))) + if(NULL == (h = (H5HL_t *)H5HL_protect(f, dxpl_id, addr, H5AC_READ))) HGOTO_ERROR(H5E_HEAP, H5E_CANTLOAD, FAIL, "unable to load heap") fprintf(stream, "%*sLocal Heap...\n", indent, ""); diff --git a/src/H5HLint.c b/src/H5HLint.c index 43e3b1f..c6d6839 100644 --- a/src/H5HLint.c +++ b/src/H5HLint.c @@ -397,7 +397,7 @@ H5HL_dblk_dest(H5HL_dblk_t *dblk) dblk->heap->dblk = NULL; /* Unpin the local heap prefix */ - if(H5AC2_unpin_entry(dblk->heap->prfx) < 0) + if(H5AC_unpin_entry(dblk->heap->prfx) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTUNPIN, FAIL, "can't unpin local heap prefix") /* Decrement ref. count on heap data structure */ diff --git a/src/H5HLpkg.h b/src/H5HLpkg.h index 819ea9d..5faa022 100644 --- a/src/H5HLpkg.h +++ b/src/H5HLpkg.h @@ -40,10 +40,10 @@ /*****************************/ /* The local heap prefix cache subclass */ -H5_DLLVAR const H5AC2_class_t H5AC2_LHEAP_PRFX[1]; +H5_DLLVAR const H5AC_class_t H5AC_LHEAP_PRFX[1]; /* The local heap data block cache subclass */ -H5_DLLVAR const H5AC2_class_t H5AC2_LHEAP_DBLK[1]; +H5_DLLVAR const H5AC_class_t H5AC_LHEAP_DBLK[1]; /* Declare extern the free list to manage the H5HL_free_t struct */ H5FL_EXTERN(H5HL_free_t); @@ -106,14 +106,14 @@ struct H5HL_t { /* Struct for heap data block */ struct H5HL_dblk_t { - H5AC2_info_t cache_info; /* Information for H5AC2 cache functions, _must_ be */ + H5AC_info_t cache_info; /* Information for H5AC cache functions, _must_ be */ /* first field in structure */ H5HL_t *heap; /* Pointer to heap for data block */ }; /* Struct for heap prefix */ struct H5HL_prfx_t { - H5AC2_info_t cache_info; /* Information for H5AC2 cache functions, _must_ be */ + H5AC_info_t cache_info; /* Information for H5AC cache functions, _must_ be */ /* first field in structure */ H5HL_t *heap; /* Pointer to heap for prefix */ }; diff --git a/src/H5HLprivate.h b/src/H5HLprivate.h index 26f2cb7..6233545 100644 --- a/src/H5HLprivate.h +++ b/src/H5HLprivate.h @@ -33,7 +33,7 @@ /* Private headers needed by this file. */ #include "H5private.h" /* Generic Functions */ -#include "H5AC2private.h" /* Metadata cache */ +#include "H5ACprivate.h" /* Metadata cache */ #include "H5Fprivate.h" /* File access */ /* @@ -64,7 +64,7 @@ typedef struct H5HL_t H5HL_t; * Library prototypes... */ H5_DLL herr_t H5HL_create(H5F_t *f, hid_t dxpl_id, size_t size_hint, haddr_t *addr/*out*/); -H5_DLL H5HL_t *H5HL_protect(H5F_t *f, hid_t dxpl_id, haddr_t addr, H5AC2_protect_t rw); +H5_DLL H5HL_t *H5HL_protect(H5F_t *f, hid_t dxpl_id, haddr_t addr, H5AC_protect_t rw); H5_DLL void *H5HL_offset_into(const H5HL_t *heap, size_t offset); H5_DLL herr_t H5HL_remove(H5F_t *f, hid_t dxpl_id, H5HL_t *heap, size_t offset, size_t size); diff --git a/src/H5I.c b/src/H5I.c index d64b4a2..1cff648 100644 --- a/src/H5I.c +++ b/src/H5I.c @@ -42,7 +42,7 @@ #include "H5private.h" /* Generic Functions */ -#include "H5AC2private.h" /* Metadata cache */ +#include "H5ACprivate.h" /* Metadata cache */ #include "H5Eprivate.h" /* Error handling */ #include "H5FLprivate.h" /* Free Lists */ #include "H5Ipkg.h" /* IDs */ @@ -1259,7 +1259,7 @@ H5Idec_ref(hid_t id) { int ret_value; /* Return value */ - FUNC_ENTER_API_META(H5Idec_ref, id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Idec_ref, id, H5AC_dxpl_id, FAIL) H5TRACE1("Is", "i", id); /* Check arguments */ @@ -1384,7 +1384,7 @@ H5Iinc_ref(hid_t id) { int ret_value; /* Return value */ - FUNC_ENTER_API_META(H5Iinc_ref, id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Iinc_ref, id, H5AC_dxpl_id, FAIL) H5TRACE1("Is", "i", id); /* Check arguments */ @@ -2002,7 +2002,7 @@ H5Iget_name(hid_t id, char *name/*out*/, size_t size) H5TRACE3("Zs", "ixz", id, name, size); /* Call internal group routine to retrieve object's name */ - if((ret_value = H5G_get_name(id, name, size, H5P_DEFAULT, H5AC2_ind_dxpl_id)) < 0) + if((ret_value = H5G_get_name(id, name, size, H5P_DEFAULT, H5AC_ind_dxpl_id)) < 0) HGOTO_ERROR(H5E_ATOM, H5E_CANTGET, FAIL, "can't retrieve object name") done: diff --git a/src/H5L.c b/src/H5L.c index e66e28c..2302da6 100644 --- a/src/H5L.c +++ b/src/H5L.c @@ -28,7 +28,7 @@ /* Headers */ /***********/ #include "H5private.h" /* Generic Functions */ -#include "H5AC2private.h" /* Metadata cache */ +#include "H5ACprivate.h" /* Metadata cache */ #include "H5Dprivate.h" /* Datasets */ #include "H5Eprivate.h" /* Error handling */ #include "H5Gpkg.h" /* Groups */ @@ -315,7 +315,7 @@ H5Lmove(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id, H5G_loc_t dst_loc, *dst_loc_p; herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_API_META(H5Lmove, src_loc_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Lmove, src_loc_id, H5AC_dxpl_id, FAIL) H5TRACE6("e", "i*si*sii", src_loc_id, src_name, dst_loc_id, dst_name, lcpl_id, lapl_id); @@ -343,7 +343,7 @@ H5Lmove(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id, /* Move the link */ if(H5L_move(src_loc_p, src_name, dst_loc_p, dst_name, FALSE, lcpl_id, - lapl_id, H5AC2_dxpl_id) < 0) + lapl_id, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_LINK, H5E_CANTMOVE, FAIL, "unable to move link") done: @@ -373,7 +373,7 @@ H5Lcopy(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id, H5G_loc_t dst_loc, *dst_loc_p; herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_API_META(H5Lcopy, src_loc_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Lcopy, src_loc_id, H5AC_dxpl_id, FAIL) H5TRACE6("e", "i*si*sii", src_loc_id, src_name, dst_loc_id, dst_name, lcpl_id, lapl_id); @@ -401,7 +401,7 @@ H5Lcopy(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id, /* Copy the link */ if(H5L_move(src_loc_p, src_name, dst_loc_p, dst_name, TRUE, lcpl_id, - lapl_id, H5AC2_dxpl_id) < 0) + lapl_id, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_LINK, H5E_CANTMOVE, FAIL, "unable to move link") done: @@ -434,7 +434,7 @@ H5Lcreate_soft(const char *link_target, H5G_loc_t link_loc; /* Group location for new link */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_API_META(H5Lcreate_soft, link_loc_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Lcreate_soft, link_loc_id, H5AC_dxpl_id, FAIL) H5TRACE5("e", "*si*sii", link_target, link_loc_id, link_name, lcpl_id, lapl_id); /* Check arguments */ @@ -448,7 +448,7 @@ H5Lcreate_soft(const char *link_target, HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a link creation property list") /* Create the link */ - if(H5L_create_soft(link_target, &link_loc, link_name, lcpl_id, lapl_id, H5AC2_dxpl_id) < 0) + if(H5L_create_soft(link_target, &link_loc, link_name, lcpl_id, lapl_id, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "unable to create link") done: @@ -480,7 +480,7 @@ H5Lcreate_hard(hid_t cur_loc_id, const char *cur_name, H5G_loc_t new_loc, *new_loc_p; herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_API_META(H5Lcreate_hard, cur_loc_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Lcreate_hard, cur_loc_id, H5AC_dxpl_id, FAIL) H5TRACE6("e", "i*si*sii", cur_loc_id, cur_name, new_loc_id, new_name, lcpl_id, lapl_id); @@ -510,7 +510,7 @@ H5Lcreate_hard(hid_t cur_loc_id, const char *cur_name, /* Create the link */ if(H5L_create_hard(cur_loc_p, cur_name, new_loc_p, new_name, - lcpl_id, lapl_id, H5AC2_dxpl_id) < 0) + lcpl_id, lapl_id, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "unable to create link") done: @@ -549,7 +549,7 @@ H5Lcreate_ud(hid_t link_loc_id, const char *link_name, H5L_type_t link_type, H5G_loc_t link_loc; herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_API_META(H5Lcreate_ud, link_loc_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Lcreate_ud, link_loc_id, H5AC_dxpl_id, FAIL) H5TRACE7("e", "i*sLl*xzii", link_loc_id, link_name, link_type, udata, udata_size, lcpl_id, lapl_id); @@ -560,7 +560,7 @@ H5Lcreate_ud(hid_t link_loc_id, const char *link_name, H5L_type_t link_type, HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no link name specified") /* Create external link */ - if(H5L_create_ud(&link_loc, link_name, udata, udata_size, link_type, lcpl_id, lapl_id, H5AC2_dxpl_id) < 0) + if(H5L_create_ud(&link_loc, link_name, udata, udata_size, link_type, lcpl_id, lapl_id, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "unable to create link") done: @@ -591,7 +591,7 @@ H5Ldelete(hid_t loc_id, const char *name, hid_t lapl_id) H5G_loc_t loc; /* Group's location */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_API_META(H5Ldelete, loc_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Ldelete, loc_id, H5AC_dxpl_id, FAIL) H5TRACE3("e", "i*si", loc_id, name, lapl_id); /* Check arguments */ @@ -601,7 +601,7 @@ H5Ldelete(hid_t loc_id, const char *name, hid_t lapl_id) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no name") /* Unlink */ - if(H5L_delete(&loc, name, lapl_id, H5AC2_dxpl_id) < 0) + if(H5L_delete(&loc, name, lapl_id, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_LINK, H5E_CANTDELETE, FAIL, "unable to delete link") done: @@ -636,7 +636,7 @@ H5Ldelete_by_idx(hid_t loc_id, const char *group_name, H5L_trav_rmbi_t udata; /* User data for callback */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_API_META(H5Ldelete_by_idx, loc_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Ldelete_by_idx, loc_id, H5AC_dxpl_id, FAIL) H5TRACE6("e", "i*sIiIohi", loc_id, group_name, idx_type, order, n, lapl_id); /* Check arguments */ @@ -658,10 +658,10 @@ H5Ldelete_by_idx(hid_t loc_id, const char *group_name, udata.idx_type = idx_type; udata.order = order; udata.n = n; - udata.dxpl_id = H5AC2_dxpl_id; + udata.dxpl_id = H5AC_dxpl_id; /* Traverse the group hierarchy to remove the link */ - if(H5G_traverse(&loc, group_name, H5G_TARGET_SLINK|H5G_TARGET_UDLINK|H5G_TARGET_MOUNT, H5L_delete_by_idx_cb, &udata, lapl_id, H5AC2_dxpl_id) < 0) + if(H5G_traverse(&loc, group_name, H5G_TARGET_SLINK|H5G_TARGET_UDLINK|H5G_TARGET_MOUNT, H5L_delete_by_idx_cb, &udata, lapl_id, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_SYM, H5E_EXISTS, FAIL, "name doesn't exist") done: @@ -710,7 +710,7 @@ H5Lget_val(hid_t loc_id, const char *name, void *buf/*out*/, size_t size, HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID") /* Get the link value */ - if(H5L_get_val(&loc, name, buf, size, lapl_id, H5AC2_ind_dxpl_id) < 0) + if(H5L_get_val(&loc, name, buf, size, lapl_id, H5AC_ind_dxpl_id) < 0) HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "unable to get link value") done: @@ -768,12 +768,12 @@ H5Lget_val_by_idx(hid_t loc_id, const char *group_name, H5_index_t idx_type, udata.idx_type = idx_type; udata.order = order; udata.n = n; - udata.dxpl_id = H5AC2_ind_dxpl_id; + udata.dxpl_id = H5AC_ind_dxpl_id; udata.buf = buf; udata.size = size; /* Traverse the group hierarchy to locate the object to get info about */ - if(H5G_traverse(&loc, group_name, H5G_TARGET_SLINK | H5G_TARGET_UDLINK, H5L_get_val_by_idx_cb, &udata, lapl_id, H5AC2_ind_dxpl_id) < 0) + if(H5G_traverse(&loc, group_name, H5G_TARGET_SLINK | H5G_TARGET_UDLINK, H5L_get_val_by_idx_cb, &udata, lapl_id, H5AC_ind_dxpl_id) < 0) HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "name doesn't exist") @@ -816,7 +816,7 @@ H5Lexists(hid_t loc_id, const char *name, hid_t lapl_id) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID") /* Check for the existence of the link */ - if((ret_value = H5L_exists(&loc, name, lapl_id, H5AC2_ind_dxpl_id)) < 0) + if((ret_value = H5L_exists(&loc, name, lapl_id, H5AC_ind_dxpl_id)) < 0) HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "unable to get link info") done: @@ -860,7 +860,7 @@ H5Lget_info(hid_t loc_id, const char *name, H5L_info_t *linfo /*out*/, HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID") /* Get the link information */ - if(H5L_get_info(&loc, name, linfo, lapl_id, H5AC2_ind_dxpl_id) < 0) + if(H5L_get_info(&loc, name, linfo, lapl_id, H5AC_ind_dxpl_id) < 0) HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "unable to get link info") done: @@ -914,11 +914,11 @@ H5Lget_info_by_idx(hid_t loc_id, const char *group_name, udata.idx_type = idx_type; udata.order = order; udata.n = n; - udata.dxpl_id = H5AC2_ind_dxpl_id; + udata.dxpl_id = H5AC_ind_dxpl_id; udata.linfo = linfo; /* Traverse the group hierarchy to locate the object to get info about */ - if(H5G_traverse(&loc, group_name, H5G_TARGET_SLINK|H5G_TARGET_UDLINK, H5L_get_info_by_idx_cb, &udata, lapl_id, H5AC2_ind_dxpl_id) < 0) + if(H5G_traverse(&loc, group_name, H5G_TARGET_SLINK|H5G_TARGET_UDLINK, H5L_get_info_by_idx_cb, &udata, lapl_id, H5AC_ind_dxpl_id) < 0) HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "unable to get link info") @@ -1103,13 +1103,13 @@ H5Lget_name_by_idx(hid_t loc_id, const char *group_name, udata.idx_type = idx_type; udata.order = order; udata.n = n; - udata.dxpl_id = H5AC2_ind_dxpl_id; + udata.dxpl_id = H5AC_ind_dxpl_id; udata.name = name; udata.size = size; udata.name_len = -1; /* Traverse the group hierarchy to locate the link to get name of */ - if(H5G_traverse(&loc, group_name, H5G_TARGET_SLINK|H5G_TARGET_UDLINK, H5L_get_name_by_idx_cb, &udata, lapl_id, H5AC2_ind_dxpl_id) < 0) + if(H5G_traverse(&loc, group_name, H5G_TARGET_SLINK|H5G_TARGET_UDLINK, H5L_get_name_by_idx_cb, &udata, lapl_id, H5AC_ind_dxpl_id) < 0) HGOTO_ERROR(H5E_SYM, H5E_EXISTS, FAIL, "name doesn't exist") /* Set the return value */ @@ -1175,7 +1175,7 @@ H5Literate(hid_t grp_id, H5_index_t idx_type, H5_iter_order_t order, lnk_op.op_func.op_new = op; /* Iterate over the links */ - if((ret_value = H5G_iterate(grp_id, ".", idx_type, order, idx, &last_lnk, &lnk_op, op_data, H5P_DEFAULT, H5AC2_ind_dxpl_id)) < 0) + if((ret_value = H5G_iterate(grp_id, ".", idx_type, order, idx, &last_lnk, &lnk_op, op_data, H5P_DEFAULT, H5AC_ind_dxpl_id)) < 0) HGOTO_ERROR(H5E_SYM, H5E_BADITER, FAIL, "link iteration failed") /* Set the index we stopped at */ @@ -1247,7 +1247,7 @@ H5Literate_by_name(hid_t loc_id, const char *group_name, lnk_op.op_func.op_new = op; /* Iterate over the links */ - if((ret_value = H5G_iterate(loc_id, group_name, idx_type, order, idx, &last_lnk, &lnk_op, op_data, lapl_id, H5AC2_ind_dxpl_id)) < 0) + if((ret_value = H5G_iterate(loc_id, group_name, idx_type, order, idx, &last_lnk, &lnk_op, op_data, lapl_id, H5AC_ind_dxpl_id)) < 0) HGOTO_ERROR(H5E_SYM, H5E_BADITER, FAIL, "link iteration failed") /* Set the index we stopped at */ @@ -1309,7 +1309,7 @@ H5Lvisit(hid_t grp_id, H5_index_t idx_type, H5_iter_order_t order, HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no callback operator specified") /* Call internal group visitation routine */ - if((ret_value = H5G_visit(grp_id, ".", idx_type, order, op, op_data, H5P_DEFAULT, H5AC2_ind_dxpl_id)) < 0) + if((ret_value = H5G_visit(grp_id, ".", idx_type, order, op, op_data, H5P_DEFAULT, H5AC_ind_dxpl_id)) < 0) HGOTO_ERROR(H5E_SYM, H5E_BADITER, FAIL, "link visitation failed") done: @@ -1371,7 +1371,7 @@ H5Lvisit_by_name(hid_t loc_id, const char *group_name, H5_index_t idx_type, HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID") /* Call internal group visitation routine */ - if((ret_value = H5G_visit(loc_id, group_name, idx_type, order, op, op_data, lapl_id, H5AC2_ind_dxpl_id)) < 0) + if((ret_value = H5G_visit(loc_id, group_name, idx_type, order, op, op_data, lapl_id, H5AC_ind_dxpl_id)) < 0) HGOTO_ERROR(H5E_SYM, H5E_BADITER, FAIL, "link visitation failed") done: diff --git a/src/H5Lexternal.c b/src/H5Lexternal.c index bde987c..2eb0917 100644 --- a/src/H5Lexternal.c +++ b/src/H5Lexternal.c @@ -20,7 +20,7 @@ #define H5_INTERFACE_INIT_FUNC H5L_init_extern_interface #include "H5private.h" /* Generic Functions */ -#include "H5AC2private.h" /* Metadata cache */ +#include "H5ACprivate.h" /* Metadata cache */ #include "H5Eprivate.h" /* Error handling */ #include "H5Gpkg.h" /* Groups */ #include "H5Iprivate.h" /* IDs */ @@ -255,7 +255,7 @@ H5L_extern_traverse(const char UNUSED *link_name, hid_t cur_group, /* target file_name is an absolute pathname: see RM for detailed description */ if (CHECK_ABSOLUTE(file_name) || CHECK_ABS_PATH(file_name)) { if(NULL == (ext_file = H5F_open(file_name, ((intent & H5F_ACC_RDWR) ? H5F_ACC_RDWR : H5F_ACC_RDONLY), - H5P_FILE_CREATE_DEFAULT, fapl_id, H5AC2_dxpl_id))) { + H5P_FILE_CREATE_DEFAULT, fapl_id, H5AC_dxpl_id))) { H5E_clear_stack(NULL); /* get last component of file_name */ GET_LAST_DELIMITER(file_name, ptr) @@ -264,7 +264,7 @@ H5L_extern_traverse(const char UNUSED *link_name, hid_t cur_group, } } else if (CHECK_ABS_DRIVE(file_name)) { if(NULL == (ext_file = H5F_open(file_name, ((intent & H5F_ACC_RDWR) ? H5F_ACC_RDWR : H5F_ACC_RDONLY), - H5P_FILE_CREATE_DEFAULT, fapl_id, H5AC2_dxpl_id))) { + H5P_FILE_CREATE_DEFAULT, fapl_id, H5AC_dxpl_id))) { H5E_clear_stack(NULL); /* strip ":" */ HDstrcpy(tempname, &file_name[2]); @@ -285,7 +285,7 @@ H5L_extern_traverse(const char UNUSED *link_name, hid_t cur_group, HGOTO_ERROR(H5E_LINK, H5E_CANTGET, FAIL, "can't prepend prefix to filename") ext_file = H5F_open(full_name, ((intent & H5F_ACC_RDWR) ? H5F_ACC_RDWR : H5F_ACC_RDONLY), - H5P_FILE_CREATE_DEFAULT, fapl_id, H5AC2_dxpl_id); + H5P_FILE_CREATE_DEFAULT, fapl_id, H5AC_dxpl_id); if (full_name) H5MM_xfree(full_name); if (ext_file != NULL) @@ -305,7 +305,7 @@ H5L_extern_traverse(const char UNUSED *link_name, hid_t cur_group, if (H5L_build_name(my_prefix, tempname, &full_name/*out*/) < 0) HGOTO_ERROR(H5E_LINK, H5E_CANTGET, FAIL, "can't prepend prefix to filename") if ((ext_file=H5F_open(full_name, ((intent & H5F_ACC_RDWR) ? H5F_ACC_RDWR : H5F_ACC_RDONLY), - H5P_FILE_CREATE_DEFAULT, fapl_id, H5AC2_dxpl_id)) == NULL) + H5P_FILE_CREATE_DEFAULT, fapl_id, H5AC_dxpl_id)) == NULL) H5E_clear_stack(NULL); if (full_name) H5MM_xfree(full_name); @@ -317,7 +317,7 @@ H5L_extern_traverse(const char UNUSED *link_name, hid_t cur_group, if (H5L_build_name(extpath, tempname, &full_name/*out*/) < 0) HGOTO_ERROR(H5E_LINK, H5E_CANTGET, FAIL, "can't prepend prefix to filename") if ((ext_file = H5F_open(full_name, ((intent & H5F_ACC_RDWR) ? H5F_ACC_RDWR : H5F_ACC_RDONLY), - H5P_FILE_CREATE_DEFAULT, fapl_id, H5AC2_dxpl_id)) == NULL) + H5P_FILE_CREATE_DEFAULT, fapl_id, H5AC_dxpl_id)) == NULL) H5E_clear_stack(NULL); if (full_name) H5MM_xfree(full_name); @@ -326,7 +326,7 @@ H5L_extern_traverse(const char UNUSED *link_name, hid_t cur_group, /* try the relative file_name stored in tempname */ if (ext_file == NULL) { if ((ext_file=H5F_open(tempname, ((intent & H5F_ACC_RDWR) ? H5F_ACC_RDWR : H5F_ACC_RDONLY), - H5P_FILE_CREATE_DEFAULT, fapl_id, H5AC2_dxpl_id)) == NULL) + H5P_FILE_CREATE_DEFAULT, fapl_id, H5AC_dxpl_id)) == NULL) HGOTO_ERROR(H5E_LINK, H5E_CANTOPENFILE, FAIL, "unable to open external file") } @@ -452,7 +452,7 @@ H5Lcreate_external(const char *file_name, const char *obj_name, uint8_t *p; /* Pointer into external link buffer */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_API_META(H5Lcreate_external, link_loc_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Lcreate_external, link_loc_id, H5AC_dxpl_id, FAIL) H5TRACE6("e", "*s*si*sii", file_name, obj_name, link_loc_id, link_name, lcpl_id, lapl_id); @@ -479,7 +479,7 @@ H5Lcreate_external(const char *file_name, const char *obj_name, HDstrcpy((char *)p, obj_name); /* External link's object */ /* Create an external link */ - if(H5L_create_ud(&link_loc, link_name, ext_link_buf, buf_size, H5L_TYPE_EXTERNAL, lcpl_id, lapl_id, H5AC2_dxpl_id) < 0) + if(H5L_create_ud(&link_loc, link_name, ext_link_buf, buf_size, H5L_TYPE_EXTERNAL, lcpl_id, lapl_id, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "unable to create link") done: diff --git a/src/H5MF.c b/src/H5MF.c index 9882306..2608185 100644 --- a/src/H5MF.c +++ b/src/H5MF.c @@ -30,7 +30,7 @@ /* Module Setup */ /****************/ -#define H5C2_PACKAGE /*suppress error about including H5C2pkg */ +#define H5C_PACKAGE /*suppress error about including H5Cpkg */ #define H5F_PACKAGE /*suppress error about including H5Fpkg */ @@ -38,7 +38,7 @@ /* Headers */ /***********/ #include "H5private.h" /* Generic Functions */ -#include "H5C2pkg.h" /* Metadata cache */ +#include "H5Cpkg.h" /* Metadata cache */ #include "H5Eprivate.h" /* Error handling */ #include "H5Fpkg.h" /* File access */ #include "H5MFprivate.h" /* File memory management */ @@ -116,7 +116,7 @@ H5MF_alloc(const H5F_t *f, H5FD_mem_t type, hid_t dxpl_id, hsize_t size) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, HADDR_UNDEF, "file allocation failed") /* Check for journaling in progress */ - if(f->shared->cache2->mdj_enabled) { + if(f->shared->cache->mdj_enabled) { haddr_t new_eoa; /* get updated EOA value */ @@ -124,8 +124,8 @@ H5MF_alloc(const H5F_t *f, H5FD_mem_t type, hid_t dxpl_id, hsize_t size) HGOTO_ERROR(H5E_RESOURCE, H5E_CANTINIT, HADDR_UNDEF, "file get eoa request failed") /* journal the updated EOA value */ - if(H5C2_jb__eoa(&(f->shared->cache2->mdj_jbrb), new_eoa) < 0) - HGOTO_ERROR(H5E_RESOURCE, H5E_CANTJOURNAL, HADDR_UNDEF, "H5C2_jb__eoa() failed.") + if(H5C_jb__eoa(&(f->shared->cache->mdj_jbrb), new_eoa) < 0) + HGOTO_ERROR(H5E_RESOURCE, H5E_CANTJOURNAL, HADDR_UNDEF, "H5C_jb__eoa() failed.") } /* end if */ /* Convert absolute file address to relative file address */ diff --git a/src/H5O.c b/src/H5O.c index d113b32..47efbeb 100644 --- a/src/H5O.c +++ b/src/H5O.c @@ -314,12 +314,12 @@ H5Oopen_by_idx(hid_t loc_id, const char *group_name, H5_index_t idx_type, H5G_loc_reset(&obj_loc); /* Find the object's location, according to the order in the index */ - if(H5G_loc_find_by_idx(&loc, group_name, idx_type, order, n, &obj_loc/*out*/, lapl_id, H5AC2_dxpl_id) < 0) + if(H5G_loc_find_by_idx(&loc, group_name, idx_type, order, n, &obj_loc/*out*/, lapl_id, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "group not found") loc_found = TRUE; /* Open the object */ - if((ret_value = H5O_open_by_loc(&obj_loc, H5AC2_dxpl_id)) < 0) + if((ret_value = H5O_open_by_loc(&obj_loc, H5AC_dxpl_id)) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open object") done: @@ -395,7 +395,7 @@ H5Oopen_by_addr(hid_t loc_id, haddr_t addr) H5G_name_reset(obj_loc.path); /* objects opened through this routine don't have a path name */ /* Open the object */ - if((ret_value = H5O_open_by_loc(&obj_loc, H5AC2_dxpl_id)) < 0) + if((ret_value = H5O_open_by_loc(&obj_loc, H5AC_dxpl_id)) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open object") done: @@ -436,7 +436,7 @@ H5Olink(hid_t obj_id, hid_t new_loc_id, const char *new_name, hid_t lcpl_id, H5G_loc_t obj_loc; herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_API_META(H5Olink, obj_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Olink, obj_id, H5AC_dxpl_id, FAIL) H5TRACE5("e", "ii*sii", obj_id, new_loc_id, new_name, lcpl_id, lapl_id); /* Check arguments */ @@ -454,7 +454,7 @@ H5Olink(hid_t obj_id, hid_t new_loc_id, const char *new_name, hid_t lcpl_id, HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a link creation property list") /* Link to the object */ - if(H5L_link(&new_loc, new_name, &obj_loc, lcpl_id, lapl_id, H5AC2_dxpl_id) < 0) + if(H5L_link(&new_loc, new_name, &obj_loc, lcpl_id, lapl_id, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_LINK, H5E_CANTINIT, FAIL, "unable to create link") done: @@ -488,14 +488,14 @@ H5Oincr_refcount(hid_t object_id) H5O_loc_t *oloc; herr_t ret_value = SUCCEED; - FUNC_ENTER_API_META(H5Oincr_refcount, object_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Oincr_refcount, object_id, H5AC_dxpl_id, FAIL) H5TRACE1("e", "i", object_id); /* Get the object's oloc so we can adjust its link count */ if((oloc = H5O_get_loc(object_id)) == NULL) HGOTO_ERROR(H5E_ATOM, H5E_BADVALUE, FAIL, "unable to get object location from ID") - if(H5O_link(oloc, 1, H5AC2_dxpl_id) < 0) + if(H5O_link(oloc, 1, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_OHDR, H5E_LINKCOUNT, FAIL, "modifying object link count failed") done: @@ -529,14 +529,14 @@ H5Odecr_refcount(hid_t object_id) H5O_loc_t *oloc; herr_t ret_value = SUCCEED; - FUNC_ENTER_API_META(H5Odecr_refcount, object_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Odecr_refcount, object_id, H5AC_dxpl_id, FAIL) H5TRACE1("e", "i", object_id); /* Get the object's oloc so we can adjust its link count */ if((oloc = H5O_get_loc(object_id)) == NULL) HGOTO_ERROR(H5E_ATOM, H5E_BADVALUE, FAIL, "unable to get object location from ID") - if(H5O_link(oloc, -1, H5AC2_dxpl_id) < 0) + if(H5O_link(oloc, -1, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_OHDR, H5E_LINKCOUNT, FAIL, "modifying object link count failed") done: @@ -573,7 +573,7 @@ H5Oget_info(hid_t loc_id, H5O_info_t *oinfo) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no info struct") /* Retrieve the object's information */ - if(H5G_loc_info(&loc, ".", TRUE, oinfo/*out*/, H5P_LINK_ACCESS_DEFAULT, H5AC2_ind_dxpl_id) < 0) + if(H5G_loc_info(&loc, ".", TRUE, oinfo/*out*/, H5P_LINK_ACCESS_DEFAULT, H5AC_ind_dxpl_id) < 0) HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found") done: @@ -617,7 +617,7 @@ H5Oget_info_by_name(hid_t loc_id, const char *name, H5O_info_t *oinfo, hid_t lap HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID") /* Retrieve the object's information */ - if(H5G_loc_info(&loc, name, TRUE, oinfo/*out*/, lapl_id, H5AC2_ind_dxpl_id) < 0) + if(H5G_loc_info(&loc, name, TRUE, oinfo/*out*/, lapl_id, H5AC_ind_dxpl_id) < 0) HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found") done: @@ -677,12 +677,12 @@ H5Oget_info_by_idx(hid_t loc_id, const char *group_name, H5_index_t idx_type, H5G_loc_reset(&obj_loc); /* Find the object's location, according to the order in the index */ - if(H5G_loc_find_by_idx(&loc, group_name, idx_type, order, n, &obj_loc/*out*/, lapl_id, H5AC2_ind_dxpl_id) < 0) + if(H5G_loc_find_by_idx(&loc, group_name, idx_type, order, n, &obj_loc/*out*/, lapl_id, H5AC_ind_dxpl_id) < 0) HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "group not found") loc_found = TRUE; /* Retrieve the object's information */ - if(H5O_get_info(obj_loc.oloc, H5AC2_ind_dxpl_id, TRUE, oinfo) < 0) + if(H5O_get_info(obj_loc.oloc, H5AC_ind_dxpl_id, TRUE, oinfo) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't retrieve object info") done: @@ -717,7 +717,7 @@ H5Oset_comment(hid_t obj_id, const char *comment) H5G_loc_t loc; /* Location of group */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_API_META(H5Oset_comment, obj_id, H5AC2_ind_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Oset_comment, obj_id, H5AC_ind_dxpl_id, FAIL) H5TRACE2("e", "i*s", obj_id, comment); /* Check args */ @@ -725,7 +725,7 @@ H5Oset_comment(hid_t obj_id, const char *comment) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location") /* (Re)set the object's comment */ - if(H5G_loc_set_comment(&loc, ".", comment, H5P_LINK_ACCESS_DEFAULT, H5AC2_ind_dxpl_id) < 0) + if(H5G_loc_set_comment(&loc, ".", comment, H5P_LINK_ACCESS_DEFAULT, H5AC_ind_dxpl_id) < 0) HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found") done: @@ -757,7 +757,7 @@ H5Oset_comment_by_name(hid_t loc_id, const char *name, const char *comment, H5G_loc_t loc; /* Location of group */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_API_META(H5Oset_comment_by_name, loc_id, H5AC2_ind_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Oset_comment_by_name, loc_id, H5AC_ind_dxpl_id, FAIL) H5TRACE4("e", "i*s*si", loc_id, name, comment, lapl_id); /* Check args */ @@ -772,7 +772,7 @@ H5Oset_comment_by_name(hid_t loc_id, const char *name, const char *comment, HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID") /* (Re)set the object's comment */ - if(H5G_loc_set_comment(&loc, name, comment, lapl_id, H5AC2_ind_dxpl_id) < 0) + if(H5G_loc_set_comment(&loc, name, comment, lapl_id, H5AC_ind_dxpl_id) < 0) HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found") done: @@ -810,7 +810,7 @@ H5Oget_comment(hid_t obj_id, char *comment, size_t bufsize) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a location") /* Retrieve the object's comment */ - if((ret_value = H5G_loc_get_comment(&loc, ".", comment/*out*/, bufsize, H5P_LINK_ACCESS_DEFAULT, H5AC2_ind_dxpl_id)) < 0) + if((ret_value = H5G_loc_get_comment(&loc, ".", comment/*out*/, bufsize, H5P_LINK_ACCESS_DEFAULT, H5AC_ind_dxpl_id)) < 0) HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found") done: @@ -856,7 +856,7 @@ H5Oget_comment_by_name(hid_t loc_id, const char *name, char *comment, size_t buf HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID") /* Retrieve the object's comment */ - if((ret_value = H5G_loc_get_comment(&loc, name, comment/*out*/, bufsize, lapl_id, H5AC2_ind_dxpl_id)) < 0) + if((ret_value = H5G_loc_get_comment(&loc, name, comment/*out*/, bufsize, lapl_id, H5AC_ind_dxpl_id)) < 0) HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found") done: @@ -914,7 +914,7 @@ H5Ovisit(hid_t obj_id, H5_index_t idx_type, H5_iter_order_t order, HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no callback operator specified") /* Call internal object visitation routine */ - if((ret_value = H5O_visit(obj_id, ".", idx_type, order, op, op_data, H5P_LINK_ACCESS_DEFAULT, H5AC2_ind_dxpl_id)) < 0) + if((ret_value = H5O_visit(obj_id, ".", idx_type, order, op, op_data, H5P_LINK_ACCESS_DEFAULT, H5AC_ind_dxpl_id)) < 0) HGOTO_ERROR(H5E_SYM, H5E_BADITER, FAIL, "object visitation failed") done: @@ -980,7 +980,7 @@ H5Ovisit_by_name(hid_t loc_id, const char *obj_name, H5_index_t idx_type, HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not link access property list ID") /* Call internal object visitation routine */ - if((ret_value = H5O_visit(loc_id, obj_name, idx_type, order, op, op_data, lapl_id, H5AC2_ind_dxpl_id)) < 0) + if((ret_value = H5O_visit(loc_id, obj_name, idx_type, order, op, op_data, lapl_id, H5AC_ind_dxpl_id)) < 0) HGOTO_ERROR(H5E_SYM, H5E_BADITER, FAIL, "object visitation failed") done: @@ -1014,7 +1014,7 @@ H5Oclose(hid_t object_id) /* Will this ever change metadata? No need for a transaction unless * it does. */ - FUNC_ENTER_API_META(H5Oclose, object_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Oclose, object_id, H5AC_dxpl_id, FAIL) H5TRACE1("e", "i", object_id); /* Get the type of the object and close it in the correct way */ @@ -1192,7 +1192,7 @@ H5O_create(H5F_t *f, hid_t dxpl_id, size_t size_hint, hid_t ocpl_id, oh->mesg[0].chunkno = 0; /* Cache object header */ - if(H5AC2_set(f, dxpl_id, H5AC2_OHDR, oh_addr, (size_t)oh_size, oh, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_set(f, dxpl_id, H5AC_OHDR, oh_addr, (size_t)oh_size, oh, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, FAIL, "unable to cache object header") oh = NULL; @@ -1292,12 +1292,12 @@ H5O_open_name(H5G_loc_t *loc, const char *name, hid_t lapl_id) H5G_loc_reset(&obj_loc); /* Find the object's location */ - if(H5G_loc_find(loc, name, &obj_loc/*out*/, lapl_id, H5AC2_dxpl_id) < 0) + if(H5G_loc_find(loc, name, &obj_loc/*out*/, lapl_id, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found") loc_found = TRUE; /* Open the object */ - if((ret_value = H5O_open_by_loc(&obj_loc, H5AC2_ind_dxpl_id)) < 0) + if((ret_value = H5O_open_by_loc(&obj_loc, H5AC_ind_dxpl_id)) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTOPENOBJ, FAIL, "unable to open object") done: @@ -1433,7 +1433,7 @@ H5O_link(const H5O_loc_t *loc, int adjust, hid_t dxpl_id) HDassert(H5F_addr_defined(loc->addr)); /* Get header */ - if(NULL == (oh = H5O_protect(loc, dxpl_id, (adjust ? H5AC2_WRITE : H5AC2_READ)))) + if(NULL == (oh = H5O_protect(loc, dxpl_id, (adjust ? H5AC_WRITE : H5AC_READ)))) HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, FAIL, "unable to load object header") /* Pin the object header */ @@ -1441,7 +1441,7 @@ H5O_link(const H5O_loc_t *loc, int adjust, hid_t dxpl_id) HGOTO_ERROR(H5E_OHDR, H5E_CANTPIN, FAIL, "unable to pin object header") /* Unprotect the object header */ - if(H5O_unprotect(loc, dxpl_id, oh, H5AC2__NO_FLAGS_SET) < 0) + if(H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header") /* Check for adjusting link count */ @@ -1455,7 +1455,7 @@ H5O_link(const H5O_loc_t *loc, int adjust, hid_t dxpl_id) oh->nlink += adjust; /* Mark object header as dirty in cache */ - if(H5AC2_mark_pinned_or_protected_entry_dirty(oh) < 0) + if(H5AC_mark_pinned_or_protected_entry_dirty(oh) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTMARKDIRTY, FAIL, "unable to mark object header as dirty") /* Check if the object should be deleted */ @@ -1486,7 +1486,7 @@ H5O_link(const H5O_loc_t *loc, int adjust, hid_t dxpl_id) oh->nlink += adjust; /* Mark object header as dirty in cache */ - if(H5AC2_mark_pinned_or_protected_entry_dirty(oh) < 0) + if(H5AC_mark_pinned_or_protected_entry_dirty(oh) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTMARKDIRTY, FAIL, "unable to mark object header as dirty") } /* end if */ @@ -1537,7 +1537,7 @@ done: /*------------------------------------------------------------------------- * Function: H5O_protect * - * Purpose: Wrapper around H5AC2_protect for use during a H5O_protect-> + * Purpose: Wrapper around H5AC_protect for use during a H5O_protect-> * H5O_msg_append->...->H5O_msg_append->H5O_unprotect sequence of calls * during an object's creation. * @@ -1553,7 +1553,7 @@ done: *------------------------------------------------------------------------- */ H5O_t * -H5O_protect(const H5O_loc_t *loc, hid_t dxpl_id, H5AC2_protect_t prot) +H5O_protect(const H5O_loc_t *loc, hid_t dxpl_id, H5AC_protect_t prot) { H5O_t *oh; /* Object header protected */ H5O_cache_ud_t udata; /* User data for protecting object header */ @@ -1570,7 +1570,7 @@ H5O_protect(const H5O_loc_t *loc, hid_t dxpl_id, H5AC2_protect_t prot) /* Check for write access on the file */ file_intent = H5F_INTENT(loc->file); - if((prot == H5AC2_WRITE) && (0 == (file_intent & H5F_ACC_RDWR))) + if((prot == H5AC_WRITE) && (0 == (file_intent & H5F_ACC_RDWR))) HGOTO_ERROR(H5E_OHDR, H5E_BADVALUE, NULL, "no write intent on file") /* Construct the user data for protect callback */ @@ -1585,7 +1585,7 @@ H5O_protect(const H5O_loc_t *loc, hid_t dxpl_id, H5AC2_protect_t prot) udata.common.cont_msg_info = &cont_msg_info; /* Lock the object header into the cache */ - if(NULL == (oh = (H5O_t *)H5AC2_protect(loc->file, dxpl_id, H5AC2_OHDR, loc->addr, (size_t)H5O_SPEC_READ_SIZE, &udata, prot))) + if(NULL == (oh = (H5O_t *)H5AC_protect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, (size_t)H5O_SPEC_READ_SIZE, &udata, prot))) HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, NULL, "unable to load object header") /* Check if there are any continuation messages to process */ @@ -1619,7 +1619,7 @@ H5O_protect(const H5O_loc_t *loc, hid_t dxpl_id, H5AC2_protect_t prot) /* Bring the chunk into the cache */ /* (which adds to the object header */ - if(NULL == (chk_proxy = (H5O_chunk_proxy_t *)H5AC2_protect(loc->file, dxpl_id, H5AC2_OHDR_CHK, cont_msg_info.msgs[curr_msg].addr, cont_msg_info.msgs[curr_msg].size, &chk_udata, prot))) + if(NULL == (chk_proxy = (H5O_chunk_proxy_t *)H5AC_protect(loc->file, dxpl_id, H5AC_OHDR_CHK, cont_msg_info.msgs[curr_msg].addr, cont_msg_info.msgs[curr_msg].size, &chk_udata, prot))) HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, NULL, "unable to load object header chunk") /* Sanity check */ @@ -1628,7 +1628,7 @@ H5O_protect(const H5O_loc_t *loc, hid_t dxpl_id, H5AC2_protect_t prot) HDassert(oh->nchunks == (chkcnt + 1)); /* Release the chunk from the cache */ - if(H5AC2_unprotect(loc->file, dxpl_id, H5AC2_OHDR_CHK, cont_msg_info.msgs[curr_msg].addr, (size_t)0, chk_proxy, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_unprotect(loc->file, dxpl_id, H5AC_OHDR_CHK, cont_msg_info.msgs[curr_msg].addr, (size_t)0, chk_proxy, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, NULL, "unable to release object header chunk") /* Advance to next continuation message */ @@ -1664,37 +1664,37 @@ H5O_protect(const H5O_loc_t *loc, hid_t dxpl_id, H5AC2_protect_t prot) /* (object header will have been marked dirty during protect, if we * have write access -QAK) */ - if(prot != H5AC2_WRITE) + if(prot != H5AC_WRITE) oh->prefix_modified = TRUE; #ifndef NDEBUG else { unsigned oh_status = 0; /* Object header entry cache status */ /* Check the object header's status in the metadata cache */ - if(H5AC2_get_entry_status(loc->file, loc->addr, &oh_status) < 0) + if(H5AC_get_entry_status(loc->file, loc->addr, &oh_status) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, NULL, "unable to check metadata cache status for object header") /* Make certain that object header is dirty */ - HDassert(!(oh_status & H5AC2_ES__IS_DIRTY)); + HDassert(!(oh_status & H5AC_ES__IS_DIRTY)); } /* end else */ #endif /* NDEBUG */ #endif /* H5_STRICT_FORMAT_CHECKS */ } /* end if */ /* Check for any messages that were modified while being read in */ - if(udata.common.mesgs_modified && prot != H5AC2_WRITE) + if(udata.common.mesgs_modified && prot != H5AC_WRITE) oh->mesgs_modified = TRUE; } /* end if */ /* Take care of loose ends for modifications made while bringing in the * object header & chunks. */ - if(prot == H5AC2_WRITE) { + if(prot == H5AC_WRITE) { /* Check for the object header prefix being modified somehow */ /* (usually through updating the # of object header messages) */ if(oh->prefix_modified) { /* Mark the header as dirty now */ - if(H5AC2_mark_pinned_or_protected_entry_dirty(oh) < 0) + if(H5AC_mark_pinned_or_protected_entry_dirty(oh) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTMARKDIRTY, NULL, "unable to mark object header as dirty") /* Reset flag */ @@ -1720,7 +1720,7 @@ H5O_protect(const H5O_loc_t *loc, hid_t dxpl_id, H5AC2_protect_t prot) HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, NULL, "unable to load object header chunk") /* Unprotect chunk, marking it dirty */ - if(H5O_chunk_unprotect(loc->file, dxpl_id, oh, chk_proxy, H5AC2__DIRTIED_FLAG) < 0) + if(H5O_chunk_unprotect(loc->file, dxpl_id, oh, chk_proxy, H5AC__DIRTIED_FLAG) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, NULL, "unable to unprotect object header chunk") } /* end if */ } /* end for */ @@ -1739,7 +1739,7 @@ H5O_assert(oh); done: if(ret_value == NULL && oh) { - if(H5AC2_unprotect(loc->file, dxpl_id, H5AC2_OHDR, loc->addr, (size_t)0, oh, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_unprotect(loc->file, dxpl_id, H5AC_OHDR, loc->addr, (size_t)0, oh, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, NULL, "unable to release object header") } /* end if */ @@ -1750,7 +1750,7 @@ done: /*------------------------------------------------------------------------- * Function: H5O_pin * - * Purpose: Wrapper around H5AC2_pin_entry + * Purpose: Wrapper around H5AC_pin_entry * * Return: Success: Non-negative * Failure: Negative @@ -1784,7 +1784,7 @@ done: /*------------------------------------------------------------------------- * Function: H5O_unpin * - * Purpose: Wrapper around H5AC2_unpin_entry + * Purpose: Wrapper around H5AC_unpin_entry * * Return: Success: Non-negative * Failure: Negative @@ -1818,7 +1818,7 @@ done: /*------------------------------------------------------------------------- * Function: H5O_unprotect * - * Purpose: Wrapper around H5AC2_unprotect for use during a H5O_protect-> + * Purpose: Wrapper around H5AC_unprotect for use during a H5O_protect-> * H5O_msg_append->...->H5O_msg_append->H5O_unprotect sequence of calls * during an object's creation. * @@ -1843,7 +1843,7 @@ H5O_unprotect(const H5O_loc_t *loc, hid_t dxpl_id, H5O_t *oh, unsigned oh_flags) HDassert(oh); /* Unprotect the object header */ - if(H5AC2_unprotect(loc->file, dxpl_id, H5AC2_OHDR, oh->chunk[0].addr, (size_t)0, oh, oh_flags) < 0) + if(H5AC_unprotect(loc->file, dxpl_id, H5AC_OHDR, oh->chunk[0].addr, (size_t)0, oh, oh_flags) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header") done: @@ -1869,7 +1869,7 @@ herr_t H5O_touch_oh(H5F_t *f, hid_t dxpl_id, H5O_t *oh, hbool_t force) { H5O_chunk_proxy_t *chk_proxy = NULL; /* Chunk that message is in */ - unsigned chk_flags = H5AC2__NO_FLAGS_SET; /* Flags for unprotecting chunk */ + unsigned chk_flags = H5AC__NO_FLAGS_SET; /* Flags for unprotecting chunk */ time_t now; /* Current time */ herr_t ret_value = SUCCEED; /* Return value */ @@ -1923,7 +1923,7 @@ H5O_touch_oh(H5F_t *f, hid_t dxpl_id, H5O_t *oh, hbool_t force) /* Mark the message as dirty */ oh->mesg[idx].dirty = TRUE; - chk_flags |= H5AC2__DIRTIED_FLAG; + chk_flags |= H5AC__DIRTIED_FLAG; } /* end if */ else { /* XXX: For now, update access time & change fields in the object header */ @@ -1931,7 +1931,7 @@ H5O_touch_oh(H5F_t *f, hid_t dxpl_id, H5O_t *oh, hbool_t force) oh->atime = oh->ctime = now; /* Mark object header as dirty in cache */ - if(H5AC2_mark_pinned_or_protected_entry_dirty(oh) < 0) + if(H5AC_mark_pinned_or_protected_entry_dirty(oh) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTMARKDIRTY, FAIL, "unable to mark object header as dirty") } /* end else */ } /* end if */ @@ -1964,7 +1964,7 @@ herr_t H5O_touch(const H5O_loc_t *loc, hbool_t force, hid_t dxpl_id) { H5O_t *oh = NULL; /* Object header to modify */ - unsigned oh_flags = H5AC2__NO_FLAGS_SET; /* Flags for unprotecting object header */ + unsigned oh_flags = H5AC__NO_FLAGS_SET; /* Flags for unprotecting object header */ herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI(H5O_touch, FAIL) @@ -1973,7 +1973,7 @@ H5O_touch(const H5O_loc_t *loc, hbool_t force, hid_t dxpl_id) HDassert(loc); /* Get the object header */ - if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC2_WRITE))) + if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_WRITE))) HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header") /* Create/Update the modification time message */ @@ -1981,7 +1981,7 @@ H5O_touch(const H5O_loc_t *loc, hbool_t force, hid_t dxpl_id) HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, FAIL, "unable to update object modificaton time") /* Mark object header as changed */ - oh_flags |= H5AC2__DIRTIED_FLAG; + oh_flags |= H5AC__DIRTIED_FLAG; done: if(oh && H5O_unprotect(loc, dxpl_id, oh, oh_flags) < 0) @@ -2074,7 +2074,7 @@ H5O_delete(H5F_t *f, hid_t dxpl_id, haddr_t addr) { H5O_t *oh = NULL; /* Object header information */ H5O_loc_t loc; /* Object location for object to delete */ - unsigned oh_flags = H5AC2__NO_FLAGS_SET; /* Flags for unprotecting object header */ + unsigned oh_flags = H5AC__NO_FLAGS_SET; /* Flags for unprotecting object header */ herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI(H5O_delete, FAIL) @@ -2089,7 +2089,7 @@ H5O_delete(H5F_t *f, hid_t dxpl_id, haddr_t addr) loc.holding_file = FALSE; /* Get the object header information */ - if(NULL == (oh = H5O_protect(&loc, dxpl_id, H5AC2_WRITE))) + if(NULL == (oh = H5O_protect(&loc, dxpl_id, H5AC_WRITE))) HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header") /* Delete object */ @@ -2097,7 +2097,7 @@ H5O_delete(H5F_t *f, hid_t dxpl_id, haddr_t addr) HGOTO_ERROR(H5E_OHDR, H5E_CANTDELETE, FAIL, "can't delete object from file") /* Mark object header as deleted */ - oh_flags = H5AC2__DIRTIED_FLAG | H5AC2__DELETED_FLAG; + oh_flags = H5AC__DIRTIED_FLAG | H5AC__DELETED_FLAG; done: if(oh && H5O_unprotect(&loc, dxpl_id, oh, oh_flags) < 0) @@ -2177,7 +2177,7 @@ H5O_obj_type(const H5O_loc_t *loc, H5O_type_t *obj_type, hid_t dxpl_id) FUNC_ENTER_NOAPI(H5O_obj_type, FAIL) /* Load the object header */ - if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC2_READ))) + if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ))) HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header") /* Retrieve the type of the object */ @@ -2185,7 +2185,7 @@ H5O_obj_type(const H5O_loc_t *loc, H5O_type_t *obj_type, hid_t dxpl_id) HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "unable to determine object type") done: - if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC2__NO_FLAGS_SET) < 0) + if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header") FUNC_LEAVE_NOAPI(ret_value) @@ -2255,7 +2255,7 @@ H5O_obj_class(const H5O_loc_t *loc, hid_t dxpl_id) FUNC_ENTER_NOAPI_NOINIT(H5O_obj_class) /* Load the object header */ - if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC2_READ))) + if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ))) HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, NULL, "unable to load object header") /* Test whether entry qualifies as a particular type of object */ @@ -2263,7 +2263,7 @@ H5O_obj_class(const H5O_loc_t *loc, hid_t dxpl_id) HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, NULL, "unable to determine object type") done: - if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC2__NO_FLAGS_SET) < 0) + if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, NULL, "unable to release object header") FUNC_LEAVE_NOAPI(ret_value) @@ -2541,7 +2541,7 @@ H5O_get_info(const H5O_loc_t *loc, hid_t dxpl_id, hbool_t want_ih_info, H5O_info HDassert(oinfo); /* Get the object header */ - if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC2_READ))) + if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ))) HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header") /* Reset the object info structure */ @@ -2659,7 +2659,7 @@ H5O_get_info(const H5O_loc_t *loc, hid_t dxpl_id, hbool_t want_ih_info, H5O_info HDassert(oinfo->hdr.space.total == (oinfo->hdr.space.free + oinfo->hdr.space.meta + oinfo->hdr.space.mesg)); done: - if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC2__NO_FLAGS_SET) < 0) + if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header") FUNC_LEAVE_NOAPI(ret_value) @@ -2692,7 +2692,7 @@ H5O_get_create_plist(const H5O_loc_t *loc, hid_t dxpl_id, H5P_genplist_t *oc_pli HDassert(oc_plist); /* Get the object header */ - if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC2_READ))) + if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ))) HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header") /* Set property values, if they were used for the object */ @@ -2714,7 +2714,7 @@ H5O_get_create_plist(const H5O_loc_t *loc, hid_t dxpl_id, H5P_genplist_t *oc_pli } /* end if */ done: - if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC2__NO_FLAGS_SET) < 0) + if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header") FUNC_LEAVE_NOAPI(ret_value) @@ -2747,14 +2747,14 @@ H5O_get_nlinks(const H5O_loc_t *loc, hid_t dxpl_id, hsize_t *nlinks) HDassert(nlinks); /* Get the object header */ - if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC2_READ))) + if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ))) HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header") /* Retrieve the # of link messages seen when the object header was loaded */ *nlinks = oh->link_msgs_seen; done: - if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC2__NO_FLAGS_SET) < 0) + if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header") FUNC_LEAVE_NOAPI(ret_value) @@ -2866,7 +2866,7 @@ H5O_get_rc_and_type(const H5O_loc_t *loc, hid_t dxpl_id, unsigned *rc, H5O_type_ HDassert(otype); /* Get the object header */ - if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC2_READ))) + if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ))) HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header") /* Set the object's reference count */ @@ -2877,7 +2877,7 @@ H5O_get_rc_and_type(const H5O_loc_t *loc, hid_t dxpl_id, unsigned *rc, H5O_type_ HGOTO_ERROR(H5E_OHDR, H5E_CANTINIT, FAIL, "unable to determine object type") done: - if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC2__NO_FLAGS_SET) < 0) + if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header") FUNC_LEAVE_NOAPI(ret_value) @@ -3160,7 +3160,7 @@ H5O_inc_rc(H5O_t *oh) /* Pin the object header when the reference count goes above 0 */ if(oh->rc == 0) - if(H5AC2_pin_protected_entry(oh) < 0) + if(H5AC_pin_protected_entry(oh) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTPIN, FAIL, "unable to pin object header") /* Increment reference count */ @@ -3199,7 +3199,7 @@ H5O_dec_rc(H5O_t *oh) /* Unpin the object header when the reference count goes back to 0 */ if(oh->rc == 0) - if(H5AC2_unpin_entry(oh) < 0) + if(H5AC_unpin_entry(oh) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPIN, FAIL, "unable to unpin object header") done: diff --git a/src/H5Oalloc.c b/src/H5Oalloc.c index 3680cb7..202c190 100644 --- a/src/H5Oalloc.c +++ b/src/H5Oalloc.c @@ -110,7 +110,7 @@ H5O_add_gap(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned chunkno, unsigned idx, uint8_t *new_gap_loc, size_t new_gap_size) { H5O_chunk_proxy_t *chk_proxy = NULL; /* Chunk that message is in */ - unsigned chk_flags = H5AC2__NO_FLAGS_SET; /* Flags for unprotecting chunk */ + unsigned chk_flags = H5AC__NO_FLAGS_SET; /* Flags for unprotecting chunk */ hbool_t merged_with_null; /* Whether the gap was merged with a null message */ unsigned u; /* Local index variable */ herr_t ret_value = SUCCEED; /* Return value */ @@ -195,7 +195,7 @@ H5O_add_gap(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned chunkno, unsigned idx, oh->chunk[chunkno].gap = new_gap_size; /* Mark the chunk as modified */ - chk_flags |= H5AC2__DIRTIED_FLAG; + chk_flags |= H5AC__DIRTIED_FLAG; } /* end if */ done: @@ -232,7 +232,7 @@ H5O_eliminate_gap(H5F_t *f, hid_t dxpl_id, H5O_t *oh, H5O_mesg_t *mesg, uint8_t *gap_loc, size_t gap_size) { H5O_chunk_proxy_t *chk_proxy = NULL; /* Chunk that message is in */ - unsigned chk_flags = H5AC2__NO_FLAGS_SET; /* Flags for unprotecting chunk */ + unsigned chk_flags = H5AC__NO_FLAGS_SET; /* Flags for unprotecting chunk */ uint8_t *move_start, *move_end; /* Pointers to area of messages to move */ hbool_t null_before_gap; /* Flag whether the null message is before the gap or not */ herr_t ret_value = SUCCEED; /* Return value */ @@ -314,7 +314,7 @@ H5O_eliminate_gap(H5F_t *f, hid_t dxpl_id, H5O_t *oh, H5O_mesg_t *mesg, /* Mark null message as dirty */ mesg->dirty = TRUE; - chk_flags |= H5AC2__DIRTIED_FLAG; + chk_flags |= H5AC__DIRTIED_FLAG; done: /* Release chunk */ @@ -344,7 +344,7 @@ H5O_alloc_null(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned null_idx, const H5O_msg_class_t *new_type, void *new_native, size_t new_size) { H5O_chunk_proxy_t *chk_proxy = NULL; /* Chunk that message is in */ - unsigned chk_flags = H5AC2__NO_FLAGS_SET; /* Flags for unprotecting chunk */ + unsigned chk_flags = H5AC__NO_FLAGS_SET; /* Flags for unprotecting chunk */ H5O_mesg_t *alloc_msg; /* Pointer to null message to allocate out of */ herr_t ret_value = SUCCEED; /* Return value */ @@ -401,7 +401,7 @@ H5O_alloc_null(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned null_idx, null_msg->dirty = TRUE; /* Release chunk, marking it dirty */ - if(H5O_chunk_unprotect(f, dxpl_id, oh, null_chk_proxy, H5AC2__DIRTIED_FLAG) < 0) + if(H5O_chunk_unprotect(f, dxpl_id, oh, null_chk_proxy, H5AC__DIRTIED_FLAG) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, UFAIL, "unable to unprotect object header chunk") /* Check for gap in new null message's chunk */ @@ -430,7 +430,7 @@ H5O_alloc_null(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned null_idx, /* Mark the new message as dirty */ alloc_msg->dirty = TRUE; - chk_flags |= H5AC2__DIRTIED_FLAG; + chk_flags |= H5AC__DIRTIED_FLAG; done: /* Release chunk */ @@ -521,7 +521,7 @@ H5O_alloc_extend_chunk(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned chunkno, size_t size, unsigned * msg_idx) { H5O_chunk_proxy_t *chk_proxy = NULL; /* Chunk that message is in */ - unsigned chk_flags = H5AC2__NO_FLAGS_SET; /* Flags for unprotecting chunk */ + unsigned chk_flags = H5AC__NO_FLAGS_SET; /* Flags for unprotecting chunk */ size_t delta; /* Change in chunk's size */ size_t aligned_size = H5O_ALIGN_OH(oh, size); uint8_t *old_image; /* Old address of chunk's image in memory */ @@ -615,7 +615,7 @@ H5O_alloc_extend_chunk(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned chunkno, oh->flags |= new_size_flags; /* Mark object header as dirty in cache */ - if(H5AC2_mark_pinned_or_protected_entry_dirty(oh) < 0) + if(H5AC_mark_pinned_or_protected_entry_dirty(oh) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTMARKDIRTY, FAIL, "unable to mark object header as dirty") } /* end if */ @@ -646,7 +646,7 @@ H5O_alloc_extend_chunk(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned chunkno, /* Mark the extended message as dirty */ oh->mesg[extend_msg].dirty = TRUE; - chk_flags |= H5AC2__DIRTIED_FLAG; + chk_flags |= H5AC__DIRTIED_FLAG; /* Allocate more memory space for chunk's image */ old_image = oh->chunk[chunkno].image; @@ -677,7 +677,7 @@ H5O_alloc_extend_chunk(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned chunkno, if(chunkno > 0 && (H5O_CONT_ID == oh->mesg[u].type->id) && (((H5O_cont_t *)(oh->mesg[u].native))->chunkno == chunkno)) { H5O_chunk_proxy_t *chk_proxy2 = NULL; /* Chunk that continuation message is in */ - unsigned chk_flags2 = H5AC2__NO_FLAGS_SET; /* Flags for unprotecting chunk */ + unsigned chk_flags2 = H5AC__NO_FLAGS_SET; /* Flags for unprotecting chunk */ unsigned cont_chunkno = oh->mesg[u].chunkno; /* Chunk # for continuation message */ /* Protect chunk containing continuation message */ @@ -690,7 +690,7 @@ H5O_alloc_extend_chunk(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned chunkno, /* Flag continuation message as dirty */ oh->mesg[u].dirty = TRUE; - chk_flags2 |= H5AC2__DIRTIED_FLAG; + chk_flags2 |= H5AC__DIRTIED_FLAG; /* Release chunk containing continuation message */ if(H5O_chunk_unprotect(f, dxpl_id, oh, chk_proxy2, chk_flags2) < 0) @@ -699,7 +699,7 @@ H5O_alloc_extend_chunk(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned chunkno, } /* end for */ /* Mark the chunk size in the cache as changed */ - chk_flags |= H5AC2__SIZE_CHANGED_FLAG; + chk_flags |= H5AC__SIZE_CHANGED_FLAG; /* Set return value */ *msg_idx = extend_msg; @@ -1001,7 +1001,7 @@ H5O_alloc_new_chunk(H5F_t *f, hid_t dxpl_id, H5O_t *oh, size_t size) null_msg->dirty = TRUE; /* Release chunk, marking it dirty */ - if(H5O_chunk_unprotect(f, dxpl_id, oh, null_chk_proxy, H5AC2__DIRTIED_FLAG) < 0) + if(H5O_chunk_unprotect(f, dxpl_id, oh, null_chk_proxy, H5AC__DIRTIED_FLAG) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, UFAIL, "unable to unprotect object header chunk") } /* end if */ HDassert(found_null >= 0); @@ -1117,7 +1117,7 @@ H5O_alloc(H5F_t *f, hid_t dxpl_id, H5O_t *oh, const H5O_msg_class_t *type, HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, UFAIL, "can't split null message") /* Mark object header as dirty in cache */ - if(H5AC2_mark_pinned_or_protected_entry_dirty(oh) < 0) + if(H5AC_mark_pinned_or_protected_entry_dirty(oh) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTMARKDIRTY, UFAIL, "unable to mark object header as dirty") /* Set return value */ @@ -1147,7 +1147,7 @@ H5O_release_mesg(H5F_t *f, hid_t dxpl_id, H5O_t *oh, H5O_mesg_t *mesg, hbool_t adj_link) { H5O_chunk_proxy_t *chk_proxy = NULL; /* Chunk that message is in */ - unsigned chk_flags = H5AC2__NO_FLAGS_SET; /* Flags for unprotecting chunk */ + unsigned chk_flags = H5AC__NO_FLAGS_SET; /* Flags for unprotecting chunk */ herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI(H5O_release_mesg, FAIL) @@ -1181,7 +1181,7 @@ H5O_release_mesg(H5F_t *f, hid_t dxpl_id, H5O_t *oh, H5O_mesg_t *mesg, /* Mark the message as modified */ mesg->dirty = TRUE; - chk_flags |= H5AC2__DIRTIED_FLAG; + chk_flags |= H5AC__DIRTIED_FLAG; /* Release chunk */ if(H5O_chunk_unprotect(f, dxpl_id, oh, chk_proxy, chk_flags) < 0) @@ -1285,7 +1285,7 @@ H5O_move_msgs_forward(H5F_t *f, hid_t dxpl_id, H5O_t *oh) curr_msg->dirty = TRUE; /* Release chunk, marking it dirty */ - if(H5O_chunk_unprotect(f, dxpl_id, oh, null_chk_proxy, H5AC2__DIRTIED_FLAG) < 0) + if(H5O_chunk_unprotect(f, dxpl_id, oh, null_chk_proxy, H5AC__DIRTIED_FLAG) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header chunk") @@ -1345,9 +1345,9 @@ H5O_move_msgs_forward(H5F_t *f, hid_t dxpl_id, H5O_t *oh) null_msg->dirty = TRUE; /* Release chunks, marking them dirty */ - if(H5O_chunk_unprotect(f, dxpl_id, oh, null_chk_proxy, H5AC2__DIRTIED_FLAG) < 0) + if(H5O_chunk_unprotect(f, dxpl_id, oh, null_chk_proxy, H5AC__DIRTIED_FLAG) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header chunk") - if(H5O_chunk_unprotect(f, dxpl_id, oh, curr_chk_proxy, H5AC2__DIRTIED_FLAG) < 0) + if(H5O_chunk_unprotect(f, dxpl_id, oh, curr_chk_proxy, H5AC__DIRTIED_FLAG) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header chunk") /* Check for gap in null message's chunk */ @@ -1373,7 +1373,7 @@ H5O_move_msgs_forward(H5F_t *f, hid_t dxpl_id, H5O_t *oh) null_msg->dirty = TRUE; /* Release null message's chunk, marking it dirty */ - if(H5O_chunk_unprotect(f, dxpl_id, oh, null_chk_proxy, H5AC2__DIRTIED_FLAG) < 0) + if(H5O_chunk_unprotect(f, dxpl_id, oh, null_chk_proxy, H5AC__DIRTIED_FLAG) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header chunk") /* Add the gap to the chunk */ @@ -1392,7 +1392,7 @@ H5O_move_msgs_forward(H5F_t *f, hid_t dxpl_id, H5O_t *oh) null_msg->dirty = TRUE; /* Release null message's chunk, marking it dirty */ - if(H5O_chunk_unprotect(f, dxpl_id, oh, null_chk_proxy, H5AC2__DIRTIED_FLAG) < 0) + if(H5O_chunk_unprotect(f, dxpl_id, oh, null_chk_proxy, H5AC__DIRTIED_FLAG) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header chunk") /* Create new null message for previous location of non-null message */ @@ -1419,7 +1419,7 @@ H5O_move_msgs_forward(H5F_t *f, hid_t dxpl_id, H5O_t *oh) oh->mesg[new_null_msg].dirty = TRUE; /* Release new null message's chunk, marking it dirty */ - if(H5O_chunk_unprotect(f, dxpl_id, oh, curr_chk_proxy, H5AC2__DIRTIED_FLAG) < 0) + if(H5O_chunk_unprotect(f, dxpl_id, oh, curr_chk_proxy, H5AC__DIRTIED_FLAG) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header chunk") /* Check for gap in new null message's chunk */ @@ -1553,7 +1553,7 @@ H5O_merge_null(H5F_t *f, hid_t dxpl_id, H5O_t *oh) curr_msg->dirty = TRUE; /* Release new null message's chunk, marking it dirty */ - if(H5O_chunk_unprotect(f, dxpl_id, oh, curr_chk_proxy, H5AC2__DIRTIED_FLAG) < 0) + if(H5O_chunk_unprotect(f, dxpl_id, oh, curr_chk_proxy, H5AC__DIRTIED_FLAG) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header chunk") /* Remove second message from list of messages */ @@ -1695,11 +1695,11 @@ H5O_remove_empty_chunks(H5F_t *f, hid_t dxpl_id, H5O_t *oh) unsigned chk_proxy_status = 0; /* Metadata cache status of chunk proxy for chunk */ /* Check the chunk proxy's status in the metadata cache */ - if(H5AC2_get_entry_status(f, oh->chunk[u].addr, &chk_proxy_status) < 0) + if(H5AC_get_entry_status(f, oh->chunk[u].addr, &chk_proxy_status) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "unable to check metadata cache status for chunk proxy") /* If the entry is in the cache, update its chunk index */ - if(chk_proxy_status & H5AC2_ES__IN_CACHE) { + if(chk_proxy_status & H5AC_ES__IN_CACHE) { if(H5O_chunk_update_idx(f, dxpl_id, oh, u) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, FAIL, "unable to update index for chunk proxy") } /* end if */ diff --git a/src/H5Oattribute.c b/src/H5Oattribute.c index 244dd5e..cad15ce 100644 --- a/src/H5Oattribute.c +++ b/src/H5Oattribute.c @@ -233,7 +233,7 @@ H5O_attr_create(const H5O_loc_t *loc, hid_t dxpl_id, H5A_t *attr) HDassert(attr); /* Protect the object header to iterate over */ - if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC2_WRITE))) + if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_WRITE))) HGOTO_ERROR(H5E_ATTR, H5E_CANTPROTECT, FAIL, "unable to load object header") /* Pin the object header */ @@ -241,7 +241,7 @@ H5O_attr_create(const H5O_loc_t *loc, hid_t dxpl_id, H5A_t *attr) HGOTO_ERROR(H5E_ATTR, H5E_CANTPIN, FAIL, "unable to pin object header") /* Unprotect the object header */ - if(H5O_unprotect(loc, dxpl_id, oh, H5AC2__NO_FLAGS_SET) < 0) + if(H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header") /* Check if this object already has attribute information */ @@ -490,7 +490,7 @@ H5O_attr_open_by_name(const H5O_loc_t *loc, const char *name, hid_t dxpl_id) HDassert(name); /* Protect the object header to iterate over */ - if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC2_READ))) + if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ))) HGOTO_ERROR(H5E_ATTR, H5E_CANTPROTECT, NULL, "unable to load object header") /* Check for attribute info stored */ @@ -535,7 +535,7 @@ H5O_attr_open_by_name(const H5O_loc_t *loc, const char *name, hid_t dxpl_id) } done: - if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC2__NO_FLAGS_SET) < 0) + if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_ATTR, H5E_CANTUNPROTECT, NULL, "unable to release object header") FUNC_LEAVE_NOAPI(ret_value) @@ -621,7 +621,7 @@ H5O_attr_open_by_idx(const H5O_loc_t *loc, H5_index_t idx_type, /* Protect the object header to iterate over */ - if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC2_READ))) + if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ))) HGOTO_ERROR(H5E_ATTR, H5E_CANTPROTECT, NULL, "unable to load object header") /* Check for attribute info stored */ @@ -649,7 +649,7 @@ H5O_attr_open_by_idx(const H5O_loc_t *loc, H5_index_t idx_type, } done: - if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC2__NO_FLAGS_SET) < 0) + if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_ATTR, H5E_CANTUNPROTECT, NULL, "unable to release object header") FUNC_LEAVE_NOAPI(ret_value) @@ -824,7 +824,7 @@ H5O_attr_write_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/, { H5O_iter_wrt_t *udata = (H5O_iter_wrt_t *)_udata; /* Operator user data */ H5O_chunk_proxy_t *chk_proxy = NULL; /* Chunk that message is in */ - unsigned chk_flags = H5AC2__NO_FLAGS_SET; /* Flags for unprotecting chunk */ + unsigned chk_flags = H5AC__NO_FLAGS_SET; /* Flags for unprotecting chunk */ herr_t ret_value = H5_ITER_CONT; /* Return value */ FUNC_ENTER_NOAPI_NOINIT(H5O_attr_write_cb) @@ -853,7 +853,7 @@ H5O_attr_write_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/, /* Mark the message as modified */ mesg->dirty = TRUE; - chk_flags |= H5AC2__DIRTIED_FLAG; + chk_flags |= H5AC__DIRTIED_FLAG; /* Release chunk */ if(H5O_chunk_unprotect(udata->f, udata->dxpl_id, oh, chk_proxy, chk_flags) < 0) @@ -910,7 +910,7 @@ H5O_attr_write(const H5O_loc_t *loc, hid_t dxpl_id, H5A_t *attr) HDassert(attr); /* Protect the object header to iterate over */ - if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC2_WRITE))) + if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_WRITE))) HGOTO_ERROR(H5E_ATTR, H5E_CANTPROTECT, FAIL, "unable to load object header") /* Pin the object header */ @@ -918,7 +918,7 @@ H5O_attr_write(const H5O_loc_t *loc, hid_t dxpl_id, H5A_t *attr) HGOTO_ERROR(H5E_ATTR, H5E_CANTPIN, FAIL, "unable to pin object header") /* Unprotect the object header */ - if(H5O_unprotect(loc, dxpl_id, oh, H5AC2__NO_FLAGS_SET) < 0) + if(H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header") /* Check for attribute info stored */ @@ -1032,7 +1032,7 @@ H5O_attr_rename_mod_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/, { H5O_iter_ren_t *udata = (H5O_iter_ren_t *)_udata; /* Operator user data */ H5O_chunk_proxy_t *chk_proxy = NULL; /* Chunk that message is in */ - unsigned chk_flags = H5AC2__NO_FLAGS_SET; /* Flags for unprotecting chunk */ + unsigned chk_flags = H5AC__NO_FLAGS_SET; /* Flags for unprotecting chunk */ herr_t ret_value = H5_ITER_CONT; /* Return value */ FUNC_ENTER_NOAPI_NOINIT(H5O_attr_rename_mod_cb) @@ -1060,7 +1060,7 @@ H5O_attr_rename_mod_cb(H5O_t *oh, H5O_mesg_t *mesg/*in,out*/, /* Mark the message as modified */ mesg->dirty = TRUE; - chk_flags |= H5AC2__DIRTIED_FLAG; + chk_flags |= H5AC__DIRTIED_FLAG; /* Release chunk */ if(H5O_chunk_unprotect(udata->f, udata->dxpl_id, oh, chk_proxy, chk_flags) < 0) @@ -1162,7 +1162,7 @@ H5O_attr_rename(const H5O_loc_t *loc, hid_t dxpl_id, const char *old_name, HDassert(new_name); /* Protect the object header to iterate over */ - if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC2_WRITE))) + if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_WRITE))) HGOTO_ERROR(H5E_ATTR, H5E_CANTPROTECT, FAIL, "unable to load object header") /* Pin the object header */ @@ -1170,7 +1170,7 @@ H5O_attr_rename(const H5O_loc_t *loc, hid_t dxpl_id, const char *old_name, HGOTO_ERROR(H5E_ATTR, H5E_CANTPIN, FAIL, "unable to pin object header") /* Unprotect the object header */ - if(H5O_unprotect(loc, dxpl_id, oh, H5AC2__NO_FLAGS_SET) < 0) + if(H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header") /* Check for attribute info stored */ @@ -1260,7 +1260,7 @@ H5O_attr_iterate_real(hid_t loc_id, const H5O_loc_t *loc, hid_t dxpl_id, HDassert(attr_op); /* Protect the object header to iterate over */ - if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC2_READ))) + if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ))) HGOTO_ERROR(H5E_ATTR, H5E_CANTPROTECT, FAIL, "unable to load object header") /* Check for attribute info stored */ @@ -1276,7 +1276,7 @@ H5O_attr_iterate_real(hid_t loc_id, const H5O_loc_t *loc, hid_t dxpl_id, HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid index specified") /* Release the object header */ - if(H5O_unprotect(loc, dxpl_id, oh, H5AC2__NO_FLAGS_SET) < 0) + if(H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTUNPROTECT, FAIL, "unable to release object header") oh = NULL; @@ -1291,7 +1291,7 @@ H5O_attr_iterate_real(hid_t loc_id, const H5O_loc_t *loc, hid_t dxpl_id, HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "error building attribute table") /* Release the object header */ - if(H5O_unprotect(loc, dxpl_id, oh, H5AC2__NO_FLAGS_SET) < 0) + if(H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTUNPROTECT, FAIL, "unable to release object header") oh = NULL; @@ -1306,7 +1306,7 @@ H5O_attr_iterate_real(hid_t loc_id, const H5O_loc_t *loc, hid_t dxpl_id, done: /* Release resources */ - if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC2__NO_FLAGS_SET) < 0) + if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_ATTR, H5E_CANTUNPROTECT, FAIL, "unable to release object header") if(atable.attrs && H5A_attr_release_table(&atable) < 0) HDONE_ERROR(H5E_ATTR, H5E_CANTFREE, FAIL, "unable to release attribute table") @@ -1553,7 +1553,7 @@ H5O_attr_remove(const H5O_loc_t *loc, const char *name, hid_t dxpl_id) HDassert(name); /* Protect the object header to iterate over */ - if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC2_WRITE))) + if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_WRITE))) HGOTO_ERROR(H5E_ATTR, H5E_CANTPROTECT, FAIL, "unable to load object header") /* Pin the object header */ @@ -1561,7 +1561,7 @@ H5O_attr_remove(const H5O_loc_t *loc, const char *name, hid_t dxpl_id) HGOTO_ERROR(H5E_ATTR, H5E_CANTPIN, FAIL, "unable to pin object header") /* Unprotect the object header */ - if(H5O_unprotect(loc, dxpl_id, oh, H5AC2__NO_FLAGS_SET) < 0) + if(H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header") /* Check for attribute info stored */ @@ -1643,7 +1643,7 @@ H5O_attr_remove_by_idx(const H5O_loc_t *loc, H5_index_t idx_type, HDassert(loc); /* Protect the object header to iterate over */ - if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC2_WRITE))) + if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_WRITE))) HGOTO_ERROR(H5E_ATTR, H5E_CANTPROTECT, FAIL, "unable to load object header") /* Pin the object header */ @@ -1651,7 +1651,7 @@ H5O_attr_remove_by_idx(const H5O_loc_t *loc, H5_index_t idx_type, HGOTO_ERROR(H5E_ATTR, H5E_CANTPIN, FAIL, "unable to pin object header") /* Unprotect the object header */ - if(H5O_unprotect(loc, dxpl_id, oh, H5AC2__NO_FLAGS_SET) < 0) + if(H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header") /* Check for attribute info stored */ @@ -1830,7 +1830,7 @@ H5O_attr_exists(const H5O_loc_t *loc, const char *name, hid_t dxpl_id) HDassert(name); /* Protect the object header to iterate over */ - if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC2_READ))) + if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ))) HGOTO_ERROR(H5E_ATTR, H5E_CANTPROTECT, FAIL, "unable to load object header") /* Check for attribute info stored */ @@ -1866,7 +1866,7 @@ H5O_attr_exists(const H5O_loc_t *loc, const char *name, hid_t dxpl_id) } /* end else */ done: - if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC2__NO_FLAGS_SET) < 0) + if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_ATTR, H5E_CANTUNPROTECT, FAIL, "unable to release object header") FUNC_LEAVE_NOAPI(ret_value) @@ -1968,14 +1968,14 @@ H5O_attr_count(const H5O_loc_t *loc, hid_t dxpl_id) HDassert(loc); /* Protect the object header to iterate over */ - if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC2_READ))) + if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ))) HGOTO_ERROR(H5E_ATTR, H5E_CANTPROTECT, FAIL, "unable to load object header") /* Retrieve # of attributes on object */ ret_value = (int)H5O_attr_count_real(loc->file, dxpl_id, oh); done: - if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC2__NO_FLAGS_SET) < 0) + if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_ATTR, H5E_CANTUNPROTECT, FAIL, "unable to release object header") FUNC_LEAVE_NOAPI(ret_value) diff --git a/src/H5Ocache.c b/src/H5Ocache.c index f6b5cbb..158f432 100644 --- a/src/H5Ocache.c +++ b/src/H5Ocache.c @@ -94,8 +94,8 @@ static herr_t H5O_add_cont_msg(H5O_cont_msgs_t *cont_msg_info, /*********************/ /* H5O object header prefix inherits cache-like properties from H5AC */ -const H5AC2_class_t H5AC2_OHDR[1] = {{ - H5AC2_OHDR_ID, +const H5AC_class_t H5AC_OHDR[1] = {{ + H5AC_OHDR_ID, "object header", H5FD_MEM_OHDR, H5O_cache_deserialize, @@ -106,8 +106,8 @@ const H5AC2_class_t H5AC2_OHDR[1] = {{ }}; /* H5O object header chunk inherits cache-like properties from H5AC */ -const H5AC2_class_t H5AC2_OHDR_CHK[1] = {{ - H5AC2_OHDR_CHK_ID, +const H5AC_class_t H5AC_OHDR_CHK[1] = {{ + H5AC_OHDR_CHK_ID, "object header chunk", H5FD_MEM_OHDR, H5O_cache_chk_deserialize, diff --git a/src/H5Ochunk.c b/src/H5Ochunk.c index 813006e..0420799 100644 --- a/src/H5Ochunk.c +++ b/src/H5Ochunk.c @@ -114,7 +114,7 @@ H5O_chunk_add(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned idx) chk_proxy->chunkno = idx; /* Insert the chunk proxy into the cache */ - if(H5AC2_set(f, dxpl_id, H5AC2_OHDR_CHK, oh->chunk[idx].addr, oh->chunk[idx].size, chk_proxy, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_set(f, dxpl_id, H5AC_OHDR_CHK, oh->chunk[idx].addr, oh->chunk[idx].size, chk_proxy, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, FAIL, "unable to cache object header chunk") chk_proxy = NULL; @@ -175,7 +175,7 @@ H5O_chunk_protect(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned idx) chk_udata.chunkno = idx; /* Get the chunk proxy */ - if(NULL == (chk_proxy = (H5O_chunk_proxy_t *)H5AC2_protect(f, dxpl_id, H5AC2_OHDR_CHK, oh->chunk[idx].addr, oh->chunk[idx].size, &chk_udata, H5AC2_WRITE))) + if(NULL == (chk_proxy = (H5O_chunk_proxy_t *)H5AC_protect(f, dxpl_id, H5AC_OHDR_CHK, oh->chunk[idx].addr, oh->chunk[idx].size, &chk_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, NULL, "unable to load object header chunk") /* Sanity check */ @@ -217,20 +217,20 @@ H5O_chunk_unprotect(H5F_t *f, hid_t dxpl_id, H5O_t *oh, H5O_chunk_proxy_t *chk_p HDassert(f); HDassert(oh); HDassert(chk_proxy); - HDassert(!(chk_flags & (unsigned)~(H5AC2__DIRTIED_FLAG | H5AC2__SIZE_CHANGED_FLAG))); + HDassert(!(chk_flags & (unsigned)~(H5AC__DIRTIED_FLAG | H5AC__SIZE_CHANGED_FLAG))); /* Check for releasing first chunk */ if(0 == chk_proxy->chunkno) { /* Check for resizing the first chunk */ - if(chk_flags & H5AC2__SIZE_CHANGED_FLAG) { + if(chk_flags & H5AC__SIZE_CHANGED_FLAG) { /* Resize object header in cache */ - if(H5AC2_resize_pinned_entry(oh, oh->chunk[0].size) < 0) + if(H5AC_resize_pinned_entry(oh, oh->chunk[0].size) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTRESIZE, FAIL, "unable to resize chunk in cache") } /* end if */ /* Check for dirtying the first chunk */ - else if(chk_flags & H5AC2__DIRTIED_FLAG) { + else if(chk_flags & H5AC__DIRTIED_FLAG) { /* Mark object header as dirty in cache */ - if(H5AC2_mark_pinned_or_protected_entry_dirty(oh) < 0) + if(H5AC_mark_pinned_or_protected_entry_dirty(oh) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTMARKDIRTY, FAIL, "unable to mark object header as dirty") } /* end else/if */ else @@ -244,7 +244,7 @@ H5O_chunk_unprotect(H5F_t *f, hid_t dxpl_id, H5O_t *oh, H5O_chunk_proxy_t *chk_p } /* end if */ else { /* Release the chunk proxy from the cache, marking it dirty */ - if(H5AC2_unprotect(f, dxpl_id, H5AC2_OHDR_CHK, oh->chunk[chk_proxy->chunkno].addr, oh->chunk[chk_proxy->chunkno].size, chk_proxy, chk_flags) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_OHDR_CHK, oh->chunk[chk_proxy->chunkno].addr, oh->chunk[chk_proxy->chunkno].size, chk_proxy, chk_flags) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header chunk") } /* end else */ @@ -289,14 +289,14 @@ H5O_chunk_update_idx(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned idx) chk_udata.chunkno = idx; /* Get the chunk proxy */ - if(NULL == (chk_proxy = (H5O_chunk_proxy_t *)H5AC2_protect(f, dxpl_id, H5AC2_OHDR_CHK, oh->chunk[idx].addr, oh->chunk[idx].size, &chk_udata, H5AC2_WRITE))) + if(NULL == (chk_proxy = (H5O_chunk_proxy_t *)H5AC_protect(f, dxpl_id, H5AC_OHDR_CHK, oh->chunk[idx].addr, oh->chunk[idx].size, &chk_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header chunk") /* Update index for chunk proxy in cache */ chk_proxy->chunkno = idx; /* Release the chunk proxy from the cache, marking it deleted */ - if(H5AC2_unprotect(f, dxpl_id, H5AC2_OHDR_CHK, oh->chunk[idx].addr, oh->chunk[idx].size, chk_proxy, H5AC2__DIRTIED_FLAG) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_OHDR_CHK, oh->chunk[idx].addr, oh->chunk[idx].size, chk_proxy, H5AC__DIRTIED_FLAG) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header chunk") done: @@ -340,7 +340,7 @@ H5O_chunk_delete(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned idx) chk_udata.chunkno = idx; /* Get the chunk proxy */ - if(NULL == (chk_proxy = (H5O_chunk_proxy_t *)H5AC2_protect(f, dxpl_id, H5AC2_OHDR_CHK, oh->chunk[idx].addr, oh->chunk[idx].size, &chk_udata, H5AC2_WRITE))) + if(NULL == (chk_proxy = (H5O_chunk_proxy_t *)H5AC_protect(f, dxpl_id, H5AC_OHDR_CHK, oh->chunk[idx].addr, oh->chunk[idx].size, &chk_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header chunk") /* Sanity check */ @@ -348,7 +348,7 @@ H5O_chunk_delete(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned idx) HDassert(chk_proxy->chunkno == idx); /* Release the chunk proxy from the cache, marking it deleted */ - if(H5AC2_unprotect(f, dxpl_id, H5AC2_OHDR_CHK, oh->chunk[idx].addr, oh->chunk[idx].size, chk_proxy, (H5AC2__DIRTIED_FLAG | H5AC2__DELETED_FLAG)) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_OHDR_CHK, oh->chunk[idx].addr, oh->chunk[idx].size, chk_proxy, (H5AC__DIRTIED_FLAG | H5AC__DELETED_FLAG)) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header chunk") done: diff --git a/src/H5Ocopy.c b/src/H5Ocopy.c index 7edad1e..94c7646 100644 --- a/src/H5Ocopy.c +++ b/src/H5Ocopy.c @@ -34,7 +34,7 @@ /* Headers */ /***********/ #include "H5private.h" /* Generic Functions */ -#include "H5AC2private.h" /* Metadata cache */ +#include "H5ACprivate.h" /* Metadata cache */ #include "H5Eprivate.h" /* Error handling */ #include "H5FLprivate.h" /* Free lists */ #include "H5Iprivate.h" /* IDs */ @@ -187,7 +187,7 @@ H5Ocopy(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id, herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_API_META(H5Ocopy, dst_loc_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Ocopy, dst_loc_id, H5AC_dxpl_id, FAIL) H5TRACE6("e", "i*si*sii", src_loc_id, src_name, dst_loc_id, dst_name, ocpypl_id, lcpl_id); @@ -213,7 +213,7 @@ H5Ocopy(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id, H5G_loc_reset(&tmp_loc); /* Check if object already exists in destination */ - if(H5G_loc_find(&dst_loc, dst_name, &tmp_loc, H5P_DEFAULT, H5AC2_dxpl_id) >= 0) { + if(H5G_loc_find(&dst_loc, dst_name, &tmp_loc, H5P_DEFAULT, H5AC_dxpl_id) >= 0) { H5G_name_free(&tmp_path); HGOTO_ERROR(H5E_SYM, H5E_EXISTS, FAIL, "destination object already exists") } /* end if */ @@ -225,7 +225,7 @@ H5Ocopy(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id, H5G_loc_reset(&src_loc); /* Find the source object to copy */ - if(H5G_loc_find(&loc, src_name, &src_loc/*out*/, H5P_DEFAULT, H5AC2_dxpl_id) < 0) + if(H5G_loc_find(&loc, src_name, &src_loc/*out*/, H5P_DEFAULT, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "source object not found") loc_found = TRUE; @@ -317,7 +317,7 @@ H5O_copy_header_real(const H5O_loc_t *oloc_src, H5O_loc_t *oloc_dst /*out */, HDassert(cpy_info); /* Get source object header */ - if(NULL == (oh_src = H5O_protect(oloc_src, dxpl_id, H5AC2_READ))) + if(NULL == (oh_src = H5O_protect(oloc_src, dxpl_id, H5AC_READ))) HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header") /* Get pointer to object class for this object */ @@ -720,7 +720,7 @@ H5O_copy_header_real(const H5O_loc_t *oloc_src, H5O_loc_t *oloc_dst /*out */, } /* end if */ /* Insert destination object header in cache */ - if(H5AC2_set(oloc_dst->file, dxpl_id, H5AC2_OHDR, oloc_dst->addr, (size_t)dst_oh_size, oh_dst, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_set(oloc_dst->file, dxpl_id, H5AC_OHDR, oloc_dst->addr, (size_t)dst_oh_size, oh_dst, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTINSERT, FAIL, "unable to cache object header") oh_dst = NULL; @@ -730,7 +730,7 @@ done: HDfree(deleted); /* Release pointer to source object header and its derived objects */ - if(oh_src && H5O_unprotect(oloc_src, dxpl_id, oh_src, H5AC2__NO_FLAGS_SET) < 0) + if(oh_src && H5O_unprotect(oloc_src, dxpl_id, oh_src, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header") /* Release pointer to destination object header */ @@ -942,7 +942,7 @@ H5O_copy_obj(H5G_loc_t *src_loc, H5G_loc_t *dst_loc, const char *dst_name, hid_t ocpypl_id, hid_t lcpl_id) { H5P_genplist_t *ocpy_plist=NULL; /* Object copy property list created */ - hid_t dxpl_id=H5AC2_dxpl_id; + hid_t dxpl_id=H5AC_dxpl_id; H5G_name_t new_path; /* Copied object group hier. path */ H5O_loc_t new_oloc; /* Copied object object location */ H5G_loc_t new_loc; /* Group location of object copied */ diff --git a/src/H5Odbg.c b/src/H5Odbg.c index 3767852..b751e14 100644 --- a/src/H5Odbg.c +++ b/src/H5Odbg.c @@ -538,14 +538,14 @@ H5O_debug(H5F_t *f, hid_t dxpl_id, haddr_t addr, FILE *stream, int indent, int f loc.addr = addr; loc.holding_file = FALSE; - if(NULL == (oh = H5O_protect(&loc, dxpl_id, H5AC2_READ))) + if(NULL == (oh = H5O_protect(&loc, dxpl_id, H5AC_READ))) HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header") /* debug */ H5O_debug_real(f, dxpl_id, oh, addr, stream, indent, fwidth); done: - if(oh && H5O_unprotect(&loc, dxpl_id, oh, H5AC2__NO_FLAGS_SET) < 0) + if(oh && H5O_unprotect(&loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header") FUNC_LEAVE_NOAPI(ret_value) diff --git a/src/H5Oefl.c b/src/H5Oefl.c index 49a183e..d6e6ede 100644 --- a/src/H5Oefl.c +++ b/src/H5Oefl.c @@ -122,7 +122,7 @@ H5O_efl_decode(H5F_t *f, hid_t dxpl_id, unsigned UNUSED mesg_flags, #ifndef NDEBUG HDassert(H5F_addr_defined(mesg->heap_addr)); - if(NULL == (heap = H5HL_protect(f, dxpl_id, mesg->heap_addr, H5AC2_READ))) + if(NULL == (heap = H5HL_protect(f, dxpl_id, mesg->heap_addr, H5AC_READ))) HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, NULL, "unable to read protect link value") s = H5HL_offset_into(heap, 0); @@ -139,7 +139,7 @@ H5O_efl_decode(H5F_t *f, hid_t dxpl_id, unsigned UNUSED mesg_flags, if(NULL == mesg->slot) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed") - if(NULL == (heap = H5HL_protect(f, dxpl_id, mesg->heap_addr, H5AC2_READ))) + if(NULL == (heap = H5HL_protect(f, dxpl_id, mesg->heap_addr, H5AC_READ))) HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, NULL, "unable to read protect link value") for(u = 0; u < mesg->nused; u++) { /* Name */ @@ -450,7 +450,7 @@ H5O_efl_copy_file(H5F_t UNUSED *file_src, void *mesg_src, H5F_t *file_dst, HGOTO_ERROR(H5E_EFL, H5E_CANTINIT, NULL, "can't create heap") /* Pin the heap down in memory */ - if(NULL == (heap = H5HL_protect(file_dst, dxpl_id, efl_dst->heap_addr, H5AC2_WRITE))) + if(NULL == (heap = H5HL_protect(file_dst, dxpl_id, efl_dst->heap_addr, H5AC_WRITE))) HGOTO_ERROR(H5E_EFL, H5E_PROTECT, NULL, "unable to protect EFL file name heap") /* Insert "empty" name first */ diff --git a/src/H5Ofill.c b/src/H5Ofill.c index fdbac17..9f7a0fc 100644 --- a/src/H5Ofill.c +++ b/src/H5Ofill.c @@ -23,7 +23,7 @@ #define H5O_PACKAGE /*suppress error about including H5Opkg */ #include "H5private.h" /* Generic Functions */ -#include "H5AC2private.h" /* Metadata cache */ +#include "H5ACprivate.h" /* Metadata cache */ #include "H5Dprivate.h" /* Datasets */ #include "H5Eprivate.h" /* Error handling */ #include "H5FLprivate.h" /* Free Lists */ @@ -523,7 +523,7 @@ H5O_fill_copy(const void *_src, void *_dst) H5T_path_t *tpath; /* Conversion information */ /* Set up type conversion function */ - if(NULL == (tpath = H5T_path_find(src->type, dst->type, NULL, NULL, H5AC2_ind_dxpl_id, FALSE))) + if(NULL == (tpath = H5T_path_find(src->type, dst->type, NULL, NULL, H5AC_ind_dxpl_id, FALSE))) HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, NULL, "unable to convert between src and dst data types") /* If necessary, convert fill value datatypes (which copies VL components, etc.) */ @@ -551,7 +551,7 @@ H5O_fill_copy(const void *_src, void *_dst) } /* end if */ /* Convert fill value */ - if(H5T_convert(tpath, src_id, dst_id, (size_t)1, (size_t)0, (size_t)0, dst->buf, bkg_buf, H5AC2_ind_dxpl_id) < 0) { + if(H5T_convert(tpath, src_id, dst_id, (size_t)1, (size_t)0, (size_t)0, dst->buf, bkg_buf, H5AC_ind_dxpl_id) < 0) { H5I_dec_ref(src_id); H5I_dec_ref(dst_id); if(bkg_buf) diff --git a/src/H5Omdj_msg.c b/src/H5Omdj_msg.c index 954f61f..e4cb0b5 100644 --- a/src/H5Omdj_msg.c +++ b/src/H5Omdj_msg.c @@ -176,7 +176,7 @@ H5O_mdj_msg_decode(H5F_t *f, /* get the journal file path length */ UINT32DECODE(p, path_len); - if ( path_len > H5C2__MAX_JOURNAL_FILE_NAME_LEN ) { + if ( path_len > H5C__MAX_JOURNAL_FILE_NAME_LEN ) { HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, NULL, "path length too big.") } @@ -251,7 +251,7 @@ H5O_mdj_msg_encode(H5F_t *f, HGOTO_ERROR(H5E_SYSTEM, H5E_SYSERRSTR, FAIL, "Bad params on entry."); } - if ( mesg->mdc_jnl_file_name_len > H5C2__MAX_JOURNAL_FILE_NAME_LEN ) { + if ( mesg->mdc_jnl_file_name_len > H5C__MAX_JOURNAL_FILE_NAME_LEN ) { HGOTO_ERROR(H5E_SYSTEM, H5E_SYSERRSTR, FAIL, \ "Bad params on entry -- path len too long."); @@ -315,7 +315,7 @@ H5O_mdj_msg_copy(const void *_mesg, void *_dest) /* Sanity check */ HDassert(mesg); - if ( mesg->mdc_jnl_file_name_len > H5C2__MAX_JOURNAL_FILE_NAME_LEN ) { + if ( mesg->mdc_jnl_file_name_len > H5C__MAX_JOURNAL_FILE_NAME_LEN ) { HGOTO_ERROR(H5E_SYSTEM, H5E_SYSERRSTR, FAIL, "path len too long."); } diff --git a/src/H5Omessage.c b/src/H5Omessage.c index d3c14cd..b3bda5f 100644 --- a/src/H5Omessage.c +++ b/src/H5Omessage.c @@ -132,7 +132,7 @@ H5O_msg_create(const H5O_loc_t *loc, unsigned type_id, unsigned mesg_flags, HGOTO_ERROR(H5E_OHDR, H5E_WRITEERROR, FAIL, "no write intent on file") /* Protect the object header */ - if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC2_WRITE))) + if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_WRITE))) HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header") /* Pin the object header */ @@ -140,7 +140,7 @@ H5O_msg_create(const H5O_loc_t *loc, unsigned type_id, unsigned mesg_flags, HGOTO_ERROR(H5E_OHDR, H5E_CANTPIN, FAIL, "unable to pin object header") /* Unprotect the object header */ - if(H5O_unprotect(loc, dxpl_id, oh, H5AC2__NO_FLAGS_SET) < 0) + if(H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header") /* Go append message to object header */ @@ -293,7 +293,7 @@ H5O_msg_write(const H5O_loc_t *loc, unsigned type_id, unsigned mesg_flags, HGOTO_ERROR(H5E_OHDR, H5E_WRITEERROR, FAIL, "no write intent on file") /* Protect the object header */ - if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC2_WRITE))) + if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_WRITE))) HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header") /* Pin the object header */ @@ -301,7 +301,7 @@ H5O_msg_write(const H5O_loc_t *loc, unsigned type_id, unsigned mesg_flags, HGOTO_ERROR(H5E_OHDR, H5E_CANTPIN, FAIL, "unable to pin object header") /* Unprotect the object header */ - if(H5O_unprotect(loc, dxpl_id, oh, H5AC2__NO_FLAGS_SET) < 0) + if(H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header") /* Call the "real" modify routine */ @@ -500,7 +500,7 @@ H5O_msg_read(const H5O_loc_t *loc, unsigned type_id, void *mesg, HDassert(type_id < NELMTS(H5O_msg_class_g)); /* Get the object header */ - if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC2_READ))) + if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ))) HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, NULL, "unable to load object header") /* Call the "real" read routine */ @@ -508,7 +508,7 @@ H5O_msg_read(const H5O_loc_t *loc, unsigned type_id, void *mesg, HGOTO_ERROR(H5E_OHDR, H5E_READERROR, NULL, "unable to load object header") done: - if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC2__NO_FLAGS_SET) < 0) + if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, NULL, "unable to release object header") FUNC_LEAVE_NOAPI(ret_value) @@ -825,14 +825,14 @@ H5O_msg_count(const H5O_loc_t *loc, unsigned type_id, hid_t dxpl_id) HDassert(type); /* Load the object header */ - if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC2_READ))) + if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ))) HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header") /* Count the messages of the correct type */ ret_value = H5O_msg_count_real(oh, type); done: - if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC2__NO_FLAGS_SET) < 0) + if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header") FUNC_LEAVE_NOAPI(ret_value) @@ -906,7 +906,7 @@ H5O_msg_exists(const H5O_loc_t *loc, unsigned type_id, hid_t dxpl_id) HDassert(type_id < NELMTS(H5O_msg_class_g)); /* Load the object header */ - if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC2_READ))) + if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ))) HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header") /* Call the "real" exists routine */ @@ -914,7 +914,7 @@ H5O_msg_exists(const H5O_loc_t *loc, unsigned type_id, hid_t dxpl_id) HGOTO_ERROR(H5E_OHDR, H5E_READERROR, FAIL, "unable to verify object header message") done: - if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC2__NO_FLAGS_SET) < 0) + if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header") FUNC_LEAVE_NOAPI(ret_value) @@ -1003,7 +1003,7 @@ H5O_msg_remove(const H5O_loc_t *loc, unsigned type_id, int sequence, hbool_t adj HDassert(type); /* Protect the object header to iterate over */ - if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC2_WRITE))) + if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_WRITE))) HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header") /* Pin the object header */ @@ -1011,7 +1011,7 @@ H5O_msg_remove(const H5O_loc_t *loc, unsigned type_id, int sequence, hbool_t adj HGOTO_ERROR(H5E_OHDR, H5E_CANTPIN, FAIL, "unable to pin object header") /* Unprotect the object header */ - if(H5O_unprotect(loc, dxpl_id, oh, H5AC2__NO_FLAGS_SET) < 0) + if(H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header") /* Call the "real" remove routine */ @@ -1063,7 +1063,7 @@ H5O_msg_remove_op(const H5O_loc_t *loc, unsigned type_id, int sequence, HDassert(type); /* Protect the object header to iterate over */ - if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC2_WRITE))) + if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_WRITE))) HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header") /* Pin the object header */ @@ -1071,7 +1071,7 @@ H5O_msg_remove_op(const H5O_loc_t *loc, unsigned type_id, int sequence, HGOTO_ERROR(H5E_OHDR, H5E_CANTPIN, FAIL, "unable to pin object header") /* Unprotect the object header */ - if(H5O_unprotect(loc, dxpl_id, oh, H5AC2__NO_FLAGS_SET) < 0) + if(H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to unprotect object header") /* Call the "real" remove routine */ @@ -1262,7 +1262,7 @@ H5O_msg_iterate(const H5O_loc_t *loc, unsigned type_id, HDassert(op); /* Protect the object header to iterate over */ - if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC2_READ))) + if(NULL == (oh = H5O_protect(loc, dxpl_id, H5AC_READ))) HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header") /* Call the "real" iterate routine */ @@ -1270,7 +1270,7 @@ H5O_msg_iterate(const H5O_loc_t *loc, unsigned type_id, HERROR(H5E_OHDR, H5E_BADITER, "unable to iterate over object header messages"); done: - if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC2__NO_FLAGS_SET) < 0) + if(oh && H5O_unprotect(loc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header") FUNC_LEAVE_NOAPI(ret_value) @@ -1368,7 +1368,7 @@ done: HDONE_ERROR(H5E_OHDR, H5E_CANTUPDATE, FAIL, "unable to update time on object") /* Mark object header as dirty in cache */ - if(H5AC2_mark_pinned_or_protected_entry_dirty(oh) < 0) + if(H5AC_mark_pinned_or_protected_entry_dirty(oh) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTMARKDIRTY, FAIL, "unable to mark object header as dirty") } /* end if */ @@ -1996,7 +1996,7 @@ H5O_copy_mesg(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned idx, { H5O_chunk_proxy_t *chk_proxy = NULL; /* Chunk that message is in */ H5O_mesg_t *idx_msg = &oh->mesg[idx]; /* Pointer to message to modify */ - unsigned chk_flags = H5AC2__NO_FLAGS_SET; /* Flags for unprotecting chunk */ + unsigned chk_flags = H5AC__NO_FLAGS_SET; /* Flags for unprotecting chunk */ herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI_NOINIT(H5O_copy_mesg) @@ -2024,7 +2024,7 @@ H5O_copy_mesg(H5F_t *f, hid_t dxpl_id, H5O_t *oh, unsigned idx, /* Mark the message as modified */ idx_msg->dirty = TRUE; - chk_flags |= H5AC2__DIRTIED_FLAG; + chk_flags |= H5AC__DIRTIED_FLAG; /* Release chunk */ if(H5O_chunk_unprotect(f, dxpl_id, oh, chk_proxy, chk_flags) < 0) diff --git a/src/H5Opkg.h b/src/H5Opkg.h index d18d7e6..a256f3d 100644 --- a/src/H5Opkg.h +++ b/src/H5Opkg.h @@ -24,7 +24,7 @@ #include "H5Oprivate.h" /* Object headers */ /* Other private headers needed by this file */ -#include "H5AC2private.h" /* Metadata cache */ +#include "H5ACprivate.h" /* Metadata cache */ /* Object header macros */ #define H5O_NMESGS 8 /*initial number of messages */ @@ -246,7 +246,7 @@ typedef struct H5O_chunk_t { } H5O_chunk_t; struct H5O_t { - H5AC2_info_t cache_info; /* Information for metadata cache functions, _must_ be */ + H5AC_info_t cache_info; /* Information for metadata cache functions, _must_ be */ /* first field in structure */ /* File-specific information (not stored) */ @@ -347,7 +347,7 @@ typedef struct H5O_cache_ud_t { /* Structure representing each chunk in the cache */ typedef struct H5O_chunk_proxy_t { - H5AC2_info_t cache_info; /* Information for metadata cache functions, _must_ be */ + H5AC_info_t cache_info; /* Information for metadata cache functions, _must_ be */ /* first field in structure */ H5O_t *oh; /* Object header for this chunk */ @@ -363,11 +363,11 @@ typedef struct H5O_chk_cache_ud_t { } H5O_chk_cache_ud_t; -/* H5O object header inherits cache-like properties from H5AC2 */ -H5_DLLVAR const H5AC2_class_t H5AC2_OHDR[1]; +/* H5O object header inherits cache-like properties from H5AC */ +H5_DLLVAR const H5AC_class_t H5AC_OHDR[1]; -/* H5O object header chunk inherits cache-like properties from H5AC2 */ -H5_DLLVAR const H5AC2_class_t H5AC2_OHDR_CHK[1]; +/* H5O object header chunk inherits cache-like properties from H5AC */ +H5_DLLVAR const H5AC_class_t H5AC_OHDR_CHK[1]; /* Header message ID to class mapping */ H5_DLLVAR const H5O_msg_class_t *const H5O_msg_class_g[H5O_MSG_TYPES]; diff --git a/src/H5Oprivate.h b/src/H5Oprivate.h index 657b3b5..a960ff8 100644 --- a/src/H5Oprivate.h +++ b/src/H5Oprivate.h @@ -37,7 +37,7 @@ #include "H5Spublic.h" /* Dataspace functions */ /* Private headers needed by this file */ -#include "H5AC2private.h" /* Metadata cache */ +#include "H5ACprivate.h" /* Metadata cache */ #include "H5Fprivate.h" /* File access */ #include "H5SLprivate.h" /* Skip lists */ #include "H5Tprivate.h" /* Datatype functions */ @@ -532,7 +532,7 @@ typedef uint32_t H5O_refcount_t; /* Contains # of links to object, if >1 * The value of this field is undefined unless mdc_jnl_enabled is TRUE. * * mdc_jnl_file_name: Array of char of length - * H5C2__MAX_JOURNAL_FILE_NAME_LEN + 1 used to store the journal + * H5C__MAX_JOURNAL_FILE_NAME_LEN + 1 used to store the journal * file path. * * The value of this field is undefined unless mdc_jnl_enabled is TRUE. @@ -546,7 +546,7 @@ typedef struct H5O_mdj_msg_t { hbool_t mdc_jnl_enabled; int32_t mdc_jnl_magic; size_t mdc_jnl_file_name_len; - char mdc_jnl_file_name[H5C2__MAX_JOURNAL_FILE_NAME_LEN + 1]; + char mdc_jnl_file_name[H5C__MAX_JOURNAL_FILE_NAME_LEN + 1]; } H5O_mdj_msg_t; @@ -596,7 +596,7 @@ H5_DLL herr_t H5O_create(H5F_t *f, hid_t dxpl_id, size_t size_hint, H5_DLL herr_t H5O_open(H5O_loc_t *loc); H5_DLL herr_t H5O_close(H5O_loc_t *loc); H5_DLL int H5O_link(const H5O_loc_t *loc, int adjust, hid_t dxpl_id); -H5_DLL H5O_t *H5O_protect(const H5O_loc_t *loc, hid_t dxpl_id, H5AC2_protect_t prot); +H5_DLL H5O_t *H5O_protect(const H5O_loc_t *loc, hid_t dxpl_id, H5AC_protect_t prot); H5_DLL herr_t H5O_pin(H5O_t *oh); H5_DLL herr_t H5O_unpin(H5O_t *oh); H5_DLL herr_t H5O_unprotect(const H5O_loc_t *loc, hid_t dxpl_id, H5O_t *oh, diff --git a/src/H5Otest.c b/src/H5Otest.c index eade638..b670dea 100644 --- a/src/H5Otest.c +++ b/src/H5Otest.c @@ -33,7 +33,7 @@ /***********/ #include "H5private.h" /* Generic Functions */ #include "H5Apkg.h" /* Attributes */ -#include "H5AC2private.h" /* Metadata cache */ +#include "H5ACprivate.h" /* Metadata cache */ #include "H5Eprivate.h" /* Error handling */ #include "H5Iprivate.h" /* IDs */ #include "H5Opkg.h" /* Object headers */ @@ -108,12 +108,12 @@ H5O_is_attr_dense_test(hid_t oid) HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found") /* Get the object header */ - if(NULL == (oh = H5O_protect(loc, H5AC2_ind_dxpl_id, H5AC2_READ))) + if(NULL == (oh = H5O_protect(loc, H5AC_ind_dxpl_id, H5AC_READ))) HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header") /* Check for attribute info stored */ ainfo.fheap_addr = HADDR_UNDEF; - if(oh->version > H5O_VERSION_1 && NULL == H5A_get_ainfo(loc->file, H5AC2_ind_dxpl_id, oh, &ainfo)) + if(oh->version > H5O_VERSION_1 && NULL == H5A_get_ainfo(loc->file, H5AC_ind_dxpl_id, oh, &ainfo)) /* Clear error stack from not finding attribute info */ H5E_clear_stack(NULL); @@ -128,7 +128,7 @@ H5O_is_attr_dense_test(hid_t oid) ret_value = FALSE; done: - if(oh && H5O_unprotect(loc, H5AC2_ind_dxpl_id, oh, H5AC2__NO_FLAGS_SET) < 0) + if(oh && H5O_unprotect(loc, H5AC_ind_dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header") FUNC_LEAVE_NOAPI(ret_value) @@ -170,12 +170,12 @@ H5O_is_attr_empty_test(hid_t oid) HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found") /* Get the object header */ - if(NULL == (oh = H5O_protect(loc, H5AC2_ind_dxpl_id, H5AC2_READ))) + if(NULL == (oh = H5O_protect(loc, H5AC_ind_dxpl_id, H5AC_READ))) HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header") /* Check for attribute info stored */ ainfo.fheap_addr = HADDR_UNDEF; - if(oh->version > H5O_VERSION_1 && NULL == (ainfo_ptr = H5A_get_ainfo(loc->file, H5AC2_ind_dxpl_id, oh, &ainfo))) + if(oh->version > H5O_VERSION_1 && NULL == (ainfo_ptr = H5A_get_ainfo(loc->file, H5AC_ind_dxpl_id, oh, &ainfo))) /* Clear error stack from not finding attribute info */ H5E_clear_stack(NULL); @@ -191,7 +191,7 @@ H5O_is_attr_empty_test(hid_t oid) HDassert(nattrs == 0); /* Retrieve # of records in name index */ - if(H5B2_get_nrec(loc->file, H5AC2_ind_dxpl_id, H5A_BT2_NAME, ainfo.name_bt2_addr, &nattrs) < 0) + if(H5B2_get_nrec(loc->file, H5AC_ind_dxpl_id, H5A_BT2_NAME, ainfo.name_bt2_addr, &nattrs) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTCOUNT, FAIL, "unable to retrieve # of records from name index") } /* end if */ @@ -206,7 +206,7 @@ H5O_is_attr_empty_test(hid_t oid) ret_value = (nattrs == 0) ? TRUE : FALSE; done: - if(oh && H5O_unprotect(loc, H5AC2_ind_dxpl_id, oh, H5AC2__NO_FLAGS_SET) < 0) + if(oh && H5O_unprotect(loc, H5AC_ind_dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header") FUNC_LEAVE_NOAPI(ret_value) @@ -248,12 +248,12 @@ H5O_num_attrs_test(hid_t oid, hsize_t *nattrs) HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found") /* Get the object header */ - if(NULL == (oh = H5O_protect(loc, H5AC2_ind_dxpl_id, H5AC2_READ))) + if(NULL == (oh = H5O_protect(loc, H5AC_ind_dxpl_id, H5AC_READ))) HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header") /* Check for attribute info stored */ ainfo.fheap_addr = HADDR_UNDEF; - if(oh->version > H5O_VERSION_1 && NULL == H5A_get_ainfo(loc->file, H5AC2_ind_dxpl_id, oh, &ainfo)) + if(oh->version > H5O_VERSION_1 && NULL == H5A_get_ainfo(loc->file, H5AC_ind_dxpl_id, oh, &ainfo)) /* Clear error stack from not finding attribute info */ H5E_clear_stack(NULL); @@ -268,7 +268,7 @@ H5O_num_attrs_test(hid_t oid, hsize_t *nattrs) HDassert(obj_nattrs == 0); /* Retrieve # of records in name index */ - if(H5B2_get_nrec(loc->file, H5AC2_ind_dxpl_id, H5A_BT2_NAME, ainfo.name_bt2_addr, &obj_nattrs) < 0) + if(H5B2_get_nrec(loc->file, H5AC_ind_dxpl_id, H5A_BT2_NAME, ainfo.name_bt2_addr, &obj_nattrs) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTCOUNT, FAIL, "unable to retrieve # of records from name index") } /* end if */ @@ -280,7 +280,7 @@ H5O_num_attrs_test(hid_t oid, hsize_t *nattrs) *nattrs = obj_nattrs; done: - if(oh && H5O_unprotect(loc, H5AC2_ind_dxpl_id, oh, H5AC2__NO_FLAGS_SET) < 0) + if(oh && H5O_unprotect(loc, H5AC_ind_dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header") FUNC_LEAVE_NOAPI(ret_value) @@ -323,12 +323,12 @@ H5O_attr_dense_info_test(hid_t oid, hsize_t *name_count, hsize_t *corder_count) HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found") /* Get the object header */ - if(NULL == (oh = H5O_protect(loc, H5AC2_ind_dxpl_id, H5AC2_READ))) + if(NULL == (oh = H5O_protect(loc, H5AC_ind_dxpl_id, H5AC_READ))) HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header") /* Check for attribute info stored */ ainfo.fheap_addr = HADDR_UNDEF; - if(oh->version > H5O_VERSION_1 && NULL == H5A_get_ainfo(loc->file, H5AC2_ind_dxpl_id, oh, &ainfo)) + if(oh->version > H5O_VERSION_1 && NULL == H5A_get_ainfo(loc->file, H5AC_ind_dxpl_id, oh, &ainfo)) /* Clear error stack from not finding attribute info */ H5E_clear_stack(NULL); @@ -339,20 +339,20 @@ H5O_attr_dense_info_test(hid_t oid, hsize_t *name_count, hsize_t *corder_count) HGOTO_DONE(FAIL) /* Retrieve # of records in name index */ - if(H5B2_get_nrec(loc->file, H5AC2_ind_dxpl_id, H5A_BT2_NAME, ainfo.name_bt2_addr, name_count) < 0) + if(H5B2_get_nrec(loc->file, H5AC_ind_dxpl_id, H5A_BT2_NAME, ainfo.name_bt2_addr, name_count) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTCOUNT, FAIL, "unable to retrieve # of records from name index") /* Check if there is a creation order index */ if(H5F_addr_defined(ainfo.corder_bt2_addr)) { /* Retrieve # of records in creation order index */ - if(H5B2_get_nrec(loc->file, H5AC2_ind_dxpl_id, H5A_BT2_CORDER, ainfo.corder_bt2_addr, corder_count) < 0) + if(H5B2_get_nrec(loc->file, H5AC_ind_dxpl_id, H5A_BT2_CORDER, ainfo.corder_bt2_addr, corder_count) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTCOUNT, FAIL, "unable to retrieve # of records from creation order index") } /* end if */ else *corder_count = 0; done: - if(oh && H5O_unprotect(loc, H5AC2_ind_dxpl_id, oh, H5AC2__NO_FLAGS_SET) < 0) + if(oh && H5O_unprotect(loc, H5AC_ind_dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header") FUNC_LEAVE_NOAPI(ret_value) @@ -396,7 +396,7 @@ H5O_check_msg_marked_test(hid_t oid, hbool_t flag_val) HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found") /* Get the object header */ - if(NULL == (oh = H5O_protect(loc, H5AC2_ind_dxpl_id, H5AC2_READ))) + if(NULL == (oh = H5O_protect(loc, H5AC_ind_dxpl_id, H5AC_READ))) HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header") /* Locate "unknown" message */ @@ -415,7 +415,7 @@ H5O_check_msg_marked_test(hid_t oid, hbool_t flag_val) HGOTO_ERROR(H5E_OHDR, H5E_NOTFOUND, FAIL, "'unknown' message type not found") done: - if(oh && H5O_unprotect(loc, H5AC2_ind_dxpl_id, oh, H5AC2__NO_FLAGS_SET) < 0) + if(oh && H5O_unprotect(loc, H5AC_ind_dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header") FUNC_LEAVE_NOAPI(ret_value) diff --git a/src/H5Pdcpl.c b/src/H5Pdcpl.c index 59e715b..2ee2802 100644 --- a/src/H5Pdcpl.c +++ b/src/H5Pdcpl.c @@ -35,7 +35,7 @@ /* Headers */ /***********/ #include "H5private.h" /* Generic Functions */ -#include "H5AC2private.h" /* Metadata cache */ +#include "H5ACprivate.h" /* Metadata cache */ #include "H5Dprivate.h" /* Datasets */ #include "H5Eprivate.h" /* Error handling */ #include "H5Iprivate.h" /* IDs */ @@ -2106,7 +2106,7 @@ H5Pset_fill_value(hid_t plist_id, hid_t type_id, const void *value) HDmemcpy(fill.buf, value, (size_t)fill.size); /* Set up type conversion function */ - if(NULL == (tpath = H5T_path_find(type, type, NULL, NULL, H5AC2_ind_dxpl_id, FALSE))) + if(NULL == (tpath = H5T_path_find(type, type, NULL, NULL, H5AC_ind_dxpl_id, FALSE))) HGOTO_ERROR(H5E_DATASET, H5E_UNSUPPORTED, FAIL, "unable to convert between src and dest data types") /* If necessary, convert fill value datatypes (which copies VL components, etc.) */ @@ -2118,7 +2118,7 @@ H5Pset_fill_value(hid_t plist_id, hid_t type_id, const void *value) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed") /* Convert the fill value */ - if(H5T_convert(tpath, type_id, type_id, (size_t)1, (size_t)0, (size_t)0, fill.buf, bkg_buf, H5AC2_ind_dxpl_id) < 0) { + if(H5T_convert(tpath, type_id, type_id, (size_t)1, (size_t)0, (size_t)0, fill.buf, bkg_buf, H5AC_ind_dxpl_id) < 0) { if(bkg_buf) bkg_buf = H5FL_BLK_FREE(type_conv, bkg_buf); HGOTO_ERROR(H5E_DATASET, H5E_CANTCONVERT, FAIL, "datatype conversion failed") @@ -2273,7 +2273,7 @@ H5Pget_fill_value(hid_t plist_id, hid_t type_id, void *value/*out*/) HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID") /* Get the fill value */ - if(H5P_get_fill_value(plist, type, value, H5AC2_ind_dxpl_id) < 0) + if(H5P_get_fill_value(plist, type, value, H5AC_ind_dxpl_id) < 0) HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get fill value") done: diff --git a/src/H5Pfapl.c b/src/H5Pfapl.c index b637555..fa67a7a 100644 --- a/src/H5Pfapl.c +++ b/src/H5Pfapl.c @@ -35,7 +35,7 @@ /***********/ #include "H5private.h" /* Generic Functions */ #include "H5AC1private.h" /* Metadata cache */ -#include "H5AC2private.h" /* Metadata cache2 */ +#include "H5ACprivate.h" /* Metadata cache */ #include "H5Dprivate.h" /* Datasets */ #include "H5Eprivate.h" /* Error handling */ #include "H5Fprivate.h" /* Files */ @@ -59,8 +59,8 @@ /* Definitions for the initial metadata cache resize configuration */ #define H5F_ACS_META_CACHE_INIT_CONFIG_SIZE sizeof(H5AC1_cache_config_t) #define H5F_ACS_META_CACHE_INIT_CONFIG_DEF H5AC1__DEFAULT_CACHE_CONFIG -#define H5F_ACS_JNL_INIT_CONFIG_SIZE sizeof(H5AC2_jnl_config_t) -#define H5F_ACS_JNL_INIT_CONFIG_DEF H5AC2__DEFAULT_JNL_CONFIG +#define H5F_ACS_JNL_INIT_CONFIG_SIZE sizeof(H5AC_jnl_config_t) +#define H5F_ACS_JNL_INIT_CONFIG_DEF H5AC__DEFAULT_JNL_CONFIG /* Definitions for size of raw data chunk cache(elements) */ #define H5F_ACS_DATA_CACHE_ELMT_SIZE_SIZE sizeof(size_t) #define H5F_ACS_DATA_CACHE_ELMT_SIZE_DEF 521 @@ -191,7 +191,7 @@ static herr_t H5P_facc_reg_prop(H5P_genclass_t *pclass) { H5AC1_cache_config_t mdc_initCacheCfg = H5F_ACS_META_CACHE_INIT_CONFIG_DEF; /* Default metadata cache settings */ - H5AC2_jnl_config_t initJnlCfg = H5F_ACS_JNL_INIT_CONFIG_DEF; /* Default journaling config settings */ + H5AC_jnl_config_t initJnlCfg = H5F_ACS_JNL_INIT_CONFIG_DEF; /* Default journaling config settings */ size_t rdcc_nelmts = H5F_ACS_DATA_CACHE_ELMT_SIZE_DEF; /* Default raw data chunk cache # of elements */ size_t rdcc_nbytes = H5F_ACS_DATA_CACHE_BYTE_SIZE_DEF; /* Default raw data chunk cache # of bytes */ double rdcc_w0 = H5F_ACS_PREEMPT_READ_CHUNKS_DEF; /* Default raw data chunk cache dirty ratio */ @@ -1402,7 +1402,7 @@ H5Pget_mdc_config(hid_t plist_id, H5AC1_cache_config_t *config_ptr) if(config_ptr == NULL) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "NULL config_ptr on entry.") - if(!H5AC2_validate_cache_config_ver(config_ptr->version)) + if(!H5AC_validate_cache_config_ver(config_ptr->version)) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Unknown config version.") /* If we ever support multiple versions of H5AC1_cache_config_t, we @@ -1433,7 +1433,7 @@ done: *------------------------------------------------------------------------- */ herr_t -H5Pset_jnl_config(hid_t plist_id, const H5AC2_jnl_config_t *config_ptr) +H5Pset_jnl_config(hid_t plist_id, const H5AC_jnl_config_t *config_ptr) { H5P_genplist_t *plist; /* Property list pointer */ herr_t ret_value = SUCCEED; /* return value */ @@ -1446,7 +1446,7 @@ H5Pset_jnl_config(hid_t plist_id, const H5AC2_jnl_config_t *config_ptr) HGOTO_ERROR(H5E_ATOM, H5E_BADATOM, FAIL, "can't find object for ID") /* Validate the new configuration */ - if(H5AC2_validate_jnl_config(config_ptr) < 0) + if(H5AC_validate_jnl_config(config_ptr) < 0) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid journaling configuration") /* Set the modified config */ @@ -1479,7 +1479,7 @@ done: *------------------------------------------------------------------------- */ herr_t -H5Pget_jnl_config(hid_t plist_id, H5AC2_jnl_config_t *config_ptr) +H5Pget_jnl_config(hid_t plist_id, H5AC_jnl_config_t *config_ptr) { H5P_genplist_t *plist; /* Property list pointer */ herr_t ret_value = SUCCEED; /* return value */ @@ -1490,7 +1490,7 @@ H5Pget_jnl_config(hid_t plist_id, H5AC2_jnl_config_t *config_ptr) /* Validate the config_ptr */ if(NULL == config_ptr) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "NULL config_ptr on entry.") - if(!H5AC2_validate_jnl_config_ver(config_ptr->version)) + if(!H5AC_validate_jnl_config_ver(config_ptr->version)) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "Unknown config version.") /* Get the plist structure */ diff --git a/src/H5Ppublic.h b/src/H5Ppublic.h index c6dbabb..ff20a13 100644 --- a/src/H5Ppublic.h +++ b/src/H5Ppublic.h @@ -24,7 +24,7 @@ /* Public headers needed by this file */ #include "H5public.h" -#include "H5AC2public.h" +#include "H5ACpublic.h" #include "H5C1public.h" #include "H5Dpublic.h" #include "H5Fpublic.h" @@ -257,9 +257,9 @@ H5_DLL herr_t H5Pset_mdc_config(hid_t plist_id, H5_DLL herr_t H5Pget_mdc_config(hid_t plist_id, H5AC1_cache_config_t * config_ptr); /* out */ H5_DLL herr_t H5Pset_jnl_config(hid_t plist_id, - const H5AC2_jnl_config_t * config_ptr); + const H5AC_jnl_config_t * config_ptr); H5_DLL herr_t H5Pget_jnl_config(hid_t plist_id, - H5AC2_jnl_config_t * config_ptr); /* out */ + H5AC_jnl_config_t * config_ptr); /* out */ H5_DLL herr_t H5Pset_gc_references(hid_t fapl_id, unsigned gc_ref); H5_DLL herr_t H5Pget_gc_references(hid_t fapl_id, unsigned *gc_ref/*out*/); H5_DLL herr_t H5Pset_fclose_degree(hid_t fapl_id, H5F_close_degree_t degree); diff --git a/src/H5R.c b/src/H5R.c index ed65cbb..9b524af 100644 --- a/src/H5R.c +++ b/src/H5R.c @@ -20,7 +20,7 @@ #include "H5private.h" /* Generic Functions */ -#include "H5AC2private.h" /* Metadata cache */ +#include "H5ACprivate.h" /* Metadata cache */ #include "H5Dprivate.h" /* Datasets */ #include "H5Eprivate.h" /* Error handling */ #include "H5Gprivate.h" /* Groups */ @@ -311,7 +311,7 @@ H5Rcreate(void *ref, hid_t loc_id, const char *name, H5R_type_t ref_type, hid_t H5S_t *space = NULL; /* Pointer to dataspace containing region */ herr_t ret_value; /* Return value */ - FUNC_ENTER_API_META(H5Rcreate, loc_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Rcreate, loc_id, H5AC_dxpl_id, FAIL) H5TRACE5("e", "*xi*sRti", ref, loc_id, name, ref_type, space_id); /* Check args */ @@ -329,7 +329,7 @@ H5Rcreate(void *ref, hid_t loc_id, const char *name, H5R_type_t ref_type, hid_t HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a dataspace") /* Create reference */ - if((ret_value = H5R_create(ref, &loc, name, ref_type, space, H5AC2_dxpl_id)) < 0) + if((ret_value = H5R_create(ref, &loc, name, ref_type, space, H5AC_dxpl_id)) < 0) HGOTO_ERROR(H5E_REFERENCE, H5E_CANTINIT, FAIL, "unable to create reference") done: @@ -528,7 +528,7 @@ H5Rdereference(hid_t id, H5R_type_t ref_type, const void *_ref) file = loc.oloc->file; /* Create reference */ - if((ret_value = H5R_dereference(file, H5AC2_dxpl_id, ref_type, _ref)) < 0) + if((ret_value = H5R_dereference(file, H5AC_dxpl_id, ref_type, _ref)) < 0) HGOTO_ERROR(H5E_REFERENCE, H5E_CANTINIT, FAIL, "unable dereference object") done: @@ -647,7 +647,7 @@ H5Rget_region(hid_t id, H5R_type_t ref_type, const void *ref) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid reference pointer") /* Get the dataspace with the correct region selected */ - if((space = H5R_get_region(loc.oloc->file, H5AC2_ind_dxpl_id, ref)) == NULL) + if((space = H5R_get_region(loc.oloc->file, H5AC_ind_dxpl_id, ref)) == NULL) HGOTO_ERROR(H5E_REFERENCE, H5E_CANTCREATE, FAIL, "unable to create dataspace") /* Atomize */ @@ -789,7 +789,7 @@ H5Rget_obj_type2(hid_t id, H5R_type_t ref_type, const void *ref, HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid reference pointer") /* Get the object information */ - if(H5R_get_obj_type(loc.oloc->file, H5AC2_ind_dxpl_id, ref_type, ref, obj_type) < 0) + if(H5R_get_obj_type(loc.oloc->file, H5AC_ind_dxpl_id, ref_type, ref, obj_type) < 0) HGOTO_ERROR(H5E_REFERENCE, H5E_CANTINIT, FAIL, "unable to determine object type") done: @@ -947,7 +947,7 @@ H5Rget_name(hid_t id, H5R_type_t ref_type, const void *_ref, char *name, file = loc.oloc->file; /* Get name */ - if((ret_value = H5R_get_name(file, H5P_DEFAULT, H5AC2_dxpl_id, id, ref_type, _ref, name, size)) < 0) + if((ret_value = H5R_get_name(file, H5P_DEFAULT, H5AC_dxpl_id, id, ref_type, _ref, name, size)) < 0) HGOTO_ERROR(H5E_REFERENCE, H5E_CANTINIT, FAIL, "unable to determine object path") done: diff --git a/src/H5Rdeprec.c b/src/H5Rdeprec.c index e69adc1..0e2acc8 100644 --- a/src/H5Rdeprec.c +++ b/src/H5Rdeprec.c @@ -41,7 +41,7 @@ /* Headers */ /***********/ #include "H5private.h" /* Generic Functions */ -#include "H5AC2private.h" /* Metadata cache */ +#include "H5ACprivate.h" /* Metadata cache */ #include "H5Eprivate.h" /* Error handling */ #include "H5Gprivate.h" /* Groups */ #include "H5Oprivate.h" /* Object headers */ @@ -148,7 +148,7 @@ H5Rget_obj_type1(hid_t id, H5R_type_t ref_type, const void *ref) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5G_UNKNOWN, "invalid reference pointer") /* Get the object information */ - if(H5R_get_obj_type(loc.oloc->file, H5AC2_ind_dxpl_id, ref_type, ref, &obj_type) < 0) + if(H5R_get_obj_type(loc.oloc->file, H5AC_ind_dxpl_id, ref_type, ref, &obj_type) < 0) HGOTO_ERROR(H5E_REFERENCE, H5E_CANTINIT, H5G_UNKNOWN, "unable to determine object type") /* Set return value */ diff --git a/src/H5S.c b/src/H5S.c index 8cdbbc5..dd16498 100644 --- a/src/H5S.c +++ b/src/H5S.c @@ -947,7 +947,7 @@ done: * * John Mainzer, 6/6/05 * Updated function to use the new dirtied parameter of - * H5AC2_unprotect() instead of manipulating the is_dirty + * H5AC_unprotect() instead of manipulating the is_dirty * field of the cache info. * *------------------------------------------------------------------------- diff --git a/src/H5SM.c b/src/H5SM.c index 8950f80..7dd8050 100755 --- a/src/H5SM.c +++ b/src/H5SM.c @@ -210,7 +210,7 @@ H5SM_init(H5F_t *f, H5P_genplist_t * fc_plist, const H5O_loc_t *ext_loc, hid_t d HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "file allocation failed for SOHM table") /* Cache the new table */ - if(H5AC2_set(f, dxpl_id, H5AC2_SOHM_TABLE, table_addr, (size_t)table_size, table, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_set(f, dxpl_id, H5AC_SOHM_TABLE, table_addr, (size_t)table_size, table, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_CACHE, H5E_CANTINS, FAIL, "can't add SOHM table to cache") /* Record the address of the master table in the file */ @@ -360,7 +360,7 @@ H5SM_type_shared(H5F_t *f, unsigned type_id, hid_t dxpl_id) /* Determine size of table in file */ table_size = (hsize_t) H5SM_TABLE_SIZE(f) + (hsize_t)(f->shared->sohm_nindexes * H5SM_INDEX_HEADER_SIZE(f)); - if(NULL == (table = (H5SM_master_table_t *)H5AC2_protect(f, dxpl_id, H5AC2_SOHM_TABLE, f->shared->sohm_addr, (size_t)table_size, f, H5AC2_READ))) + if(NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, f->shared->sohm_addr, (size_t)table_size, f, H5AC_READ))) HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load SOHM master table") } /* end if */ else @@ -376,7 +376,7 @@ H5SM_type_shared(H5F_t *f, unsigned type_id, hid_t dxpl_id) done: /* Release the master SOHM table */ - if(table && H5AC2_unprotect(f, dxpl_id, H5AC2_SOHM_TABLE, f->shared->sohm_addr, (size_t)0, table, H5AC2__NO_FLAGS_SET) < 0) + if(table && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_TABLE, f->shared->sohm_addr, (size_t)0, table, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to close SOHM master table") FUNC_LEAVE_NOAPI(ret_value) @@ -414,7 +414,7 @@ H5SM_get_fheap_addr(H5F_t *f, hid_t dxpl_id, unsigned type_id, haddr_t *fheap_ad table_size = (hsize_t) H5SM_TABLE_SIZE(f) + (hsize_t)(f->shared->sohm_nindexes * H5SM_INDEX_HEADER_SIZE(f)); /* Look up the master SOHM table */ - if(NULL == (table = (H5SM_master_table_t *)H5AC2_protect(f, dxpl_id, H5AC2_SOHM_TABLE, f->shared->sohm_addr, (size_t)table_size, f, H5AC2_READ))) + if(NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, f->shared->sohm_addr, (size_t)table_size, f, H5AC_READ))) HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, FAIL, "unable to load SOHM master table") /* Look up index for message type */ @@ -426,7 +426,7 @@ H5SM_get_fheap_addr(H5F_t *f, hid_t dxpl_id, unsigned type_id, haddr_t *fheap_ad done: /* Release the master SOHM table */ - if(table && H5AC2_unprotect(f, dxpl_id, H5AC2_SOHM_TABLE, f->shared->sohm_addr, (size_t)0, table, H5AC2__NO_FLAGS_SET) < 0) + if(table && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_TABLE, f->shared->sohm_addr, (size_t)0, table, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "unable to close SOHM master table") FUNC_LEAVE_NOAPI(ret_value) @@ -547,7 +547,7 @@ H5SM_delete_index(H5F_t *f, H5SM_index_header_t *header, hid_t dxpl_id, hbool_t /* Determine whether index is a list or a B-tree. */ if(header->index_type == H5SM_LIST) { /* Eject entry from cache */ - if(H5AC2_expunge_entry(f, dxpl_id, H5AC2_SOHM_LIST, header->index_addr) < 0) + if(H5AC_expunge_entry(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTREMOVE, FAIL, "unable to remove list index from cache") /* Free the file space used */ @@ -635,7 +635,7 @@ H5SM_create_list(H5F_t *f, H5SM_index_header_t *header, hid_t dxpl_id) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, HADDR_UNDEF, "file allocation failed for SOHM list") /* Put the list into the cache */ - if(H5AC2_set(f, dxpl_id, H5AC2_SOHM_LIST, addr, (size_t)size, list, H5AC2__NO_FLAGS_SET) < 0) + if(H5AC_set(f, dxpl_id, H5AC_SOHM_LIST, addr, (size_t)size, list, H5AC__NO_FLAGS_SET) < 0) HGOTO_ERROR(H5E_CACHE, H5E_CANTINS, HADDR_UNDEF, "can't add SOHM list to cache") /* Set return value */ @@ -735,7 +735,7 @@ H5SM_convert_list_to_btree(H5F_t *f, H5SM_index_header_t *header, } /* end for */ /* Unprotect list in cache and release heap */ - if(H5AC2_unprotect(f, dxpl_id, H5AC2_SOHM_LIST, header->index_addr, (size_t)0, list, H5AC2__DELETED_FLAG) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, (size_t)0, list, H5AC__DELETED_FLAG) < 0) HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "unable to release SOHM list") *_list = list = NULL; @@ -801,7 +801,7 @@ H5SM_convert_btree_to_list(H5F_t * f, H5SM_index_header_t * header, hid_t dxpl_i cache_udata.header = header; /* Protect the SOHM list */ - if(NULL == (list = (H5SM_list_t *)H5AC2_protect(f, dxpl_id, H5AC2_SOHM_LIST, header->index_addr, H5SM_LIST_SIZE(f, header->list_max), &cache_udata, H5AC2_WRITE))) + if(NULL == (list = (H5SM_list_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, H5SM_LIST_SIZE(f, header->list_max), &cache_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to load SOHM list index") /* Delete the B-tree and have messages copy themselves to the @@ -812,7 +812,7 @@ H5SM_convert_btree_to_list(H5F_t * f, H5SM_index_header_t * header, hid_t dxpl_i done: /* Release the SOHM list from the cache */ - if(list && H5AC2_unprotect(f, dxpl_id, H5AC2_SOHM_LIST, header->index_addr, (size_t)0, list, H5AC2__DIRTIED_FLAG) < 0) + if(list && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, (size_t)0, list, H5AC__DIRTIED_FLAG) < 0) HDONE_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "unable to unprotect SOHM index") FUNC_LEAVE_NOAPI(ret_value) @@ -908,7 +908,7 @@ H5SM_can_share(H5F_t *f, hid_t dxpl_id, H5SM_master_table_t *table, if(table) my_table = table; else { - if(NULL == (my_table = (H5SM_master_table_t *)H5AC2_protect(f, dxpl_id, H5AC2_SOHM_TABLE, f->shared->sohm_addr, (size_t)table_size, f, H5AC2_READ))) + if(NULL == (my_table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, f->shared->sohm_addr, (size_t)table_size, f, H5AC_READ))) HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to load SOHM master table") } /* end if */ @@ -932,7 +932,7 @@ H5SM_can_share(H5F_t *f, hid_t dxpl_id, H5SM_master_table_t *table, done: /* Release the master SOHM table, if we protected it */ - if(my_table && my_table != table && H5AC2_unprotect(f, dxpl_id, H5AC2_SOHM_TABLE, f->shared->sohm_addr, (size_t)0, my_table, H5AC2__NO_FLAGS_SET) < 0) + if(my_table && my_table != table && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_TABLE, f->shared->sohm_addr, (size_t)0, my_table, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_SOHM, H5E_CANTRELEASE, FAIL, "unable to close SOHM master table") FUNC_LEAVE_NOAPI(ret_value) @@ -999,7 +999,7 @@ H5SM_try_share(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, unsigned type_id, { H5SM_master_table_t *table = NULL; hsize_t table_size; /* Size of SOHM master table in file */ - unsigned cache_flags = H5AC2__NO_FLAGS_SET; + unsigned cache_flags = H5AC__NO_FLAGS_SET; ssize_t index_num; htri_t tri_ret; htri_t ret_value = TRUE; @@ -1018,7 +1018,7 @@ H5SM_try_share(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, unsigned type_id, table_size = (hsize_t) H5SM_TABLE_SIZE(f) + (hsize_t)(f->shared->sohm_nindexes * H5SM_INDEX_HEADER_SIZE(f)); /* Look up the master SOHM table */ - if(NULL == (table = (H5SM_master_table_t *)H5AC2_protect(f, dxpl_id, H5AC2_SOHM_TABLE, f->shared->sohm_addr, (size_t)table_size, f, H5AC2_WRITE))) + if(NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, f->shared->sohm_addr, (size_t)table_size, f, H5AC_WRITE))) HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, FAIL, "unable to load SOHM master table") /* "complex" sharing checks */ @@ -1033,7 +1033,7 @@ H5SM_try_share(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, unsigned type_id, if(table->indexes[index_num].index_addr == HADDR_UNDEF) { if(H5SM_create_index(f, &(table->indexes[index_num]), dxpl_id) < 0) HGOTO_ERROR(H5E_SOHM, H5E_CANTINIT, FAIL, "unable to create SOHM index") - cache_flags |= H5AC2__DIRTIED_FLAG; + cache_flags |= H5AC__DIRTIED_FLAG; } /* end if */ /* Write the message as a shared message. This may or may not cause the @@ -1055,7 +1055,7 @@ H5SM_try_share(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, unsigned type_id, done: /* Release the master SOHM table */ - if(table && H5AC2_unprotect(f, dxpl_id, H5AC2_SOHM_TABLE, f->shared->sohm_addr, (size_t)0, table, cache_flags) < 0) + if(table && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_TABLE, f->shared->sohm_addr, (size_t)0, table, cache_flags) < 0) HDONE_ERROR(H5E_CACHE, H5E_CANTRELEASE, FAIL, "unable to close SOHM master table") FUNC_LEAVE_NOAPI(ret_value) @@ -1202,7 +1202,7 @@ H5SM_write_mesg(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, cache_udata.header = header; /* The index is a list; get it from the cache */ - if(NULL == (list = (H5SM_list_t *)H5AC2_protect(f, dxpl_id, H5AC2_SOHM_LIST, header->index_addr, H5SM_LIST_SIZE(f, header->list_max), &cache_udata, H5AC2_WRITE))) + if(NULL == (list = (H5SM_list_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, H5SM_LIST_SIZE(f, header->list_max), &cache_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, FAIL, "unable to load SOHM index") /* See if the message is already in the index and get its location. @@ -1331,7 +1331,7 @@ H5SM_write_mesg(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, } /* end else */ ++(header->num_messages); - (*cache_flags_ptr) |= H5AC2__DIRTIED_FLAG; + (*cache_flags_ptr) |= H5AC__DIRTIED_FLAG; } /* end else */ /* Set the file pointer & message type for the shared component */ @@ -1348,7 +1348,7 @@ done: HDONE_ERROR(H5E_HEAP, H5E_CLOSEERROR, FAIL, "can't close fractal heap") /* If we got a list out of the cache, release it (it is always dirty after writing a message) */ - if(list && H5AC2_unprotect(f, dxpl_id, H5AC2_SOHM_LIST, header->index_addr, (size_t)0, list, H5AC2__DIRTIED_FLAG) < 0) + if(list && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, (size_t)0, list, H5AC__DIRTIED_FLAG) < 0) HDONE_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "unable to close SOHM index") if(encoding_buf) @@ -1381,7 +1381,7 @@ H5SM_delete(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, H5O_shared_t *sh_mesg) { H5SM_master_table_t *table = NULL; hsize_t table_size; /* Size of SOHM master table in file */ - unsigned cache_flags = H5AC2__NO_FLAGS_SET; + unsigned cache_flags = H5AC__NO_FLAGS_SET; ssize_t index_num; void *mesg_buf = NULL; void *native_mesg = NULL; @@ -1401,7 +1401,7 @@ H5SM_delete(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, H5O_shared_t *sh_mesg) table_size = (hsize_t) H5SM_TABLE_SIZE(f) + (hsize_t)(f->shared->sohm_nindexes * H5SM_INDEX_HEADER_SIZE(f)); /* Look up the master SOHM table */ - if(NULL == (table = (H5SM_master_table_t *)H5AC2_protect(f, dxpl_id, H5AC2_SOHM_TABLE, f->shared->sohm_addr, (size_t)table_size, f, H5AC2_WRITE))) + if(NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, f->shared->sohm_addr, (size_t)table_size, f, H5AC_WRITE))) HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, FAIL, "unable to load SOHM master table") /* Find the correct index and try to delete from it */ @@ -1416,7 +1416,7 @@ H5SM_delete(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, H5O_shared_t *sh_mesg) HGOTO_ERROR(H5E_SOHM, H5E_CANTDELETE, FAIL, "unable to delete mesage from SOHM index") /* Release the master SOHM table */ - if(H5AC2_unprotect(f, dxpl_id, H5AC2_SOHM_TABLE, f->shared->sohm_addr, (size_t)0, table, cache_flags) < 0) + if(H5AC_unprotect(f, dxpl_id, H5AC_SOHM_TABLE, f->shared->sohm_addr, (size_t)0, table, cache_flags) < 0) HGOTO_ERROR(H5E_CACHE, H5E_CANTRELEASE, FAIL, "unable to close SOHM master table") table = NULL; @@ -1434,7 +1434,7 @@ H5SM_delete(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, H5O_shared_t *sh_mesg) done: /* Release the master SOHM table (should only happen on error) */ - if(table && H5AC2_unprotect(f, dxpl_id, H5AC2_SOHM_TABLE, f->shared->sohm_addr, (size_t)0, table, cache_flags) < 0) + if(table && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_TABLE, f->shared->sohm_addr, (size_t)0, table, cache_flags) < 0) HDONE_ERROR(H5E_CACHE, H5E_CANTRELEASE, FAIL, "unable to close SOHM master table") /* Release any native message we decoded */ @@ -1669,7 +1669,7 @@ H5SM_delete_from_index(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, cache_udata.header = header; /* If the index is stored as a list, get it from the cache */ - if(NULL == (list = (H5SM_list_t *)H5AC2_protect(f, dxpl_id, H5AC2_SOHM_LIST, header->index_addr, H5SM_LIST_SIZE(f, header->list_max), &cache_udata, H5AC2_WRITE))) + if(NULL == (list = (H5SM_list_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, H5SM_LIST_SIZE(f, header->list_max), &cache_udata, H5AC_WRITE))) HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to load SOHM index") /* Find the message in the list */ @@ -1704,7 +1704,7 @@ H5SM_delete_from_index(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, /* Updated the index header, so set its dirty flag */ --header->num_messages; - *cache_flags |= H5AC2__DIRTIED_FLAG; + *cache_flags |= H5AC__DIRTIED_FLAG; /* Remove the message from the index */ if(header->index_type == H5SM_LIST) @@ -1727,7 +1727,7 @@ H5SM_delete_from_index(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, if(header->num_messages == 0) { /* Unprotect cache and release heap */ - if(list && H5AC2_unprotect(f, dxpl_id, H5AC2_SOHM_LIST, header->index_addr, (size_t)0, list, H5AC2__DELETED_FLAG) < 0) + if(list && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, (size_t)0, list, H5AC__DELETED_FLAG) < 0) HGOTO_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "unable to release SOHM list") list = NULL; @@ -1751,7 +1751,7 @@ H5SM_delete_from_index(H5F_t *f, hid_t dxpl_id, H5O_t *open_oh, done: /* Release the SOHM list */ - if(list && H5AC2_unprotect(f, dxpl_id, H5AC2_SOHM_LIST, header->index_addr, (size_t)0, list, H5AC2__DIRTIED_FLAG) < 0) + if(list && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, (size_t)0, list, H5AC__DIRTIED_FLAG) < 0) HDONE_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "unable to close SOHM index") /* Release the fractal heap if we opened it */ @@ -1833,7 +1833,7 @@ H5SM_get_info(const H5O_loc_t *ext_loc, H5P_genplist_t *fc_plist, hid_t dxpl_id) table_size = (hsize_t) H5SM_TABLE_SIZE(f) + (hsize_t)(shared->sohm_nindexes * H5SM_INDEX_HEADER_SIZE(f)); /* Read the rest of the SOHM table information from the cache */ - if(NULL == (table = (H5SM_master_table_t *)H5AC2_protect(f, dxpl_id, H5AC2_SOHM_TABLE, shared->sohm_addr, (size_t)table_size, f, H5AC2_READ))) + if(NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, shared->sohm_addr, (size_t)table_size, f, H5AC_READ))) HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, FAIL, "unable to load SOHM master table") /* Get index conversion limits */ @@ -1872,7 +1872,7 @@ H5SM_get_info(const H5O_loc_t *ext_loc, H5P_genplist_t *fc_plist, hid_t dxpl_id) done: /* Release the master SOHM table if we took it out of the cache */ - if(table && H5AC2_unprotect(f, dxpl_id, H5AC2_SOHM_TABLE, shared->sohm_addr, (size_t)0, table, H5AC2__NO_FLAGS_SET) < 0) + if(table && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_TABLE, shared->sohm_addr, (size_t)0, table, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_CACHE, H5E_CANTRELEASE, FAIL, "unable to close SOHM master table") FUNC_LEAVE_NOAPI(ret_value) @@ -2063,7 +2063,7 @@ H5SM_get_refcount(H5F_t *f, hid_t dxpl_id, unsigned type_id, table_size = (hsize_t) H5SM_TABLE_SIZE(f) + (hsize_t)(f->shared->sohm_nindexes * H5SM_INDEX_HEADER_SIZE(f)); /* Look up the master SOHM table */ - if(NULL == (table = (H5SM_master_table_t *)H5AC2_protect(f, dxpl_id, H5AC2_SOHM_TABLE, f->shared->sohm_addr, (size_t)table_size, f, H5AC2_READ))) + if(NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, f->shared->sohm_addr, (size_t)table_size, f, H5AC_READ))) HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, FAIL, "unable to load SOHM master table") /* Find the correct index and find the message in it */ @@ -2102,7 +2102,7 @@ H5SM_get_refcount(H5F_t *f, hid_t dxpl_id, unsigned type_id, cache_udata.header = header; /* If the index is stored as a list, get it from the cache */ - if(NULL == (list = (H5SM_list_t *)H5AC2_protect(f, dxpl_id, H5AC2_SOHM_LIST, header->index_addr, H5SM_LIST_SIZE(f, header->list_max), &cache_udata, H5AC2_READ))) + if(NULL == (list = (H5SM_list_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, H5SM_LIST_SIZE(f, header->list_max), &cache_udata, H5AC_READ))) HGOTO_ERROR(H5E_SOHM, H5E_CANTPROTECT, FAIL, "unable to load SOHM index") /* Find the message in the list */ @@ -2127,9 +2127,9 @@ H5SM_get_refcount(H5F_t *f, hid_t dxpl_id, unsigned type_id, done: /* Release resources */ - if(list && H5AC2_unprotect(f, dxpl_id, H5AC2_SOHM_LIST, header->index_addr, (size_t)0, list, H5AC2__NO_FLAGS_SET) < 0) + if(list && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_LIST, header->index_addr, (size_t)0, list, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "unable to close SOHM index") - if(table && H5AC2_unprotect(f, dxpl_id, H5AC2_SOHM_TABLE, f->shared->sohm_addr, (size_t)0, table, H5AC2__NO_FLAGS_SET) < 0) + if(table && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_TABLE, f->shared->sohm_addr, (size_t)0, table, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_CACHE, H5E_CANTRELEASE, FAIL, "unable to close SOHM master table") if(fheap && H5HF_close(fheap, dxpl_id) < 0) HDONE_ERROR(H5E_HEAP, H5E_CLOSEERROR, FAIL, "can't close fractal heap") @@ -2295,7 +2295,7 @@ H5SM_read_mesg(H5F_t *f, const H5SM_sohm_t *mesg, H5HF_t *fheap, HGOTO_ERROR(H5E_OHDR, H5E_CANTLOAD, FAIL, "unable to open object header") /* Load the object header from the cache */ - if(NULL == (oh = H5O_protect(&oloc, dxpl_id, H5AC2_READ))) + if(NULL == (oh = H5O_protect(&oloc, dxpl_id, H5AC_READ))) HGOTO_ERROR(H5E_OHDR, H5E_CANTPROTECT, FAIL, "unable to load object header") } /* end if */ else @@ -2324,7 +2324,7 @@ H5SM_read_mesg(H5F_t *f, const H5SM_sohm_t *mesg, H5HF_t *fheap, done: /* Close the object header if we opened one and had an error */ if(oh && oh != open_oh) { - if(oh && H5O_unprotect(&oloc, dxpl_id, oh, H5AC2__NO_FLAGS_SET) < 0) + if(oh && H5O_unprotect(&oloc, dxpl_id, oh, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_OHDR, H5E_CANTUNPROTECT, FAIL, "unable to release object header") if(H5O_close(&oloc) < 0) @@ -2451,7 +2451,7 @@ H5SM_table_debug(H5F_t *f, hid_t dxpl_id, haddr_t table_addr, table_size = (hsize_t) H5SM_TABLE_SIZE(f) + (hsize_t) (f->shared->sohm_nindexes * H5SM_INDEX_HEADER_SIZE(f)); /* Look up the master SOHM table */ - if(NULL == (table = (H5SM_master_table_t *)H5AC2_protect(f, dxpl_id, H5AC2_SOHM_TABLE, table_addr, (size_t)table_size, f, H5AC2_READ))) + if(NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, table_addr, (size_t)table_size, f, H5AC_READ))) HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, FAIL, "unable to load SOHM master table") HDfprintf(stream, "%*sShared Message Master Table...\n", indent, ""); @@ -2479,7 +2479,7 @@ H5SM_table_debug(H5F_t *f, hid_t dxpl_id, haddr_t table_addr, } /* end for */ done: - if(table && H5AC2_unprotect(f, dxpl_id, H5AC2_SOHM_TABLE, table_addr, (size_t)0, table, H5AC2__NO_FLAGS_SET) < 0) + if(table && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_TABLE, table_addr, (size_t)0, table, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_CACHE, H5E_CANTRELEASE, FAIL, "unable to close SOHM master table") FUNC_LEAVE_NOAPI(ret_value) @@ -2537,7 +2537,7 @@ H5SM_list_debug(H5F_t *f, hid_t dxpl_id, haddr_t list_addr, cache_udata.header = &header; /* Get the list from the cache */ - if(NULL == (list = (H5SM_list_t *)H5AC2_protect(f, dxpl_id, H5AC2_SOHM_LIST, list_addr, H5SM_LIST_SIZE(f, header.list_max), &cache_udata, H5AC2_READ))) + if(NULL == (list = (H5SM_list_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_LIST, list_addr, H5SM_LIST_SIZE(f, header.list_max), &cache_udata, H5AC_READ))) HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, FAIL, "unable to load SOHM index") HDfprintf(stream, "%*sShared Message List Index...\n", indent, ""); @@ -2569,7 +2569,7 @@ H5SM_list_debug(H5F_t *f, hid_t dxpl_id, haddr_t list_addr, } /* end for */ done: - if(list && H5AC2_unprotect(f, dxpl_id, H5AC2_SOHM_LIST, list_addr, (size_t)0, list, H5AC2__NO_FLAGS_SET) < 0) + if(list && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_LIST, list_addr, (size_t)0, list, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_CACHE, H5E_CANTUNPROTECT, FAIL, "unable to close SOHM index") FUNC_LEAVE_NOAPI(ret_value) @@ -2612,7 +2612,7 @@ H5SM_ih_size(H5F_t *f, hid_t dxpl_id, H5F_info_t *finfo) table_size = (hsize_t) H5SM_TABLE_SIZE(f) + (hsize_t)(f->shared->sohm_nindexes * H5SM_INDEX_HEADER_SIZE(f)); /* Look up the master SOHM table */ - if(NULL == (table = (H5SM_master_table_t *)H5AC2_protect(f, dxpl_id, H5AC2_SOHM_TABLE, f->shared->sohm_addr, (size_t)table_size, f, H5AC2_READ))) + if(NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, f->shared->sohm_addr, (size_t)table_size, f, H5AC_READ))) HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, FAIL, "unable to load SOHM master table") /* Get SOHM header size */ @@ -2651,7 +2651,7 @@ done: /* Release resources */ if(fheap && H5HF_close(fheap, dxpl_id) < 0) HDONE_ERROR(H5E_HEAP, H5E_CLOSEERROR, FAIL, "can't close fractal heap") - if(table && H5AC2_unprotect(f, dxpl_id, H5AC2_SOHM_TABLE, f->shared->sohm_addr, (size_t)0, table, H5AC2__NO_FLAGS_SET) < 0) + if(table && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_TABLE, f->shared->sohm_addr, (size_t)0, table, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_CACHE, H5E_CANTRELEASE, FAIL, "unable to close SOHM master table") FUNC_LEAVE_NOAPI(ret_value) diff --git a/src/H5SMcache.c b/src/H5SMcache.c index 5945cea..e245b9b 100644 --- a/src/H5SMcache.c +++ b/src/H5SMcache.c @@ -72,9 +72,9 @@ static herr_t H5SM_list_free_icr(haddr_t addr, size_t len, void *thing); /*********************/ /* Package Variables */ /*********************/ -/* H5SM inherits cache-like properties from H5AC2 */ -const H5AC2_class_t H5AC2_SOHM_TABLE[1] = {{ - H5AC2_SOHM_TABLE_ID, +/* H5SM inherits cache-like properties from H5AC */ +const H5AC_class_t H5AC_SOHM_TABLE[1] = {{ + H5AC_SOHM_TABLE_ID, "shared object header message", H5FD_MEM_SOHM_TABLE, H5SM_table_deserialize, @@ -84,8 +84,8 @@ const H5AC2_class_t H5AC2_SOHM_TABLE[1] = {{ NULL }}; -const H5AC2_class_t H5AC2_SOHM_LIST[1] = {{ - H5AC2_SOHM_LIST_ID, +const H5AC_class_t H5AC_SOHM_LIST[1] = {{ + H5AC_SOHM_LIST_ID, "shared object header message", H5FD_MEM_SOHM_INDEX, H5SM_list_deserialize, @@ -379,7 +379,7 @@ H5SM_list_deserialize(haddr_t UNUSED addr, size_t UNUSED len, const void *image, /* Allocate space for the SOHM list data structure */ if(NULL == (list = H5FL_MALLOC(H5SM_list_t))) HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, NULL, "memory allocation failed") - HDmemset(&list->cache_info, 0, sizeof(H5AC2_info_t)); + HDmemset(&list->cache_info, 0, sizeof(H5AC_info_t)); /* Allocate list in memory as an array*/ if((list->messages = (H5SM_sohm_t *)H5FL_ARR_MALLOC(H5SM_sohm_t, udata->header->list_max)) == NULL) diff --git a/src/H5SMpkg.h b/src/H5SMpkg.h index 7af60f6..242257e 100755 --- a/src/H5SMpkg.h +++ b/src/H5SMpkg.h @@ -32,7 +32,7 @@ #include "H5SMprivate.h" /* Shared Object Header Messages */ /* Other private headers needed by this file */ -#include "H5AC2private.h" /* Metadata Cache */ +#include "H5ACprivate.h" /* Metadata Cache */ #include "H5B2private.h" /* B-trees */ #include "H5HFprivate.h" /* Fractal heaps */ @@ -174,7 +174,7 @@ typedef struct { /* Typedef for a SOHM list */ typedef struct { /* Information for H5AC cache functions, _must_ be first field in structure */ - H5AC2_info_t cache_info; + H5AC_info_t cache_info; H5SM_index_header_t *header; /* Pointer to the corresponding index header */ H5SM_sohm_t *messages; /* Actual list, stored as an array */ @@ -184,7 +184,7 @@ typedef struct { /* Typedef for shared object header message master table */ struct H5SM_master_table_t { /* Information for H5AC cache functions, _must_ be first field in structure */ - H5AC2_info_t cache_info; + H5AC_info_t cache_info; unsigned num_indexes; /* Number of indexes */ H5SM_index_header_t *indexes; /* Array of num_indexes indexes */ @@ -238,8 +238,8 @@ H5FL_ARR_EXTERN(H5SM_index_header_t); H5FL_EXTERN(H5SM_list_t); H5FL_ARR_EXTERN(H5SM_sohm_t); -H5_DLLVAR const H5AC2_class_t H5AC2_SOHM_TABLE[1]; -H5_DLLVAR const H5AC2_class_t H5AC2_SOHM_LIST[1]; +H5_DLLVAR const H5AC_class_t H5AC_SOHM_TABLE[1]; +H5_DLLVAR const H5AC_class_t H5AC_SOHM_LIST[1]; H5_DLLVAR const H5B2_class_t H5SM_INDEX[1]; /****************************/ diff --git a/src/H5SMtest.c b/src/H5SMtest.c index 4b17785..7350f28 100644 --- a/src/H5SMtest.c +++ b/src/H5SMtest.c @@ -26,7 +26,7 @@ /* Headers */ /***********/ #include "H5private.h" /* Generic Functions */ -#include "H5AC2private.h" /* Metadata cache */ +#include "H5ACprivate.h" /* Metadata cache */ #include "H5Eprivate.h" /* Error handling */ #include "H5Fpkg.h" /* File access */ #include "H5SMpkg.h" /* Shared object header messages */ @@ -98,7 +98,7 @@ H5SM_get_mesg_count_test(H5F_t *f, hid_t dxpl_id, unsigned type_id, table_size = (hsize_t) H5SM_TABLE_SIZE(f) + (hsize_t)(f->shared->sohm_nindexes * H5SM_INDEX_HEADER_SIZE(f)); /* Look up the master SOHM table */ - if(NULL == (table = (H5SM_master_table_t *)H5AC2_protect(f, dxpl_id, H5AC2_SOHM_TABLE, f->shared->sohm_addr, (size_t)table_size, f, H5AC2_READ))) + if(NULL == (table = (H5SM_master_table_t *)H5AC_protect(f, dxpl_id, H5AC_SOHM_TABLE, f->shared->sohm_addr, (size_t)table_size, f, H5AC_READ))) HGOTO_ERROR(H5E_CACHE, H5E_CANTPROTECT, FAIL, "unable to load SOHM master table") /* Find the correct index for this message type */ @@ -115,7 +115,7 @@ H5SM_get_mesg_count_test(H5F_t *f, hid_t dxpl_id, unsigned type_id, done: /* Release resources */ - if(table && H5AC2_unprotect(f, dxpl_id, H5AC2_SOHM_TABLE, f->shared->sohm_addr, (size_t)0, table, H5AC2__NO_FLAGS_SET) < 0) + if(table && H5AC_unprotect(f, dxpl_id, H5AC_SOHM_TABLE, f->shared->sohm_addr, (size_t)0, table, H5AC__NO_FLAGS_SET) < 0) HDONE_ERROR(H5E_CACHE, H5E_CANTRELEASE, FAIL, "unable to close SOHM master table") FUNC_LEAVE_NOAPI(ret_value) diff --git a/src/H5T.c b/src/H5T.c index 54d9e61..08794a1 100644 --- a/src/H5T.c +++ b/src/H5T.c @@ -27,7 +27,7 @@ #include "H5private.h" /*generic functions */ -#include "H5AC2private.h" /* Metadata cache */ +#include "H5ACprivate.h" /* Metadata cache */ #include "H5Dprivate.h" /*datasets (for H5Tcopy) */ #include "H5Eprivate.h" /*error handling */ #include "H5Fprivate.h" /* Files */ @@ -1012,22 +1012,22 @@ H5T_init_interface(void) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype") status = 0; - status |= H5T_register(H5T_PERS_SOFT, "i_i", fixedpt, fixedpt, H5T_conv_i_i, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_SOFT, "i_f", fixedpt, floatpt, H5T_conv_i_f, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_SOFT, "f_f", floatpt, floatpt, H5T_conv_f_f, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_SOFT, "f_i", floatpt, fixedpt, H5T_conv_f_i, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_SOFT, "s_s", string, string, H5T_conv_s_s, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_SOFT, "b_b", bitfield, bitfield, H5T_conv_b_b, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_SOFT, "ibo", fixedpt, fixedpt, H5T_conv_order, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_SOFT, "ibo(opt)", fixedpt, fixedpt, H5T_conv_order_opt, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_SOFT, "fbo", floatpt, floatpt, H5T_conv_order, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_SOFT, "fbo(opt)", floatpt, floatpt, H5T_conv_order_opt, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_SOFT, "struct(no-opt)", compound, compound, H5T_conv_struct, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_SOFT, "struct(opt)", compound, compound, H5T_conv_struct_opt, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_SOFT, "enum", enum_type, enum_type, H5T_conv_enum, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_SOFT, "vlen", vlen, vlen, H5T_conv_vlen, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_SOFT, "array", array, array, H5T_conv_array, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_SOFT, "objref", objref, objref, H5T_conv_order_opt, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_SOFT, "i_i", fixedpt, fixedpt, H5T_conv_i_i, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_SOFT, "i_f", fixedpt, floatpt, H5T_conv_i_f, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_SOFT, "f_f", floatpt, floatpt, H5T_conv_f_f, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_SOFT, "f_i", floatpt, fixedpt, H5T_conv_f_i, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_SOFT, "s_s", string, string, H5T_conv_s_s, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_SOFT, "b_b", bitfield, bitfield, H5T_conv_b_b, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_SOFT, "ibo", fixedpt, fixedpt, H5T_conv_order, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_SOFT, "ibo(opt)", fixedpt, fixedpt, H5T_conv_order_opt, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_SOFT, "fbo", floatpt, floatpt, H5T_conv_order, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_SOFT, "fbo(opt)", floatpt, floatpt, H5T_conv_order_opt, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_SOFT, "struct(no-opt)", compound, compound, H5T_conv_struct, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_SOFT, "struct(opt)", compound, compound, H5T_conv_struct_opt, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_SOFT, "enum", enum_type, enum_type, H5T_conv_enum, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_SOFT, "vlen", vlen, vlen, H5T_conv_vlen, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_SOFT, "array", array, array, H5T_conv_array, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_SOFT, "objref", objref, objref, H5T_conv_order_opt, H5AC_dxpl_id, FALSE); /* * Native conversions should be listed last since we can use hardware to @@ -1039,261 +1039,261 @@ H5T_init_interface(void) /* floating point */ #if H5T_CONV_INTERNAL_FP_FP - status |= H5T_register(H5T_PERS_HARD, "flt_dbl", native_float, native_double, H5T_conv_float_double, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "dbl_flt", native_double, native_float, H5T_conv_double_float, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "flt_dbl", native_float, native_double, H5T_conv_float_double, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "dbl_flt", native_double, native_float, H5T_conv_double_float, H5AC_dxpl_id, FALSE); #endif /*H5T_CONV_INTERNAL_FP_FP*/ #if H5T_CONV_INTERNAL_FP_LDOUBLE - status |= H5T_register(H5T_PERS_HARD, "flt_ldbl", native_float, native_ldouble, H5T_conv_float_ldouble, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "dbl_ldbl", native_double, native_ldouble, H5T_conv_double_ldouble, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "ldbl_flt", native_ldouble, native_float, H5T_conv_ldouble_float, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "ldbl_dbl", native_ldouble, native_double, H5T_conv_ldouble_double, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "flt_ldbl", native_float, native_ldouble, H5T_conv_float_ldouble, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "dbl_ldbl", native_double, native_ldouble, H5T_conv_double_ldouble, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ldbl_flt", native_ldouble, native_float, H5T_conv_ldouble_float, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ldbl_dbl", native_ldouble, native_double, H5T_conv_ldouble_double, H5AC_dxpl_id, FALSE); #endif /*H5T_CONV_INTERNAL_FP_LDOUBLE*/ /* from long_long */ - status |= H5T_register(H5T_PERS_HARD, "llong_ullong", native_llong, native_ullong, H5T_conv_llong_ullong, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "ullong_llong", native_ullong, native_llong, H5T_conv_ullong_llong, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "llong_long", native_llong, native_long, H5T_conv_llong_long, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "llong_ulong", native_llong, native_ulong, H5T_conv_llong_ulong, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "ullong_long", native_ullong, native_long, H5T_conv_ullong_long, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "ullong_ulong", native_ullong, native_ulong, H5T_conv_ullong_ulong, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "llong_short", native_llong, native_short, H5T_conv_llong_short, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "llong_ushort", native_llong, native_ushort, H5T_conv_llong_ushort, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "ullong_short", native_ullong, native_short, H5T_conv_ullong_short, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "ullong_ushort", native_ullong, native_ushort, H5T_conv_ullong_ushort, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "llong_int", native_llong, native_int, H5T_conv_llong_int, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "llong_uint", native_llong, native_uint, H5T_conv_llong_uint, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "ullong_int", native_ullong, native_int, H5T_conv_ullong_int, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "ullong_uint", native_ullong, native_uint, H5T_conv_ullong_uint, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "llong_schar", native_llong, native_schar, H5T_conv_llong_schar, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "llong_uchar", native_llong, native_uchar, H5T_conv_llong_uchar, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "ullong_schar", native_ullong, native_schar, H5T_conv_ullong_schar, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "ullong_uchar", native_ullong, native_uchar, H5T_conv_ullong_uchar, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "llong_ullong", native_llong, native_ullong, H5T_conv_llong_ullong, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ullong_llong", native_ullong, native_llong, H5T_conv_ullong_llong, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "llong_long", native_llong, native_long, H5T_conv_llong_long, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "llong_ulong", native_llong, native_ulong, H5T_conv_llong_ulong, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ullong_long", native_ullong, native_long, H5T_conv_ullong_long, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ullong_ulong", native_ullong, native_ulong, H5T_conv_ullong_ulong, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "llong_short", native_llong, native_short, H5T_conv_llong_short, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "llong_ushort", native_llong, native_ushort, H5T_conv_llong_ushort, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ullong_short", native_ullong, native_short, H5T_conv_ullong_short, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ullong_ushort", native_ullong, native_ushort, H5T_conv_ullong_ushort, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "llong_int", native_llong, native_int, H5T_conv_llong_int, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "llong_uint", native_llong, native_uint, H5T_conv_llong_uint, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ullong_int", native_ullong, native_int, H5T_conv_ullong_int, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ullong_uint", native_ullong, native_uint, H5T_conv_ullong_uint, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "llong_schar", native_llong, native_schar, H5T_conv_llong_schar, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "llong_uchar", native_llong, native_uchar, H5T_conv_llong_uchar, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ullong_schar", native_ullong, native_schar, H5T_conv_ullong_schar, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ullong_uchar", native_ullong, native_uchar, H5T_conv_ullong_uchar, H5AC_dxpl_id, FALSE); /* From long */ - status |= H5T_register(H5T_PERS_HARD, "long_llong", native_long, native_llong, H5T_conv_long_llong, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "long_ullong", native_long, native_ullong, H5T_conv_long_ullong, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "ulong_llong", native_ulong, native_llong, H5T_conv_ulong_llong, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "ulong_ullong", native_ulong, native_ullong, H5T_conv_ulong_ullong, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "long_ulong", native_long, native_ulong, H5T_conv_long_ulong, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "ulong_long", native_ulong, native_long, H5T_conv_ulong_long, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "long_short", native_long, native_short, H5T_conv_long_short, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "long_ushort", native_long, native_ushort, H5T_conv_long_ushort, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "ulong_short", native_ulong, native_short, H5T_conv_ulong_short, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "ulong_ushort", native_ulong, native_ushort, H5T_conv_ulong_ushort, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "long_int", native_long, native_int, H5T_conv_long_int, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "long_uint", native_long, native_uint, H5T_conv_long_uint, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "ulong_int", native_ulong, native_int, H5T_conv_ulong_int, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "ulong_uint", native_ulong, native_uint, H5T_conv_ulong_uint, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "long_schar", native_long, native_schar, H5T_conv_long_schar, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "long_uchar", native_long, native_uchar, H5T_conv_long_uchar, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "ulong_schar", native_ulong, native_schar, H5T_conv_ulong_schar, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "ulong_uchar", native_ulong, native_uchar, H5T_conv_ulong_uchar, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "long_llong", native_long, native_llong, H5T_conv_long_llong, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "long_ullong", native_long, native_ullong, H5T_conv_long_ullong, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ulong_llong", native_ulong, native_llong, H5T_conv_ulong_llong, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ulong_ullong", native_ulong, native_ullong, H5T_conv_ulong_ullong, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "long_ulong", native_long, native_ulong, H5T_conv_long_ulong, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ulong_long", native_ulong, native_long, H5T_conv_ulong_long, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "long_short", native_long, native_short, H5T_conv_long_short, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "long_ushort", native_long, native_ushort, H5T_conv_long_ushort, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ulong_short", native_ulong, native_short, H5T_conv_ulong_short, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ulong_ushort", native_ulong, native_ushort, H5T_conv_ulong_ushort, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "long_int", native_long, native_int, H5T_conv_long_int, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "long_uint", native_long, native_uint, H5T_conv_long_uint, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ulong_int", native_ulong, native_int, H5T_conv_ulong_int, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ulong_uint", native_ulong, native_uint, H5T_conv_ulong_uint, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "long_schar", native_long, native_schar, H5T_conv_long_schar, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "long_uchar", native_long, native_uchar, H5T_conv_long_uchar, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ulong_schar", native_ulong, native_schar, H5T_conv_ulong_schar, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ulong_uchar", native_ulong, native_uchar, H5T_conv_ulong_uchar, H5AC_dxpl_id, FALSE); /* From short */ - status |= H5T_register(H5T_PERS_HARD, "short_llong", native_short, native_llong, H5T_conv_short_llong, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "short_ullong", native_short, native_ullong, H5T_conv_short_ullong, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "ushort_llong", native_ushort, native_llong, H5T_conv_ushort_llong, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "ushort_ullong", native_ushort, native_ullong, H5T_conv_ushort_ullong, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "short_long", native_short, native_long, H5T_conv_short_long, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "short_ulong", native_short, native_ulong, H5T_conv_short_ulong, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "ushort_long", native_ushort, native_long, H5T_conv_ushort_long, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "ushort_ulong", native_ushort, native_ulong, H5T_conv_ushort_ulong, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "short_ushort", native_short, native_ushort, H5T_conv_short_ushort, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "ushort_short", native_ushort, native_short, H5T_conv_ushort_short, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "short_int", native_short, native_int, H5T_conv_short_int, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "short_uint", native_short, native_uint, H5T_conv_short_uint, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "ushort_int", native_ushort, native_int, H5T_conv_ushort_int, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "ushort_uint", native_ushort, native_uint, H5T_conv_ushort_uint, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "short_schar", native_short, native_schar, H5T_conv_short_schar, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "short_uchar", native_short, native_uchar, H5T_conv_short_uchar, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "ushort_schar", native_ushort, native_schar, H5T_conv_ushort_schar, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "ushort_uchar", native_ushort, native_uchar, H5T_conv_ushort_uchar, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "short_llong", native_short, native_llong, H5T_conv_short_llong, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "short_ullong", native_short, native_ullong, H5T_conv_short_ullong, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ushort_llong", native_ushort, native_llong, H5T_conv_ushort_llong, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ushort_ullong", native_ushort, native_ullong, H5T_conv_ushort_ullong, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "short_long", native_short, native_long, H5T_conv_short_long, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "short_ulong", native_short, native_ulong, H5T_conv_short_ulong, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ushort_long", native_ushort, native_long, H5T_conv_ushort_long, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ushort_ulong", native_ushort, native_ulong, H5T_conv_ushort_ulong, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "short_ushort", native_short, native_ushort, H5T_conv_short_ushort, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ushort_short", native_ushort, native_short, H5T_conv_ushort_short, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "short_int", native_short, native_int, H5T_conv_short_int, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "short_uint", native_short, native_uint, H5T_conv_short_uint, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ushort_int", native_ushort, native_int, H5T_conv_ushort_int, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ushort_uint", native_ushort, native_uint, H5T_conv_ushort_uint, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "short_schar", native_short, native_schar, H5T_conv_short_schar, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "short_uchar", native_short, native_uchar, H5T_conv_short_uchar, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ushort_schar", native_ushort, native_schar, H5T_conv_ushort_schar, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ushort_uchar", native_ushort, native_uchar, H5T_conv_ushort_uchar, H5AC_dxpl_id, FALSE); /* From int */ - status |= H5T_register(H5T_PERS_HARD, "int_llong", native_int, native_llong, H5T_conv_int_llong, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "int_ullong", native_int, native_ullong, H5T_conv_int_ullong, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "uint_llong", native_uint, native_llong, H5T_conv_uint_llong, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "uint_ullong", native_uint, native_ullong, H5T_conv_uint_ullong, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "int_long", native_int, native_long, H5T_conv_int_long, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "int_ulong", native_int, native_ulong, H5T_conv_int_ulong, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "uint_long", native_uint, native_long, H5T_conv_uint_long, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "uint_ulong", native_uint, native_ulong, H5T_conv_uint_ulong, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "int_short", native_int, native_short, H5T_conv_int_short, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "int_ushort", native_int, native_ushort, H5T_conv_int_ushort, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "uint_short", native_uint, native_short, H5T_conv_uint_short, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "uint_ushort", native_uint, native_ushort, H5T_conv_uint_ushort, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "int_uint", native_int, native_uint, H5T_conv_int_uint, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "uint_int", native_uint, native_int, H5T_conv_uint_int, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "int_schar", native_int, native_schar, H5T_conv_int_schar, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "int_uchar", native_int, native_uchar, H5T_conv_int_uchar, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "uint_schar", native_uint, native_schar, H5T_conv_uint_schar, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "uint_uchar", native_uint, native_uchar, H5T_conv_uint_uchar, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "int_llong", native_int, native_llong, H5T_conv_int_llong, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "int_ullong", native_int, native_ullong, H5T_conv_int_ullong, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "uint_llong", native_uint, native_llong, H5T_conv_uint_llong, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "uint_ullong", native_uint, native_ullong, H5T_conv_uint_ullong, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "int_long", native_int, native_long, H5T_conv_int_long, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "int_ulong", native_int, native_ulong, H5T_conv_int_ulong, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "uint_long", native_uint, native_long, H5T_conv_uint_long, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "uint_ulong", native_uint, native_ulong, H5T_conv_uint_ulong, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "int_short", native_int, native_short, H5T_conv_int_short, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "int_ushort", native_int, native_ushort, H5T_conv_int_ushort, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "uint_short", native_uint, native_short, H5T_conv_uint_short, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "uint_ushort", native_uint, native_ushort, H5T_conv_uint_ushort, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "int_uint", native_int, native_uint, H5T_conv_int_uint, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "uint_int", native_uint, native_int, H5T_conv_uint_int, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "int_schar", native_int, native_schar, H5T_conv_int_schar, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "int_uchar", native_int, native_uchar, H5T_conv_int_uchar, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "uint_schar", native_uint, native_schar, H5T_conv_uint_schar, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "uint_uchar", native_uint, native_uchar, H5T_conv_uint_uchar, H5AC_dxpl_id, FALSE); /* From char */ - status |= H5T_register(H5T_PERS_HARD, "schar_llong", native_schar, native_llong, H5T_conv_schar_llong, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "schar_ullong", native_schar, native_ullong, H5T_conv_schar_ullong, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "uchar_llong", native_uchar, native_llong, H5T_conv_uchar_llong, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "uchar_ullong", native_uchar, native_ullong, H5T_conv_uchar_ullong, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "schar_long", native_schar, native_long, H5T_conv_schar_long, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "schar_ulong", native_schar, native_ulong, H5T_conv_schar_ulong, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "uchar_long", native_uchar, native_long, H5T_conv_uchar_long, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "uchar_ulong", native_uchar, native_ulong, H5T_conv_uchar_ulong, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "schar_short", native_schar, native_short, H5T_conv_schar_short, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "schar_ushort", native_schar, native_ushort, H5T_conv_schar_ushort, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "uchar_short", native_uchar, native_short, H5T_conv_uchar_short, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "uchar_ushort", native_uchar, native_ushort, H5T_conv_uchar_ushort, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "schar_int", native_schar, native_int, H5T_conv_schar_int, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "schar_uint", native_schar, native_uint, H5T_conv_schar_uint, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "uchar_int", native_uchar, native_int, H5T_conv_uchar_int, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "uchar_uint", native_uchar, native_uint, H5T_conv_uchar_uint, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "schar_uchar", native_schar, native_uchar, H5T_conv_schar_uchar, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "uchar_schar", native_uchar, native_schar, H5T_conv_uchar_schar, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "schar_llong", native_schar, native_llong, H5T_conv_schar_llong, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "schar_ullong", native_schar, native_ullong, H5T_conv_schar_ullong, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "uchar_llong", native_uchar, native_llong, H5T_conv_uchar_llong, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "uchar_ullong", native_uchar, native_ullong, H5T_conv_uchar_ullong, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "schar_long", native_schar, native_long, H5T_conv_schar_long, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "schar_ulong", native_schar, native_ulong, H5T_conv_schar_ulong, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "uchar_long", native_uchar, native_long, H5T_conv_uchar_long, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "uchar_ulong", native_uchar, native_ulong, H5T_conv_uchar_ulong, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "schar_short", native_schar, native_short, H5T_conv_schar_short, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "schar_ushort", native_schar, native_ushort, H5T_conv_schar_ushort, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "uchar_short", native_uchar, native_short, H5T_conv_uchar_short, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "uchar_ushort", native_uchar, native_ushort, H5T_conv_uchar_ushort, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "schar_int", native_schar, native_int, H5T_conv_schar_int, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "schar_uint", native_schar, native_uint, H5T_conv_schar_uint, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "uchar_int", native_uchar, native_int, H5T_conv_uchar_int, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "uchar_uint", native_uchar, native_uint, H5T_conv_uchar_uint, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "schar_uchar", native_schar, native_uchar, H5T_conv_schar_uchar, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "uchar_schar", native_uchar, native_schar, H5T_conv_uchar_schar, H5AC_dxpl_id, FALSE); /* From char to floats */ - status |= H5T_register(H5T_PERS_HARD, "schar_flt", native_schar, native_float, H5T_conv_schar_float, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "schar_dbl", native_schar, native_double, H5T_conv_schar_double, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "schar_flt", native_schar, native_float, H5T_conv_schar_float, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "schar_dbl", native_schar, native_double, H5T_conv_schar_double, H5AC_dxpl_id, FALSE); #if H5T_CONV_INTERNAL_INTEGER_LDOUBLE - status |= H5T_register(H5T_PERS_HARD, "schar_ldbl", native_schar, native_ldouble, H5T_conv_schar_ldouble, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "schar_ldbl", native_schar, native_ldouble, H5T_conv_schar_ldouble, H5AC_dxpl_id, FALSE); #endif /* H5T_CONV_INTERNAL_INTEGER_LDOUBLE */ /* From unsigned char to floats */ - status |= H5T_register(H5T_PERS_HARD, "uchar_flt", native_uchar, native_float, H5T_conv_uchar_float, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "uchar_dbl", native_uchar, native_double, H5T_conv_uchar_double, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "uchar_flt", native_uchar, native_float, H5T_conv_uchar_float, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "uchar_dbl", native_uchar, native_double, H5T_conv_uchar_double, H5AC_dxpl_id, FALSE); #if H5T_CONV_INTERNAL_INTEGER_LDOUBLE - status |= H5T_register(H5T_PERS_HARD, "uchar_ldbl", native_uchar, native_ldouble, H5T_conv_uchar_ldouble, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "uchar_ldbl", native_uchar, native_ldouble, H5T_conv_uchar_ldouble, H5AC_dxpl_id, FALSE); #endif /* H5T_CONV_INTERNAL_INTEGER_LDOUBLE */ /* From short to floats */ - status |= H5T_register(H5T_PERS_HARD, "short_flt", native_short, native_float, H5T_conv_short_float, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "short_dbl", native_short, native_double, H5T_conv_short_double, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "short_flt", native_short, native_float, H5T_conv_short_float, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "short_dbl", native_short, native_double, H5T_conv_short_double, H5AC_dxpl_id, FALSE); #if H5T_CONV_INTERNAL_INTEGER_LDOUBLE - status |= H5T_register(H5T_PERS_HARD, "short_ldbl", native_short, native_ldouble, H5T_conv_short_ldouble, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "short_ldbl", native_short, native_ldouble, H5T_conv_short_ldouble, H5AC_dxpl_id, FALSE); #endif /* H5T_CONV_INTERNAL_INTEGER_LDOUBLE */ /* From unsigned short to floats */ - status |= H5T_register(H5T_PERS_HARD, "ushort_flt", native_ushort, native_float, H5T_conv_ushort_float, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "ushort_dbl", native_ushort, native_double, H5T_conv_ushort_double, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ushort_flt", native_ushort, native_float, H5T_conv_ushort_float, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ushort_dbl", native_ushort, native_double, H5T_conv_ushort_double, H5AC_dxpl_id, FALSE); #if H5T_CONV_INTERNAL_INTEGER_LDOUBLE - status |= H5T_register(H5T_PERS_HARD, "ushort_ldbl", native_ushort, native_ldouble, H5T_conv_ushort_ldouble, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ushort_ldbl", native_ushort, native_ldouble, H5T_conv_ushort_ldouble, H5AC_dxpl_id, FALSE); #endif /* H5T_CONV_INTERNAL_INTEGER_LDOUBLE */ /* From int to floats */ - status |= H5T_register(H5T_PERS_HARD, "int_flt", native_int, native_float, H5T_conv_int_float, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "int_dbl", native_int, native_double, H5T_conv_int_double, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "int_flt", native_int, native_float, H5T_conv_int_float, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "int_dbl", native_int, native_double, H5T_conv_int_double, H5AC_dxpl_id, FALSE); #if H5T_CONV_INTERNAL_INTEGER_LDOUBLE - status |= H5T_register(H5T_PERS_HARD, "int_ldbl", native_int, native_ldouble, H5T_conv_int_ldouble, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "int_ldbl", native_int, native_ldouble, H5T_conv_int_ldouble, H5AC_dxpl_id, FALSE); #endif /* H5T_CONV_INTERNAL_INTEGER_LDOUBLE */ /* From unsigned int to floats */ - status |= H5T_register(H5T_PERS_HARD, "uint_flt", native_uint, native_float, H5T_conv_uint_float, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "uint_dbl", native_uint, native_double, H5T_conv_uint_double, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "uint_flt", native_uint, native_float, H5T_conv_uint_float, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "uint_dbl", native_uint, native_double, H5T_conv_uint_double, H5AC_dxpl_id, FALSE); #if H5T_CONV_INTERNAL_INTEGER_LDOUBLE - status |= H5T_register(H5T_PERS_HARD, "uint_ldbl", native_uint, native_ldouble, H5T_conv_uint_ldouble, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "uint_ldbl", native_uint, native_ldouble, H5T_conv_uint_ldouble, H5AC_dxpl_id, FALSE); #endif /* H5T_CONV_INTERNAL_INTEGER_LDOUBLE */ /* From long to floats */ - status |= H5T_register(H5T_PERS_HARD, "long_flt", native_long, native_float, H5T_conv_long_float, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "long_dbl", native_long, native_double, H5T_conv_long_double, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "long_flt", native_long, native_float, H5T_conv_long_float, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "long_dbl", native_long, native_double, H5T_conv_long_double, H5AC_dxpl_id, FALSE); #if H5T_CONV_INTERNAL_INTEGER_LDOUBLE - status |= H5T_register(H5T_PERS_HARD, "long_ldbl", native_long, native_ldouble, H5T_conv_long_ldouble, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "long_ldbl", native_long, native_ldouble, H5T_conv_long_ldouble, H5AC_dxpl_id, FALSE); #endif /* H5T_CONV_INTERNAL_INTEGER_LDOUBLE */ /* From unsigned long to floats */ #if H5T_CONV_INTERNAL_ULONG_FP - status |= H5T_register(H5T_PERS_HARD, "ulong_flt", native_ulong, native_float, H5T_conv_ulong_float, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "ulong_dbl", native_ulong, native_double, H5T_conv_ulong_double, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ulong_flt", native_ulong, native_float, H5T_conv_ulong_float, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ulong_dbl", native_ulong, native_double, H5T_conv_ulong_double, H5AC_dxpl_id, FALSE); #endif /* H5T_CONV_INTERNAL_ULONG_FP */ #if H5T_CONV_INTERNAL_ULONG_LDOUBLE - status |= H5T_register(H5T_PERS_HARD, "ulong_ldbl", native_ulong, native_ldouble, H5T_conv_ulong_ldouble, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ulong_ldbl", native_ulong, native_ldouble, H5T_conv_ulong_ldouble, H5AC_dxpl_id, FALSE); #endif /* H5T_CONV_INTERNAL_ULONG_LDOUBLE */ /* From long long to floats */ - status |= H5T_register(H5T_PERS_HARD, "llong_flt", native_llong, native_float, H5T_conv_llong_float, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "llong_dbl", native_llong, native_double, H5T_conv_llong_double, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "llong_flt", native_llong, native_float, H5T_conv_llong_float, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "llong_dbl", native_llong, native_double, H5T_conv_llong_double, H5AC_dxpl_id, FALSE); #ifdef H5T_CONV_INTERNAL_LLONG_LDOUBLE - status |= H5T_register(H5T_PERS_HARD, "llong_ldbl", native_llong, native_ldouble, H5T_conv_llong_ldouble, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "llong_ldbl", native_llong, native_ldouble, H5T_conv_llong_ldouble, H5AC_dxpl_id, FALSE); #endif /* H5T_CONV_INTERNAL_LLONG_LDOUBLE */ /* From unsigned long long to floats */ #if H5T_CONV_INTERNAL_ULLONG_FP - status |= H5T_register(H5T_PERS_HARD, "ullong_flt", native_ullong, native_float, H5T_conv_ullong_float, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "ullong_dbl", native_ullong, native_double, H5T_conv_ullong_double, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ullong_flt", native_ullong, native_float, H5T_conv_ullong_float, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ullong_dbl", native_ullong, native_double, H5T_conv_ullong_double, H5AC_dxpl_id, FALSE); #endif /* H5T_CONV_INTERNAL_ULLONG_FP */ #ifdef H5T_CONV_INTERNAL_ULLONG_LDOUBLE - status |= H5T_register(H5T_PERS_HARD, "ullong_ldbl", native_ullong, native_ldouble, H5T_conv_ullong_ldouble, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ullong_ldbl", native_ullong, native_ldouble, H5T_conv_ullong_ldouble, H5AC_dxpl_id, FALSE); #endif /* H5T_CONV_INTERNAL_ULLONG_LDOUBLE */ /* From floats to char */ - status |= H5T_register(H5T_PERS_HARD, "flt_schar", native_float, native_schar, H5T_conv_float_schar, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "dbl_schar", native_double, native_schar, H5T_conv_double_schar, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "flt_schar", native_float, native_schar, H5T_conv_float_schar, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "dbl_schar", native_double, native_schar, H5T_conv_double_schar, H5AC_dxpl_id, FALSE); #if H5T_CONV_INTERNAL_LDOUBLE_INTEGER - status |= H5T_register(H5T_PERS_HARD, "ldbl_schar", native_ldouble, native_schar, H5T_conv_ldouble_schar, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ldbl_schar", native_ldouble, native_schar, H5T_conv_ldouble_schar, H5AC_dxpl_id, FALSE); #endif /* H5T_CONV_INTERNAL_LDOUBLE_INTEGER */ /* From floats to unsigned char */ - status |= H5T_register(H5T_PERS_HARD, "flt_uchar", native_float, native_uchar, H5T_conv_float_uchar, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "dbl_uchar", native_double, native_uchar, H5T_conv_double_uchar, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "flt_uchar", native_float, native_uchar, H5T_conv_float_uchar, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "dbl_uchar", native_double, native_uchar, H5T_conv_double_uchar, H5AC_dxpl_id, FALSE); #if H5T_CONV_INTERNAL_LDOUBLE_INTEGER - status |= H5T_register(H5T_PERS_HARD, "ldbl_uchar", native_ldouble, native_uchar, H5T_conv_ldouble_uchar, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ldbl_uchar", native_ldouble, native_uchar, H5T_conv_ldouble_uchar, H5AC_dxpl_id, FALSE); #endif /* H5T_CONV_INTERNAL_LDOUBLE_INTEGER */ /* From floats to short */ - status |= H5T_register(H5T_PERS_HARD, "flt_short", native_float, native_short, H5T_conv_float_short, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "dbl_short", native_double, native_short, H5T_conv_double_short, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "flt_short", native_float, native_short, H5T_conv_float_short, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "dbl_short", native_double, native_short, H5T_conv_double_short, H5AC_dxpl_id, FALSE); #if H5T_CONV_INTERNAL_LDOUBLE_INTEGER - status |= H5T_register(H5T_PERS_HARD, "ldbl_short", native_ldouble, native_short, H5T_conv_ldouble_short, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ldbl_short", native_ldouble, native_short, H5T_conv_ldouble_short, H5AC_dxpl_id, FALSE); #endif /* H5T_CONV_INTERNAL_LDOUBLE_INTEGER */ /* From floats to unsigned short */ - status |= H5T_register(H5T_PERS_HARD, "flt_ushort", native_float, native_ushort, H5T_conv_float_ushort, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "dbl_ushort", native_double, native_ushort, H5T_conv_double_ushort, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "flt_ushort", native_float, native_ushort, H5T_conv_float_ushort, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "dbl_ushort", native_double, native_ushort, H5T_conv_double_ushort, H5AC_dxpl_id, FALSE); #if H5T_CONV_INTERNAL_LDOUBLE_INTEGER - status |= H5T_register(H5T_PERS_HARD, "ldbl_ushort", native_ldouble, native_ushort, H5T_conv_ldouble_ushort, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ldbl_ushort", native_ldouble, native_ushort, H5T_conv_ldouble_ushort, H5AC_dxpl_id, FALSE); #endif /* H5T_CONV_INTERNAL_LDOUBLE_INTEGER */ /* From floats to int */ - status |= H5T_register(H5T_PERS_HARD, "flt_int", native_float, native_int, H5T_conv_float_int, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "dbl_int", native_double, native_int, H5T_conv_double_int, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "flt_int", native_float, native_int, H5T_conv_float_int, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "dbl_int", native_double, native_int, H5T_conv_double_int, H5AC_dxpl_id, FALSE); #if H5T_CONV_INTERNAL_LDOUBLE_INTEGER - status |= H5T_register(H5T_PERS_HARD, "ldbl_int", native_ldouble, native_int, H5T_conv_ldouble_int, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ldbl_int", native_ldouble, native_int, H5T_conv_ldouble_int, H5AC_dxpl_id, FALSE); #endif /* H5T_CONV_INTERNAL_LDOUBLE_INTEGER */ /* From floats to unsigned int */ - status |= H5T_register(H5T_PERS_HARD, "flt_uint", native_float, native_uint, H5T_conv_float_uint, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "dbl_uint", native_double, native_uint, H5T_conv_double_uint, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "flt_uint", native_float, native_uint, H5T_conv_float_uint, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "dbl_uint", native_double, native_uint, H5T_conv_double_uint, H5AC_dxpl_id, FALSE); #if H5T_CONV_INTERNAL_LDOUBLE_UINT - status |= H5T_register(H5T_PERS_HARD, "ldbl_uint", native_ldouble, native_uint, H5T_conv_ldouble_uint, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ldbl_uint", native_ldouble, native_uint, H5T_conv_ldouble_uint, H5AC_dxpl_id, FALSE); #endif /* H5T_CONV_INTERNAL_LDOUBLE_UINT */ - status |= H5T_register(H5T_PERS_HARD, "flt_long", native_float, native_long, H5T_conv_float_long, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "dbl_long", native_double, native_long, H5T_conv_double_long, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "flt_long", native_float, native_long, H5T_conv_float_long, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "dbl_long", native_double, native_long, H5T_conv_double_long, H5AC_dxpl_id, FALSE); #if H5T_CONV_INTERNAL_LDOUBLE_INTEGER - status |= H5T_register(H5T_PERS_HARD, "ldbl_long", native_ldouble, native_long, H5T_conv_ldouble_long, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ldbl_long", native_ldouble, native_long, H5T_conv_ldouble_long, H5AC_dxpl_id, FALSE); #endif /* H5T_CONV_INTERNAL_LDOUBLE_INTEGER */ /* From floats to unsigned long */ - status |= H5T_register(H5T_PERS_HARD, "flt_ulong", native_float, native_ulong, H5T_conv_float_ulong, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "dbl_ulong", native_double, native_ulong, H5T_conv_double_ulong, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "flt_ulong", native_float, native_ulong, H5T_conv_float_ulong, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "dbl_ulong", native_double, native_ulong, H5T_conv_double_ulong, H5AC_dxpl_id, FALSE); #if H5T_CONV_INTERNAL_LDOUBLE_INTEGER - status |= H5T_register(H5T_PERS_HARD, "ldbl_ulong", native_ldouble, native_ulong, H5T_conv_ldouble_ulong, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ldbl_ulong", native_ldouble, native_ulong, H5T_conv_ldouble_ulong, H5AC_dxpl_id, FALSE); #endif /* H5T_CONV_INTERNAL_LDOUBLE_INTEGER */ /* From floats to long long */ #if H5T_CONV_INTERNAL_FP_LLONG - status |= H5T_register(H5T_PERS_HARD, "flt_llong", native_float, native_llong, H5T_conv_float_llong, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "dbl_llong", native_double, native_llong, H5T_conv_double_llong, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "flt_llong", native_float, native_llong, H5T_conv_float_llong, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "dbl_llong", native_double, native_llong, H5T_conv_double_llong, H5AC_dxpl_id, FALSE); #endif /* H5T_CONV_INTERNAL_FP_LLONG */ #ifdef H5T_CONV_INTERNAL_LDOUBLE_LLONG - status |= H5T_register(H5T_PERS_HARD, "ldbl_llong", native_ldouble, native_llong, H5T_conv_ldouble_llong, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ldbl_llong", native_ldouble, native_llong, H5T_conv_ldouble_llong, H5AC_dxpl_id, FALSE); #endif /* H5T_CONV_INTERNAL_LDOUBLE_LLONG */ /* From floats to unsigned long long */ #if H5T_CONV_INTERNAL_FP_ULLONG - status |= H5T_register(H5T_PERS_HARD, "flt_ullong", native_float, native_ullong, H5T_conv_float_ullong, H5AC2_dxpl_id, FALSE); - status |= H5T_register(H5T_PERS_HARD, "dbl_ullong", native_double, native_ullong, H5T_conv_double_ullong, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "flt_ullong", native_float, native_ullong, H5T_conv_float_ullong, H5AC_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "dbl_ullong", native_double, native_ullong, H5T_conv_double_ullong, H5AC_dxpl_id, FALSE); #endif /* H5T_CONV_INTERNAL_FP_ULLONG */ #if H5T_CONV_INTERNAL_LDOUBLE_ULLONG - status |= H5T_register(H5T_PERS_HARD, "ldbl_ullong", native_ldouble, native_ullong, H5T_conv_ldouble_ullong, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "ldbl_ullong", native_ldouble, native_ullong, H5T_conv_ldouble_ullong, H5AC_dxpl_id, FALSE); #endif /* H5T_CONV_INTERNAL_LDOUBLE_ULLONG */ /* @@ -1301,7 +1301,7 @@ H5T_init_interface(void) * data types we use are not important as long as the source and * destination are equal. */ - status |= H5T_register(H5T_PERS_HARD, "no-op", native_int, native_int, H5T_conv_noop, H5AC2_dxpl_id, FALSE); + status |= H5T_register(H5T_PERS_HARD, "no-op", native_int, native_int, H5T_conv_noop, H5AC_dxpl_id, FALSE); /* Initialize the +/- Infinity values for floating-point types */ status |= H5T_init_inf(); @@ -1425,7 +1425,7 @@ H5T_term_interface(void) path->cdata.command = H5T_CONV_FREE; if ((path->func)(FAIL, FAIL, &(path->cdata), (size_t)0, (size_t)0, (size_t)0, - NULL, NULL,H5AC2_dxpl_id)<0) { + NULL, NULL,H5AC_dxpl_id)<0) { #ifdef H5T_DEBUG if (H5DEBUG(T)) { fprintf (H5DEBUG(T), "H5T: conversion function " @@ -1700,7 +1700,7 @@ H5Tclose(hid_t type_id) H5T_t *dt = NULL; herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_API_META(H5Tclose, type_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Tclose, type_id, H5AC_dxpl_id, FAIL) H5TRACE1("e", "i", type_id); /* Check args */ @@ -2445,7 +2445,7 @@ H5Tregister(H5T_pers_t pers, const char *name, hid_t src_id, hid_t dst_id, HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "no conversion function specified"); /* Go register the function */ - if(H5T_register(pers,name,src,dst,func,H5AC2_ind_dxpl_id,TRUE)<0) + if(H5T_register(pers,name,src,dst,func,H5AC_ind_dxpl_id,TRUE)<0) HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "can't register conversion function"); done: @@ -2587,7 +2587,7 @@ H5Tunregister(H5T_pers_t pers, const char *name, hid_t src_id, hid_t dst_id, if (dst_id>0 && (NULL==(dst=H5I_object_verify(dst_id,H5I_DATATYPE)))) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "dst is not a data type"); - if (H5T_unregister(pers,name,src,dst,func,H5AC2_ind_dxpl_id)<0) + if (H5T_unregister(pers,name,src,dst,func,H5AC_ind_dxpl_id)<0) HGOTO_ERROR(H5E_DATATYPE, H5E_CANTDELETE, FAIL, "internal unregister function failed"); done: @@ -2633,7 +2633,7 @@ H5Tfind(hid_t src_id, hid_t dst_id, H5T_cdata_t **pcdata) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "no address to receive cdata pointer"); /* Find it */ - if (NULL==(path=H5T_path_find(src, dst, NULL, NULL, H5AC2_ind_dxpl_id, FALSE))) + if (NULL==(path=H5T_path_find(src, dst, NULL, NULL, H5AC_ind_dxpl_id, FALSE))) HGOTO_ERROR(H5E_DATATYPE, H5E_NOTFOUND, NULL, "conversion function not found"); if (pcdata) @@ -2932,7 +2932,7 @@ H5T_decode(const unsigned char *buf) HGOTO_ERROR(H5E_DATATYPE, H5E_VERSION, NULL, "unknown version of encoded datatype") /* Decode the serialized datatype message */ - if((ret_value = H5O_msg_decode(f, H5AC2_dxpl_id, H5O_DTYPE_ID, buf)) == NULL) + if((ret_value = H5O_msg_decode(f, H5AC_dxpl_id, H5O_DTYPE_ID, buf)) == NULL) HGOTO_ERROR(H5E_DATATYPE, H5E_CANTDECODE, NULL, "can't decode object") done: @@ -3452,7 +3452,7 @@ H5T_free(H5T_t *dt) /* Remove the datatype from the list of opened objects in the file */ if(H5FO_top_decr(dt->sh_loc.file, dt->sh_loc.u.loc.oh_addr) < 0) HGOTO_ERROR(H5E_DATATYPE, H5E_CANTRELEASE, FAIL, "can't decrement count for object") - if(H5FO_delete(dt->sh_loc.file, H5AC2_dxpl_id, dt->sh_loc.u.loc.oh_addr) < 0) + if(H5FO_delete(dt->sh_loc.file, H5AC_dxpl_id, dt->sh_loc.u.loc.oh_addr) < 0) HGOTO_ERROR(H5E_DATATYPE, H5E_CANTRELEASE, FAIL, "can't remove datatype from list of open objects") if(H5O_close(&dt->oloc) < 0) HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to close data type object header") @@ -4615,7 +4615,7 @@ H5T_compiler_conv(H5T_t *src, H5T_t *dst) FUNC_ENTER_NOAPI_NOINIT(H5T_compiler_conv) /* Find it */ - if (NULL==(path=H5T_path_find(src, dst, NULL, NULL, H5AC2_ind_dxpl_id, FALSE))) + if (NULL==(path=H5T_path_find(src, dst, NULL, NULL, H5AC_ind_dxpl_id, FALSE))) HGOTO_ERROR(H5E_DATATYPE, H5E_NOTFOUND, FAIL, "conversion function not found") ret_value = (htri_t)path->is_hard; diff --git a/src/H5Tcommit.c b/src/H5Tcommit.c index 14b410a..db0443d 100644 --- a/src/H5Tcommit.c +++ b/src/H5Tcommit.c @@ -25,7 +25,7 @@ #include "H5private.h" /* Generic Functions */ -#include "H5AC2private.h" /* Metadata cache */ +#include "H5ACprivate.h" /* Metadata cache */ #include "H5Eprivate.h" /* Error handling */ #include "H5FOprivate.h" /* File objects */ #include "H5Iprivate.h" /* IDs */ @@ -80,7 +80,7 @@ H5Tcommit2(hid_t loc_id, const char *name, hid_t type_id, hid_t lcpl_id, H5T_t *type; /* Datatype for ID */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_API_META(H5Tcommit2, loc_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Tcommit2, loc_id, H5AC_dxpl_id, FAIL) H5TRACE6("e", "i*siiii", loc_id, name, type_id, lcpl_id, tcpl_id, tapl_id); /* Check arguments */ @@ -113,7 +113,7 @@ H5Tcommit2(hid_t loc_id, const char *name, hid_t type_id, hid_t lcpl_id, HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not datatype access property list") /* Commit the type */ - if(H5T_commit_named(&loc, name, type, lcpl_id, tcpl_id, tapl_id, H5AC2_dxpl_id) < 0) + if(H5T_commit_named(&loc, name, type, lcpl_id, tcpl_id, tapl_id, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to commit datatype") done: @@ -229,7 +229,7 @@ H5Tcommit_anon(hid_t loc_id, hid_t type_id, hid_t tcpl_id, hid_t tapl_id) H5T_t *type = NULL; herr_t ret_value=SUCCEED; /* Return value */ - FUNC_ENTER_API_META(H5Tcommit_anon, loc_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Tcommit_anon, loc_id, H5AC_dxpl_id, FAIL) H5TRACE4("e", "iiii", loc_id, type_id, tcpl_id, tapl_id); /* Check arguments */ @@ -253,7 +253,7 @@ H5Tcommit_anon(hid_t loc_id, hid_t type_id, hid_t tcpl_id, hid_t tapl_id) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not datatype access property list") /* Commit the type */ - if(H5T_commit(loc.oloc->file, type, tcpl_id, H5AC2_dxpl_id) < 0) + if(H5T_commit(loc.oloc->file, type, tcpl_id, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to commit datatype") done: @@ -492,7 +492,7 @@ H5Topen2(hid_t loc_id, const char *name, hid_t tapl_id) H5O_type_t obj_type; /* Type of object at location */ H5G_loc_t type_loc; /* Group object for datatype */ hbool_t obj_found = FALSE; /* Object at 'name' found */ - hid_t dxpl_id = H5AC2_dxpl_id; /* dxpl to use to open datatype */ + hid_t dxpl_id = H5AC_dxpl_id; /* dxpl to use to open datatype */ hid_t ret_value = FAIL; FUNC_ENTER_API(H5Topen2, FAIL) @@ -603,7 +603,7 @@ H5Tget_create_plist(hid_t dtype_id) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get property list") /* Retrieve any object creation properties */ - if(H5O_get_create_plist(&type->oloc, H5AC2_ind_dxpl_id, new_plist) < 0) + if(H5O_get_create_plist(&type->oloc, H5AC_ind_dxpl_id, new_plist) < 0) HGOTO_ERROR(H5E_DATATYPE, H5E_CANTGET, FAIL, "can't get object creation info") } /* end if */ diff --git a/src/H5Tdeprec.c b/src/H5Tdeprec.c index d6f741e..1adfa05 100644 --- a/src/H5Tdeprec.c +++ b/src/H5Tdeprec.c @@ -41,7 +41,7 @@ /* Headers */ /***********/ #include "H5private.h" /* Generic Functions */ -#include "H5AC2private.h" /* Metadata cache */ +#include "H5ACprivate.h" /* Metadata cache */ #include "H5Eprivate.h" /* Error handling */ #include "H5FOprivate.h" /* File objects */ #include "H5Iprivate.h" /* IDs */ @@ -128,7 +128,7 @@ H5Tcommit1(hid_t loc_id, const char *name, hid_t type_id) H5T_t *type; /* Datatype for ID */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_API_META(H5Tcommit1, loc_id, H5AC2_dxpl_id, FAIL) + FUNC_ENTER_API_META(H5Tcommit1, loc_id, H5AC_dxpl_id, FAIL) H5TRACE3("e", "i*si", loc_id, name, type_id); /* Check arguments */ @@ -141,7 +141,7 @@ H5Tcommit1(hid_t loc_id, const char *name, hid_t type_id) /* Commit the datatype to the file, using default property list values */ if(H5T_commit_named(&loc, name, type, H5P_LINK_CREATE_DEFAULT, - H5P_DATATYPE_CREATE_DEFAULT, H5P_DATATYPE_ACCESS_DEFAULT, H5AC2_dxpl_id) < 0) + H5P_DATATYPE_CREATE_DEFAULT, H5P_DATATYPE_ACCESS_DEFAULT, H5AC_dxpl_id) < 0) HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to commit datatype") done: @@ -175,7 +175,7 @@ H5Topen1(hid_t loc_id, const char *name) H5O_type_t obj_type; /* Type of object at location */ H5G_loc_t type_loc; /* Group object for datatype */ hbool_t obj_found = FALSE; /* Object at 'name' found */ - hid_t dxpl_id = H5AC2_dxpl_id; /* dxpl to use to open datatype */ + hid_t dxpl_id = H5AC_dxpl_id; /* dxpl to use to open datatype */ hid_t ret_value = FAIL; FUNC_ENTER_API(H5Topen1, FAIL) diff --git a/src/H5Zscaleoffset.c b/src/H5Zscaleoffset.c index c720565..5ef3e7a 100644 --- a/src/H5Zscaleoffset.c +++ b/src/H5Zscaleoffset.c @@ -16,7 +16,7 @@ #define H5Z_PACKAGE /*suppress error about including H5Zpkg */ #include "H5private.h" /* Generic Functions */ -#include "H5AC2private.h" /* Metadata cache */ +#include "H5ACprivate.h" /* Metadata cache */ #include "H5Eprivate.h" /* Error handling */ #include "H5Iprivate.h" /* IDs */ #include "H5MMprivate.h" /* Memory management */ @@ -878,7 +878,7 @@ H5Z_set_local_scaleoffset(hid_t dcpl_id, hid_t type_id, hid_t space_id) HGOTO_ERROR(H5E_PLINE, H5E_BADTYPE, FAIL, "cannot use C integer datatype for cast") /* Get dataset fill value and store in cd_values[] */ - if(H5Z_scaleoffset_set_parms_fillval(dcpl_plist, type, scale_type, cd_values, need_convert, H5AC2_ind_dxpl_id) < 0) + if(H5Z_scaleoffset_set_parms_fillval(dcpl_plist, type, scale_type, cd_values, need_convert, H5AC_ind_dxpl_id) < 0) HGOTO_ERROR(H5E_PLINE, H5E_CANTSET, FAIL, "unable to set fill value") } /* end else */ diff --git a/src/H5config.h.in b/src/H5config.h.in index 107b4b6..9e135b8 100644 --- a/src/H5config.h.in +++ b/src/H5config.h.in @@ -288,7 +288,7 @@ /* Define if `struct timezone' is defined */ #undef HAVE_STRUCT_TIMEZONE -/* Define to 1 if `tm_zone' is member of `struct tm'. */ +/* Define to 1 if `struct tm' is a member of `tm_zone'. */ #undef HAVE_STRUCT_TM_TM_ZONE /* Define if `struct videoconfig' is defined */ @@ -466,6 +466,9 @@ /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME +/* Define to the home page for this package. */ +#undef PACKAGE_URL + /* Define to the version of this package. */ #undef PACKAGE_VERSION diff --git a/src/H5private.h b/src/H5private.h index 749da71..9f59047 100644 --- a/src/H5private.h +++ b/src/H5private.h @@ -1753,11 +1753,11 @@ static herr_t H5_INTERFACE_INIT_FUNC(void); /* Clear thread error stack entering public functions */ \ H5E_clear_stack(NULL); \ \ - if (H5AC2_begin_transaction(id, &do_transaction, &id_oloc, \ + if (H5AC_begin_transaction(id, &do_transaction, &id_oloc, \ &id_oloc_open, &transaction_begun, \ &trans_num, FUNC) < 0) { \ HGOTO_ERROR(H5E_CACHE, H5E_CANTJOURNAL, err, \ - "H5AC2_begin_transaction() failed."); \ + "H5AC_begin_transaction() failed."); \ } /* @@ -1908,11 +1908,11 @@ static herr_t H5_INTERFACE_INIT_FUNC(void); /* Use this macro to match the FUNC_ENTER_API_META macro */ #define FUNC_LEAVE_API_META(ret_value) \ - if ( H5AC2_end_transaction(do_transaction, &id_oloc, \ + if ( H5AC_end_transaction(do_transaction, &id_oloc, \ id_oloc_open, transaction_begun, \ trans_dxpl_id, trans_num, FUNC) < 0 ) { \ HDONE_ERROR(H5E_CACHE, H5E_CANTJOURNAL, FAIL, \ - "H5AC2_end_transaction() failed."); \ + "H5AC_end_transaction() failed."); \ } \ FINISH_MPE_LOG; \ H5TRACE_RETURN(ret_value); \ @@ -1959,7 +1959,7 @@ H5_DLL void H5_term_library(void); /* Functions to terminate interfaces */ H5_DLL int H5A_term_interface(void); H5_DLL int H5AC1_term_interface(void); -H5_DLL int H5AC2_term_interface(void); +H5_DLL int H5AC_term_interface(void); H5_DLL int H5D_term_interface(void); H5_DLL int H5E_term_interface(void); H5_DLL int H5F_term_interface(void); diff --git a/src/Makefile.am b/src/Makefile.am index f615e8a..1e8f936 100755 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -43,9 +43,9 @@ DISTCLEANFILES=H5pubconf.h # library sources libhdf5_la_SOURCES= H5.c H5checksum.c H5dbg.c H5system.c H5timer.c H5trace.c \ H5A.c H5Abtree2.c H5Adense.c H5Adeprec.c H5Aint.c H5Atest.c \ - H5AC1.c H5AC2.c H5B.c H5Bcache.c \ + H5AC1.c H5AC.c H5B.c H5Bcache.c \ H5B2.c H5B2cache.c H5B2dbg.c H5B2int.c H5B2stat.c H5B2test.c \ - H5C1.c H5C2.c H5C2journal.c H5CS.c \ + H5C1.c H5C.c H5Cjournal.c H5CS.c \ H5D.c H5Dchunk.c H5Dcompact.c H5Dcontig.c H5Ddbg.c \ H5Ddeprec.c H5Defl.c H5Dfill.c H5Dint.c \ H5Dio.c \ @@ -99,8 +99,8 @@ libhdf5_la_SOURCES= H5.c H5checksum.c H5dbg.c H5system.c H5timer.c H5trace.c \ # Public headers include_HEADERS = hdf5.h H5api_adpt.h H5pubconf.h H5public.h H5version.h \ - H5Apublic.h H5AC1public.h H5AC2public.h \ - H5C1public.h H5C2public.h H5Dpublic.h \ + H5Apublic.h H5AC1public.h H5ACpublic.h \ + H5C1public.h H5Cpublic.h H5Dpublic.h \ H5Epubgen.h H5Epublic.h H5Fpublic.h H5FDpublic.h H5FDcore.h H5FDdirect.h \ H5FDfamily.h H5FDlog.h H5FDmpi.h H5FDmpio.h H5FDmpiposix.h \ H5FDmulti.h H5FDsec2.h H5FDstdio.h \ diff --git a/src/Makefile.in b/src/Makefile.in index 501972b..85e76b2 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -97,9 +97,9 @@ LTLIBRARIES = $(lib_LTLIBRARIES) libhdf5_la_LIBADD = am_libhdf5_la_OBJECTS = H5.lo H5checksum.lo H5dbg.lo H5system.lo \ H5timer.lo H5trace.lo H5A.lo H5Abtree2.lo H5Adense.lo \ - H5Adeprec.lo H5Aint.lo H5Atest.lo H5AC1.lo H5AC2.lo H5B.lo \ + H5Adeprec.lo H5Aint.lo H5Atest.lo H5AC1.lo H5AC.lo H5B.lo \ H5Bcache.lo H5B2.lo H5B2cache.lo H5B2dbg.lo H5B2int.lo \ - H5B2stat.lo H5B2test.lo H5C1.lo H5C2.lo H5C2journal.lo H5CS.lo \ + H5B2stat.lo H5B2test.lo H5C1.lo H5C.lo H5Cjournal.lo H5CS.lo \ H5D.lo H5Dchunk.lo H5Dcompact.lo H5Dcontig.lo H5Ddbg.lo \ H5Ddeprec.lo H5Defl.lo H5Dfill.lo H5Dint.lo H5Dio.lo \ H5Distore.lo H5Dmpio.lo H5Doh.lo H5Dscatgath.lo H5Dselect.lo \ @@ -447,9 +447,9 @@ DISTCLEANFILES = H5pubconf.h # library sources libhdf5_la_SOURCES = H5.c H5checksum.c H5dbg.c H5system.c H5timer.c H5trace.c \ H5A.c H5Abtree2.c H5Adense.c H5Adeprec.c H5Aint.c H5Atest.c \ - H5AC1.c H5AC2.c H5B.c H5Bcache.c \ + H5AC1.c H5AC.c H5B.c H5Bcache.c \ H5B2.c H5B2cache.c H5B2dbg.c H5B2int.c H5B2stat.c H5B2test.c \ - H5C1.c H5C2.c H5C2journal.c H5CS.c \ + H5C1.c H5C.c H5Cjournal.c H5CS.c \ H5D.c H5Dchunk.c H5Dcompact.c H5Dcontig.c H5Ddbg.c \ H5Ddeprec.c H5Defl.c H5Dfill.c H5Dint.c \ H5Dio.c \ @@ -503,8 +503,8 @@ libhdf5_la_SOURCES = H5.c H5checksum.c H5dbg.c H5system.c H5timer.c H5trace.c \ # Public headers include_HEADERS = hdf5.h H5api_adpt.h H5pubconf.h H5public.h H5version.h \ - H5Apublic.h H5AC1public.h H5AC2public.h \ - H5C1public.h H5C2public.h H5Dpublic.h \ + H5Apublic.h H5AC1public.h H5ACpublic.h \ + H5C1public.h H5Cpublic.h H5Dpublic.h \ H5Epubgen.h H5Epublic.h H5Fpublic.h H5FDpublic.h H5FDcore.h H5FDdirect.h \ H5FDfamily.h H5FDlog.h H5FDmpi.h H5FDmpio.h H5FDmpiposix.h \ H5FDmulti.h H5FDsec2.h H5FDstdio.h \ @@ -640,8 +640,8 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5A.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5AC.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5AC1.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5AC2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5Abtree2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5Adense.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5Adeprec.Plo@am__quote@ @@ -655,10 +655,10 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5B2stat.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5B2test.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5Bcache.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5C.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5C1.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5C2.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5C2journal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5CS.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5Cjournal.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5D.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5Dchunk.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/H5Dcompact.Plo@am__quote@ diff --git a/src/hdf5.h b/src/hdf5.h index f537141..ed1bc20 100644 --- a/src/hdf5.h +++ b/src/hdf5.h @@ -24,7 +24,7 @@ #include "H5public.h" #include "H5Apublic.h" /* Attributes */ #include "H5AC1public.h" /* Metadata cache */ -#include "H5AC2public.h" /* New Metadata cache */ +#include "H5ACpublic.h" /* Metadata cache */ #include "H5Dpublic.h" /* Datasets */ #include "H5Epublic.h" /* Errors */ #include "H5Fpublic.h" /* Files */ diff --git a/test/Makefile.am b/test/Makefile.am index 98fff94..f827abd 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -27,7 +27,7 @@ INCLUDES=-I$(top_srcdir)/src -I$(top_builddir)/src TEST_SCRIPT = testerror.sh ${srcdir}/testjnlfilemarking.sh check_SCRIPTS = $(TEST_SCRIPT) SCRIPT_DEPEND = error_test$(EXEEXT) err_compat$(EXEEXT) \ - cache2_jnl_file_marking.c$(EXEEXT) + cache_jnl_file_marking.c$(EXEEXT) # These are our main targets. They should be listed in the order to be @@ -37,8 +37,8 @@ SCRIPT_DEPEND = error_test$(EXEEXT) err_compat$(EXEEXT) \ # These tests (fheap, btree2) are under development and are not used by # the library yet. Move them to the end so that their failure do not block # other current library code tests. -TEST_PROG=testhdf5 lheap ohdr stab gheap cache1 cache1_api cache2 cache2_api \ - cache2_journal pool hyperslab istore bittests dt_arith \ +TEST_PROG=testhdf5 lheap ohdr stab gheap cache1 cache1_api cache cache_api \ + cache_journal pool hyperslab istore bittests dt_arith \ dtypes dsets cmpd_dset extend external objcopy links unlink big mtime \ fillval mount flush1 flush2 enum \ set_extent ttsafe \ @@ -51,7 +51,7 @@ TEST_PROG=testhdf5 lheap ohdr stab gheap cache1 cache1_api cache2 cache2_api \ # Also build testmeta, which is used for timings test. It builds quickly, # and this lets automake keep all its test programs in one place. check_PROGRAMS=$(TEST_PROG) error_test err_compat testmeta \ - cache2_jnl_file_marking + cache_jnl_file_marking # These programs generate test files for the tests. They don't need to be @@ -71,7 +71,7 @@ endif # The libh5test library provides common support code for the tests. noinst_LTLIBRARIES=libh5test.la -libh5test_la_SOURCES=h5test.c testframe.c cache1_common.c cache2_common.c +libh5test_la_SOURCES=h5test.c testframe.c cache1_common.c cache_common.c # Use libhd5test.la to compile all of the tests LDADD=libh5test.la $(LIBHDF5) @@ -121,7 +121,7 @@ CHECK_CLEANFILES+=cmpd_dset.h5 compact_dataset.h5 dataset.h5 dset_offset.h5 \ family_file000[0-3][0-9].h5 multi_file-[rs].h5 core_file \ new_move_[ab].h5 ntypes.h5 dangle.h5 error_test.h5 err_compat.h5 \ dtransform.h5 test_filters.h5 get_file_name.h5 tstint[1-2].h5 \ - unlink_chunked.h5 btree2.h5 cache2_journal*.jnl \ + unlink_chunked.h5 btree2.h5 cache_journal*.jnl \ objcopy_src.h5 objcopy_dst.h5 objcopy_ext.dat trefer1.h5 trefer2.h5 # Sources for testhdf5 executable diff --git a/test/Makefile.in b/test/Makefile.in index a82f283..aadd78c 100644 --- a/test/Makefile.in +++ b/test/Makefile.in @@ -57,7 +57,7 @@ DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ $(top_srcdir)/config/conclude.am COPYING check_PROGRAMS = $(am__EXEEXT_1) error_test$(EXEEXT) \ err_compat$(EXEEXT) testmeta$(EXEEXT) \ - cache2_jnl_file_marking$(EXEEXT) + cache_jnl_file_marking$(EXEEXT) @BUILD_ALL_CONDITIONAL_TRUE@noinst_PROGRAMS = $(am__EXEEXT_2) TESTS = $(check_PROGRAMS) $(check_SCRIPTS) subdir = test @@ -72,12 +72,12 @@ CONFIG_CLEAN_VPATH_FILES = LTLIBRARIES = $(noinst_LTLIBRARIES) libh5test_la_LIBADD = am_libh5test_la_OBJECTS = h5test.lo testframe.lo cache1_common.lo \ - cache2_common.lo + cache_common.lo libh5test_la_OBJECTS = $(am_libh5test_la_OBJECTS) am__EXEEXT_1 = testhdf5$(EXEEXT) lheap$(EXEEXT) ohdr$(EXEEXT) \ stab$(EXEEXT) gheap$(EXEEXT) cache1$(EXEEXT) \ - cache1_api$(EXEEXT) cache2$(EXEEXT) cache2_api$(EXEEXT) \ - cache2_journal$(EXEEXT) pool$(EXEEXT) hyperslab$(EXEEXT) \ + cache1_api$(EXEEXT) cache$(EXEEXT) cache_api$(EXEEXT) \ + cache_journal$(EXEEXT) pool$(EXEEXT) hyperslab$(EXEEXT) \ istore$(EXEEXT) bittests$(EXEEXT) dt_arith$(EXEEXT) \ dtypes$(EXEEXT) dsets$(EXEEXT) cmpd_dset$(EXEEXT) \ extend$(EXEEXT) external$(EXEEXT) objcopy$(EXEEXT) \ @@ -107,6 +107,10 @@ btree2_SOURCES = btree2.c btree2_OBJECTS = btree2.$(OBJEXT) btree2_LDADD = $(LDADD) btree2_DEPENDENCIES = libh5test.la $(LIBHDF5) +cache_SOURCES = cache.c +cache_OBJECTS = cache.$(OBJEXT) +cache_LDADD = $(LDADD) +cache_DEPENDENCIES = libh5test.la $(LIBHDF5) cache1_SOURCES = cache1.c cache1_OBJECTS = cache1.$(OBJEXT) cache1_LDADD = $(LDADD) @@ -115,22 +119,18 @@ cache1_api_SOURCES = cache1_api.c cache1_api_OBJECTS = cache1_api.$(OBJEXT) cache1_api_LDADD = $(LDADD) cache1_api_DEPENDENCIES = libh5test.la $(LIBHDF5) -cache2_SOURCES = cache2.c -cache2_OBJECTS = cache2.$(OBJEXT) -cache2_LDADD = $(LDADD) -cache2_DEPENDENCIES = libh5test.la $(LIBHDF5) -cache2_api_SOURCES = cache2_api.c -cache2_api_OBJECTS = cache2_api.$(OBJEXT) -cache2_api_LDADD = $(LDADD) -cache2_api_DEPENDENCIES = libh5test.la $(LIBHDF5) -cache2_jnl_file_marking_SOURCES = cache2_jnl_file_marking.c -cache2_jnl_file_marking_OBJECTS = cache2_jnl_file_marking.$(OBJEXT) -cache2_jnl_file_marking_LDADD = $(LDADD) -cache2_jnl_file_marking_DEPENDENCIES = libh5test.la $(LIBHDF5) -cache2_journal_SOURCES = cache2_journal.c -cache2_journal_OBJECTS = cache2_journal.$(OBJEXT) -cache2_journal_LDADD = $(LDADD) -cache2_journal_DEPENDENCIES = libh5test.la $(LIBHDF5) +cache_api_SOURCES = cache_api.c +cache_api_OBJECTS = cache_api.$(OBJEXT) +cache_api_LDADD = $(LDADD) +cache_api_DEPENDENCIES = libh5test.la $(LIBHDF5) +cache_jnl_file_marking_SOURCES = cache_jnl_file_marking.c +cache_jnl_file_marking_OBJECTS = cache_jnl_file_marking.$(OBJEXT) +cache_jnl_file_marking_LDADD = $(LDADD) +cache_jnl_file_marking_DEPENDENCIES = libh5test.la $(LIBHDF5) +cache_journal_SOURCES = cache_journal.c +cache_journal_OBJECTS = cache_journal.$(OBJEXT) +cache_journal_LDADD = $(LDADD) +cache_journal_DEPENDENCIES = libh5test.la $(LIBHDF5) cmpd_dset_SOURCES = cmpd_dset.c cmpd_dset_OBJECTS = cmpd_dset.$(OBJEXT) cmpd_dset_LDADD = $(LDADD) @@ -354,9 +354,9 @@ CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ -SOURCES = $(libh5test_la_SOURCES) big.c bittests.c btree2.c cache1.c \ - cache1_api.c cache2.c cache2_api.c cache2_jnl_file_marking.c \ - cache2_journal.c cmpd_dset.c cross_read.c dangle.c dsets.c \ +SOURCES = $(libh5test_la_SOURCES) big.c bittests.c btree2.c cache.c \ + cache1.c cache1_api.c cache_api.c cache_jnl_file_marking.c \ + cache_journal.c cmpd_dset.c cross_read.c dangle.c dsets.c \ dt_arith.c dtransform.c dtypes.c enum.c err_compat.c \ error_test.c extend.c external.c fheap.c fillval.c flush1.c \ flush2.c gen_bad_ohdr.c gen_bogus.c gen_cross.c gen_deflate.c \ @@ -368,8 +368,8 @@ SOURCES = $(libh5test_la_SOURCES) big.c bittests.c btree2.c cache1.c \ $(testhdf5_SOURCES) testmeta.c $(ttsafe_SOURCES) unlink.c \ vfd.c DIST_SOURCES = $(libh5test_la_SOURCES) big.c bittests.c btree2.c \ - cache1.c cache1_api.c cache2.c cache2_api.c \ - cache2_jnl_file_marking.c cache2_journal.c cmpd_dset.c \ + cache.c cache1.c cache1_api.c cache_api.c \ + cache_jnl_file_marking.c cache_journal.c cmpd_dset.c \ cross_read.c dangle.c dsets.c dt_arith.c dtransform.c dtypes.c \ enum.c err_compat.c error_test.c extend.c external.c fheap.c \ fillval.c flush1.c flush2.c gen_bad_ohdr.c gen_bogus.c \ @@ -660,7 +660,7 @@ CHECK_CLEANFILES = *.chkexe *.chklog *.clog cmpd_dset.h5 \ direct_file.h5 family_file000[0-3][0-9].h5 multi_file-[rs].h5 \ core_file new_move_[ab].h5 ntypes.h5 dangle.h5 error_test.h5 \ err_compat.h5 dtransform.h5 test_filters.h5 get_file_name.h5 \ - tstint[1-2].h5 unlink_chunked.h5 btree2.h5 cache2_journal*.jnl \ + tstint[1-2].h5 unlink_chunked.h5 btree2.h5 cache_journal*.jnl \ objcopy_src.h5 objcopy_dst.h5 objcopy_ext.dat trefer1.h5 \ trefer2.h5 INCLUDES = -I$(top_srcdir)/src -I$(top_builddir)/src @@ -669,7 +669,7 @@ INCLUDES = -I$(top_srcdir)/src -I$(top_builddir)/src TEST_SCRIPT = testerror.sh ${srcdir}/testjnlfilemarking.sh check_SCRIPTS = $(TEST_SCRIPT) SCRIPT_DEPEND = error_test$(EXEEXT) err_compat$(EXEEXT) \ - cache2_jnl_file_marking.c$(EXEEXT) + cache_jnl_file_marking.c$(EXEEXT) # These are our main targets. They should be listed in the order to be @@ -679,8 +679,8 @@ SCRIPT_DEPEND = error_test$(EXEEXT) err_compat$(EXEEXT) \ # These tests (fheap, btree2) are under development and are not used by # the library yet. Move them to the end so that their failure do not block # other current library code tests. -TEST_PROG = testhdf5 lheap ohdr stab gheap cache1 cache1_api cache2 cache2_api \ - cache2_journal pool hyperslab istore bittests dt_arith \ +TEST_PROG = testhdf5 lheap ohdr stab gheap cache1 cache1_api cache cache_api \ + cache_journal pool hyperslab istore bittests dt_arith \ dtypes dsets cmpd_dset extend external objcopy links unlink big mtime \ fillval mount flush1 flush2 enum \ set_extent ttsafe \ @@ -702,7 +702,7 @@ BUILD_ALL_PROGS = gen_bad_ohdr gen_bogus gen_cross gen_deflate gen_filters gen_n # The libh5test library provides common support code for the tests. noinst_LTLIBRARIES = libh5test.la -libh5test_la_SOURCES = h5test.c testframe.c cache1_common.c cache2_common.c +libh5test_la_SOURCES = h5test.c testframe.c cache1_common.c cache_common.c # Use libhd5test.la to compile all of the tests LDADD = libh5test.la $(LIBHDF5) @@ -813,24 +813,24 @@ bittests$(EXEEXT): $(bittests_OBJECTS) $(bittests_DEPENDENCIES) btree2$(EXEEXT): $(btree2_OBJECTS) $(btree2_DEPENDENCIES) @rm -f btree2$(EXEEXT) $(LINK) $(btree2_OBJECTS) $(btree2_LDADD) $(LIBS) +cache$(EXEEXT): $(cache_OBJECTS) $(cache_DEPENDENCIES) + @rm -f cache$(EXEEXT) + $(LINK) $(cache_OBJECTS) $(cache_LDADD) $(LIBS) cache1$(EXEEXT): $(cache1_OBJECTS) $(cache1_DEPENDENCIES) @rm -f cache1$(EXEEXT) $(LINK) $(cache1_OBJECTS) $(cache1_LDADD) $(LIBS) cache1_api$(EXEEXT): $(cache1_api_OBJECTS) $(cache1_api_DEPENDENCIES) @rm -f cache1_api$(EXEEXT) $(LINK) $(cache1_api_OBJECTS) $(cache1_api_LDADD) $(LIBS) -cache2$(EXEEXT): $(cache2_OBJECTS) $(cache2_DEPENDENCIES) - @rm -f cache2$(EXEEXT) - $(LINK) $(cache2_OBJECTS) $(cache2_LDADD) $(LIBS) -cache2_api$(EXEEXT): $(cache2_api_OBJECTS) $(cache2_api_DEPENDENCIES) - @rm -f cache2_api$(EXEEXT) - $(LINK) $(cache2_api_OBJECTS) $(cache2_api_LDADD) $(LIBS) -cache2_jnl_file_marking$(EXEEXT): $(cache2_jnl_file_marking_OBJECTS) $(cache2_jnl_file_marking_DEPENDENCIES) - @rm -f cache2_jnl_file_marking$(EXEEXT) - $(LINK) $(cache2_jnl_file_marking_OBJECTS) $(cache2_jnl_file_marking_LDADD) $(LIBS) -cache2_journal$(EXEEXT): $(cache2_journal_OBJECTS) $(cache2_journal_DEPENDENCIES) - @rm -f cache2_journal$(EXEEXT) - $(LINK) $(cache2_journal_OBJECTS) $(cache2_journal_LDADD) $(LIBS) +cache_api$(EXEEXT): $(cache_api_OBJECTS) $(cache_api_DEPENDENCIES) + @rm -f cache_api$(EXEEXT) + $(LINK) $(cache_api_OBJECTS) $(cache_api_LDADD) $(LIBS) +cache_jnl_file_marking$(EXEEXT): $(cache_jnl_file_marking_OBJECTS) $(cache_jnl_file_marking_DEPENDENCIES) + @rm -f cache_jnl_file_marking$(EXEEXT) + $(LINK) $(cache_jnl_file_marking_OBJECTS) $(cache_jnl_file_marking_LDADD) $(LIBS) +cache_journal$(EXEEXT): $(cache_journal_OBJECTS) $(cache_journal_DEPENDENCIES) + @rm -f cache_journal$(EXEEXT) + $(LINK) $(cache_journal_OBJECTS) $(cache_journal_LDADD) $(LIBS) cmpd_dset$(EXEEXT): $(cmpd_dset_OBJECTS) $(cmpd_dset_DEPENDENCIES) @rm -f cmpd_dset$(EXEEXT) $(LINK) $(cmpd_dset_OBJECTS) $(cmpd_dset_LDADD) $(LIBS) @@ -991,14 +991,14 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/big.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bittests.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/btree2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache1.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache1_api.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache1_common.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache2.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache2_api.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache2_common.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache2_jnl_file_marking.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache2_journal.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache_api.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache_common.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache_jnl_file_marking.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cache_journal.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmpd_dset.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cross_read.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dangle.Po@am__quote@ diff --git a/test/cache.c b/test/cache.c new file mode 100644 index 0000000..cff73dc --- /dev/null +++ b/test/cache.c @@ -0,0 +1,29322 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * Copyright by the Board of Trustees of the University of Illinois. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* Programmer: John Mainzer + * 6/9/04 + * + * This file contains tests for the cache implemented in + * H5C.c + */ + +#include + +#include "h5test.h" +#include "H5Iprivate.h" +#include "H5ACprivate.h" +#include "cache_common.h" + +/* private function declarations: */ + +static unsigned smoke_check_1(void); +static unsigned smoke_check_2(void); +static unsigned smoke_check_3(void); +static unsigned smoke_check_4(void); +static unsigned smoke_check_5(void); +static unsigned smoke_check_6(void); +static unsigned smoke_check_7(void); +static unsigned smoke_check_8(void); +static unsigned smoke_check_9(void); +static unsigned smoke_check_10(void); +static unsigned write_permitted_check(void); +static unsigned check_insert_entry(void); +static unsigned check_flush_cache(void); +static void check_flush_cache__empty_cache(H5F_t * file_ptr); +static void check_flush_cache__multi_entry(H5F_t * file_ptr); +static void check_flush_cache__multi_entry_test(H5F_t * file_ptr, + int test_num, + unsigned int flush_flags, + int spec_size, + struct flush_cache_test_spec spec[]); +static void check_flush_cache__pe_multi_entry_test(H5F_t * file_ptr, + int test_num, + unsigned int flush_flags, + int spec_size, + struct pe_flush_cache_test_spec spec[]); +static void check_flush_cache__single_entry(H5F_t * file_ptr); +static void check_flush_cache__single_entry_test(H5F_t * file_ptr, + int test_num, + int entry_type, + int entry_idx, + hbool_t insert_flag, + hbool_t dirty_flag, + unsigned int flags, + unsigned int flush_flags, + hbool_t expected_deserialized, + hbool_t expected_cleared, + hbool_t expected_serialized, + hbool_t expected_destroyed); +static void check_flush_cache__pinned_single_entry_test(H5F_t * file_ptr, + int test_num, + int entry_type, + int entry_idx, + hbool_t dirty_flag, + hbool_t mark_dirty, + hbool_t pop_mark_dirty_prot, + hbool_t pop_mark_dirty_pinned, + hbool_t unprotect_unpin, + unsigned int flags, + unsigned int flush_flags, + hbool_t expected_cleared, + hbool_t expected_serialized, + hbool_t expected_destroyed); +static void check_flush_cache__flush_ops(H5F_t * file_ptr); +static void check_flush_cache__flush_op_test(H5F_t * file_ptr, + int test_num, + unsigned int flush_flags, + int spec_size, + struct fo_flush_cache_test_spec spec[], + int init_expected_index_len, + size_t init_expected_index_size, + int expected_index_len, + size_t expected_index_size, + int check_size, + struct fo_flush_entry_check check[]); +static void check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr); +static unsigned check_get_entry_status(void); +static unsigned check_expunge_entry(void); +static unsigned check_multiple_read_protect(void); +static unsigned check_rename_entry(void); +static void check_rename_entry__run_test(H5F_t * file_ptr, int test_num, + struct rename_entry_test_spec * spec_ptr); +static unsigned check_pin_protected_entry(void); +static unsigned check_resize_entry(void); +static unsigned check_evictions_enabled(void); +static unsigned check_flush_protected_err(void); +static unsigned check_destroy_pinned_err(void); +static unsigned check_destroy_protected_err(void); +static unsigned check_duplicate_insert_err(void); +static unsigned check_rename_err(void); +static unsigned check_double_pin_err(void); +static unsigned check_double_unpin_err(void); +static unsigned check_pin_entry_errs(void); +static unsigned check_double_protect_err(void); +static unsigned check_double_unprotect_err(void); +static unsigned check_mark_entry_dirty_errs(void); +static unsigned check_expunge_entry_errs(void); +static unsigned check_resize_entry_errs(void); +static unsigned check_unprotect_ro_dirty_err(void); +static unsigned check_protect_ro_rw_err(void); +static unsigned check_check_evictions_enabled_err(void); +static unsigned check_auto_cache_resize(void); +static unsigned check_auto_cache_resize_disable(void); +static unsigned check_auto_cache_resize_epoch_markers(void); +static unsigned check_auto_cache_resize_input_errs(void); +static unsigned check_auto_cache_resize_aux_fcns(void); + + +/**************************************************************************/ +/**************************************************************************/ +/********************************* tests: *********************************/ +/**************************************************************************/ +/**************************************************************************/ + +/*------------------------------------------------------------------------- + * Function: smoke_check_1() + * + * Purpose: A basic functional test, inserts, destroys, and renames in + * the mix, along with repeated protects and unprotects. + * All entries are marked as clean. + * + * Return: void + * + * Programmer: John Mainzer + * 6/16/04 + * + * Modifications: + * + * JRM -- 1/18/05 + * Added code to skip this test if the skip_long_tests global + * is true. + * + *------------------------------------------------------------------------- + */ + +static unsigned +smoke_check_1(void) +{ + const char * fcn_name = "smoke_check_1"; + hbool_t show_progress = FALSE; + hbool_t dirty_inserts = FALSE; + int dirty_unprotects = FALSE; + int dirty_destroys = FALSE; + hbool_t display_stats = FALSE; + int32_t lag = 10; + int32_t max_index = (10 * 1024) - 1; + int mile_stone = 1; + H5F_t * file_ptr = NULL; + + core_file_driver_failed = FALSE; + + TESTING("smoke check #1 -- all clean, ins, dest, ren, 4/2 MB cache"); + + switch ( express_test ) + { + case 0: + max_index = (10 * 1024) - 1; + break; + + case 1: + max_index = (1 * 1024) - 1; + break; + + case 2: + max_index = (512) - 1; + break; + + default: + SKIPPED(); + HDfprintf(stdout, " Long tests disabled.\n"); + return 0; /* <========== note return */ + break; + } + + pass = TRUE; + + if ( show_progress ) /* 1 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + reset_entries(); + + if ( show_progress ) /* 2 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + file_ptr = setup_cache((size_t)(4 * 1024 * 1024), + (size_t)(2 * 1024 * 1024)); + + if ( show_progress ) /* 3 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + row_major_scan_forward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ FALSE, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts, + /* do_renames */ TRUE, + /* rename_to_main_addr */ FALSE, + /* do_destroys */ TRUE, + /* do_mult_ro_protects */ TRUE, + /* dirty_destroys */ dirty_destroys, + /* dirty_unprotects */ dirty_unprotects); + + if ( show_progress ) /* 4 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + row_major_scan_backward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ FALSE, + /* do_inserts */ FALSE, + /* dirty_inserts */ dirty_inserts, + /* do_renames */ TRUE, + /* rename_to_main_addr */ TRUE, + /* do_destroys */ FALSE, + /* do_mult_ro_protects */ TRUE, + /* dirty_destroys */ dirty_destroys, + /* dirty_unprotects */ dirty_unprotects); + + if ( show_progress ) /* 5 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + row_major_scan_forward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ FALSE, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts, + /* do_renames */ TRUE, + /* rename_to_main_addr */ FALSE, + /* do_destroys */ FALSE, + /* do_mult_ro_protects */ TRUE, + /* dirty_destroys */ dirty_destroys, + /* dirty_unprotects */ dirty_unprotects); + + if ( show_progress ) /* 6 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* flush and destroy all entries in the cache: */ + + flush_cache(/* file_ptr */ file_ptr, + /* destroy_entries */ TRUE, + /* dump_stats */ FALSE, + /* dump_detailed_stats */ FALSE); + + if ( show_progress ) /* 7 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + col_major_scan_forward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ TRUE, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts, + /* dirty_unprotects */ dirty_unprotects); + + if ( show_progress ) /* 8 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* flush all entries in the cache: */ + + flush_cache(/* file_ptr */ file_ptr, + /* destroy_entries */ FALSE, + /* dump_stats */ FALSE, + /* dump_detailed_stats */ FALSE); + + if ( show_progress ) /* 9 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + col_major_scan_backward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ TRUE, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts, + /* dirty_unprotects */ dirty_unprotects); + + if ( show_progress ) /* 10 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + takedown_cache(file_ptr, display_stats, TRUE); + + if ( show_progress ) /* 11 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + verify_clean(); + verify_unprotected(); + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + if ( core_file_driver_failed ) { + + HDfprintf(stdout, + "%s(): Unable to open test file with core file driver.\n", + fcn_name); + } + + return !pass; + +} /* smoke_check_1() */ + + +/*------------------------------------------------------------------------- + * Function: smoke_check_2() + * + * Purpose: A basic functional test, with inserts, destroys, and + * renames in the mix, along with some repeated protects + * and unprotects. About half the entries are marked as + * dirty. + * + * Return: void + * + * Programmer: John Mainzer + * 6/24/04 + * + * Modifications: + * + * JRM -- 1/18/05 + * Added code to skip this test if the skip_long_tests global + * is true. + * + *------------------------------------------------------------------------- + */ + +static unsigned +smoke_check_2(void) +{ + const char * fcn_name = "smoke_check_2"; + hbool_t show_progress = FALSE; + hbool_t dirty_inserts = TRUE; + int dirty_unprotects = TRUE; + int dirty_destroys = TRUE; + hbool_t display_stats = FALSE; + int32_t max_index = (10 * 1024) - 1; + int32_t lag = 10; + int mile_stone = 1; + H5F_t * file_ptr = NULL; + + TESTING("smoke check #2 -- ~1/2 dirty, ins, dest, ren, 4/2 MB cache"); + + core_file_driver_failed = FALSE; + + switch ( express_test ) + { + case 0: + max_index = (10 * 1024) - 1; + break; + + case 1: + max_index = (1 * 1024) - 1; + break; + + case 2: + max_index = (512) - 1; + break; + + default: + SKIPPED(); + HDfprintf(stdout, " Long tests disabled.\n"); + return 0; /* <========== note return */ + break; + } + + pass = TRUE; + + if ( show_progress ) /* 1 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + reset_entries(); + + if ( show_progress ) /* 2 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + file_ptr = setup_cache((size_t)(4 * 1024 * 1024), + (size_t)(2 * 1024 * 1024)); + + if ( show_progress ) /* 3 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + row_major_scan_forward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ TRUE, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts, + /* do_renames */ TRUE, + /* rename_to_main_addr */ FALSE, + /* do_destroys */ TRUE, + /* do_mult_ro_protects */ TRUE, + /* dirty_destroys */ dirty_destroys, + /* dirty_unprotects */ dirty_unprotects); + + if ( show_progress ) /* 4 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + row_major_scan_backward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ TRUE, + /* do_inserts */ FALSE, + /* dirty_inserts */ dirty_inserts, + /* do_renames */ TRUE, + /* rename_to_main_addr */ TRUE, + /* do_destroys */ FALSE, + /* do_mult_ro_protects */ TRUE, + /* dirty_destroys */ dirty_destroys, + /* dirty_unprotects */ dirty_unprotects); + + if ( show_progress ) /* 5 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + row_major_scan_forward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ TRUE, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts, + /* do_renames */ TRUE, + /* rename_to_main_addr */ FALSE, + /* do_destroys */ FALSE, + /* do_mult_ro_protects */ TRUE, + /* dirty_destroys */ dirty_destroys, + /* dirty_unprotects */ dirty_unprotects); + + if ( show_progress ) /* 6 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* flush and destroy all entries in the cache: */ + + flush_cache(/* file_ptr */ file_ptr, + /* destroy_entries */ TRUE, + /* dump_stats */ FALSE, + /* dump_detailed_stats */ FALSE); + + if ( show_progress ) /* 7 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + col_major_scan_forward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ TRUE, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts, + /* dirty_unprotects */ dirty_unprotects); + + if ( show_progress ) /* 8 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* flush all entries in the cache: */ + + flush_cache(/* file_ptr */ file_ptr, + /* destroy_entries */ FALSE, + /* dump_stats */ FALSE, + /* dump_detailed_stats */ FALSE); + + if ( show_progress ) /* 9 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + col_major_scan_backward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ TRUE, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts, + /* dirty_unprotects */ dirty_unprotects); + + if ( show_progress ) /* 10 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + takedown_cache(file_ptr, display_stats, TRUE); + + if ( show_progress ) /* 11 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + verify_clean(); + verify_unprotected(); + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + if ( core_file_driver_failed ) { + + HDfprintf(stdout, + "%s(): Unable to open test file with core file driver.\n", + fcn_name); + } + + return !pass; + +} /* smoke_check_2() */ + + +/*------------------------------------------------------------------------- + * Function: smoke_check_3() + * + * Purpose: A basic functional test on a tiny cache, with inserts, + * destroys, and renames in the mix, along with repeated + * protects and unprotects. All entries are marked as clean. + * + * Return: void + * + * Programmer: John Mainzer + * 6/16/04 + * + * Modifications: + * + * JRM -- 1/18/05 + * Added code to skip this test if the skip_long_tests global + * is true. + * + *------------------------------------------------------------------------- + */ + +static unsigned +smoke_check_3(void) +{ + const char * fcn_name = "smoke_check_3"; + hbool_t show_progress = FALSE; + hbool_t dirty_inserts = FALSE; + int dirty_unprotects = FALSE; + int dirty_destroys = FALSE; + hbool_t display_stats = FALSE; + int32_t max_index = (10 * 1024) - 1; + int32_t lag = 10; + int mile_stone = 1; + H5F_t * file_ptr = NULL; + + TESTING("smoke check #3 -- all clean, ins, dest, ren, 2/1 KB cache"); + + core_file_driver_failed = FALSE; + + switch ( express_test ) + { + case 0: + max_index = (10 * 1024) - 1; + break; + + case 1: + max_index = (1 * 1024) - 1; + break; + + case 2: + max_index = (512) - 1; + break; + + default: + SKIPPED(); + HDfprintf(stdout, " Long tests disabled.\n"); + return 0; /* <========== note return */ + break; + } + + pass = TRUE; + + if ( show_progress ) /* 1 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + reset_entries(); + + if ( show_progress ) /* 2 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + file_ptr = setup_cache((size_t)(2 * 1024), + (size_t)(1 * 1024)); + + if ( show_progress ) /* 3 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + row_major_scan_forward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ TRUE, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts, + /* do_renames */ TRUE, + /* rename_to_main_addr */ FALSE, + /* do_destroys */ TRUE, + /* do_mult_ro_protects */ TRUE, + /* dirty_destroys */ dirty_destroys, + /* dirty_unprotects */ dirty_unprotects); + + if ( show_progress ) /* 4 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + row_major_scan_backward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ TRUE, + /* do_inserts */ FALSE, + /* dirty_inserts */ dirty_inserts, + /* do_renames */ TRUE, + /* rename_to_main_addr */ TRUE, + /* do_destroys */ FALSE, + /* do_mult_ro_protects */ TRUE, + /* dirty_destroys */ dirty_destroys, + /* dirty_unprotects */ dirty_unprotects); + + if ( show_progress ) /* 5 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + row_major_scan_forward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ TRUE, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts, + /* do_renames */ TRUE, + /* rename_to_main_addr */ FALSE, + /* do_destroys */ FALSE, + /* do_mult_ro_protects */ TRUE, + /* dirty_destroys */ dirty_destroys, + /* dirty_unprotects */ dirty_unprotects); + + if ( show_progress ) /* 6 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* flush and destroy all entries in the cache: */ + + flush_cache(/* file_ptr */ file_ptr, + /* destroy_entries */ TRUE, + /* dump_stats */ FALSE, + /* dump_detailed_stats */ FALSE); + + if ( show_progress ) /* 7 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + col_major_scan_forward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ TRUE, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts, + /* dirty_unprotects */ dirty_unprotects); + + if ( show_progress ) /* 8 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* flush all entries in the cache: */ + + flush_cache(/* file_ptr */ file_ptr, + /* destroy_entries */ FALSE, + /* dump_stats */ FALSE, + /* dump_detailed_stats */ FALSE); + + if ( show_progress ) /* 9 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + col_major_scan_backward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ TRUE, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts, + /* dirty_unprotects */ dirty_unprotects); + + if ( show_progress ) /* 10 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + takedown_cache(file_ptr, display_stats, TRUE); + + if ( show_progress ) /* 11 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + verify_clean(); + verify_unprotected(); + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + if ( core_file_driver_failed ) { + + HDfprintf(stdout, + "%s(): Unable to open test file with core file driver.\n", + fcn_name); + } + + return !pass; + +} /* smoke_check_3() */ + + +/*------------------------------------------------------------------------- + * Function: smoke_check_4() + * + * Purpose: A basic functional test on a tiny cache, with inserts, + * destroys, and renames in the mix, along with repeated + * protects and unprotects. About half the entries are + * marked as dirty. + * + * Return: void + * + * Programmer: John Mainzer + * 6/24/04 + * + * Modifications: + * + * JRM -- 1/18/05 + * Added code to skip this test if the skip_long_tests global + * is true. + * + *------------------------------------------------------------------------- + */ + +static unsigned +smoke_check_4(void) +{ + const char * fcn_name = "smoke_check_4"; + hbool_t show_progress = FALSE; + hbool_t dirty_inserts = TRUE; + int dirty_unprotects = TRUE; + int dirty_destroys = TRUE; + hbool_t display_stats = FALSE; + int32_t max_index = (10 * 1024) - 1; + int32_t lag = 10; + int mile_stone = 1; + H5F_t * file_ptr = NULL; + + TESTING("smoke check #4 -- ~1/2 dirty, ins, dest, ren, 2/1 KB cache"); + + core_file_driver_failed = FALSE; + + switch ( express_test ) + { + case 0: + max_index = (10 * 1024) - 1; + break; + + case 1: + max_index = (1 * 1024) - 1; + break; + + case 2: + max_index = (512) - 1; + break; + + default: + SKIPPED(); + HDfprintf(stdout, " Long tests disabled.\n"); + return 0; /* <========== note return */ + break; + } + + pass = TRUE; + + if ( show_progress ) /* 1 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + reset_entries(); + + if ( show_progress ) /* 2 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + file_ptr = setup_cache((size_t)(2 * 1024), + (size_t)(1 * 1024)); + + if ( show_progress ) /* 3 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + row_major_scan_forward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ TRUE, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts, + /* do_renames */ TRUE, + /* rename_to_main_addr */ FALSE, + /* do_destroys */ TRUE, + /* do_mult_ro_protects */ TRUE, + /* dirty_destroys */ dirty_destroys, + /* dirty_unprotects */ dirty_unprotects); + + if ( show_progress ) /* 4 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + row_major_scan_backward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ TRUE, + /* do_inserts */ FALSE, + /* dirty_inserts */ dirty_inserts, + /* do_renames */ TRUE, + /* rename_to_main_addr */ TRUE, + /* do_destroys */ FALSE, + /* do_mult_ro_protects */ TRUE, + /* dirty_destroys */ dirty_destroys, + /* dirty_unprotects */ dirty_unprotects); + + if ( show_progress ) /* 5 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + row_major_scan_forward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ TRUE, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts, + /* do_renames */ TRUE, + /* rename_to_main_addr */ FALSE, + /* do_destroys */ FALSE, + /* do_mult_ro_protects */ TRUE, + /* dirty_destroys */ dirty_destroys, + /* dirty_unprotects */ dirty_unprotects); + + if ( show_progress ) /* 6 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* flush and destroy all entries in the cache: */ + + flush_cache(/* file_ptr */ file_ptr, + /* destroy_entries */ TRUE, + /* dump_stats */ FALSE, + /* dump_detailed_stats */ FALSE); + + if ( show_progress ) /* 7 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + col_major_scan_forward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ TRUE, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts, + /* dirty_unprotects */ dirty_unprotects); + + if ( show_progress ) /* 8 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* flush all entries in the cache: */ + + flush_cache(/* file_ptr */ file_ptr, + /* destroy_entries */ FALSE, + /* dump_stats */ FALSE, + /* dump_detailed_stats */ FALSE); + + if ( show_progress ) /* 9 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + col_major_scan_backward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ TRUE, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts, + /* dirty_unprotects */ dirty_unprotects); + + if ( show_progress ) /* 10 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + takedown_cache(file_ptr, display_stats, TRUE); + + if ( show_progress ) /* 11 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + verify_clean(); + verify_unprotected(); + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + if ( core_file_driver_failed ) { + + HDfprintf(stdout, + "%s(): Unable to open test file with core file driver.\n", + fcn_name); + } + + return !pass; + +} /* smoke_check_4() */ + + +/*------------------------------------------------------------------------- + * Function: smoke_check_5() + * + * Purpose: A basic functional test on a cache with automatic cache + * resizing enabled, with inserts in the mix, along with + * repeated protects and unprotects. All entries are marked + * as clean. + * + * Return: void + * + * Programmer: John Mainzer + * 10/14/04 + * + * Modifications: + * + * JRM -- 1/18/05 + * Added code to skip this test if the skip_long_tests global + * is true. + * + *------------------------------------------------------------------------- + */ + +static unsigned +smoke_check_5(void) +{ + const char * fcn_name = "smoke_check_5"; + herr_t result; + hbool_t show_progress = FALSE; + hbool_t dirty_inserts = FALSE; + int dirty_unprotects = FALSE; + hbool_t display_stats = FALSE; + int32_t max_index = 1024; + int mile_stone = 1; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + H5C_auto_size_ctl_t auto_size_ctl = + { + /* int32_t version = */ H5C__CURR_AUTO_SIZE_CTL_VER, +#if 1 + /* H5C_auto_resize_report_fcn rpt_fcn = */ NULL, +#else + /* H5C_auto_resize_report_fcn rpt_fcn = */ H5C_def_auto_resize_rpt_fcn, +#endif + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (2 * 1024 * 1024), + + /* double min_clean_fraction = */ 0.1, + + /* size_t max_size = */ (32 * 1024 * 1025), + /* size_t min_size = */ (512 * 1024), + + /* int64_t epoch_length = */ 50000, + + + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + + /* double lower_hr_threshold = */ 0.75, + + /* double increment = */ 2.0, + + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + + + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__threshold, + + /* double upper_hr_threshold = */ 0.995, + + /* double decrement = */ 0.9, + + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + + /* int32_t epochs_before_eviction = */ 3, + + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.5 + }; + + TESTING("smoke check #5 -- all clean, ins, prot, unprot, AR cache 1"); + + core_file_driver_failed = FALSE; + + switch ( express_test ) + { + case 0: + max_index = (10 * 1024) - 1; + break; + + case 1: + max_index = (1 * 1024) - 1; + break; + + case 2: + max_index = (512) - 1; + break; + + default: + SKIPPED(); + HDfprintf(stdout, " Long tests disabled.\n"); + return 0; /* <========== note return */ + break; + } + + pass = TRUE; + + if ( show_progress ) /* 1 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + reset_entries(); + + if ( show_progress ) /* 2 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + file_ptr = setup_cache((size_t)(2 * 1024), + (size_t)(1 * 1024)); + cache_ptr = file_ptr->shared->cache; + + if ( pass ) { + + result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 1.\n"; + } + } + + if ( show_progress ) /* 3 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + hl_row_major_scan_forward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ FALSE, + /* do_inserts */ FALSE, + /* dirty_inserts */ dirty_inserts); + + if ( show_progress ) /* 4 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + hl_row_major_scan_backward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ FALSE, + /* do_inserts */ FALSE, + /* dirty_inserts */ dirty_inserts); + + if ( show_progress ) /* 5 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + hl_row_major_scan_forward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ FALSE, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts); + + if ( show_progress ) /* 6 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* flush and destroy all entries in the cache: */ + + flush_cache(/* file_ptr */ file_ptr, + /* destroy_entries */ TRUE, + /* dump_stats */ FALSE, + /* dump_detailed_stats */ FALSE); + + if ( show_progress ) /* 7 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + hl_col_major_scan_forward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ FALSE, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts, + /* dirty_unprotects */ dirty_unprotects); + + if ( show_progress ) /* 8 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* flush all entries in the cache: */ + + flush_cache(/* file_ptr */ file_ptr, + /* destroy_entries */ FALSE, + /* dump_stats */ FALSE, + /* dump_detailed_stats */ FALSE); + + if ( show_progress ) /* 9 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + hl_col_major_scan_backward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ FALSE, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts, + /* dirty_unprotects */ dirty_unprotects); + + if ( show_progress ) /* 10 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + takedown_cache(file_ptr, display_stats, TRUE); + + if ( show_progress ) /* 11 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + verify_clean(); + verify_unprotected(); + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + if ( core_file_driver_failed ) { + + HDfprintf(stdout, + "%s(): Unable to open test file with core file driver.\n", + fcn_name); + } + + return !pass; + +} /* smoke_check_5() */ + + +/*------------------------------------------------------------------------- + * Function: smoke_check_6() + * + * Purpose: A basic functional test on a cache with automatic cache + * resizing enabled, with inserts in the mix, along with + * repeated protects and unprotects. About one half of all + * entries are marked as dirty. + * + * Return: void + * + * Programmer: John Mainzer + * 10/25/04 + * + * Modifications: + * + * JRM -- 1/18/05 + * Added code to skip this test if the skip_long_tests global + * is true. + * + *------------------------------------------------------------------------- + */ + +static unsigned +smoke_check_6(void) +{ + const char * fcn_name = "smoke_check_6"; + herr_t result; + hbool_t show_progress = FALSE; + hbool_t dirty_inserts = TRUE; + int dirty_unprotects = FALSE; + hbool_t display_stats = FALSE; + int mile_stone = 1; + int32_t max_index = 1024; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + H5C_auto_size_ctl_t auto_size_ctl = + { + /* int32_t version = */ H5C__CURR_AUTO_SIZE_CTL_VER, +#if 1 + /* H5C_auto_resize_report_fcn rpt_fcn = */ NULL, +#else + /* H5C_auto_resize_report_fcn rpt_fcn = */ H5C_def_auto_resize_rpt_fcn, +#endif + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (2 * 1024 * 1024), + + /* double min_clean_fraction = */ 0.1, + + /* size_t max_size = */ (32 * 1024 * 1025), + /* size_t min_size = */ (512 * 1024), + + /* int64_t epoch_length = */ 50000, + + + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + + /* double lower_hr_threshold = */ 0.75, + + /* double increment = */ 2.0, + + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + + + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__threshold, + + /* double upper_hr_threshold = */ 0.995, + + /* double decrement = */ 0.9, + + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + + /* int32_t epochs_before_eviction = */ 3, + + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.05 + }; + + TESTING("smoke check #6 -- ~1/2 dirty, ins, prot, unprot, AR cache 1"); + + core_file_driver_failed = FALSE; + + pass = TRUE; + + switch ( express_test ) + { + case 0: + max_index = (10 * 1024) - 1; + break; + + case 1: + max_index = (1 * 1024) - 1; + break; + + case 2: + max_index = (512) - 1; + break; + + default: + SKIPPED(); + HDfprintf(stdout, " Long tests disabled.\n"); + return 0; /* <========== note return */ + break; + } + + if ( show_progress ) /* 1 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + reset_entries(); + + if ( show_progress ) /* 2 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + file_ptr = setup_cache((size_t)(2 * 1024), + (size_t)(1 * 1024)); + cache_ptr = file_ptr->shared->cache; + + if ( pass ) { + + result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 1.\n"; + } + } + + if ( show_progress ) /* 3 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + hl_row_major_scan_forward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ FALSE, + /* do_inserts */ FALSE, + /* dirty_inserts */ dirty_inserts); + + if ( show_progress ) /* 4 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + hl_row_major_scan_backward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ FALSE, + /* do_inserts */ FALSE, + /* dirty_inserts */ dirty_inserts); + + if ( show_progress ) /* 5 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + hl_row_major_scan_forward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ FALSE, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts); + + if ( show_progress ) /* 6 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* flush and destroy all entries in the cache: */ + + flush_cache(/* file_ptr */ file_ptr, + /* destroy_entries */ TRUE, + /* dump_stats */ FALSE, + /* dump_detailed_stats */ FALSE); + + if ( show_progress ) /* 7 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + hl_col_major_scan_forward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ FALSE, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts, + /* dirty_unprotects */ dirty_unprotects); + + if ( show_progress ) /* 8 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* flush all entries in the cache: */ + + flush_cache(/* file_ptr */ file_ptr, + /* destroy_entries */ FALSE, + /* dump_stats */ FALSE, + /* dump_detailed_stats */ FALSE); + + if ( show_progress ) /* 9 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + hl_col_major_scan_backward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ FALSE, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts, + /* dirty_unprotects */ dirty_unprotects); + + if ( show_progress ) /* 10 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + takedown_cache(file_ptr, display_stats, TRUE); + + if ( show_progress ) /* 11 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + verify_clean(); + verify_unprotected(); + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + if ( core_file_driver_failed ) { + + HDfprintf(stdout, + "%s(): Unable to open test file with core file driver.\n", + fcn_name); + } + + return !pass; + +} /* smoke_check_6() */ + + +/*------------------------------------------------------------------------- + * Function: smoke_check_7() + * + * Purpose: A basic functional test on a cache with automatic cache + * resizing enabled, with inserts in the mix, along with + * repeated protects and unprotects. All entries are marked + * as clean. + * + * Return: void + * + * Programmer: John Mainzer + * 12/2/04 + * + * Modifications: + * + * JRM -- 1/18/05 + * Added code to skip this test if the skip_long_tests global + * is true. + * + *------------------------------------------------------------------------- + */ + +static unsigned +smoke_check_7(void) +{ + const char * fcn_name = "smoke_check_7"; + herr_t result; + hbool_t show_progress = FALSE; + hbool_t dirty_inserts = FALSE; + int dirty_unprotects = FALSE; + hbool_t display_stats = FALSE; + int mile_stone = 1; + int32_t max_index = 1024; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + H5C_auto_size_ctl_t auto_size_ctl = + { + /* int32_t version = */ H5C__CURR_AUTO_SIZE_CTL_VER, +#if 1 + /* H5C_auto_resize_report_fcn rpt_fcn = */ NULL, +#else + /* H5C_auto_resize_report_fcn rpt_fcn = */ H5C_def_auto_resize_rpt_fcn, +#endif + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (2 * 1024 * 1024), + + /* double min_clean_fraction = */ 0.1, + + /* size_t max_size = */ (32 * 1024 * 1025), + /* size_t min_size = */ (512 * 1024), + + /* int64_t epoch_length = */ 100000, + + + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + + /* double lower_hr_threshold = */ 0.75, + + /* double increment = */ 2.0, + + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (8 * 1024 * 1024), + + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + + + /* enum H5C_cache_decr_mode decr_mode = */ + H5C_decr__age_out_with_threshold, + + /* double upper_hr_threshold = */ 0.995, + + /* double decrement = */ 0.9, + + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + + /* int32_t epochs_before_eviction = */ 3, + + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1 + }; + + TESTING("smoke check #7 -- all clean, ins, prot, unprot, AR cache 2"); + + core_file_driver_failed = FALSE; + + switch ( express_test ) + { + case 0: + max_index = (10 * 1024) - 1; + break; + + case 1: + max_index = (1 * 1024) - 1; + break; + + case 2: + max_index = (512) - 1; + break; + + default: + SKIPPED(); + HDfprintf(stdout, " Long tests disabled.\n"); + return 0; /* <========== note return */ + break; + } + + pass = TRUE; + + if ( show_progress ) /* 1 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + reset_entries(); + + if ( show_progress ) /* 2 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + file_ptr = setup_cache((size_t)(2 * 1024), + (size_t)(1 * 1024)); + cache_ptr = file_ptr->shared->cache; + + if ( pass ) { + + result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 1.\n"; + } + } + + if ( show_progress ) /* 3 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + hl_row_major_scan_forward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ FALSE, + /* do_inserts */ FALSE, + /* dirty_inserts */ dirty_inserts); + + if ( show_progress ) /* 4 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + hl_row_major_scan_backward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ FALSE, + /* do_inserts */ FALSE, + /* dirty_inserts */ dirty_inserts); + + if ( show_progress ) /* 5 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + hl_row_major_scan_forward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ FALSE, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts); + + if ( show_progress ) /* 6 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* flush and destroy all entries in the cache: */ + + flush_cache(/* file_ptr */ file_ptr, + /* destroy_entries */ TRUE, + /* dump_stats */ FALSE, + /* dump_detailed_stats */ FALSE); + + if ( show_progress ) /* 7 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + hl_col_major_scan_forward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ FALSE, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts, + /* dirty_unprotects */ dirty_unprotects); + + if ( show_progress ) /* 8 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* flush all entries in the cache: */ + + flush_cache(/* file_ptr */ file_ptr, + /* destroy_entries */ FALSE, + /* dump_stats */ FALSE, + /* dump_detailed_stats */ FALSE); + + if ( show_progress ) /* 9 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + hl_col_major_scan_backward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ FALSE, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts, + /* dirty_unprotects */ dirty_unprotects); + + if ( show_progress ) /* 10 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + takedown_cache(file_ptr, display_stats, TRUE); + + if ( show_progress ) /* 11 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + verify_clean(); + verify_unprotected(); + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + if ( core_file_driver_failed ) { + + HDfprintf(stdout, + "%s(): Unable to open test file with core file driver.\n", + fcn_name); + } + + return !pass; + +} /* smoke_check_7() */ + + +/*------------------------------------------------------------------------- + * Function: smoke_check_8() + * + * Purpose: A basic functional test on a cache with automatic cache + * resizing enabled, with inserts in the mix, along with + * repeated protects and unprotects. About one half of all + * entries are marked as dirty. + * + * Return: void + * + * Programmer: John Mainzer + * 10/25/04 + * + * Modifications: + * + * JRM -- 1/18/05 + * Added code to skip this test if the skip_long_tests global + * is true. + * + *------------------------------------------------------------------------- + */ + +static unsigned +smoke_check_8(void) +{ + const char * fcn_name = "smoke_check_8"; + herr_t result; + hbool_t show_progress = FALSE; + hbool_t dirty_inserts = TRUE; + int dirty_unprotects = FALSE; + hbool_t display_stats = FALSE; + int mile_stone = 1; + int32_t max_index = 1024; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + H5C_auto_size_ctl_t auto_size_ctl = + { + /* int32_t version = */ H5C__CURR_AUTO_SIZE_CTL_VER, +#if 1 + /* H5C_auto_resize_report_fcn rpt_fcn = */ NULL, +#else + /* H5C_auto_resize_report_fcn rpt_fcn = */ H5C_def_auto_resize_rpt_fcn, +#endif + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (2 * 1024 * 1024), + + /* double min_clean_fraction = */ 0.1, + + /* size_t max_size = */ (32 * 1024 * 1025), + /* size_t min_size = */ (512 * 1024), + + /* int64_t epoch_length = */ 100000, + + + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + + /* double lower_hr_threshold = */ 0.75, + + /* double increment = */ 2.0, + + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + + + /* enum H5C_cache_decr_mode decr_mode = */ + H5C_decr__age_out_with_threshold, + + /* double upper_hr_threshold = */ 0.995, + + /* double decrement = */ 0.9, + + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + + /* int32_t epochs_before_eviction = */ 3, + + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1 + }; + + TESTING("smoke check #8 -- ~1/2 dirty, ins, prot, unprot, AR cache 2"); + + core_file_driver_failed = FALSE; + + switch ( express_test ) + { + case 0: + max_index = (10 * 1024) - 1; + break; + + case 1: + max_index = (1 * 1024) - 1; + break; + + case 2: + max_index = (512) - 1; + break; + + default: + SKIPPED(); + HDfprintf(stdout, " Long tests disabled.\n"); + return 0; /* <========== note return */ + break; + } + + pass = TRUE; + + if ( show_progress ) /* 1 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + reset_entries(); + + if ( show_progress ) /* 2 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + file_ptr = setup_cache((size_t)(2 * 1024), + (size_t)(1 * 1024)); + cache_ptr = file_ptr->shared->cache; + + if ( pass ) { + + result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 1.\n"; + } + } + + if ( show_progress ) /* 3 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + hl_row_major_scan_forward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ FALSE, + /* do_inserts */ FALSE, + /* dirty_inserts */ dirty_inserts); + + if ( show_progress ) /* 4 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + hl_row_major_scan_backward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ FALSE, + /* do_inserts */ FALSE, + /* dirty_inserts */ dirty_inserts); + + if ( show_progress ) /* 5 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + hl_row_major_scan_forward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ FALSE, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts); + + if ( show_progress ) /* 6 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* flush and destroy all entries in the cache: */ + + flush_cache(/* file_ptr */ file_ptr, + /* destroy_entries */ TRUE, + /* dump_stats */ FALSE, + /* dump_detailed_stats */ FALSE); + + if ( show_progress ) /* 7 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + hl_col_major_scan_forward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ FALSE, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts, + /* dirty_unprotects */ dirty_unprotects); + + if ( show_progress ) /* 8 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* flush all entries in the cache: */ + + flush_cache(/* file_ptr */ file_ptr, + /* destroy_entries */ FALSE, + /* dump_stats */ FALSE, + /* dump_detailed_stats */ FALSE); + + if ( show_progress ) /* 9 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + hl_col_major_scan_backward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ FALSE, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts, + /* dirty_unprotects */ dirty_unprotects); + + if ( show_progress ) /* 10 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + takedown_cache(file_ptr, display_stats, TRUE); + + if ( show_progress ) /* 11 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + verify_clean(); + verify_unprotected(); + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + if ( core_file_driver_failed ) { + + HDfprintf(stdout, + "%s(): Unable to open test file with core file driver.\n", + fcn_name); + } + + return !pass; + +} /* smoke_check_8() */ + + +/*------------------------------------------------------------------------- + * Function: smoke_check_9() + * + * Purpose: A repeat of smoke check 1, only with the cache corked + * part of the time. + * + * Recall that smoke check 1 is a basic functional test, + * with inserts, destroys, and renames in the mix, along + * with repeated protects and unprotects. All entries are + * marked as clean. + * + * Return: void + * + * Programmer: John Mainzer + * 8/1/07 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +static unsigned +smoke_check_9(void) +{ + const char * fcn_name = "smoke_check_9"; + herr_t result; + hbool_t show_progress = FALSE; + hbool_t dirty_inserts = FALSE; + int dirty_unprotects = FALSE; + int dirty_destroys = FALSE; + hbool_t display_stats = FALSE; + hbool_t display_detailed_stats = FALSE; + int32_t max_index = (10 * 1024) - 1; + int32_t lag = 10; + int mile_stone = 1; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + + TESTING("smoke check #9 -- all clean, ins, dest, ren, 4/2 MB, corked"); + + core_file_driver_failed = FALSE; + + switch ( express_test ) + { + case 0: + max_index = (10 * 1024) - 1; + break; + + case 1: + max_index = (1 * 1024) - 1; + break; + + case 2: + max_index = (512) - 1; + break; + + default: + SKIPPED(); + HDfprintf(stdout, " Long tests disabled.\n"); + return 0; /* <========== note return */ + break; + } + + pass = TRUE; + + if ( show_progress ) /* 1 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + reset_entries(); + + if ( show_progress ) /* 2 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + file_ptr = setup_cache((size_t)(4 * 1024 * 1024), + (size_t)(2 * 1024 * 1024)); + cache_ptr = file_ptr->shared->cache; + + /* disable evictions */ + + if ( show_progress ) /* 3 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + if ( pass ) { + + result = H5C_set_evictions_enabled(cache_ptr, FALSE); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "can't disable evictions 1.\n"; + } + } + + if ( show_progress ) /* 4 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions disabled\n", + fcn_name, mile_stone++, (int)pass); + + row_major_scan_forward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ display_detailed_stats, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts, + /* do_renames */ TRUE, + /* rename_to_main_addr */ FALSE, + /* do_destroys */ TRUE, + /* do_mult_ro_protects */ TRUE, + /* dirty_destroys */ dirty_destroys, + /* dirty_unprotects */ dirty_unprotects); + + /* enable evictions */ + + if ( show_progress ) /* 5 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + if ( pass ) { + + result = H5C_set_evictions_enabled(cache_ptr, TRUE); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "can't enable evictions 1.\n"; + } + } + + if ( show_progress ) /* 6 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions enabled \n", + fcn_name, mile_stone++, (int)pass); + + row_major_scan_backward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ display_detailed_stats, + /* do_inserts */ FALSE, + /* dirty_inserts */ dirty_inserts, + /* do_renames */ TRUE, + /* rename_to_main_addr */ TRUE, + /* do_destroys */ FALSE, + /* do_mult_ro_protects */ TRUE, + /* dirty_destroys */ dirty_destroys, + /* dirty_unprotects */ dirty_unprotects); + + if ( show_progress ) /* 7 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + if ( pass ) { + + result = H5C_set_evictions_enabled(cache_ptr, FALSE); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "can't disable evictions 2.\n"; + } + } + + if ( show_progress ) /* 8 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions disabled \n", + fcn_name, mile_stone++, (int)pass); + + row_major_scan_forward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ display_detailed_stats, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts, + /* do_renames */ TRUE, + /* rename_to_main_addr */ FALSE, + /* do_destroys */ FALSE, + /* do_mult_ro_protects */ TRUE, + /* dirty_destroys */ dirty_destroys, + /* dirty_unprotects */ dirty_unprotects); + + if ( show_progress ) /* 9 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + if ( pass ) { + + result = H5C_set_evictions_enabled(cache_ptr, TRUE); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "can't enable evictions 2.\n"; + } + } + + if ( show_progress ) /* 10 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions enabled \n", + fcn_name, mile_stone++, (int)pass); + + /* flush and destroy all entries in the cache: */ + + flush_cache(/* file_ptr */ file_ptr, + /* destroy_entries */ TRUE, + /* dump_stats */ FALSE, + /* dump_detailed_stats */ FALSE); + + if ( show_progress ) /* 11 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + if ( pass ) { + + result = H5C_set_evictions_enabled(cache_ptr, FALSE); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "can't disable evictions 3.\n"; + } + } + + if ( show_progress ) /* 12 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions disabled\n", + fcn_name, mile_stone++, (int)pass); + + col_major_scan_forward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ display_detailed_stats, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts, + /* dirty_unprotects */ dirty_unprotects); + + if ( show_progress ) /* 13 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* flush all entries in the cache: */ + + flush_cache(/* file_ptr */ file_ptr, + /* destroy_entries */ FALSE, + /* dump_stats */ FALSE, + /* dump_detailed_stats */ FALSE); + + if ( show_progress ) /* 14 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + if ( pass ) { + + result = H5C_set_evictions_enabled(cache_ptr, TRUE); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "can't enable evictions 3.\n"; + } + } + + if ( show_progress ) /* 15 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions enabled\n", + fcn_name, mile_stone++, (int)pass); + + col_major_scan_backward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ display_detailed_stats, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts, + /* dirty_unprotects */ dirty_unprotects); + + if ( show_progress ) /* 16 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + if ( pass ) { + + result = H5C_set_evictions_enabled(cache_ptr, FALSE); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "can't disable evictions 4.\n"; + } + } + + + if ( show_progress ) /* 17 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions disabled\n", + fcn_name, mile_stone++, (int)pass); + + takedown_cache(file_ptr, display_stats, TRUE); + + if ( show_progress ) /* 18 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + verify_clean(); + verify_unprotected(); + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + if ( core_file_driver_failed ) { + + HDfprintf(stdout, + "%s(): Unable to open test file with core file driver.\n", + fcn_name); + } + + return !pass; + +} /* smoke_check_9() */ + + +/*------------------------------------------------------------------------- + * Function: smoke_check_10() + * + * Purpose: A repeat of smoke check 2, only with the cache corked + * part of the time. + * + * Recall that smoke check 2 is a basic functional test, + * with inserts, destroys, and renames in the mix, along + * with some repeated protects and unprotects. About half + * the entries are marked as dirty. + * + * Return: void + * + * Programmer: John Mainzer + * 8/1/07 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +static unsigned +smoke_check_10(void) +{ + const char * fcn_name = "smoke_check_10"; + herr_t result; + hbool_t show_progress = FALSE; + hbool_t dirty_inserts = TRUE; + int dirty_unprotects = TRUE; + int dirty_destroys = TRUE; + hbool_t display_stats = FALSE; + hbool_t display_detailed_stats = FALSE; + int32_t max_index = (10 * 1024) - 1; + int32_t lag = 10; + int mile_stone = 1; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + + TESTING("smoke check #10 -- ~1/2 dirty, ins, dest, ren, 4/2 MB, corked"); + + core_file_driver_failed = FALSE; + + switch ( express_test ) + { + case 0: + max_index = (10 * 1024) - 1; + break; + + case 1: + max_index = (1 * 1024) - 1; + break; + + case 2: + max_index = (512) - 1; + break; + + default: + SKIPPED(); + HDfprintf(stdout, " Long tests disabled.\n"); + return 0; /* <========== note return */ + break; + } + + pass = TRUE; + + if ( show_progress ) /* 1 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + reset_entries(); + + if ( show_progress ) /* 2 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + file_ptr = setup_cache((size_t)(4 * 1024 * 1024), + (size_t)(2 * 1024 * 1024)); + cache_ptr = file_ptr->shared->cache; + + if ( show_progress ) /* 3 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions enabled\n", + fcn_name, mile_stone++, (int)pass); + + row_major_scan_forward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ display_detailed_stats, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts, + /* do_renames */ TRUE, + /* rename_to_main_addr */ FALSE, + /* do_destroys */ TRUE, + /* do_mult_ro_protects */ TRUE, + /* dirty_destroys */ dirty_destroys, + /* dirty_unprotects */ dirty_unprotects); + + if ( show_progress ) /* 4 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + if ( pass ) { + + result = H5C_set_evictions_enabled(cache_ptr, FALSE); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "can't disable evictions 1.\n"; + } + } + + if ( show_progress ) /* 5 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions disabled\n", + fcn_name, mile_stone++, (int)pass); + + row_major_scan_backward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ display_detailed_stats, + /* do_inserts */ FALSE, + /* dirty_inserts */ dirty_inserts, + /* do_renames */ TRUE, + /* rename_to_main_addr */ TRUE, + /* do_destroys */ FALSE, + /* do_mult_ro_protects */ TRUE, + /* dirty_destroys */ dirty_destroys, + /* dirty_unprotects */ dirty_unprotects); + + if ( show_progress ) /* 6 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + if ( pass ) { + + result = H5C_set_evictions_enabled(cache_ptr, TRUE); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "can't enable evictions 1.\n"; + } + } + + if ( show_progress ) /* 7 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions enabled\n", + fcn_name, mile_stone++, (int)pass); + + row_major_scan_forward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ display_detailed_stats, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts, + /* do_renames */ TRUE, + /* rename_to_main_addr */ FALSE, + /* do_destroys */ FALSE, + /* do_mult_ro_protects */ TRUE, + /* dirty_destroys */ dirty_destroys, + /* dirty_unprotects */ dirty_unprotects); + + if ( show_progress ) /* 8 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + if ( pass ) { + + result = H5C_set_evictions_enabled(cache_ptr, FALSE); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "can't disable evictions 2.\n"; + } + } + + if ( show_progress ) /* 9 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions disabled\n", + fcn_name, mile_stone++, (int)pass); + + /* flush and destroy all entries in the cache: */ + + flush_cache(/* file_ptr */ file_ptr, + /* destroy_entries */ TRUE, + /* dump_stats */ FALSE, + /* dump_detailed_stats */ FALSE); + + if ( show_progress ) /* 10 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + if ( pass ) { + + result = H5C_set_evictions_enabled(cache_ptr, TRUE); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "can't enable evictions 2.\n"; + } + } + + if ( show_progress ) /* 11 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions enabled\n", + fcn_name, mile_stone++, (int)pass); + + col_major_scan_forward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ display_detailed_stats, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts, + /* dirty_unprotects */ dirty_unprotects); + + if ( show_progress ) /* 12 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + if ( pass ) { + + result = H5C_set_evictions_enabled(cache_ptr, FALSE); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "can't disable evictions 3.\n"; + } + } + + if ( show_progress ) /* 13 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions disabled\n", + fcn_name, mile_stone++, (int)pass); + + /* flush all entries in the cache: */ + + flush_cache(/* file_ptr */ file_ptr, + /* destroy_entries */ FALSE, + /* dump_stats */ FALSE, + /* dump_detailed_stats */ FALSE); + + if ( show_progress ) /* 14 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + if ( pass ) { + + result = H5C_set_evictions_enabled(cache_ptr, TRUE); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "can't enable evictions 3.\n"; + } + } + + if ( show_progress ) /* 15 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions enabled\n", + fcn_name, mile_stone++, (int)pass); + + col_major_scan_backward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ display_detailed_stats, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts, + /* dirty_unprotects */ dirty_unprotects); + + if ( show_progress ) /* 16 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + if ( pass ) { + + result = H5C_set_evictions_enabled(cache_ptr, FALSE); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "can't disable evictions 4.\n"; + } + } + + if ( show_progress ) /* 17 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions disabled\n", + fcn_name, mile_stone++, (int)pass); + + takedown_cache(file_ptr, display_stats, TRUE); + + if ( show_progress ) /* 18 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + verify_clean(); + verify_unprotected(); + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + if ( core_file_driver_failed ) { + + HDfprintf(stdout, + "%s(): Unable to open test file with core file driver.\n", + fcn_name); + } + + return !pass; + +} /* smoke_check_10() */ + + +/*------------------------------------------------------------------------- + * Function: write_permitted_check() + * + * Purpose: A basic test of the write permitted function. In essence, + * we load the cache up with dirty entryies, set + * write_permitted to FALSE, and then protect a bunch of + * entries. If there are any writes while write_permitted is + * FALSE, the test will fail. + * + * Return: void + * + * Programmer: John Mainzer + * 6/24/04 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +static unsigned +write_permitted_check(void) +{ + +#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS + + const char * fcn_name = "write_permitted_check"; + hbool_t show_progress = FALSE; + hbool_t display_stats = FALSE; + int32_t max_index = (10 * 1024) - 1; + int32_t lag = 10; + int mile_stone = 1; + H5F_t * file_ptr = NULL; + +#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ + + TESTING("write permitted check -- 1/0 MB cache"); + + core_file_driver_failed = FALSE; + +#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS + + switch ( express_test ) + { + case 0: + max_index = (10 * 1024) - 1; + break; + + case 1: + max_index = (1 * 1024) - 1; + break; + + case 2: + max_index = (512) - 1; + break; + + default: + SKIPPED(); + HDfprintf(stdout, " Long tests disabled.\n"); + return 0; /* <========== note return */ + break; + } + + pass = TRUE; + + if ( show_progress ) /* 1 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + reset_entries(); + + if ( show_progress ) /* 2 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + file_ptr = setup_cache((size_t)(1 * 1024 * 1024), + (size_t)(0)); + + if ( show_progress ) /* 3 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + row_major_scan_forward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ TRUE, + /* do_inserts */ TRUE, + /* dirty_inserts */ TRUE, + /* do_renames */ TRUE, + /* rename_to_main_addr */ FALSE, + /* do_destroys */ TRUE, + /* do_mult_ro_protects */ TRUE, + /* dirty_destroys */ TRUE, + /* dirty_unprotects */ TRUE); + + if ( show_progress ) /* 4 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + write_permitted = FALSE; + + row_major_scan_backward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ TRUE, + /* do_inserts */ FALSE, + /* dirty_inserts */ FALSE, + /* do_renames */ TRUE, + /* rename_to_main_addr */ TRUE, + /* do_destroys */ FALSE, + /* do_mult_ro_protects */ TRUE, + /* dirty_destroys */ FALSE, + /* dirty_unprotects */ NO_CHANGE); + + if ( show_progress ) /* 5 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + write_permitted = TRUE; + + row_major_scan_forward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ TRUE, + /* do_inserts */ TRUE, + /* dirty_inserts */ TRUE, + /* do_renames */ TRUE, + /* rename_to_main_addr */ FALSE, + /* do_destroys */ FALSE, + /* do_mult_ro_protects */ TRUE, + /* dirty_destroys */ TRUE, + /* dirty_unprotects */ TRUE); + + if ( show_progress ) /* 6 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* flush and destroy all entries in the cache: */ + + flush_cache(/* file_ptr */ file_ptr, + /* destroy_entries */ TRUE, + /* dump_stats */ FALSE, + /* dump_detailed_stats */ FALSE); + + if ( show_progress ) /* 7 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + col_major_scan_forward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ TRUE, + /* do_inserts */ TRUE, + /* dirty_inserts */ TRUE, + /* dirty_unprotects */ TRUE); + + if ( show_progress ) /* 8 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + write_permitted = FALSE; + + col_major_scan_backward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ FALSE, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ TRUE, + /* do_inserts */ FALSE, + /* dirty_inserts */ FALSE, + /* dirty_unprotects */ NO_CHANGE); + + write_permitted = TRUE; + + if ( show_progress ) /* 9 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + takedown_cache(file_ptr, display_stats, TRUE); + + if ( show_progress ) /* 10 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + verify_clean(); + verify_unprotected(); + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + if ( core_file_driver_failed ) { + + HDfprintf(stdout, + "%s(): Unable to open test file with core file driver.\n", + fcn_name); + } + +#else /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ + + SKIPPED(); + + HDfprintf(stdout, " Clean and dirty LRU lists disabled.\n"); + +#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ + + return !pass; + +} /* write_permitted_check() */ + + +/*------------------------------------------------------------------------- + * Function: check_insert_entry() + * + * Purpose: Verify that H5C_insert_entry behaves as expected. + * Test the behaviour with different flags. + * + * This test was added primarily to test basic insert + * pinned entry functionallity, but I through in explicit + * tests for other functionallity that is tested implicitly + * elsewhere. + * + * Return: void + * + * Programmer: John Mainzer + * 8/10/06 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +static unsigned +check_insert_entry(void) +{ + const char * fcn_name = "check_insert_entry"; + int entry_type = PICO_ENTRY_TYPE; + int i; + int point = 0; + int subpoint = 0; + herr_t result; + hbool_t in_cache; + hbool_t is_dirty; + hbool_t is_protected; + hbool_t is_pinned; + hbool_t show_progress = FALSE; + size_t entry_size; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + test_entry_t * base_addr; + test_entry_t * entry_ptr; + struct H5C_cache_entry_t * search_ptr; + + + TESTING("H5C_insert_entry() functionality"); + + core_file_driver_failed = FALSE; + + pass = TRUE; + + if ( show_progress ) { + HDfprintf(stdout, "%s: point = %d\n", fcn_name, point++); /* 0 */ + } + + /* Allocate a cache, and insert entries into it using all + * combinations of flags. Verify that the entries are inserted, + * and that the flags have the desired effects. + * + * Note that the dirty parameter in insert_entry is no longer + * used, as we have decided that all inserted entries are + * dirty by definition. (Which sounds very reasonable, but didn't + * used to be the case.) + */ + + if ( pass ) { + + reset_entries(); + + file_ptr = setup_cache((size_t)(2 * 1024 * 1024), + (size_t)(1 * 1024 * 1024)); + cache_ptr = file_ptr->shared->cache; + } + + if ( show_progress ) { + HDfprintf(stdout, "%s: point = %d\n", fcn_name, point++); /* 1 */ + } + + if ( pass ) { + + insert_entry(file_ptr, entry_type, 0, TRUE, H5C__NO_FLAGS_SET); + insert_entry(file_ptr, entry_type, 1, TRUE, + H5C__SET_FLUSH_MARKER_FLAG); + insert_entry(file_ptr, entry_type, 2, TRUE, H5C__PIN_ENTRY_FLAG); + insert_entry(file_ptr, entry_type, 3, TRUE, + (H5C__SET_FLUSH_MARKER_FLAG | H5C__PIN_ENTRY_FLAG)); + } + + if ( show_progress ) { + HDfprintf(stdout, "%s: point = %d\n", fcn_name, point++); /* 2 */ + } + + /* Verify that the entries are inserted as desired. */ + + i = 0; + base_addr = entries[0]; + while ( ( pass ) && ( i < 4 ) ) + { + subpoint = 0; + + entry_ptr = &(base_addr[i]); + + /* Start by checking everything we can via H5C_get_entry_status() */ + + if ( show_progress ) { + HDfprintf(stdout, "%s:%d point = %d.%d\n", + fcn_name, i, point, subpoint++); + } + + result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size, + &in_cache, &is_dirty, &is_protected, + &is_pinned); + + if ( show_progress ) { + HDfprintf(stdout, "%s:%d point = %d.%d\n", + fcn_name, i, point, subpoint++); + } + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "H5C_get_entry_status() reports failure."; + } + + if ( show_progress ) { + HDfprintf(stdout, "%s:%d point = %d.%d\n", + fcn_name, i, point, subpoint++); + } + + if ( pass ) { + + /* check the universals */ + if ( ( ! in_cache ) || ( ! is_dirty ) || ( is_protected ) || + ( entry_size != entry_sizes[entry_type] ) ) { + + pass = FALSE; + failure_mssg = "Unexpected insert results 1."; + } + } + + if ( show_progress ) { + HDfprintf(stdout, "%s:%d point = %d.%d\n", + fcn_name, i, point, subpoint++); + } + + if ( pass ) { + + /* verify that the pinned flag got set correctly */ + if ( ( i == 2 ) || ( i == 3 ) ) { + + if ( ! is_pinned ) { + + pass = FALSE; + failure_mssg = "Unexpected insert results 2."; + } + } else if ( is_pinned ) { + + pass = FALSE; + failure_mssg = "Unexpected insert results 3."; + + } else if ( is_pinned != ((entry_ptr->header).is_pinned) ) { + + pass = FALSE; + failure_mssg = "Unexpected insert results 4."; + } + } + + if ( show_progress ) { + HDfprintf(stdout, "%s:%d point = %d.%d\n", + fcn_name, i, point, subpoint++); + } + + /* Thats all we can get from H5C_get_entry_status(). + * Now start looking at the cache data structures directly. + */ + + if ( pass ) { + + /* Verify that the flush marker got set correctly */ + if ( ( i == 1 ) || ( i == 3 ) ) { + + if ( ! ((entry_ptr->header).flush_marker) ) { + + pass = FALSE; + failure_mssg = "Unexpected insert results 5."; + } + } else if ( (entry_ptr->header).flush_marker ) { + + pass = FALSE; + failure_mssg = "Unexpected insert results 6."; + } + } + + if ( show_progress ) { + HDfprintf(stdout, "%s:%d point = %d.%d\n", + fcn_name, i, point, subpoint++); + } + + if ( pass ) { + + /* Verify that pinned entries are in the pinned entry list */ + if ( (entry_ptr->header).is_pinned ) { + + search_ptr = cache_ptr->pel_head_ptr; + + while ( ( search_ptr != NULL ) && + ( search_ptr != + (struct H5C_cache_entry_t *)entry_ptr ) ) + { + search_ptr = search_ptr->next; + } + + if ( search_ptr == NULL ) { + + pass = FALSE; + failure_mssg = "Unexpected insert results 7."; + } + } + } + + if ( show_progress ) { + HDfprintf(stdout, "%s:%d point = %d.%d\n", + fcn_name, i, point, subpoint++); + } + + if ( pass ) { + + /* Verify that unpinned entries are in the LRU list */ + if ( ! ((entry_ptr->header).is_pinned) ) { + + search_ptr = cache_ptr->LRU_head_ptr; + + while ( ( search_ptr != NULL ) && + ( search_ptr != + (struct H5C_cache_entry_t *)entry_ptr ) ) + { + search_ptr = search_ptr->next; + } + + if ( search_ptr == NULL ) { + + pass = FALSE; + failure_mssg = "Unexpected insert results 8."; + } + } + } + + if ( show_progress ) { + HDfprintf(stdout, "%s:%d point = %d.%d\n", + fcn_name, i, point, subpoint++); + } + +#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS + if ( pass ) { + + /* Verify that unpinned entries are in the dirty LRU list */ + if ( ! ((entry_ptr->header).is_pinned) ) { + + search_ptr = cache_ptr->dLRU_head_ptr; + + while ( ( search_ptr != NULL ) && + ( search_ptr != + (struct H5C_cache_entry_t *)entry_ptr ) ) + { + search_ptr = search_ptr->aux_next; + } + + if ( search_ptr == NULL ) { + + pass = FALSE; + failure_mssg = "Unexpected insert results 9."; + } + } + } +#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ + + if ( show_progress ) { + HDfprintf(stdout, "%s:%d point = %d.%d\n", + fcn_name, i, point, subpoint++); + } + + i++; + + } /* while */ + + if ( show_progress ) { + point++; + HDfprintf(stdout, "%s: point = %d\n", fcn_name, point++); + } + + /* So much for looking at the individual entries. Now verify + * that the various counts and sized in the cache header are + * as expected. + */ + + if ( pass ) { + + if ( ( cache_ptr->index_len != 4 ) || + ( cache_ptr->index_size != 4 * entry_sizes[entry_type] ) || + ( cache_ptr->slist_len != 4 ) || + ( cache_ptr->slist_size != 4 * entry_sizes[entry_type] ) || + ( cache_ptr->pl_len != 0 ) || + ( cache_ptr->pl_size != (size_t)0 ) || + ( cache_ptr->pel_len != 2 ) || + ( cache_ptr->pel_size != 2 * entry_sizes[entry_type] ) || + ( cache_ptr->LRU_list_len != 2 ) || + ( cache_ptr->LRU_list_size != 2 * entry_sizes[entry_type] ) || +#if H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS + ( cache_ptr->dLRU_list_len != 2 ) || + ( cache_ptr->dLRU_list_size != 2 * entry_sizes[entry_type] ) || +#endif /* H5C_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ + ( cache_ptr->cLRU_list_len != 0 ) || + ( cache_ptr->cLRU_list_size != (size_t)0 ) ) { + + pass = FALSE; + failure_mssg = "Unexpected insert results 10."; + } + } + + if ( show_progress ) { + HDfprintf(stdout, "%s: point = %d\n", fcn_name, point++); + } + + /* Finally, if stats collection is enabled, verify that the expected + * stats are collected. + */ +#if H5C_COLLECT_CACHE_STATS + if ( pass ) { + + if ( ( cache_ptr->insertions[entry_type] != 4 ) || + ( cache_ptr->pinned_insertions[entry_type] != 2 ) || + ( cache_ptr->pins[entry_type] != 2 ) || + ( cache_ptr->unpins[entry_type] != 0 ) || + ( cache_ptr->dirty_pins[entry_type] != 0 ) || + ( cache_ptr->max_index_len != 4 ) || + ( cache_ptr->max_index_size != 4 * entry_sizes[entry_type] ) || + ( cache_ptr->max_slist_len != 4 ) || + ( cache_ptr->max_slist_size != 4 * entry_sizes[entry_type] ) || + ( cache_ptr->max_pl_len != 0 ) || + ( cache_ptr->max_pl_size != (size_t)0 ) || + ( cache_ptr->max_pel_len != 2 ) || + ( cache_ptr->max_pel_size != 2 * entry_sizes[entry_type] ) ) { + + pass = FALSE; + failure_mssg = "Unexpected insert results 11."; + } + } +#endif /* H5C_COLLECT_CACHE_STATS */ + + if ( show_progress ) { + HDfprintf(stdout, "%s: point = %d\n", fcn_name, point++); + } + + /* Unpin the pinned entries so we can take down the cache cleanly. */ + + if ( pass ) { + + unpin_entry(file_ptr, entry_type, 2); + unpin_entry(file_ptr, entry_type, 3); + } + + if ( show_progress ) { + HDfprintf(stdout, "%s: point = %d\n", fcn_name, point++); + } + + if ( pass ) { + + takedown_cache(file_ptr, FALSE, FALSE); + } + + if ( show_progress ) { + HDfprintf(stdout, "%s: point = %d\n", fcn_name, point++); + } + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + if ( core_file_driver_failed ) { + + HDfprintf(stdout, + "%s(): Unable to open test file with core file driver.\n", + fcn_name); + } + + return !pass; + +} /* check_insert_entry() */ + + +/*------------------------------------------------------------------------- + * Function: check_flush_cache() + * + * Purpose: Verify that flush_cache behaves as expected. In particular, + * test the behaviour with different flags. + * + * Return: void + * + * Programmer: John Mainzer + * 1/10/05 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +static unsigned +check_flush_cache(void) +{ + const char * fcn_name = "check_flush_cache"; + hbool_t show_progress = FALSE; + int mile_stone = 0; + H5F_t * file_ptr = NULL; + + TESTING("H5C_flush_cache() functionality"); + + core_file_driver_failed = FALSE; + + pass = TRUE; + + if ( show_progress ) { /* 0 */ + HDfprintf(stdout, "\n%s: mile_stone = %d.\n", fcn_name, mile_stone++); + } + + /* allocate a cache, and flush it under various circumstances. + * To the extent possible, verify that the desired actions took + * place. + */ + + if ( pass ) { + + reset_entries(); + + file_ptr = setup_cache((size_t)(2 * 1024 * 1024), + (size_t)(1 * 1024 * 1024)); + } + + if ( show_progress ) { /* 1 */ + HDfprintf(stdout, "%s: mile_stone = %d.\n", fcn_name, mile_stone++); + } + + /* first test behaviour on an empty cache. Can't do much sanity + * checking in this case, so simply check the return values. + */ + + if ( pass ) { + + check_flush_cache__empty_cache(file_ptr); + } + + if ( show_progress ) { /* 2 */ + HDfprintf(stdout, "%s: mile_stone = %d.\n", fcn_name, mile_stone++); + } + + /* now do a series of similar tests with a cache with a single entry. + * Start with a clean entry, with no flags set. + */ + + if ( pass ) { + + check_flush_cache__single_entry(file_ptr); + } + + if ( show_progress ) { /* 3 */ + HDfprintf(stdout, "%s: mile_stone = %d.\n", fcn_name, mile_stone++); + } + + if ( pass ) { + + check_flush_cache__multi_entry(file_ptr); + } + + if ( show_progress ) { /* 4 */ + HDfprintf(stdout, "%s: mile_stone = %d.\n", fcn_name, mile_stone++); + } + + if ( pass ) { + + check_flush_cache__flush_ops(file_ptr); + } + + if ( show_progress ) { /* 5 */ + HDfprintf(stdout, "%s: mile_stone = %d.\n", fcn_name, mile_stone++); + } + + if ( pass ) { + + takedown_cache(file_ptr, FALSE, FALSE); + } + + if ( show_progress ) { /* 6 */ + HDfprintf(stdout, "%s: mile_stone = %d.\n", fcn_name, mile_stone++); + } + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + if ( core_file_driver_failed ) { + + HDfprintf(stdout, + "%s(): Unable to open test file with core file driver.\n", + fcn_name); + } + + return !pass; + +} /* check_flush_cache() */ + + +/*------------------------------------------------------------------------- + * Function: check_flush_cache__empty_cache() + * + * Purpose: Verify that flush_cache behaves as expected with an empty + * cache. + * + * Return: void + * + * Programmer: John Mainzer + * 1/12/05 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +static void +check_flush_cache__empty_cache(H5F_t * file_ptr) +{ + /* const char * fcn_name = "check_flush_cache__empty_cache"; */ + H5C_t * cache_ptr = file_ptr->shared->cache; + herr_t result; + + if ( cache_ptr == NULL ) { + + pass = FALSE; + failure_mssg = "cache_ptr NULL on entry to empty cache case."; + } + else if ( ( cache_ptr->index_len != 0 ) || + ( cache_ptr->index_size != 0 ) ) { + + pass = FALSE; + failure_mssg = "cache not empty at beginning of empty cache case."; + } + + + /* Test behaviour on an empty cache. Can't do much sanity + * checking in this case, so simply check the return values. + */ + + if ( pass ) { + + result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, + H5C__NO_FLAGS_SET); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "flush with flags = 0x00 failed on empty cache.\n"; + } + } + + if ( pass ) { + + result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, + H5C__FLUSH_INVALIDATE_FLAG); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "flush with flags = 0x04 failed on empty cache.\n"; + } + } + + if ( pass ) { + + result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, + H5C__FLUSH_CLEAR_ONLY_FLAG); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "flush with flags = 0x08 failed on empty cache.\n"; + } + } + + + if ( pass ) { + + result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, + H5C__FLUSH_MARKED_ENTRIES_FLAG); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "flush with flags = 0x10 failed on empty cache.\n"; + } + } + +} /* check_flush_cache__empty_cache() */ + + +/*------------------------------------------------------------------------- + * Function: check_flush_cache__multi_entry() + * + * Purpose: Verify that flush_cache behaves as expected when the cache + * contains multiple elements. + * + * Return: void + * + * Programmer: John Mainzer + * 1/14/05 + * + * Modifications: + * + * JRM -- 4/5/06 + * Added pinned entry tests. + * + *------------------------------------------------------------------------- + */ + +static void +check_flush_cache__multi_entry(H5F_t * file_ptr) +{ + /* const char * fcn_name = "check_flush_cache__multi_entry"; */ + H5C_t * cache_ptr = file_ptr->shared->cache; + + if ( cache_ptr == NULL ) { + + pass = FALSE; + failure_mssg = "cache_ptr NULL on entry to multi entry case."; + } + else if ( ( cache_ptr->index_len != 0 ) || + ( cache_ptr->index_size != 0 ) ) { + + pass = FALSE; + failure_mssg = "cache not empty at beginning of multi entry case."; + } + + if ( pass ) + { + int test_num = 1; + unsigned int flush_flags = H5C__NO_FLAGS_SET; + int spec_size = 8; + struct flush_cache_test_spec spec[8] = + { + { + /* entry_num = */ 0, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 100, + /* insert_flag = */ FALSE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 1, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 75, + /* insert_flag = */ FALSE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__NO_FLAGS_SET, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 2, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 25, + /* insert_flag = */ TRUE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 3, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 50, + /* insert_flag = */ TRUE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__NO_FLAGS_SET, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 4, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 10, + /* insert_flag = */ FALSE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 5, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 20, + /* insert_flag = */ FALSE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 6, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 30, + /* insert_flag = */ TRUE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 7, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 40, + /* insert_flag = */ TRUE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ FALSE + } + }; + + check_flush_cache__multi_entry_test(file_ptr, test_num, + flush_flags, spec_size, spec); + } + + + if ( pass ) + { + int test_num = 2; + unsigned int flush_flags = H5C__FLUSH_INVALIDATE_FLAG; + int spec_size = 8; + struct flush_cache_test_spec spec[8] = + { + { + /* entry_num = */ 0, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 100, + /* insert_flag = */ FALSE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 1, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 75, + /* insert_flag = */ FALSE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__NO_FLAGS_SET, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 2, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 25, + /* insert_flag = */ TRUE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 3, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 50, + /* insert_flag = */ TRUE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__NO_FLAGS_SET, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 4, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 10, + /* insert_flag = */ FALSE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 5, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 20, + /* insert_flag = */ FALSE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 6, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 30, + /* insert_flag = */ TRUE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 7, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 40, + /* insert_flag = */ TRUE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ TRUE + } + }; + + check_flush_cache__multi_entry_test(file_ptr, test_num, + flush_flags, spec_size, spec); + } + + + if ( pass ) + { + int test_num = 3; + unsigned int flush_flags = H5C__FLUSH_CLEAR_ONLY_FLAG; + int spec_size = 8; + struct flush_cache_test_spec spec[8] = + { + { + /* entry_num = */ 0, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 100, + /* insert_flag = */ FALSE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 1, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 75, + /* insert_flag = */ FALSE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__NO_FLAGS_SET, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ TRUE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 2, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 25, + /* insert_flag = */ TRUE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ TRUE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 3, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 50, + /* insert_flag = */ TRUE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__NO_FLAGS_SET, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ TRUE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 4, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 10, + /* insert_flag = */ FALSE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 5, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 20, + /* insert_flag = */ FALSE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ TRUE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 6, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 30, + /* insert_flag = */ TRUE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ TRUE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 7, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 40, + /* insert_flag = */ TRUE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ TRUE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ FALSE + } + }; + + check_flush_cache__multi_entry_test(file_ptr, test_num, + flush_flags, spec_size, spec); + } + + + if ( pass ) + { + int test_num = 4; + unsigned int flush_flags = H5C__FLUSH_MARKED_ENTRIES_FLAG; + int spec_size = 8; + struct flush_cache_test_spec spec[8] = + { + { + /* entry_num = */ 0, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 100, + /* insert_flag = */ FALSE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 1, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 75, + /* insert_flag = */ FALSE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__NO_FLAGS_SET, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 2, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 25, + /* insert_flag = */ TRUE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 3, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 50, + /* insert_flag = */ TRUE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__NO_FLAGS_SET, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 4, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 10, + /* insert_flag = */ FALSE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 5, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 20, + /* insert_flag = */ FALSE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 6, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 30, + /* insert_flag = */ TRUE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 7, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 40, + /* insert_flag = */ TRUE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ FALSE + } + }; + + check_flush_cache__multi_entry_test(file_ptr, test_num, + flush_flags, spec_size, spec); + } + + + if ( pass ) + { + int test_num = 5; + unsigned int flush_flags = H5C__FLUSH_INVALIDATE_FLAG | + H5C__FLUSH_CLEAR_ONLY_FLAG; + int spec_size = 8; + struct flush_cache_test_spec spec[8] = + { + { + /* entry_num = */ 0, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 100, + /* insert_flag = */ FALSE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 1, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 75, + /* insert_flag = */ FALSE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__NO_FLAGS_SET, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ TRUE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 2, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 25, + /* insert_flag = */ TRUE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ TRUE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 3, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 50, + /* insert_flag = */ TRUE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__NO_FLAGS_SET, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ TRUE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 4, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 10, + /* insert_flag = */ FALSE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 5, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 20, + /* insert_flag = */ FALSE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ TRUE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 6, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 30, + /* insert_flag = */ TRUE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ TRUE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 7, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 40, + /* insert_flag = */ TRUE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ TRUE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ TRUE + } + }; + + check_flush_cache__multi_entry_test(file_ptr, test_num, + flush_flags, spec_size, spec); + } + + + if ( pass ) + { + int test_num = 6; + unsigned int flush_flags = H5C__FLUSH_INVALIDATE_FLAG | + H5C__FLUSH_MARKED_ENTRIES_FLAG; + int spec_size = 8; + struct flush_cache_test_spec spec[8] = + { + { + /* entry_num = */ 0, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 100, + /* insert_flag = */ FALSE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 1, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 75, + /* insert_flag = */ FALSE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__NO_FLAGS_SET, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 2, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 25, + /* insert_flag = */ TRUE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 3, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 50, + /* insert_flag = */ TRUE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__NO_FLAGS_SET, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 4, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 10, + /* insert_flag = */ FALSE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 5, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 20, + /* insert_flag = */ FALSE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 6, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 30, + /* insert_flag = */ TRUE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 7, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 40, + /* insert_flag = */ TRUE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ TRUE + } + }; + + check_flush_cache__multi_entry_test(file_ptr, test_num, + flush_flags, spec_size, spec); + } + + + if ( pass ) + { + int test_num = 7; + unsigned int flush_flags = H5C__FLUSH_CLEAR_ONLY_FLAG | + H5C__FLUSH_MARKED_ENTRIES_FLAG; + int spec_size = 8; + struct flush_cache_test_spec spec[8] = + { + { + /* entry_num = */ 0, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 100, + /* insert_flag = */ FALSE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 1, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 75, + /* insert_flag = */ FALSE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__NO_FLAGS_SET, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 2, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 25, + /* insert_flag = */ TRUE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 3, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 50, + /* insert_flag = */ TRUE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__NO_FLAGS_SET, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 4, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 10, + /* insert_flag = */ FALSE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 5, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 20, + /* insert_flag = */ FALSE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ TRUE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 6, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 30, + /* insert_flag = */ TRUE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ TRUE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 7, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 40, + /* insert_flag = */ TRUE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ TRUE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ FALSE + } + }; + + check_flush_cache__multi_entry_test(file_ptr, test_num, + flush_flags, spec_size, spec); + } + + + if ( pass ) + { + int test_num = 8; + unsigned int flush_flags = H5C__FLUSH_INVALIDATE_FLAG | + H5C__FLUSH_CLEAR_ONLY_FLAG | + H5C__FLUSH_MARKED_ENTRIES_FLAG; + int spec_size = 8; + struct flush_cache_test_spec spec[8] = + { + { + /* entry_num = */ 0, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 100, + /* insert_flag = */ FALSE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 1, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 75, + /* insert_flag = */ FALSE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__NO_FLAGS_SET, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ TRUE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 2, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 25, + /* insert_flag = */ TRUE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ TRUE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 3, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 50, + /* insert_flag = */ TRUE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__NO_FLAGS_SET, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ TRUE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 4, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 10, + /* insert_flag = */ FALSE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 5, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 20, + /* insert_flag = */ FALSE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ TRUE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 6, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 30, + /* insert_flag = */ TRUE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ TRUE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 7, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 40, + /* insert_flag = */ TRUE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ TRUE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ TRUE + } + }; + + check_flush_cache__multi_entry_test(file_ptr, test_num, + flush_flags, spec_size, spec); + } + + + /* verify that all other flags are ignored */ + if ( pass ) + { + int test_num = 9; + unsigned int flush_flags = (unsigned) + ~(H5C__FLUSH_INVALIDATE_FLAG | + H5C__FLUSH_CLEAR_ONLY_FLAG | + H5C__FLUSH_MARKED_ENTRIES_FLAG); + int spec_size = 8; + struct flush_cache_test_spec spec[8] = + { + { + /* entry_num = */ 0, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 100, + /* insert_flag = */ FALSE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 1, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 75, + /* insert_flag = */ FALSE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__NO_FLAGS_SET, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 2, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 25, + /* insert_flag = */ TRUE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 3, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 50, + /* insert_flag = */ TRUE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__NO_FLAGS_SET, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 4, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 10, + /* insert_flag = */ FALSE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 5, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 20, + /* insert_flag = */ FALSE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 6, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 30, + /* insert_flag = */ TRUE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 7, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 40, + /* insert_flag = */ TRUE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ FALSE + } + }; + + check_flush_cache__multi_entry_test(file_ptr, test_num, + flush_flags, spec_size, spec); + } + + /* Now do pinned entry tests: + * + * For the most part, this test is directed at testing the ability + * of the flush routine to unravel collections of pinned entries. + */ + + if ( pass ) + { + int test_num = 1; + unsigned int flush_flags = H5C__NO_FLAGS_SET; + int spec_size = 8; + struct pe_flush_cache_test_spec spec[8] = + { + { + /* entry_num = */ 0, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 100, + /* insert_flag = */ FALSE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* num_pins = */ 0, + /* pin_type[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, + /* pin_idx[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 1, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 75, + /* insert_flag = */ FALSE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__NO_FLAGS_SET, + /* num_pins = */ 1, + /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, + -1, -1, -1, -1, -1, -1, -1}, + /* pin_idx[MAX_PINS] = */ {100, -1, -1, -1, -1, -1, -1, -1}, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 2, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 25, + /* insert_flag = */ TRUE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* num_pins = */ 2, + /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, + PICO_ENTRY_TYPE, + -1, -1, -1, -1, -1, -1}, + /* pin_idx[MAX_PINS] = */ {100, 75, -1, -1, -1, -1, -1, -1}, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 3, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 50, + /* insert_flag = */ TRUE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__NO_FLAGS_SET, + /* num_pins = */ 3, + /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, + PICO_ENTRY_TYPE, + PICO_ENTRY_TYPE, + -1, -1, -1, -1, -1}, + /* pin_idx[MAX_PINS] = */ {100, 75, 25, -1, -1, -1, -1, -1}, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 4, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 10, + /* insert_flag = */ FALSE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* num_pins = */ 4, + /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, + PICO_ENTRY_TYPE, + PICO_ENTRY_TYPE, + PICO_ENTRY_TYPE, + -1, -1, -1, -1}, + /* pin_idx[MAX_PINS] = */ {100, 75, 25, 50, -1, -1, -1, -1}, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 5, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 20, + /* insert_flag = */ FALSE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* num_pins = */ 5, + /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, + PICO_ENTRY_TYPE, + PICO_ENTRY_TYPE, + PICO_ENTRY_TYPE, + MONSTER_ENTRY_TYPE, + -1, -1, -1}, + /* pin_idx[MAX_PINS] = */ {100, 75, 25, 50, 10, -1, -1, -1}, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 6, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 30, + /* insert_flag = */ TRUE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* num_pins = */ 6, + /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, + PICO_ENTRY_TYPE, + PICO_ENTRY_TYPE, + PICO_ENTRY_TYPE, + MONSTER_ENTRY_TYPE, + MONSTER_ENTRY_TYPE, + -1, -1}, + /* pin_idx[MAX_PINS] = */ {100, 75, 25, 50, 10, 20, -1, -1}, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 7, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 40, + /* insert_flag = */ TRUE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* num_pins = */ 7, + /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, + PICO_ENTRY_TYPE, + PICO_ENTRY_TYPE, + PICO_ENTRY_TYPE, + MONSTER_ENTRY_TYPE, + MONSTER_ENTRY_TYPE, + MONSTER_ENTRY_TYPE, + -1}, + /* pin_idx[MAX_PINS] = */ {100, 75, 25, 50, 10, 20, 30, -1}, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ FALSE + } + }; + + check_flush_cache__pe_multi_entry_test(file_ptr, test_num, + flush_flags, spec_size, spec); + } + + + if ( pass ) + { + int test_num = 2; + unsigned int flush_flags = H5C__FLUSH_INVALIDATE_FLAG; + int spec_size = 8; + struct pe_flush_cache_test_spec spec[8] = + { + { + /* entry_num = */ 0, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 100, + /* insert_flag = */ FALSE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* num_pins = */ 0, + /* pin_type[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, + /* pin_idx[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 1, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 75, + /* insert_flag = */ FALSE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__NO_FLAGS_SET, + /* num_pins = */ 1, + /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, + -1, -1, -1, -1, -1, -1, -1}, + /* pin_idx[MAX_PINS] = */ {100, -1, -1, -1, -1, -1, -1, -1}, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 2, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 25, + /* insert_flag = */ TRUE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* num_pins = */ 2, + /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, + PICO_ENTRY_TYPE, + -1, -1, -1, -1, -1, -1}, + /* pin_idx[MAX_PINS] = */ {100, 75, -1, -1, -1, -1, -1, -1}, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 3, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 50, + /* insert_flag = */ TRUE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__NO_FLAGS_SET, + /* num_pins = */ 3, + /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, + PICO_ENTRY_TYPE, + PICO_ENTRY_TYPE, + -1, -1, -1, -1, -1}, + /* pin_idx[MAX_PINS] = */ {100, 75, 25, -1, -1, -1, -1, -1}, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 4, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 10, + /* insert_flag = */ FALSE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* num_pins = */ 0, + /* pin_type[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, + /* pin_idx[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 5, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 20, + /* insert_flag = */ FALSE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* num_pins = */ 1, + /* pin_type[MAX_PINS] = */ {MONSTER_ENTRY_TYPE, + -1, -1, -1, -1 -1, -1, -1}, + /* pin_idx[MAX_PINS] = */ {10, -1, -1, -1 -1, -1, -1, -1}, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 6, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 30, + /* insert_flag = */ TRUE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* num_pins = */ 2, + /* pin_type[MAX_PINS] = */ {MONSTER_ENTRY_TYPE, + MONSTER_ENTRY_TYPE, + -1, -1, -1, -1, -1, -1}, + /* pin_idx[MAX_PINS] = */ {10, 20, -1, -1, -1, -1, -1, -1}, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 7, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 40, + /* insert_flag = */ TRUE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* num_pins = */ 3, + /* pin_type[MAX_PINS] = */ {MONSTER_ENTRY_TYPE, + MONSTER_ENTRY_TYPE, + MONSTER_ENTRY_TYPE, + -1, -1, -1, -1, -1}, + /* pin_idx[MAX_PINS] = */ {10, 20, 30, -1, -1, -1, -1, -1}, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ TRUE + } + }; + + check_flush_cache__pe_multi_entry_test(file_ptr, test_num, + flush_flags, spec_size, spec); + } + + if ( pass ) + { + int test_num = 3; + unsigned int flush_flags = H5C__FLUSH_INVALIDATE_FLAG | + H5C__FLUSH_CLEAR_ONLY_FLAG; + int spec_size = 8; + struct pe_flush_cache_test_spec spec[8] = + { + { + /* entry_num = */ 0, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 100, + /* insert_flag = */ FALSE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* num_pins = */ 0, + /* pin_type[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, + /* pin_idx[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 1, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 75, + /* insert_flag = */ FALSE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__NO_FLAGS_SET, + /* num_pins = */ 1, + /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, + -1, -1, -1, -1, -1, -1, -1}, + /* pin_idx[MAX_PINS] = */ {100, -1, -1, -1, -1, -1, -1, -1}, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ TRUE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 2, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 25, + /* insert_flag = */ TRUE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* num_pins = */ 1, + /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, + -1, -1, -1, -1, -1, -1, -1}, + /* pin_idx[MAX_PINS] = */ {100, -1, -1, -1, -1, -1, -1, -1}, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ TRUE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 3, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 50, + /* insert_flag = */ TRUE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__NO_FLAGS_SET, + /* num_pins = */ 1, + /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, + -1, -1, -1, -1, -1, -1, -1}, + /* pin_idx[MAX_PINS] = */ {100, -1, -1, -1, -1, -1, -1, -1}, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ TRUE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 4, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 10, + /* insert_flag = */ FALSE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* num_pins = */ 0, + /* pin_type[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, + /* pin_idx[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 5, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 20, + /* insert_flag = */ FALSE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* num_pins = */ 0, + /* pin_type[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, + /* pin_idx[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ TRUE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 6, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 30, + /* insert_flag = */ TRUE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* num_pins = */ 0, + /* pin_type[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, + /* pin_idx[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ TRUE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 7, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 40, + /* insert_flag = */ TRUE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* num_pins = */ 0, + /* pin_type[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, + /* pin_idx[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ TRUE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ TRUE + } + }; + + check_flush_cache__pe_multi_entry_test(file_ptr, test_num, + flush_flags, spec_size, spec); + } + + + if ( pass ) + { + int test_num = 4; + unsigned int flush_flags = H5C__FLUSH_INVALIDATE_FLAG | + H5C__FLUSH_MARKED_ENTRIES_FLAG; + int spec_size = 8; + struct pe_flush_cache_test_spec spec[8] = + { + { + /* entry_num = */ 0, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 100, + /* insert_flag = */ FALSE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* num_pins = */ 0, + /* pin_type[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, + /* pin_idx[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 1, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 75, + /* insert_flag = */ FALSE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__NO_FLAGS_SET, + /* num_pins = */ 1, + /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, + -1, -1, -1, -1, -1, -1, -1}, + /* pin_idx[MAX_PINS] = */ {100, -1, -1, -1, -1, -1, -1, -1}, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 2, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 25, + /* insert_flag = */ TRUE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* num_pins = */ 1, + /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, + -1, -1, -1, -1, -1, -1, -1}, + /* pin_idx[MAX_PINS] = */ {100, -1, -1, -1, -1, -1, -1, -1}, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 3, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 50, + /* insert_flag = */ TRUE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__NO_FLAGS_SET, + /* num_pins = */ 1, + /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, + -1, -1, -1, -1, -1, -1, -1}, + /* pin_idx[MAX_PINS] = */ {100, -1, -1, -1, -1, -1, -1, -1}, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 4, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 10, + /* insert_flag = */ FALSE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* num_pins = */ 0, + /* pin_type[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, + /* pin_idx[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 5, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 20, + /* insert_flag = */ FALSE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* num_pins = */ 4, + /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, + PICO_ENTRY_TYPE, + PICO_ENTRY_TYPE, + PICO_ENTRY_TYPE, + -1, -1, -1, -1}, + /* pin_idx[MAX_PINS] = */ {100, 75, 25, 50, -1, -1, -1, -1}, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 6, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 30, + /* insert_flag = */ TRUE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* num_pins = */ 4, + /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, + PICO_ENTRY_TYPE, + PICO_ENTRY_TYPE, + PICO_ENTRY_TYPE, + -1, -1, -1, -1}, + /* pin_idx[MAX_PINS] = */ {100, 75, 25, 50, -1, -1, -1, -1}, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 7, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 40, + /* insert_flag = */ TRUE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* num_pins = */ 0, + /* pin_type[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, + /* pin_idx[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ TRUE, + /* expected_destroyed = */ TRUE + } + }; + + check_flush_cache__pe_multi_entry_test(file_ptr, test_num, + flush_flags, spec_size, spec); + } + + + if ( pass ) + { + int test_num = 5; + unsigned int flush_flags = H5C__FLUSH_INVALIDATE_FLAG | + H5C__FLUSH_CLEAR_ONLY_FLAG | + H5C__FLUSH_MARKED_ENTRIES_FLAG; + int spec_size = 8; + struct pe_flush_cache_test_spec spec[8] = + { + { + /* entry_num = */ 0, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 100, + /* insert_flag = */ FALSE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* num_pins = */ 0, + /* pin_type[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, + /* pin_idx[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 1, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 75, + /* insert_flag = */ FALSE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__NO_FLAGS_SET, + /* num_pins = */ 1, + /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, + -1, -1, -1, -1, -1, -1, -1}, + /* pin_idx[MAX_PINS] = */ {100, -1, -1, -1, -1, -1, -1, -1}, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ TRUE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 2, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 25, + /* insert_flag = */ TRUE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* num_pins = */ 1, + /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, + -1, -1, -1, -1, -1, -1, -1}, + /* pin_idx[MAX_PINS] = */ {100, -1, -1, -1, -1, -1, -1, -1}, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ TRUE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 3, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 50, + /* insert_flag = */ TRUE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__NO_FLAGS_SET, + /* num_pins = */ 1, + /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, + -1, -1, -1, -1, -1, -1, -1}, + /* pin_idx[MAX_PINS] = */ {100, -1, -1, -1, -1, -1, -1, -1}, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ TRUE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 4, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 10, + /* insert_flag = */ FALSE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* num_pins = */ 1, + /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, + -1, -1, -1, -1, -1, -1, -1}, + /* pin_idx[MAX_PINS] = */ {100, -1, -1, -1, -1, -1, -1, -1}, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 5, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 20, + /* insert_flag = */ FALSE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* num_pins = */ 1, + /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, + -1, -1, -1, -1, -1, -1, -1}, + /* pin_idx[MAX_PINS] = */ {100, -1, -1, -1, -1, -1, -1, -1}, + /* expected_deserialized = */ TRUE, + /* expected_cleared = */ TRUE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 6, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 30, + /* insert_flag = */ TRUE, + /* dirty_flag = */ FALSE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* num_pins = */ 1, + /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, + -1, -1, -1, -1, -1, -1, -1}, + /* pin_idx[MAX_PINS] = */ {100, -1, -1, -1, -1, -1, -1, -1}, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ TRUE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 7, + /* entry_type = */ MONSTER_ENTRY_TYPE, + /* entry_index = */ 40, + /* insert_flag = */ TRUE, + /* dirty_flag = */ TRUE, + /* flags = */ H5C__SET_FLUSH_MARKER_FLAG, + /* num_pins = */ 1, + /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, + -1, -1, -1, -1, -1, -1, -1}, + /* pin_idx[MAX_PINS] = */ {100, -1, -1, -1, -1, -1, -1, -1}, + /* expected_deserialized = */ FALSE, + /* expected_cleared = */ TRUE, + /* expected_serialized = */ FALSE, + /* expected_destroyed = */ TRUE + } + }; + + check_flush_cache__pe_multi_entry_test(file_ptr, test_num, + flush_flags, spec_size, spec); + } + + return; + +} /* check_flush_cache__multi_entry() */ + + +/*------------------------------------------------------------------------- + * Function: check_flush_cache__multi_entry_test() + * + * Purpose: Run a multi entry flush cache test. + * + * Return: void + * + * Programmer: John Mainzer + * 1/13/05 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +static void +check_flush_cache__multi_entry_test(H5F_t * file_ptr, + int test_num, + unsigned int flush_flags, + int spec_size, + struct flush_cache_test_spec spec[]) +{ + /* const char * fcn_name = "check_flush_cache__multi_entry_test"; */ + H5C_t * cache_ptr = file_ptr->shared->cache; + static char msg[128]; + herr_t result; + int i; + size_t total_entry_size = 0; + test_entry_t * base_addr; + test_entry_t * entry_ptr; + +#if 0 /* JRM */ + /* This gets used a lot, so lets leave it in. */ + + HDfprintf(stdout, "check_flush_cache__multi_entry_test: test %d\n", + test_num); +#endif /* JRM */ + + if ( cache_ptr == NULL ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "cache_ptr NULL on entry to single entry test #%d.", + test_num); + failure_mssg = msg; + } + else if ( ( cache_ptr->index_len != 0 ) || + ( cache_ptr->index_size != 0 ) ) { + + pass = FALSE; + + HDsnprintf(msg, (size_t)128, + "cache not empty at beginning of multi entry test #%d.", + test_num); + failure_mssg = msg; + } + else if ( ( spec_size < 1 ) || ( spec == NULL ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "missing/bad test spec on entry to multi entry test #%d.", + test_num); + failure_mssg = msg; + } + + i = 0; + while ( ( pass ) && ( i < spec_size ) ) + { + if ( ( spec[i].entry_num != i ) || + ( spec[i].entry_type < 0 ) || + ( spec[i].entry_type >= NUMBER_OF_ENTRY_TYPES ) || + ( spec[i].entry_index < 0 ) || + ( spec[i].entry_index > max_indices[spec[i].entry_type] ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "bad data in spec[%d] on entry to multi entry test #%d.", + i, test_num); + failure_mssg = msg; + } + i++; + } + + i = 0; + while ( ( pass ) && ( i < spec_size ) ) + { + if ( spec[i].insert_flag ) { + + insert_entry(file_ptr, spec[i].entry_type, spec[i].entry_index, + spec[i].dirty_flag, spec[i].flags); + + } else { + + protect_entry(file_ptr, spec[i].entry_type, spec[i].entry_index); + + unprotect_entry(file_ptr, spec[i].entry_type, spec[i].entry_index, + (int)(spec[i].dirty_flag), spec[i].flags); + } + + total_entry_size += entry_sizes[spec[i].entry_type]; + + i++; + } + + if ( pass ) { + + result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, flush_flags); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "flush with flags 0x%x failed in multi entry test #%d.", + flush_flags, test_num); + failure_mssg = msg; + } + } + + i = 0; + while ( ( pass ) && ( i < spec_size ) ) + { + base_addr = entries[spec[i].entry_type]; + entry_ptr = &(base_addr[spec[i].entry_index]); + +#ifndef NDEBUG + /* The clear_dirty_bits() callback is only called in debug mode -- + * thus we can only do our full test on the expected entry history + * when debug is enabled. + */ + if ( ( entry_ptr->deserialized != spec[i].expected_deserialized ) || + ( entry_ptr->cleared != spec[i].expected_cleared ) || + ( entry_ptr->serialized != spec[i].expected_serialized ) || + ( entry_ptr->destroyed != spec[i].expected_destroyed ) ) { +#else + /* When in procduction mode, the clear_dirty_bits() callback is + * not called, so entry_ptr->cleared should never be set. + */ + if ( ( entry_ptr->deserialized != spec[i].expected_deserialized ) || + ( entry_ptr->cleared ) || + ( entry_ptr->serialized != spec[i].expected_serialized ) || + ( entry_ptr->destroyed != spec[i].expected_destroyed ) ) { +#endif /* NDEBUG */ + +#if 0 /* This is useful debugging code. Lets keep it around. */ + + HDfprintf(stdout, + "deslzd = %d(%d), clrd = %d(%d), slzd = %d(%d), dest = %d(%d)\n", + (int)(entry_ptr->deserialized), + (int)(spec[i].expected_deserialized), + (int)(entry_ptr->cleared), + (int)(spec[i].expected_cleared), + (int)(entry_ptr->serialized), + (int)(spec[i].expected_serialized), + (int)(entry_ptr->destroyed), + (int)(spec[i].expected_destroyed)); + +#endif + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "Bad status on entry %d after flush in multi entry test #%d.", + i, test_num); + failure_mssg = msg; + } + i++; + } + + if ( pass ) { + + if ( ( ( (flush_flags & H5C__FLUSH_INVALIDATE_FLAG) == 0 ) + && + ( ( cache_ptr->index_len != spec_size ) + || + ( cache_ptr->index_size != total_entry_size ) + ) + ) + || + ( ( (flush_flags & H5C__FLUSH_INVALIDATE_FLAG) != 0 ) + && + ( ( cache_ptr->index_len != 0 ) + || + ( cache_ptr->index_size != 0 ) + ) + ) + ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "Unexpected cache len/size after flush in multi entry test #%d.", + test_num); + failure_mssg = msg; + } + } + + /* clean up the cache to prep for the next test */ + if ( pass ) { + + result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, + H5C__FLUSH_INVALIDATE_FLAG); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "Flush failed on cleanup in multi entry test #%d.", + test_num); + failure_mssg = msg; + } + else if ( ( cache_ptr->index_len != 0 ) || + ( cache_ptr->index_size != 0 ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "Unexpected cache len/size after cleanup in multi entry test #%d.", + test_num); + failure_mssg = msg; + + } + } + + i = 0; + while ( ( pass ) && ( i < spec_size ) ) + { + base_addr = entries[spec[i].entry_type]; + entry_ptr = &(base_addr[spec[i].entry_index]); + + entry_ptr->deserialized = FALSE; + entry_ptr->cleared = FALSE; + entry_ptr->serialized = FALSE; + entry_ptr->destroyed = FALSE; + + i++; + } + + return; + +} /* check_flush_cache__multi_entry_test() */ + + +/*------------------------------------------------------------------------- + * Function: check_flush_cache__pe_multi_entry_test() + * + * Purpose: Run a multi entry flush cache test. + * + * Return: void + * + * Programmer: John Mainzer + * 4/5/06 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +static void +check_flush_cache__pe_multi_entry_test(H5F_t * file_ptr, + int test_num, + unsigned int flush_flags, + int spec_size, + struct pe_flush_cache_test_spec spec[]) +{ + /* const char * fcn_name = "check_flush_cache__pe_multi_entry_test"; */ + H5C_t * cache_ptr = file_ptr->shared->cache; + static char msg[128]; + herr_t result; + int i; + int j; + size_t total_entry_size = 0; + test_entry_t * base_addr; + test_entry_t * entry_ptr; + +#if 0 /* JRM */ + /* This is useful debugging code. Leave it in for now. */ + + HDfprintf(stdout, "check_flush_cache__pe_multi_entry_test: test %d\n", + test_num); +#endif /* JRM */ + + if ( cache_ptr == NULL ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "cache_ptr NULL on entry to pe multi entry test #%d.", + test_num); + failure_mssg = msg; + } + else if ( ( cache_ptr->index_len != 0 ) || + ( cache_ptr->index_size != 0 ) ) { + + pass = FALSE; + + HDsnprintf(msg, (size_t)128, + "cache not empty at beginning of pe multi entry test #%d.", + test_num); + failure_mssg = msg; + } + else if ( ( spec_size < 1 ) || ( spec == NULL ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "missing/bad test spec on entry to pe multi entry test #%d.", + test_num); + failure_mssg = msg; + } + + i = 0; + while ( ( pass ) && ( i < spec_size ) ) + { + if ( ( spec[i].entry_num != i ) || + ( spec[i].entry_type < 0 ) || + ( spec[i].entry_type >= NUMBER_OF_ENTRY_TYPES ) || + ( spec[i].entry_index < 0 ) || + ( spec[i].entry_index > max_indices[spec[i].entry_type] ) || + ( spec[i].num_pins < 0 ) || + ( spec[i].num_pins > MAX_PINS ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "bad data in spec[%d] on entry to pe multi entry test #%d.", + i, test_num); + failure_mssg = msg; + } + i++; + } + + i = 0; + while ( ( pass ) && ( i < spec_size ) ) + { + if ( spec[i].insert_flag ) { + + insert_entry(file_ptr, spec[i].entry_type, spec[i].entry_index, + spec[i].dirty_flag, spec[i].flags); + + } else { + + protect_entry(file_ptr, spec[i].entry_type, spec[i].entry_index); + + unprotect_entry(file_ptr, spec[i].entry_type, spec[i].entry_index, + (int)(spec[i].dirty_flag), spec[i].flags); + } + + total_entry_size += entry_sizes[spec[i].entry_type]; + + for ( j = 0; j < spec[i].num_pins; j++ ) + { + create_pinned_entry_dependency(file_ptr, + spec[i].entry_type, + spec[i].entry_index, + spec[i].pin_type[j], + spec[i].pin_idx[j]); + } + + i++; + } + + if ( pass ) { + + result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, flush_flags); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "flush with flags 0x%x failed in pe multi entry test #%d.", + flush_flags, test_num); + failure_mssg = msg; + } + } + + i = 0; + while ( ( pass ) && ( i < spec_size ) ) + { + base_addr = entries[spec[i].entry_type]; + entry_ptr = &(base_addr[spec[i].entry_index]); + +#ifndef NDEBUG + /* The clear_dirty_bits() callback is only called in debug mode -- + * thus we can only do our full test on the expected entry history + * when debug is enabled. + */ + if ( ( entry_ptr->deserialized != spec[i].expected_deserialized ) || + ( entry_ptr->cleared != spec[i].expected_cleared ) || + ( entry_ptr->serialized != spec[i].expected_serialized ) || + ( entry_ptr->destroyed != spec[i].expected_destroyed ) ) { +#else + /* When in procduction mode, the clear_dirty_bits() callback is + * not called, so entry_ptr->cleared should never be set. + */ + if ( ( entry_ptr->deserialized != spec[i].expected_deserialized ) || + ( entry_ptr->cleared ) || + ( entry_ptr->serialized != spec[i].expected_serialized ) || + ( entry_ptr->destroyed != spec[i].expected_destroyed ) ) { +#endif /* NDEBUG */ + +#if 0 /* This is useful debugging code. Lets keep it around. */ + + HDfprintf(stdout, + "desrlzd = %d(%d), clrd = %d(%d), srlzd = %d(%d), dest = %d(%d)\n", + (int)(entry_ptr->deserialized), + (int)(spec[i].expected_deserialized), + (int)(entry_ptr->cleared), + (int)(spec[i].expected_cleared), + (int)(entry_ptr->serialized), + (int)(spec[i].expected_serialized), + (int)(entry_ptr->destroyed), + (int)(spec[i].expected_destroyed)); + +#endif + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "Bad status on entry %d after flush in pe multi entry test #%d.", + i, test_num); + failure_mssg = msg; + } + i++; + } + + if ( pass ) { + + if ( ( ( (flush_flags & H5C__FLUSH_INVALIDATE_FLAG) == 0 ) + && + ( ( cache_ptr->index_len != spec_size ) + || + ( cache_ptr->index_size != total_entry_size ) + ) + ) + || + ( ( (flush_flags & H5C__FLUSH_INVALIDATE_FLAG) != 0 ) + && + ( ( cache_ptr->index_len != 0 ) + || + ( cache_ptr->index_size != 0 ) + ) + ) + ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "Unexpected cache len/size after flush in pe multi entry test #%d.", + test_num); + failure_mssg = msg; + } + } + + /* clean up the cache to prep for the next test */ + if ( pass ) { + + result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, + H5C__FLUSH_INVALIDATE_FLAG); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "Flush failed on cleanup in pe multi entry test #%d.", + test_num); + failure_mssg = msg; + } + else if ( ( cache_ptr->index_len != 0 ) || + ( cache_ptr->index_size != 0 ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "Unexpected cache len/size after cleanup in pe multi entry test #%d.", + test_num); + failure_mssg = msg; + + } + } + + i = 0; + while ( ( pass ) && ( i < spec_size ) ) + { + base_addr = entries[spec[i].entry_type]; + entry_ptr = &(base_addr[spec[i].entry_index]); + + entry_ptr->deserialized = FALSE; + entry_ptr->cleared = FALSE; + entry_ptr->serialized = FALSE; + entry_ptr->destroyed = FALSE; + + i++; + } + + return; + +} /* check_flush_cache__pe_multi_entry_test() */ + + +/*------------------------------------------------------------------------- + * Function: check_flush_cache__flush_ops() + * + * Purpose: Run the flush ops cache tests. + * + * These are tests that test the cache's ability to handle + * the case in which the flush callback dirties, resizes, + * and/or renames entries. + * + * Do nothing if pass is FALSE on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 9/3/06 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +static void +check_flush_cache__flush_ops(H5F_t * file_ptr) +{ + /* const char * fcn_name = "check_flush_cache__flush_ops"; */ + H5C_t * cache_ptr = file_ptr->shared->cache; + + if ( cache_ptr == NULL ) { + + pass = FALSE; + failure_mssg = "cache_ptr NULL on entry to flush ops test."; + } + else if ( ( cache_ptr->index_len != 0 ) || + ( cache_ptr->index_size != 0 ) ) { + + pass = FALSE; + failure_mssg = "cache not empty at beginning of flush ops test."; + } + + if ( pass ) /* test #1 */ + { + /* start with a very simple test, in which there are two entries + * resident in cache, and the second entry dirties the first in + * the flush callback. No size changes, and no flush flags. + */ + int test_num = 1; + unsigned int flush_flags = H5C__NO_FLAGS_SET; + int spec_size = 2; + int init_expected_index_len = 2; + size_t init_expected_index_size = 2 * PICO_ENTRY_SIZE; + int expected_index_len = 2; + size_t expected_index_size = 2 * PICO_ENTRY_SIZE; + struct fo_flush_cache_test_spec spec[2] = + { + { + /* entry_num = */ 0, + /* entry_type = */ 0, + /* entry_index = */ 0, + /* insert_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 0, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 1, + /* entry_type = */ 0, + /* entry_index = */ 1, + /* insert_flag = */ FALSE, + /* flags = */ H5C__DIRTIED_FLAG, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 1, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__DIRTY, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + } + }; + int check_size = 0; + struct fo_flush_entry_check checks[1] = + { + { + /* entry_num = */ 0, + /* entry_type = */ 0, + /* entry_index = */ 0, + /* expected_size = */ (size_t)0, + /* in_cache = */ FALSE, + /* at_main_addr = */ FALSE, + /* is_dirty = */ FALSE, + /* is_protected = */ FALSE, + /* is_pinned = */ FALSE, + /* expected_loaded = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ FALSE, + /* expected_destroyed = */ FALSE + } + }; + + check_flush_cache__flush_op_test(file_ptr, + test_num, + flush_flags, + spec_size, + spec, + init_expected_index_len, + init_expected_index_size, + expected_index_len, + expected_index_size, + check_size, + checks); + } + + if ( pass ) /* test #2 */ + { + /* Same as test 1, only this time set the flush invalidate flag. + * Note that we must repeat all tests with the flush invalidate flag + * as this triggers a different set of code to execute the flush. + * + * Create two entries resident in cache, and have the second entry + * dirty the first in the flush callback. + */ + int test_num = 2; + unsigned int flush_flags = H5C__FLUSH_INVALIDATE_FLAG; + int spec_size = 2; + int init_expected_index_len = 2; + size_t init_expected_index_size = 2 * PICO_ENTRY_SIZE; + int expected_index_len = 0; + size_t expected_index_size = 0; + struct fo_flush_cache_test_spec spec[2] = + { + { + /* entry_num = */ 0, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 0, + /* insert_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 0, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 1, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 1, + /* insert_flag = */ FALSE, + /* flags = */ H5C__DIRTIED_FLAG, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 1, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__DIRTY, PICO_ENTRY_TYPE,0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ TRUE + } + }; + int check_size = 0; + struct fo_flush_entry_check checks[1] = + { + { + /* entry_num = */ 0, + /* entry_type = */ 0, + /* entry_index = */ 0, + /* expected_size = */ (size_t)0, + /* in_cache = */ FALSE, + /* at_main_addr = */ FALSE, + /* is_dirty = */ FALSE, + /* is_protected = */ FALSE, + /* is_pinned = */ FALSE, + /* expected_loaded = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ FALSE, + /* expected_destroyed = */ FALSE + } + }; + + check_flush_cache__flush_op_test(file_ptr, + test_num, + flush_flags, + spec_size, + spec, + init_expected_index_len, + init_expected_index_size, + expected_index_len, + expected_index_size, + check_size, + checks); + } + + if ( pass ) /* test #3 */ + { + /* Single entry test verifying that the cache can handle the case in + * which the call back function resizes the entry for which it has + * been called. + */ + int test_num = 3; + unsigned int flush_flags = H5C__NO_FLAGS_SET; + int spec_size = 1; + int init_expected_index_len = 1; + size_t init_expected_index_size = VARIABLE_ENTRY_SIZE / 4; + int expected_index_len = 1; + size_t expected_index_size = VARIABLE_ENTRY_SIZE / 2; + struct fo_flush_cache_test_spec spec[1] = + { + { + /* entry_num = */ 0, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 0, + /* insert_flag = */ FALSE, + /* flags = */ H5C__SIZE_CHANGED_FLAG, + /* new_size = */ VARIABLE_ENTRY_SIZE / 4, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 1, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 0, FALSE, VARIABLE_ENTRY_SIZE / 2 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + } + }; + int check_size = 0; + struct fo_flush_entry_check checks[1] = + { + { + /* entry_num = */ 0, + /* entry_type = */ 0, + /* entry_index = */ 0, + /* expected_size = */ (size_t)0, + /* in_cache = */ FALSE, + /* at_main_addr = */ FALSE, + /* is_dirty = */ FALSE, + /* is_protected = */ FALSE, + /* is_pinned = */ FALSE, + /* expected_loaded = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ FALSE, + /* expected_destroyed = */ FALSE + } + }; + + check_flush_cache__flush_op_test(file_ptr, + test_num, + flush_flags, + spec_size, + spec, + init_expected_index_len, + init_expected_index_size, + expected_index_len, + expected_index_size, + check_size, + checks); + } + + if ( pass ) /* test #4 */ + { + /* Repeat test #4 with the flush invalidate flag. + * + * Single entry test verifying that the cache can handle the case in + * which the call back function resizes the entry for which it has + * been called. + */ + int test_num = 4; + unsigned int flush_flags = H5C__FLUSH_INVALIDATE_FLAG; + int spec_size = 1; + int init_expected_index_len = 1; + size_t init_expected_index_size = VARIABLE_ENTRY_SIZE / 4; + int expected_index_len = 0; + size_t expected_index_size = 0; + struct fo_flush_cache_test_spec spec[1] = + { + { + /* entry_num = */ 0, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 0, + /* insert_flag = */ FALSE, + /* flags = */ H5C__SIZE_CHANGED_FLAG, + /* new_size = */ VARIABLE_ENTRY_SIZE / 4, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 1, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 0, FALSE, VARIABLE_ENTRY_SIZE / 2 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ TRUE + } + }; + int check_size = 0; + struct fo_flush_entry_check checks[1] = + { + { + /* entry_num = */ 0, + /* entry_type = */ 0, + /* entry_index = */ 0, + /* expected_size = */ (size_t)0, + /* in_cache = */ FALSE, + /* at_main_addr = */ FALSE, + /* is_dirty = */ FALSE, + /* is_protected = */ FALSE, + /* is_pinned = */ FALSE, + /* expected_loaded = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ FALSE, + /* expected_destroyed = */ FALSE + } + }; + + check_flush_cache__flush_op_test(file_ptr, + test_num, + flush_flags, + spec_size, + spec, + init_expected_index_len, + init_expected_index_size, + expected_index_len, + expected_index_size, + check_size, + checks); + } + + if ( pass ) /* test #5 & #6 */ + { + /* Single entry test verifying that the cache can handle the case in + * which the call back function first resizes and then renames the + * entry for which it has been called. + * + * Run this entry twice, as the first run moves the entry to its + * alternate address, and the second moves it back. + * + * 10/8/07 -- JRM + * Added a resize operation to this test to satisfy the new + * requiremnt that any resize of an entry on flush will always + * be accompanied by a resize. Note that as a result, this + * test becomes redundant with later tests. + */ + int test_num = 5; /* and 6 */ + unsigned int flush_flags = H5C__NO_FLAGS_SET; + int spec_size = 1; + int init_expected_index_len = 1; + size_t init_expected_index_size = VARIABLE_ENTRY_SIZE; + int expected_index_len = 1; + size_t expected_index_size = VARIABLE_ENTRY_SIZE / 2; + struct fo_flush_cache_test_spec spec[1] = + { + { + /* entry_num = */ 0, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 0, + /* insert_flag = */ FALSE, + /* flags = */ H5C__DIRTIED_FLAG, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 2, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 0, FALSE, VARIABLE_ENTRY_SIZE / 2 }, + { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + } + }; + int check_size = 0; + struct fo_flush_entry_check checks[1] = + { + { + /* entry_num = */ 0, + /* entry_type = */ 0, + /* entry_index = */ 0, + /* expected_size = */ (size_t)0, + /* in_cache = */ FALSE, + /* at_main_addr = */ FALSE, + /* is_dirty = */ FALSE, + /* is_protected = */ FALSE, + /* is_pinned = */ FALSE, + /* expected_loaded = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ FALSE, + /* expected_destroyed = */ FALSE + } + }; + + check_flush_cache__flush_op_test(file_ptr, + test_num, + flush_flags, + spec_size, + spec, + init_expected_index_len, + init_expected_index_size, + expected_index_len, + expected_index_size, + check_size, + checks); + + /* this change forces the rename to move the target entry back to its + * main address. The first test moved it to its alternate address. + * + * Note that these two tests are not the same, as in the first test, + * the renamed entry is moved forward in the slist. In the second + * it is moved backwards. + * + * Since there is only one entry in the cache, this doesn't really + * matter in this case. But we will do similar tests later with + * other entries in the cache. + */ + if ( pass ) { + + spec[0].flush_ops[1].flag = TRUE; + test_num = 6; + + check_flush_cache__flush_op_test(file_ptr, + test_num, + flush_flags, + spec_size, + spec, + init_expected_index_len, + init_expected_index_size, + expected_index_len, + expected_index_size, + check_size, + checks); + } + } + + if ( pass ) /* test #7 & #8 */ + { + /* Run tests 5 & 6 again, using the flush invalidate flag on the + * second test. + * + * Single entry test verifying that the cache can handle the case in + * which the call back function renames the entry for which it has + * been called. + * + * Run this entry twice, as the first run moves the entry to its + * alternate address, and the second moves it back. + * + * 10/8/07 -- JRM + * Added a resize operation to this test to satisfy the new + * requiremnt that any resize of an entry on flush will always + * be accompanied by a resize. Note that as a result, this + * test becomes redundant with later tests. + */ + int test_num = 7; /* and 8 */ + unsigned int flush_flags = H5C__NO_FLAGS_SET; + int spec_size = 1; + int init_expected_index_len = 1; + size_t init_expected_index_size = VARIABLE_ENTRY_SIZE; + int expected_index_len = 1; + size_t expected_index_size = VARIABLE_ENTRY_SIZE / 2; + struct fo_flush_cache_test_spec spec[1] = + { + { + /* entry_num = */ 0, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 0, + /* insert_flag = */ FALSE, + /* flags = */ H5C__DIRTIED_FLAG, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 2, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 0, FALSE, VARIABLE_ENTRY_SIZE / 2 }, + { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + } + }; + int check_size = 0; + struct fo_flush_entry_check checks[1] = + { + { + /* entry_num = */ 0, + /* entry_type = */ 0, + /* entry_index = */ 0, + /* expected_size = */ (size_t)0, + /* in_cache = */ FALSE, + /* at_main_addr = */ FALSE, + /* is_dirty = */ FALSE, + /* is_protected = */ FALSE, + /* is_pinned = */ FALSE, + /* expected_loaded = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ FALSE, + /* expected_destroyed = */ FALSE + } + }; + + check_flush_cache__flush_op_test(file_ptr, + test_num, + flush_flags, + spec_size, + spec, + init_expected_index_len, + init_expected_index_size, + expected_index_len, + expected_index_size, + check_size, + checks); + + /* this change forces the rename to move the target entry back to its + * main address. The first test moved it to its alternate address. + * + * Note that these two tests are not the same, as in the first test, + * the renamed entry is moved forward in the slist. In the second + * it is moved backwards. + * + * Since there is only one entry in the cache, this doesn't really + * matter in this case. But we will do similar tests later with + * other entries in the cache. + */ + + if ( pass ) { + + test_num = 8; + flush_flags = H5C__FLUSH_INVALIDATE_FLAG; + expected_index_len = 0; + expected_index_size = 0; + spec[0].flush_ops[1].flag = TRUE; + spec[0].expected_destroyed = TRUE; + + check_flush_cache__flush_op_test(file_ptr, + test_num, + flush_flags, + spec_size, + spec, + init_expected_index_len, + init_expected_index_size, + expected_index_len, + expected_index_size, + check_size, + checks); + } + } + + if ( pass ) /* test #9 & #10 */ + { + /* Single entry test verifying that the cache can handle the case in + * which the call back function both resizes and renames the entry + * for which it has been called. + * + * Again, we run this entry twice, as the first run moves the entry + * to its alternate address, and the second moves it back. + */ + int test_num = 9; /* and 10 */ + unsigned int flush_flags = H5C__NO_FLAGS_SET; + int spec_size = 1; + int init_expected_index_len = 1; + size_t init_expected_index_size = VARIABLE_ENTRY_SIZE / 2; + int expected_index_len = 1; + size_t expected_index_size = VARIABLE_ENTRY_SIZE / 4; + struct fo_flush_cache_test_spec spec[1] = + { + { + /* entry_num = */ 0, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 0, + /* insert_flag = */ FALSE, + /* flags = */ H5C__SIZE_CHANGED_FLAG, + /* new_size = */ VARIABLE_ENTRY_SIZE / 2, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 2, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 0, FALSE, VARIABLE_ENTRY_SIZE / 4 }, + { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + } + }; + int check_size = 0; + struct fo_flush_entry_check checks[1] = + { + { + /* entry_num = */ 0, + /* entry_type = */ 0, + /* entry_index = */ 0, + /* expected_size = */ (size_t)0, + /* in_cache = */ FALSE, + /* at_main_addr = */ FALSE, + /* is_dirty = */ FALSE, + /* is_protected = */ FALSE, + /* is_pinned = */ FALSE, + /* expected_loaded = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ FALSE, + /* expected_destroyed = */ FALSE + } + }; + + check_flush_cache__flush_op_test(file_ptr, + test_num, + flush_flags, + spec_size, + spec, + init_expected_index_len, + init_expected_index_size, + expected_index_len, + expected_index_size, + check_size, + checks); + + /* this change forces the rename to move the target entry back to its + * main address. The first test moved it to its alternate address. + * + * Note that these two tests are not the same, as in the first test, + * the renamed entry is moved forward in the slist. In the second + * it is moved backwards. + * + * Since there is only one entry in the cache, this doesn't really + * matter in this case. But we will do similar tests later with + * other entries in the cache. + */ + if ( pass ) { + + spec[0].flush_ops[1].flag = TRUE; + test_num = 10; + + check_flush_cache__flush_op_test(file_ptr, + test_num, + flush_flags, + spec_size, + spec, + init_expected_index_len, + init_expected_index_size, + expected_index_len, + expected_index_size, + check_size, + checks); + } + } + + if ( pass ) /* test #11 & #12 */ + { + /* Repeat the previous test with the flush invalidate flag on the + * second test. + * + * Single entry test verifying that the cache can handle the case in + * which the call back function both resizes and renames the entry + * for which it has been called. + * + * Again, we run this entry twice, as the first run moves the entry to its + * alternate address, and the second moves it back. + */ + int test_num = 11; /* and 12 */ + unsigned int flush_flags = H5C__NO_FLAGS_SET; + int spec_size = 1; + int init_expected_index_len = 1; + size_t init_expected_index_size = VARIABLE_ENTRY_SIZE / 2; + int expected_index_len = 1; + size_t expected_index_size = VARIABLE_ENTRY_SIZE / 4; + struct fo_flush_cache_test_spec spec[1] = + { + { + /* entry_num = */ 0, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 0, + /* insert_flag = */ FALSE, + /* flags = */ H5C__SIZE_CHANGED_FLAG, + /* new_size = */ VARIABLE_ENTRY_SIZE / 2, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 2, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 0, FALSE, VARIABLE_ENTRY_SIZE / 4 }, + { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + } + }; + int check_size = 0; + struct fo_flush_entry_check checks[1] = + { + { + /* entry_num = */ 0, + /* entry_type = */ 0, + /* entry_index = */ 0, + /* expected_size = */ (size_t)0, + /* in_cache = */ FALSE, + /* at_main_addr = */ FALSE, + /* is_dirty = */ FALSE, + /* is_protected = */ FALSE, + /* is_pinned = */ FALSE, + /* expected_loaded = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ FALSE, + /* expected_destroyed = */ FALSE + } + }; + + check_flush_cache__flush_op_test(file_ptr, + test_num, + flush_flags, + spec_size, + spec, + init_expected_index_len, + init_expected_index_size, + expected_index_len, + expected_index_size, + check_size, + checks); + + /* this change forces the rename to move the target entry back to its + * main address. The first test moved it to its alternate address. + * + * Note that these two tests are not the same, as in the first test, + * the renamed entry is moved forward in the slist. In the second + * it is moved backwards. + * + * Since there is only one entry in the cache, this doesn't really + * matter in this case. But we will do similar tests later with + * other entries in the cache. + */ + if ( pass ) { + + test_num = 12; + flush_flags = H5C__FLUSH_INVALIDATE_FLAG; + expected_index_len = 0; + expected_index_size = 0; + spec[0].flush_ops[1].flag = TRUE; + spec[0].expected_destroyed = TRUE; + + + check_flush_cache__flush_op_test(file_ptr, + test_num, + flush_flags, + spec_size, + spec, + init_expected_index_len, + init_expected_index_size, + expected_index_len, + expected_index_size, + check_size, + checks); + } + } + + if ( pass ) /* test #13 */ + { + /* Test the ability of the cache to handle the case in which + * the flush function of an entry that is resident in cache + * dirties two entries that are not in cache. No size + * changes. + * + * At present, I am assured that this case will never occur, but + * lets make sure we can handle it regardless. + */ + int test_num = 13; + unsigned int flush_flags = H5C__NO_FLAGS_SET; + int spec_size = 1; + int init_expected_index_len = 1; + size_t init_expected_index_size = 1 * PICO_ENTRY_SIZE; + int expected_index_len = 3; + size_t expected_index_size = 3 * PICO_ENTRY_SIZE; + struct fo_flush_cache_test_spec spec[1] = + { + { + /* entry_num = */ 0, + /* entry_type = */ 0, + /* entry_index = */ 1, + /* insert_flag = */ FALSE, + /* flags = */ H5C__DIRTIED_FLAG, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 2, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__DIRTY, 0, 0, FALSE, 0 }, + { FLUSH_OP__DIRTY, 0, 2, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + } + }; + int check_size = 2; + struct fo_flush_entry_check checks[2] = + { + { + /* entry_num = */ 0, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 0, + /* expected_size = */ PICO_ENTRY_SIZE, + /* in_cache = */ TRUE, + /* at_main_addr = */ TRUE, + /* is_dirty = */ FALSE, + /* is_protected = */ FALSE, + /* is_pinned = */ FALSE, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 1, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 2, + /* expected_size = */ PICO_ENTRY_SIZE, + /* in_cache = */ TRUE, + /* at_main_addr = */ TRUE, + /* is_dirty = */ FALSE, + /* is_protected = */ FALSE, + /* is_pinned = */ FALSE, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + } + }; + + check_flush_cache__flush_op_test(file_ptr, + test_num, + flush_flags, + spec_size, + spec, + init_expected_index_len, + init_expected_index_size, + expected_index_len, + expected_index_size, + check_size, + checks); + } + + if ( pass ) /* test #14 */ + { + /* Repeat previous test with the flush invalidate flag. + * + * Test the ability of the cache to handle the case in which + * the flush function of an entry that is resident in cache + * dirties two entries that are not in cache. No size + * changes. + * + * At present, I am assured that this case will never occur, but + * lets make sure we can handle it regardless. + */ + int test_num = 14; + unsigned int flush_flags = H5C__FLUSH_INVALIDATE_FLAG; + int spec_size = 1; + int init_expected_index_len = 1; + size_t init_expected_index_size = 1 * PICO_ENTRY_SIZE; + int expected_index_len = 0; + size_t expected_index_size = (size_t)0; + struct fo_flush_cache_test_spec spec[1] = + { + { + /* entry_num = */ 0, + /* entry_type = */ 0, + /* entry_index = */ 1, + /* insert_flag = */ FALSE, + /* flags = */ H5C__DIRTIED_FLAG, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 2, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__DIRTY, 0, 0, FALSE, 0 }, + { FLUSH_OP__DIRTY, 0, 2, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ TRUE + } + }; + int check_size = 2; + struct fo_flush_entry_check checks[2] = + { + { + /* entry_num = */ 0, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 0, + /* expected_size = */ PICO_ENTRY_SIZE, + /* in_cache = */ FALSE, + /* at_main_addr = */ TRUE, + /* is_dirty = */ FALSE, + /* is_protected = */ FALSE, + /* is_pinned = */ FALSE, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 1, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 2, + /* expected_size = */ PICO_ENTRY_SIZE, + /* in_cache = */ FALSE, + /* at_main_addr = */ TRUE, + /* is_dirty = */ FALSE, + /* is_protected = */ FALSE, + /* is_pinned = */ FALSE, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ TRUE + } + }; + + check_flush_cache__flush_op_test(file_ptr, + test_num, + flush_flags, + spec_size, + spec, + init_expected_index_len, + init_expected_index_size, + expected_index_len, + expected_index_size, + check_size, + checks); + } + + if ( pass ) /* test #15 */ + { + /* Test the ability of the cache to handle the case in which + * the flush function of an entry that is resident in cache + * resizes and dirties two entries that are not in cache. + * + * At present, I am assured that this case will never occur, but + * lets make sure we can handle it regardless. + */ + int test_num = 15; + unsigned int flush_flags = H5C__NO_FLAGS_SET; + int spec_size = 1; + int init_expected_index_len = 1; + size_t init_expected_index_size = 1 * VARIABLE_ENTRY_SIZE; + int expected_index_len = 3; + size_t expected_index_size = VARIABLE_ENTRY_SIZE + + (VARIABLE_ENTRY_SIZE / 4) + + (VARIABLE_ENTRY_SIZE / 2); + struct fo_flush_cache_test_spec spec[1] = + { + { + /* entry_num = */ 0, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 1, + /* insert_flag = */ FALSE, + /* flags = */ H5C__DIRTIED_FLAG, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 4, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 0, FALSE, VARIABLE_ENTRY_SIZE / 4 }, + { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 0, FALSE, 0 }, + { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 2, FALSE, 0 }, + { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 2, FALSE, VARIABLE_ENTRY_SIZE / 2 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + } + }; + int check_size = 2; + struct fo_flush_entry_check checks[2] = + { + { + /* entry_num = */ 0, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 0, + /* expected_size = */ VARIABLE_ENTRY_SIZE / 4, + /* in_cache = */ TRUE, + /* at_main_addr = */ TRUE, + /* is_dirty = */ FALSE, + /* is_protected = */ FALSE, + /* is_pinned = */ FALSE, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 1, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 2, + /* expected_size = */ VARIABLE_ENTRY_SIZE / 2, + /* in_cache = */ TRUE, + /* at_main_addr = */ TRUE, + /* is_dirty = */ FALSE, + /* is_protected = */ FALSE, + /* is_pinned = */ FALSE, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + } + }; + + check_flush_cache__flush_op_test(file_ptr, + test_num, + flush_flags, + spec_size, + spec, + init_expected_index_len, + init_expected_index_size, + expected_index_len, + expected_index_size, + check_size, + checks); + } + + if ( pass ) /* test #16 */ + { + /* Repeat previous test with the flush invalidate flag. + * + * Test the ability of the cache to handle the case in which + * the flush function of an entry that is resident in cache + * resizes and dirties two entries that are not in cache. + * + * At present, I am assured that this case will never occur, but + * lets make sure we can handle it regardless. + */ + int test_num = 16; + unsigned int flush_flags = H5C__FLUSH_INVALIDATE_FLAG; + int spec_size = 1; + int init_expected_index_len = 1; + size_t init_expected_index_size = 1 * VARIABLE_ENTRY_SIZE; + int expected_index_len = 0; + size_t expected_index_size = (size_t)0; + struct fo_flush_cache_test_spec spec[1] = + { + { + /* entry_num = */ 0, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 1, + /* insert_flag = */ FALSE, + /* flags = */ H5C__DIRTIED_FLAG, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 4, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 0, FALSE, VARIABLE_ENTRY_SIZE / 4 }, + { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 0, FALSE, 0 }, + { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 2, FALSE, 0 }, + { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 2, FALSE, VARIABLE_ENTRY_SIZE / 2 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ TRUE + } + }; + int check_size = 2; + struct fo_flush_entry_check checks[2] = + { + { + /* entry_num = */ 0, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 0, + /* expected_size = */ VARIABLE_ENTRY_SIZE / 4, + /* in_cache = */ FALSE, + /* at_main_addr = */ TRUE, + /* is_dirty = */ FALSE, + /* is_protected = */ FALSE, + /* is_pinned = */ FALSE, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 1, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 2, + /* expected_size = */ VARIABLE_ENTRY_SIZE / 2, + /* in_cache = */ FALSE, + /* at_main_addr = */ TRUE, + /* is_dirty = */ FALSE, + /* is_protected = */ FALSE, + /* is_pinned = */ FALSE, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ TRUE + } + }; + + check_flush_cache__flush_op_test(file_ptr, + test_num, + flush_flags, + spec_size, + spec, + init_expected_index_len, + init_expected_index_size, + expected_index_len, + expected_index_size, + check_size, + checks); + } + + if ( pass ) /* test #17 & #18 */ + { + /* Test the ability of the cache to handle the case in which + * the flush function of an entry that is resident in cache + * resizes, dirties, and renames two entries that are not in cache. + * + * At present, I am assured that this case will never occur, but + * lets make sure we can handle it regardless. + */ + int test_num = 17; /* and 18 */ + unsigned int flush_flags = H5C__NO_FLAGS_SET; + int spec_size = 1; + int init_expected_index_len = 1; + size_t init_expected_index_size = 1 * VARIABLE_ENTRY_SIZE; + int expected_index_len = 3; + size_t expected_index_size = VARIABLE_ENTRY_SIZE + + (VARIABLE_ENTRY_SIZE / 4) + + (VARIABLE_ENTRY_SIZE / 2); + struct fo_flush_cache_test_spec spec[1] = + { + { + /* entry_num = */ 0, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 1, + /* insert_flag = */ FALSE, + /* flags = */ H5C__DIRTIED_FLAG, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 6, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 0, FALSE, VARIABLE_ENTRY_SIZE / 4 }, + { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 0, FALSE, 0 }, + { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 0, FALSE, 0 }, + { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 2, FALSE, 0 }, + { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 2, FALSE, VARIABLE_ENTRY_SIZE / 2 }, + { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 2, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + } + }; + int check_size = 2; + struct fo_flush_entry_check checks[2] = + { + { + /* entry_num = */ 0, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 0, + /* expected_size = */ VARIABLE_ENTRY_SIZE / 4, + /* in_cache = */ TRUE, + /* at_main_addr = */ FALSE, + /* is_dirty = */ FALSE, + /* is_protected = */ FALSE, + /* is_pinned = */ FALSE, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 1, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 2, + /* expected_size = */ VARIABLE_ENTRY_SIZE / 2, + /* in_cache = */ TRUE, + /* at_main_addr = */ FALSE, + /* is_dirty = */ FALSE, + /* is_protected = */ FALSE, + /* is_pinned = */ FALSE, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + } + }; + + check_flush_cache__flush_op_test(file_ptr, + test_num, + flush_flags, + spec_size, + spec, + init_expected_index_len, + init_expected_index_size, + expected_index_len, + expected_index_size, + check_size, + checks); + + /* this change forces the renames to move the target entries back to + * their main address. The first test moved them to their alternate + * address. + * + * Note that these two tests are not the same, as in the first test, + * the renamed entries are moved forward in the slist. In the second + * they are moved backwards. + */ + if ( pass ) { + + test_num = 18; + spec[0].flush_ops[2].flag = TRUE; + spec[0].flush_ops[5].flag = TRUE; + checks[0].at_main_addr = TRUE; + checks[1].at_main_addr = TRUE; + + check_flush_cache__flush_op_test(file_ptr, + test_num, + flush_flags, + spec_size, + spec, + init_expected_index_len, + init_expected_index_size, + expected_index_len, + expected_index_size, + check_size, + checks); + } + } + + if ( pass ) /* test #19 & #20 */ + { + /* Repeat the above test with the flush invalidate flag on the + * second test. + * + * Test the ability of the cache to handle the case in which + * the flush function of an entry that is resident in cache + * resizes, dirties, and renames two entries that are not in cache. + * + * At present, I am assured that this case will never occur, but + * lets make sure we can handle it regardless. + */ + int test_num = 19; /* and 20 */ + unsigned int flush_flags = H5C__NO_FLAGS_SET; + int spec_size = 1; + int init_expected_index_len = 1; + size_t init_expected_index_size = 1 * VARIABLE_ENTRY_SIZE; + int expected_index_len = 3; + size_t expected_index_size = VARIABLE_ENTRY_SIZE + + (VARIABLE_ENTRY_SIZE / 4) + + (VARIABLE_ENTRY_SIZE / 2); + struct fo_flush_cache_test_spec spec[1] = + { + { + /* entry_num = */ 0, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 1, + /* insert_flag = */ FALSE, + /* flags = */ H5C__DIRTIED_FLAG, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 6, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 0, FALSE, VARIABLE_ENTRY_SIZE / 4 }, + { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 0, FALSE, 0 }, + { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 0, FALSE, 0 }, + { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 2, FALSE, 0 }, + { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 2, FALSE, VARIABLE_ENTRY_SIZE / 2 }, + { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 2, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + } + }; + int check_size = 2; + struct fo_flush_entry_check checks[2] = + { + { + /* entry_num = */ 0, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 0, + /* expected_size = */ VARIABLE_ENTRY_SIZE / 4, + /* in_cache = */ TRUE, + /* at_main_addr = */ FALSE, + /* is_dirty = */ FALSE, + /* is_protected = */ FALSE, + /* is_pinned = */ FALSE, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 1, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 2, + /* expected_size = */ VARIABLE_ENTRY_SIZE / 2, + /* in_cache = */ TRUE, + /* at_main_addr = */ FALSE, + /* is_dirty = */ FALSE, + /* is_protected = */ FALSE, + /* is_pinned = */ FALSE, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + } + }; + + check_flush_cache__flush_op_test(file_ptr, + test_num, + flush_flags, + spec_size, + spec, + init_expected_index_len, + init_expected_index_size, + expected_index_len, + expected_index_size, + check_size, + checks); + + /* this change forces the renames to move the target entries back to + * their main address. The first test moved them to their alternate + * address. + * + * Note that these two tests are not the same, as in the first test, + * the renamed entries are moved forward in the slist. In the second + * they are moved backwards. + */ + if ( pass ) { + + test_num = 20; + flush_flags = H5C__FLUSH_INVALIDATE_FLAG; + expected_index_len = 0; + expected_index_size = (size_t)0; + spec[0].expected_destroyed = TRUE; + spec[0].flush_ops[2].flag = TRUE; + spec[0].flush_ops[5].flag = TRUE; + checks[0].at_main_addr = TRUE; + checks[0].in_cache = FALSE; + checks[0].expected_destroyed = TRUE; + checks[1].at_main_addr = TRUE; + checks[1].in_cache = FALSE; + checks[1].expected_destroyed = TRUE; + + check_flush_cache__flush_op_test(file_ptr, + test_num, + flush_flags, + spec_size, + spec, + init_expected_index_len, + init_expected_index_size, + expected_index_len, + expected_index_size, + check_size, + checks); + } + } + + if ( pass ) /* test #21 */ + { + /* Now mix things up a bit. + * + * Load several entries, two of which have flush functions that + * resize, dirty, and rename two entries that are not in the + * cache. Mark only one of these entries, and then flush the + * cache with the flush marked entries flag. + * + * This is the only test in which we test the + * H5C__FLUSH_MARKED_ENTRIES_FLAG. The hope is that since + * we test the two features extensively by themselves, so + * it should be sufficient to verify that they play together + * as expected. + */ + int test_num = 21; + unsigned int flush_flags = H5C__FLUSH_MARKED_ENTRIES_FLAG; + int spec_size = 4; + int init_expected_index_len = 4; + size_t init_expected_index_size = (2 * VARIABLE_ENTRY_SIZE) + (2 * PICO_ENTRY_SIZE); + int expected_index_len = 6; + size_t expected_index_size = (2 * VARIABLE_ENTRY_SIZE) + + (VARIABLE_ENTRY_SIZE / 4) + + (VARIABLE_ENTRY_SIZE / 2) + + (2 * PICO_ENTRY_SIZE); + struct fo_flush_cache_test_spec spec[4] = + { + { + /* entry_num = */ 0, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 1, + /* insert_flag = */ FALSE, + /* flags = */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 6, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 0, FALSE, VARIABLE_ENTRY_SIZE / 4 }, + { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 0, FALSE, 0 }, + { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 0, FALSE, 0 }, + { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 2, FALSE, 0 }, + { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 2, FALSE, VARIABLE_ENTRY_SIZE / 2 }, + { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 2, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 1, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 11, + /* insert_flag = */ FALSE, + /* flags = */ H5C__DIRTIED_FLAG, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 6, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 10, FALSE, VARIABLE_ENTRY_SIZE / 4 }, + { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 10, FALSE, 0 }, + { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 10, FALSE, 0 }, + { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 12, FALSE, 0 }, + { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 12, FALSE, VARIABLE_ENTRY_SIZE / 2 }, + { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 12, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ FALSE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 2, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 0, + /* insert_flag = */ FALSE, + /* flags = */ H5C__DIRTIED_FLAG | H5C__SET_FLUSH_MARKER_FLAG, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 0, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 3, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 1, + /* insert_flag = */ FALSE, + /* flags = */ H5C__DIRTIED_FLAG, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 0, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ FALSE, + /* expected_destroyed = */ FALSE + } + }; + int check_size = 4; + struct fo_flush_entry_check checks[4] = + { + { + /* entry_num = */ 0, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 0, + /* expected_size = */ VARIABLE_ENTRY_SIZE / 4, + /* in_cache = */ TRUE, + /* at_main_addr = */ FALSE, + /* is_dirty = */ TRUE, + /* is_protected = */ FALSE, + /* is_pinned = */ FALSE, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ FALSE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 1, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 2, + /* expected_size = */ VARIABLE_ENTRY_SIZE / 2, + /* in_cache = */ TRUE, + /* at_main_addr = */ FALSE, + /* is_dirty = */ TRUE, + /* is_protected = */ FALSE, + /* is_pinned = */ FALSE, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ FALSE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 2, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 10, + /* expected_size = */ VARIABLE_ENTRY_SIZE, + /* in_cache = */ FALSE, + /* at_main_addr = */ TRUE, + /* is_dirty = */ FALSE, + /* is_protected = */ FALSE, + /* is_pinned = */ FALSE, + /* expected_loaded = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ FALSE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 3, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 12, + /* expected_size = */ VARIABLE_ENTRY_SIZE, + /* in_cache = */ FALSE, + /* at_main_addr = */ TRUE, + /* is_dirty = */ FALSE, + /* is_protected = */ FALSE, + /* is_pinned = */ FALSE, + /* expected_loaded = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ FALSE, + /* expected_destroyed = */ FALSE + } + }; + + check_flush_cache__flush_op_test(file_ptr, + test_num, + flush_flags, + spec_size, + spec, + init_expected_index_len, + init_expected_index_size, + expected_index_len, + expected_index_size, + check_size, + checks); + reset_entries(); + } + + if ( pass ) /* test #22 */ + { + /* Mix things up some more. + * + * Load lots of entries, some of which have flush functions that + * resize, dirty, and rename two entries that are not in the + * cache. + * + * Also load entries that have flush ops on entries that are in + * cache. + */ + int test_num = 22; + unsigned int flush_flags = H5C__NO_FLAGS_SET; + int spec_size = 6; + int init_expected_index_len = 6; + size_t init_expected_index_size = (2 * VARIABLE_ENTRY_SIZE) + (4 * PICO_ENTRY_SIZE); + int expected_index_len = 10; + size_t expected_index_size = (2 * VARIABLE_ENTRY_SIZE) + + (2 * (VARIABLE_ENTRY_SIZE / 4)) + + (2 * (VARIABLE_ENTRY_SIZE / 2)) + + (4 * PICO_ENTRY_SIZE); + struct fo_flush_cache_test_spec spec[6] = + { + { + /* entry_num = */ 0, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 1, + /* insert_flag = */ FALSE, + /* flags = */ H5C__DIRTIED_FLAG, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 6, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 0, FALSE, VARIABLE_ENTRY_SIZE / 4 }, + { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 0, FALSE, 0 }, + { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 0, FALSE, 0 }, + { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 2, FALSE, 0 }, + { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 2, FALSE, VARIABLE_ENTRY_SIZE / 2 }, + { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 2, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 1, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 11, + /* insert_flag = */ FALSE, + /* flags = */ H5C__DIRTIED_FLAG, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 6, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 10, FALSE, VARIABLE_ENTRY_SIZE / 4 }, + { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 10, FALSE, 0 }, + { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 10, FALSE, 0 }, + { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 12, FALSE, 0 }, + { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 12, FALSE, VARIABLE_ENTRY_SIZE / 2 }, + { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 12, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 2, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 0, + /* insert_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 0, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 3, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 1, + /* insert_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 0, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ FALSE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 4, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 10, + /* insert_flag = */ FALSE, + /* flags = */ H5C__DIRTIED_FLAG, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 1, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__DIRTY, PICO_ENTRY_TYPE, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 5, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 20, + /* insert_flag = */ FALSE, + /* flags = */ H5C__DIRTIED_FLAG, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 1, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__DIRTY, PICO_ENTRY_TYPE, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + } + }; + int check_size = 4; + struct fo_flush_entry_check checks[4] = + { + { + /* entry_num = */ 0, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 0, + /* expected_size = */ VARIABLE_ENTRY_SIZE / 4, + /* in_cache = */ TRUE, + /* at_main_addr = */ FALSE, + /* is_dirty = */ FALSE, + /* is_protected = */ FALSE, + /* is_pinned = */ FALSE, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 1, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 2, + /* expected_size = */ VARIABLE_ENTRY_SIZE / 2, + /* in_cache = */ TRUE, + /* at_main_addr = */ FALSE, + /* is_dirty = */ FALSE, + /* is_protected = */ FALSE, + /* is_pinned = */ FALSE, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 2, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 10, + /* expected_size = */ VARIABLE_ENTRY_SIZE / 4, + /* in_cache = */ TRUE, + /* at_main_addr = */ FALSE, + /* is_dirty = */ FALSE, + /* is_protected = */ FALSE, + /* is_pinned = */ FALSE, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 3, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 12, + /* expected_size = */ VARIABLE_ENTRY_SIZE / 2, + /* in_cache = */ TRUE, + /* at_main_addr = */ FALSE, + /* is_dirty = */ FALSE, + /* is_protected = */ FALSE, + /* is_pinned = */ FALSE, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + } + }; + + check_flush_cache__flush_op_test(file_ptr, + test_num, + flush_flags, + spec_size, + spec, + init_expected_index_len, + init_expected_index_size, + expected_index_len, + expected_index_size, + check_size, + checks); + reset_entries(); + } + + if ( pass ) /* test #23 */ + { + /* Repeat test #23 with the flush invalidate flag set. + * + * Mix things up some more. + * + * Load lots of entries, some of which have flush functions that + * resize, dirty, and rename two entries that are not in the + * cache. + * + * Also load entries that have flush ops on entries that are in + * cache. + */ + int test_num = 23; + unsigned int flush_flags = H5C__FLUSH_INVALIDATE_FLAG; + int spec_size = 6; + int init_expected_index_len = 6; + size_t init_expected_index_size = (2 * VARIABLE_ENTRY_SIZE) + (4 * PICO_ENTRY_SIZE); + int expected_index_len = 0; + size_t expected_index_size = 0; + struct fo_flush_cache_test_spec spec[6] = + { + { + /* entry_num = */ 0, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 1, + /* insert_flag = */ FALSE, + /* flags = */ H5C__DIRTIED_FLAG, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 6, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 0, FALSE, VARIABLE_ENTRY_SIZE / 4 }, + { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 0, FALSE, 0 }, + { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 0, FALSE, 0 }, + { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 2, FALSE, 0 }, + { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 2, FALSE, VARIABLE_ENTRY_SIZE / 2 }, + { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 2, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 1, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 11, + /* insert_flag = */ FALSE, + /* flags = */ H5C__DIRTIED_FLAG, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 6, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 10, FALSE, VARIABLE_ENTRY_SIZE / 4 }, + { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 10, FALSE, 0 }, + { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 10, FALSE, 0 }, + { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 12, FALSE, 0 }, + { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 12, FALSE, VARIABLE_ENTRY_SIZE / 2 }, + { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 12, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 2, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 0, + /* insert_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 0, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 3, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 1, + /* insert_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 0, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ FALSE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 4, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 10, + /* insert_flag = */ FALSE, + /* flags = */ H5C__DIRTIED_FLAG, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 1, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__DIRTY, PICO_ENTRY_TYPE, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 5, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 20, + /* insert_flag = */ FALSE, + /* flags = */ H5C__DIRTIED_FLAG, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 1, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__DIRTY, PICO_ENTRY_TYPE, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ TRUE + } + }; + int check_size = 4; + struct fo_flush_entry_check checks[4] = + { + { + /* entry_num = */ 0, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 0, + /* expected_size = */ VARIABLE_ENTRY_SIZE / 4, + /* in_cache = */ FALSE, + /* at_main_addr = */ FALSE, + /* is_dirty = */ FALSE, + /* is_protected = */ FALSE, + /* is_pinned = */ FALSE, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 1, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 2, + /* expected_size = */ VARIABLE_ENTRY_SIZE / 2, + /* in_cache = */ FALSE, + /* at_main_addr = */ FALSE, + /* is_dirty = */ FALSE, + /* is_protected = */ FALSE, + /* is_pinned = */ FALSE, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 2, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 10, + /* expected_size = */ VARIABLE_ENTRY_SIZE / 4, + /* in_cache = */ FALSE, + /* at_main_addr = */ FALSE, + /* is_dirty = */ FALSE, + /* is_protected = */ FALSE, + /* is_pinned = */ FALSE, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 3, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 12, + /* expected_size = */ VARIABLE_ENTRY_SIZE / 2, + /* in_cache = */ FALSE, + /* at_main_addr = */ FALSE, + /* is_dirty = */ FALSE, + /* is_protected = */ FALSE, + /* is_pinned = */ FALSE, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ TRUE + } + }; + + check_flush_cache__flush_op_test(file_ptr, + test_num, + flush_flags, + spec_size, + spec, + init_expected_index_len, + init_expected_index_size, + expected_index_len, + expected_index_size, + check_size, + checks); + reset_entries(); + } + + /* So much for tests involving only flush operations. + * + * Now create some tests mixing flush ops and pins. + */ + if ( pass ) /* test #24 */ + { + /* Pico entries 50 and 150 pin pico entry 100, and also dirty + * pico entry 100 on flush. + */ + int test_num = 24; + unsigned int flush_flags = H5C__NO_FLAGS_SET; + int spec_size = 3; + int init_expected_index_len = 3; + size_t init_expected_index_size = 3 * PICO_ENTRY_SIZE; + int expected_index_len = 3; + size_t expected_index_size = 3 * PICO_ENTRY_SIZE; + struct fo_flush_cache_test_spec spec[3] = + { + { + /* entry_num = */ 0, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 100, + /* insert_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 0, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 1, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 50, + /* insert_flag = */ FALSE, + /* flags = */ H5C__DIRTIED_FLAG, + /* new_size = */ 0, + /* num_pins = */ 1, + /* pin_type = */ {PICO_ENTRY_TYPE, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {100, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 1, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__DIRTY, PICO_ENTRY_TYPE, 100, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 2, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 150, + /* insert_flag = */ TRUE, + /* flags = */ H5C__NO_FLAGS_SET, + /* new_size = */ 0, + /* num_pins = */ 1, + /* pin_type = */ {PICO_ENTRY_TYPE, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {100, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 1, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__DIRTY, PICO_ENTRY_TYPE, 100, FALSE, 0 }, + { FLUSH_OP__DIRTY, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + } + }; + int check_size = 0; + struct fo_flush_entry_check checks[1] = + { + { + /* entry_num = */ 0, + /* entry_type = */ 0, + /* entry_index = */ 0, + /* expected_size = */ (size_t)0, + /* in_cache = */ FALSE, + /* at_main_addr = */ FALSE, + /* is_dirty = */ FALSE, + /* is_protected = */ FALSE, + /* is_pinned = */ FALSE, + /* expected_loaded = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ FALSE, + /* expected_destroyed = */ FALSE + } + }; + + check_flush_cache__flush_op_test(file_ptr, + test_num, + flush_flags, + spec_size, + spec, + init_expected_index_len, + init_expected_index_size, + expected_index_len, + expected_index_size, + check_size, + checks); + } + + if ( pass ) /* test #25 */ + { + /* Repeat the previous test with the flush invalidate flag. + * + * Pico entries 50 and 150 pin pico entry 100, and also dirty + * pico entry 100 on flush. + */ + int test_num = 25; + unsigned int flush_flags = H5C__FLUSH_INVALIDATE_FLAG; + int spec_size = 3; + int init_expected_index_len = 3; + size_t init_expected_index_size = 3 * PICO_ENTRY_SIZE; + int expected_index_len = 0; + size_t expected_index_size = (size_t)0; + struct fo_flush_cache_test_spec spec[3] = + { + { + /* entry_num = */ 0, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 100, + /* insert_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 0, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 1, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 50, + /* insert_flag = */ FALSE, + /* flags = */ H5C__DIRTIED_FLAG, + /* new_size = */ 0, + /* num_pins = */ 1, + /* pin_type = */ {PICO_ENTRY_TYPE, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {100, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 1, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__DIRTY, PICO_ENTRY_TYPE, 100, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 2, + /* entry_type = */ PICO_ENTRY_TYPE, + /* entry_index = */ 150, + /* insert_flag = */ TRUE, + /* flags = */ H5C__NO_FLAGS_SET, + /* new_size = */ 0, + /* num_pins = */ 1, + /* pin_type = */ {PICO_ENTRY_TYPE, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {100, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 1, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__DIRTY, PICO_ENTRY_TYPE, 100, FALSE, 0 }, + { FLUSH_OP__DIRTY, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ TRUE + } + }; + int check_size = 0; + struct fo_flush_entry_check checks[1] = + { + { + /* entry_num = */ 0, + /* entry_type = */ 0, + /* entry_index = */ 0, + /* expected_size = */ (size_t)0, + /* in_cache = */ FALSE, + /* at_main_addr = */ FALSE, + /* is_dirty = */ FALSE, + /* is_protected = */ FALSE, + /* is_pinned = */ FALSE, + /* expected_loaded = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ FALSE, + /* expected_destroyed = */ FALSE + } + }; + + check_flush_cache__flush_op_test(file_ptr, + test_num, + flush_flags, + spec_size, + spec, + init_expected_index_len, + init_expected_index_size, + expected_index_len, + expected_index_size, + check_size, + checks); + } + + if ( pass ) /* test #26 */ + { + /* This one is complex. + * + * In the following overvies table, VET stands for + * VARIABLE_ENTRY_TYPE. + * + * In trying to follow what happens when we flush the + * set of entries constructed below, recall that each + * flush operation is executed the first time the + * entry is flushed, and then not executed again. + * This may be a weakness in the tests, but that + * is the way it is for now. + * + * After thinking about it for a while, I'm not sure that + * the interaction between pins and flush operations needs + * all that much testing, as the two are essentially + * orthoginal. Thus this is a bit of a smoke check to + * verify that we get the expected results. + * + * (VET, 100) initially not resident in cache + * + * (VET, 200) initially clean and resident in cache + * + * (VET, 300) initially not resident in cache + * + * (VET, 2100) initially clean and resident in cache + * + * (VET, 2200) initially not resident in cache + * + * (VET, 2300) initially clean and resident in cache + * + * (VET, 1000) initially clean, and in cache + * dirties (VET, 100) + * resizes (VET, 200) + * dirty (VET, 300) -- dirty first to bring into cache. + * renames (VET, 300) + * + * (VET, 2000) initially clean, and in cache + * dirties (VET, 2100) + * resizes (VET, 2200) + * renames (VET, 2300) + * + * (VET, 350) initially clean, and in cache + * pins (VET, 1000) + * dirties (VET, 1000) + * resizes (VET, 350) + * pins (VET, 2000) + * dirties (VET, 2000) + * + * (VET, 450) initially dirty, and in cache + * pins (VET, 1000) + * dirties (VET, 1000) + * renames (VET, 450) + * pins (VET, 2000) + * dirties (VET, 2000) + * + * (VET, 650) initially clean, and in cache + * pins (VET, 1000) + * dirties (VET, 1000) + * resizes (VET, 650) + * pins (VET, 2000) + * dirties (VET, 2000) + * + * (VET, 750) initially dirty, and in cache + * pins (VET, 1000) + * dirties (VET, 1000) + * resizes (VET, 750) + * pins (VET, 2000) + * dirties (VET, 2000) + * + * (VET, 500) initially dirty, and in cache + * dirties (VET, 350) + * dirties (VET, 450) + * dirties (VET, 650) + * dirties (VET, 750) + */ + int test_num = 26; + unsigned int flush_flags = H5C__NO_FLAGS_SET; + int spec_size = 10; + int init_expected_index_len = 10; + size_t init_expected_index_size = 10 * VARIABLE_ENTRY_SIZE; + int expected_index_len = 13; + size_t expected_index_size = 9 * VARIABLE_ENTRY_SIZE; + struct fo_flush_cache_test_spec spec[10] = + { + { + /* entry_num = */ 0, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 200, + /* insert_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 0, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 1, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 2100, + /* insert_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 0, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 2, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 2300, + /* insert_flag = */ TRUE, + /* flags = */ H5C__NO_FLAGS_SET, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 0, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 3, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 1000, + /* insert_flag = */ TRUE, + /* flags = */ H5C__NO_FLAGS_SET, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 4, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 100, FALSE, 0 }, + { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 200, FALSE, VARIABLE_ENTRY_SIZE / 2 }, + { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 300, FALSE, 0 }, + { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 300, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 4, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 2000, + /* insert_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 3, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 2100, FALSE, 0 }, + { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 2200, FALSE, VARIABLE_ENTRY_SIZE / 2 }, + { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 2300, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 5, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 350, + /* insert_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* new_size = */ 0, + /* num_pins = */ 2, + /* pin_type = */ {VARIABLE_ENTRY_TYPE, VARIABLE_ENTRY_TYPE, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {1000, 2000, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 3, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 1000, FALSE, 0 }, + { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 2000, FALSE, 0 }, + { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 350, FALSE, VARIABLE_ENTRY_SIZE / 4 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 6, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 450, + /* insert_flag = */ FALSE, + /* flags = */ H5C__DIRTIED_FLAG, + /* new_size = */ 0, + /* num_pins = */ 2, + /* pin_type = */ {VARIABLE_ENTRY_TYPE, VARIABLE_ENTRY_TYPE, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {1000, 2000, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 3, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 1000, FALSE, 0 }, + { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 2000, FALSE, 0 }, + { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 450, FALSE, VARIABLE_ENTRY_SIZE / 4 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 7, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 650, + /* insert_flag = */ TRUE, + /* flags = */ H5C__NO_FLAGS_SET, + /* new_size = */ 0, + /* num_pins = */ 2, + /* pin_type = */ {VARIABLE_ENTRY_TYPE, VARIABLE_ENTRY_TYPE, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {1000, 2000, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 3, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 1000, FALSE, 0 }, + { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 2000, FALSE, 0 }, + { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 650, FALSE, VARIABLE_ENTRY_SIZE / 4 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 8, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 750, + /* insert_flag = */ FALSE, + /* flags = */ H5C__DIRTIED_FLAG, + /* new_size = */ 0, + /* num_pins = */ 2, + /* pin_type = */ {VARIABLE_ENTRY_TYPE, VARIABLE_ENTRY_TYPE, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {1000, 2000, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 3, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 1000, FALSE, 0 }, + { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 2000, FALSE, 0 }, + { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 750, FALSE, VARIABLE_ENTRY_SIZE / 4 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 9, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 500, + /* insert_flag = */ FALSE, + /* flags = */ H5C__DIRTIED_FLAG, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 4, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 350, FALSE, 0 }, + { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 450, FALSE, 0 }, + { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 650, FALSE, 0 }, + { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 750, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + } + }; + int check_size = 3; + struct fo_flush_entry_check checks[3] = + { + { + /* entry_num = */ 0, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 100, + /* expected_size = */ VARIABLE_ENTRY_SIZE, + /* in_cache = */ TRUE, + /* at_main_addr = */ TRUE, + /* is_dirty = */ FALSE, + /* is_protected = */ FALSE, + /* is_pinned = */ FALSE, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 1, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 300, + /* expected_size = */ VARIABLE_ENTRY_SIZE, + /* in_cache = */ TRUE, + /* at_main_addr = */ FALSE, + /* is_dirty = */ FALSE, + /* is_protected = */ FALSE, + /* is_pinned = */ FALSE, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 2, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 2200, + /* expected_size = */ VARIABLE_ENTRY_SIZE / 2, + /* in_cache = */ TRUE, + /* at_main_addr = */ TRUE, + /* is_dirty = */ FALSE, + /* is_protected = */ FALSE, + /* is_pinned = */ FALSE, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + } + + }; + + check_flush_cache__flush_op_test(file_ptr, + test_num, + flush_flags, + spec_size, + spec, + init_expected_index_len, + init_expected_index_size, + expected_index_len, + expected_index_size, + check_size, + checks); + + reset_entries(); + } + + if ( pass ) /* test #27 */ + { + /* Repeat test #26 with the flush invalidate flag. + * + * In the following overview table, VET stands for + * VARIABLE_ENTRY_TYPE. + * + * In trying to follow what happens when we flush the + * set of entries constructed below, recall that each + * flush operation is executed the first time the + * entry is flushed, and then not executed again. + * This may be a weakness in the tests, but that + * is the way it is for now. + * + * After thinking about it for a while, I'm not sure that + * the interaction between pins and flush operations needs + * all that much testing, as the two are essentially + * orthoginal. The big thing is to verify that flushes of + * pinned entries with flush ops result in the expected + * updates of the cache. + * + * Thus this is a bit of a smoke check to * verify that we + * get the expected results. + * + * (VET, 100) initially not resident in cache + * + * (VET, 200) initially clean and resident in cache + * + * (VET, 300) initially not resident in cache + * + * (VET, 2100) initially clean and resident in cache + * + * (VET, 2200) initially not resident in cache + * + * (VET, 2300) initially clean and resident in cache + * + * (VET, 1000) initially clean, and in cache + * dirties (VET, 100) + * resizes (VET, 200) + * dirty (VET, 300) -- dirty first to bring into cache. + * renames (VET, 300) + * + * (VET, 2000) initially clean, and in cache + * dirties (VET, 2100) + * resizes (VET, 2200) + * renames (VET, 2300) + * + * (VET, 350) initially clean, and in cache + * pins (VET, 1000) + * dirties (VET, 1000) + * resizes (VET, 350) + * pins (VET, 2000) + * dirties (VET, 2000) + * + * (VET, 450) initially dirty, and in cache + * pins (VET, 1000) + * dirties (VET, 1000) + * renames (VET, 450) + * pins (VET, 2000) + * dirties (VET, 2000) + * + * (VET, 650) initially clean, and in cache + * pins (VET, 1000) + * dirties (VET, 1000) + * resizes (VET, 650) + * pins (VET, 2000) + * dirties (VET, 2000) + * + * (VET, 750) initially dirty, and in cache + * pins (VET, 1000) + * dirties (VET, 1000) + * resizes (VET, 750) + * pins (VET, 2000) + * dirties (VET, 2000) + * + * (VET, 500) initially dirty, and in cache + * dirties (VET, 350) + * dirties (VET, 450) + * dirties (VET, 650) + * dirties (VET, 750) + */ + int test_num = 27; + unsigned int flush_flags = H5C__FLUSH_INVALIDATE_FLAG; + int spec_size = 10; + int init_expected_index_len = 10; + size_t init_expected_index_size = 10 * VARIABLE_ENTRY_SIZE; + int expected_index_len = 0; + size_t expected_index_size = (size_t)0; + struct fo_flush_cache_test_spec spec[10] = + { + { + /* entry_num = */ 0, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 200, + /* insert_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 0, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 1, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 2100, + /* insert_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 0, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 2, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 2300, + /* insert_flag = */ TRUE, + /* flags = */ H5C__NO_FLAGS_SET, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 0, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 3, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 1000, + /* insert_flag = */ TRUE, + /* flags = */ H5C__NO_FLAGS_SET, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 4, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 100, FALSE, 0 }, + { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 200, FALSE, VARIABLE_ENTRY_SIZE / 2 }, + { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 300, FALSE, 0 }, + { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 300, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 4, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 2000, + /* insert_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 3, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 2100, FALSE, 0 }, + { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 2200, FALSE, VARIABLE_ENTRY_SIZE / 2 }, + { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 2300, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 5, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 350, + /* insert_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* new_size = */ 0, + /* num_pins = */ 2, + /* pin_type = */ {VARIABLE_ENTRY_TYPE, VARIABLE_ENTRY_TYPE, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {1000, 2000, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 3, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 1000, FALSE, 0 }, + { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 2000, FALSE, 0 }, + { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 350, FALSE, VARIABLE_ENTRY_SIZE / 4 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 6, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 450, + /* insert_flag = */ FALSE, + /* flags = */ H5C__DIRTIED_FLAG, + /* new_size = */ 0, + /* num_pins = */ 2, + /* pin_type = */ {VARIABLE_ENTRY_TYPE, VARIABLE_ENTRY_TYPE, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {1000, 2000, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 3, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 1000, FALSE, 0 }, + { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 2000, FALSE, 0 }, + { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 450, FALSE, VARIABLE_ENTRY_SIZE / 4 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 7, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 650, + /* insert_flag = */ TRUE, + /* flags = */ H5C__NO_FLAGS_SET, + /* new_size = */ 0, + /* num_pins = */ 2, + /* pin_type = */ {VARIABLE_ENTRY_TYPE, VARIABLE_ENTRY_TYPE, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {1000, 2000, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 3, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 1000, FALSE, 0 }, + { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 2000, FALSE, 0 }, + { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 650, FALSE, VARIABLE_ENTRY_SIZE / 4 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 8, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 750, + /* insert_flag = */ FALSE, + /* flags = */ H5C__DIRTIED_FLAG, + /* new_size = */ 0, + /* num_pins = */ 2, + /* pin_type = */ {VARIABLE_ENTRY_TYPE, VARIABLE_ENTRY_TYPE, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {1000, 2000, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 3, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 1000, FALSE, 0 }, + { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 2000, FALSE, 0 }, + { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 750, FALSE, VARIABLE_ENTRY_SIZE / 4 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 9, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 500, + /* insert_flag = */ FALSE, + /* flags = */ H5C__DIRTIED_FLAG, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 4, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 350, FALSE, 0 }, + { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 450, FALSE, 0 }, + { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 650, FALSE, 0 }, + { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 750, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ TRUE + } + }; + int check_size = 3; + struct fo_flush_entry_check checks[3] = + { + { + /* entry_num = */ 0, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 100, + /* expected_size = */ VARIABLE_ENTRY_SIZE, + /* in_cache = */ FALSE, + /* at_main_addr = */ TRUE, + /* is_dirty = */ FALSE, + /* is_protected = */ FALSE, + /* is_pinned = */ FALSE, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 1, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 300, + /* expected_size = */ VARIABLE_ENTRY_SIZE, + /* in_cache = */ FALSE, + /* at_main_addr = */ FALSE, + /* is_dirty = */ FALSE, + /* is_protected = */ FALSE, + /* is_pinned = */ FALSE, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 2, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 2200, + /* expected_size = */ VARIABLE_ENTRY_SIZE / 2, + /* in_cache = */ FALSE, + /* at_main_addr = */ TRUE, + /* is_dirty = */ FALSE, + /* is_protected = */ FALSE, + /* is_pinned = */ FALSE, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ TRUE + } + + }; + + check_flush_cache__flush_op_test(file_ptr, + test_num, + flush_flags, + spec_size, + spec, + init_expected_index_len, + init_expected_index_size, + expected_index_len, + expected_index_size, + check_size, + checks); + + reset_entries(); + } + + if ( pass ) /* test #28 */ + { + /* Test the expected fheap case, in which an entry dirties + * and resizes itself, and dirties an entry which it has + * pinned. + */ + int test_num = 28; + unsigned int flush_flags = H5C__NO_FLAGS_SET; + int spec_size = 5; + int init_expected_index_len = 5; + size_t init_expected_index_size = 3 * VARIABLE_ENTRY_SIZE; + int expected_index_len = 5; + size_t expected_index_size = 4 * VARIABLE_ENTRY_SIZE; + struct fo_flush_cache_test_spec spec[5] = + { + { + /* entry_num = */ 0, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 100, + /* insert_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 0, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 1, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 200, + /* insert_flag = */ FALSE, + /* flags = */ H5C__DIRTIED_FLAG | H5C__SIZE_CHANGED_FLAG, + /* new_size = */ VARIABLE_ENTRY_SIZE / 2, + /* num_pins = */ 1, + /* pin_type = */ {VARIABLE_ENTRY_TYPE, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {100, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 3, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 100, FALSE, 0 }, + { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 200, FALSE, VARIABLE_ENTRY_SIZE }, + { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 200, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 2, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 300, + /* insert_flag = */ FALSE, + /* flags = */ H5C__DIRTIED_FLAG | H5C__SIZE_CHANGED_FLAG, + /* new_size = */ VARIABLE_ENTRY_SIZE / 4, + /* num_pins = */ 1, + /* pin_type = */ {VARIABLE_ENTRY_TYPE, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {400, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 3, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 400, FALSE, 0 }, + { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 300, FALSE, VARIABLE_ENTRY_SIZE / 2 }, + { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 300, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 3, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 400, + /* insert_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 0, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + }, + { + /* entry_num = */ 4, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 500, + /* insert_flag = */ FALSE, + /* flags = */ H5C__DIRTIED_FLAG | H5C__SIZE_CHANGED_FLAG, + /* new_size = */ VARIABLE_ENTRY_SIZE / 4, + /* num_pins = */ 1, + /* pin_type = */ {VARIABLE_ENTRY_TYPE, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {100, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 3, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 100, FALSE, 0 }, + { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 500, FALSE, VARIABLE_ENTRY_SIZE / 2 }, + { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 500, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ FALSE + } + }; + int check_size = 0; + struct fo_flush_entry_check checks[1] = + { + { + /* entry_num = */ 0, + /* entry_type = */ 0, + /* entry_index = */ 0, + /* expected_size = */ 0, + /* in_cache = */ FALSE, + /* at_main_addr = */ FALSE, + /* is_dirty = */ FALSE, + /* is_protected = */ FALSE, + /* is_pinned = */ FALSE, + /* expected_loaded = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ FALSE, + /* expected_destroyed = */ FALSE + } + }; + + check_flush_cache__flush_op_test(file_ptr, + test_num, + flush_flags, + spec_size, + spec, + init_expected_index_len, + init_expected_index_size, + expected_index_len, + expected_index_size, + check_size, + checks); + + reset_entries(); + } + + if ( pass ) /* test #29 */ + { + /* Repeat test #28 with the flush invalidate flag. + * + * Test the expected fheap case, in which an entry dirties + * and resizes itself, and dirties an entry which it has + * pinned. + */ + int test_num = 29; + unsigned int flush_flags = H5C__FLUSH_INVALIDATE_FLAG; + int spec_size = 5; + int init_expected_index_len = 5; + size_t init_expected_index_size = 3 * VARIABLE_ENTRY_SIZE; + int expected_index_len = 0; + size_t expected_index_size = 0; + struct fo_flush_cache_test_spec spec[5] = + { + { + /* entry_num = */ 0, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 100, + /* insert_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 0, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 1, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 200, + /* insert_flag = */ FALSE, + /* flags = */ H5C__DIRTIED_FLAG | H5C__SIZE_CHANGED_FLAG, + /* new_size = */ VARIABLE_ENTRY_SIZE / 2, + /* num_pins = */ 1, + /* pin_type = */ {VARIABLE_ENTRY_TYPE, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {100, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 3, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 100, FALSE, 0 }, + { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 200, FALSE, VARIABLE_ENTRY_SIZE }, + { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 200, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 2, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 300, + /* insert_flag = */ FALSE, + /* flags = */ H5C__DIRTIED_FLAG | H5C__SIZE_CHANGED_FLAG, + /* new_size = */ VARIABLE_ENTRY_SIZE / 4, + /* num_pins = */ 1, + /* pin_type = */ {VARIABLE_ENTRY_TYPE, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {400, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 3, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 400, FALSE, 0 }, + { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 300, FALSE, VARIABLE_ENTRY_SIZE / 2 }, + { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 300, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 3, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 400, + /* insert_flag = */ FALSE, + /* flags = */ H5C__NO_FLAGS_SET, + /* new_size = */ 0, + /* num_pins = */ 0, + /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 0, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ TRUE + }, + { + /* entry_num = */ 4, + /* entry_type = */ VARIABLE_ENTRY_TYPE, + /* entry_index = */ 500, + /* insert_flag = */ FALSE, + /* flags = */ H5C__DIRTIED_FLAG | H5C__SIZE_CHANGED_FLAG, + /* new_size = */ VARIABLE_ENTRY_SIZE / 4, + /* num_pins = */ 1, + /* pin_type = */ {VARIABLE_ENTRY_TYPE, 0, 0, 0, 0, 0, 0, 0}, + /* pin_idx = */ {100, 0, 0, 0, 0, 0, 0, 0}, + /* num_flush_ops = */ 3, + /* flush_ops = */ + /* op_code: type: idx: flag: size: */ + { { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 100, FALSE, 0 }, + { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 500, FALSE, VARIABLE_ENTRY_SIZE / 2 }, + { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 500, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, + { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, + /* expected_loaded = */ TRUE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ TRUE, + /* expected_destroyed = */ TRUE + } + }; + int check_size = 0; + struct fo_flush_entry_check checks[1] = + { + { + /* entry_num = */ 0, + /* entry_type = */ 0, + /* entry_index = */ 0, + /* expected_size = */ 0, + /* in_cache = */ FALSE, + /* at_main_addr = */ FALSE, + /* is_dirty = */ FALSE, + /* is_protected = */ FALSE, + /* is_pinned = */ FALSE, + /* expected_loaded = */ FALSE, + /* expected_cleared = */ FALSE, + /* expected_flushed = */ FALSE, + /* expected_destroyed = */ FALSE + } + }; + + check_flush_cache__flush_op_test(file_ptr, + test_num, + flush_flags, + spec_size, + spec, + init_expected_index_len, + init_expected_index_size, + expected_index_len, + expected_index_size, + check_size, + checks); + + reset_entries(); + } + + /* finally finish up with the flush ops eviction test */ + check_flush_cache__flush_op_eviction_test(file_ptr); + + return; + +} /* check_flush_cache__flush_ops() */ + + +/*------------------------------------------------------------------------- + * Function: check_flush_cache__flush_op_test() + * + * Purpose: Run a flush op flush cache test. Of the nature of + * flush operations, this is a multi-entry test. + * + * Return: void + * + * Programmer: John Mainzer + * 9/3/06 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +static void +check_flush_cache__flush_op_test(H5F_t * file_ptr, + int test_num, + unsigned int flush_flags, + int spec_size, + struct fo_flush_cache_test_spec spec[], + int init_expected_index_len, + size_t init_expected_index_size, + int expected_index_len, + size_t expected_index_size, + int check_size, + struct fo_flush_entry_check check[]) +{ + /* const char * fcn_name = "check_flush_cache__flush_op_test"; */ + H5C_t * cache_ptr = file_ptr->shared->cache; + static char msg[128]; + herr_t result; + int i; + int j; + test_entry_t * base_addr; + test_entry_t * entry_ptr; + +#if 0 /* This is useful debugging code -- lets keep it around. */ + HDfprintf(stdout, "check_flush_cache__flush_op_test: test %d\n", + test_num); +#endif + + if ( cache_ptr == NULL ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "cache_ptr NULL on entry to flush op test #%d.", + test_num); + failure_mssg = msg; + } + else if ( ( cache_ptr->index_len != 0 ) || + ( cache_ptr->index_size != 0 ) ) { + + pass = FALSE; + + HDsnprintf(msg, (size_t)128, + "cache not empty at beginning of flush op test #%d.", + test_num); + failure_mssg = msg; + } + else if ( ( spec_size < 1 ) || ( spec == NULL ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "missing/bad test spec on entry to flush op test #%d.", + test_num); + failure_mssg = msg; + } + + i = 0; + while ( ( pass ) && ( i < spec_size ) ) + { + if ( ( spec[i].entry_num != i ) || + ( spec[i].entry_type < 0 ) || + ( spec[i].entry_type >= NUMBER_OF_ENTRY_TYPES ) || + ( spec[i].entry_index < 0 ) || + ( spec[i].entry_index > max_indices[spec[i].entry_type] ) || + ( spec[i].num_pins < 0 ) || + ( spec[i].num_pins > MAX_PINS ) || + ( spec[i].num_flush_ops < 0 ) || + ( spec[i].num_flush_ops > MAX_FLUSH_OPS ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "bad data in spec[%d] on entry to flush op test #%d.", + i, test_num); + failure_mssg = msg; + } + i++; + } + + i = 0; + while ( ( pass ) && ( i < check_size ) ) + { + if ( ( check[i].entry_num != i ) || + ( check[i].entry_type < 0 ) || + ( check[i].entry_type >= NUMBER_OF_ENTRY_TYPES ) || + ( check[i].entry_index < 0 ) || + ( check[i].entry_index > max_indices[check[i].entry_type] ) || + ( check[i].expected_size <= (size_t)0 ) || + ( ( check[i].in_cache != TRUE ) && + ( check[i].in_cache != FALSE ) ) || + ( ( check[i].at_main_addr != TRUE ) && + ( check[i].at_main_addr != FALSE ) ) || + ( ( check[i].is_dirty != TRUE ) && + ( check[i].is_dirty != FALSE ) ) || + ( ( check[i].is_protected != TRUE ) && + ( check[i].is_protected != FALSE ) ) || + ( ( check[i].is_pinned != TRUE ) && + ( check[i].is_pinned != FALSE ) ) || + ( ( check[i].expected_deserialized != TRUE ) && + ( check[i].expected_deserialized != FALSE ) ) || + ( ( check[i].expected_cleared != TRUE ) && + ( check[i].expected_cleared != FALSE ) ) || + ( ( check[i].expected_serialized != TRUE ) && + ( check[i].expected_serialized != FALSE ) ) || + ( ( check[i].expected_destroyed != TRUE ) && + ( check[i].expected_destroyed != FALSE ) ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "bad data in check[%d] on entry to flush op test #%d.", + i, test_num); + failure_mssg = msg; + } + i++; + } + + i = 0; + while ( ( pass ) && ( i < spec_size ) ) + { + if ( spec[i].insert_flag ) { + + insert_entry(file_ptr, spec[i].entry_type, spec[i].entry_index, + TRUE, spec[i].flags); + + } else { + + protect_entry(file_ptr, spec[i].entry_type, spec[i].entry_index); + + unprotect_entry_with_size_change(file_ptr, spec[i].entry_type, + spec[i].entry_index, + spec[i].flags, spec[i].new_size); + } + + for ( j = 0; j < spec[i].num_pins; j++ ) + { + create_pinned_entry_dependency(file_ptr, + spec[i].entry_type, + spec[i].entry_index, + spec[i].pin_type[j], + spec[i].pin_idx[j]); + } + + for ( j = 0; j < spec[i].num_flush_ops; j++ ) + { + add_flush_op(spec[i].entry_type, + spec[i].entry_index, + spec[i].flush_ops[j].op_code, + spec[i].flush_ops[j].type, + spec[i].flush_ops[j].idx, + spec[i].flush_ops[j].flag, + spec[i].flush_ops[j].size); + } + + i++; + } + + if ( pass ) { + + if ( ( cache_ptr->index_len != init_expected_index_len ) || + ( cache_ptr->index_size != init_expected_index_size ) ) { + + pass = FALSE; + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "Unexpected cache len/size before flush in flush op test #%d.", + test_num); + failure_mssg = msg; + } + } + + if ( pass ) { + + result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, flush_flags); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "flush with flags 0x%x failed in flush op test #%d.", + flush_flags, test_num); + failure_mssg = msg; + } + } + + + i = 0; + while ( ( pass ) && ( i < spec_size ) ) + { + base_addr = entries[spec[i].entry_type]; + entry_ptr = &(base_addr[spec[i].entry_index]); + +#ifndef NDEBUG + /* The clear_dirty_bits() callback is only called in debug mode -- + * thus we can only do our full test on the expected entry history + * when debug is enabled. + */ + if ( ( entry_ptr->deserialized != spec[i].expected_deserialized ) || + ( entry_ptr->cleared != spec[i].expected_cleared ) || + ( entry_ptr->serialized != spec[i].expected_serialized ) || + ( entry_ptr->destroyed != spec[i].expected_destroyed ) ) { +#else + /* When in procduction mode, the clear_dirty_bits() callback is + * not called, so entry_ptr->cleared should never be set. + */ + if ( ( entry_ptr->deserialized != spec[i].expected_deserialized ) || + ( entry_ptr->cleared ) || + ( entry_ptr->serialized != spec[i].expected_serialized ) || + ( entry_ptr->destroyed != spec[i].expected_destroyed ) ) { +#endif /* NDEBUG */ + +#if 0 /* This is useful debugging code. Lets keep it around. */ + + HDfprintf(stdout, + "desrlzd = %d(%d), clrd = %d(%d), srlzd = %d(%d), dest = %d(%d)\n", + (int)(entry_ptr->deserialized), + (int)(spec[i].expected_deserialized), + (int)(entry_ptr->cleared), + (int)(spec[i].expected_cleared), + (int)(entry_ptr->serialized), + (int)(spec[i].expected_serialized), + (int)(entry_ptr->destroyed), + (int)(spec[i].expected_destroyed)); + + HDfprintf(stdout, "entry_ptr->header.is_dirty = %d\n", + (int)(entry_ptr->header.is_dirty)); +#endif + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "Bad status on entry %d after flush op test #%d.", + i, test_num); + failure_mssg = msg; + } + i++; + } + + if ( pass ) { + + i = 0; + while ( ( pass ) && ( i < check_size ) ) + { + if ( check[i].in_cache != entry_in_cache(cache_ptr, + check[i].entry_type, + check[i].entry_index) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "Check1 failed on entry %d after flush op test #%d.", + i, test_num); + failure_mssg = msg; + } + + base_addr = entries[check[i].entry_type]; + entry_ptr = &(base_addr[check[i].entry_index]); + +#ifndef NDEBUG + /* The clear_dirty_bits() callback is only called in debug mode -- + * thus we can only do our full test on the expected entry status + * and histry when debug is enabled. + */ + if ( ( entry_ptr->size != check[i].expected_size ) || + ( ( ! entry_ptr->header.destroy_in_progress ) && + ( check[i].in_cache ) && + ( entry_ptr->header.size != check[i].expected_size ) ) || + ( entry_ptr->at_main_addr != check[i].at_main_addr ) || + ( entry_ptr->is_dirty != check[i].is_dirty ) || + ( entry_ptr->header.is_dirty != check[i].is_dirty ) || + ( entry_ptr->is_protected != check[i].is_protected ) || + ( entry_ptr->header.is_protected != check[i].is_protected ) || + ( entry_ptr->is_pinned != check[i].is_pinned ) || + ( entry_ptr->header.is_pinned != check[i].is_pinned ) || + ( entry_ptr->deserialized != + check[i].expected_deserialized ) || + ( entry_ptr->cleared != check[i].expected_cleared ) || + ( entry_ptr->serialized != check[i].expected_serialized ) || + ( entry_ptr->destroyed != check[i].expected_destroyed ) ) { +#else + /* When in procduction mode, the clear_dirty_bits() callback is + * not called, so entry_ptr->cleared should never be set. + */ + if ( ( entry_ptr->size != check[i].expected_size ) || + ( ( ! entry_ptr->header.destroy_in_progress ) && + ( check[i].in_cache ) && + ( entry_ptr->header.size != check[i].expected_size ) ) || + ( entry_ptr->at_main_addr != check[i].at_main_addr ) || + ( entry_ptr->is_dirty != check[i].is_dirty ) || + ( entry_ptr->header.is_dirty != check[i].is_dirty ) || + ( entry_ptr->is_protected != check[i].is_protected ) || + ( entry_ptr->header.is_protected != check[i].is_protected ) || + ( entry_ptr->is_pinned != check[i].is_pinned ) || + ( entry_ptr->header.is_pinned != check[i].is_pinned ) || + ( entry_ptr->deserialized != + check[i].expected_deserialized ) || + ( entry_ptr->cleared ) || + ( entry_ptr->serialized != check[i].expected_serialized ) || + ( entry_ptr->destroyed != check[i].expected_destroyed ) ) { +#endif /* NDEBUG */ + + +#if 0 /* This is useful debugging code. Lets keep it around for a while. */ + + if ( entry_ptr->size != check[i].expected_size ) { + HDfprintf(stdout, "entry_ptr->size (expected) = %d (%d).\n", + (int)(entry_ptr->size), + (int)(check[i].expected_size)); + } + if ( ( ! entry_ptr->header.destroy_in_progress ) && + ( check[i].in_cache ) && + ( entry_ptr->header.size != check[i].expected_size ) ) { + HDfprintf(stdout, + "(!destroy in progress and in cache and size (expected) = %d (%d).\n", + (int)(entry_ptr->header.size), + (int)(check[i].expected_size)); + } + if ( entry_ptr->at_main_addr != check[i].at_main_addr ) { + HDfprintf(stdout, "(%d,%d) at main addr (expected) = %d (%d).\n", + (int)(check[i].entry_type), + (int)(check[i].entry_index), + (int)(entry_ptr->at_main_addr), + (int)(check[i].at_main_addr)); + } + if ( entry_ptr->is_dirty != check[i].is_dirty ) { + HDfprintf(stdout, "entry_ptr->is_dirty (expected) = %d (%d).\n", + (int)(entry_ptr->is_dirty), + (int)(check[i].is_dirty)); + } + if ( entry_ptr->header.is_dirty != check[i].is_dirty ) { + HDfprintf(stdout, "entry_ptr->header.is_dirty (expected) = %d (%d).\n", + (int)(entry_ptr->header.is_dirty), + (int)(check[i].is_dirty)); + } + if ( entry_ptr->is_protected != check[i].is_protected ) { + HDfprintf(stdout, "entry_ptr->is_protected (expected) = %d (%d).\n", + (int)(entry_ptr->is_protected), + (int)(check[i].is_protected)); + } + if ( entry_ptr->header.is_protected != check[i].is_protected ) { + HDfprintf(stdout, "entry_ptr->header.is_protected (expected) = %d (%d).\n", + (int)(entry_ptr->is_protected), + (int)(check[i].is_protected)); + } + if ( entry_ptr->is_pinned != check[i].is_pinned ) { + HDfprintf(stdout, "entry_ptr->is_pinned (expected) = %d (%d).\n", + (int)(entry_ptr->is_pinned), + (int)(check[i].is_pinned)); + } + if ( entry_ptr->header.is_pinned != check[i].is_pinned ) { + HDfprintf(stdout, "entry_ptr->header.is_pinned (expected) = %d (%d).\n", + (int)(entry_ptr->header.is_pinned), + (int)(check[i].is_pinned)); + } + if ( entry_ptr->deserialized != + check[i].expected_deserialized ) { + HDfprintf(stdout, + "entry_ptr->deserialized (expected) = %d (%d).\n", + (int)(entry_ptr->deserialized), + (int)(check[i].expected_deserialized)); + } + if ( entry_ptr->cleared != check[i].expected_cleared ) { + HDfprintf(stdout, "entry_ptr->cleared (expected) = %d (%d).\n", + (int)(entry_ptr->cleared), + (int)(check[i].expected_cleared)); + } + if ( entry_ptr->serialized != check[i].expected_serialized ) { + HDfprintf(stdout, + "entry_ptr->serialized (expected) = %d (%d).\n", + (int)(entry_ptr->serialized), + (int)(check[i].expected_serialized)); + } + if ( entry_ptr->destroyed != check[i].expected_destroyed ) { + HDfprintf(stdout, "entry_ptr->destroyed (expected) = %d (%d).\n", + (int)(entry_ptr->destroyed), + (int)(check[i].expected_destroyed)); + } +#endif + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "Check2 failed on entry %d after flush op test #%d.", + i, test_num); + failure_mssg = msg; + } + i++; + } + } + + if ( pass ) { + + if ( ( ( (flush_flags & H5C__FLUSH_INVALIDATE_FLAG) == 0 ) + && + ( ( cache_ptr->index_len != expected_index_len ) + || + ( cache_ptr->index_size != expected_index_size ) + ) + ) + || + ( ( (flush_flags & H5C__FLUSH_INVALIDATE_FLAG) != 0 ) + && + ( ( cache_ptr->index_len != 0 ) + || + ( cache_ptr->index_size != 0 ) + ) + ) + ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "Unexpected cache len/size after flush in flush op test #%d.", + test_num); + failure_mssg = msg; + } + } + + /* clean up the cache to prep for the next test */ + if ( pass ) { + + result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, + H5C__FLUSH_INVALIDATE_FLAG); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "Flush failed on cleanup in flush op test #%d.", + test_num); + failure_mssg = msg; + } + else if ( ( cache_ptr->index_len != 0 ) || + ( cache_ptr->index_size != 0 ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "Unexpected cache len/size after cleanup in flush op test #%d.", + test_num); + failure_mssg = msg; + + } + } + + i = 0; + while ( ( pass ) && ( i < spec_size ) ) + { + base_addr = entries[spec[i].entry_type]; + entry_ptr = &(base_addr[spec[i].entry_index]); + + entry_ptr->size = entry_sizes[spec[i].entry_type]; + + entry_ptr->deserialized = FALSE; + entry_ptr->cleared = FALSE; + entry_ptr->serialized = FALSE; + entry_ptr->destroyed = FALSE; + + i++; + } + + i = 0; + while ( ( pass ) && ( i < check_size ) ) + { + base_addr = entries[check[i].entry_type]; + entry_ptr = &(base_addr[check[i].entry_index]); + + entry_ptr->size = entry_sizes[check[i].entry_type]; + + entry_ptr->deserialized = FALSE; + entry_ptr->cleared = FALSE; + entry_ptr->serialized = FALSE; + entry_ptr->destroyed = FALSE; + + i++; + } + + return; + +} /* check_flush_cache__flush_op_test() */ + + +/*------------------------------------------------------------------------- + * Function: check_flush_cache__flush_op_eviction_test() + * + * Purpose: Verify that flush operations work as expected when an + * entry is evicted. + * + * Do nothing if pass is FALSE on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 10/3/06 + * + * Modifications: + * + * JRM -- 10/9/07 + * Modified test to accomodate changes in the cache API. + * In particular, since the cache is now reading and writing + * its own entries, the serialize callback is not called on + * entry eviction unless the entry is dirty. + * + * This fact broke some basic assumptions of the test, and + * necessitated a substantial re-write. + * + *------------------------------------------------------------------------- + */ + +static void +check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr) +{ + /* const char * fcn_name = "check_flush_cache__flush_op_eviction_test"; */ + H5C_t * cache_ptr = file_ptr->shared->cache; + int i; + int num_variable_entries = 10; + int num_monster_entries = 31; + int num_large_entries = 0; + herr_t result; + test_entry_t * entry_ptr; + test_entry_t * base_addr; + struct expected_entry_status expected[10 + 31 + 14] = + { + /* the expected array is used to maintain a table of the expected status of every + * entry used in this test. Note that since the function that processes this + * array only processes as much of it as it is told to, we don't have to + * worry about maintaining the status of entries that we haven't used yet. + */ + /* entry entry in at main */ + /* type: index: size: cache: addr: dirty: prot: pinned: dsrlzd: clrd: srlzd: dest: */ + { VARIABLE_ENTRY_TYPE, 0, VARIABLE_ENTRY_SIZE/4, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE }, + { VARIABLE_ENTRY_TYPE, 1, VARIABLE_ENTRY_SIZE/4, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { VARIABLE_ENTRY_TYPE, 2, VARIABLE_ENTRY_SIZE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { VARIABLE_ENTRY_TYPE, 3, VARIABLE_ENTRY_SIZE/4, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { VARIABLE_ENTRY_TYPE, 4, VARIABLE_ENTRY_SIZE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { VARIABLE_ENTRY_TYPE, 5, VARIABLE_ENTRY_SIZE/4, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { VARIABLE_ENTRY_TYPE, 6, VARIABLE_ENTRY_SIZE/2, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { VARIABLE_ENTRY_TYPE, 7, VARIABLE_ENTRY_SIZE/2, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { VARIABLE_ENTRY_TYPE, 8, VARIABLE_ENTRY_SIZE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { VARIABLE_ENTRY_TYPE, 9, VARIABLE_ENTRY_SIZE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE }, + { MONSTER_ENTRY_TYPE, 0, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { MONSTER_ENTRY_TYPE, 1, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { MONSTER_ENTRY_TYPE, 2, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { MONSTER_ENTRY_TYPE, 3, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { MONSTER_ENTRY_TYPE, 4, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { MONSTER_ENTRY_TYPE, 5, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { MONSTER_ENTRY_TYPE, 6, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { MONSTER_ENTRY_TYPE, 7, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { MONSTER_ENTRY_TYPE, 8, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { MONSTER_ENTRY_TYPE, 9, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { MONSTER_ENTRY_TYPE, 10, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { MONSTER_ENTRY_TYPE, 11, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { MONSTER_ENTRY_TYPE, 12, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { MONSTER_ENTRY_TYPE, 13, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { MONSTER_ENTRY_TYPE, 14, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { MONSTER_ENTRY_TYPE, 15, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { MONSTER_ENTRY_TYPE, 16, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { MONSTER_ENTRY_TYPE, 17, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { MONSTER_ENTRY_TYPE, 18, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { MONSTER_ENTRY_TYPE, 19, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { MONSTER_ENTRY_TYPE, 20, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { MONSTER_ENTRY_TYPE, 21, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { MONSTER_ENTRY_TYPE, 22, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { MONSTER_ENTRY_TYPE, 23, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { MONSTER_ENTRY_TYPE, 24, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { MONSTER_ENTRY_TYPE, 25, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { MONSTER_ENTRY_TYPE, 26, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { MONSTER_ENTRY_TYPE, 27, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { MONSTER_ENTRY_TYPE, 28, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { MONSTER_ENTRY_TYPE, 29, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { MONSTER_ENTRY_TYPE, 30, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { LARGE_ENTRY_TYPE, 0, LARGE_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { LARGE_ENTRY_TYPE, 1, LARGE_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { LARGE_ENTRY_TYPE, 2, LARGE_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { LARGE_ENTRY_TYPE, 3, LARGE_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { LARGE_ENTRY_TYPE, 4, LARGE_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { LARGE_ENTRY_TYPE, 5, LARGE_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { LARGE_ENTRY_TYPE, 6, LARGE_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { LARGE_ENTRY_TYPE, 7, LARGE_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { LARGE_ENTRY_TYPE, 8, LARGE_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { LARGE_ENTRY_TYPE, 9, LARGE_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { LARGE_ENTRY_TYPE, 10, LARGE_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { LARGE_ENTRY_TYPE, 11, LARGE_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { LARGE_ENTRY_TYPE, 12, LARGE_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, + { LARGE_ENTRY_TYPE, 13, LARGE_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE } + }; + + if ( cache_ptr == NULL ) { + + pass = FALSE; + failure_mssg = "cache_ptr NULL on entry to flush ops test."; + } + else if ( ( cache_ptr->index_len != 0 ) || + ( cache_ptr->index_size != 0 ) ) { + + pass = FALSE; + failure_mssg = "cache not empty at start of flush ops eviction test."; + } + else if ( ( cache_ptr->max_cache_size != (2 * 1024 * 1024 ) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024 ) ) ) { + + pass = FALSE; + failure_mssg = "unexpected cache config at start of flush op eviction test."; + + } else { + + /* set min clean size to zero for this test as it simplifies + * computing the expected cache size after each operation. + */ + + cache_ptr->min_clean_size = 0; + } + + if ( pass ) { + + /* the basic idea in this test is to insert a bunch of entries + * with flush operations associated with them, and then load + * other entries into the cache until the cache is full. At + * that point, load yet more entries into the cache, and see + * if the flush operations are performed as expected. + * + * To make things a bit more interesting, we also include a + * couple of pins. + */ + + /* reset the stats before we start. If stats are enabled, we will + * check to see if they are as expected at the end. + */ + H5C_stats__reset(cache_ptr); + + + /* load a few entries with pin relationships and flush ops. + * Start by just loading the entries. + */ + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 0); + unprotect_entry_with_size_change(file_ptr, VARIABLE_ENTRY_TYPE, 0, + H5C__DIRTIED_FLAG | H5C__SIZE_CHANGED_FLAG, + (VARIABLE_ENTRY_SIZE / 4)); + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 1); + unprotect_entry_with_size_change(file_ptr, VARIABLE_ENTRY_TYPE, 1, + H5C__DIRTIED_FLAG | H5C__SIZE_CHANGED_FLAG, + (VARIABLE_ENTRY_SIZE / 4)); + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 2); + unprotect_entry_with_size_change(file_ptr, VARIABLE_ENTRY_TYPE, 2, + H5C__NO_FLAGS_SET, (size_t)0); + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 3); + unprotect_entry_with_size_change(file_ptr, VARIABLE_ENTRY_TYPE, 3, + H5C__DIRTIED_FLAG | H5C__SIZE_CHANGED_FLAG, + (VARIABLE_ENTRY_SIZE / 4)); + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 4); + unprotect_entry_with_size_change(file_ptr, VARIABLE_ENTRY_TYPE, 4, + H5C__NO_FLAGS_SET, (size_t)0); + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 5); + unprotect_entry_with_size_change(file_ptr, VARIABLE_ENTRY_TYPE, 5, + H5C__DIRTIED_FLAG | H5C__SIZE_CHANGED_FLAG, + (VARIABLE_ENTRY_SIZE / 4)); + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 6); + unprotect_entry_with_size_change(file_ptr, VARIABLE_ENTRY_TYPE, 6, + H5C__DIRTIED_FLAG | H5C__SIZE_CHANGED_FLAG, + (VARIABLE_ENTRY_SIZE / 2)); + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 7); + unprotect_entry_with_size_change(file_ptr, VARIABLE_ENTRY_TYPE, 7, + H5C__DIRTIED_FLAG | H5C__SIZE_CHANGED_FLAG, + (VARIABLE_ENTRY_SIZE / 2)); + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 8); + unprotect_entry_with_size_change(file_ptr, VARIABLE_ENTRY_TYPE, 8, + H5C__NO_FLAGS_SET, (size_t)0); + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 9); + unprotect_entry_with_size_change(file_ptr, VARIABLE_ENTRY_TYPE, 9, + H5C__NO_FLAGS_SET, (size_t)0); + + if ( ( cache_ptr->index_len != 10 ) || + ( cache_ptr->index_size != (4 * (VARIABLE_ENTRY_SIZE / 4)) + + (2 * (VARIABLE_ENTRY_SIZE / 2)) + + (4 * VARIABLE_ENTRY_SIZE) ) ) { + + pass = FALSE; + failure_mssg = "unexpected size/len in flush op eviction test 1."; + } + } + + if ( pass ) { + + /* Now set up the pinning relationships: + * + * Briefly, (VET, 0) is pinned by (VET, 1), (VET, 3), and (VET, 5) + * (VET, 9) is pinned by (VET, 5), and (VET, 7) + */ + create_pinned_entry_dependency(file_ptr, VARIABLE_ENTRY_TYPE, 1, + VARIABLE_ENTRY_TYPE, 0); + create_pinned_entry_dependency(file_ptr, VARIABLE_ENTRY_TYPE, 3, + VARIABLE_ENTRY_TYPE, 0); + create_pinned_entry_dependency(file_ptr, VARIABLE_ENTRY_TYPE, 5, + VARIABLE_ENTRY_TYPE, 0); + create_pinned_entry_dependency(file_ptr, VARIABLE_ENTRY_TYPE, 5, + VARIABLE_ENTRY_TYPE, 9); + create_pinned_entry_dependency(file_ptr, VARIABLE_ENTRY_TYPE, 7, + VARIABLE_ENTRY_TYPE, 9); + + /* Next, set up the flush operations: + * + * Briefly, (VET, 1) dirties (VET, 0) + * resizes (VET, 0) to 3/4 VARIABLE_ENTRY_SIZE + * + * (VET, 3) dirties (VET, 0) + * resizes (VET, 0) to VARIABLE_ENTRY_SIZE + * renames (VET, 0) to its alternate address + * + * (VET, 5) dirties (VET, 0) + * resizes itself to VARIABLE_ENTRY_SIZE / 2 + * + * (VET, 7) dirties (VET, 9) + * + * (VET, 9) dirties (VET, 8) + */ + + add_flush_op(VARIABLE_ENTRY_TYPE, 1, FLUSH_OP__DIRTY, + VARIABLE_ENTRY_TYPE, 0, FALSE, (size_t)0); + add_flush_op(VARIABLE_ENTRY_TYPE, 1, FLUSH_OP__RESIZE, + VARIABLE_ENTRY_TYPE, 0, FALSE, + 3 * VARIABLE_ENTRY_SIZE / 4); + + add_flush_op(VARIABLE_ENTRY_TYPE, 3, FLUSH_OP__DIRTY, + VARIABLE_ENTRY_TYPE, 0, FALSE, (size_t)0); + add_flush_op(VARIABLE_ENTRY_TYPE, 3, FLUSH_OP__RESIZE, + VARIABLE_ENTRY_TYPE, 0, FALSE, VARIABLE_ENTRY_SIZE); + add_flush_op(VARIABLE_ENTRY_TYPE, 3, FLUSH_OP__RENAME, + VARIABLE_ENTRY_TYPE, 0, FALSE, (size_t)0); + + add_flush_op(VARIABLE_ENTRY_TYPE, 5, FLUSH_OP__DIRTY, + VARIABLE_ENTRY_TYPE, 0, FALSE, (size_t)0); + add_flush_op(VARIABLE_ENTRY_TYPE, 5, FLUSH_OP__RESIZE, + VARIABLE_ENTRY_TYPE, 5, FALSE, VARIABLE_ENTRY_SIZE / 2); + + add_flush_op(VARIABLE_ENTRY_TYPE, 7, FLUSH_OP__DIRTY, + VARIABLE_ENTRY_TYPE, 9, FALSE, (size_t)0); + + add_flush_op(VARIABLE_ENTRY_TYPE, 9, FLUSH_OP__DIRTY, + VARIABLE_ENTRY_TYPE, 8, FALSE, (size_t)0); + } + + if ( pass ) { + + /* to summarize, at present the following variable size entries + * are in cache with the following characteristics: + * + * in + * entry: cache? size: dirty? pinned? pins: flush operations: + * + * (VET, 0) Y 2.5 KB Y Y - - + * + * (VET, 1) Y 2.5 KB Y N 0 dirty (VET, 0), + * resize (VET, 0) to 7.5 KB + * + * (VET, 2) Y 10 KB N N - - + * + * + * (VET, 3) Y 2.5 KB N N 0 dirty (VET, 0) + * resize (VET, 0) to 10 KB + * rename (VET, 0) to its alternate address + * + * (VET, 4) Y 10 KB N N - - + * + * + * (VET, 5) Y 2.5 KB Y N 0, 9 dirty (VET, 0) + * resize (VET, 5) to 5 KB + * + * (VET, 6) Y 5 KB Y N - - + * + * (VET, 7) Y 5 KB Y N 9 dirty (VET, 9) + * + * (VET, 8) Y 10 KB N N - - + * + * (VET, 9) Y 10 KB N N - dirty (VET, 8) + * + * Recall that in this test bed, flush operations are excuted the + * first time the associated entry is flushed, and are then + * deleted. + */ + + /* Now fill up the cache with other, unrelated entries */ + for ( i = 0; i < 31; i++ ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i); + unprotect_entry_with_size_change(file_ptr, MONSTER_ENTRY_TYPE, i, + H5C__DIRTIED_FLAG, (size_t)0); + } + + for ( i = 0; i < 1; i++ ) + { + protect_entry(file_ptr, LARGE_ENTRY_TYPE, i); + unprotect_entry_with_size_change(file_ptr, LARGE_ENTRY_TYPE, i, + H5C__DIRTIED_FLAG, (size_t)0); + } + + /* The cache should now be exactly full */ + if ( ( cache_ptr->index_len != 42 ) || + ( cache_ptr->index_size != 2 * 1024 * 1024 ) || + ( cache_ptr->index_size != ((4 * VARIABLE_ENTRY_SIZE / 4) + + (2 * VARIABLE_ENTRY_SIZE / 2) + + (4 * VARIABLE_ENTRY_SIZE) + + (31 * MONSTER_ENTRY_SIZE) + + (1 * LARGE_ENTRY_SIZE)) ) ) { + + pass = FALSE; + failure_mssg = "unexpected size/len in flush op eviction test 2."; + + } else { + + /* verify the expected status of all entries we have loaded to date: */ + num_large_entries = 1; + verify_entry_status(cache_ptr, + 0, + (num_variable_entries + num_monster_entries + num_large_entries), + expected); + } + } + + + if ( pass ) { + + /* Now load a large entry. This should result in the eviction + * of (VET,2), and the increase in the size of (VET, 0) from .25 + * VARIABLE_ENTRY_SIZE to .75 VARIABLE_ENTRY_SIZE. + * + * The following table illustrates the intended state of affairs + * after the eviction: + * + * in + * entry: cache? size: dirty? pinned? pins: flush operations: + * + * (VET, 0) Y 7.5 KB Y Y - - + * + * (VET, 1) Y 2.5 KB N N - - + * + * (VET, 2) N 10 KB N N - - + * + * (VET, 3) Y 2.5 KB Y N 0 dirty (VET, 0) + * resize (VET, 0) to 10 KB + * rename (VET, 0) to its alternate address + * + * (VET, 4) Y 10 KB N N - - + * + * (VET, 5) Y 2.5 KB Y N 0, 9 dirty (VET, 0) + * resize (VET, 5) to 5 KB + * + * (VET, 6) Y 5 KB Y N - - + * + * (VET, 7) Y 5 KB Y N 9 dirty (VET, 9) + * + * (VET, 8) Y 10 KB N N - - + * + * (VET, 9) Y 10 KB N Y - dirty (VET, 8) + * + * Start by updating the expected table for the expected changes in entry status: + */ + expected[0].size = 3 * VARIABLE_ENTRY_SIZE / 4; + expected[1].is_dirty = FALSE; + expected[1].serialized = TRUE; + expected[2].in_cache = FALSE; + expected[2].destroyed = TRUE; + + num_large_entries = 2; + + protect_entry(file_ptr, LARGE_ENTRY_TYPE, 1); + unprotect_entry_with_size_change(file_ptr, LARGE_ENTRY_TYPE, 1, + H5C__DIRTIED_FLAG, (size_t)0); + + if ( ( cache_ptr->index_len != 42 ) || + ( cache_ptr->index_size != (2 * 1024 * 1024) - + (VARIABLE_ENTRY_SIZE) + + (VARIABLE_ENTRY_SIZE / 2) + + (LARGE_ENTRY_SIZE) ) || + ( cache_ptr->index_size != ((1 * (3 * VARIABLE_ENTRY_SIZE / 4)) + + (3 * VARIABLE_ENTRY_SIZE / 4) + + (2 * VARIABLE_ENTRY_SIZE / 2) + + (3 * VARIABLE_ENTRY_SIZE) + + (31 * MONSTER_ENTRY_SIZE) + + (2 * LARGE_ENTRY_SIZE)) ) ) { + pass = FALSE; + failure_mssg = "unexpected size/len in flush op eviction test 3."; + } + + /* verify entry status */ + verify_entry_status(cache_ptr, + 1, + (num_variable_entries + num_monster_entries + num_large_entries), + expected); + } + + if ( pass ) { + + /* Now load another large entry. This should result in the eviction + * of (VET, 4), the increase in the size of (VET, 0) from .75 + * VARIABLE_ENTRY_SIZE to 1.0 VARIABLE_ENTRY_SIZE, and the renaming + * of (VET, 0) to its alternate address. + * + * The following table shows the expected states of the variable + * size entries after the test. + * + * in + * entry: cache? size: dirty? pinned? pins: flush operations: + * + * (VET, 0) Y 10 KB Y Y - - + * + * (VET, 1) Y 2.5 KB N N - - + * + * (VET, 2) N 10 KB N N - - + * + * (VET, 3) Y 2.5 KB N N - - + * + * (VET, 4) N 10 KB N N - - + * + * (VET, 5) Y 2.5 KB Y N 0, 9 dirty (VET, 0) + * resize (VET, 5) to 5 KB + * + * (VET, 6) Y 5 KB Y N - - + * + * (VET, 7) Y 5 KB Y N 9 dirty (VET, 9) + * + * (VET, 8) Y 10 KB N N - - + * + * (VET, 9) Y 10 KB N Y - dirty (VET, 8) + * + * Start by updating the expected table for the expected changes in entry status: + */ + expected[0].size = VARIABLE_ENTRY_SIZE; + expected[0].at_main_addr = FALSE; + expected[3].is_dirty = FALSE; + expected[3].serialized = TRUE; + expected[4].in_cache = FALSE; + expected[4].destroyed = TRUE; + + num_large_entries = 3; + + protect_entry(file_ptr, LARGE_ENTRY_TYPE, 2); + unprotect_entry_with_size_change(file_ptr, LARGE_ENTRY_TYPE, 2, + H5C__DIRTIED_FLAG, (size_t)0); + + if ( ( cache_ptr->index_len != 42 ) || + ( cache_ptr->index_size != (2 * 1024 * 1024) - + (2 * VARIABLE_ENTRY_SIZE) + + (3 * VARIABLE_ENTRY_SIZE / 4) + + (2 * LARGE_ENTRY_SIZE) ) || + ( cache_ptr->index_size != ((3 * VARIABLE_ENTRY_SIZE / 4) + + (2 * VARIABLE_ENTRY_SIZE / 2) + + (3 * VARIABLE_ENTRY_SIZE) + + (31 * MONSTER_ENTRY_SIZE) + + (3 * LARGE_ENTRY_SIZE)) ) ) { + + pass = FALSE; + failure_mssg = "unexpected size/len in flush op eviction test 4."; + } + + /* verify entry status */ + verify_entry_status(cache_ptr, + 2, + (num_variable_entries + num_monster_entries + num_large_entries), + expected); + } + + if ( pass ) { + + /* load two more large entries. This should result in (VET, 5) being + * flushed, and increasing its size from 1/4 VARIABLE_ENTRY_SIZE to + * VARIABLE_ENTRY_SIZE. + * + * As a result of this size increase, the cache will have to look + * for another entry to evict. After flushing (VET, 6) and (VET, 7), + * it should evict (VET, 8), yielding the needed memory and dirtying + * (VET, 9). + * + * The following table shows the expected states of the variable + * size entries after the test. + * + * in + * entry: cache? size: dirty? pinned? pins: flush operations: + * + * (VET, 0) Y 10 KB Y Y - - + * + * (VET, 1) Y 2.5 KB N N - - + * + * (VET, 2) N 10 KB N N - - + * + * (VET, 3) Y 2.5 KB N N - - + * + * (VET, 4) N 10 KB N N - - + * + * (VET, 5) Y 5 KB N N 0, 9 - + * + * (VET, 6) Y 5 KB N N - - + * + * (VET, 7) Y 5 KB N N 9 - + * + * (VET, 8) N 10 KB N N - - + * + * (VET, 9) Y 10 KB N Y - dirty (VET, 8) + * + * Start by updating the expected table for the expected changes in entry status: + */ + + expected[5].size = VARIABLE_ENTRY_SIZE / 2; + expected[5].is_dirty = FALSE; + expected[5].serialized = TRUE; + expected[6].is_dirty = FALSE; + expected[6].serialized = TRUE; + expected[7].is_dirty = FALSE; + expected[7].serialized = TRUE; + expected[8].in_cache = FALSE; + expected[8].destroyed = TRUE; + expected[9].is_dirty = TRUE; + + num_large_entries = 5; + + protect_entry(file_ptr, LARGE_ENTRY_TYPE, 3); + unprotect_entry_with_size_change(file_ptr, LARGE_ENTRY_TYPE, 3, + H5C__DIRTIED_FLAG, (size_t)0); + + protect_entry(file_ptr, LARGE_ENTRY_TYPE, 4); + unprotect_entry_with_size_change(file_ptr, LARGE_ENTRY_TYPE, 4, + H5C__DIRTIED_FLAG, (size_t)0); + + /* verify cache size */ + if ( ( cache_ptr->index_len != 43 ) || + ( cache_ptr->index_size != (2 * 1024 * 1024) - + (3 * VARIABLE_ENTRY_SIZE) + + (1 * VARIABLE_ENTRY_SIZE / 4) + + (3 * VARIABLE_ENTRY_SIZE / 4) + + (4 * LARGE_ENTRY_SIZE) ) || + ( cache_ptr->index_size != ((2 * VARIABLE_ENTRY_SIZE / 4) + + (3 * VARIABLE_ENTRY_SIZE / 2) + + (2 * VARIABLE_ENTRY_SIZE) + + (31 * MONSTER_ENTRY_SIZE) + + (5 * LARGE_ENTRY_SIZE)) ) ) { + + pass = FALSE; + failure_mssg = "unexpected size/len in flush op eviction test 5."; + } + + /* verify entry status */ + verify_entry_status(cache_ptr, + 3, + (num_variable_entries + num_monster_entries + num_large_entries), + expected); + } + + if ( pass ) { + + /* now touch all the non VARIABLE_ENTRY_TYPE entries in the + * cache to bring all the VARIABLE_ENTRY_TYPE entries to the + * end of the LRU list. + * + * Note that we don't have to worry about (VET, 0) and (VET, 9) + * as they are pinned and thus not in the LRU list to begin with. + */ + for ( i = 0; i < 31; i++ ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i); + unprotect_entry_with_size_change(file_ptr, MONSTER_ENTRY_TYPE, i, + H5C__DIRTIED_FLAG, (size_t)0); + } + + for ( i = 0; i < 5; i++ ) + { + protect_entry(file_ptr, LARGE_ENTRY_TYPE, i); + unprotect_entry_with_size_change(file_ptr, LARGE_ENTRY_TYPE, i, + H5C__DIRTIED_FLAG, (size_t)0); + } + + /* verify cache size */ + if ( ( cache_ptr->index_len != 43 ) || + ( cache_ptr->index_size != (2 * 1024 * 1024) - + (3 * VARIABLE_ENTRY_SIZE) + + (1 * VARIABLE_ENTRY_SIZE / 4) + + (3 * VARIABLE_ENTRY_SIZE / 4) + + (4 * LARGE_ENTRY_SIZE) ) || + ( cache_ptr->index_size != ((2 * VARIABLE_ENTRY_SIZE / 4) + + (3 * VARIABLE_ENTRY_SIZE / 2) + + (2 * VARIABLE_ENTRY_SIZE) + + (31 * MONSTER_ENTRY_SIZE) + + (5 * LARGE_ENTRY_SIZE)) ) ) { + + pass = FALSE; + failure_mssg = "unexpected size/len in flush op eviction test 6."; + } + + /* verify entry status */ + verify_entry_status(cache_ptr, + 4, + (num_variable_entries + num_monster_entries + num_large_entries), + expected); + } + + if ( pass ) { + + /* Now load three more large entries. This should result + * in the evictions of (VET, 1), (VET, 3), and (VET, 5), and the + * unpinning of (VET, 0) + * + * The following table shows the expected states of the variable + * size entries after the test. + * + * in + * entry: cache? size: dirty? pinned? pins: flush operations: + * + * (VET, 0) Y 10 KB Y N - - + * + * (VET, 1) N 2.5 KB N N - - + * + * (VET, 2) N 10 KB N N - - + * + * (VET, 3) N 2.5 KB N N - - + * + * (VET, 4) N 10 KB N N - - + * + * (VET, 5) N 5 KB N N - - + * + * (VET, 6) Y 5 KB N N - - + * + * (VET, 7) Y 5 KB N N 9 - + * + * (VET, 8) N 10 KB N N - - + * + * (VET, 9) Y 10 KB N Y - dirty (VET, 8) + * + * Start by updating the expected table for the expected changes in entry status: + */ + + expected[0].is_pinned = FALSE; + expected[1].in_cache = FALSE; + expected[1].destroyed = TRUE; + expected[3].in_cache = FALSE; + expected[3].destroyed = TRUE; + expected[5].in_cache = FALSE; + expected[5].destroyed = TRUE; + + num_large_entries = 8; + + for ( i = 5; i < 8; i++ ) + { + protect_entry(file_ptr, LARGE_ENTRY_TYPE, i); + unprotect_entry_with_size_change(file_ptr, LARGE_ENTRY_TYPE, i, + H5C__DIRTIED_FLAG, (size_t)0); + } + + /* verify cache size */ + if ( ( cache_ptr->index_len != 43 ) || + ( cache_ptr->index_size != (2 * 1024 * 1024) - + (4 * VARIABLE_ENTRY_SIZE) + + (1 * VARIABLE_ENTRY_SIZE / 4) + + (3 * VARIABLE_ENTRY_SIZE / 4) + + (7 * LARGE_ENTRY_SIZE) ) || + ( cache_ptr->index_size != ((2 * VARIABLE_ENTRY_SIZE / 2) + + (2 * VARIABLE_ENTRY_SIZE) + + (31 * MONSTER_ENTRY_SIZE) + + (8 * LARGE_ENTRY_SIZE)) ) ) { + + pass = FALSE; + failure_mssg = "unexpected size/len in flush op eviction test 7."; + } + + /* verify entry status */ + verify_entry_status(cache_ptr, + 5, + (num_variable_entries + num_monster_entries + num_large_entries), + expected); + } + + if ( pass ) { + + /* load another large entry. (VET, 6) should be evicted. + * + * The following table shows the expected states of the variable + * size entries after the test. + * + * in + * entry: cache? size: dirty? pinned? pins: flush operations: + * + * (VET, 0) Y 10 KB Y N - - + * + * (VET, 1) N 2.5 KB N N - - + * + * (VET, 2) N 10 KB N N - - + * + * (VET, 3) N 2.5 KB N N - - + * + * (VET, 4) N 10 KB N N - - + * + * (VET, 5) N 5 KB N N - - + * + * (VET, 6) N 5 KB N N - - + * + * (VET, 7) Y 5 KB N N 9 - + * + * (VET, 8) N 10 KB N N - - + * + * (VET, 9) Y 10 KB N Y - dirty (VET, 8) + * + * Start by updating the expected table for the expected changes in entry status: + */ + + expected[6].in_cache = FALSE; + expected[6].destroyed = TRUE; + + num_large_entries = 9; + + for ( i = 8; i < 9; i++ ) + { + protect_entry(file_ptr, LARGE_ENTRY_TYPE, i); + unprotect_entry_with_size_change(file_ptr, LARGE_ENTRY_TYPE, i, + H5C__DIRTIED_FLAG, (size_t)0); + } + + /* verify cache size */ + if ( ( cache_ptr->index_len != 43 ) || + ( cache_ptr->index_size != (2 * 1024 * 1024) - + (3 * VARIABLE_ENTRY_SIZE) - + (VARIABLE_ENTRY_SIZE / 2) + + (8 * LARGE_ENTRY_SIZE) ) || + ( cache_ptr->index_size != ((1 * VARIABLE_ENTRY_SIZE / 2) + + (2 * VARIABLE_ENTRY_SIZE) + + (31 * MONSTER_ENTRY_SIZE) + + (9 * LARGE_ENTRY_SIZE)) ) ) { + + pass = FALSE; + failure_mssg = "unexpected size/len in flush op eviction test 8."; + } + + /* verify entry status */ + verify_entry_status(cache_ptr, + 6, + (num_variable_entries + num_monster_entries + num_large_entries), + expected); + } + + if ( pass ) { + + /* Load another large entry. + * + * (VET, 7) should be evicted, and (VET, 9) should be unpinned. + * + * The following table shows the expected states of the variable + * size entries after the test. + * + * in + * entry: cache? size: dirty? pinned? pins: flush operations: + * + * (VET, 0) Y 10 KB Y N - - + * + * (VET, 1) N 2.5 KB N N - - + * + * (VET, 2) N 10 KB N N - - + * + * (VET, 3) N 2.5 KB N N - - + * + * (VET, 4) N 10 KB N N - - + * + * (VET, 5) N 5 KB N N - - + * + * (VET, 6) N 5 KB N N - - + * + * (VET, 7) N 5 KB N N - - + * + * (VET, 8) N 10 KB N N - - + * + * (VET, 9) Y 10 KB Y N - dirty (VET, 8) + * + * Start by updating the expected table for the expected changes in entry status: + */ + + expected[7].in_cache = FALSE; + expected[7].destroyed = TRUE; + expected[9].is_pinned = FALSE; + + num_large_entries = 10; + + for ( i = 9; i < 10; i++ ) + { + protect_entry(file_ptr, LARGE_ENTRY_TYPE, i); + unprotect_entry_with_size_change(file_ptr, LARGE_ENTRY_TYPE, i, + H5C__DIRTIED_FLAG, (size_t)0); + } + + /* verify cache size */ + if ( ( cache_ptr->index_len != 43 ) || + ( cache_ptr->index_size != (2 * 1024 * 1024) - + (4 * VARIABLE_ENTRY_SIZE) + + (9 * LARGE_ENTRY_SIZE) ) || + ( cache_ptr->index_size != ((2 * VARIABLE_ENTRY_SIZE) + + (31 * MONSTER_ENTRY_SIZE) + + (10 * LARGE_ENTRY_SIZE)) ) ) { + + pass = FALSE; + failure_mssg = "unexpected size/len in flush op eviction test 9."; + } + + /* verify entry status */ + verify_entry_status(cache_ptr, + 7, + (num_variable_entries + num_monster_entries + num_large_entries), + expected); + } + + if ( pass ) { + + /* Again, touch all the non VARIABLE_ENTRY_TYPE entries in the + * cache to bring all the VARIABLE_ENTRY_TYPE entries to the + * end of the LRU list. + * + * Both (VET, 0) and (VET, 7) have been unpinned, so they are + * now in the LRU list. + */ + for ( i = 0; i < 31; i++ ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i); + unprotect_entry_with_size_change(file_ptr, MONSTER_ENTRY_TYPE, i, + H5C__DIRTIED_FLAG, (size_t)0); + } + + for ( i = 0; i < 10; i++ ) + { + protect_entry(file_ptr, LARGE_ENTRY_TYPE, i); + unprotect_entry_with_size_change(file_ptr, LARGE_ENTRY_TYPE, i, + H5C__DIRTIED_FLAG, (size_t)0); + } + + /* verify cache size */ + if ( ( cache_ptr->index_len != 43 ) || + ( cache_ptr->index_size != (2 * 1024 * 1024) - + (4 * VARIABLE_ENTRY_SIZE) + + (9 * LARGE_ENTRY_SIZE) ) || + ( cache_ptr->index_size != ((2 * VARIABLE_ENTRY_SIZE) + + (31 * MONSTER_ENTRY_SIZE) + + (10 * LARGE_ENTRY_SIZE)) ) ) { + + pass = FALSE; + failure_mssg = "unexpected size/len in flush op eviction test 10."; + } + + /* verify entry status */ + verify_entry_status(cache_ptr, + 8, + (num_variable_entries + num_monster_entries + num_large_entries), + expected); + } + + if ( pass ) { + + /* load two more large entries. Things get a bit complicated here, + * so I'll go through the operation step by step. + * + * Initially, the cache has 4 KB of empty space, so the first entry + * (LET, 10) is loaded via calls to H5C_protect() H5C_unprotect() + * without causing any evictions. + * + * However, this is not the case for the call of H5C_protect() on + * (LET, 11). + * + * Before inserting (LET, 11), H5C_protect(LET, 11) must try to + * free up at least 4 KB of space. To do this, it starts scanning + * up the LRU list to find entries to evict. + * + * (VET, 0) is at the bottom of the LRU list, and thus is the first + * entry considered. However, it is dirty, so it is moved to the + * top of the LRU list, flushed to disk, and marked clean. + * + * (VET, 9) is the next entry on the bottom of the LRU list. It is + * dirty too, so the cache moves it to the top of the LRU list, + * and calls its serialize callback function to construct an on + * disk image of the entry. + * + * However, this serialize function needs to modify (VET, 8), which + * is currently not in cache. Thus it calls H5C_protect(VET, 8) + * to gain access to it. H5C_protect(VET, 8) loads (VET, 8), and + * then attempts to evict entries to make space for it. (VET, 9) + * has already been moved to the head of the LRU list, so the next + * entries on the LRU are (MET, 0) thru (MET, 30) and (LET, 0) thru + * (LET, 10) -- all of which are dirty, and are therefore flushed + * and moved to the head of the LRU list. + * + * The next entry on the bottom of the LRU list is (VET, 0), which + * is clean, and is therefore evicted to make space for (VET, 8). + * This space is sufficient, so H5C_protect(VET, 8) inserts + * (VET, 8) into the cache's index, marks it as protected, and + * returns to the serialize function for (VET, 9). + * + * When the serialize function for (VET, 9) is done with (VET, 8), it + * calls H5C_unprotect(VET, 8), which markes (VET, 8) as dirty and + * unprotected, and places it at the head of the LRU. + * + * The serialize function for (VET, 9) then returns, and (VET, 9) is + * is written to disk, and marked clean. + * + * At this point, the cache is still full (since (VET, 8) took the + * space created by the eviction of (VET, 0)). Thus + * H5C_protect(LET, 11) continues to look for space. While + * (MET, 0) was the next item on the LRU list when it called the + * serialize function for (VET, 9), the function notices that the + * LRU has been modified, and restarts its search for candidates + * for eviction at the bottom of the LRU. + * + * (VET, 0) is now at the bottom of the LRU, and is clean. Thus + * it is evicted. This makes sufficient space for (LET, 11), so + * H5C_protect(LET, 11) inserts it into the cache, marks it as + * protected, and returns. + * + * H5C_unprotect(VET, 11) marks (VET, 11) as unprotected, and then + * returns as well. + * + * The following table shows the expected states of the variable + * size entries after the test. + * + * in + * entry: cache? size: dirty? pinned? pins: flush operations: + * + * (VET, 0) N 10 KB N N - - + * + * (VET, 1) N 2.5 KB N N - - + * + * (VET, 2) N 10 KB N N - - + * + * (VET, 3) N 2.5 KB N N - - + * + * (VET, 4) N 10 KB N N - - + * + * (VET, 5) N 5 KB N N - - + * + * (VET, 6) N 5 KB N N - - + * + * (VET, 7) N 5 KB N N - - + * + * (VET, 8) Y 10 KB Y N - - + * + * (VET, 9) N 10 KB N N - - + * + * Start by updating the expected table for the expected changes in + * entry status: + * + * Note that we reset the loaded, cleared, flushed, and destroyed + * fields of (VET,8) so we can track what is happening. + */ + base_addr = entries[VARIABLE_ENTRY_TYPE]; + entry_ptr = &(base_addr[8]); + entry_ptr->deserialized = FALSE; + entry_ptr->cleared = FALSE; + entry_ptr->deserialized = FALSE; + entry_ptr->destroyed = FALSE; + + expected[0].in_cache = FALSE; + expected[0].is_dirty = FALSE; + expected[0].serialized = TRUE; + expected[0].destroyed = TRUE; + expected[8].in_cache = TRUE; + expected[8].is_dirty = TRUE; + expected[8].deserialized = TRUE; + expected[8].serialized = FALSE; + expected[8].destroyed = FALSE; + expected[9].in_cache = FALSE; + expected[9].is_dirty = FALSE; + expected[9].serialized = TRUE; + expected[9].destroyed = TRUE; + + num_large_entries = 12; + + /* a newly loaded entry is not inserted in the cache until after + * space has been made for it. Thus (LET, 11) will not be flushed. + */ + for ( i = num_variable_entries; + i < num_variable_entries + num_monster_entries + num_large_entries - 1; + i++ ) + { + expected[i].is_dirty = FALSE; + expected[i].serialized = TRUE; + } + + for ( i = 10; i < 12; i++ ) + { + protect_entry(file_ptr, LARGE_ENTRY_TYPE, i); + unprotect_entry_with_size_change(file_ptr, LARGE_ENTRY_TYPE, i, + H5C__DIRTIED_FLAG, (size_t)0); + } + + /* verify cache size */ + if ( ( cache_ptr->index_len != 44 ) || + ( cache_ptr->index_size != (2 * 1024 * 1024) - + (5 * VARIABLE_ENTRY_SIZE) + + (11 * LARGE_ENTRY_SIZE) ) || + ( cache_ptr->index_size != ((1 * VARIABLE_ENTRY_SIZE) + + (31 * MONSTER_ENTRY_SIZE) + + (12 * LARGE_ENTRY_SIZE)) ) ) { + + pass = FALSE; + failure_mssg = "unexpected size/len in flush op eviction test 11."; + } + + /* verify entry status */ + verify_entry_status(cache_ptr, + 9, + (num_variable_entries + num_monster_entries + num_large_entries), + expected); + } + + if ( pass ) { + + /* Again, touch all the non VARIABLE_ENTRY_TYPE entries in the + * cache to bring the last remaining VARIABLE_ENTRY_TYPE entry to the + * end of the LRU list. + */ + for ( i = 0; i < num_monster_entries; i++ ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i); + unprotect_entry_with_size_change(file_ptr, MONSTER_ENTRY_TYPE, i, + H5C__DIRTIED_FLAG, (size_t)0); + } + + for ( i = 0; i < num_large_entries; i++ ) + { + protect_entry(file_ptr, LARGE_ENTRY_TYPE, i); + unprotect_entry_with_size_change(file_ptr, LARGE_ENTRY_TYPE, i, + H5C__DIRTIED_FLAG, (size_t)0); + } + + /* update the expected array to mark all these entries dirty again. */ + for ( i = num_variable_entries; + i < num_variable_entries + num_monster_entries + num_large_entries - 1; + i++ ) + { + expected[i].is_dirty = TRUE; + } + + /* verify cache size */ + if ( ( cache_ptr->index_len != 44 ) || + ( cache_ptr->index_size != (2 * 1024 * 1024) - + (5 * VARIABLE_ENTRY_SIZE) + + (11 * LARGE_ENTRY_SIZE) ) || + ( cache_ptr->index_size != ((1 * VARIABLE_ENTRY_SIZE) + + (31 * MONSTER_ENTRY_SIZE) + + (12 * LARGE_ENTRY_SIZE)) ) ) { + + pass = FALSE; + failure_mssg = "unexpected size/len in flush op eviction test 12."; + } + + /* verify entry status */ + verify_entry_status(cache_ptr, + 10, + (num_variable_entries + num_monster_entries + num_large_entries), + expected); + } + + if ( pass ) { + + /* Load two more large entries. + * + * Since (VET, 8) is dirty, at first this will just cause (VET, 8) + * to be flushed. + * + * But all other entries in the cache are dirty, so the cache will + * flush them all, and then evict (VET, 8) on the second pass. + * + * The following table shows the expected states of the variable + * size entries after the test. + * + * in + * entry: cache? size: dirty? pinned? pins: flush operations: + * + * (VET, 0) N 10 KB N N - - + * + * (VET, 1) N 2.5 KB N N - - + * + * (VET, 2) N 10 KB N N - - + * + * (VET, 3) N 2.5 KB N N - - + * + * (VET, 4) N 10 KB N N - - + * + * (VET, 5) N 5 KB N N - - + * + * (VET, 6) N 5 KB N N - - + * + * (VET, 7) N 5 KB N N - - + * + * (VET, 8) N 10 KB N N - - + * + * (VET, 9) N 10 KB N N - - + * + * Start by updating the expected table for the expected changes in + * entry status: + */ + + expected[8].in_cache = FALSE; + expected[8].is_dirty = FALSE; + expected[8].serialized = TRUE; + expected[8].destroyed = TRUE; + + num_large_entries = 14; + + /* a newly loaded entry is not inserted in the cache until after + * space has been made for it. Thus (LET, 13) will not be flushed. + */ + for ( i = num_variable_entries; + i < num_variable_entries + num_monster_entries + num_large_entries - 1; + i++ ) + { + expected[i].is_dirty = FALSE; + expected[i].serialized = TRUE; + } + + for ( i = 12; i < 14; i++ ) + { + protect_entry(file_ptr, LARGE_ENTRY_TYPE, i); + unprotect_entry_with_size_change(file_ptr, LARGE_ENTRY_TYPE, i, + H5C__DIRTIED_FLAG, (size_t)0); + } + + /* verify cache size */ + if ( ( cache_ptr->index_len != 45 ) || + ( cache_ptr->index_size != (2 * 1024 * 1024) - + (6 * VARIABLE_ENTRY_SIZE) + + (13 * LARGE_ENTRY_SIZE) ) || + ( cache_ptr->index_size != ((31 * MONSTER_ENTRY_SIZE) + + (14 * LARGE_ENTRY_SIZE)) ) ) { + + pass = FALSE; + failure_mssg = "unexpected size/len in flush op eviction test 13."; + } + + /* verify entry status */ + verify_entry_status(cache_ptr, + 11, + (num_variable_entries + num_monster_entries + num_large_entries), + expected); + } + + /* at this point we have cycled all the variable size entries through + * the cache. + * + * flush the cache and end the test. + */ + + if ( pass ) { + + result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, + H5C__FLUSH_INVALIDATE_FLAG); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "Cache flush invalidate failed after flush op eviction test"; + } + else if ( ( cache_ptr->index_len != 0 ) || + ( cache_ptr->index_size != 0 ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache len/size after cleanup of flush op eviction test"; + + } + } + +#if H5C_COLLECT_CACHE_STATS + /* If we are collecting stats, check to see if we get the expected + * values. + * + * Testing the stats code is fairly new, but given the extent + * to which I find myself depending on the stats, I've decided + * to start testing the stats whenever it is convenient to do + * so. + */ + + if ( pass ) { + + if ( ( cache_ptr->insertions[VARIABLE_ENTRY_TYPE] != 0 ) || + ( cache_ptr->pinned_insertions[VARIABLE_ENTRY_TYPE] != 0 ) || + ( cache_ptr->clears[VARIABLE_ENTRY_TYPE] != 0 ) || + ( cache_ptr->flushes[VARIABLE_ENTRY_TYPE] != 19 ) || + ( cache_ptr->evictions[VARIABLE_ENTRY_TYPE] != 11 ) || + ( cache_ptr->renames[VARIABLE_ENTRY_TYPE] != 1 ) || + ( cache_ptr->entry_flush_renames[VARIABLE_ENTRY_TYPE] != 0 ) || + ( cache_ptr->cache_flush_renames[VARIABLE_ENTRY_TYPE] != 0 ) || + ( cache_ptr->pins[VARIABLE_ENTRY_TYPE] != 2 ) || + ( cache_ptr->unpins[VARIABLE_ENTRY_TYPE] != 2 ) || + ( cache_ptr->dirty_pins[VARIABLE_ENTRY_TYPE] != 0 ) || + ( cache_ptr->pinned_flushes[VARIABLE_ENTRY_TYPE] != 0 ) || + ( cache_ptr->pinned_clears[VARIABLE_ENTRY_TYPE] != 0 ) || + ( cache_ptr->size_increases[VARIABLE_ENTRY_TYPE] != 3 ) || + ( cache_ptr->size_decreases[VARIABLE_ENTRY_TYPE] != 6 ) || + ( cache_ptr->entry_flush_size_changes[VARIABLE_ENTRY_TYPE] != 1 ) || + ( cache_ptr->cache_flush_size_changes[VARIABLE_ENTRY_TYPE] != 0 ) ) { + + pass = FALSE; + failure_mssg = "Unexpected variable size entry stats."; + } + } + + if ( pass ) { + + if ( ( cache_ptr->insertions[LARGE_ENTRY_TYPE] != 0 ) || + ( cache_ptr->pinned_insertions[LARGE_ENTRY_TYPE] != 0 ) || + ( cache_ptr->clears[LARGE_ENTRY_TYPE] != 0 ) || + ( cache_ptr->flushes[LARGE_ENTRY_TYPE] != 38 ) || + ( cache_ptr->evictions[LARGE_ENTRY_TYPE] != 14 ) || + ( cache_ptr->renames[LARGE_ENTRY_TYPE] != 0 ) || + ( cache_ptr->entry_flush_renames[LARGE_ENTRY_TYPE] != 0 ) || + ( cache_ptr->cache_flush_renames[LARGE_ENTRY_TYPE] != 0 ) || + ( cache_ptr->pins[LARGE_ENTRY_TYPE] != 0 ) || + ( cache_ptr->unpins[LARGE_ENTRY_TYPE] != 0 ) || + ( cache_ptr->dirty_pins[LARGE_ENTRY_TYPE] != 0 ) || + ( cache_ptr->pinned_flushes[LARGE_ENTRY_TYPE] != 0 ) || + ( cache_ptr->pinned_clears[LARGE_ENTRY_TYPE] != 0 ) || + ( cache_ptr->size_increases[LARGE_ENTRY_TYPE] != 0 ) || + ( cache_ptr->size_decreases[LARGE_ENTRY_TYPE] != 0 ) || + ( cache_ptr->entry_flush_size_changes[LARGE_ENTRY_TYPE] != 0 ) || + ( cache_ptr->cache_flush_size_changes[LARGE_ENTRY_TYPE] != 0 ) ) { + + pass = FALSE; + failure_mssg = "Unexpected monster entry stats."; + } + } + + if ( pass ) { + + if ( ( cache_ptr->insertions[MONSTER_ENTRY_TYPE] != 0 ) || + ( cache_ptr->pinned_insertions[MONSTER_ENTRY_TYPE] != 0 ) || + ( cache_ptr->clears[MONSTER_ENTRY_TYPE] != 0 ) || + ( cache_ptr->flushes[MONSTER_ENTRY_TYPE] != 93 ) || + ( cache_ptr->evictions[MONSTER_ENTRY_TYPE] != 31 ) || + ( cache_ptr->renames[MONSTER_ENTRY_TYPE] != 0 ) || + ( cache_ptr->entry_flush_renames[MONSTER_ENTRY_TYPE] != 0 ) || + ( cache_ptr->cache_flush_renames[MONSTER_ENTRY_TYPE] != 0 ) || + ( cache_ptr->pins[MONSTER_ENTRY_TYPE] != 0 ) || + ( cache_ptr->unpins[MONSTER_ENTRY_TYPE] != 0 ) || + ( cache_ptr->dirty_pins[MONSTER_ENTRY_TYPE] != 0 ) || + ( cache_ptr->pinned_flushes[MONSTER_ENTRY_TYPE] != 0 ) || + ( cache_ptr->pinned_clears[MONSTER_ENTRY_TYPE] != 0 ) || + ( cache_ptr->size_increases[MONSTER_ENTRY_TYPE] != 0 ) || + ( cache_ptr->size_decreases[MONSTER_ENTRY_TYPE] != 0 ) || + ( cache_ptr->entry_flush_size_changes[MONSTER_ENTRY_TYPE] != 0 ) || + ( cache_ptr->cache_flush_size_changes[MONSTER_ENTRY_TYPE] != 0 ) ) { + + pass = FALSE; + failure_mssg = "Unexpected monster entry stats."; + } + } +#endif /* H5C_COLLECT_CACHE_STATS */ + + if ( pass ) { + + reset_entries(); + } + + return; + +} /* check_flush_cache__flush_op_eviction_test() */ + + +/*------------------------------------------------------------------------- + * Function: check_flush_cache__single_entry() + * + * Purpose: Verify that flush_cache behaves as expected when the cache + * contains only one element. + * + * Return: void + * + * Programmer: John Mainzer + * 1/12/05 + * + * Modifications: + * + * JRM -- 3/29/06 + * Added tests for pinned entries. + * + * JRM -- 5/17/06 + * Complete reqrite of pinned entry tests to accomodate + * the new H5C_mark_pinned_or_protected_entry_dirty() + * call. + * + *------------------------------------------------------------------------- + */ + +static void +check_flush_cache__single_entry(H5F_t * file_ptr) +{ + /* const char * fcn_name = "check_flush_cache__single_entry"; */ + H5C_t * cache_ptr = file_ptr->shared->cache; + + if ( cache_ptr == NULL ) { + + pass = FALSE; + failure_mssg = "cache_ptr NULL on entry to single entry case."; + } + else if ( ( cache_ptr->index_len != 0 ) || + ( cache_ptr->index_size != 0 ) ) { + + pass = FALSE; + failure_mssg = "cache not empty at beginning of single entry case."; + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 1, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ FALSE, + /* dirty_flag */ FALSE, + /* flags */ H5C__NO_FLAGS_SET, + /* flush_flags */ H5C__NO_FLAGS_SET, + /* expected_deserialized */ TRUE, + /* expected_cleared */ FALSE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ FALSE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 2, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ FALSE, + /* dirty_flag */ TRUE, + /* flags */ H5C__NO_FLAGS_SET, + /* flush_flags */ H5C__NO_FLAGS_SET, + /* expected_deserialized */ TRUE, + /* expected_cleared */ FALSE, + /* expected_serialized */ TRUE, + /* expected_destroyed */ FALSE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 3, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ FALSE, + /* dirty_flag */ FALSE, + /* flags */ H5C__NO_FLAGS_SET, + /* flush_flags */ H5C__FLUSH_CLEAR_ONLY_FLAG, + /* expected_deserialized */ TRUE, + /* expected_cleared */ FALSE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ FALSE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 4, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ FALSE, + /* dirty_flag */ TRUE, + /* flags */ H5C__NO_FLAGS_SET, + /* flush_flags */ H5C__FLUSH_CLEAR_ONLY_FLAG, + /* expected_deserialized */ TRUE, + /* expected_cleared */ TRUE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ FALSE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 5, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ FALSE, + /* dirty_flag */ FALSE, + /* flags */ H5C__NO_FLAGS_SET, + /* flush_flags */ H5C__FLUSH_INVALIDATE_FLAG, + /* expected_deserialized */ TRUE, + /* expected_cleared */ FALSE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ TRUE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 6, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ FALSE, + /* dirty_flag */ TRUE, + /* flags */ H5C__NO_FLAGS_SET, + /* flush_flags */ H5C__FLUSH_INVALIDATE_FLAG, + /* expected_deserialized */ TRUE, + /* expected_cleared */ FALSE, + /* expected_serialized */ TRUE, + /* expected_destroyed */ TRUE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 7, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ FALSE, + /* dirty_flag */ FALSE, + /* flags */ H5C__NO_FLAGS_SET, + /* flush_flags */ H5C__FLUSH_MARKED_ENTRIES_FLAG, + /* expected_deserialized */ TRUE, + /* expected_cleared */ FALSE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ FALSE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 8, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ FALSE, + /* dirty_flag */ TRUE, + /* flags */ H5C__NO_FLAGS_SET, + /* flush_flags */ H5C__FLUSH_MARKED_ENTRIES_FLAG, + /* expected_deserialized */ TRUE, + /* expected_cleared */ FALSE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ FALSE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 9, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ FALSE, + /* dirty_flag */ FALSE, + /* flags */ H5C__NO_FLAGS_SET, + /* flush_flags */ H5C__FLUSH_INVALIDATE_FLAG | + H5C__FLUSH_CLEAR_ONLY_FLAG, + /* expected_deserialized */ TRUE, + /* expected_cleared */ FALSE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ TRUE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 10, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ FALSE, + /* dirty_flag */ TRUE, + /* flags */ H5C__NO_FLAGS_SET, + /* flush_flags */ H5C__FLUSH_INVALIDATE_FLAG | + H5C__FLUSH_CLEAR_ONLY_FLAG, + /* expected_deserialized */ TRUE, + /* expected_cleared */ TRUE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ TRUE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 11, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ FALSE, + /* dirty_flag */ FALSE, + /* flags */ H5C__NO_FLAGS_SET, + /* flush_flags */ H5C__FLUSH_MARKED_ENTRIES_FLAG | + H5C__FLUSH_CLEAR_ONLY_FLAG, + /* expected_deserialized */ TRUE, + /* expected_cleared */ FALSE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ FALSE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 12, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ FALSE, + /* dirty_flag */ TRUE, + /* flags */ H5C__NO_FLAGS_SET, + /* flush_flags */ H5C__FLUSH_MARKED_ENTRIES_FLAG | + H5C__FLUSH_CLEAR_ONLY_FLAG, + /* expected_deserialized */ TRUE, + /* expected_cleared */ FALSE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ FALSE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 13, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ FALSE, + /* dirty_flag */ FALSE, + /* flags */ H5C__NO_FLAGS_SET, + /* flush_flags */ H5C__FLUSH_MARKED_ENTRIES_FLAG | + H5C__FLUSH_INVALIDATE_FLAG, + /* expected_deserialized */ TRUE, + /* expected_cleared */ FALSE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ TRUE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 14, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ FALSE, + /* dirty_flag */ TRUE, + /* flags */ H5C__NO_FLAGS_SET, + /* flush_flags */ H5C__FLUSH_MARKED_ENTRIES_FLAG | + H5C__FLUSH_INVALIDATE_FLAG, + /* expected_deserialized */ TRUE, + /* expected_cleared */ FALSE, + /* expected_serialized */ TRUE, + /* expected_destroyed */ TRUE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 15, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ FALSE, + /* dirty_flag */ FALSE, + /* flags */ H5C__NO_FLAGS_SET, + /* flush_flags */ H5C__FLUSH_INVALIDATE_FLAG | + H5C__FLUSH_CLEAR_ONLY_FLAG | + H5C__FLUSH_MARKED_ENTRIES_FLAG, + /* expected_deserialized */ TRUE, + /* expected_cleared */ FALSE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ TRUE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 16, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ FALSE, + /* dirty_flag */ TRUE, + /* flags */ H5C__NO_FLAGS_SET, + /* flush_flags */ H5C__FLUSH_INVALIDATE_FLAG | + H5C__FLUSH_CLEAR_ONLY_FLAG | + H5C__FLUSH_MARKED_ENTRIES_FLAG, + /* expected_deserialized */ TRUE, + /* expected_cleared */ TRUE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ TRUE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 17, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ FALSE, + /* dirty_flag */ FALSE, + /* flags */ H5C__SET_FLUSH_MARKER_FLAG, + /* flush_flags */ H5C__NO_FLAGS_SET, + /* expected_deserialized */ TRUE, + /* expected_cleared */ FALSE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ FALSE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 18, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ FALSE, + /* dirty_flag */ TRUE, + /* flags */ H5C__SET_FLUSH_MARKER_FLAG, + /* flush_flags */ H5C__NO_FLAGS_SET, + /* expected_deserialized */ TRUE, + /* expected_cleared */ FALSE, + /* expected_serialized */ TRUE, + /* expected_destroyed */ FALSE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 19, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ FALSE, + /* dirty_flag */ FALSE, + /* flags */ H5C__SET_FLUSH_MARKER_FLAG, + /* flush_flags */ H5C__FLUSH_CLEAR_ONLY_FLAG, + /* expected_deserialized */ TRUE, + /* expected_cleared */ FALSE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ FALSE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 20, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ FALSE, + /* dirty_flag */ TRUE, + /* flags */ H5C__SET_FLUSH_MARKER_FLAG, + /* flush_flags */ H5C__FLUSH_CLEAR_ONLY_FLAG, + /* expected_deserialized */ TRUE, + /* expected_cleared */ TRUE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ FALSE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 21, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ FALSE, + /* dirty_flag */ FALSE, + /* flags */ H5C__SET_FLUSH_MARKER_FLAG, + /* flush_flags */ H5C__FLUSH_INVALIDATE_FLAG, + /* expected_deserialized */ TRUE, + /* expected_cleared */ FALSE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ TRUE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 22, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ FALSE, + /* dirty_flag */ TRUE, + /* flags */ H5C__SET_FLUSH_MARKER_FLAG, + /* flush_flags */ H5C__FLUSH_INVALIDATE_FLAG, + /* expected_deserialized */ TRUE, + /* expected_cleared */ FALSE, + /* expected_serialized */ TRUE, + /* expected_destroyed */ TRUE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 23, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ FALSE, + /* dirty_flag */ FALSE, + /* flags */ H5C__SET_FLUSH_MARKER_FLAG, + /* flush_flags */ H5C__FLUSH_MARKED_ENTRIES_FLAG, + /* expected_deserialized */ TRUE, + /* expected_cleared */ FALSE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ FALSE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 24, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ FALSE, + /* dirty_flag */ TRUE, + /* flags */ H5C__SET_FLUSH_MARKER_FLAG, + /* flush_flags */ H5C__FLUSH_MARKED_ENTRIES_FLAG, + /* expected_deserialized */ TRUE, + /* expected_cleared */ FALSE, + /* expected_serialized */ TRUE, + /* expected_destroyed */ FALSE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 25, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ FALSE, + /* dirty_flag */ FALSE, + /* flags */ H5C__SET_FLUSH_MARKER_FLAG, + /* flush_flags */ H5C__FLUSH_INVALIDATE_FLAG | + H5C__FLUSH_CLEAR_ONLY_FLAG, + /* expected_deserialized */ TRUE, + /* expected_cleared */ FALSE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ TRUE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 26, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ FALSE, + /* dirty_flag */ TRUE, + /* flags */ H5C__SET_FLUSH_MARKER_FLAG, + /* flush_flags */ H5C__FLUSH_INVALIDATE_FLAG | + H5C__FLUSH_CLEAR_ONLY_FLAG, + /* expected_deserialized */ TRUE, + /* expected_cleared */ TRUE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ TRUE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 27, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ FALSE, + /* dirty_flag */ FALSE, + /* flags */ H5C__SET_FLUSH_MARKER_FLAG, + /* flush_flags */ H5C__FLUSH_MARKED_ENTRIES_FLAG | + H5C__FLUSH_CLEAR_ONLY_FLAG, + /* expected_deserialized */ TRUE, + /* expected_cleared */ FALSE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ FALSE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 28, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ FALSE, + /* dirty_flag */ TRUE, + /* flags */ H5C__SET_FLUSH_MARKER_FLAG, + /* flush_flags */ H5C__FLUSH_MARKED_ENTRIES_FLAG | + H5C__FLUSH_CLEAR_ONLY_FLAG, + /* expected_deserialized */ TRUE, + /* expected_cleared */ TRUE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ FALSE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 29, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ FALSE, + /* dirty_flag */ FALSE, + /* flags */ H5C__SET_FLUSH_MARKER_FLAG, + /* flush_flags */ H5C__FLUSH_MARKED_ENTRIES_FLAG | + H5C__FLUSH_INVALIDATE_FLAG, + /* expected_deserialized */ TRUE, + /* expected_cleared */ FALSE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ TRUE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 30, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ FALSE, + /* dirty_flag */ TRUE, + /* flags */ H5C__SET_FLUSH_MARKER_FLAG, + /* flush_flags */ H5C__FLUSH_MARKED_ENTRIES_FLAG | + H5C__FLUSH_INVALIDATE_FLAG, + /* expected_deserialized */ TRUE, + /* expected_cleared */ FALSE, + /* expected_serialized */ TRUE, + /* expected_destroyed */ TRUE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 31, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ FALSE, + /* dirty_flag */ FALSE, + /* flags */ H5C__SET_FLUSH_MARKER_FLAG, + /* flush_flags */ H5C__FLUSH_INVALIDATE_FLAG | + H5C__FLUSH_CLEAR_ONLY_FLAG | + H5C__FLUSH_MARKED_ENTRIES_FLAG, + /* expected_deserialized */ TRUE, + /* expected_cleared */ FALSE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ TRUE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 32, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ FALSE, + /* dirty_flag */ TRUE, + /* flags */ H5C__SET_FLUSH_MARKER_FLAG, + /* flush_flags */ H5C__FLUSH_INVALIDATE_FLAG | + H5C__FLUSH_CLEAR_ONLY_FLAG | + H5C__FLUSH_MARKED_ENTRIES_FLAG, + /* expected_deserialized */ TRUE, + /* expected_cleared */ TRUE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ TRUE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 33, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ TRUE, + /* dirty_flag */ FALSE, + /* flags */ H5C__NO_FLAGS_SET, + /* flush_flags */ H5C__NO_FLAGS_SET, + /* expected_deserialized */ FALSE, + /* expected_cleared */ FALSE, + /* expected_serialized */ TRUE, + /* expected_destroyed */ FALSE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 34, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ TRUE, + /* dirty_flag */ TRUE, + /* flags */ H5C__NO_FLAGS_SET, + /* flush_flags */ H5C__NO_FLAGS_SET, + /* expected_deserialized */ FALSE, + /* expected_cleared */ FALSE, + /* expected_serialized */ TRUE, + /* expected_destroyed */ FALSE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 35, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ TRUE, + /* dirty_flag */ FALSE, + /* flags */ H5C__NO_FLAGS_SET, + /* flush_flags */ H5C__FLUSH_CLEAR_ONLY_FLAG, + /* expected_deserialized */ FALSE, + /* expected_cleared */ TRUE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ FALSE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 36, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ TRUE, + /* dirty_flag */ TRUE, + /* flags */ H5C__NO_FLAGS_SET, + /* flush_flags */ H5C__FLUSH_CLEAR_ONLY_FLAG, + /* expected_deserialized */ FALSE, + /* expected_cleared */ TRUE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ FALSE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 37, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ TRUE, + /* dirty_flag */ FALSE, + /* flags */ H5C__NO_FLAGS_SET, + /* flush_flags */ H5C__FLUSH_INVALIDATE_FLAG, + /* expected_deserialized */ FALSE, + /* expected_cleared */ FALSE, + /* expected_serialized */ TRUE, + /* expected_destroyed */ TRUE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 38, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ TRUE, + /* dirty_flag */ TRUE, + /* flags */ H5C__NO_FLAGS_SET, + /* flush_flags */ H5C__FLUSH_INVALIDATE_FLAG, + /* expected_deserialized */ FALSE, + /* expected_cleared */ FALSE, + /* expected_serialized */ TRUE, + /* expected_destroyed */ TRUE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 39, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ TRUE, + /* dirty_flag */ FALSE, + /* flags */ H5C__NO_FLAGS_SET, + /* flush_flags */ H5C__FLUSH_MARKED_ENTRIES_FLAG, + /* expected_deserialized */ FALSE, + /* expected_cleared */ FALSE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ FALSE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 40, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ TRUE, + /* dirty_flag */ TRUE, + /* flags */ H5C__NO_FLAGS_SET, + /* flush_flags */ H5C__FLUSH_MARKED_ENTRIES_FLAG, + /* expected_deserialized */ FALSE, + /* expected_cleared */ FALSE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ FALSE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 41, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ TRUE, + /* dirty_flag */ FALSE, + /* flags */ H5C__NO_FLAGS_SET, + /* flush_flags */ H5C__FLUSH_INVALIDATE_FLAG | + H5C__FLUSH_CLEAR_ONLY_FLAG, + /* expected_deserialized */ FALSE, + /* expected_cleared */ TRUE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ TRUE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 42, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ TRUE, + /* dirty_flag */ TRUE, + /* flags */ H5C__NO_FLAGS_SET, + /* flush_flags */ H5C__FLUSH_INVALIDATE_FLAG | + H5C__FLUSH_CLEAR_ONLY_FLAG, + /* expected_deserialized */ FALSE, + /* expected_cleared */ TRUE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ TRUE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 43, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ TRUE, + /* dirty_flag */ FALSE, + /* flags */ H5C__NO_FLAGS_SET, + /* flush_flags */ H5C__FLUSH_MARKED_ENTRIES_FLAG | + H5C__FLUSH_CLEAR_ONLY_FLAG, + /* expected_deserialized */ FALSE, + /* expected_cleared */ FALSE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ FALSE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 44, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ TRUE, + /* dirty_flag */ TRUE, + /* flags */ H5C__NO_FLAGS_SET, + /* flush_flags */ H5C__FLUSH_MARKED_ENTRIES_FLAG | + H5C__FLUSH_CLEAR_ONLY_FLAG, + /* expected_deserialized */ FALSE, + /* expected_cleared */ FALSE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ FALSE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 45, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ TRUE, + /* dirty_flag */ FALSE, + /* flags */ H5C__NO_FLAGS_SET, + /* flush_flags */ H5C__FLUSH_MARKED_ENTRIES_FLAG | + H5C__FLUSH_INVALIDATE_FLAG, + /* expected_deserialized */ FALSE, + /* expected_cleared */ FALSE, + /* expected_serialized */ TRUE, + /* expected_destroyed */ TRUE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 46, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ TRUE, + /* dirty_flag */ TRUE, + /* flags */ H5C__NO_FLAGS_SET, + /* flush_flags */ H5C__FLUSH_MARKED_ENTRIES_FLAG | + H5C__FLUSH_INVALIDATE_FLAG, + /* expected_deserialized */ FALSE, + /* expected_cleared */ FALSE, + /* expected_serialized */ TRUE, + /* expected_destroyed */ TRUE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 47, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ TRUE, + /* dirty_flag */ FALSE, + /* flags */ H5C__NO_FLAGS_SET, + /* flush_flags */ H5C__FLUSH_INVALIDATE_FLAG | + H5C__FLUSH_CLEAR_ONLY_FLAG | + H5C__FLUSH_MARKED_ENTRIES_FLAG, + /* expected_deserialized */ FALSE, + /* expected_cleared */ TRUE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ TRUE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 48, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ TRUE, + /* dirty_flag */ TRUE, + /* flags */ H5C__NO_FLAGS_SET, + /* flush_flags */ H5C__FLUSH_INVALIDATE_FLAG | + H5C__FLUSH_CLEAR_ONLY_FLAG | + H5C__FLUSH_MARKED_ENTRIES_FLAG, + /* expected_deserialized */ FALSE, + /* expected_cleared */ TRUE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ TRUE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 49, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ TRUE, + /* dirty_flag */ FALSE, + /* flags */ H5C__SET_FLUSH_MARKER_FLAG, + /* flush_flags */ H5C__NO_FLAGS_SET, + /* expected_deserialized */ FALSE, + /* expected_cleared */ FALSE, + /* expected_serialized */ TRUE, + /* expected_destroyed */ FALSE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 50, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ TRUE, + /* dirty_flag */ TRUE, + /* flags */ H5C__SET_FLUSH_MARKER_FLAG, + /* flush_flags */ H5C__NO_FLAGS_SET, + /* expected_deserialized */ FALSE, + /* expected_cleared */ FALSE, + /* expected_serialized */ TRUE, + /* expected_destroyed */ FALSE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 51, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ TRUE, + /* dirty_flag */ FALSE, + /* flags */ H5C__SET_FLUSH_MARKER_FLAG, + /* flush_flags */ H5C__FLUSH_CLEAR_ONLY_FLAG, + /* expected_deserialized */ FALSE, + /* expected_cleared */ TRUE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ FALSE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 52, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ TRUE, + /* dirty_flag */ TRUE, + /* flags */ H5C__SET_FLUSH_MARKER_FLAG, + /* flush_flags */ H5C__FLUSH_CLEAR_ONLY_FLAG, + /* expected_deserialized */ FALSE, + /* expected_cleared */ TRUE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ FALSE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 53, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ TRUE, + /* dirty_flag */ FALSE, + /* flags */ H5C__SET_FLUSH_MARKER_FLAG, + /* flush_flags */ H5C__FLUSH_INVALIDATE_FLAG, + /* expected_deserialized */ FALSE, + /* expected_cleared */ FALSE, + /* expected_serialized */ TRUE, + /* expected_destroyed */ TRUE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 54, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ TRUE, + /* dirty_flag */ TRUE, + /* flags */ H5C__SET_FLUSH_MARKER_FLAG, + /* flush_flags */ H5C__FLUSH_INVALIDATE_FLAG, + /* expected_deserialized */ FALSE, + /* expected_cleared */ FALSE, + /* expected_serialized */ TRUE, + /* expected_destroyed */ TRUE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 55, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ TRUE, + /* dirty_flag */ FALSE, + /* flags */ H5C__SET_FLUSH_MARKER_FLAG, + /* flush_flags */ H5C__FLUSH_MARKED_ENTRIES_FLAG, + /* expected_deserialized */ FALSE, + /* expected_cleared */ FALSE, + /* expected_serialized */ TRUE, + /* expected_destroyed */ FALSE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 56, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ TRUE, + /* dirty_flag */ TRUE, + /* flags */ H5C__SET_FLUSH_MARKER_FLAG, + /* flush_flags */ H5C__FLUSH_MARKED_ENTRIES_FLAG, + /* expected_deserialized */ FALSE, + /* expected_cleared */ FALSE, + /* expected_serialized */ TRUE, + /* expected_destroyed */ FALSE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 57, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ TRUE, + /* dirty_flag */ FALSE, + /* flags */ H5C__SET_FLUSH_MARKER_FLAG, + /* flush_flags */ H5C__FLUSH_INVALIDATE_FLAG | + H5C__FLUSH_CLEAR_ONLY_FLAG, + /* expected_deserialized */ FALSE, + /* expected_cleared */ TRUE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ TRUE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 58, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ TRUE, + /* dirty_flag */ TRUE, + /* flags */ H5C__SET_FLUSH_MARKER_FLAG, + /* flush_flags */ H5C__FLUSH_INVALIDATE_FLAG | + H5C__FLUSH_CLEAR_ONLY_FLAG, + /* expected_deserialized */ FALSE, + /* expected_cleared */ TRUE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ TRUE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 59, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ TRUE, + /* dirty_flag */ FALSE, + /* flags */ H5C__SET_FLUSH_MARKER_FLAG, + /* flush_flags */ H5C__FLUSH_MARKED_ENTRIES_FLAG | + H5C__FLUSH_CLEAR_ONLY_FLAG, + /* expected_deserialized */ FALSE, + /* expected_cleared */ TRUE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ FALSE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 60, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ TRUE, + /* dirty_flag */ TRUE, + /* flags */ H5C__SET_FLUSH_MARKER_FLAG, + /* flush_flags */ H5C__FLUSH_MARKED_ENTRIES_FLAG | + H5C__FLUSH_CLEAR_ONLY_FLAG, + /* expected_deserialized */ FALSE, + /* expected_cleared */ TRUE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ FALSE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 61, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ TRUE, + /* dirty_flag */ FALSE, + /* flags */ H5C__SET_FLUSH_MARKER_FLAG, + /* flush_flags */ H5C__FLUSH_MARKED_ENTRIES_FLAG | + H5C__FLUSH_INVALIDATE_FLAG, + /* expected_deserialized */ FALSE, + /* expected_cleared */ FALSE, + /* expected_serialized */ TRUE, + /* expected_destroyed */ TRUE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 62, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ TRUE, + /* dirty_flag */ TRUE, + /* flags */ H5C__SET_FLUSH_MARKER_FLAG, + /* flush_flags */ H5C__FLUSH_MARKED_ENTRIES_FLAG | + H5C__FLUSH_INVALIDATE_FLAG, + /* expected_deserialized */ FALSE, + /* expected_cleared */ FALSE, + /* expected_serialized */ TRUE, + /* expected_destroyed */ TRUE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 63, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ TRUE, + /* dirty_flag */ FALSE, + /* flags */ H5C__SET_FLUSH_MARKER_FLAG, + /* flush_flags */ H5C__FLUSH_INVALIDATE_FLAG | + H5C__FLUSH_CLEAR_ONLY_FLAG | + H5C__FLUSH_MARKED_ENTRIES_FLAG, + /* expected_deserialized */ FALSE, + /* expected_cleared */ TRUE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ TRUE + ); + } + + if ( pass ) { + + check_flush_cache__single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ 64, + /* entry_type */ PICO_ENTRY_TYPE, + /* entry_idx */ 0, + /* insert_flag */ TRUE, + /* dirty_flag */ TRUE, + /* flags */ H5C__SET_FLUSH_MARKER_FLAG, + /* flush_flags */ H5C__FLUSH_INVALIDATE_FLAG | + H5C__FLUSH_CLEAR_ONLY_FLAG | + H5C__FLUSH_MARKED_ENTRIES_FLAG, + /* expected_deserialized */ FALSE, + /* expected_cleared */ TRUE, + /* expected_serialized */ FALSE, + /* expected_destroyed */ TRUE + ); + } + + + /* Now run single entry tests for pinned entries. Test all combinations + * of: + * + * 1) Unpin by unprotect vs. unpin by call to H5C_unpin_entry(). + * + * 2) Marked dirty by unprotect or not. + * + * 3) Marked dirty by call to H5C_mark_pinned_entry_dirty() or not. + * + * 4) Marked dirty by call to H5C_mark_pinned_or_protected_entry_dirty() + * while protected or not. + * + * 5) Marked dirty by call to H5C_mark_pinned_or_protected_entry_dirty() + * while pinned or not. + * + * 6) Entry marked for flush or not. + * + * 7) Call flush with H5C__FLUSH_MARKED_ENTRIES_FLAG or not. + * + * 8) Call flush with H5C__FLUSH_CLEAR_ONLY_FLAG or not. + * + * This yields a total of 256 tests. + * + * The tests and their expected results are given in the spec table + * below. The values assigned to the expected_cleared, expected_flushed, + * and expected_destroyed fields are somewhat arcane, so the following + * overview may be useful. + * + * In addition to simply checking to see if the test case runs, + * we also check to see if the desired operations take place on the + * cache entry. Thus expected_cleared is set to TRUE if we expect + * the entry to be flushed, expected_flushed is set to TRUE if we + * we expect the entry to be flushed, and expected_destroyed is set + * to TRUE if we expect the entry to be destroyed. + * + * In this test, we are working with pinned entries which can't be + * evicted, so expected_destroyed is always FALSE. We could pull it + * from the table, but it is a hold over from the code this test + * was adapted from, and it doesn't do any particular harm. + * + * In general, we expect an entry to be flushed if it is dirty, and + * flush in invoked WITHOUT the H5C__FLUSH_CLEAR_ONLY_FLAG. However, + * there are exceptions: If flush is invoked with the + * H5C__FLUSH_MARKED_ENTRIES_FLAG, only marked entries will be flushed. + * + * Further, unprotecting an entry with the H5C__SET_FLUSH_MARKER_FLAG + * will NOT mark the entry unless the entry has either been marked + * dirty either before or durting the unprotect call. This results in + * some counterintuitive entries in the table. It make be useful to + * look in the test code to see the exact order of operations. + * + * Similarly, we expect an entry to be cleared if it is dirty, and + * flush is invoked WITH the H5C__FLUSH_CLEAR_ONLY_FLAG. Again, there + * are exceptions -- If flush is also invoked with the + * H5C__FLUSH_MARKED_ENTRIES_FLAG, only the marked entries will be + * cleared. + * + * The above comments about applying unprotect with the + * H5C__SET_FLUSH_MARKER_FLAG apply here as well. + */ + + if ( pass ) { + + int i; + struct pinned_single_entry_test_spec + { + int test_num; + int entry_type; + int entry_idx; + hbool_t dirty_flag; + hbool_t mark_dirty; + hbool_t pop_mark_dirty_prot; + hbool_t pop_mark_dirty_pinned; + hbool_t unprotect_unpin; + unsigned int flags; + unsigned int flush_flags; + hbool_t expected_cleared; + hbool_t expected_serialized; + hbool_t expected_destroyed; + } spec[256] = + /* pop pop + * ent mark mark + * test entry -ry dirty mark dirty dirty unprot flush expect expect expect + * num type idx flag dirty prot pinned unpin flags flags clear srlzd destroy + */ + { { 1, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, FALSE, FALSE, H5C__NO_FLAGS_SET, H5C__NO_FLAGS_SET, FALSE, FALSE, FALSE }, + { 2, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, FALSE, TRUE, H5C__NO_FLAGS_SET, H5C__NO_FLAGS_SET, FALSE, FALSE, FALSE }, + { 3, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, TRUE, FALSE, H5C__NO_FLAGS_SET, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 4, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, TRUE, TRUE, H5C__NO_FLAGS_SET, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 5, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, FALSE, FALSE, H5C__NO_FLAGS_SET, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 6, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, FALSE, TRUE, H5C__NO_FLAGS_SET, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 7, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, TRUE, FALSE, H5C__NO_FLAGS_SET, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 8, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, TRUE, TRUE, H5C__NO_FLAGS_SET, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 9, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, FALSE, FALSE, H5C__NO_FLAGS_SET, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 10, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, FALSE, TRUE, H5C__NO_FLAGS_SET, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 11, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, TRUE, FALSE, H5C__NO_FLAGS_SET, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 12, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, TRUE, TRUE, H5C__NO_FLAGS_SET, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 13, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, FALSE, FALSE, H5C__NO_FLAGS_SET, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 14, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, FALSE, TRUE, H5C__NO_FLAGS_SET, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 15, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, TRUE, FALSE, H5C__NO_FLAGS_SET, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 16, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, TRUE, TRUE, H5C__NO_FLAGS_SET, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 17, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, FALSE, FALSE, H5C__NO_FLAGS_SET, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 18, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, FALSE, TRUE, H5C__NO_FLAGS_SET, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 19, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, TRUE, FALSE, H5C__NO_FLAGS_SET, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 20, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, TRUE, TRUE, H5C__NO_FLAGS_SET, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 21, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, FALSE, FALSE, H5C__NO_FLAGS_SET, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 22, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, FALSE, TRUE, H5C__NO_FLAGS_SET, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 23, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, TRUE, FALSE, H5C__NO_FLAGS_SET, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 24, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, TRUE, TRUE, H5C__NO_FLAGS_SET, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 25, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, FALSE, FALSE, H5C__NO_FLAGS_SET, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 26, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, FALSE, TRUE, H5C__NO_FLAGS_SET, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 27, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, TRUE, FALSE, H5C__NO_FLAGS_SET, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 28, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, TRUE, TRUE, H5C__NO_FLAGS_SET, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 29, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, FALSE, FALSE, H5C__NO_FLAGS_SET, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 30, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, FALSE, TRUE, H5C__NO_FLAGS_SET, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 31, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, TRUE, FALSE, H5C__NO_FLAGS_SET, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 32, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, TRUE, TRUE, H5C__NO_FLAGS_SET, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 33, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET, FALSE, FALSE, FALSE }, + { 34, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, FALSE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET, FALSE, FALSE, FALSE }, + { 35, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 36, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, TRUE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 37, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 38, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, FALSE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 39, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 40, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, TRUE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 41, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 42, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, FALSE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 43, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 44, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, TRUE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 45, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 46, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, FALSE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 47, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 48, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, TRUE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 49, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 50, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, FALSE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 51, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 52, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, TRUE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 53, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 54, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, FALSE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 55, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 56, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, TRUE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 57, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 58, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, FALSE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 59, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 60, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, TRUE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 61, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 62, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, FALSE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 63, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 64, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, TRUE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__NO_FLAGS_SET, FALSE, TRUE, FALSE }, + { 65, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, FALSE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, + { 66, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, FALSE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, + { 67, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, TRUE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, + { 68, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, TRUE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, + { 69, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, FALSE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, + { 70, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, FALSE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, + { 71, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, TRUE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, + { 72, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, TRUE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, + { 73, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, FALSE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, + { 74, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, FALSE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, + { 75, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, TRUE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, + { 76, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, TRUE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, + { 77, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, FALSE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, + { 78, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, FALSE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, + { 79, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, TRUE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, + { 80, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, TRUE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, + { 81, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, FALSE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, + { 82, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, FALSE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, + { 83, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, TRUE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, + { 84, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, TRUE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, + { 85, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, FALSE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, + { 86, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, FALSE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, + { 87, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, TRUE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, + { 88, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, TRUE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, + { 89, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, FALSE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, + { 90, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, FALSE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, + { 91, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, TRUE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, + { 92, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, TRUE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, + { 93, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, FALSE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, + { 94, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, FALSE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, + { 95, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, TRUE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, + { 96, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, TRUE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, + { 97, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, + { 98, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, FALSE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, + { 99, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, + { 100, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, TRUE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, + { 101, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, + { 102, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, FALSE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, + { 103, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, + { 104, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, TRUE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, + { 105, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, + { 106, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, FALSE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, + { 107, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, + { 108, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, TRUE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, + { 109, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, + { 110, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, FALSE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, + { 111, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, + { 112, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, TRUE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, + { 113, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, + { 114, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, FALSE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, + { 115, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, + { 116, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, TRUE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, + { 117, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, + { 118, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, FALSE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, + { 119, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, + { 120, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, TRUE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, + { 121, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, + { 122, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, FALSE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, + { 123, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, + { 124, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, TRUE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, + { 125, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, + { 126, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, FALSE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, + { 127, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, + { 128, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, TRUE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, + { 129, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, FALSE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 130, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, FALSE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 131, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, TRUE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 132, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, TRUE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 133, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, FALSE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 134, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, FALSE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 135, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, TRUE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 136, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, TRUE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 137, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, FALSE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 138, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, FALSE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 139, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, TRUE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 140, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, TRUE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 141, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, FALSE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 142, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, FALSE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 143, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, TRUE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 144, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, TRUE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 145, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, FALSE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 146, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, FALSE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 147, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, TRUE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 148, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, TRUE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 149, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, FALSE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 150, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, FALSE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 151, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, TRUE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 152, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, TRUE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 153, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, FALSE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 154, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, FALSE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 155, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, TRUE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 156, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, TRUE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 157, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, FALSE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 158, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, FALSE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 159, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, TRUE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 160, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, TRUE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 161, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 162, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, FALSE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 163, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 164, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, TRUE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 165, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 166, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, FALSE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 167, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 168, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, TRUE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 169, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 170, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, FALSE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 171, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 172, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, TRUE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 173, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 174, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, FALSE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 175, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 176, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, TRUE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 177, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 178, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, FALSE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 179, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 180, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, TRUE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 181, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 182, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, FALSE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 183, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 184, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, TRUE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 185, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 186, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, FALSE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 187, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 188, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, TRUE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 189, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 190, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, FALSE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 191, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 192, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, TRUE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 193, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, FALSE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 194, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, FALSE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 195, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, TRUE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 196, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, TRUE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 197, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, FALSE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 198, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, FALSE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 199, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, TRUE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 200, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, TRUE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 201, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, FALSE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 202, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, FALSE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 203, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, TRUE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 204, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, TRUE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 205, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, FALSE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 206, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, FALSE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 207, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, TRUE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 208, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, TRUE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 209, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, FALSE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 210, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, FALSE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 211, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, TRUE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 212, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, TRUE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 213, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, FALSE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 214, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, FALSE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 215, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, TRUE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 216, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, TRUE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 217, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, FALSE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 218, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, FALSE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 219, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, TRUE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 220, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, TRUE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 221, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, FALSE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 222, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, FALSE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 223, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, TRUE, FALSE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 224, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, TRUE, TRUE, H5C__NO_FLAGS_SET, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 225, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 226, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, FALSE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 227, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 228, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, TRUE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 229, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 230, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, FALSE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 231, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 232, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, TRUE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 233, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 234, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, FALSE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 235, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 236, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, TRUE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, + { 237, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 238, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, FALSE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 239, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 240, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, TRUE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 241, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 242, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, FALSE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 243, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 244, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, TRUE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 245, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 246, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, FALSE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 247, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 248, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, TRUE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 249, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 250, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, FALSE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 251, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 252, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, TRUE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 253, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, FALSE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 254, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, FALSE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 255, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, TRUE, FALSE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, + { 256, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, TRUE, TRUE, H5C__SET_FLUSH_MARKER_FLAG, H5C__FLUSH_MARKED_ENTRIES_FLAG | H5C__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE } }; + + i = 0; + while ( ( pass ) && ( i < 256 ) ) + { + check_flush_cache__pinned_single_entry_test + ( + /* file_ptr */ file_ptr, + /* test_num */ spec[i].test_num, + /* entry_type */ spec[i].entry_type, + /* entry_idx */ spec[i].entry_idx, + /* dirty_flag */ spec[i].dirty_flag, + /* mark_dirty */ spec[i].mark_dirty, + /* pop_mark_dirty_prot */ spec[i].pop_mark_dirty_prot, + /* pop_mark_dirty_pinned */ spec[i].pop_mark_dirty_pinned, + /* unprotect_unpin */ spec[i].unprotect_unpin, + /* flags */ spec[i].flags, + /* flush_flags */ spec[i].flush_flags, + /* expected_cleared */ spec[i].expected_cleared, + /* expected_serialized */ spec[i].expected_serialized, + /* expected_destroyed */ spec[i].expected_destroyed + ); + i++; + } + } + + return; + +} /* check_flush_cache__single_entry() */ + + +/*------------------------------------------------------------------------- + * Function: check_flush_cache__single_entry_test() + * + * Purpose: Run a single entry flush cache test. + * + * Return: void + * + * Programmer: John Mainzer + * 1/12/05 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +static void +check_flush_cache__single_entry_test(H5F_t * file_ptr, + int test_num, + int entry_type, + int entry_idx, + hbool_t insert_flag, + hbool_t dirty_flag, + unsigned int flags, + unsigned int flush_flags, + hbool_t expected_deserialized, + hbool_t expected_cleared, + hbool_t expected_serialized, + hbool_t expected_destroyed) +{ + /* const char * fcn_name = "check_flush_cache__single_entry_test"; */ + H5C_t * cache_ptr = file_ptr->shared->cache; + static char msg[128]; + herr_t result; + test_entry_t * base_addr; + test_entry_t * entry_ptr; + + if ( cache_ptr == NULL ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "cache_ptr NULL on entry to single entry test #%d.", + test_num); + failure_mssg = msg; + } + else if ( ( cache_ptr->index_len != 0 ) || + ( cache_ptr->index_size != 0 ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "cache not empty at beginning of single entry test #%d.", + test_num); + failure_mssg = msg; + } + else if ( ( entry_type < 0 ) || ( entry_type >= NUMBER_OF_ENTRY_TYPES ) || + ( entry_idx < 0 ) || ( entry_idx > max_indices[entry_type] ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "Bad parameters on entry to single entry test #%d.", + test_num); + failure_mssg = msg; + } + + if ( pass ) { + + base_addr = entries[entry_type]; + entry_ptr = &(base_addr[entry_idx]); + + if ( insert_flag ) { + + insert_entry(file_ptr, entry_type, entry_idx, dirty_flag, flags); + + } else { + + protect_entry(file_ptr, entry_type, entry_idx); + + unprotect_entry(file_ptr, entry_type, entry_idx, + (int)dirty_flag, flags); + } + } + + if ( pass ) { + + result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, flush_flags); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "flush with flags 0x%x failed in single entry test #%d.", + flush_flags, test_num); + failure_mssg = msg; + } +#ifndef NDEBUG + /* The clear_dirty_bits() callback is only called in debug mode -- + * thus we can only do our full test on the expected entry history + * when debug is enabled. + */ + else if ( ( entry_ptr->deserialized != expected_deserialized ) || + ( entry_ptr->cleared != expected_cleared ) || + ( entry_ptr->serialized != expected_serialized ) || + ( entry_ptr->destroyed != expected_destroyed ) ) { +#else + /* When in procduction mode, the clear_dirty_bits() callback is + * not called, so entry_ptr->cleared should never be set. + */ + else if ( ( entry_ptr->deserialized != expected_deserialized ) || + ( entry_ptr->cleared ) || + ( entry_ptr->serialized != expected_serialized ) || + ( entry_ptr->destroyed != expected_destroyed ) ) { +#endif /* NDEBUG */ +#if 1 /* This is useful debugging code -- lets keep it for a while */ + + HDfprintf(stdout, + "desrlzd = %d(%d), clrd = %d(%d), srlzd = %d(%d), dest = %d(%d)\n", + (int)(entry_ptr->deserialized), + (int)expected_deserialized, + (int)(entry_ptr->cleared), + (int)expected_cleared, + (int)(entry_ptr->serialized), + (int)expected_serialized, + (int)(entry_ptr->destroyed), + (int)expected_destroyed); +#endif + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "Unexpected entry status after flush in single entry test #%d.", + test_num); + failure_mssg = msg; + } + else if ( ( ( (flush_flags & H5C__FLUSH_INVALIDATE_FLAG) == 0 ) + && + ( ( cache_ptr->index_len != 1 ) + || + ( cache_ptr->index_size != entry_sizes[entry_type] ) + ) + ) + || + ( ( (flush_flags & H5C__FLUSH_INVALIDATE_FLAG) != 0 ) + && + ( ( cache_ptr->index_len != 0 ) + || + ( cache_ptr->index_size != 0 ) + ) + ) + ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "Unexpected cache len/size after flush in single entry test #%d.", + test_num); + failure_mssg = msg; + } + } + + + /* clean up the cache to prep for the next test */ + if ( pass ) { + + result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, + H5C__FLUSH_INVALIDATE_FLAG); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "Flush failed on cleanup in single entry test #%d.", + test_num); + failure_mssg = msg; + } + else if ( ( cache_ptr->index_len != 0 ) || + ( cache_ptr->index_size != 0 ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "Unexpected cache len/size after cleanup in single entry test #%d.", + test_num); + failure_mssg = msg; + + } else { + + entry_ptr->deserialized = FALSE; + entry_ptr->cleared = FALSE; + entry_ptr->serialized = FALSE; + entry_ptr->destroyed = FALSE; + } + } + + return; + +} /* check_flush_cache__single_entry_test() */ + + +/*------------------------------------------------------------------------- + * Function: check_flush_cache__pinned_single_entry_test() + * + * Purpose: Run a pinned single entry flush cache test. + * + * Return: void + * + * Programmer: John Mainzer + * 3/28/06 + * + * Modifications: + * + * JRM -- 5/17/06 + * Added the pop_mark_dirty_prot and pop_mark_dirty_pinned + * flags and supporting code to allow us to test the + * H5C_mark_pinned_or_protected_entry_dirty() call. Use the + * call to mark the entry dirty while the entry is protected + * if pop_mark_dirty_prot is TRUE, and to mark the entry + * dirty while it is pinned if pop_mark_dirty_pinned is TRUE. + * + *------------------------------------------------------------------------- + */ + +static void +check_flush_cache__pinned_single_entry_test(H5F_t * file_ptr, + int test_num, + int entry_type, + int entry_idx, + hbool_t dirty_flag, + hbool_t mark_dirty, + hbool_t pop_mark_dirty_prot, + hbool_t pop_mark_dirty_pinned, + hbool_t unprotect_unpin, + unsigned int flags, + unsigned int flush_flags, + hbool_t expected_cleared, + hbool_t expected_serialized, + hbool_t expected_destroyed) +{ + /* const char *fcn_name = "check_flush_cache__pinned_single_entry_test"; */ + H5C_t * cache_ptr = file_ptr->shared->cache; + static char msg[128]; + hbool_t expected_deserialized = TRUE; + herr_t result; + test_entry_t * base_addr; + test_entry_t * entry_ptr; + + if ( cache_ptr == NULL ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "cache_ptr NULL on entry to pinned single entry test #%d.", + test_num); + failure_mssg = msg; + } + else if ( ( cache_ptr->index_len != 0 ) || + ( cache_ptr->index_size != 0 ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "cache not empty at beginning of pinned single entry test #%d.", + test_num); + failure_mssg = msg; + } + else if ( ( entry_type < 0 ) || ( entry_type >= NUMBER_OF_ENTRY_TYPES ) || + ( entry_idx < 0 ) || ( entry_idx > max_indices[entry_type] ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "Bad parameters on entry to pinned single entry test #%d.", + test_num); + failure_mssg = msg; + } + + if ( pass ) { + + base_addr = entries[entry_type]; + entry_ptr = &(base_addr[entry_idx]); + + protect_entry(file_ptr, entry_type, entry_idx); + + if ( pop_mark_dirty_prot ) { + + mark_pinned_or_protected_entry_dirty(file_ptr, + entry_type, + entry_idx); + } + + unprotect_entry(file_ptr, entry_type, entry_idx, + (int)dirty_flag, (flags | H5C__PIN_ENTRY_FLAG)); + + if ( mark_dirty ) { + + mark_pinned_entry_dirty(file_ptr, entry_type, entry_idx, + FALSE, (size_t)0); + } + + if ( pop_mark_dirty_pinned ) { + + mark_pinned_or_protected_entry_dirty(file_ptr, + entry_type, + entry_idx); + } + } + + if ( pass ) { + + result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, flush_flags); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "flush with flags 0x%x failed in pinned single entry test #%d.", + flush_flags, test_num); + failure_mssg = msg; + } +#ifndef NDEBUG + /* The clear_dirty_bits() callback is only called in debug mode -- + * thus we can only do our full test on the expected entry history + * when debug is enabled. + */ + else if ( ( entry_ptr->deserialized != expected_deserialized ) || + ( entry_ptr->cleared != expected_cleared ) || + ( entry_ptr->serialized != expected_serialized ) || + ( entry_ptr->destroyed != expected_destroyed ) ) { +#else + /* When in procduction mode, the clear_dirty_bits() callback is + * not called, so entry_ptr->cleared should never be set. + */ + else if ( ( entry_ptr->deserialized != expected_deserialized ) || + ( entry_ptr->cleared ) || + ( entry_ptr->serialized != expected_serialized ) || + ( entry_ptr->destroyed != expected_destroyed ) ) { +#endif +#if 0 /* this is useful debugging code -- keep it around */ + HDfprintf(stdout, + "desrlzd = %d(%d), clrd = %d(%d), srlzd = %d(%d), dest = %d(%d)\n", + (int)(entry_ptr->deserialized), + (int)expected_deserialized, + (int)(entry_ptr->cleared), + (int)expected_cleared, + (int)(entry_ptr->serialized), + (int)expected_serialized, + (int)(entry_ptr->destroyed), + (int)expected_destroyed); +#endif + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "Unexpected entry status after flush in pinned single entry test #%d.", + test_num); + failure_mssg = msg; + } + else if ( ( ( (flush_flags & H5C__FLUSH_INVALIDATE_FLAG) == 0 ) + && + ( ( cache_ptr->index_len != 1 ) + || + ( cache_ptr->index_size != entry_sizes[entry_type] ) + ) + ) + || + ( ( (flush_flags & H5C__FLUSH_INVALIDATE_FLAG) != 0 ) + && + ( ( cache_ptr->index_len != 0 ) + || + ( cache_ptr->index_size != 0 ) + ) + ) + ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "Unexpected cache len/size after flush in pinned single entry test #%d.", + test_num); + failure_mssg = msg; + } + } + + + /* clean up the cache to prep for the next test */ + if ( pass ) { + + if ( unprotect_unpin ) { + + protect_entry(file_ptr, entry_type, entry_idx); + + unprotect_entry(file_ptr, entry_type, entry_idx, + (int)dirty_flag, H5C__UNPIN_ENTRY_FLAG); + + } else { + + unpin_entry(file_ptr, entry_type, entry_idx); + + } + } + + if ( pass ) { + + result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, + H5C__FLUSH_INVALIDATE_FLAG); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "Flush failed on cleanup in pinned single entry test #%d.", + test_num); + failure_mssg = msg; + } + else if ( ( cache_ptr->index_len != 0 ) || + ( cache_ptr->index_size != 0 ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "Unexpected cache len/size after cleanup in pinned single entry test #%d.", + test_num); + failure_mssg = msg; + + } else { + + entry_ptr->deserialized = FALSE; + entry_ptr->cleared = FALSE; + entry_ptr->serialized = FALSE; + entry_ptr->destroyed = FALSE; + } + } + + return; + +} /* check_flush_cache__pinned_single_entry_test() */ + + +/*------------------------------------------------------------------------- + * Function: check_get_entry_status() + * + * Purpose: Verify that H5C_get_entry_status() behaves as expected. + * + * Return: void + * + * Programmer: John Mainzer + * 4/28/06 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +static unsigned +check_get_entry_status(void) +{ + const char * fcn_name = "check_get_entry_status"; + static char msg[128]; + herr_t result; + hbool_t in_cache; + hbool_t is_dirty; + hbool_t is_protected; + hbool_t is_pinned; + size_t entry_size; + H5F_t * file_ptr = NULL; + test_entry_t * base_addr; + test_entry_t * entry_ptr; + + TESTING("H5C_get_entry_status() functionality"); + + core_file_driver_failed = FALSE; + + pass = TRUE; + + if ( pass ) { + + reset_entries(); + + file_ptr = setup_cache((size_t)(2 * 1024 * 1024), + (size_t)(1 * 1024 * 1024)); + + base_addr = entries[0]; + entry_ptr = &(base_addr[0]); + } + + if ( pass ) { + + /* entry not in cache -- only in_cache should be touched by + * the call. Thus, only check that boolean. + */ + + result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size, + &in_cache, &is_dirty, &is_protected, &is_pinned); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "H5C_get_entry_status() reports failure 1."); + failure_mssg = msg; + + } else if ( in_cache ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected status 1."); + failure_mssg = msg; + } + } + + protect_entry(file_ptr, 0, 0); + + unprotect_entry(file_ptr, 0, 0, FALSE, H5C__NO_FLAGS_SET); + + if ( pass ) { + + result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size, + &in_cache, &is_dirty, &is_protected, &is_pinned); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "H5C_get_entry_status() reports failure 2."); + failure_mssg = msg; + + } else if ( !in_cache || is_dirty || is_protected || is_pinned ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected status 2."); + failure_mssg = msg; + } + } + + protect_entry(file_ptr, 0, 0); + + if ( pass ) { + + result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size, + &in_cache, &is_dirty, &is_protected, &is_pinned); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "H5C_get_entry_status() reports failure 3."); + failure_mssg = msg; + + } else if ( !in_cache || is_dirty || !is_protected || is_pinned ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected status 3."); + failure_mssg = msg; + } + } + + unprotect_entry(file_ptr, 0, 0, FALSE, H5C__PIN_ENTRY_FLAG); + + if ( pass ) { + + result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size, + &in_cache, &is_dirty, &is_protected, &is_pinned); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "H5C_get_entry_status() reports failure 4."); + failure_mssg = msg; + + } else if ( !in_cache || is_dirty || is_protected || !is_pinned ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected status 4."); + failure_mssg = msg; + } + } + + mark_pinned_entry_dirty(file_ptr, 0, 0, FALSE, (size_t)0); + + if ( pass ) { + + result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size, + &in_cache, &is_dirty, &is_protected, &is_pinned); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "H5C_get_entry_status() reports failure 5."); + failure_mssg = msg; + + } else if ( !in_cache || !is_dirty || is_protected || !is_pinned ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected status 5."); + failure_mssg = msg; + } + } + + unpin_entry(file_ptr, 0, 0); + + if ( pass ) { + + result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size, + &in_cache, &is_dirty, &is_protected, &is_pinned); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "H5C_get_entry_status() reports failure 6."); + failure_mssg = msg; + + } else if ( !in_cache || !is_dirty || is_protected || is_pinned ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected status 6."); + failure_mssg = msg; + } + } + + if ( pass ) { + + takedown_cache(file_ptr, FALSE, FALSE); + } + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + if ( core_file_driver_failed ) { + + HDfprintf(stdout, + "%s(): Unable to open test file with core file driver.\n", + fcn_name); + } + + return !pass; + +} /* check_get_entry_status() */ + + +/*------------------------------------------------------------------------- + * Function: check_expunge_entry() + * + * Purpose: Verify that H5C_expunge_entry() behaves as expected. + * + * Return: void + * + * Programmer: John Mainzer + * 7/5/06 + * + * Modifications: + * + * JRM -- 10/15/07 + * Minor updates to conform to new cache API. + * + *------------------------------------------------------------------------- + */ + +static unsigned +check_expunge_entry(void) +{ + const char * fcn_name = "check_expunge_entry"; + static char msg[128]; + herr_t result; + hbool_t in_cache; + hbool_t is_dirty; + hbool_t is_protected; + hbool_t is_pinned; + size_t entry_size; + H5F_t * file_ptr = NULL; + test_entry_t * base_addr; + test_entry_t * entry_ptr; + + TESTING("H5C_expunge_entry() functionality"); + + core_file_driver_failed = FALSE; + + pass = TRUE; + + if ( pass ) { + + reset_entries(); + + file_ptr = setup_cache((size_t)(2 * 1024 * 1024), + (size_t)(1 * 1024 * 1024)); + + base_addr = entries[0]; + entry_ptr = &(base_addr[0]); + } + + if ( pass ) { + + /* entry not in cache -- only in_cache should be touched by + * the status call. Thus, only check that boolean. + */ + + result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size, + &in_cache, &is_dirty, &is_protected, + &is_pinned); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "H5C_get_entry_status() reports failure 1."); + failure_mssg = msg; + + } else if ( in_cache ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected status 1."); + failure_mssg = msg; + + } else if ( ( entry_ptr->deserialized ) || + ( entry_ptr->cleared ) || + ( entry_ptr->serialized ) || + ( entry_ptr->destroyed ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected entry history 1."); + failure_mssg = msg; + + } + } + + /* protect an entry to force the cache to load it, and then unprotect + * it without marking it dirty. + */ + + protect_entry(file_ptr, 0, 0); + + unprotect_entry(file_ptr, 0, 0, FALSE, H5C__NO_FLAGS_SET); + + if ( pass ) { + + result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size, + &in_cache, &is_dirty, &is_protected, &is_pinned); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "H5C_get_entry_status() reports failure 2."); + failure_mssg = msg; + + } else if ( !in_cache || is_dirty || is_protected || is_pinned ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected status 2."); + failure_mssg = msg; + + } else if ( ( ! entry_ptr->deserialized ) || + ( entry_ptr->cleared ) || + ( entry_ptr->serialized ) || + ( entry_ptr->destroyed ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected entry history 2."); + failure_mssg = msg; + + } + } + + /* Expunge the entry and then verify that it is no longer in the cache. + * Also verify that the entry was loaded, cleared, and destroyed, but + * not flushed. + * + * JRM -- 10/15/07 + * With the advent of the new cache API, the old clear() callback has + * been replaced with the new clear_dirty_bits() callback. This + * callback is only called if the entry is dirty to begin with. + * Thus, the entry will no longer be marked as cleared. + */ + expunge_entry(file_ptr, 0, 0); + + if ( pass ) { + + /* entry shouldn't be in cache -- only in_cache should be touched + * by the status call. Thus, only check that boolean. + */ + + result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size, + &in_cache, &is_dirty, &is_protected, &is_pinned); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "H5C_get_entry_status() reports failure 3."); + failure_mssg = msg; + + } else if ( in_cache ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected status 3."); + failure_mssg = msg; + + } else if ( ( ! entry_ptr->deserialized ) || + ( entry_ptr->cleared ) || + ( entry_ptr->serialized ) || + ( ! entry_ptr->destroyed ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected entry history 3."); + failure_mssg = msg; + + } + } + + /* now repeat the process with a different entry. On unprotect + * mark the entry as dirty. Verify that it is not flushed. + */ + + base_addr = entries[0]; + entry_ptr = &(base_addr[1]); + + if ( pass ) { + + /* entry not in cache -- only in_cache should be touched by + * the status call. Thus, only check that boolean. + */ + + result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size, + &in_cache, &is_dirty, &is_protected, + &is_pinned); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "H5C_get_entry_status() reports failure 4."); + failure_mssg = msg; + + } else if ( in_cache ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected status 4."); + failure_mssg = msg; + + } else if ( ( entry_ptr->deserialized ) || + ( entry_ptr->cleared ) || + ( entry_ptr->serialized ) || + ( entry_ptr->destroyed ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected entry history 4."); + failure_mssg = msg; + + } + } + + /* protect the entry to force the cache to load it, and then unprotect + * it with the dirty flag set. + */ + + protect_entry(file_ptr, 0, 1); + + unprotect_entry(file_ptr, 0, 1, TRUE, H5C__NO_FLAGS_SET); + + if ( pass ) { + + result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size, + &in_cache, &is_dirty, &is_protected, + &is_pinned); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "H5C_get_entry_status() reports failure 5."); + failure_mssg = msg; + + } else if ( !in_cache || !is_dirty || is_protected || is_pinned ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected status 5."); + failure_mssg = msg; + + } else if ( ( ! entry_ptr->deserialized ) || + ( entry_ptr->cleared ) || + ( entry_ptr->serialized ) || + ( entry_ptr->destroyed ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected entry history 5."); + failure_mssg = msg; + + } + } + + /* Expunge the entry and then verify that it is no longer in the cache. + * Also verify that the entry was loaded, cleared and destroyed, but not + * flushed. + */ + expunge_entry(file_ptr, 0, 1); + + if ( pass ) { + + /* entry shouldn't be in cache -- only in_cache should be touched + * by the status call. Thus, only check that boolean. + */ + + result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size, + &in_cache, &is_dirty, &is_protected, + &is_pinned); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "H5C_get_entry_status() reports failure 6."); + failure_mssg = msg; + + } else if ( in_cache ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected status 6."); + failure_mssg = msg; + +#ifndef NDEBUG + /* The clear_dirty_bits() callback is only called in debug mode -- + * thus we can only do our full test on the expected entry history + * when debug is enabled. + */ + } else if ( ( ! entry_ptr->deserialized ) || + ( ! entry_ptr->cleared ) || + ( entry_ptr->serialized ) || + ( ! entry_ptr->destroyed ) ) { +#else + /* When in procduction mode, the clear_dirty_bits() callback is + * not called, so entry_ptr->cleared should never be set. + */ + } else if ( ( ! entry_ptr->deserialized ) || + ( entry_ptr->cleared ) || + ( entry_ptr->serialized ) || + ( ! entry_ptr->destroyed ) ) { +#endif /* NDEBUG */ + + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected entry history 6."); + failure_mssg = msg; + + } + } + + if ( pass ) { + + takedown_cache(file_ptr, FALSE, FALSE); + } + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + if ( core_file_driver_failed ) { + + HDfprintf(stdout, + "%s(): Unable to open test file with core file driver.\n", + fcn_name); + } + + return !pass; + +} /* check_expunge_entry() */ + + +/*------------------------------------------------------------------------- + * Function: check_multiple_read_protect() + * + * Purpose: Verify that multiple, simultaneous read protects of a + * single entry perform as expectd. + * + * Return: void + * + * Programmer: John Mainzer + * 4/1/07 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + + +static unsigned +check_multiple_read_protect(void) +{ + const char * fcn_name = "check_multiple_read_protect()"; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + test_entry_t * entry_ptr; + + TESTING("multiple read only protects on a single entry"); + + core_file_driver_failed = FALSE; + + pass = TRUE; + + /* allocate a cache. Should succeed. + * + * Then to start with, proceed as follows: + * + * Read protect an entry. + * + * Then read protect the entry again. Should succeed. + * + * Read protect yet again. Should succeed. + * + * Unprotect with no changes, and then read protect twice again. + * Should succeed. + * + * Now unprotect three times. Should succeed. + * + * If stats are enabled, verify that correct stats are collected at + * every step. + * + * Also, verify internal state of read protects at every step. + */ + + if ( pass ) { + + reset_entries(); + + file_ptr = setup_cache((size_t)(2 * 1024), + (size_t)(1 * 1024)); + cache_ptr = file_ptr->shared->cache; + + entry_ptr = &((entries[0])[0]); + + if ( ( entry_ptr->header.is_protected ) || + ( entry_ptr->header.is_read_only ) || + ( entry_ptr->header.ro_ref_count != 0 ) ) { + + pass = FALSE; + failure_mssg = "Unexpected ro protected status 1.\n"; + } + } + +#if H5C_COLLECT_CACHE_STATS + if ( ( cache_ptr->write_protects[0] != 0 ) || + ( cache_ptr->read_protects[0] != 0 ) || + ( cache_ptr->max_read_protects[0] != 0 ) ) { + + pass = FALSE; + failure_mssg = "Unexpected protect stats 1.\n"; + } +#endif /* H5C_COLLECT_CACHE_STATS */ + + if ( pass ) + { + protect_entry_ro(file_ptr, 0, 0); + + if ( ( ! ( entry_ptr->header.is_protected ) ) || + ( ! ( entry_ptr->header.is_read_only ) ) || + ( entry_ptr->header.ro_ref_count != 1 ) ) { + + pass = FALSE; + failure_mssg = "Unexpected ro protected status 2.\n"; + } + } + +#if H5C_COLLECT_CACHE_STATS + if ( ( cache_ptr->write_protects[0] != 0 ) || + ( cache_ptr->read_protects[0] != 1 ) || + ( cache_ptr->max_read_protects[0] != 1 ) ) { + + pass = FALSE; + failure_mssg = "Unexpected protect stats 2.\n"; + } +#endif /* H5C_COLLECT_CACHE_STATS */ + + if ( pass ) + { + protect_entry_ro(file_ptr, 0, 0); + + if ( ( ! ( entry_ptr->header.is_protected ) ) || + ( ! ( entry_ptr->header.is_read_only ) ) || + ( entry_ptr->header.ro_ref_count != 2 ) ) { + + pass = FALSE; + failure_mssg = "Unexpected ro protected status 3.\n"; + } + } + +#if H5C_COLLECT_CACHE_STATS + if ( ( cache_ptr->write_protects[0] != 0 ) || + ( cache_ptr->read_protects[0] != 2 ) || + ( cache_ptr->max_read_protects[0] != 2 ) ) { + + pass = FALSE; + failure_mssg = "Unexpected protect stats 3.\n"; + } +#endif /* H5C_COLLECT_CACHE_STATS */ + + if ( pass ) + { + unprotect_entry(file_ptr, 0, 0, FALSE, H5C__NO_FLAGS_SET); + + if ( ( ! ( entry_ptr->header.is_protected ) ) || + ( ! ( entry_ptr->header.is_read_only ) ) || + ( entry_ptr->header.ro_ref_count != 1 ) ) { + + pass = FALSE; + failure_mssg = "Unexpected ro protected status 4.\n"; + } + } + +#if H5C_COLLECT_CACHE_STATS + if ( ( cache_ptr->write_protects[0] != 0 ) || + ( cache_ptr->read_protects[0] != 2 ) || + ( cache_ptr->max_read_protects[0] != 2 ) ) { + + pass = FALSE; + failure_mssg = "Unexpected protect stats 4.\n"; + } +#endif /* H5C_COLLECT_CACHE_STATS */ + + if ( pass ) + { + protect_entry_ro(file_ptr, 0, 0); + + if ( ( ! ( entry_ptr->header.is_protected ) ) || + ( ! ( entry_ptr->header.is_read_only ) ) || + ( entry_ptr->header.ro_ref_count != 2 ) ) { + + pass = FALSE; + failure_mssg = "Unexpected ro protected status 5.\n"; + } + } + +#if H5C_COLLECT_CACHE_STATS + if ( ( cache_ptr->write_protects[0] != 0 ) || + ( cache_ptr->read_protects[0] != 3 ) || + ( cache_ptr->max_read_protects[0] != 2 ) ) { + + pass = FALSE; + failure_mssg = "Unexpected protect stats 5.\n"; + } +#endif /* H5C_COLLECT_CACHE_STATS */ + + if ( pass ) + { + protect_entry_ro(file_ptr, 0, 0); + + if ( ( ! ( entry_ptr->header.is_protected ) ) || + ( ! ( entry_ptr->header.is_read_only ) ) || + ( entry_ptr->header.ro_ref_count != 3 ) ) { + + pass = FALSE; + failure_mssg = "Unexpected ro protected status 6.\n"; + } + } + +#if H5C_COLLECT_CACHE_STATS + if ( ( cache_ptr->write_protects[0] != 0 ) || + ( cache_ptr->read_protects[0] != 4 ) || + ( cache_ptr->max_read_protects[0] != 3 ) ) { + + pass = FALSE; + failure_mssg = "Unexpected protect stats 6.\n"; + } +#endif /* H5C_COLLECT_CACHE_STATS */ + + if ( pass ) + { + unprotect_entry(file_ptr, 0, 0, FALSE, H5C__NO_FLAGS_SET); + + if ( ( ! ( entry_ptr->header.is_protected ) ) || + ( ! ( entry_ptr->header.is_read_only ) ) || + ( entry_ptr->header.ro_ref_count != 2 ) ) { + + pass = FALSE; + failure_mssg = "Unexpected ro protected status 7.\n"; + } + } + +#if H5C_COLLECT_CACHE_STATS + if ( ( cache_ptr->write_protects[0] != 0 ) || + ( cache_ptr->read_protects[0] != 4 ) || + ( cache_ptr->max_read_protects[0] != 3 ) ) { + + pass = FALSE; + failure_mssg = "Unexpected protect stats 7.\n"; + } +#endif /* H5C_COLLECT_CACHE_STATS */ + + if ( pass ) + { + unprotect_entry(file_ptr, 0, 0, FALSE, H5C__NO_FLAGS_SET); + + if ( ( ! ( entry_ptr->header.is_protected ) ) || + ( ! ( entry_ptr->header.is_read_only ) ) || + ( entry_ptr->header.ro_ref_count != 1 ) ) { + + pass = FALSE; + failure_mssg = "Unexpected ro protected status 8.\n"; + } + } + +#if H5C_COLLECT_CACHE_STATS + if ( ( cache_ptr->write_protects[0] != 0 ) || + ( cache_ptr->read_protects[0] != 4 ) || + ( cache_ptr->max_read_protects[0] != 3 ) ) { + + pass = FALSE; + failure_mssg = "Unexpected protect stats 8.\n"; + } +#endif /* H5C_COLLECT_CACHE_STATS */ + + if ( pass ) + { + unprotect_entry(file_ptr, 0, 0, FALSE, H5C__NO_FLAGS_SET); + + if ( ( entry_ptr->header.is_protected ) || + ( entry_ptr->header.is_read_only ) || + ( entry_ptr->header.ro_ref_count != 0 ) ) { + + pass = FALSE; + failure_mssg = "Unexpected ro protected status 9.\n"; + } + } + +#if H5C_COLLECT_CACHE_STATS + if ( ( cache_ptr->write_protects[0] != 0 ) || + ( cache_ptr->read_protects[0] != 4 ) || + ( cache_ptr->max_read_protects[0] != 3 ) ) { + + pass = FALSE; + failure_mssg = "Unexpected protect stats 9.\n"; + } +#endif /* H5C_COLLECT_CACHE_STATS */ + + + /* If we get this far, do a write protect and unprotect to verify + * that the stats are getting collected properly here as well. + */ + + if ( pass ) + { + protect_entry(file_ptr, 0, 0); + + if ( ( ! ( entry_ptr->header.is_protected ) ) || + ( entry_ptr->header.is_read_only ) || + ( entry_ptr->header.ro_ref_count != 0 ) ) { + + pass = FALSE; + failure_mssg = "Unexpected ro protected status 10.\n"; + } + } + +#if H5C_COLLECT_CACHE_STATS + if ( ( cache_ptr->write_protects[0] != 1 ) || + ( cache_ptr->read_protects[0] != 4 ) || + ( cache_ptr->max_read_protects[0] != 3 ) ) { + + pass = FALSE; + failure_mssg = "Unexpected protect stats 10.\n"; + } +#endif /* H5C_COLLECT_CACHE_STATS */ + + if ( pass ) + { + unprotect_entry(file_ptr, 0, 0, FALSE, H5C__NO_FLAGS_SET); + + if ( ( entry_ptr->header.is_protected ) || + ( entry_ptr->header.is_read_only ) || + ( entry_ptr->header.ro_ref_count != 0 ) ) { + + pass = FALSE; + failure_mssg = "Unexpected ro protected status 11.\n"; + } + } + +#if H5C_COLLECT_CACHE_STATS + if ( ( cache_ptr->write_protects[0] != 1 ) || + ( cache_ptr->read_protects[0] != 4 ) || + ( cache_ptr->max_read_protects[0] != 3 ) ) { + + pass = FALSE; + failure_mssg = "Unexpected protect stats 11.\n"; + } +#endif /* H5C_COLLECT_CACHE_STATS */ + + + /* Finally, mix things up a little, using a mix of reads and + * and writes on different entries. Also include a pin to verify + * that it works as well. + * + * Stats are looking OK, so we will only test them one more time + * at the end to ensure that all is at it should be. + */ + + if ( pass ) { + + protect_entry(file_ptr, 0, 2); /* (0,2) write */ + protect_entry_ro(file_ptr, 0, 4); /* (0,4) read only (1) */ + protect_entry(file_ptr, 0, 6); /* (0,6) write */ + + unprotect_entry(file_ptr, 0, 2, FALSE, /* (0,2) unprotect */ + H5C__NO_FLAGS_SET); + + protect_entry_ro(file_ptr, 0, 2); /* (0,2) read only (1) */ + protect_entry(file_ptr, 0, 1); /* (0,1) write */ + protect_entry_ro(file_ptr, 0, 4); /* (0,4) read only (2) */ + protect_entry(file_ptr, 0, 0); /* (0,0) write */ + protect_entry_ro(file_ptr, 0, 2); /* (0,2) read only (2) */ + + unprotect_entry(file_ptr, 0, 2, FALSE, /* (0,2) read only (1) pin */ + H5C__PIN_ENTRY_FLAG); + unprotect_entry(file_ptr, 0, 6, FALSE, /* (0,6) unprotect */ + H5C__NO_FLAGS_SET); + + protect_entry_ro(file_ptr, 0, 4); /* (0,4) read only (3) */ + + unprotect_entry(file_ptr, 0, 2, FALSE, /* (0,2) unprotect */ + H5C__NO_FLAGS_SET); + unprotect_entry(file_ptr, 0, 1, FALSE, /* (0,1) unprotect */ + H5C__NO_FLAGS_SET); + + if ( pass ) { + + entry_ptr = &((entries[0])[4]); + + if ( H5C_pin_protected_entry((void *)entry_ptr) < 0 ) { + + pass = FALSE; + failure_mssg = "H5C_pin_protected_entry() failed.\n"; + + } else if ( ! (entry_ptr->header.is_pinned) ) { + + pass = FALSE; + failure_mssg = "entry (0,4) not pinned.\n"; + + } else { + + /* keep test bed sanity checks happy */ + entry_ptr->is_pinned = TRUE; + + } + } + + unprotect_entry(file_ptr, 0, 4, FALSE, /* (0,4) read only (2) */ + H5C__NO_FLAGS_SET); + unprotect_entry(file_ptr, 0, 4, FALSE, /* (0,4) read only (1) */ + H5C__UNPIN_ENTRY_FLAG); + + if ( ( pass ) && ( entry_ptr->header.is_pinned ) ) { + + pass = FALSE; + failure_mssg = "enty (0,4) still pinned.\n"; + + } + + unprotect_entry(file_ptr, 0, 4, FALSE, /* (0,4) unprotect */ + H5C__NO_FLAGS_SET); + unprotect_entry(file_ptr, 0, 0, FALSE, /* (0,0) unprotect */ + H5C__NO_FLAGS_SET); + + unpin_entry(file_ptr, 0, 2); + } + +#if H5C_COLLECT_CACHE_STATS + if ( ( cache_ptr->write_protects[0] != 5 ) || + ( cache_ptr->read_protects[0] != 9 ) || + ( cache_ptr->max_read_protects[0] != 3 ) ) { + + pass = FALSE; + failure_mssg = "Unexpected protect stats 11.\n"; + } +#endif /* H5C_COLLECT_CACHE_STATS */ + + + if ( pass ) { + + takedown_cache(file_ptr, FALSE, FALSE); + } + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + if ( core_file_driver_failed ) { + + HDfprintf(stdout, + "%s(): Unable to open test file with core file driver.\n", + fcn_name); + } + + return !pass; + +} /* check_multiple_read_protect() */ + + +/*------------------------------------------------------------------------- + * Function: check_rename_entry() + * + * Purpose: Verify that H5C_rename_entry behaves as expected. In + * particular, verify that it works correctly with pinned + * entries. + * + * Return: void + * + * Programmer: John Mainzer + * 4/26/06 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +static unsigned +check_rename_entry(void) +{ + const char * fcn_name = "check_rename_entry"; + int i; + H5F_t * file_ptr = NULL; + struct rename_entry_test_spec test_specs[4] = + { + { + /* int entry_type = */ PICO_ENTRY_TYPE, + /* int entry_index = */ 10, + /* hbool_t is_dirty = */ FALSE, + /* hbool_t is_pinned = */ FALSE + }, + { + /* int entry_type = */ PICO_ENTRY_TYPE, + /* int entry_index = */ 20, + /* hbool_t is_dirty = */ TRUE, + /* hbool_t is_pinned = */ FALSE + }, + { + /* int entry_type = */ PICO_ENTRY_TYPE, + /* int entry_index = */ 30, + /* hbool_t is_dirty = */ FALSE, + /* hbool_t is_pinned = */ TRUE + }, + { + /* int entry_type = */ PICO_ENTRY_TYPE, + /* int entry_index = */ 40, + /* hbool_t is_dirty = */ TRUE, + /* hbool_t is_pinned = */ TRUE + } + }; + + TESTING("H5C_rename_entry() functionality"); + + core_file_driver_failed = FALSE; + + pass = TRUE; + + /* allocate a cache, load entries into it, and then rename + * them. To the extent possible, verify that the desired + * actions took place. + * + * At present, we should do the following tests: + * + * 1) Rename a clean, unprotected, unpinned entry. + * + * 2) Rename a dirty, unprotected, unpinned entry. + * + * 3) Rename a clean, unprotected, pinned entry. + * + * 4) Rename a dirty, unprotected, pinned entry. + * + * In all cases, the entry should have moved to its + * new location, and have been marked dirty if it wasn't + * already. + * + * Unpinned entries should have been moved to the head + * of the LRU list. + * + * Pinned entries should remain untouched on the pinned entry + * list. + */ + + if ( pass ) { + + reset_entries(); + + file_ptr = setup_cache((size_t)(2 * 1024 * 1024), + (size_t)(1 * 1024 * 1024)); + } + + i = 0; + while ( ( pass ) && ( i < 4 ) ) + { + check_rename_entry__run_test(file_ptr, i, &(test_specs[i])); + i++; + } + + if ( pass ) { + + takedown_cache(file_ptr, FALSE, FALSE); + } + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + if ( core_file_driver_failed ) { + + HDfprintf(stdout, + "%s(): Unable to open test file with core file driver.\n", + fcn_name); + } + + return !pass; + +} /* check_rename_entry() */ + + +/*------------------------------------------------------------------------- + * Function: check_rename_entry__run_test() + * + * Purpose: Run a rename entry test. + * + * Do nothing if pass is FALSE on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 4/27/06 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +static void +check_rename_entry__run_test(H5F_t * file_ptr, + int test_num, + struct rename_entry_test_spec * spec_ptr) +{ + /* const char * fcn_name = "check_rename_entry__run_test"; */ + H5C_t * cache_ptr = file_ptr->shared->cache; + static char msg[128]; + unsigned int flags = H5C__NO_FLAGS_SET; + test_entry_t * base_addr; + test_entry_t * entry_ptr = NULL; + H5C_cache_entry_t * test_ptr = NULL; + + if ( cache_ptr == NULL ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "cache_ptr NULL on entry to rename test #%d.", + test_num); + failure_mssg = msg; + + } else if ( spec_ptr == NULL ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "spec_ptr NULL on entry to rename test #%d.", + test_num); + failure_mssg = msg; + + } + + if ( pass ) { + + base_addr = entries[spec_ptr->entry_type]; + entry_ptr = &(base_addr[spec_ptr->entry_index]); + + if ( ( entry_ptr->self != entry_ptr ) || + ( ( entry_ptr->cache_ptr != cache_ptr ) && + ( entry_ptr->cache_ptr != NULL ) ) || + ( ! ( entry_ptr->at_main_addr ) ) || + ( entry_ptr->addr != entry_ptr->main_addr ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "bad entry_ptr in rename test #%d.", + test_num); + failure_mssg = msg; + + } else if ( spec_ptr->is_pinned ) { + + flags |= H5C__PIN_ENTRY_FLAG; + } + } + + protect_entry(file_ptr, spec_ptr->entry_type, spec_ptr->entry_index); + + unprotect_entry(file_ptr, spec_ptr->entry_type, spec_ptr->entry_index, + (int)(spec_ptr->is_dirty), flags); + + rename_entry(cache_ptr, spec_ptr->entry_type, spec_ptr->entry_index, FALSE); + + if ( pass ) { + + /* verify that the rename took place, and that the cache's internal + * structures are as expected. Note that some sanity checking is + * done by rename_entry(), so we don't have to repeat it here. + */ + + if ( spec_ptr->is_pinned ) { + + if ( ! ( entry_ptr->header.is_pinned ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "Pinned entry not pinned after rename in test #%d.", + test_num); + failure_mssg = msg; + } + + if ( pass ) { + + test_ptr = cache_ptr->pel_head_ptr; + + while ( ( test_ptr != NULL ) && + ( test_ptr != (H5C_cache_entry_t *)entry_ptr ) ) + { + test_ptr = test_ptr->next; + } + + if ( test_ptr == NULL ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "Pinned entry not in pel after rename in test #%d.", + test_num); + failure_mssg = msg; + } + } + + unpin_entry(file_ptr, spec_ptr->entry_type, spec_ptr->entry_index); + + } else { + + if ( entry_ptr->header.is_pinned ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "Unpinned entry pinned after rename in test #%d.", + test_num); + failure_mssg = msg; + } + + if ( ( entry_ptr->header.prev != NULL ) || + ( cache_ptr->LRU_head_ptr != (H5C_cache_entry_t *)entry_ptr ) ) + { + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "Entry not at head of LRU after rename in test #%d.", + test_num); + failure_mssg = msg; + } + } + } + + /* put the entry back where it started from */ + rename_entry(cache_ptr, spec_ptr->entry_type, spec_ptr->entry_index, TRUE); + + return; + +} /* check_rename_entry__run_test() */ + + +/*------------------------------------------------------------------------- + * Function: check_pin_protected_entry() + * + * Purpose: Verify that H5C_pin_protected_entry behaves as expected. + * + * Return: void + * + * Programmer: John Mainzer + * 4/28/06 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +static unsigned +check_pin_protected_entry(void) +{ + const char * fcn_name = "check_pin_protected_entry"; + static char msg[128]; + herr_t result; + H5F_t * file_ptr = NULL; + test_entry_t * base_addr; + test_entry_t * entry_ptr; + + TESTING("H5C_pin_protected_entry() functionality"); + + core_file_driver_failed = FALSE; + + pass = TRUE; + + /* Create a cache, protect an entry, and then use H5C_pin_protected_entry() + * to pin it. Verify that the entry is in fact pined. Unprotect the entry + * to unpin it, and then destroy the cache. + */ + + if ( pass ) { + + reset_entries(); + + file_ptr = setup_cache((size_t)(2 * 1024 * 1024), + (size_t)(1 * 1024 * 1024)); + } + + protect_entry(file_ptr, 0, 0); + + if ( pass ) { + + base_addr = entries[0]; + entry_ptr = &(base_addr[0]); + + result = H5C_pin_protected_entry((void *)entry_ptr); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "H5C_pin_protected_entry() reports failure."); + failure_mssg = msg; + + } else if ( ! ( entry_ptr->header.is_pinned ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "entry not pinned when it should be."); + failure_mssg = msg; + + } else { + + entry_ptr->is_pinned = TRUE; + } + } + + unprotect_entry(file_ptr, 0, 0, FALSE, H5C__UNPIN_ENTRY_FLAG); + + if ( pass ) { + + takedown_cache(file_ptr, FALSE, FALSE); + } + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + if ( core_file_driver_failed ) { + + HDfprintf(stdout, + "%s(): Unable to open test file with core file driver.\n", + fcn_name); + } + + return !pass; + +} /* check_pin_protected_entry() */ + + +/*------------------------------------------------------------------------- + * Function: check_resize_entry() + * + * Purpose: Verify that H5C_resize_entry() and H5C_unprotect() resize + * entries as expected. + * + * Return: void + * + * Programmer: John Mainzer + * 7/7/06 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +static unsigned +check_resize_entry(void) +{ + const char * fcn_name = "check_resize_entry"; + static char msg[128]; + herr_t result; + hbool_t in_cache; + hbool_t is_dirty; + hbool_t is_protected; + hbool_t is_pinned; + size_t entry_size; + size_t reported_entry_size; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + test_entry_t * base_addr; + test_entry_t * entry_ptr; + + TESTING("entry resize functionality"); + + core_file_driver_failed = FALSE; + + /* Setup a cache and verify that it is empty. + * + * Then force the load of an entry by protecting it, and verify that + * the entry and cache have the expected sizes. + * + * Then unprotect the entry with the size changed flag and a reduced + * size. Verify that the entry and cache have the expected expected + * sizes. + * + * Use a second protect/unprotect cycle to restore the entry to + * its original size. Verify that the entry and cache have the + * expected sizes. + * + * Protect and unprotect the entry again to pin it. Use + * H5C_resize_entry to reduce its size. Verify that the entry + * and cache have the expected sizes. + * + * Use H5C_resize_entry again to restore the entry to its original + * size. Verify that the entry and cache have the expected sizes. + * + * Use a protect / unprotect cycle to unpin and destroy the entry. + * Verify that the entry and cache have the expected sizes. + * + * + * Obesrve that all the above tests have been done with only one + * entry in the cache. Repeat the tests with several entries in + * the cache. + */ + + pass = TRUE; + + /* tests with only one entry in the cache: */ + + if ( pass ) { + + reset_entries(); + + file_ptr = setup_cache((size_t)(2 * 1024 * 1024), + (size_t)(1 * 1024 * 1024)); + cache_ptr = file_ptr->shared->cache; + + base_addr = entries[LARGE_ENTRY_TYPE]; + entry_ptr = &(base_addr[0]); + entry_size = LARGE_ENTRY_SIZE; + } + + if ( pass ) { + + if ( ( cache_ptr->index_len != 0 ) || + ( cache_ptr->index_size != 0 ) || + ( cache_ptr->slist_len != 0 ) || + ( cache_ptr->slist_size != 0 ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected cache status 1."); + failure_mssg = msg; + + } + } + + protect_entry(file_ptr, LARGE_ENTRY_TYPE, 0); + + if ( pass ) { + + if ( ( cache_ptr->index_len != 1 ) || + ( cache_ptr->index_size != LARGE_ENTRY_SIZE ) || + ( cache_ptr->slist_len != 0 ) || + ( cache_ptr->slist_size != 0 ) ) { + + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected cache status 2."); + failure_mssg = msg; + + } + } + + if ( pass ) { + + result = H5C_get_entry_status(file_ptr, entry_ptr->addr, + &reported_entry_size, &in_cache, + &is_dirty, &is_protected, &is_pinned); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "H5C_get_entry_status() reports failure 1."); + failure_mssg = msg; + + } else if ( !in_cache || is_dirty || !is_protected || is_pinned ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected status 1."); + failure_mssg = msg; + + } else if ( ( ! entry_ptr->deserialized ) || + ( entry_ptr->cleared ) || + ( entry_ptr->serialized ) || + ( entry_ptr->destroyed ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected entry history 1."); + failure_mssg = msg; + + } + } + + if ( pass ) { + + result = H5C_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT, + &(types[LARGE_ENTRY_TYPE]), entry_ptr->addr, + (void *)entry_ptr, + H5C__SIZE_CHANGED_FLAG | H5C__DIRTIED_FLAG, + (LARGE_ENTRY_SIZE / 2)); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "H5C_unprotect() reports failure 1."); + failure_mssg = msg; + + } else { + + /* tidy up so we play nice with the standard protect / unprotect + * calls. + */ + entry_ptr->is_protected = FALSE; + entry_ptr->is_dirty = TRUE; + entry_ptr->size = LARGE_ENTRY_SIZE / 2; + } + } + + if ( pass ) { + + if ( ( cache_ptr->index_len != 1 ) || + ( cache_ptr->index_size != (LARGE_ENTRY_SIZE / 2) ) || + ( cache_ptr->slist_len != 1 ) || + ( cache_ptr->slist_size != (LARGE_ENTRY_SIZE / 2) ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected cache status 3."); + failure_mssg = msg; + + } + } + + if ( pass ) { + + result = H5C_get_entry_status(file_ptr, entry_ptr->addr, + &reported_entry_size, &in_cache, + &is_dirty, &is_protected, &is_pinned); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "H5C_get_entry_status() reports failure 2."); + failure_mssg = msg; + + } else if ( !in_cache || !is_dirty || is_protected || is_pinned || + ( reported_entry_size != (LARGE_ENTRY_SIZE / 2) ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected status 2."); + failure_mssg = msg; + + } else if ( ( ! entry_ptr->deserialized ) || + ( entry_ptr->cleared ) || + ( entry_ptr->serialized ) || + ( entry_ptr->destroyed ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected entry history 2."); + failure_mssg = msg; + + } + } + + protect_entry(file_ptr, LARGE_ENTRY_TYPE, 0); + + if ( pass ) { + + result = H5C_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT, + &(types[LARGE_ENTRY_TYPE]), entry_ptr->addr, + (void *)entry_ptr, + (H5C__DIRTIED_FLAG | H5C__SIZE_CHANGED_FLAG), + LARGE_ENTRY_SIZE); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "H5C_unprotect() reports failure 2."); + failure_mssg = msg; + + } else { + + /* tidy up so we play nice with the standard protect / unprotect + * calls. + */ + entry_ptr->is_protected = FALSE; + entry_ptr->is_dirty = TRUE; + entry_ptr->size = LARGE_ENTRY_SIZE; + } + } + + if ( pass ) { + + if ( ( cache_ptr->index_len != 1 ) || + ( cache_ptr->index_size != LARGE_ENTRY_SIZE ) || + ( cache_ptr->slist_len != 1 ) || + ( cache_ptr->slist_size != LARGE_ENTRY_SIZE ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected cache status 4."); + failure_mssg = msg; + + } + } + + if ( pass ) { + + result = H5C_get_entry_status(file_ptr, entry_ptr->addr, + &reported_entry_size, &in_cache, + &is_dirty, &is_protected, &is_pinned); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "H5C_get_entry_status() reports failure 3."); + failure_mssg = msg; + + } else if ( !in_cache || !is_dirty || is_protected || is_pinned || + ( reported_entry_size != LARGE_ENTRY_SIZE ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected status 3."); + failure_mssg = msg; + + } else if ( ( ! entry_ptr->deserialized ) || + ( entry_ptr->cleared ) || + ( entry_ptr->serialized ) || + ( entry_ptr->destroyed ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected entry history 3."); + failure_mssg = msg; + + } + } + + protect_entry(file_ptr, LARGE_ENTRY_TYPE, 0); + + unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, 0, FALSE, H5C__PIN_ENTRY_FLAG); + + if ( pass ) { + + result = H5C_resize_pinned_entry((void *)entry_ptr, + (LARGE_ENTRY_SIZE / 4)); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "H5C_resize_pinned_entry() reports failure 1."); + failure_mssg = msg; + + } + } + + if ( pass ) { + + if ( ( cache_ptr->index_len != 1 ) || + ( cache_ptr->index_size != (LARGE_ENTRY_SIZE / 4) ) || + ( cache_ptr->slist_len != 1 ) || + ( cache_ptr->slist_size != (LARGE_ENTRY_SIZE / 4) ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected cache status 5."); + failure_mssg = msg; + + } + } + + if ( pass ) { + + result = H5C_get_entry_status(file_ptr, entry_ptr->addr, + &reported_entry_size, &in_cache, + &is_dirty, &is_protected, &is_pinned); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "H5C_get_entry_status() reports failure 4."); + failure_mssg = msg; + + } else if ( !in_cache || !is_dirty || is_protected || ! is_pinned || + ( reported_entry_size != (LARGE_ENTRY_SIZE / 4) ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected status 4."); + failure_mssg = msg; + + } else if ( ( ! entry_ptr->deserialized ) || + ( entry_ptr->cleared ) || + ( entry_ptr->serialized ) || + ( entry_ptr->destroyed ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected entry history 4."); + failure_mssg = msg; + + } + } + + if ( pass ) { + + result = H5C_resize_pinned_entry((void *)entry_ptr, + LARGE_ENTRY_SIZE); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "H5C_resize_pinned_entry() reports failure 2."); + failure_mssg = msg; + + } + } + + if ( pass ) { + + if ( ( cache_ptr->index_len != 1 ) || + ( cache_ptr->index_size != LARGE_ENTRY_SIZE ) || + ( cache_ptr->slist_len != 1 ) || + ( cache_ptr->slist_size != LARGE_ENTRY_SIZE ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected cache status 6."); + failure_mssg = msg; + + } + } + + if ( pass ) { + + result = H5C_get_entry_status(file_ptr, entry_ptr->addr, + &reported_entry_size, &in_cache, + &is_dirty, &is_protected, &is_pinned); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "H5C_get_entry_status() reports failure 5."); + failure_mssg = msg; + + } else if ( !in_cache || !is_dirty || is_protected || ! is_pinned || + ( reported_entry_size != LARGE_ENTRY_SIZE ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected status 5."); + failure_mssg = msg; + + } else if ( ( ! entry_ptr->deserialized ) || + ( entry_ptr->cleared ) || + ( entry_ptr->serialized ) || + ( entry_ptr->destroyed ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected entry history 5."); + failure_mssg = msg; + + } + } + + protect_entry(file_ptr, LARGE_ENTRY_TYPE, 0); + + unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, 0, FALSE, + H5C__UNPIN_ENTRY_FLAG | H5C__DELETED_FLAG); + + if ( pass ) { + + result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size, + &in_cache, &is_dirty, &is_protected, + &is_pinned); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "H5C_get_entry_status() reports failure 6."); + failure_mssg = msg; + + } else if ( in_cache ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected status 6."); + failure_mssg = msg; + +#ifndef NDEBUG + /* The clear_dirty_bits() callback is only called in debug mode -- + * thus we can only do our full test on the expected entry history + * when debug is enabled. + */ + } else if ( ( ! entry_ptr->deserialized ) || + ( ! entry_ptr->cleared ) || + ( entry_ptr->serialized ) || + ( ! entry_ptr->destroyed ) ) { +#else + /* When in procduction mode, the clear_dirty_bits() callback is + * not called, so entry_ptr->cleared should never be set. + */ + } else if ( ( ! entry_ptr->deserialized ) || + ( entry_ptr->cleared ) || + ( entry_ptr->serialized ) || + ( ! entry_ptr->destroyed ) ) { +#endif /* NDEBUG */ + + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected entry history 6."); + failure_mssg = msg; + + } + } + + if ( pass ) { + + if ( ( cache_ptr->index_len != 0 ) || + ( cache_ptr->index_size != 0 ) || + ( cache_ptr->slist_len != 0 ) || + ( cache_ptr->slist_size != 0 ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected cache status 7."); + failure_mssg = msg; + + } + } + + + /* now repreat the above tests with several entries in the cache: */ + + if ( pass ) { + + if ( ( cache_ptr->index_len != 0 ) || + ( cache_ptr->index_size != 0 ) || + ( cache_ptr->slist_len != 0 ) || + ( cache_ptr->slist_size != 0 ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected cache status 8."); + failure_mssg = msg; + + } + base_addr = entries[LARGE_ENTRY_TYPE]; + entry_ptr = &(base_addr[3]); + entry_size = LARGE_ENTRY_SIZE; + } + + protect_entry(file_ptr, LARGE_ENTRY_TYPE, 0); + unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, 0, FALSE, H5C__NO_FLAGS_SET); + + protect_entry(file_ptr, LARGE_ENTRY_TYPE, 1); + unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, 1, TRUE, H5C__NO_FLAGS_SET); + + protect_entry(file_ptr, LARGE_ENTRY_TYPE, 2); + unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, 2, FALSE, H5C__NO_FLAGS_SET); + + if ( pass ) { + + if ( ( cache_ptr->index_len != 3 ) || + ( cache_ptr->index_size != 3 * LARGE_ENTRY_SIZE ) || + ( cache_ptr->slist_len != 1 ) || + ( cache_ptr->slist_size != LARGE_ENTRY_SIZE ) ) { + + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected cache status 9."); + failure_mssg = msg; + + } + } + + protect_entry(file_ptr, LARGE_ENTRY_TYPE, 3); + + if ( pass ) { + + if ( ( cache_ptr->index_len != 4 ) || + ( cache_ptr->index_size != 4 * LARGE_ENTRY_SIZE ) || + ( cache_ptr->slist_len != 1 ) || + ( cache_ptr->slist_size != LARGE_ENTRY_SIZE ) ) { + + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected cache status 10."); + failure_mssg = msg; + + } + } + + if ( pass ) { + + result = H5C_get_entry_status(file_ptr, entry_ptr->addr, + &reported_entry_size, &in_cache, + &is_dirty, &is_protected, &is_pinned); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "H5C_get_entry_status() reports failure 7."); + failure_mssg = msg; + + } else if ( !in_cache || is_dirty || !is_protected || is_pinned ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected status 7."); + failure_mssg = msg; + + } else if ( ( ! entry_ptr->deserialized ) || + ( entry_ptr->cleared ) || + ( entry_ptr->serialized ) || + ( entry_ptr->destroyed ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected entry history 7."); + failure_mssg = msg; + + } + } + + if ( pass ) { + + result = H5C_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT, + &(types[LARGE_ENTRY_TYPE]), entry_ptr->addr, + (void *)entry_ptr, + H5C__SIZE_CHANGED_FLAG | H5C__DIRTIED_FLAG, + (LARGE_ENTRY_SIZE / 2)); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "H5C_unprotect() reports failure 3."); + failure_mssg = msg; + + } else { + + /* tidy up so we play nice with the standard protect / unprotect + * calls. + */ + entry_ptr->is_protected = FALSE; + entry_ptr->is_dirty = TRUE; + entry_ptr->size = LARGE_ENTRY_SIZE / 2; + } + } + + if ( pass ) { + + if ( ( cache_ptr->index_len != 4 ) || + ( cache_ptr->index_size != + ((3 * LARGE_ENTRY_SIZE) + (LARGE_ENTRY_SIZE / 2)) ) || + ( cache_ptr->slist_len != 2 ) || + ( cache_ptr->slist_size != + (LARGE_ENTRY_SIZE + (LARGE_ENTRY_SIZE / 2)) ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected cache status 11."); + failure_mssg = msg; + + } + } + + if ( pass ) { + + result = H5C_get_entry_status(file_ptr, entry_ptr->addr, + &reported_entry_size, &in_cache, + &is_dirty, &is_protected, &is_pinned); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "H5C_get_entry_status() reports failure 8."); + failure_mssg = msg; + + } else if ( !in_cache || !is_dirty || is_protected || is_pinned || + ( reported_entry_size != (LARGE_ENTRY_SIZE / 2) ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected status 8."); + failure_mssg = msg; + + } else if ( ( ! entry_ptr->deserialized ) || + ( entry_ptr->cleared ) || + ( entry_ptr->serialized ) || + ( entry_ptr->destroyed ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected entry history 8."); + failure_mssg = msg; + + } + } + + protect_entry(file_ptr, LARGE_ENTRY_TYPE, 3); + + if ( pass ) { + + result = H5C_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT, + &(types[LARGE_ENTRY_TYPE]), entry_ptr->addr, + (void *)entry_ptr, + (H5C__DIRTIED_FLAG | H5C__SIZE_CHANGED_FLAG), + LARGE_ENTRY_SIZE); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "H5C_unprotect() reports failure 4."); + failure_mssg = msg; + + } else { + + /* tidy up so we play nice with the standard protect / unprotect + * calls. + */ + entry_ptr->is_protected = FALSE; + entry_ptr->is_dirty = TRUE; + entry_ptr->size = LARGE_ENTRY_SIZE; + } + } + + if ( pass ) { + + if ( ( cache_ptr->index_len != 4 ) || + ( cache_ptr->index_size != 4 * LARGE_ENTRY_SIZE ) || + ( cache_ptr->slist_len != 2 ) || + ( cache_ptr->slist_size != 2 * LARGE_ENTRY_SIZE ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected cache status 12."); + failure_mssg = msg; + + } + } + + if ( pass ) { + + result = H5C_get_entry_status(file_ptr, entry_ptr->addr, + &reported_entry_size, &in_cache, + &is_dirty, &is_protected, &is_pinned); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "H5C_get_entry_status() reports failure 9."); + failure_mssg = msg; + + } else if ( !in_cache || !is_dirty || is_protected || is_pinned || + ( reported_entry_size != LARGE_ENTRY_SIZE ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected status 9."); + failure_mssg = msg; + + } else if ( ( ! entry_ptr->deserialized ) || + ( entry_ptr->cleared ) || + ( entry_ptr->serialized ) || + ( entry_ptr->destroyed ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected entry history 9."); + failure_mssg = msg; + + } + } + + protect_entry(file_ptr, LARGE_ENTRY_TYPE, 3); + + unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, 3, FALSE, H5C__PIN_ENTRY_FLAG); + + if ( pass ) { + + result = H5C_resize_pinned_entry((void *)entry_ptr, + (LARGE_ENTRY_SIZE / 4)); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "H5C_resize_pinned_entry() reports failure 3."); + failure_mssg = msg; + + } + } + + if ( pass ) { + + if ( ( cache_ptr->index_len != 4 ) || + ( cache_ptr->index_size != + ((3 * LARGE_ENTRY_SIZE) + (LARGE_ENTRY_SIZE / 4)) ) || + ( cache_ptr->slist_len != 2 ) || + ( cache_ptr->slist_size != + (LARGE_ENTRY_SIZE + (LARGE_ENTRY_SIZE / 4)) ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected cache status 13."); + failure_mssg = msg; + + } + } + + if ( pass ) { + + result = H5C_get_entry_status(file_ptr, entry_ptr->addr, + &reported_entry_size, &in_cache, + &is_dirty, &is_protected, &is_pinned); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "H5C_get_entry_status() reports failure 10."); + failure_mssg = msg; + + } else if ( !in_cache || !is_dirty || is_protected || ! is_pinned || + ( reported_entry_size != (LARGE_ENTRY_SIZE / 4) ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected status 10."); + failure_mssg = msg; + + } else if ( ( ! entry_ptr->deserialized ) || + ( entry_ptr->cleared ) || + ( entry_ptr->serialized ) || + ( entry_ptr->destroyed ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected entry history 10."); + failure_mssg = msg; + + } + } + + if ( pass ) { + + result = H5C_resize_pinned_entry((void *)entry_ptr, + LARGE_ENTRY_SIZE); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "H5C_resize_pinned_entry() reports failure 4."); + failure_mssg = msg; + + } + } + + if ( pass ) { + + if ( ( cache_ptr->index_len != 4 ) || + ( cache_ptr->index_size != (4 * LARGE_ENTRY_SIZE) ) || + ( cache_ptr->slist_len != 2 ) || + ( cache_ptr->slist_size != (2 * LARGE_ENTRY_SIZE) ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected cache status 14."); + failure_mssg = msg; + + } + } + + if ( pass ) { + + result = H5C_get_entry_status(file_ptr, entry_ptr->addr, + &reported_entry_size, &in_cache, + &is_dirty, &is_protected, &is_pinned); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "H5C_get_entry_status() reports failure 11."); + failure_mssg = msg; + + } else if ( !in_cache || !is_dirty || is_protected || ! is_pinned || + ( reported_entry_size != LARGE_ENTRY_SIZE ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected status 11."); + failure_mssg = msg; + + } else if ( ( ! entry_ptr->deserialized ) || + ( entry_ptr->cleared ) || + ( entry_ptr->serialized ) || + ( entry_ptr->destroyed ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected entry history 11."); + failure_mssg = msg; + + } + } + + protect_entry(file_ptr, LARGE_ENTRY_TYPE, 3); + + unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, 3, FALSE, + H5C__UNPIN_ENTRY_FLAG | H5C__DELETED_FLAG); + + if ( pass ) { + + result = H5C_get_entry_status(file_ptr, entry_ptr->addr, &entry_size, + &in_cache, &is_dirty, &is_protected, + &is_pinned); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "H5C_get_entry_status() reports failure 12."); + failure_mssg = msg; + + } else if ( in_cache ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected status 12."); + failure_mssg = msg; + +#ifndef NDEBUG + /* The clear_dirty_bits() callback is only called in debug mode -- + * thus we can only do our full test on the expected entry history + * when debug is enabled. + */ + } else if ( ( ! entry_ptr->deserialized ) || + ( ! entry_ptr->cleared ) || + ( entry_ptr->serialized ) || + ( ! entry_ptr->destroyed ) ) { +#else + /* When in procduction mode, the clear_dirty_bits() callback is + * not called, so entry_ptr->cleared should never be set. + */ + } else if ( ( ! entry_ptr->deserialized ) || + ( entry_ptr->cleared ) || + ( entry_ptr->serialized ) || + ( ! entry_ptr->destroyed ) ) { +#endif /* NDEBUG */ + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected entry history 12."); + failure_mssg = msg; + + } + } + + if ( pass ) { + + if ( ( cache_ptr->index_len != 3 ) || + ( cache_ptr->index_size != (3 * LARGE_ENTRY_SIZE) ) || + ( cache_ptr->slist_len != 1 ) || + ( cache_ptr->slist_size != LARGE_ENTRY_SIZE ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected cache status 15."); + failure_mssg = msg; + + } + } + + protect_entry(file_ptr, LARGE_ENTRY_TYPE, 2); + unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, 2, FALSE, H5C__DELETED_FLAG); + + protect_entry(file_ptr, LARGE_ENTRY_TYPE, 1); + unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, 1, FALSE, H5C__DELETED_FLAG); + + protect_entry(file_ptr, LARGE_ENTRY_TYPE, 0); + unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, 0, FALSE, H5C__DELETED_FLAG); + + + if ( pass ) { + + if ( ( cache_ptr->index_len != 0 ) || + ( cache_ptr->index_size != 0 ) || + ( cache_ptr->slist_len != 0 ) || + ( cache_ptr->slist_size != 0 ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected cache status 16."); + failure_mssg = msg; + + } + } + + if ( pass ) { + + takedown_cache(file_ptr, FALSE, FALSE); + } + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + if ( core_file_driver_failed ) { + + HDfprintf(stdout, + "%s(): Unable to open test file with core file driver.\n", + fcn_name); + } + + return !pass; + +} /* check_resize_entry() */ + + +/*------------------------------------------------------------------------- + * Function: check_evictions_enabled() + * + * Purpose: Verify that H5C_get_evictions_enabled() and + * H5C_set_evictions_enabled() functions perform as expected. + * + * Return: void + * + * Programmer: John Mainzer + * 8/2/07 + * + * Modifications: + * + * JRM -- 10/15/07 + * Minor updates to adapt to cache API changes. + * + *------------------------------------------------------------------------- + */ + +static unsigned +check_evictions_enabled(void) +{ + const char * fcn_name = "check_evictions_enabled"; + static char msg[128]; + herr_t result; + hbool_t show_progress = FALSE; + hbool_t evictions_enabled; + hbool_t in_cache; + int i; + int mile_stone = 1; + size_t entry_size; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + test_entry_t * base_addr; + test_entry_t * entry_ptr; + + TESTING("evictions enabled/disabled functionality"); + + core_file_driver_failed = FALSE; + + /* Setup a cache and verify that it is empty. + * + * Use H5C_get_evictions_enabled() to determine if evictions are + * currently enabled -- they should be. + * + * Load entries until the cache is full. Load one more. Verify that + * this caused an entry to be evicted. + * + * Insert an entry. Verify that this cases and entry to be evicted. + * + * Used H5C_set_evictions_enabled() to disable evictions. Verify + * with a call to H5C_get_evictions_enabled(). + * + * Load another entry -- verify that this does not cause an entry + * to be evicted. + * + * Insert an entry -- verify that this does not cause an entry to + * be evicted. + * + * Use H5C_set_evictions_enabled() to re-enable evictions. Verify + * with a call to H5C_get_evictions_enabled(). + * + * Protect and unprotect some of the entries in the cache. Verify + * that there are no evictions (since we only try to make space + * when we either insert or load a new entry). + * + * Protect an entry not in the cache. Verify that this causes + * two evictions. + * + * Used H5C_set_evictions_enabled() to disable evictions again. + * Verify with a call to H5C_get_evictions_enabled(). + * + * Now flush and discard the cache -- should succeed. + */ + + pass = TRUE; + + if ( show_progress ) /* 1 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* create the cache */ + if ( pass ) { + + reset_entries(); + + file_ptr = setup_cache((size_t)(1 * 1024 * 1024), + (size_t)( 512 * 1024)); + cache_ptr = file_ptr->shared->cache; + + base_addr = entries[MONSTER_ENTRY_TYPE]; + entry_size = MONSTER_ENTRY_SIZE; + } + + if ( show_progress ) /* 2 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* verify that it is empty */ + if ( pass ) { + + if ( ( cache_ptr->index_len != 0 ) || + ( cache_ptr->index_size != 0 ) || + ( cache_ptr->slist_len != 0 ) || + ( cache_ptr->slist_size != 0 ) || + ( cache_ptr->evictions_enabled != TRUE ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected cache status 1."); + failure_mssg = msg; + + } + } + + if ( show_progress ) /* 3 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* verify that H5C_get_evictions_enabled() returns the expected value */ + if ( pass ) { + + result = H5C_get_evictions_enabled(cache_ptr, &evictions_enabled); + + if ( ( result != SUCCEED ) || ( evictions_enabled != TRUE ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected evictions enabled 1."); + failure_mssg = msg; + } + } + + if ( show_progress ) /* 4 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* fill the cache */ + for ( i = 0; i < 16 ; i++ ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i); + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, + FALSE, H5C__NO_FLAGS_SET); + } + + if ( show_progress ) /* 5 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* verify that the cache is full */ + if ( pass ) { + + if ( ( cache_ptr->index_len != 16 ) || + ( cache_ptr->index_size != 16 * MONSTER_ENTRY_SIZE ) || + ( cache_ptr->slist_len != 0 ) || + ( cache_ptr->slist_size != 0 ) || + ( cache_ptr->evictions_enabled != TRUE ) ) { + + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected cache status 2."); + failure_mssg = msg; + + } + } + + if ( show_progress ) /* 6 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* protect and unprotect another entry */ + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 16); + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 16, + FALSE, H5C__NO_FLAGS_SET); + + if ( show_progress ) /* 7 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* verify that an entry has been evicted */ + if ( pass ) { + + if ( ( cache_ptr->index_len != 16 ) || + ( cache_ptr->index_size != 16 * MONSTER_ENTRY_SIZE ) || + ( cache_ptr->slist_len != 0 ) || + ( cache_ptr->slist_size != 0 ) || + ( cache_ptr->evictions_enabled != TRUE ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected cache status 3."); + failure_mssg = msg; + + } + } + + if ( show_progress ) /* 8 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + if ( pass ) { + + entry_ptr = &(base_addr[0]); + + result = H5C_get_entry_status(file_ptr, entry_ptr->addr, + NULL, &in_cache, NULL, NULL, NULL); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "H5C_get_entry_status() reports failure 1."); + failure_mssg = msg; + + } else if ( in_cache ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected status 1."); + failure_mssg = msg; + + } else if ( ( ! entry_ptr->deserialized ) || + ( entry_ptr->cleared ) || + ( entry_ptr->serialized ) || + ( ! entry_ptr->destroyed ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected entry history 1."); + failure_mssg = msg; + + } + } + + if ( show_progress ) /* 9 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* insert an entry */ + insert_entry(file_ptr, MONSTER_ENTRY_TYPE, 17, TRUE, H5C__NO_FLAGS_SET); + + if ( show_progress ) /* 10 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* verify that another entry has been evicted */ + if ( pass ) { + + if ( ( cache_ptr->index_len != 16 ) || + ( cache_ptr->index_size != 16 * MONSTER_ENTRY_SIZE ) || + ( cache_ptr->slist_len != 1 ) || + ( cache_ptr->slist_size != MONSTER_ENTRY_SIZE ) || + ( cache_ptr->evictions_enabled != TRUE ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected cache status 4."); + failure_mssg = msg; + + } + } + + if ( show_progress ) /* 11 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + if ( pass ) { + + entry_ptr = &(base_addr[1]); + + result = H5C_get_entry_status(file_ptr, entry_ptr->addr, + NULL, &in_cache, NULL, NULL, NULL); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "H5C_get_entry_status() reports failure 2."); + failure_mssg = msg; + + } else if ( in_cache ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected status 2."); + failure_mssg = msg; + + } else if ( ( ! entry_ptr->deserialized ) || + ( entry_ptr->cleared ) || + ( entry_ptr->serialized ) || + ( ! entry_ptr->destroyed ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected entry history 2."); + failure_mssg = msg; + + } + } + + if ( show_progress ) /* 12 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* disable evictions */ + if ( pass ) { + + result = H5C_set_evictions_enabled(cache_ptr, FALSE); + + if ( result != SUCCEED ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "can't disable evictions 1."); + failure_mssg = msg; + } + } + + if ( show_progress ) /* 13 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* verify that evictions are disabled */ + if ( pass ) { + + if ( ( cache_ptr->index_len != 16 ) || + ( cache_ptr->index_size != 16 * MONSTER_ENTRY_SIZE ) || + ( cache_ptr->slist_len != 1 ) || + ( cache_ptr->slist_size != MONSTER_ENTRY_SIZE ) || + ( cache_ptr->evictions_enabled != FALSE ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected cache status 5."); + failure_mssg = msg; + + } + } + + if ( show_progress ) /* 14 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* protect and unprotect another entry */ + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 18); + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 18, + FALSE, H5C__NO_FLAGS_SET); + + if ( show_progress ) /* 15 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* verify that no entry has been evicted */ + if ( pass ) { + + if ( ( cache_ptr->index_len != 17 ) || + ( cache_ptr->index_size != 17 * MONSTER_ENTRY_SIZE ) || + ( cache_ptr->slist_len != 1 ) || + ( cache_ptr->slist_size != MONSTER_ENTRY_SIZE ) || + ( cache_ptr->evictions_enabled != FALSE ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected cache status 6."); + failure_mssg = msg; + + } + } + + if ( show_progress ) /* 16 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* insert another entry */ + insert_entry(file_ptr, MONSTER_ENTRY_TYPE, 19, TRUE, H5C__NO_FLAGS_SET); + + if ( show_progress ) /* 17 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* verify that no entry has been evicted */ + if ( pass ) { + + if ( ( cache_ptr->index_len != 18 ) || + ( cache_ptr->index_size != 18 * MONSTER_ENTRY_SIZE ) || + ( cache_ptr->slist_len != 2 ) || + ( cache_ptr->slist_size != 2 * MONSTER_ENTRY_SIZE ) || + ( cache_ptr->evictions_enabled != FALSE ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected cache status 7."); + failure_mssg = msg; + + } + } + + if ( show_progress ) /* 18 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* re-enable evictions */ + if ( pass ) { + + result = H5C_set_evictions_enabled(cache_ptr, TRUE); + + if ( result != SUCCEED ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "can't enable evictions 1."); + failure_mssg = msg; + } + } + + if ( show_progress ) /* 19 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* protect and unprotect an entry that is in the cache */ + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 19); + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 19, + FALSE, H5C__NO_FLAGS_SET); + + if ( show_progress ) /* 20 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* verify that no entries have been evicted */ + if ( pass ) { + + if ( ( cache_ptr->index_len != 18 ) || + ( cache_ptr->index_size != 18 * MONSTER_ENTRY_SIZE ) || + ( cache_ptr->slist_len != 2 ) || + ( cache_ptr->slist_size != 2 * MONSTER_ENTRY_SIZE ) || + ( cache_ptr->evictions_enabled != TRUE ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected cache status 8."); + failure_mssg = msg; + + } + } + + if ( show_progress ) /* 21 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* protect and unprotect an entry that isn't in the cache */ + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 20); + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 20, + FALSE, H5C__NO_FLAGS_SET); + + if ( show_progress ) /* 22 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* verify that the entries have been evicted to bring the + * cache back down to its normal size. + */ + + if ( pass ) { + + if ( ( cache_ptr->index_len != 16 ) || + ( cache_ptr->index_size != 16 * MONSTER_ENTRY_SIZE ) || + ( cache_ptr->slist_len != 2 ) || + ( cache_ptr->slist_size != 2 * MONSTER_ENTRY_SIZE ) || + ( cache_ptr->evictions_enabled != TRUE ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected cache status 9."); + failure_mssg = msg; + + } + } + + if ( show_progress ) /* 23 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + if ( pass ) { + + entry_ptr = &(base_addr[2]); + + result = H5C_get_entry_status(file_ptr, entry_ptr->addr, + NULL, &in_cache, NULL, NULL, NULL); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "H5C_get_entry_status() reports failure 3."); + failure_mssg = msg; + + } else if ( in_cache ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected status 3."); + failure_mssg = msg; + + } else if ( ( ! entry_ptr->deserialized ) || + ( entry_ptr->cleared ) || + ( entry_ptr->serialized ) || + ( ! entry_ptr->destroyed ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected entry history 3."); + failure_mssg = msg; + + } + } + + if ( show_progress ) /* 24 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + if ( pass ) { + + entry_ptr = &(base_addr[3]); + + result = H5C_get_entry_status(file_ptr, entry_ptr->addr, + NULL, &in_cache, NULL, NULL, NULL); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "H5C_get_entry_status() reports failure 4."); + failure_mssg = msg; + + } else if ( in_cache ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected status 4."); + failure_mssg = msg; + + } else if ( ( ! entry_ptr->deserialized ) || + ( entry_ptr->cleared ) || + ( entry_ptr->serialized ) || + ( ! entry_ptr->destroyed ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected entry history 4."); + failure_mssg = msg; + + } + } + + if ( show_progress ) /* 25 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* disable evictions again */ + if ( pass ) { + + result = H5C_set_evictions_enabled(cache_ptr, FALSE); + + if ( result != SUCCEED ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "can't disable evictions 2."); + failure_mssg = msg; + } + } + + if ( show_progress ) /* 26 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* protect and unprotect an entry that isn't in the cache, forcing + * the cache to grow. + */ + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 21); + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 21, + FALSE, H5C__NO_FLAGS_SET); + + + if ( show_progress ) /* 27 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* verify that the cache has grown */ + if ( pass ) { + + if ( ( cache_ptr->index_len != 17 ) || + ( cache_ptr->index_size != 17 * MONSTER_ENTRY_SIZE ) || + ( cache_ptr->slist_len != 2 ) || + ( cache_ptr->slist_size != 2 * MONSTER_ENTRY_SIZE ) || + ( cache_ptr->evictions_enabled != FALSE ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected cache status 10."); + failure_mssg = msg; + + } + } + + if ( show_progress ) /* 28 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* re-enable evictions again */ + if ( pass ) { + + result = H5C_set_evictions_enabled(cache_ptr, TRUE); + + if ( result != SUCCEED ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "can't enable evictions 2."); + failure_mssg = msg; + } + } + + if ( show_progress ) /* 29 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* insert an entry */ + insert_entry(file_ptr, MONSTER_ENTRY_TYPE, 22, TRUE, H5C__NO_FLAGS_SET); + + if ( show_progress ) /* 30 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* verify that the cache has returned to its maximum size */ + if ( pass ) { + + if ( ( cache_ptr->index_len != 16 ) || + ( cache_ptr->index_size != 16 * MONSTER_ENTRY_SIZE ) || + ( cache_ptr->slist_len != 3 ) || + ( cache_ptr->slist_size != 3 * MONSTER_ENTRY_SIZE ) || + ( cache_ptr->evictions_enabled != TRUE ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected cache status 11."); + failure_mssg = msg; + + } + } + + if ( show_progress ) /* 31 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + if ( pass ) { + + entry_ptr = &(base_addr[4]); + + result = H5C_get_entry_status(file_ptr, entry_ptr->addr, + NULL, &in_cache, NULL, NULL, NULL); + + if ( result < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "H5C_get_entry_status() reports failure 5."); + failure_mssg = msg; + + } else if ( in_cache ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected status 5."); + failure_mssg = msg; + + } else if ( ( ! entry_ptr->deserialized ) || + ( entry_ptr->cleared ) || + ( entry_ptr->serialized ) || + ( ! entry_ptr->destroyed ) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Unexpected entry history 5."); + failure_mssg = msg; + + } + } + + if ( show_progress ) /* 32 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* disable evictions one last time before we shut down */ + if ( pass ) { + + result = H5C_set_evictions_enabled(cache_ptr, FALSE); + + if ( result != SUCCEED ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "can't disable evictions 3."); + failure_mssg = msg; + } + } + + if ( show_progress ) /* 33 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + if ( pass ) { + + takedown_cache(file_ptr, FALSE, FALSE); + } + + if ( show_progress ) /* 34 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + if ( core_file_driver_failed ) { + + HDfprintf(stdout, + "%s(): Unable to open test file with core file driver.\n", + fcn_name); + } + + return !pass; + +} /* check_evictions_enabled() */ + + +/*------------------------------------------------------------------------- + * Function: check_flush_protected_err() + * + * Purpose: Verify that an attempt to flush the cache when it contains + * a protected entry will generate an error. + * + * Return: void + * + * Programmer: John Mainzer + * 6/24/04 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +static unsigned +check_flush_protected_err(void) +{ + const char * fcn_name = "check_flush_protected_err"; + H5F_t * file_ptr = NULL; + + TESTING("flush cache with protected entry error"); + + core_file_driver_failed = FALSE; + + pass = TRUE; + + /* allocate a cache, protect an entry, and try to flush. This + * should fail. Unprotect the entry and flush again -- should + * succeed. + */ + + if ( pass ) { + + reset_entries(); + + file_ptr = setup_cache((size_t)(2 * 1024), + (size_t)(1 * 1024)); + + protect_entry(file_ptr, 0, 0); + + if ( H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5C__NO_FLAGS_SET) + >= 0 ) { + + pass = FALSE; + failure_mssg = "flush succeeded on cache with protected entry.\n"; + + } else { + + unprotect_entry(file_ptr, 0, 0, TRUE, H5C__NO_FLAGS_SET); + + if ( H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5C__NO_FLAGS_SET) + < 0 ) { + + pass = FALSE; + failure_mssg = "flush failed after unprotect.\n"; + + } else { + + takedown_cache(file_ptr, FALSE, FALSE); + } + } + } + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + if ( core_file_driver_failed ) { + + HDfprintf(stdout, + "%s(): Unable to open test file with core file driver.\n", + fcn_name); + } + + return !pass; + +} /* check_flush_protected_err() */ + + +/*------------------------------------------------------------------------- + * Function: check_destroy_pinned_err() + * + * Purpose: Verify that an attempt to destroy the cache when it contains + * a pinned entry that can't be unpined during the flush destroy + * will generate an error. + * + * Return: void + * + * Programmer: John Mainzer + * 4/7/06 + * + * Modifications: + * + * JRM -- 10/15/07 + * Minor updates to accomodate cache API mods. + * + *------------------------------------------------------------------------- + */ + +extern H5C_t * saved_cache; + +static unsigned +check_destroy_pinned_err(void) +{ + const char * fcn_name = "check_destroy_pinned_err()"; + H5F_t * file_ptr = NULL; + + TESTING("destroy cache with permanently pinned entry error"); + + core_file_driver_failed = FALSE; + + pass = TRUE; + + /* allocate a cache, pin an entry, and try to flush destroy. This + * should fail. Unpin the entry and flush destroy again -- should + * succeed. + */ + + if ( pass ) { + + reset_entries(); + + file_ptr = setup_cache((size_t)(2 * 1024), + (size_t)(1 * 1024)); + + protect_entry(file_ptr, 0, 0); + unprotect_entry(file_ptr, 0, 0, FALSE, H5C__PIN_ENTRY_FLAG); + + if ( H5C_dest(file_ptr, H5P_DATASET_XFER_DEFAULT) >= 0 ) { + + pass = FALSE; + failure_mssg = "destroy succeeded on cache with pinned entry.\n"; + + } else { + + unpin_entry(file_ptr, 0, 0); + + if ( H5C_dest(file_ptr, H5P_DATASET_XFER_DEFAULT) < 0 ) { + + pass = FALSE; + failure_mssg = "destroy failed after unpin.\n"; + + } else { + file_ptr->shared->cache = NULL; + } + } + + if ( saved_cache != NULL ) { + + file_ptr->shared->cache = saved_cache; + saved_cache = NULL; + + } + + /* call takedown_cache() with a NULL file_ptr parameter. + * This causes the function to close and delete the file, + * while skipping the call to H5C_dest(). + */ + takedown_cache(NULL, FALSE, FALSE); + + } + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + if ( core_file_driver_failed ) { + + HDfprintf(stdout, + "%s(): Unable to open test file with core file driver.\n", + fcn_name); + } + + return !pass; + +} /* check_destroy_pinned_err() */ + + +/*------------------------------------------------------------------------- + * Function: check_destroy_protected_err() + * + * Purpose: Verify that an attempt to destroy the cache when it contains + * a protected entry will generate an error. + * + * Return: void + * + * Programmer: John Mainzer + * 6/24/04 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +static unsigned +check_destroy_protected_err(void) +{ + const char * fcn_name = "check_destroy_protected_err"; + H5F_t * file_ptr = NULL; + + TESTING("destroy cache with protected entry error"); + + core_file_driver_failed = FALSE; + + pass = TRUE; + + /* allocate a cache, protect an entry, and try to flush. This + * should fail. Unprotect the entry and flush again -- should + * succeed. + */ + + if ( pass ) { + + reset_entries(); + + file_ptr = setup_cache((size_t)(2 * 1024), + (size_t)(1 * 1024)); + + protect_entry(file_ptr, 0, 0); + + if ( H5C_dest(file_ptr, H5P_DATASET_XFER_DEFAULT) >= 0 ) { + + pass = FALSE; + failure_mssg = "destroy succeeded on cache with protected entry.\n"; + + } else { + + unprotect_entry(file_ptr, 0, 0, TRUE, H5C__NO_FLAGS_SET); + + if ( H5C_dest(file_ptr, H5P_DATASET_XFER_DEFAULT) < 0 ) { + + pass = FALSE; + failure_mssg = "destroy failed after unprotect.\n"; + + } else { + file_ptr->shared->cache = NULL; + } + } + + if ( saved_cache != NULL ) { + + file_ptr->shared->cache = saved_cache; + saved_cache = NULL; + + } + + /* call takedown_cache() with a NULL file_ptr parameter. + * This causes the function to close and delete the file, + * while skipping the call to H5C_dest(). + */ + takedown_cache(NULL, FALSE, FALSE); + } + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + if ( core_file_driver_failed ) { + + HDfprintf(stdout, + "%s(): Unable to open test file with core file driver.\n", + fcn_name); + } + + return !pass; + +} /* check_destroy_protected_err() */ + + +/*------------------------------------------------------------------------- + * Function: check_duplicate_insert_err() + * + * Purpose: Verify that an attempt to insert and entry that is + * alread in the cache will generate an error. + * + * Return: void + * + * Programmer: John Mainzer + * 6/24/04 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +static unsigned +check_duplicate_insert_err(void) +{ + const char * fcn_name = "check_duplicate_insert_err"; + herr_t result; + H5F_t * file_ptr = NULL; + test_entry_t * base_addr; + test_entry_t * entry_ptr; + + TESTING("duplicate entry insertion error"); + + core_file_driver_failed = FALSE; + + pass = TRUE; + + /* allocate a cache, protect an entry, and then try to insert + * the entry again. This should fail. Unprotect the entry and + * destroy the cache -- should succeed. + */ + + if ( pass ) { + + reset_entries(); + + file_ptr = setup_cache((size_t)(2 * 1024), + (size_t)(1 * 1024)); + + protect_entry(file_ptr, 0, 0); + + if ( pass ) { + + base_addr = entries[0]; + entry_ptr = &(base_addr[0]); + + result = H5C_insert_entry(file_ptr, H5P_DATASET_XFER_DEFAULT, + &(types[0]), entry_ptr->addr, + entry_ptr->size, + (void *)entry_ptr, H5C__NO_FLAGS_SET); + + if ( result >= 0 ) { + + pass = FALSE; + failure_mssg = "insert of duplicate entry succeeded.\n"; + + } else { + + unprotect_entry(file_ptr, 0, 0, TRUE, H5C__NO_FLAGS_SET); + + takedown_cache(file_ptr, FALSE, FALSE); + } + } + } + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + if ( core_file_driver_failed ) { + + HDfprintf(stdout, + "%s(): Unable to open test file with core file driver.\n", + fcn_name); + } + + return !pass; + +} /* check_duplicate_insert_err() */ + + +/*------------------------------------------------------------------------- + * Function: check_rename_err() + * + * Purpose: Verify that an attempt to rename an entry to the address + * of an existing entry will generate an error. + * + * Return: void + * + * Programmer: John Mainzer + * 6/24/04 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +static unsigned +check_rename_err(void) +{ + const char * fcn_name = "check_rename_err()"; + herr_t result; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + test_entry_t * entry_0_0_ptr; + test_entry_t * entry_0_1_ptr; + test_entry_t * entry_1_0_ptr; + + TESTING("rename to existing entry errors"); + + core_file_driver_failed = FALSE; + + pass = TRUE; + + /* allocate a cache, and insert several entries. Try to rename + * entries to other entries resident in the cache. This should + * fail. Destroy the cache -- should succeed. + */ + + if ( pass ) { + + reset_entries(); + + file_ptr = setup_cache((size_t)(2 * 1024), + (size_t)(1 * 1024)); + cache_ptr = file_ptr->shared->cache; + + insert_entry(file_ptr, 0, 0, TRUE, H5C__NO_FLAGS_SET); + insert_entry(file_ptr, 0, 1, TRUE, H5C__NO_FLAGS_SET); + insert_entry(file_ptr, 1, 0, TRUE, H5C__NO_FLAGS_SET); + + entry_0_0_ptr = &((entries[0])[0]); + entry_0_1_ptr = &((entries[0])[1]); + entry_1_0_ptr = &((entries[1])[0]); + } + + if ( pass ) { + + result = H5C_rename_entry(cache_ptr, &(types[0]), + entry_0_0_ptr->addr, entry_0_1_ptr->addr); + + if ( result >= 0 ) { + + pass = FALSE; + failure_mssg = "rename to addr of same type succeeded.\n"; + } + } + + if ( pass ) { + + result = H5C_rename_entry(cache_ptr, &(types[0]), + entry_0_0_ptr->addr, entry_1_0_ptr->addr); + + if ( result >= 0 ) { + + pass = FALSE; + failure_mssg = "rename to addr of different type succeeded.\n"; + } + } + + if ( pass ) { + + takedown_cache(file_ptr, FALSE, FALSE); + } + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + if ( core_file_driver_failed ) { + + HDfprintf(stdout, + "%s(): Unable to open test file with core file driver.\n", + fcn_name); + } + + return !pass; + +} /* check_rename_err() */ + + +/*------------------------------------------------------------------------- + * Function: check_double_pin_err() + * + * Purpose: Verify that an attempt to pin an entry that is already + * pinned will generate an error. + * + * Return: void + * + * Programmer: John Mainzer + * 4/24/06 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +static unsigned +check_double_pin_err(void) +{ + const char * fcn_name = "check_double_pin_err()"; + herr_t result; + H5F_t * file_ptr = NULL; + test_entry_t * entry_ptr; + + TESTING("pin a pinned entry error"); + + core_file_driver_failed = FALSE; + + pass = TRUE; + + /* allocate a cache, protect an entry, unprotect it with the pin flag, + * protect it again, and then try to unprotect it again with the pin + * flag. This should fail. Unpin the entry and destroy the cache + * -- should succeed. + */ + + if ( pass ) { + + reset_entries(); + + file_ptr = setup_cache((size_t)(2 * 1024), + (size_t)(1 * 1024)); + + protect_entry(file_ptr, 0, 0); + + unprotect_entry(file_ptr, 0, 0, FALSE, H5C__PIN_ENTRY_FLAG); + + protect_entry(file_ptr, 0, 0); + + entry_ptr = &((entries[0])[0]); + } + + if ( pass ) { + + result = H5C_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT, + &(types[0]), entry_ptr->addr, + (void *)entry_ptr, H5C__PIN_ENTRY_FLAG, + (size_t)0); + + if ( result > 0 ) { + + pass = FALSE; + failure_mssg = + "attempt to pin a pinned entry succeeded.\n"; + + } else { + + unprotect_entry(file_ptr, 0, 0, FALSE, H5C__UNPIN_ENTRY_FLAG); + } + } + + if ( pass ) { + + takedown_cache(file_ptr, FALSE, FALSE); + } + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + if ( core_file_driver_failed ) { + + HDfprintf(stdout, + "%s(): Unable to open test file with core file driver.\n", + fcn_name); + } + + return !pass; + +} /* check_double_pin_err() */ + + +/*------------------------------------------------------------------------- + * Function: check_double_unpin_err() + * + * Purpose: Verify that an attempt to unpin an unpinned entry will + * generate an error. + * + * Return: void + * + * Programmer: John Mainzer + * 4/24/06 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +static unsigned +check_double_unpin_err(void) +{ + const char * fcn_name = "check_double_unpin_err()"; + herr_t result; + H5F_t * file_ptr = NULL; + test_entry_t * entry_ptr; + + TESTING("unpin an unpinned entry error"); + + core_file_driver_failed = FALSE; + + pass = TRUE; + + /* allocate a cache, protect an entry, unprotect it with the unpin flag. + * -- This should fail. + * + * Try again with H5C_unpin_entry -- this should also fail. + * + * Destroy the cache -- should succeed. + */ + + if ( pass ) { + + reset_entries(); + + file_ptr = setup_cache((size_t)(2 * 1024), + (size_t)(1 * 1024)); + + protect_entry(file_ptr, 0, 0); + + entry_ptr = &((entries[0])[0]); + } + + if ( pass ) { + + result = H5C_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT, + &(types[0]), entry_ptr->addr, + (void *)entry_ptr, H5C__UNPIN_ENTRY_FLAG, + (size_t)0); + + if ( result > 0 ) { + + pass = FALSE; + failure_mssg = + "attempt to unpin an unpinned entry succeeded 1.\n"; + + } else { + + unprotect_entry(file_ptr, 0, 0, FALSE, H5C__NO_FLAGS_SET); + } + } + + if ( pass ) { + + result = H5C_unpin_entry((void *)entry_ptr); + + if ( result > 0 ) { + + pass = FALSE; + failure_mssg = + "attempt to unpin an unpinned entry succeeded 2.\n"; + + } + } + + if ( pass ) { + + takedown_cache(file_ptr, FALSE, FALSE); + } + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + if ( core_file_driver_failed ) { + + HDfprintf(stdout, + "%s(): Unable to open test file with core file driver.\n", + fcn_name); + } + + return !pass; + +} /* check_double_unpin_err() */ + + +/*------------------------------------------------------------------------- + * Function: check_pin_entry_errs() + * + * Purpose: Verify that invalid calls to H5C_pin_protected_entry() + * generate errors as expected. + * + * Return: void + * + * Programmer: John Mainzer + * 4/24/06 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +static unsigned +check_pin_entry_errs(void) +{ + const char * fcn_name = "check_pin_entry_errs()"; + herr_t result; + H5F_t * file_ptr = NULL; + test_entry_t * entry_ptr; + + TESTING("pin entry related errors"); + + core_file_driver_failed = FALSE; + + pass = TRUE; + + /* Allocate a cache, protect an entry, unprotect it with no flags, + * and then call H5C_pin_protected_entry() to pin it -- This should fail. + * + * Protect the entry again, unprotect it with a pin flag, protect it + * again, and then call H5C_pin_protected_entry() to pin it -- This + * should fail also. + * + * Unprotect the entry with the unpin flag. + * + * Destroy the cache -- should succeed. + */ + + if ( pass ) { + + reset_entries(); + + file_ptr = setup_cache((size_t)(2 * 1024), + (size_t)(1 * 1024)); + + protect_entry(file_ptr, 0, 0); + + unprotect_entry(file_ptr, 0, 0, FALSE, H5C__NO_FLAGS_SET); + + entry_ptr = &((entries[0])[0]); + } + + if ( pass ) { + + result = H5C_pin_protected_entry((void *)entry_ptr); + + if ( result > 0 ) { + + pass = FALSE; + failure_mssg = + "attempt to pin an unprotected entry succeeded.\n"; + + } else { + + protect_entry(file_ptr, 0, 0); + + unprotect_entry(file_ptr, 0, 0, FALSE, H5C__PIN_ENTRY_FLAG); + + protect_entry(file_ptr, 0, 0); + } + } + + if ( pass ) { + + result = H5C_pin_protected_entry((void *)entry_ptr); + + if ( result > 0 ) { + + pass = FALSE; + failure_mssg = + "attempt to pin a pinned, protected entry succeeded.\n"; + + } else { + + unprotect_entry(file_ptr, 0, 0, FALSE, H5C__UNPIN_ENTRY_FLAG); + + } + } + + if ( pass ) { + + takedown_cache(file_ptr, FALSE, FALSE); + } + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + if ( core_file_driver_failed ) { + + HDfprintf(stdout, + "%s(): Unable to open test file with core file driver.\n", + fcn_name); + } + + return !pass; + +} /* check_pin_entry_errs() */ + + +/*------------------------------------------------------------------------- + * Function: check_double_protect_err() + * + * Purpose: Verify that an attempt to protect an entry that is already + * protected will generate an error. + * + * Return: void + * + * Programmer: John Mainzer + * 6/24/04 + * + * Modifications: + * + * - Modified call to H5C_protect() to pass H5C__NO_FLAGS_SET in the + * the new flags parameter. + * + * JRM -- 3/28/07 + * + *------------------------------------------------------------------------- + */ + +static unsigned +check_double_protect_err(void) +{ + const char * fcn_name = "check_double_protect_err()"; + H5F_t * file_ptr = NULL; + test_entry_t * entry_ptr; + H5C_cache_entry_t * cache_entry_ptr; + + TESTING("protect a protected entry error"); + + core_file_driver_failed = FALSE; + + pass = TRUE; + + /* allocate a cache, protect an entry, and then try to protect + * the entry again. This should fail. Unprotect the entry and + * destroy the cache -- should succeed. + */ + + if ( pass ) { + + reset_entries(); + + file_ptr = setup_cache((size_t)(2 * 1024), + (size_t)(1 * 1024)); + + protect_entry(file_ptr, 0, 0); + + entry_ptr = &((entries[0])[0]); + } + + if ( pass ) { + + cache_entry_ptr = H5C_protect(file_ptr, H5P_DATASET_XFER_DEFAULT, + &(types[0]), entry_ptr->addr, + entry_ptr->size, NULL, + H5C__NO_FLAGS_SET); + + if ( cache_entry_ptr != NULL ) { + + pass = FALSE; + failure_mssg = "attempt to protect a protected entry succeeded.\n"; + } + } + + if ( pass ) { + + unprotect_entry(file_ptr, 0, 0, FALSE, H5C__NO_FLAGS_SET); + } + + if ( pass ) { + + takedown_cache(file_ptr, FALSE, FALSE); + } + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + if ( core_file_driver_failed ) { + + HDfprintf(stdout, + "%s(): Unable to open test file with core file driver.\n", + fcn_name); + } + + return !pass; + +} /* check_double_protect_err() */ + + +/*------------------------------------------------------------------------- + * Function: check_double_unprotect_err() + * + * Purpose: Verify that an attempt to unprotect an entry that is already + * unprotected will generate an error. + * + * Return: void + * + * Programmer: John Mainzer + * 6/24/04 + * + * Modifications: + * + * JRM -- 6/17/05 + * Modified function to use the new dirtied parameter in + * H5C_unprotect(). + * + * JRM -- 9/8/05 + * Updated function for the new size change parameter in + * H5C_unprotect(). We don't use them for now. + * + *------------------------------------------------------------------------- + */ + +static unsigned +check_double_unprotect_err(void) +{ + const char * fcn_name = "check_double_unprotect_err()"; + herr_t result; + H5F_t * file_ptr = NULL; + test_entry_t * entry_ptr; + + TESTING("unprotect an unprotected entry error"); + + core_file_driver_failed = FALSE; + + pass = TRUE; + + /* allocate a cache, protect an entry, unprotect it, and then try to + * unprotect the entry again. This should fail. Destroy the cache + * -- should succeed. + */ + + if ( pass ) { + + reset_entries(); + + file_ptr = setup_cache((size_t)(2 * 1024), + (size_t)(1 * 1024)); + + protect_entry(file_ptr, 0, 0); + + unprotect_entry(file_ptr, 0, 0, FALSE, H5C__NO_FLAGS_SET); + + entry_ptr = &((entries[0])[0]); + } + + if ( pass ) { + + result = H5C_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT, + &(types[0]), entry_ptr->addr, + (void *)entry_ptr, H5C__NO_FLAGS_SET, + (size_t)0); + + if ( result > 0 ) { + + pass = FALSE; + failure_mssg = + "attempt to unprotect an unprotected entry succeeded 1.\n"; + } + } + + if ( pass ) { + + takedown_cache(file_ptr, FALSE, FALSE); + } + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + if ( core_file_driver_failed ) { + + HDfprintf(stdout, + "%s(): Unable to open test file with core file driver.\n", + fcn_name); + } + + return !pass; + +} /* check_double_unprotect_err() */ + + +/*------------------------------------------------------------------------- + * Function: check_mark_entry_dirty_errs() + * + * Purpose: Verify that: + * + * 1) a call to H5C_mark_pinned_entry_dirty with an upinned + * entry as the target will generate an error. + * + * 2) a call to H5C_mark_pinned_entry_dirty with a protected + * entry as the target will generate an error. + * + * 3) a call to H5C_mark_pinned_or_protected_entry_dirty with + * and unpinned and unprotected entry will generate an + * error. + * + * Return: void + * + * Programmer: John Mainzer + * 5/17/06 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +static unsigned +check_mark_entry_dirty_errs(void) +{ + const char * fcn_name = "check_mark_entry_dirty_errs()"; + herr_t result; + H5F_t * file_ptr = NULL; + test_entry_t * entry_ptr; + + TESTING("mark entry dirty related errors"); + + core_file_driver_failed = FALSE; + + pass = TRUE; + + /* allocate a cache, protect an entry, and then attempt to mark it dirty + * with the H5C_mark_pinned_entry_dirty() call -- This should fail. + * + * Then unprotect the entry without pinning it, and try to mark it dirty + * again -- this should fail too. + * + * Try it again using H5C_mark_pinned_or_protected_entry_dirty -- this + * should fail as well. + * + * Destroy the cache -- should succeed. + */ + + if ( pass ) { + + reset_entries(); + + file_ptr = setup_cache((size_t)(2 * 1024), + (size_t)(1 * 1024)); + + protect_entry(file_ptr, 0, 0); + + unprotect_entry(file_ptr, 0, 0, FALSE, H5C__PIN_ENTRY_FLAG); + + protect_entry(file_ptr, 0, 0); + + entry_ptr = &((entries[0])[0]); + } + + if ( pass ) { + + result = H5C_mark_pinned_entry_dirty((void *)entry_ptr, + FALSE, (size_t)0); + + if ( result > 0 ) { + + pass = FALSE; + failure_mssg = + "attempt dirty a pinned and protected entry succeeded.\n"; + + } else { + + unprotect_entry(file_ptr, 0, 0, FALSE, H5C__UNPIN_ENTRY_FLAG); + } + } + + if ( pass ) { + + result = H5C_mark_pinned_entry_dirty((void *)entry_ptr, + FALSE, (size_t)0); + + + if ( result > 0 ) { + + pass = FALSE; + failure_mssg = + "attempt to dirty a unpinned and unprotected entry succeeded 1.\n"; + } + } + + if ( pass ) { + + result = H5C_mark_pinned_or_protected_entry_dirty((void *)entry_ptr); + + + if ( result > 0 ) { + + pass = FALSE; + failure_mssg = + "attempt to dirty a unpinned and unprotected entry succeeded 2.\n"; + } + } + + if ( pass ) { + + takedown_cache(file_ptr, FALSE, FALSE); + } + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + if ( core_file_driver_failed ) { + + HDfprintf(stdout, + "%s(): Unable to open test file with core file driver.\n", + fcn_name); + } + + return !pass; + +} /* check_mark_entry_dirty_errs() */ + + +/*------------------------------------------------------------------------- + * Function: check_expunge_entry_errs() + * + * Purpose: Verify that invalid calls to H5C_expunge_entry() + * generate errors as expected. + * + * Return: void + * + * Programmer: John Mainzer + * 7/6/06 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +static unsigned +check_expunge_entry_errs(void) +{ + const char * fcn_name = "check_expunge_entry_errs()"; + herr_t result; + H5F_t * file_ptr = NULL; + test_entry_t * entry_ptr; + + TESTING("expunge entry related errors"); + + core_file_driver_failed = FALSE; + + pass = TRUE; + + /* Allocate a cache, protect an entry, and then call H5C_expunge_entry() + * to expunge it -- this should fail + * + * Unprotect the the entry with the pinned flag, and then call + * H5C_expunge_entry() again. This should fail too. + * + * Finally, unpin the entry and call H5C_expunge_entry() yet again. + * This should succeed. + * + * Destroy the cache -- should succeed. + */ + + if ( pass ) { + + reset_entries(); + + file_ptr = setup_cache((size_t)(2 * 1024), + (size_t)(1 * 1024)); + + entry_ptr = &((entries[0])[0]); + + protect_entry(file_ptr, 0, 0); + + } + + if ( pass ) { + + result = H5C_expunge_entry(file_ptr, H5P_DATASET_XFER_DEFAULT, + &(types[0]), entry_ptr->addr); + + if ( result > 0 ) { + + pass = FALSE; + failure_mssg = + "attempt to expunge a protected entry succeeded.\n"; + + } else { + + unprotect_entry(file_ptr, 0, 0, FALSE, H5C__PIN_ENTRY_FLAG); + + } + } + + if ( pass ) { + + result = H5C_expunge_entry(file_ptr, H5P_DATASET_XFER_DEFAULT, + &(types[0]), entry_ptr->addr); + + if ( result > 0 ) { + + pass = FALSE; + failure_mssg = + "attempt to expunge a pinned entry succeeded.\n"; + + } else { + + unpin_entry(file_ptr, 0, 0); + + } + } + + if ( pass ) { + + result = H5C_expunge_entry(file_ptr, H5P_DATASET_XFER_DEFAULT, + &(types[0]), entry_ptr->addr); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = + "attempt to expunge an unpinned and unprotected entry failed.\n"; + + } + } + + + if ( pass ) { + + takedown_cache(file_ptr, FALSE, FALSE); + } + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + if ( core_file_driver_failed ) { + + HDfprintf(stdout, + "%s(): Unable to open test file with core file driver.\n", + fcn_name); + } + + return !pass; + +} /* check_expunge_entry_errs() */ + + +/*------------------------------------------------------------------------- + * Function: check_resize_entry_errs() + * + * Purpose: Verify that invalid calls to H5C_resize_pinned_entry() + * generates errors as expected. + * + * Return: void + * + * Programmer: John Mainzer + * 7/7/06 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +static unsigned +check_resize_entry_errs(void) +{ + const char * fcn_name = "check_resize_entry_errs()"; + herr_t result; + H5F_t * file_ptr = NULL; + test_entry_t * entry_ptr; + + TESTING("resize entry related errors"); + + core_file_driver_failed = FALSE; + + pass = TRUE; + + /* Allocate a cache, protect an entry, and then call + * H5C_resize_pinned_entry() to resize it -- this should fail. + * + * Unprotect the the entry with the pinned flag, and then call + * H5C_resize_pinned_entry() again with new size of zero. + * This should fail too. + * + * Finally, unpin the entry and destroy the cache. + * This should succeed. + */ + + if ( pass ) { + + reset_entries(); + + file_ptr = setup_cache((size_t)(2 * 1024), + (size_t)(1 * 1024)); + + entry_ptr = &((entries[0])[0]); + + protect_entry(file_ptr, 0, 0); + + } + + if ( pass ) { + + result = H5C_resize_pinned_entry((void *)entry_ptr, (size_t)1); + + if ( result > 0 ) { + + pass = FALSE; + failure_mssg = + "Call to H5C_resize_pinned_entry on a protected entry succeeded.\n"; + + } else { + + unprotect_entry(file_ptr, 0, 0, FALSE, H5C__PIN_ENTRY_FLAG); + + } + } + + if ( pass ) { + + result = H5C_resize_pinned_entry((void *)entry_ptr, (size_t)0); + + if ( result > 0 ) { + + pass = FALSE; + failure_mssg = + "Call to H5C_resize_pinned_entry with 0 new size succeeded.\n"; + + } else { + + unpin_entry(file_ptr, 0, 0); + + } + } + + if ( pass ) { + + takedown_cache(file_ptr, FALSE, FALSE); + } + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + if ( core_file_driver_failed ) { + + HDfprintf(stdout, + "%s(): Unable to open test file with core file driver.\n", + fcn_name); + } + + return !pass; + +} /* check_resize_entry_errs() */ + + +/*------------------------------------------------------------------------- + * Function: check_unprotect_ro_dirty_err() + * + * Purpose: If an entry is protected read only, verify that unprotecting + * it dirty will generate an error. + * + * Return: void + * + * Programmer: John Mainzer + * 4/3/07 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +static unsigned +check_unprotect_ro_dirty_err(void) +{ + const char * fcn_name = "check_unprotect_ro_dirty_err()"; + herr_t result; + H5F_t * file_ptr = NULL; + test_entry_t * entry_ptr; + + TESTING("unprotect a read only entry dirty error"); + + core_file_driver_failed = FALSE; + + pass = TRUE; + + /* allocate a cache, protect an entry read only, and then unprotect it + * with the dirtied flag set. This should fail. Destroy the cache + * -- should succeed. + */ + + if ( pass ) { + + reset_entries(); + + file_ptr = setup_cache((size_t)(2 * 1024), + (size_t)(1 * 1024)); + + protect_entry_ro(file_ptr, 0, 0); + + entry_ptr = &((entries[0])[0]); + } + + if ( pass ) { + + result = H5C_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT, + &(types[0]), entry_ptr->addr, + (void *)entry_ptr, H5C__DIRTIED_FLAG, + (size_t)0); + + if ( result >= 0 ) { + + pass = FALSE; + failure_mssg = + "attempt to unprotect a ro entry dirty succeeded 1.\n"; + } + } + + if ( pass ) { + + unprotect_entry(file_ptr, 0, 0, FALSE, H5C__NO_FLAGS_SET); + + } + + if ( pass ) { + + takedown_cache(file_ptr, FALSE, FALSE); + } + + /* allocate a another cache, protect an entry read only twice, and + * then unprotect it with the dirtied flag set. This should fail. + * Unprotect it with no flags set twice and then destroy the cache. + * This should succeed. + */ + + if ( pass ) { + + reset_entries(); + + file_ptr = setup_cache((size_t)(2 * 1024), + (size_t)(1 * 1024)); + + protect_entry_ro(file_ptr, 0, 0); + protect_entry_ro(file_ptr, 0, 0); + + entry_ptr = &((entries[0])[0]); + } + + if ( pass ) { + + result = H5C_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT, + &(types[0]), entry_ptr->addr, + (void *)entry_ptr, H5C__DIRTIED_FLAG, + (size_t)0); + + if ( result > 0 ) { + + pass = FALSE; + failure_mssg = + "attempt to unprotect a ro entry dirty succeeded 2.\n"; + } + } + + if ( pass ) { + + unprotect_entry(file_ptr, 0, 0, FALSE, H5C__NO_FLAGS_SET); + unprotect_entry(file_ptr, 0, 0, FALSE, H5C__NO_FLAGS_SET); + + } + + if ( pass ) { + + takedown_cache(file_ptr, FALSE, FALSE); + } + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + if ( core_file_driver_failed ) { + + HDfprintf(stdout, + "%s(): Unable to open test file with core file driver.\n", + fcn_name); + } + + return !pass; + +} /* check_unprotect_ro_dirty_err() */ + + +/*------------------------------------------------------------------------- + * Function: check_protect_ro_rw_err() + * + * Purpose: If an entry is protected read only, verify that protecting + * it rw will generate an error. + * + * Return: void + * + * Programmer: John Mainzer + * 4/9/07 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +static unsigned +check_protect_ro_rw_err(void) +{ + const char * fcn_name = "check_protect_ro_rw_err()"; + H5F_t * file_ptr = NULL; + test_entry_t * entry_ptr; + void * thing_ptr = NULL; + + TESTING("protect a read only entry rw error"); + + core_file_driver_failed = FALSE; + + pass = TRUE; + + /* allocate a cache, protect an entry read only, and then try to protect + * it again rw. This should fail. + * + * Unprotect the entry and destroy the cache -- should succeed. + */ + + if ( pass ) { + + reset_entries(); + + file_ptr = setup_cache((size_t)(2 * 1024), + (size_t)(1 * 1024)); + + protect_entry_ro(file_ptr, 0, 0); + + entry_ptr = &((entries[0])[0]); + } + + if ( pass ) { + + thing_ptr = H5C_protect(file_ptr, H5P_DATASET_XFER_DEFAULT, + &(types[0]), entry_ptr->addr, + entry_ptr->size, NULL, H5C__NO_FLAGS_SET); + + if ( thing_ptr != NULL ) { + + pass = FALSE; + failure_mssg = "attempt to protect a ro entry rw succeeded.\n"; + } + } + + if ( pass ) { + + unprotect_entry(file_ptr, 0, 0, FALSE, H5C__NO_FLAGS_SET); + } + + if ( pass ) { + + takedown_cache(file_ptr, FALSE, FALSE); + } + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + if ( core_file_driver_failed ) { + + HDfprintf(stdout, + "%s(): Unable to open test file with core file driver.\n", + fcn_name); + } + + return !pass; + +} /* check_protect_ro_rw_err() */ + + +/*------------------------------------------------------------------------- + * Function: check_evictions_enabled_err() + * + * Purpose: Verify that H5C_get_evictions_enabled() and + * H5C_set_evictions_enabled() generate errors as expected. + * + * Return: void + * + * Programmer: John Mainzer + * 8/3/07 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +static unsigned +check_check_evictions_enabled_err(void) +{ + const char * fcn_name = "check_evictions_enabled_err()"; + herr_t result; + hbool_t evictions_enabled; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + + TESTING("get/set evictions enabled errors"); + + core_file_driver_failed = FALSE; + + pass = TRUE; + + /* allocate a cache. + * + * Call H5C_get_evictions_enabled(), passing it a NULL cache_ptr, + * should fail. + * + * Repeat with a NULL evictions_enabled_ptr, should fail as well. + * + * Configure the cache to use auto cache resize. Call + * H5C_set_evictions_enabled() to disable evictions. Should fail. + * + * Unprotect the entry and destroy the cache -- should succeed. + */ + + if ( pass ) { + + reset_entries(); + + file_ptr = setup_cache((size_t)(2 * 1024), + (size_t)(1 * 1024)); + cache_ptr = file_ptr->shared->cache; + } + + if ( pass ) { + + result = H5C_get_evictions_enabled(NULL, &evictions_enabled); + + if ( result == SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_evictions_enabled succeeded() 1.\n"; + } + } + + if ( pass ) { + + result = H5C_get_evictions_enabled(cache_ptr, NULL); + + if ( result == SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_evictions_enabled succeeded() 2.\n"; + } + } + + if ( pass ) { + + result = H5C_set_evictions_enabled(cache_ptr, TRUE); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_evictions_enabled failed().\n"; + + } + } + + if ( pass ) { + + (cache_ptr->resize_ctl).incr_mode = H5C_incr__threshold; + + result = H5C_get_evictions_enabled(cache_ptr, FALSE); + + if ( result == SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_evictions_enabled succeeded() 1.\n"; + + } else if ( cache_ptr->evictions_enabled == TRUE ) { + + } + + (cache_ptr->resize_ctl).incr_mode = H5C_incr__off; + } + + if ( pass ) { + + (cache_ptr->resize_ctl).decr_mode = H5C_decr__threshold; + + result = H5C_get_evictions_enabled(cache_ptr, FALSE); + + if ( result == SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_evictions_enabled succeeded() 2.\n"; + } + + (cache_ptr->resize_ctl).decr_mode = H5C_decr__off; + } + + + if ( pass ) { + + takedown_cache(file_ptr, FALSE, FALSE); + } + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + if ( core_file_driver_failed ) { + + HDfprintf(stdout, + "%s(): Unable to open test file with core file driver.\n", + fcn_name); + } + + return !pass; + +} /* check_evictions_enabled_err() */ + + +/*------------------------------------------------------------------------- + * Function: check_auto_cache_resize() + * + * Purpose: Exercise the automatic cache resizing functionality. + * The objective is to operate the auto-resize code in + * all possible modes. Unfortunately, there are quite + * a few of them. + * + * Return: void + * + * Programmer: John Mainzer + * 10/29/04 + * + * Modifications: + * + * John Mainzer 1/8/08 + * Added a basic set of tests for the flash cache size + * increment code. + * + *------------------------------------------------------------------------- + */ + +hbool_t rpt_fcn_called = FALSE; +enum H5C_resize_status rpt_status; + +static void test_rpt_fcn(UNUSED H5C_t * cache_ptr, + UNUSED int32_t version, + UNUSED double hit_rate, + enum H5C_resize_status status, + UNUSED size_t old_max_cache_size, + UNUSED size_t new_max_cache_size, + UNUSED size_t old_min_clean_size, + UNUSED size_t new_min_clean_size) +{ + rpt_fcn_called = TRUE; + rpt_status = status; +} + +static unsigned +check_auto_cache_resize(void) +{ + const char * fcn_name = "check_auto_cache_resize()"; + hbool_t show_progress = FALSE; + herr_t result; + int32_t i; + int32_t checkpoint = 0; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + H5C_auto_size_ctl_t auto_size_ctl = + { + /* int32_t version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* H5C_auto_resize_report_fcn rpt_fcn = */ test_rpt_fcn, + + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (512 * 1024), + + /* double min_clean_fraction = */ 0.5, + + /* size_t max_size = */ (14 * 1024 * 1024), + /* size_t min_size = */ (512 * 1024), + + /* int64_t epoch_length = */ 1000, + + + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + + /* double lower_hr_threshold = */ 0.75, + + /* double increment = */ 2.0, + + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + + + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__threshold, + + /* double upper_hr_threshold = */ 0.995, + + /* double decrement = */ 0.1, + + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + + /* int32_t epochs_before_eviction = */ 3, + + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.05 + }; + + TESTING("automatic cache resizing"); + + core_file_driver_failed = FALSE; + + pass = TRUE; + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* allocate a cache, enable automatic cache resizing, and then force + * the cache through all its operational modes. Verify that all + * performs as expected. + */ + + if ( pass ) { + + reset_entries(); + + file_ptr = setup_cache((size_t)(2 * 1024), + (size_t)(1 * 1024)); + cache_ptr = file_ptr->shared->cache; + } + + if ( pass ) { + + result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 1.\n"; + } + } + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (512 * 1024) ) || + ( cache_ptr->min_clean_size != (256 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "bad cache size after initialization.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force low hit rate with cache not full -- should result in not + * full status. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, PICO_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, PICO_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != not_full ) || + ( cache_ptr->max_cache_size != (512 * 1024) ) || + ( cache_ptr->min_clean_size != (256 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 1.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force low hit rate with cache full -- should result in increase + * of cache size from .5 to 1 meg. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != increase ) || + ( cache_ptr->max_cache_size != (1 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (512 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 2.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force low hit rate with cache not full -- should result in not + * full status. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, PICO_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, PICO_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != not_full ) || + ( cache_ptr->max_cache_size != (1 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (512 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 3.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force low hit rate with cache full again -- should result in increase + * of cache size from 1 to 2 meg. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != increase ) || + ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 4.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force low hit rate with cache full again -- should result in increase + * of cache size from 2 to 4 meg. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != increase ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 5.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force low hit rate with cache full again -- should result in increase + * of cache size from 4 to 8 meg. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != increase ) || + ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 6.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force low hit rate with cache full again -- should result in increase + * of cache size from 8 to 12 meg. Note that max increase reduced the + * size of the increase. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != increase ) || + ( cache_ptr->max_cache_size != (12 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (6 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 7.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force low hit rate with cache full again -- should result in increase + * of cache size from 12 to 14 meg. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != increase ) || + ( cache_ptr->max_cache_size != (14 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (7 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 8.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force low hit rate with cache full and at maximum size -- should + * in no change in size and a result of at_max_size. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != at_max_size ) || + ( cache_ptr->max_cache_size != (14 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (7 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 9.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force high hit rate with cache full and at maximum size -- should + * result in a decrease from 14 to 13 Meg -- note that max decrease + * reduced the size of the reduction + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (13 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (6 * 1024 * 1024 + 512 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 10.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* the current cache configuration is inconvenient for testing cache + * size reduction, so lets change it some something easier to work + * with. + */ + + if ( pass ) { + + auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + auto_size_ctl.rpt_fcn = test_rpt_fcn; + + auto_size_ctl.set_initial_size = TRUE; + auto_size_ctl.initial_size = 4 * 1000 * 1000 + 10; + + auto_size_ctl.min_clean_fraction = 0.1; + + auto_size_ctl.max_size = 8 * 1000 * 1000; + auto_size_ctl.min_size = 500 * 1000; + + auto_size_ctl.epoch_length = 1000; + + + auto_size_ctl.incr_mode = H5C_incr__threshold; + + auto_size_ctl.lower_hr_threshold = 0.75; + + auto_size_ctl.increment = 2.0; + + auto_size_ctl.apply_max_increment = TRUE; + auto_size_ctl.max_increment = (4 * 1000 * 1000); + + auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + auto_size_ctl.flash_multiple = 2.0; + auto_size_ctl.flash_threshold = 0.5; + + auto_size_ctl.decr_mode = H5C_decr__threshold; + + auto_size_ctl.upper_hr_threshold = 0.995; + + auto_size_ctl.decrement = 0.5; + + auto_size_ctl.apply_max_decrement = TRUE; + auto_size_ctl.max_decrement = (1 * 1000 * 1000); + + auto_size_ctl.epochs_before_eviction = 3; + + auto_size_ctl.apply_empty_reserve = TRUE; + auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 2.\n"; + } + } + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (4 * 1000 * 1000 + 10) ) || + ( cache_ptr->min_clean_size != (400 * 1000 + 1) ) ) { + + pass = FALSE; + failure_mssg = "bad cache size after set resize re-config 1.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force high hit rate -- should result in a decrease from ~4 to ~3 + * M -- note that max decrease reduces the size of the reduction + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (3 * 1000 * 1000 + 10) ) || + ( cache_ptr->min_clean_size != (300 * 1000 + 1) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 11.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force high hit rate again -- should result in a decrease from ~3 + * to ~2 M -- again note that max decrease reduces the size of the + * reduction. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (2 * 1000 * 1000 + 10) ) || + ( cache_ptr->min_clean_size != (200 * 1000 + 1) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 12.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force high hit rate again -- should result in a decrease from ~2 + * to ~1 M -- again note that max decrease reduces the size of the + * reduction, but only by five bites. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (1 * 1000 * 1000 + 10) ) || + ( cache_ptr->min_clean_size != (100 * 1000 + 1) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 13.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force high hit rate again -- should result in a decrease from ~1 + * to ~0.5 M -- max decrease is no longer a factor. New size is five + * bytes above the minimum. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (500 * 1000 + 5) ) || + ( cache_ptr->min_clean_size != (50 * 1000) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 14.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force high hit rate again -- should result in a decrease of five + * bytes to the minimum cache size. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (500 * 1000) ) || + ( cache_ptr->min_clean_size != (50 * 1000) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 15.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force high hit rate again -- Already at minimum size so no change in + * cache size and result should be at_min_size. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != at_min_size ) || + ( cache_ptr->max_cache_size != (500 * 1000) ) || + ( cache_ptr->min_clean_size != (50 * 1000) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 16.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force in range hit rate -- should be no change in cache size, + * and result should be in_spec. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 900 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i + 1000); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i + 1000, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != in_spec ) || + ( cache_ptr->max_cache_size != (500 * 1000) ) || + ( cache_ptr->min_clean_size != (50 * 1000) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 17.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force low hit rate with cache full -- should + * increase cache size from .5 to 1 M. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != increase ) || + ( cache_ptr->max_cache_size != (1 * 1000 * 1000) ) || + ( cache_ptr->min_clean_size != (100 * 1000) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 18.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force high hit rate -- should result in a decrease to the + * minimum cache size. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (500 * 1000) ) || + ( cache_ptr->min_clean_size != (50 * 1000) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 19.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /****************************************************************** + * now do some tests with the maximum increase and decrease sizes + * disabled. + ******************************************************************/ + + if ( pass ) { + + auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + auto_size_ctl.rpt_fcn = test_rpt_fcn; + + auto_size_ctl.set_initial_size = TRUE; + auto_size_ctl.initial_size = 4 * 1024 * 1024; + + auto_size_ctl.min_clean_fraction = 0.5; + + auto_size_ctl.max_size = 16 * 1024 * 1024; + auto_size_ctl.min_size = 1 * 1024 * 1024; + + auto_size_ctl.epoch_length = 1000; + + + auto_size_ctl.incr_mode = H5C_incr__threshold; + + auto_size_ctl.lower_hr_threshold = 0.75; + + auto_size_ctl.increment = 4.0; + + auto_size_ctl.apply_max_increment = FALSE; + auto_size_ctl.max_increment = (4 * 1024 * 1024); + + auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + auto_size_ctl.flash_multiple = 2.0; + auto_size_ctl.flash_threshold = 0.5; + + auto_size_ctl.decr_mode = H5C_decr__threshold; + + auto_size_ctl.upper_hr_threshold = 0.995; + + auto_size_ctl.decrement = 0.25; + + auto_size_ctl.apply_max_decrement = FALSE; + auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + auto_size_ctl.epochs_before_eviction = 3; + + auto_size_ctl.apply_empty_reserve = TRUE; + auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 3.\n"; + } + } + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "bad cache size after set resize re-config 2.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force high hit rate -- should result in a decrease to the + * minimum cache size. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (1 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (512 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 20.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force low hit rate with cache full -- should increase cache size + * from 1 to 4 Meg. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != increase ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 21.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force low hit rate again with cache full -- should increase cache + * size from 4 to 16 Meg. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != increase ) || + ( cache_ptr->max_cache_size != (16 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != ( 8 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 22.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force high hit rate -- should result in a decrease cache size from + * 16 to 4 Meg. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 23.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /****************************************************************** + * We have tested the threshold increment and decrement modes. + * must now test the ageout decrement mode. + * + * Reconfigure the cache for this testing. + ******************************************************************/ + + if ( pass ) { + + auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + auto_size_ctl.rpt_fcn = test_rpt_fcn; + + auto_size_ctl.set_initial_size = TRUE; + auto_size_ctl.initial_size = 8 * 1024 * 1024; + + auto_size_ctl.min_clean_fraction = 0.5; + + auto_size_ctl.max_size = 8 * 1024 * 1024; + auto_size_ctl.min_size = 512 * 1024; + + auto_size_ctl.epoch_length = 1000; + + + auto_size_ctl.incr_mode = H5C_incr__threshold; + + auto_size_ctl.lower_hr_threshold = 0.75; + + auto_size_ctl.increment = 2.0; + + auto_size_ctl.apply_max_increment = TRUE; + auto_size_ctl.max_increment = (4 * 1024 * 1024); + + auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + auto_size_ctl.flash_multiple = 2.0; + auto_size_ctl.flash_threshold = 0.5; + + + auto_size_ctl.decr_mode = H5C_decr__age_out; + + auto_size_ctl.upper_hr_threshold = 0.995; + + auto_size_ctl.decrement = 0.5; + + auto_size_ctl.apply_max_decrement = FALSE; + auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + auto_size_ctl.epochs_before_eviction = 3; + + auto_size_ctl.apply_empty_reserve = FALSE; + auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 4.\n"; + } + } + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "bad cache size after set resize re-config 3.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + + /* fill the cache with 1024 byte entries -- nothing should happen + * for three epochs while the markers are inserted into the cache + * + * Note that hit rate will be zero, so the cache will attempt to + * increase its size. Since we are already at max size, it will + * not be able to. + */ + if ( pass ) { /* first epoch */ + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != at_max_size ) || + ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 24.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass ) { /* second epoch */ + + rpt_fcn_called = FALSE; + i = 1000; + while ( ( pass ) && ( i < 2000 ) ) + { + protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != at_max_size ) || + ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 25.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass ) { /* third epoch */ + + rpt_fcn_called = FALSE; + i = 2000; + while ( ( pass ) && ( i < 3000 ) ) + { + protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != at_max_size ) || + ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 26.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* fourth epoch -- If the hit rate were above the lower threshold, + * we would see cache size reduction now. However, nothing will + * happen until we get the hit rate above the lower threshold. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 3000; + while ( ( pass ) && ( i < 4000 ) ) + { + protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != at_max_size ) || + ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 27.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* fifth epoch -- force the hit rate to 100%. We should see cache size + * reduction now. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 3000; + while ( ( pass ) && ( i < 4000 ) ) + { + protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (2001 * 1024) ) || + ( cache_ptr->min_clean_size != (int)(2001 * 512) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 28.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* sixth epoch -- force the hit rate to 100% again. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 3000; + while ( ( pass ) && ( i < 4000 ) ) + { + protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (1001 * 1024) ) || + ( cache_ptr->min_clean_size != (int)(1001 * 512) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 29.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* seventh epoch -- force the hit rate to 100% again. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 3000; + while ( ( pass ) && ( i < 4000 ) ) + { + protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (1000 * 1024) ) || + ( cache_ptr->min_clean_size != (int)(1000 * 512) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 30.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* eigth epoch -- force the hit rate to 100% again -- should be steady + * state. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 3000; + while ( ( pass ) && ( i < 4000 ) ) + { + protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != in_spec ) || + ( cache_ptr->max_cache_size != (1000 * 1024) ) || + ( cache_ptr->min_clean_size != (int)(1000 * 512) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 31.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* now just bang on one entry -- after three epochs, this should + * get all entries other than the one evicted, and the cache size + * should be decreased to the minimum. + */ + if ( pass ) { /* ninth epoch */ + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != in_spec ) || + ( cache_ptr->max_cache_size != (1000 * 1024) ) || + ( cache_ptr->min_clean_size != (int)(1000 * 512) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 32.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass ) { /* tenth epoch */ + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != in_spec ) || + ( cache_ptr->max_cache_size != (1000 * 1024) ) || + ( cache_ptr->min_clean_size != (int)(1000 * 512) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 33.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass ) { /* eleventh epoch -- cache size reduction */ + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (512 * 1024) ) || + ( cache_ptr->min_clean_size != (256 * 1024) ) || + ( cache_ptr->index_len != 2 ) || + ( cache_ptr->index_size != + MONSTER_ENTRY_SIZE + MEDIUM_ENTRY_SIZE ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 34.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass ) { /* twelth epoch -- at minimum size so no more ageouts */ + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != at_min_size ) || + ( cache_ptr->max_cache_size != (512 * 1024) ) || + ( cache_ptr->min_clean_size != (256 * 1024) ) || + ( cache_ptr->index_len != 2 ) || + ( cache_ptr->index_size != + MONSTER_ENTRY_SIZE + MEDIUM_ENTRY_SIZE ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 35.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + + /* repeat the above test, but with max_decrement enabled to see + * if that features works as it should. Note that this will change + * the structure of the test a bit. + */ + + if ( pass ) { + + auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + auto_size_ctl.rpt_fcn = test_rpt_fcn; + + auto_size_ctl.set_initial_size = TRUE; + auto_size_ctl.initial_size = 8 * 1024 * 1024; + + auto_size_ctl.min_clean_fraction = 0.5; + + auto_size_ctl.max_size = 8 * 1024 * 1024; + auto_size_ctl.min_size = 512 * 1024; + + auto_size_ctl.epoch_length = 1000; + + + auto_size_ctl.incr_mode = H5C_incr__threshold; + + auto_size_ctl.lower_hr_threshold = 0.75; + + auto_size_ctl.increment = 2.0; + + auto_size_ctl.apply_max_increment = TRUE; + auto_size_ctl.max_increment = (4 * 1024 * 1024); + + auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + auto_size_ctl.flash_multiple = 2.0; + auto_size_ctl.flash_threshold = 0.5; + + + auto_size_ctl.decr_mode = H5C_decr__age_out; + + auto_size_ctl.upper_hr_threshold = 0.995; + + auto_size_ctl.decrement = 0.5; + + auto_size_ctl.apply_max_decrement = TRUE; + auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + auto_size_ctl.epochs_before_eviction = 3; + + auto_size_ctl.apply_empty_reserve = FALSE; + auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 5.\n"; + } + } + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "bad cache size after set resize re-config 4.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + + /* fill the cache with 1024 byte entries -- nothing should happen + * for three epochs while the markers are inserted into the cache + * + * Note that hit rate will be zero, so the cache will attempt to + * increase its size. Since we are already at max size, it will + * not be able to. + */ + if ( pass ) { /* first epoch */ + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != at_max_size ) || + ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 36.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass ) { /* second epoch */ + + rpt_fcn_called = FALSE; + i = 1000; + while ( ( pass ) && ( i < 2000 ) ) + { + protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != at_max_size ) || + ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 37.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass ) { /* third epoch */ + + rpt_fcn_called = FALSE; + i = 2000; + while ( ( pass ) && ( i < 3000 ) ) + { + protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != at_max_size ) || + ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 38.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* fourth epoch -- If the hit rate were above the lower threshold, + * we would see cache size reduction now. However, nothing will + * happen until we get the hit rate above the lower threshold. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 3000; + while ( ( pass ) && ( i < 4000 ) ) + { + protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != at_max_size ) || + ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 39.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* fifth epoch -- force the hit rate to 100%. We should see cache size + * reduction now. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 3000; + while ( ( pass ) && ( i < 4000 ) ) + { + protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (7 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (7 * 512 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 40.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* sixth epoch -- force the hit rate to 100% again. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 2000; + while ( ( pass ) && ( i < 3000 ) ) + { + protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (6 * 512 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 41.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* seventh epoch -- keep hit rate at 100%, and keep 2K entries active. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 3000; + while ( ( pass ) && ( i < 4000 ) ) + { + protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (5 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (5 * 512 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 42.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* eigth epoch -- still 100% hit rate + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 2000; + while ( ( pass ) && ( i < 3000 ) ) + { + protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 512 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 43.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* ninth epoch --hit rate at 100%. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 3000; + while ( ( pass ) && ( i < 4000 ) ) + { + protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (3 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 512 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 44.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* tenth epoch -- still 100% hit rate + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 2000; + while ( ( pass ) && ( i < 3000 ) ) + { + protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 512 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 45.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* eleventh epoch -- hit rate at 100% -- starting to stableize + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 3000; + while ( ( pass ) && ( i < 4000 ) ) + { + protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (2000 * 1024) ) || + ( cache_ptr->min_clean_size != (int)(2000 * 512) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 46.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* twelth epoch -- force the hit rate to 100% again -- should be steady + * state. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 2000; + while ( ( pass ) && ( i < 3000 ) ) + { + protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != in_spec ) || + ( cache_ptr->max_cache_size != (2000 * 1024) ) || + ( cache_ptr->min_clean_size != (int)(2000 * 512) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 47.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* now just bang on one entry -- after three epochs, this should + * get all entries other than the one evicted, and the cache size + * should be decreased to the minimum. + */ + if ( pass ) { /* thirteenth epoch */ + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != in_spec ) || + ( cache_ptr->max_cache_size != (2000 * 1024) ) || + ( cache_ptr->min_clean_size != (int)(2000 * 512) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 48.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass ) { /* fourteenth epoch */ + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != + (1001 * 1024 + MONSTER_ENTRY_SIZE) ) || + ( cache_ptr->min_clean_size != + (1001 * 512 + MONSTER_ENTRY_SIZE / 2) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 49.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass ) { /* fifteenth epoch -- cache size reduction */ + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (512 * 1024) ) || + ( cache_ptr->min_clean_size != (256 * 1024) ) || + ( cache_ptr->index_len != 2 ) || + ( cache_ptr->index_size != + MONSTER_ENTRY_SIZE + MEDIUM_ENTRY_SIZE ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 50.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass ) { /* sixteenth epoch -- at minimum size so no more ageouts */ + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != at_min_size ) || + ( cache_ptr->max_cache_size != (512 * 1024) ) || + ( cache_ptr->min_clean_size != (256 * 1024) ) || + ( cache_ptr->index_len != 2 ) || + ( cache_ptr->index_size != + MONSTER_ENTRY_SIZE + MEDIUM_ENTRY_SIZE ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 51.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + + /* repeat the test yet again, this time with empty reserve enabled. + * Again, some structural changes in the test are necessary. + */ + + if ( pass ) { + + auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + auto_size_ctl.rpt_fcn = test_rpt_fcn; + + auto_size_ctl.set_initial_size = TRUE; + auto_size_ctl.initial_size = 8 * 1024 * 1024; + + auto_size_ctl.min_clean_fraction = 0.5; + + auto_size_ctl.max_size = 8 * 1024 * 1024; + auto_size_ctl.min_size = 512 * 1024; + + auto_size_ctl.epoch_length = 1000; + + + auto_size_ctl.incr_mode = H5C_incr__threshold; + + auto_size_ctl.lower_hr_threshold = 0.75; + + auto_size_ctl.increment = 2.0; + + auto_size_ctl.apply_max_increment = TRUE; + auto_size_ctl.max_increment = (4 * 1024 * 1024); + + auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + auto_size_ctl.flash_multiple = 2.0; + auto_size_ctl.flash_threshold = 0.5; + + + auto_size_ctl.decr_mode = H5C_decr__age_out; + + auto_size_ctl.upper_hr_threshold = 0.995; + + auto_size_ctl.decrement = 0.5; + + auto_size_ctl.apply_max_decrement = FALSE; + auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + auto_size_ctl.epochs_before_eviction = 3; + + auto_size_ctl.apply_empty_reserve = TRUE; + auto_size_ctl.empty_reserve = 0.5; /* for ease of testing */ + + result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 6.\n"; + } + } + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "bad cache size after set resize re-config 5.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + + /* fill the cache with 1024 byte entries -- nothing should happen + * for three epochs while the markers are inserted into the cache + * + * Note that hit rate will be zero, so the cache will attempt to + * increase its size. Since we are already at max size, it will + * not be able to. + */ + if ( pass ) { /* first epoch */ + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != at_max_size ) || + ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 52.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass ) { /* second epoch */ + + rpt_fcn_called = FALSE; + i = 1000; + while ( ( pass ) && ( i < 2000 ) ) + { + protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != at_max_size ) || + ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 53.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass ) { /* third epoch */ + + rpt_fcn_called = FALSE; + i = 2000; + while ( ( pass ) && ( i < 3000 ) ) + { + protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != at_max_size ) || + ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 54.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* fourth epoch -- If the hit rate were above the lower threshold, + * we would see cache size reduction now. However, nothing will + * happen until we get the hit rate above the lower threshold. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 3000; + while ( ( pass ) && ( i < 4000 ) ) + { + protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != at_max_size ) || + ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 55.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* fifth epoch -- force the hit rate to 100%. We should see cache size + * reduction now. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 3000; + while ( ( pass ) && ( i < 4000 ) ) + { + protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (4002 * 1024) ) || + ( cache_ptr->min_clean_size != (int)(4002 * 512) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 56.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* sixth epoch -- force the hit rate to 100% again. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 3000; + while ( ( pass ) && ( i < 4000 ) ) + { + protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (2002 * 1024) ) || + ( cache_ptr->min_clean_size != (int)(2002 * 512) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 57.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* seventh epoch -- force the hit rate to 100% again. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 3000; + while ( ( pass ) && ( i < 4000 ) ) + { + protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (2000 * 1024) ) || + ( cache_ptr->min_clean_size != (int)(2000 * 512) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 58.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* eigth epoch -- force the hit rate to 100% again -- should be steady + * state. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 3000; + while ( ( pass ) && ( i < 4000 ) ) + { + protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != in_spec ) || + ( cache_ptr->max_cache_size != (2000 * 1024) ) || + ( cache_ptr->min_clean_size != (int)(2000 * 512) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 59.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* now just bang on one entry -- after three epochs, this should + * get all entries other than the one evicted, and the cache size + * should be decreased to the minimum. + */ + if ( pass ) { /* ninth epoch */ + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != in_spec ) || + ( cache_ptr->max_cache_size != (2000 * 1024) ) || + ( cache_ptr->min_clean_size != (int)(2000 * 512) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 60.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass ) { /* tenth epoch */ + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != in_spec ) || + ( cache_ptr->max_cache_size != (2000 * 1024) ) || + ( cache_ptr->min_clean_size != (2000 * 512) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 61.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass ) { /* eleventh epoch -- cache size reduction */ + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (512 * 1024) ) || + ( cache_ptr->min_clean_size != (256 * 1024) ) || + ( cache_ptr->index_len != 2 ) || + ( cache_ptr->index_size != + MONSTER_ENTRY_SIZE + MEDIUM_ENTRY_SIZE ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 62.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass ) { /* twelth epoch -- at minimum size so no more ageouts */ + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != at_min_size ) || + ( cache_ptr->max_cache_size != (512 * 1024) ) || + ( cache_ptr->min_clean_size != (256 * 1024) ) || + ( cache_ptr->index_len != 2 ) || + ( cache_ptr->index_size != + MONSTER_ENTRY_SIZE + MEDIUM_ENTRY_SIZE ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 63.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + + /* Repeat the test again, this time using the age out with threshold + * mode. To simplify the testing, set epochs to eviction to 1. + * + * Again, there are some minor structural changes in the test. + */ + + if ( pass ) { + + auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + auto_size_ctl.rpt_fcn = test_rpt_fcn; + + auto_size_ctl.set_initial_size = TRUE; + auto_size_ctl.initial_size = 8 * 1024 * 1024; + + auto_size_ctl.min_clean_fraction = 0.5; + + auto_size_ctl.max_size = 8 * 1024 * 1024; + auto_size_ctl.min_size = 512 * 1024; + + auto_size_ctl.epoch_length = 1000; + + + auto_size_ctl.incr_mode = H5C_incr__off; + + auto_size_ctl.lower_hr_threshold = 0.75; + + auto_size_ctl.increment = 2.0; + + auto_size_ctl.apply_max_increment = TRUE; + auto_size_ctl.max_increment = (4 * 1024 * 1024); + + auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + auto_size_ctl.flash_multiple = 2.0; + auto_size_ctl.flash_threshold = 0.5; + + + auto_size_ctl.decr_mode = H5C_decr__age_out_with_threshold; + + auto_size_ctl.upper_hr_threshold = 0.999; /* for ease of testing */ + + auto_size_ctl.decrement = 0.5; + + auto_size_ctl.apply_max_decrement = FALSE; + auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + auto_size_ctl.epochs_before_eviction = 1; /* for ease of testing */ + + auto_size_ctl.apply_empty_reserve = FALSE; + auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 7.\n"; + } + } + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "bad cache size after set resize re-config 6.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + + /* fill the cache with 4K byte entries -- increment mode is off, + * so cache size reduction should kick in as soon as we get the + * hit rate above .999. + */ + if ( pass ) { /* first epoch -- hit rate 0 */ + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, LARGE_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != in_spec ) || + ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 64.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass ) { /* second epoch -- hit rate 0 */ + + rpt_fcn_called = FALSE; + i = 1000; + while ( ( pass ) && ( i < 2000 ) ) + { + protect_entry(file_ptr, LARGE_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != in_spec ) || + ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 65.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass ) { /* third epoch -- hit rate 1.0 -- should see decrease */ + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, LARGE_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (1001 * LARGE_ENTRY_SIZE) ) || + ( cache_ptr->min_clean_size != (1001 * LARGE_ENTRY_SIZE / 2) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 66.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* fourth epoch -- load up the cache again -- hit rate 0 */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != in_spec ) || + ( cache_ptr->max_cache_size != (1001 * LARGE_ENTRY_SIZE) ) || + ( cache_ptr->min_clean_size != (1001 * LARGE_ENTRY_SIZE / 2) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 67.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* fifth epoch -- still loading up the cache -- hit rate 0 */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 1000; + while ( ( pass ) && ( i < 2000 ) ) + { + protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != in_spec ) || + ( cache_ptr->max_cache_size != (1001 * LARGE_ENTRY_SIZE) ) || + ( cache_ptr->min_clean_size != (1001 * LARGE_ENTRY_SIZE / 2) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 68.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* sixth epoch -- force hit rate to .998 -- should be no reduction */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 1002; + while ( ( pass ) && ( i < 2002 ) ) + { + protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != in_spec ) || + ( cache_ptr->max_cache_size != (1001 * LARGE_ENTRY_SIZE) ) || + ( cache_ptr->min_clean_size != (1001 * LARGE_ENTRY_SIZE / 2) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 69.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* seventh epoch -- force hit rate to .999 -- should see reduction + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 1003; + while ( ( pass ) && ( i < 2003 ) ) + { + protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (1000 * MEDIUM_ENTRY_SIZE) ) || + ( cache_ptr->min_clean_size != (1000 * MEDIUM_ENTRY_SIZE / 2) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 70.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + + /* We have now tested all the major ageout modes individually. + * Lets try them all together to look for unexpected interactions + * and/or bugs. + */ + + if ( pass ) { + + auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + auto_size_ctl.rpt_fcn = test_rpt_fcn; + + auto_size_ctl.set_initial_size = TRUE; + auto_size_ctl.initial_size = 8 * 1000 * 1024; + + auto_size_ctl.min_clean_fraction = 0.5; + + auto_size_ctl.max_size = 8 * 1000 * 1024; + auto_size_ctl.min_size = 512 * 1024; + + auto_size_ctl.epoch_length = 1000; + + + auto_size_ctl.incr_mode = H5C_incr__threshold; + + auto_size_ctl.lower_hr_threshold = 0.75; + + auto_size_ctl.increment = 2.0; + + auto_size_ctl.apply_max_increment = TRUE; + auto_size_ctl.max_increment = (4 * 1024 * 1024); + + auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + auto_size_ctl.flash_multiple = 2.0; + auto_size_ctl.flash_threshold = 0.5; + + + auto_size_ctl.decr_mode = H5C_decr__age_out_with_threshold; + + auto_size_ctl.upper_hr_threshold = 0.999; /* for ease of testing */ + + auto_size_ctl.decrement = 0.5; + + auto_size_ctl.apply_max_decrement = TRUE; + auto_size_ctl.max_decrement = (1 * 1000 * 1024); + + auto_size_ctl.epochs_before_eviction = 1; /* for ease of testing */ + + auto_size_ctl.apply_empty_reserve = TRUE; + auto_size_ctl.empty_reserve = 0.5; /* for ease of testing */ + + result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 8.\n"; + } + } + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "bad cache size after set resize re-config 7.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* fill the cache with 4K byte entries -- increment mode is threshold, + * so the decrease code will not be executed until the hit rate exceeds + * .75. + */ + if ( pass ) { /* first epoch -- hit rate 0 */ + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, LARGE_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != at_max_size ) || + ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 71.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass ) { /* second epoch -- hit rate 0 */ + + rpt_fcn_called = FALSE; + i = 1000; + while ( ( pass ) && ( i < 2000 ) ) + { + protect_entry(file_ptr, LARGE_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != at_max_size ) || + ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 72.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* third epoch -- force the hit rate to 1.0. Should be no change + * in the cache size due to the combination of the empty reserve + * and the max decrease. Max decrease will limit the evictions + * in any one epoch, and the empty reserve will not permit cache + * size reduction unless the specified empty reserve is maintained. + * + * In this epoch, all we should see is a reduction in the index size. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, LARGE_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != in_spec ) || + ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) || + ( cache_ptr->index_size != (7 * 1000 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 73.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* fourth epoch -- hit rate still 1.0. Index size should decrease, + * but otherwise no change expected. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, LARGE_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != in_spec ) || + ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) || + ( cache_ptr->index_size != (6 * 1000 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 74.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* fifth epoch -- hit rate still 1.0. Index size should decrease, + * but otherwise no change expected. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, LARGE_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != in_spec ) || + ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) || + ( cache_ptr->index_size != (5 * 1000 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 75.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* sixth epoch -- hit rate still 1.0. Index size should decrease, + * but otherwise no change expected. Note that the cache size is + * now just on the edge of meeting the clean reserve. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, LARGE_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != in_spec ) || + ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) || + ( cache_ptr->index_size != (4 * 1000 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 76.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* seventh epoch -- hit rate still 1.0. No change in index size expected. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, LARGE_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != in_spec ) || + ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) || + ( cache_ptr->index_size != (4 * 1000 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 77.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* eighth epoch -- start loading 1 KB entries. Hit rate 0 so + * decrease code shouldn't be called. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != at_max_size ) || + ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) || + ( cache_ptr->index_size != (5 * 1000 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 78.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* ninth epoch -- access the 1 KB entries again, driving the hit rate + * to 1.0. Decrease code should be triggered, but the max decrease + * should prevent the empty reserve from being met in this epoch. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != in_spec ) || + ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) || + ( cache_ptr->index_size != (4 * 1000 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 79.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* tenth epoch -- access the 1 KB entries yet again, forcing hit rate + * to 1.0. Decrease code should be triggered, and the empty reserve + * should finally be met. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (7 * 1000 * 1024) ) || + ( cache_ptr->min_clean_size != (7 * 1000 * 1024 / 2) ) || + ( cache_ptr->index_size != (3 * 1000 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 80.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* eleventh epoch -- access the 1 KB entries yet again, forcing hit rate + * to 1.0. Decrease code should be triggered, and the empty reserve + * should be met again. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (6 * 1000 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1000 * 1024) ) || + ( cache_ptr->index_size != (2 * 1000 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 81.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* twelth epoch -- hit rate 1.0 -- decrease as before. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (5 * 1000 * 1024) ) || + ( cache_ptr->min_clean_size != (5 * 1000 * 1024 / 2) ) || + ( cache_ptr->index_size != (1 * 1000 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 82.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* thirteenth epoch -- hit rate 1.0 -- decrease as before. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (4 * 1000 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1000 * 1024) ) || + ( cache_ptr->index_size != (1 * 1000 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 83.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* fourteenth epoch -- hit rate 1.0 -- decrease as before. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (3 * 1000 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1000 * 1024 / 2) ) || + ( cache_ptr->index_size != (1 * 1000 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 84.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* fifteenth epoch -- hit rate 1.0 -- decrease as before. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (2 * 1000 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1000 * 1024) ) || + ( cache_ptr->index_size != (1 * 1000 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 85.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* sixteenth epoch -- hit rate 1.0 -- should be stable now + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != in_spec ) || + ( cache_ptr->max_cache_size != (2 * 1000 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1000 * 1024) ) || + ( cache_ptr->index_size != (1 * 1000 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 86.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + + /* now test the flash cache size increment code. At least at present, + * there should be no interaction between the regular auto-resize + * code and the flash cache size increment code other than a reset + * of the counter and stats collection used by the regular auto-resize + * code. Thus we do only limited tests of the two pieces of code + * operating together. + * + * Start with simple test to verify that the flash cache increment + * code increases the cache size when and as expected. + */ + + /* Place the cache in a known state via a flush-destroy on the cache + * to clear out all entries, and then a reset on all the entries. + * Then configure the cache for the flash cache size increase tests, + * and force the flash size increase code through all its operational + * modes. Verify that all perform as expected. + */ + + if ( pass ) { + + flush_cache(file_ptr, TRUE, FALSE, FALSE); + + reset_entries(); + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass ) { + + auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + auto_size_ctl.rpt_fcn = test_rpt_fcn; + + auto_size_ctl.set_initial_size = TRUE; + auto_size_ctl.initial_size = 64 * 1024; + + auto_size_ctl.min_clean_fraction = 0.5; + + auto_size_ctl.max_size = 1024 * 1024; + auto_size_ctl.min_size = 5 * 1024; + + auto_size_ctl.epoch_length = 100; + + + auto_size_ctl.incr_mode = H5C_incr__threshold; + + auto_size_ctl.lower_hr_threshold = 0.75; + + auto_size_ctl.increment = 2.0; + + auto_size_ctl.apply_max_increment = TRUE; + auto_size_ctl.max_increment = (32 * 1024); + + auto_size_ctl.flash_incr_mode = H5C_flash_incr__add_space; + auto_size_ctl.flash_multiple = 1.0; + auto_size_ctl.flash_threshold = 0.5; + + + auto_size_ctl.decr_mode = H5C_decr__age_out_with_threshold; + + auto_size_ctl.upper_hr_threshold = 0.999; /* for ease of testing */ + + auto_size_ctl.decrement = 0.5; + + auto_size_ctl.apply_max_decrement = TRUE; + auto_size_ctl.max_decrement = (1 * 1000 * 1024); + + auto_size_ctl.epochs_before_eviction = 1; /* for ease of testing */ + + auto_size_ctl.apply_empty_reserve = TRUE; + auto_size_ctl.empty_reserve = 0.5; /* for ease of testing */ + + result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 12.\n"; + } + } + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (64 * 1024) ) || + ( cache_ptr->min_clean_size != (32 * 1024) ) || + ( cache_ptr->index_len != 0 ) || + ( cache_ptr->index_size != 0 ) || + ( cache_ptr->cache_accesses != 0 ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache config (0).\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* Load a huge entry into the cache */ + if ( pass ) { + + protect_entry(file_ptr, HUGE_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, HUGE_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + + if ( ( pass ) && + ( ( ( cache_ptr->max_cache_size != (64 * 1024) ) || + ( cache_ptr->min_clean_size != (32 * 1024) ) || + ( cache_ptr->index_len != 1 ) || + ( cache_ptr->index_size != HUGE_ENTRY_SIZE ) || + ( cache_ptr->cache_accesses != 1 ) ) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache config (1).\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* Now load a monster entry. Since a monster entry is larger than + * half the size of the cache, and there is not sufficient space + * for a monster entry in the cache, we will add space to the + * cache to make room for the entry. + */ + if ( pass ) { + + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + + if ( ( pass ) && + ( ( ( cache_ptr->max_cache_size != (80 * 1024) ) || + ( cache_ptr->min_clean_size != (40 * 1024) ) || + ( cache_ptr->index_len != 2 ) || + ( cache_ptr->index_size != (HUGE_ENTRY_SIZE + + MONSTER_ENTRY_SIZE) ) || + ( cache_ptr->cache_accesses != 1 ) ) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache config (2).\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* Load a second monster entry. Since the monster entry is larger + * than half the size of the cache yet again, and there is not + * sufficient space for the monster entry in the cache, we again + * add space to the cache to make space for the entry. + */ + if ( pass ) { + + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 1); + + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 1, + NO_CHANGE, H5C__NO_FLAGS_SET); + + if ( ( pass ) && + ( ( ( cache_ptr->max_cache_size != (144 * 1024) ) || + ( cache_ptr->min_clean_size != ( 72 * 1024) ) || + ( cache_ptr->index_len != 3 ) || + ( cache_ptr->index_size != ((2 * MONSTER_ENTRY_SIZE) + + HUGE_ENTRY_SIZE) ) || + ( cache_ptr->cache_accesses != 1 ) ) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache config (3).\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* Load a third moster entry. Should be no cache size increase this + * time. + */ + if ( pass ) { + + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 2); + + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 2, + NO_CHANGE, H5C__NO_FLAGS_SET); + + if ( ( pass ) && + ( ( ( cache_ptr->max_cache_size != (144 * 1024) ) || + ( cache_ptr->min_clean_size != ( 72 * 1024) ) || + ( cache_ptr->index_len != 2 ) || + ( cache_ptr->index_size != (2 * MONSTER_ENTRY_SIZE) ) || + ( cache_ptr->cache_accesses != 2 ) ) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache config (4).\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* delete existing entries to prepare for next test, and reset + * the size of the cache. + */ + if ( pass ) { + + expunge_entry(file_ptr, MONSTER_ENTRY_TYPE, 1); + expunge_entry(file_ptr, MONSTER_ENTRY_TYPE, 2); + + if ( pass ) { + + result = H5C_set_cache_auto_resize_config(cache_ptr, + &auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 13.\n"; + } + } + + if ( ( pass ) && + ( ( ( cache_ptr->max_cache_size != (64 * 1024) ) || + ( cache_ptr->min_clean_size != (32 * 1024) ) || + ( cache_ptr->index_len != 0 ) || + ( cache_ptr->index_size != 0 ) || + ( cache_ptr->cache_accesses != 0 ) ) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache config (5).\n"; + } + } + + /* repeat the above basic test, only this time, use inserts to add + * entries to the cache, not protects. + */ + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* insert a huge entry into the cache */ + if ( pass ) { + + insert_entry(file_ptr, HUGE_ENTRY_TYPE, 1, TRUE, + H5C__NO_FLAGS_SET); + /* protect and unprotect a couple times to increment cache_accesses */ + protect_entry(file_ptr, HUGE_ENTRY_TYPE, 1); + unprotect_entry(file_ptr, HUGE_ENTRY_TYPE, 1, + NO_CHANGE, H5C__NO_FLAGS_SET); + protect_entry(file_ptr, HUGE_ENTRY_TYPE, 1); + unprotect_entry(file_ptr, HUGE_ENTRY_TYPE, 1, + NO_CHANGE, H5C__NO_FLAGS_SET); + + if ( ( pass ) && + ( ( ( cache_ptr->max_cache_size != (64 * 1024) ) || + ( cache_ptr->min_clean_size != (32 * 1024) ) || + ( cache_ptr->index_len != 1 ) || + ( cache_ptr->index_size != HUGE_ENTRY_SIZE ) || + ( cache_ptr->cache_accesses != 2 ) ) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache config (6).\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* Now insert a monster entry. Since a monster entry is larger than + * half the size of the cache, and there is not sufficient space + * for a monster entry in the cache, we will add space to the + * cache to make room for the entry. + */ + if ( pass ) { + + insert_entry(file_ptr, MONSTER_ENTRY_TYPE, 4, TRUE, + H5C__NO_FLAGS_SET); + + if ( ( pass ) && + ( ( ( cache_ptr->max_cache_size != (80 * 1024) ) || + ( cache_ptr->min_clean_size != (40 * 1024) ) || + ( cache_ptr->index_len != 2 ) || + ( cache_ptr->index_size != + HUGE_ENTRY_SIZE + MONSTER_ENTRY_SIZE ) || + ( cache_ptr->cache_accesses != 0 ) ) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache config (7).\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* Insert a second monster entry. Cache size should increase again. + */ + if ( pass ) { + + insert_entry(file_ptr, MONSTER_ENTRY_TYPE, 5, TRUE, + H5C__NO_FLAGS_SET); + + if ( ( pass ) && + ( ( ( cache_ptr->max_cache_size != (144 * 1024) ) || + ( cache_ptr->min_clean_size != ( 72 * 1024) ) || + ( cache_ptr->index_len != 3 ) || + ( cache_ptr->index_size != + 2 * MONSTER_ENTRY_SIZE + HUGE_ENTRY_SIZE ) || + ( cache_ptr->cache_accesses != 0 ) ) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache config (8).\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* Insert a third monster entry. Should be no cache size increase this + * time. + */ + if ( pass ) { + + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 6); + + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 6, + NO_CHANGE, H5C__NO_FLAGS_SET); + + if ( ( pass ) && + ( ( ( cache_ptr->max_cache_size != (144 * 1024) ) || + ( cache_ptr->min_clean_size != ( 72 * 1024) ) || + ( cache_ptr->index_len != 2 ) || + ( cache_ptr->index_size != (2 * MONSTER_ENTRY_SIZE) ) || + ( cache_ptr->cache_accesses != 1 ) ) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache config (9).\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* delete existing entries to prepare for next test, and reset + * the size of the cache. We must also change the size of the needed + * variable entries before we run the test, so will protect and + * unprotect them now so as to get the correct initial size. + */ + if ( pass ) { + + expunge_entry(file_ptr, MONSTER_ENTRY_TYPE, 5); + expunge_entry(file_ptr, MONSTER_ENTRY_TYPE, 6); + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10); + unprotect_entry_with_size_change(file_ptr, VARIABLE_ENTRY_TYPE, 10, + H5C__DIRTIED_FLAG|H5C__SIZE_CHANGED_FLAG, 1024); + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 11); + unprotect_entry_with_size_change(file_ptr, VARIABLE_ENTRY_TYPE, 11, + H5C__DIRTIED_FLAG|H5C__SIZE_CHANGED_FLAG, 1024); + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 12); + unprotect_entry_with_size_change(file_ptr, VARIABLE_ENTRY_TYPE, 12, + H5C__DIRTIED_FLAG|H5C__SIZE_CHANGED_FLAG, 1024); + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 13); + unprotect_entry_with_size_change(file_ptr, VARIABLE_ENTRY_TYPE, 13, + H5C__DIRTIED_FLAG|H5C__SIZE_CHANGED_FLAG, 1024); + + flush_cache(file_ptr, TRUE, FALSE, FALSE); + + + if ( pass ) { + + auto_size_ctl.initial_size = 6 * 1024; + result = H5C_set_cache_auto_resize_config(cache_ptr, + &auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 13.\n"; + } + } + + if ( ( pass ) && + ( ( ( cache_ptr->max_cache_size != (6 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024) ) || + ( cache_ptr->index_len != 0 ) || + ( cache_ptr->index_size != 0 ) || + ( cache_ptr->cache_accesses != 0 ) ) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache config (10).\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* Now load the variable entries into the cache */ + if ( pass ) { + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10); + unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10, NO_CHANGE, + H5C__NO_FLAGS_SET); + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 11); + unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 11, NO_CHANGE, + H5C__NO_FLAGS_SET); + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 12); + unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 12, NO_CHANGE, + H5C__NO_FLAGS_SET); + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 13); + unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 13, NO_CHANGE, + H5C__NO_FLAGS_SET); + + if ( ( pass ) && + ( ( ( cache_ptr->max_cache_size != (6 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024) ) || + ( cache_ptr->index_len != 4 ) || + ( cache_ptr->index_size != 4 * 1024 ) || + ( cache_ptr->cache_accesses != 4 ) ) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache config (11).\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* protect a variable entry, and re-size it to 3K. Should be + * no effect on the size of the cache. + */ + if ( pass ) { + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10); + unprotect_entry_with_size_change(file_ptr, VARIABLE_ENTRY_TYPE, 10, + H5C__DIRTIED_FLAG|H5C__SIZE_CHANGED_FLAG, 3 * 1024); + + + if ( ( pass ) && + ( ( ( cache_ptr->max_cache_size != (6 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024) ) || + ( cache_ptr->index_len != 4 ) || + ( cache_ptr->index_size != 6 * 1024 ) || + ( cache_ptr->cache_accesses != 5 ) ) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache config (12).\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* protect the variable entry again, and re-size it to 10K. Should + * resize the cache to 13 KB. Note that cache_accesses will be 0 + * in this case, since cache_accesses is incremented on the protect. + */ + if ( pass ) { + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10); + unprotect_entry_with_size_change(file_ptr, VARIABLE_ENTRY_TYPE, 10, + H5C__DIRTIED_FLAG|H5C__SIZE_CHANGED_FLAG, 10 * 1024); + + + if ( ( pass ) && + ( ( ( cache_ptr->max_cache_size != (13 * 1024) ) || + ( cache_ptr->min_clean_size != (13 * 512) ) || + ( cache_ptr->index_len != 4 ) || + ( cache_ptr->index_size != 13 * 1024 ) || + ( cache_ptr->cache_accesses != 0 ) ) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache config (13).\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* protect a second variable entry, and re-size it to 10K. Should + * resize to 22 KB. + */ + if ( pass ) { + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 11); + unprotect_entry_with_size_change(file_ptr, VARIABLE_ENTRY_TYPE, 11, + H5C__DIRTIED_FLAG|H5C__SIZE_CHANGED_FLAG, 10 * 1024); + + + if ( ( pass ) && + ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) || + ( cache_ptr->min_clean_size != (11 * 1024) ) || + ( cache_ptr->index_len != 4 ) || + ( cache_ptr->index_size != 22 * 1024 ) || + ( cache_ptr->cache_accesses != 0 ) ) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache config (14).\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* protect a third variable entry, and re-size it to 10K. Should + * be no change in cache size. + */ + if ( pass ) { + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 12); + unprotect_entry_with_size_change(file_ptr, VARIABLE_ENTRY_TYPE, 12, + H5C__DIRTIED_FLAG|H5C__SIZE_CHANGED_FLAG, 10 * 1024); + + + if ( ( pass ) && + ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) || + ( cache_ptr->min_clean_size != (11 * 1024) ) || + ( cache_ptr->index_len != 4 ) || + ( cache_ptr->index_size != 31 * 1024 ) || + ( cache_ptr->cache_accesses != 1 ) ) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache config (15).\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* re-size the variable entries back down to their initial size, and + * restore the cache to its initial size as well, in preparation + * for the next test. + */ + if ( pass ) { + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10); + unprotect_entry_with_size_change(file_ptr, VARIABLE_ENTRY_TYPE, 10, + H5C__DIRTIED_FLAG|H5C__SIZE_CHANGED_FLAG, 1 * 1024); + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 11); + unprotect_entry_with_size_change(file_ptr, VARIABLE_ENTRY_TYPE, 11, + H5C__DIRTIED_FLAG|H5C__SIZE_CHANGED_FLAG, 1 * 1024); + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 12); + unprotect_entry_with_size_change(file_ptr, VARIABLE_ENTRY_TYPE, 12, + H5C__DIRTIED_FLAG|H5C__SIZE_CHANGED_FLAG, 1 * 1024); + + if ( pass ) { + + auto_size_ctl.initial_size = 6 * 1024; + result = H5C_set_cache_auto_resize_config(cache_ptr, + &auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 14.\n"; + } + } + + if ( ( pass ) && + ( ( ( cache_ptr->max_cache_size != (6 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024) ) || + ( cache_ptr->index_len != 4 ) || + ( cache_ptr->index_size != 4 * 1024 ) || + ( cache_ptr->cache_accesses != 0 ) ) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache config (16).\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* Now test flash cache resizes with pinned entries... + */ + if ( pass ) { + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10); + unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10, NO_CHANGE, + H5C__PIN_ENTRY_FLAG); + resize_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10, 2 * 1024, TRUE); + + if ( ( pass ) && + ( ( ( cache_ptr->max_cache_size != (6 * 1024) ) || + ( cache_ptr->min_clean_size != (6 * 512) ) || + ( cache_ptr->index_len != 4 ) || + ( cache_ptr->index_size != 5 * 1024 ) || + ( cache_ptr->cache_accesses != 1 ) ) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache config (17).\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass ) { + + resize_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10, 10 * 1024, TRUE); + + if ( ( pass ) && + ( ( ( cache_ptr->max_cache_size != (13 * 1024) ) || + ( cache_ptr->min_clean_size != (13 * 512) ) || + ( cache_ptr->index_len != 4 ) || + ( cache_ptr->index_size != 13 * 1024 ) || + ( cache_ptr->cache_accesses != 0 ) ) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache config (18).\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass ) { + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 11); + unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 11, NO_CHANGE, + H5C__PIN_ENTRY_FLAG); + resize_entry(file_ptr, VARIABLE_ENTRY_TYPE, 11, 10 * 1024, TRUE); + + if ( ( pass ) && + ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) || + ( cache_ptr->min_clean_size != (11 * 1024) ) || + ( cache_ptr->index_len != 4 ) || + ( cache_ptr->index_size != 22 * 1024 ) || + ( cache_ptr->cache_accesses != 0 ) ) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache config (19).\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass ) { + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 12); + unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 12, NO_CHANGE, + H5C__PIN_ENTRY_FLAG); + resize_entry(file_ptr, VARIABLE_ENTRY_TYPE, 12, 10 * 1024, TRUE); + + if ( ( pass ) && + ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) || + ( cache_ptr->min_clean_size != (11 * 1024) ) || + ( cache_ptr->index_len != 4 ) || + ( cache_ptr->index_size != 31 * 1024 ) || + ( cache_ptr->cache_accesses != 1 ) ) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache config (20).\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* Unpin the entries. Note that no entries are evicted as we don't + * load any entries. + */ + if ( pass ) { + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10); + unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10, NO_CHANGE, + H5C__UNPIN_ENTRY_FLAG); + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 11); + unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 11, NO_CHANGE, + H5C__UNPIN_ENTRY_FLAG); + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 12); + unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 12, NO_CHANGE, + H5C__UNPIN_ENTRY_FLAG); + + if ( ( pass ) && + ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) || + ( cache_ptr->min_clean_size != (11 * 1024) ) || + ( cache_ptr->index_len != 4 ) || + ( cache_ptr->index_size != 31 * 1024 ) || + ( cache_ptr->cache_accesses != 4 ) ) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache config (21).\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* re-size the variable entries back down to their initial size, and + * restore the cache to its initial size as well, in preparation + * for the next test. + */ + if ( pass ) { + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10); + unprotect_entry_with_size_change(file_ptr, VARIABLE_ENTRY_TYPE, 10, + H5C__DIRTIED_FLAG|H5C__SIZE_CHANGED_FLAG, 1 * 1024); + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 11); + unprotect_entry_with_size_change(file_ptr, VARIABLE_ENTRY_TYPE, 11, + H5C__DIRTIED_FLAG|H5C__SIZE_CHANGED_FLAG, 1 * 1024); + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 12); + unprotect_entry_with_size_change(file_ptr, VARIABLE_ENTRY_TYPE, 12, + H5C__DIRTIED_FLAG|H5C__SIZE_CHANGED_FLAG, 1 * 1024); + + if ( pass ) { + + auto_size_ctl.initial_size = 6 * 1024; + result = H5C_set_cache_auto_resize_config(cache_ptr, + &auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 15.\n"; + } + } + + if ( ( pass ) && + ( ( ( cache_ptr->max_cache_size != (6 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024) ) || + ( cache_ptr->index_len != 4 ) || + ( cache_ptr->index_size != 4 * 1024 ) || + ( cache_ptr->cache_accesses != 0 ) ) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache config (22).\n"; + } + } + + if ( pass ) { + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10); + unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10, NO_CHANGE, + H5C__PIN_ENTRY_FLAG); + resize_pinned_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10, 2 * 1024); + + if ( ( pass ) && + ( ( ( cache_ptr->max_cache_size != (6 * 1024) ) || + ( cache_ptr->min_clean_size != (6 * 512) ) || + ( cache_ptr->index_len != 4 ) || + ( cache_ptr->index_size != 5 * 1024 ) || + ( cache_ptr->cache_accesses != 1 ) ) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache config (23).\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass ) { + + resize_pinned_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10, 10 * 1024); + + if ( ( pass ) && + ( ( ( cache_ptr->max_cache_size != (13 * 1024) ) || + ( cache_ptr->min_clean_size != (13 * 512) ) || + ( cache_ptr->index_len != 4 ) || + ( cache_ptr->index_size != 13 * 1024 ) || + ( cache_ptr->cache_accesses != 0 ) ) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache config (24).\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass ) { + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 11); + unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 11, NO_CHANGE, + H5C__PIN_ENTRY_FLAG); + resize_pinned_entry(file_ptr, VARIABLE_ENTRY_TYPE, 11, 10 * 1024); + + if ( ( pass ) && + ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) || + ( cache_ptr->min_clean_size != (11 * 1024) ) || + ( cache_ptr->index_len != 4 ) || + ( cache_ptr->index_size != 22 * 1024 ) || + ( cache_ptr->cache_accesses != 0 ) ) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache config (25).\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass ) { + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 12); + unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 12, NO_CHANGE, + H5C__PIN_ENTRY_FLAG); + resize_pinned_entry(file_ptr, VARIABLE_ENTRY_TYPE, 12, 10 * 1024); + + if ( ( pass ) && + ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) || + ( cache_ptr->min_clean_size != (11 * 1024) ) || + ( cache_ptr->index_len != 4 ) || + ( cache_ptr->index_size != 31 * 1024 ) || + ( cache_ptr->cache_accesses != 1 ) ) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache config (26).\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* Unpin the entries. Note that no entries are evicted as we don't + * load any entries. + */ + if ( pass ) { + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10); + unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10, NO_CHANGE, + H5C__UNPIN_ENTRY_FLAG); + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 11); + unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 11, NO_CHANGE, + H5C__UNPIN_ENTRY_FLAG); + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 12); + unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 12, NO_CHANGE, + H5C__UNPIN_ENTRY_FLAG); + + if ( ( pass ) && + ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) || + ( cache_ptr->min_clean_size != (11 * 1024) ) || + ( cache_ptr->index_len != 4 ) || + ( cache_ptr->index_size != 31 * 1024 ) || + ( cache_ptr->cache_accesses != 4 ) ) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache config (27).\n"; + } + } + + /* We have finished a basic check of the flash cache size increment + * code. Tidy up for a more extensive test... + */ + if ( pass ) { + + expunge_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10); + expunge_entry(file_ptr, VARIABLE_ENTRY_TYPE, 11); + expunge_entry(file_ptr, VARIABLE_ENTRY_TYPE, 12); + expunge_entry(file_ptr, VARIABLE_ENTRY_TYPE, 13); + + if ( ( pass ) && + ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) || + ( cache_ptr->min_clean_size != (11 * 1024) ) || + ( cache_ptr->index_len != 0 ) || + ( cache_ptr->index_size != 0 ) || + ( cache_ptr->cache_accesses != 4 ) ) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache config (28).\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* ...and then reconfigure. Note that we change the flash_multiple + * and flash_threshold just to make sure that such changed perform + * as expected. + */ + if ( pass ) { + + auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + auto_size_ctl.rpt_fcn = test_rpt_fcn; + + auto_size_ctl.set_initial_size = TRUE; + auto_size_ctl.initial_size = 4 * 1024; + + auto_size_ctl.min_clean_fraction = 0.5; + + auto_size_ctl.max_size = 20 * 1024; + auto_size_ctl.min_size = 4 * 1024; + + auto_size_ctl.epoch_length = 100; + + + auto_size_ctl.incr_mode = H5C_incr__threshold; + + auto_size_ctl.lower_hr_threshold = 0.75; + + auto_size_ctl.increment = 2.0; + + auto_size_ctl.apply_max_increment = TRUE; + auto_size_ctl.max_increment = (4 * 1024); + + auto_size_ctl.flash_incr_mode = H5C_flash_incr__add_space; + auto_size_ctl.flash_multiple = 2.0; + auto_size_ctl.flash_threshold = 0.4; + + + auto_size_ctl.decr_mode = H5C_decr__age_out_with_threshold; + + auto_size_ctl.upper_hr_threshold = 0.999; /* for ease of testing */ + + auto_size_ctl.decrement = 0.5; + + auto_size_ctl.apply_max_decrement = TRUE; + auto_size_ctl.max_decrement = (2 * 1024); + + auto_size_ctl.epochs_before_eviction = 1; /* for ease of testing */ + + auto_size_ctl.apply_empty_reserve = TRUE; + auto_size_ctl.empty_reserve = 0.5; /* for ease of testing */ + + result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 15.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (4 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 512) ) || + ( cache_ptr->index_len != 0 ) || + ( cache_ptr->index_size != 0 ) || + ( cache_ptr->cache_accesses != 0 ) ) { + + pass = FALSE; + failure_mssg = "bad cache after initialization 15.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* protect and unprotect a large entry -- no change in cache size since + * a large entry will just fill the available space in the cache. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + + protect_entry(file_ptr, LARGE_ENTRY_TYPE, 0); + unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, 0, NO_CHANGE, + H5C__NO_FLAGS_SET); + + if ( ( pass ) && + ( ( ( cache_ptr->max_cache_size != (4 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 512) ) || + ( cache_ptr->index_len != 1 ) || + ( cache_ptr->index_size != LARGE_ENTRY_SIZE ) || + ( cache_ptr->cache_accesses != 1 ) || + ( rpt_fcn_called == TRUE ) ) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache config (29).\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* protect and unprotect another a large entry -- should trigger a + * flash cache size increase to 12 KB (remember that flash_multiple is + * set to 2.0). + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + + protect_entry(file_ptr, LARGE_ENTRY_TYPE, 1); + unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, 1, NO_CHANGE, + H5C__NO_FLAGS_SET); + + if ( ( pass ) && + ( ( ( cache_ptr->max_cache_size != (12 * 1024) ) || + ( cache_ptr->min_clean_size != (12 * 512) ) || + ( cache_ptr->index_len != 2 ) || + ( cache_ptr->index_size != 2 * LARGE_ENTRY_SIZE ) || + ( cache_ptr->cache_accesses != 1 ) || + ( rpt_fcn_called != TRUE ) ) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache config (30).\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* protect and unprotect two more large entries -- shouldnt trigger a + * flash cache size increase. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + + protect_entry(file_ptr, LARGE_ENTRY_TYPE, 2); + unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, 2, NO_CHANGE, + H5C__NO_FLAGS_SET); + protect_entry(file_ptr, LARGE_ENTRY_TYPE, 3); + unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, 3, NO_CHANGE, + H5C__NO_FLAGS_SET); + + if ( ( pass ) && + ( ( ( cache_ptr->max_cache_size != (12 * 1024) ) || + ( cache_ptr->min_clean_size != (12 * 512) ) || + ( cache_ptr->index_len != 3 ) || + ( cache_ptr->index_size != 3 * LARGE_ENTRY_SIZE ) || + ( cache_ptr->cache_accesses != 3 ) || + ( rpt_fcn_called != FALSE ) ) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache config (31).\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* do many accesses of a single entry to talk the cache into reducing + * its size to the minimum. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, TINY_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, TINY_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( cache_ptr->max_cache_size != (4 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024) ) || + ( cache_ptr->index_size != (1 * TINY_ENTRY_SIZE) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache config (32).\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* Force another flash increase */ + if ( pass ) { + + rpt_fcn_called = FALSE; + + protect_entry(file_ptr, LARGE_ENTRY_TYPE, 0); + unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, 0, NO_CHANGE, + H5C__NO_FLAGS_SET); + + if ( ( pass ) && + ( ( ( cache_ptr->max_cache_size != (4 * 1024 + 128) ) || + ( cache_ptr->min_clean_size != (2 * 1024 + 64) ) || + ( cache_ptr->index_len != 2 ) || + ( cache_ptr->index_size != + LARGE_ENTRY_SIZE + TINY_ENTRY_SIZE ) || + ( cache_ptr->cache_accesses != 1 ) || + ( rpt_fcn_called == FALSE ) || + ( rpt_status != flash_increase ) ) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache config (33).\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force regular size increase up to maximum */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 500 ) ) + { + protect_entry(file_ptr, TINY_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, TINY_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( cache_ptr->max_cache_size != (20 * 1024) ) || + ( cache_ptr->min_clean_size != (10 * 1024) ) || + ( rpt_fcn_called == FALSE ) || + ( rpt_status != at_max_size ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache config (34).\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + + if ( pass ) { + + takedown_cache(file_ptr, FALSE, FALSE); + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + if ( core_file_driver_failed ) { + + HDfprintf(stdout, + "%s(): Unable to open test file with core file driver.\n", + fcn_name); + } + + return !pass; + +} /* check_auto_cache_resize() */ + + +/*------------------------------------------------------------------------- + * Function: check_auto_cache_resize_disable() + * + * Purpose: Test the various ways in which the resize code can + * be disabled. Unfortunately, there are quite a few of them. + * + * Return: void + * + * Programmer: John Mainzer + * 12/16/04 + * + * Modifications: + * + * Added code to include the flash cache size increment + * code in this test. + * JRM -- 1/10/08 + * + *------------------------------------------------------------------------- + */ + +static unsigned +check_auto_cache_resize_disable(void) +{ + const char * fcn_name = "check_auto_cache_resize_disable()"; + hbool_t show_progress = FALSE; + herr_t result; + int32_t i; + int32_t checkpoint = 0; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + H5C_auto_size_ctl_t auto_size_ctl = + { + /* int32_t version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* H5C_auto_resize_report_fcn rpt_fcn = */ test_rpt_fcn, + + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (512 * 1024), + + /* double min_clean_fraction = */ 0.5, + + /* size_t max_size = */ (14 * 1024 * 1024), + /* size_t min_size = */ (512 * 1024), + + /* int64_t epoch_length = */ 1000, + + + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + + /* double lower_hr_threshold = */ 0.75, + + /* double increment = */ 2.0, + + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + + + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__threshold, + + /* double upper_hr_threshold = */ 0.995, + + /* double decrement = */ 0.1, + + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + + /* int32_t epochs_before_eviction = */ 3, + + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.05 + }; + + TESTING("automatic cache resize disable"); + + core_file_driver_failed = FALSE; + + pass = TRUE; + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* allocate a cache, enable automatic cache resizing, and then force + * the cache through all its operational modes. Verify that all + * performs as expected. + */ + + if ( pass ) { + + reset_entries(); + + file_ptr = setup_cache((size_t)(2 * 1024), + (size_t)(1 * 1024)); + cache_ptr = file_ptr->shared->cache; + } + + if ( pass ) { + + result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 1.\n"; + } + } + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (512 * 1024) ) || + ( cache_ptr->min_clean_size != (256 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "bad cache size after initialization.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + + /****************************************************************** + * So far, we have forced the auto cache resize through all modes + * other than increase_disabled and decrease_disabled. Force these + * modes now. Note that there are several ways we can reach these + * modes. + ******************************************************************/ + + if ( pass ) { + + auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + auto_size_ctl.rpt_fcn = test_rpt_fcn; + + auto_size_ctl.set_initial_size = TRUE; + auto_size_ctl.initial_size = 4 * 1024 * 1024; + + auto_size_ctl.min_clean_fraction = 0.5; + + auto_size_ctl.max_size = 16 * 1024 * 1024; + auto_size_ctl.min_size = 1 * 1024 * 1024; + + auto_size_ctl.epoch_length = 1000; + + + auto_size_ctl.incr_mode = H5C_incr__threshold; + + auto_size_ctl.lower_hr_threshold = 0.75; + + auto_size_ctl.increment = 1.0; /* disable size increases */ + + auto_size_ctl.apply_max_increment = FALSE; + auto_size_ctl.max_increment = (4 * 1024 * 1024); + + auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + auto_size_ctl.flash_multiple = 2.0; + auto_size_ctl.flash_threshold = 0.5; + + + auto_size_ctl.decr_mode = H5C_decr__threshold; + + auto_size_ctl.upper_hr_threshold = 0.995; + + auto_size_ctl.decrement = 0.5; + + auto_size_ctl.apply_max_decrement = FALSE; + auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + auto_size_ctl.epochs_before_eviction = 3; + + auto_size_ctl.apply_empty_reserve = TRUE; + auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 2.\n"; + } + } + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "bad cache size after set resize re-config 1.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force low hit rate with cache full -- increase disabled so should + * be no change in cache size, and result should be increase_disabled. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( cache_ptr->size_increase_possible ) || + ( rpt_status != increase_disabled ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 1.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force high hit rate -- make sure that we haven't disabled decreases. + * should result in a decrease cache size from 4 to 2 Meg. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 2.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force low hit rate again -- increase disabled so should + * be no change in cache size, and result should be increase_disabled. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( cache_ptr->size_increase_possible ) || + ( rpt_status != increase_disabled ) || + ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 3.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* Repeat the above tests, disabling increase through the lower + * threshold instead of the increment. + */ + + if ( pass ) { + + auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + auto_size_ctl.rpt_fcn = test_rpt_fcn; + + auto_size_ctl.set_initial_size = TRUE; + auto_size_ctl.initial_size = 4 * 1024 * 1024; + + auto_size_ctl.min_clean_fraction = 0.5; + + auto_size_ctl.max_size = 16 * 1024 * 1024; + auto_size_ctl.min_size = 1 * 1024 * 1024; + + auto_size_ctl.epoch_length = 1000; + + + auto_size_ctl.incr_mode = H5C_incr__threshold; + + auto_size_ctl.lower_hr_threshold = 0.0; /* disable size increases */ + + auto_size_ctl.increment = 2.0; + + auto_size_ctl.apply_max_increment = FALSE; + auto_size_ctl.max_increment = (4 * 1024 * 1024); + + auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + auto_size_ctl.flash_multiple = 2.0; + auto_size_ctl.flash_threshold = 0.5; + + + auto_size_ctl.decr_mode = H5C_decr__threshold; + + auto_size_ctl.upper_hr_threshold = 0.995; + auto_size_ctl.decrement = 0.5; + + auto_size_ctl.apply_max_decrement = FALSE; + auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + auto_size_ctl.epochs_before_eviction = 3; + + auto_size_ctl.apply_empty_reserve = TRUE; + auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 3.\n"; + } + } + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "bad cache size after set resize re-config 2.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force low hit rate with cache full -- increase disabled so should + * be no change in cache size, and result should be in_spec. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( cache_ptr->size_increase_possible ) || + ( rpt_status != in_spec ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 4.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force high hit rate -- make sure that we haven't disabled decreases. + * should result in a decrease cache size from 4 to 2 Meg. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 5.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force low hit rate again -- increase disabled so should + * be no change in cache size, and result should be increase_disabled. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( cache_ptr->size_increase_possible ) || + ( rpt_status != in_spec ) || + ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 6.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* Repeat the above tests yet again, disabling increase through the + * incr_mode. + */ + + if ( pass ) { + + auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + auto_size_ctl.rpt_fcn = test_rpt_fcn; + + auto_size_ctl.set_initial_size = TRUE; + auto_size_ctl.initial_size = 4 * 1024 * 1024; + + auto_size_ctl.min_clean_fraction = 0.5; + + auto_size_ctl.max_size = 16 * 1024 * 1024; + auto_size_ctl.min_size = 1 * 1024 * 1024; + + auto_size_ctl.epoch_length = 1000; + + + auto_size_ctl.incr_mode = H5C_incr__off; + + auto_size_ctl.lower_hr_threshold = 0.75; + + auto_size_ctl.increment = 2.0; + + auto_size_ctl.apply_max_increment = FALSE; + auto_size_ctl.max_increment = (4 * 1024 * 1024); + + auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + auto_size_ctl.flash_multiple = 2.0; + auto_size_ctl.flash_threshold = 0.5; + + + auto_size_ctl.decr_mode = H5C_decr__threshold; + + auto_size_ctl.upper_hr_threshold = 0.995; + + auto_size_ctl.decrement = 0.5; + + auto_size_ctl.apply_max_decrement = FALSE; + auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + auto_size_ctl.epochs_before_eviction = 3; + + auto_size_ctl.apply_empty_reserve = TRUE; + auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 4.\n"; + } + } + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "bad cache size after set resize re-config 3.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force low hit rate with cache full -- increase disabled so should + * be no change in cache size, and result should be in_spec. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( cache_ptr->size_increase_possible ) || + ( rpt_status != in_spec ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 7.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force high hit rate -- make sure that we haven't disabled decreases. + * should result in a decrease cache size from 4 to 2 Meg. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 8.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force low hit rate again -- increase disabled so should + * be no change in cache size, and result should be increase_disabled. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( cache_ptr->size_increase_possible ) || + ( rpt_status != in_spec ) || + ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 9.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* Now, disable size decreases, and repeat the above tests. + */ + + if ( pass ) { + + auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + auto_size_ctl.rpt_fcn = test_rpt_fcn; + + auto_size_ctl.set_initial_size = TRUE; + auto_size_ctl.initial_size = 4 * 1024 * 1024; + + auto_size_ctl.min_clean_fraction = 0.5; + + auto_size_ctl.max_size = 16 * 1024 * 1024; + auto_size_ctl.min_size = 1 * 1024 * 1024; + + auto_size_ctl.epoch_length = 1000; + + + auto_size_ctl.incr_mode = H5C_incr__threshold; + + auto_size_ctl.lower_hr_threshold = 0.75; + + auto_size_ctl.increment = 2.0; + + auto_size_ctl.apply_max_increment = TRUE; + auto_size_ctl.max_increment = (2 * 1024 * 1024); + + auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + auto_size_ctl.flash_multiple = 2.0; + auto_size_ctl.flash_threshold = 0.5; + + + auto_size_ctl.decr_mode = H5C_decr__threshold; + + auto_size_ctl.upper_hr_threshold = 0.995; + + auto_size_ctl.decrement = 1.0; /* disable size decreases */ + + auto_size_ctl.apply_max_decrement = TRUE; + auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + auto_size_ctl.epochs_before_eviction = 3; + + auto_size_ctl.apply_empty_reserve = TRUE; + auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 5.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "bad cache size after set resize re-config 4.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force high hit rate -- should be no change in cache size, + * and result should be decrease_disabled. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease_disabled ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 10.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force low hit rate -- cache size should increase from 4 to 6 Meg. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != increase ) || + ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 11.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force high hit rate again -- should be no change in cache size, + * and result should be decrease_disabled. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease_disabled ) || + ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 12.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* Repeat the above tests, disabling decrease through the upper + * threshold instead of the decrement. + */ + + if ( pass ) { + + auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + auto_size_ctl.rpt_fcn = test_rpt_fcn; + + auto_size_ctl.set_initial_size = TRUE; + auto_size_ctl.initial_size = 4 * 1024 * 1024; + + auto_size_ctl.min_clean_fraction = 0.5; + + auto_size_ctl.max_size = 16 * 1024 * 1024; + auto_size_ctl.min_size = 1 * 1024 * 1024; + + auto_size_ctl.epoch_length = 1000; + + + auto_size_ctl.incr_mode = H5C_incr__threshold; + + auto_size_ctl.lower_hr_threshold = 0.75; + + auto_size_ctl.increment = 2.0; + + auto_size_ctl.apply_max_increment = TRUE; + auto_size_ctl.max_increment = (2 * 1024 * 1024); + + auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + auto_size_ctl.flash_multiple = 2.0; + auto_size_ctl.flash_threshold = 0.5; + + + auto_size_ctl.decr_mode = H5C_decr__threshold; + + auto_size_ctl.upper_hr_threshold = 1.0; /* disable size decreases */ + + auto_size_ctl.decrement = 0.5; + + auto_size_ctl.apply_max_decrement = TRUE; + auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + auto_size_ctl.epochs_before_eviction = 3; + + auto_size_ctl.apply_empty_reserve = TRUE; + auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 6.\n"; + } + } + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "bad cache size after set resize re-config 5.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force high hit rate -- should be no change in cache size, + * and result should be in_spec. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( cache_ptr->size_decrease_possible ) || + ( rpt_status != in_spec ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 13.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force low hit rate -- cache size should increase from 4 to 6 Meg. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != increase ) || + ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 14.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force high hit rate again -- should be no change in cache size, + * and result should be in_spec. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( cache_ptr->size_decrease_possible ) || + ( rpt_status != in_spec ) || + ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 15.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* Repeat the above tests, disabling decrease through the decr_mode. + */ + + if ( pass ) { + + auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + auto_size_ctl.rpt_fcn = test_rpt_fcn; + + auto_size_ctl.set_initial_size = TRUE; + auto_size_ctl.initial_size = 4 * 1024 * 1024; + + auto_size_ctl.min_clean_fraction = 0.5; + + auto_size_ctl.max_size = 16 * 1024 * 1024; + auto_size_ctl.min_size = 1 * 1024 * 1024; + + auto_size_ctl.epoch_length = 1000; + + + auto_size_ctl.incr_mode = H5C_incr__threshold; + + auto_size_ctl.lower_hr_threshold = 0.75; + + auto_size_ctl.increment = 2.0; + + auto_size_ctl.apply_max_increment = TRUE; + auto_size_ctl.max_increment = (2 * 1024 * 1024); + + auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + auto_size_ctl.flash_multiple = 2.0; + auto_size_ctl.flash_threshold = 0.5; + + + auto_size_ctl.decr_mode = H5C_decr__off; + + auto_size_ctl.upper_hr_threshold = 0.995; + + auto_size_ctl.decrement = 0.5; + + auto_size_ctl.apply_max_decrement = TRUE; + auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + auto_size_ctl.epochs_before_eviction = 3; + + auto_size_ctl.apply_empty_reserve = TRUE; + auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 7.\n"; + } + } + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "bad cache size after set resize re-config 6.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force high hit rate -- should be no change in cache size, + * and result should be in_spec. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( cache_ptr->size_decrease_possible ) || + ( rpt_status != in_spec ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 16.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force low hit rate -- cache size should increase from 4 to 6 Meg. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != increase ) || + ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 17.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force high hit rate again -- should be no change in cache size, + * and result should be in_spec. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( cache_ptr->size_decrease_possible ) || + ( rpt_status != in_spec ) || + ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 18.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* Now do tests disabling size decrement in age out mode. + * + * Start by disabling size decrement by setting max_decrement to zero. + */ + + if ( pass ) { + + auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + auto_size_ctl.rpt_fcn = test_rpt_fcn; + + auto_size_ctl.set_initial_size = TRUE; + auto_size_ctl.initial_size = 4 * 1024 * 1024; + + auto_size_ctl.min_clean_fraction = 0.5; + + auto_size_ctl.max_size = 16 * 1024 * 1024; + auto_size_ctl.min_size = 1 * 1024 * 1024; + + auto_size_ctl.epoch_length = 1000; + + + auto_size_ctl.incr_mode = H5C_incr__threshold; + + auto_size_ctl.lower_hr_threshold = 0.75; + + auto_size_ctl.increment = 2.0; + + auto_size_ctl.apply_max_increment = TRUE; + auto_size_ctl.max_increment = (2 * 1024 * 1024); + + auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + auto_size_ctl.flash_multiple = 2.0; + auto_size_ctl.flash_threshold = 0.5; + + + auto_size_ctl.decr_mode = H5C_decr__age_out; + + auto_size_ctl.upper_hr_threshold = 0.995; + + auto_size_ctl.decrement = 0.5; + + auto_size_ctl.apply_max_decrement = TRUE; + auto_size_ctl.max_decrement = 0; /* disable decrement */ + + auto_size_ctl.epochs_before_eviction = 1; + + auto_size_ctl.apply_empty_reserve = TRUE; + auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 8.\n"; + } + } + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "bad cache size after set resize re-config 7.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* flush the cache and destroy all entries so we start from a known point */ + flush_cache(file_ptr, TRUE, FALSE, FALSE); + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* load up the cache with small entries. Note that it will take an + * epoch for the ageout code to initialize itself if it is enabled. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, SMALL_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, SMALL_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( cache_ptr->size_decrease_possible ) || + ( rpt_status != not_full ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 19.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* Load up some more small entries. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 1000; + while ( ( pass ) && ( i < 2000 ) ) + { + protect_entry(file_ptr, SMALL_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, SMALL_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( cache_ptr->size_decrease_possible ) || + ( rpt_status != not_full ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 20.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* Now force a high hit rate so that the size increase code is + * is satisfied. We would see a decrease here if decrease were + * possible. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, SMALL_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, SMALL_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( cache_ptr->size_decrease_possible ) || + ( rpt_status != decrease_disabled ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 21.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force low hit rate -- cache size should increase from 4 to 6 Meg. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != increase ) || + ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 22.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* just bang on a single entry. This will see to it that there are + * many entries that could be aged out were decreases enabled. + * Should be no change in cache size, and result should be + * decrease_disabled. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( cache_ptr->size_decrease_possible ) || + ( rpt_status != decrease_disabled ) || + ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 23.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* Now disable size decrement in age out mode via the empty reserve. + */ + + if ( pass ) { + + auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + auto_size_ctl.rpt_fcn = test_rpt_fcn; + + auto_size_ctl.set_initial_size = TRUE; + auto_size_ctl.initial_size = 4 * 1024 * 1024; + + auto_size_ctl.min_clean_fraction = 0.5; + + auto_size_ctl.max_size = 16 * 1024 * 1024; + auto_size_ctl.min_size = 1 * 1024 * 1024; + + auto_size_ctl.epoch_length = 1000; + + + auto_size_ctl.incr_mode = H5C_incr__threshold; + + auto_size_ctl.lower_hr_threshold = 0.75; + + auto_size_ctl.increment = 2.0; + + auto_size_ctl.apply_max_increment = TRUE; + auto_size_ctl.max_increment = (2 * 1024 * 1024); + + auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + auto_size_ctl.flash_multiple = 2.0; + auto_size_ctl.flash_threshold = 0.5; + + + auto_size_ctl.decr_mode = H5C_decr__age_out; + + auto_size_ctl.upper_hr_threshold = 0.995; + + auto_size_ctl.decrement = 0.5; + + auto_size_ctl.apply_max_decrement = TRUE; + auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + auto_size_ctl.epochs_before_eviction = 1; + + auto_size_ctl.apply_empty_reserve = TRUE; + auto_size_ctl.empty_reserve = 1.0; /* disable decrement */ + + result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 9.\n"; + } + } + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "bad cache size after set resize re-config 8.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* flush the cache and destroy all entries so we start from a known point */ + flush_cache(file_ptr, TRUE, FALSE, FALSE); + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* load up the cache with small entries. Note that it will take an + * epoch for the ageout code to initialize itself if it is enabled. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, SMALL_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, SMALL_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( cache_ptr->size_decrease_possible ) || + ( rpt_status != not_full ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 24.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* Load up some more small entries. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 1000; + while ( ( pass ) && ( i < 2000 ) ) + { + protect_entry(file_ptr, SMALL_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, SMALL_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( cache_ptr->size_decrease_possible ) || + ( rpt_status != not_full ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 25.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* Now force a high hit rate so that the size increase code is + * is satisfied. We would see a decrease here if decrease were + * possible. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, SMALL_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, SMALL_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( cache_ptr->size_decrease_possible ) || + ( rpt_status != decrease_disabled ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 26.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force low hit rate -- cache size should increase from 4 to 6 Meg. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != increase ) || + ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 27.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* just bang on a single entry. This will see to it that there are + * many entries that could be aged out were decreases enabled. + * Should be no change in cache size, and result should be + * decrease_disabled. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( cache_ptr->size_decrease_possible ) || + ( rpt_status != decrease_disabled ) || + ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 28.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* Now work with age out with threshold. One can argue that we should + * repeat the above age out tests with age out with threshold, but the + * same code is executed in both cases so I don't see the point. If + * that ever changes, this test should be updated. + * + * There is only one way of disabling decrements that is peculiar + * to age out with threshold, which is to set the upper threshold + * to 1.0. Test this now. + */ + + if ( pass ) { + + auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + auto_size_ctl.rpt_fcn = test_rpt_fcn; + + auto_size_ctl.set_initial_size = TRUE; + auto_size_ctl.initial_size = 4 * 1024 * 1024; + + auto_size_ctl.min_clean_fraction = 0.5; + + auto_size_ctl.max_size = 16 * 1024 * 1024; + auto_size_ctl.min_size = 1 * 1024 * 1024; + + auto_size_ctl.epoch_length = 1000; + + + auto_size_ctl.incr_mode = H5C_incr__threshold; + + auto_size_ctl.lower_hr_threshold = 0.75; + + auto_size_ctl.increment = 2.0; + + auto_size_ctl.apply_max_increment = TRUE; + auto_size_ctl.max_increment = (2 * 1024 * 1024); + + auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + auto_size_ctl.flash_multiple = 2.0; + auto_size_ctl.flash_threshold = 0.5; + + + auto_size_ctl.decr_mode = H5C_decr__age_out_with_threshold; + + auto_size_ctl.upper_hr_threshold = 1.0; + + auto_size_ctl.decrement = 0.5; + + auto_size_ctl.apply_max_decrement = TRUE; + auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + auto_size_ctl.epochs_before_eviction = 1; + + auto_size_ctl.apply_empty_reserve = TRUE; + auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 10.\n"; + } + } + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "bad cache size after set resize re-config 9.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* flush the cache and destroy all entries so we start from a known point */ + flush_cache(file_ptr, TRUE, FALSE, FALSE); + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* load up the cache with small entries. Note that it will take an + * epoch for the ageout code to initialize itself if it is enabled. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, SMALL_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, SMALL_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( cache_ptr->size_decrease_possible ) || + ( rpt_status != not_full ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 29.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* Load up some more small entries. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 1000; + while ( ( pass ) && ( i < 2000 ) ) + { + protect_entry(file_ptr, SMALL_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, SMALL_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( cache_ptr->size_decrease_possible ) || + ( rpt_status != not_full ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 30.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* Now force a high hit rate so that the size increase code is + * is satisfied. We would see a decrease here if decrease were + * possible, but the upper threshold cannot be met, so no decrease. + * + * rpt_status should be decrease_disabled. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, SMALL_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, SMALL_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( cache_ptr->size_decrease_possible ) || + ( rpt_status != decrease_disabled ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) || + ( cache_ptr->index_len != 2000 ) || + ( cache_ptr->index_size != 2000 * SMALL_ENTRY_SIZE ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 31.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force low hit rate -- cache size should increase from 4 to 6 Meg. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != increase ) || + ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 32.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* just bang on a single entry. This keeps the hit rate high, and sees + * to it that there are many entries that could be aged out were + * decreases enabled. + * + * Should be no change in cache size, and result should be + * decrease_disabled. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 999); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 999, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( cache_ptr->size_decrease_possible ) || + ( rpt_status != decrease_disabled ) || + ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 33.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + + /********************************************************************* + * Finally, use the auto cache resize code to set the size of the + * cache and keep it there. Again, due to the complexity of the + * interface, there are lots of ways of doing this. We have to + * check them all. + *********************************************************************/ + + if ( pass ) { + + auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + auto_size_ctl.rpt_fcn = test_rpt_fcn; + + auto_size_ctl.set_initial_size = TRUE; + auto_size_ctl.initial_size = 2 * 1024 * 1024; + + auto_size_ctl.min_clean_fraction = 0.5; + + auto_size_ctl.max_size = 16 * 1024 * 1024; + auto_size_ctl.min_size = 1 * 1024 * 1024; + + auto_size_ctl.epoch_length = 1000; + + + auto_size_ctl.incr_mode = H5C_incr__threshold; + + auto_size_ctl.lower_hr_threshold = 0.0; /* disable size increases */ + + auto_size_ctl.increment = 2.0; + + auto_size_ctl.apply_max_increment = TRUE; + auto_size_ctl.max_increment = (2 * 1024 * 1024); + + auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + auto_size_ctl.flash_multiple = 2.0; + auto_size_ctl.flash_threshold = 0.5; + + + auto_size_ctl.decr_mode = H5C_decr__threshold; + + auto_size_ctl.upper_hr_threshold = 1.0; /* disable size decreases */ + + auto_size_ctl.decrement = 0.5; + + auto_size_ctl.apply_max_decrement = TRUE; + auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + auto_size_ctl.epochs_before_eviction = 3; + + auto_size_ctl.apply_empty_reserve = TRUE; + auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 11.\n"; + } + } + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "bad cache size after set resize re-config 10.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force low hit rate -- should be no response as the auto-resize + * code should be disabled. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( rpt_fcn_called ) || + ( cache_ptr->resize_enabled ) || + ( cache_ptr->size_increase_possible ) || + ( cache_ptr->size_decrease_possible ) || + ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 34.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force high hit rate -- should be no response as the auto-resize + * code should be disabled. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( rpt_fcn_called ) || + ( cache_ptr->resize_enabled ) || + ( cache_ptr->size_increase_possible ) || + ( cache_ptr->size_decrease_possible ) || + ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 35.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass ) { + + auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + auto_size_ctl.rpt_fcn = test_rpt_fcn; + + auto_size_ctl.set_initial_size = TRUE; + auto_size_ctl.initial_size = 4 * 1024 * 1024; + + auto_size_ctl.min_clean_fraction = 0.25; + + auto_size_ctl.max_size = 16 * 1024 * 1024; + auto_size_ctl.min_size = 1 * 1024 * 1024; + + auto_size_ctl.epoch_length = 1000; + + + auto_size_ctl.incr_mode = H5C_incr__threshold; + + auto_size_ctl.lower_hr_threshold = 0.75; + + auto_size_ctl.increment = 1.0; /* disable size increment */ + + auto_size_ctl.apply_max_increment = TRUE; + auto_size_ctl.max_increment = (2 * 1024 * 1024); + + auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + auto_size_ctl.flash_multiple = 2.0; + auto_size_ctl.flash_threshold = 0.5; + + + auto_size_ctl.decr_mode = H5C_decr__threshold; + + auto_size_ctl.upper_hr_threshold = 0.995; + + auto_size_ctl.decrement = 1.0; /* disable size decrement */ + + auto_size_ctl.apply_max_decrement = TRUE; + auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + auto_size_ctl.epochs_before_eviction = 3; + + auto_size_ctl.apply_empty_reserve = TRUE; + auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 12.\n"; + } + } + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "bad cache size after set resize re-config 11.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force low hit rate -- should be no response as the auto-resize + * code should be disabled. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( rpt_fcn_called ) || + ( cache_ptr->resize_enabled ) || + ( cache_ptr->size_increase_possible ) || + ( cache_ptr->size_decrease_possible ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 36.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force high hit rate -- should be no response as the auto-resize + * code should be disabled. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( rpt_fcn_called ) || + ( cache_ptr->resize_enabled ) || + ( cache_ptr->size_increase_possible ) || + ( cache_ptr->size_decrease_possible ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 37.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass ) { + + auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + auto_size_ctl.rpt_fcn = test_rpt_fcn; + + auto_size_ctl.set_initial_size = FALSE; + auto_size_ctl.initial_size = 2 * 1024 * 1024; + + auto_size_ctl.min_clean_fraction = 0.5; + + auto_size_ctl.max_size = 6 * 1024 * 1024; /* no resize */ + auto_size_ctl.min_size = 6 * 1024 * 1024; /* no resize */ + + auto_size_ctl.epoch_length = 1000; + + + auto_size_ctl.incr_mode = H5C_incr__threshold; + + auto_size_ctl.lower_hr_threshold = 0.75; + + auto_size_ctl.increment = 2.0; + + auto_size_ctl.apply_max_increment = TRUE; + auto_size_ctl.max_increment = (2 * 1024 * 1024); + + auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + auto_size_ctl.flash_multiple = 2.0; + auto_size_ctl.flash_threshold = 0.5; + + + auto_size_ctl.decr_mode = H5C_decr__threshold; + + auto_size_ctl.upper_hr_threshold = 0.995; + + auto_size_ctl.decrement = 0.5; + + auto_size_ctl.apply_max_decrement = TRUE; + auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + auto_size_ctl.epochs_before_eviction = 3; + + auto_size_ctl.apply_empty_reserve = TRUE; + auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 13.\n"; + } + } + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "bad cache size after set resize re-config 12.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force low hit rate -- should be no response as the auto-resize + * code should be disabled. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( rpt_fcn_called ) || + ( cache_ptr->resize_enabled ) || + ( cache_ptr->size_increase_possible ) || + ( cache_ptr->size_decrease_possible ) || + ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 38.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force high hit rate -- should be no response as the auto-resize + * code should be disabled. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( rpt_fcn_called ) || + ( cache_ptr->resize_enabled ) || + ( cache_ptr->size_increase_possible ) || + ( cache_ptr->size_decrease_possible ) || + ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 39.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass ) { + + auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + auto_size_ctl.rpt_fcn = test_rpt_fcn; + + auto_size_ctl.set_initial_size = TRUE; + auto_size_ctl.initial_size = 4 * 1024 * 1024; + + auto_size_ctl.min_clean_fraction = 0.25; + + auto_size_ctl.max_size = 16 * 1024 * 1024; + auto_size_ctl.min_size = 1 * 1024 * 1024; + + auto_size_ctl.epoch_length = 1000; + + + auto_size_ctl.incr_mode = H5C_incr__threshold; + + auto_size_ctl.lower_hr_threshold = 0.75; + + auto_size_ctl.increment = 1.0; /* disable size increment */ + + auto_size_ctl.apply_max_increment = TRUE; + auto_size_ctl.max_increment = (2 * 1024 * 1024); + + auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + auto_size_ctl.flash_multiple = 2.0; + auto_size_ctl.flash_threshold = 0.5; + + + auto_size_ctl.decr_mode = H5C_decr__threshold; + + auto_size_ctl.upper_hr_threshold = 1.0; /* disable size decrement */ + + auto_size_ctl.decrement = 0.5; + + auto_size_ctl.apply_max_decrement = TRUE; + auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + auto_size_ctl.epochs_before_eviction = 3; + + auto_size_ctl.apply_empty_reserve = TRUE; + auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 14.\n"; + } + } + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "bad cache size after set resize re-config 13.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force low hit rate -- should be no response as the auto-resize + * code should be disabled. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( rpt_fcn_called ) || + ( cache_ptr->resize_enabled ) || + ( cache_ptr->size_increase_possible ) || + ( cache_ptr->size_decrease_possible ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 40.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force high hit rate -- should be no response as the auto-resize + * code should be disabled. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( rpt_fcn_called ) || + ( cache_ptr->resize_enabled ) || + ( cache_ptr->size_increase_possible ) || + ( cache_ptr->size_decrease_possible ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 41.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass ) { + + auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + auto_size_ctl.rpt_fcn = test_rpt_fcn; + + auto_size_ctl.set_initial_size = TRUE; + auto_size_ctl.initial_size = 4 * 1024 * 1024; + + auto_size_ctl.min_clean_fraction = 0.5; + + auto_size_ctl.max_size = 16 * 1024 * 1024; + auto_size_ctl.min_size = 1 * 1024 * 1024; + + auto_size_ctl.epoch_length = 1000; + + + auto_size_ctl.incr_mode = H5C_incr__threshold; + + auto_size_ctl.lower_hr_threshold = 0.0; /* disable size increment */ + + auto_size_ctl.increment = 2.0; + + auto_size_ctl.apply_max_increment = TRUE; + auto_size_ctl.max_increment = (2 * 1024 * 1024); + + auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + auto_size_ctl.flash_multiple = 2.0; + auto_size_ctl.flash_threshold = 0.5; + + + auto_size_ctl.decr_mode = H5C_decr__threshold; + + auto_size_ctl.upper_hr_threshold = 0.995; + + auto_size_ctl.decrement = 1.0; /* disable size decrement */ + + auto_size_ctl.apply_max_decrement = TRUE; + auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + auto_size_ctl.epochs_before_eviction = 3; + + auto_size_ctl.apply_empty_reserve = TRUE; + auto_size_ctl.empty_reserve = 0.05; + + + result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 15.\n"; + } + } + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "bad cache size after set resize re-config 14.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force low hit rate -- should be no response as the auto-resize + * code should be disabled. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( rpt_fcn_called ) || + ( cache_ptr->resize_enabled ) || + ( cache_ptr->size_increase_possible ) || + ( cache_ptr->size_decrease_possible ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 42.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force high hit rate -- should be no response as the auto-resize + * code should be disabled. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( rpt_fcn_called ) || + ( cache_ptr->resize_enabled ) || + ( cache_ptr->size_increase_possible ) || + ( cache_ptr->size_decrease_possible ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 43.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass ) { + + auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + auto_size_ctl.rpt_fcn = test_rpt_fcn; + + auto_size_ctl.set_initial_size = TRUE; + auto_size_ctl.initial_size = 4 * 1024 * 1024; + + auto_size_ctl.min_clean_fraction = 0.5; + + auto_size_ctl.max_size = 16 * 1024 * 1024; + auto_size_ctl.min_size = 1 * 1024 * 1024; + + auto_size_ctl.epoch_length = 1000; + + + auto_size_ctl.incr_mode = H5C_incr__off; + + auto_size_ctl.lower_hr_threshold = 0.75; + + auto_size_ctl.increment = 2.0; + + auto_size_ctl.apply_max_increment = TRUE; + auto_size_ctl.max_increment = (2 * 1024 * 1024); + + auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + auto_size_ctl.flash_multiple = 2.0; + auto_size_ctl.flash_threshold = 0.5; + + + auto_size_ctl.decr_mode = H5C_decr__off; + + auto_size_ctl.upper_hr_threshold = 0.995; + + auto_size_ctl.decrement = 0.5; + + auto_size_ctl.apply_max_decrement = TRUE; + auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + auto_size_ctl.epochs_before_eviction = 3; + + auto_size_ctl.apply_empty_reserve = TRUE; + auto_size_ctl.empty_reserve = 0.05; + + + result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 16.\n"; + } + } + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "bad cache size after set resize re-config 15.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force low hit rate -- should be no response as the auto-resize + * code should be disabled. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( rpt_fcn_called ) || + ( cache_ptr->resize_enabled ) || + ( cache_ptr->size_increase_possible ) || + ( cache_ptr->size_decrease_possible ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 44.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* force high hit rate -- should be no response as the auto-resize + * code should be disabled. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( rpt_fcn_called ) || + ( cache_ptr->resize_enabled ) || + ( cache_ptr->size_increase_possible ) || + ( cache_ptr->size_decrease_possible ) || + ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 45.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + + /* Now test the flash cache size increment code to verify that it + * is disabled when it should be. + * + * Since the flash size increase code doesn't look at hit rate, or + * use epochs (other than to start a new epoch if a flash cache size + * increase is triggered), we go about these tests somewhat differently + * than the rest of the tests in this function. + * + * As of this writing, there is only one flash cache size increment + * mode (add space), which is triggered whenever the size of a newly + * loaded or inserted entry, or the delta between old and new entry + * sizes exceeds some fraction of the current maximum cache size, and + * the cache doesn't have enough free space to accomodate the new/ + * resize entry without performing evictions. The range of permissible + * values for the flash_threshold (0.1 to 1.0 as of this writing), and + * for the flash_multiple (0.1 to 10.0) do not permit the facility to + * be turned off by configuration. Thus, flash cache size increases + * can be disabled only via the flash_incr_mode, and by setting the + * current max_cache_size equal to max_size. + * + * We have already tested the latter in check_auto_cache_resize(), so + * we need only thest the former here. Do this by disabling flash + * cache size increments via the flash_incr_mode, and then creating + * situations that would trigger flash cache size increases were that + * code enabled. + */ + + if ( pass ) { + + auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + auto_size_ctl.rpt_fcn = test_rpt_fcn; + + auto_size_ctl.set_initial_size = TRUE; + auto_size_ctl.initial_size = 64 * 1024; + + auto_size_ctl.min_clean_fraction = 0.5; + + auto_size_ctl.max_size = 256 * 1024; + auto_size_ctl.min_size = 32 * 1024; + + auto_size_ctl.epoch_length = 1000; + + + auto_size_ctl.incr_mode = H5C_incr__threshold; + + auto_size_ctl.lower_hr_threshold = 0.75; + + auto_size_ctl.increment = 2.0; + + auto_size_ctl.apply_max_increment = TRUE; + auto_size_ctl.max_increment = (2 * 1024); + + auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + auto_size_ctl.flash_multiple = 1.0; + auto_size_ctl.flash_threshold = 0.25; + + + auto_size_ctl.decr_mode = H5C_decr__age_out_with_threshold; + + auto_size_ctl.upper_hr_threshold = 0.995; + + auto_size_ctl.decrement = 0.5; + + auto_size_ctl.apply_max_decrement = TRUE; + auto_size_ctl.max_decrement = (1 * 1024); + + auto_size_ctl.epochs_before_eviction = 3; + + auto_size_ctl.apply_empty_reserve = TRUE; + auto_size_ctl.empty_reserve = 0.05; + + + result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 17.\n"; + } + } + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (64 * 1024) ) || + ( cache_ptr->min_clean_size != (32 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "bad cache size after set resize re-config 16.\n"; + } + } + + /* We have reduced the max cache size to well below the current index + * size. Protect and unprotect an entry to allow the cache to evict + * entries and get within bounds + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + + protect_entry(file_ptr, LARGE_ENTRY_TYPE, 0); + unprotect_entry(file_ptr, LARGE_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + + if ( ( pass ) && + ( ( ( cache_ptr->max_cache_size != (64 * 1024) ) || + ( cache_ptr->min_clean_size != (32 * 1024) ) || + ( cache_ptr->index_len != 1 ) || + ( cache_ptr->index_size != LARGE_ENTRY_SIZE ) || + ( rpt_fcn_called != FALSE ) ) ) ) { + + HDfprintf(stdout, "\nmax_cache_size = %ld.\n", + (long)(cache_ptr->max_cache_size)); + HDfprintf(stdout, "min_clean_size = %ld.\n", + (long)(cache_ptr->min_clean_size)); + HDfprintf(stdout, "index_len = %ld.\n", + (long)(cache_ptr->index_len)); + HDfprintf(stdout, "index_size = %ld.\n", + (long)(cache_ptr->index_size)); + HDfprintf(stdout, "rpt_fcn_called = %ld.\n", + (long)(rpt_fcn_called)); + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 46.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* Now protect and unprotect a monster entry. If the flash cache + * size increment code was active, this would trigger an increase. + * Verify that it doesn't. + * + * This finishes the additional tests needed for the flash cache + * size increase code. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + + if ( ( pass ) && + ( ( ( cache_ptr->max_cache_size != (64 * 1024) ) || + ( cache_ptr->min_clean_size != (32 * 1024) ) || + ( cache_ptr->index_len != 1 ) || + ( cache_ptr->index_size != MONSTER_ENTRY_SIZE ) || + ( rpt_fcn_called != FALSE ) ) ) ) { + + HDfprintf(stdout, "\nmax_cache_size = %ld.\n", + (long)(cache_ptr->max_cache_size)); + HDfprintf(stdout, "min_clean_size = %ld.\n", + (long)(cache_ptr->min_clean_size)); + HDfprintf(stdout, "index_len = %ld.\n", + (long)(cache_ptr->index_len)); + HDfprintf(stdout, "index_size = %ld.\n", + (long)(cache_ptr->index_size)); + HDfprintf(stdout, "rpt_fcn_called = %ld.\n", + (long)(rpt_fcn_called)); + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 47.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass ) { + + takedown_cache(file_ptr, FALSE, FALSE); + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + if ( core_file_driver_failed ) { + + HDfprintf(stdout, + "%s(): Unable to open test file with core file driver.\n", + fcn_name); + } + + return !pass; + +} /* check_auto_cache_resize_disable() */ + + +/*------------------------------------------------------------------------- + * Function: check_auto_cache_resize_epoch_markers() + * + * Purpose: Verify that the auto-resize code manages epoch markers + * correctly. + * + * Return: void + * + * Programmer: John Mainzer + * 12/16/04 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +static unsigned +check_auto_cache_resize_epoch_markers(void) +{ + const char * fcn_name = "check_auto_cache_resize_epoch_markers()"; + hbool_t show_progress = FALSE; + herr_t result; + int32_t i; + int32_t j; + int32_t checkpoint = 0; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + H5C_auto_size_ctl_t auto_size_ctl = + { + /* int32_t version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* H5C_auto_resize_report_fcn rpt_fcn = */ test_rpt_fcn, + + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (512 * 1024), + + /* double min_clean_fraction = */ 0.5, + + /* size_t max_size = */ (14 * 1024 * 1024), + /* size_t min_size = */ (512 * 1024), + + /* int64_t epoch_length = */ 1000, + + + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + + /* double lower_hr_threshold = */ 0.75, + + /* double increment = */ 2.0, + + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + + + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__threshold, + + /* double upper_hr_threshold = */ 0.995, + + /* double decrement = */ 0.1, + + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + + /* int32_t epochs_before_eviction = */ 3, + + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.05 + }; + + TESTING("automatic cache resize epoch marker management"); + + core_file_driver_failed = FALSE; + + pass = TRUE; + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass ) { + + reset_entries(); + + file_ptr = setup_cache((size_t)(2 * 1024), + (size_t)(1 * 1024)); + cache_ptr = file_ptr->shared->cache; + } + + if ( pass ) { + + result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 1.\n"; + } + } + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (512 * 1024) ) || + ( cache_ptr->min_clean_size != (256 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "bad cache size after initialization.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + + /* Now make sure that we are managing the epoch markers correctly. + */ + + if ( pass ) { + + auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + auto_size_ctl.rpt_fcn = test_rpt_fcn; + + auto_size_ctl.set_initial_size = TRUE; + auto_size_ctl.initial_size = 8 * 1024 * 1024; + + auto_size_ctl.min_clean_fraction = 0.5; + + auto_size_ctl.max_size = 8 * 1024 * 1024; + auto_size_ctl.min_size = 512 * 1024; + + auto_size_ctl.epoch_length = 1000; + + + auto_size_ctl.incr_mode = H5C_incr__off; + + auto_size_ctl.lower_hr_threshold = 0.75; + + auto_size_ctl.increment = 2.0; + + auto_size_ctl.apply_max_increment = TRUE; + auto_size_ctl.max_increment = (4 * 1024 * 1024); + + auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + auto_size_ctl.flash_multiple = 2.0; + auto_size_ctl.flash_threshold = 0.5; + + + auto_size_ctl.decr_mode = H5C_decr__age_out; + + auto_size_ctl.upper_hr_threshold = 0.995; + + auto_size_ctl.decrement = 0.5; + + auto_size_ctl.apply_max_decrement = FALSE; + auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + auto_size_ctl.epochs_before_eviction = 10; + + auto_size_ctl.apply_empty_reserve = FALSE; + auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 2.\n"; + } + } + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "bad cache size after set resize re-config 1.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* Since we just created the cache, there should be no epoch markers + * active. Verify that this is true. + */ + + if ( pass ) { + + if ( cache_ptr->epoch_markers_active != 0 ) { + + pass = FALSE; + failure_mssg = "Unexpected # of epoch markers 1.\n"; + } + } + + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, MEDIUM_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != in_spec ) || + ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) || + ( cache_ptr->index_size != (1 * 1000 * MEDIUM_ENTRY_SIZE) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 0.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + + if ( pass ) { + + j = 2; + while ( ( pass ) && ( j <= 10 ) ) + { + + rpt_fcn_called = FALSE; + i = (j - 2) * 1000; + while ( ( pass ) && ( i < (j - 1) * 1000 ) ) + { + protect_entry(file_ptr, SMALL_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, SMALL_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != in_spec ) || + ( cache_ptr->epoch_markers_active != j ) ) { + + pass = FALSE; + failure_mssg = "Unexpected # of epoch markers 2.\n"; + } + + j++; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* we now have a full complement of epoch markers -- see if + * we get the expected reduction. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 9000; + while ( ( pass ) && ( i < 10000 ) ) + { + protect_entry(file_ptr, SMALL_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, SMALL_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != + (10 * 1000 * SMALL_ENTRY_SIZE + MEDIUM_ENTRY_SIZE) ) || + ( cache_ptr->min_clean_size != + ((10 * 1000 * SMALL_ENTRY_SIZE + MEDIUM_ENTRY_SIZE) / 2) ) || + ( cache_ptr->index_size != + (10 * 1000 * SMALL_ENTRY_SIZE + MEDIUM_ENTRY_SIZE) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 1.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* now reduce the epochs before eviction, and see if the cache + * deletes the extra markers + */ + if ( pass ) { + + auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + auto_size_ctl.rpt_fcn = test_rpt_fcn; + + auto_size_ctl.set_initial_size = TRUE; + auto_size_ctl.initial_size = 8 * 1024 * 1024; + + auto_size_ctl.min_clean_fraction = 0.5; + + auto_size_ctl.max_size = 8 * 1024 * 1024; + auto_size_ctl.min_size = 512 * 1024; + + auto_size_ctl.epoch_length = 1000; + + + auto_size_ctl.incr_mode = H5C_incr__off; + + auto_size_ctl.lower_hr_threshold = 0.75; + + auto_size_ctl.increment = 2.0; + + auto_size_ctl.apply_max_increment = TRUE; + auto_size_ctl.max_increment = (4 * 1024 * 1024); + + auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + auto_size_ctl.flash_multiple = 2.0; + auto_size_ctl.flash_threshold = 0.5; + + + auto_size_ctl.decr_mode = H5C_decr__age_out; + + auto_size_ctl.upper_hr_threshold = 0.995; + + auto_size_ctl.decrement = 0.5; + + auto_size_ctl.apply_max_decrement = FALSE; + auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + auto_size_ctl.epochs_before_eviction = 1; + + auto_size_ctl.apply_empty_reserve = FALSE; + auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 3.\n"; + } + } + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "bad cache size after set resize re-config 2.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* There should be exactly one active epoch marker at present. + */ + if ( pass ) { + + if ( cache_ptr->epoch_markers_active != 1 ) { + + pass = FALSE; + failure_mssg = "Unexpected # of epoch markers 3.\n"; + } + } + + /* Now do an epochs worth of accesses, and verify that everything + * not accessed in this epoch gets evicted, and the cache size + * is reduced. + */ + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 9000; + while ( ( pass ) && ( i < 10000 ) ) + { + protect_entry(file_ptr, SMALL_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, SMALL_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != decrease ) || + ( cache_ptr->max_cache_size != (512 * 1024) ) || + ( cache_ptr->min_clean_size != (256 * 1024) ) || + ( cache_ptr->index_size != (1 * 1000 * SMALL_ENTRY_SIZE) ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 2.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* There should be exactly one active epoch marker at present... + */ + if ( pass ) { + + if ( cache_ptr->epoch_markers_active != 1 ) { + + pass = FALSE; + failure_mssg = "Unexpected # of epoch markers 4.\n"; + } + } + + /* shift the decrement mode to threshold, and verify that we remove + * all epoch markers. + */ + if ( pass ) { + + auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + auto_size_ctl.rpt_fcn = test_rpt_fcn; + + auto_size_ctl.set_initial_size = TRUE; + auto_size_ctl.initial_size = 8 * 1024 * 1024; + + auto_size_ctl.min_clean_fraction = 0.5; + + auto_size_ctl.max_size = 8 * 1024 * 1024; + auto_size_ctl.min_size = 512 * 1024; + + auto_size_ctl.epoch_length = 1000; + + + auto_size_ctl.incr_mode = H5C_incr__off; + + auto_size_ctl.lower_hr_threshold = 0.75; + + auto_size_ctl.increment = 2.0; + + auto_size_ctl.apply_max_increment = TRUE; + auto_size_ctl.max_increment = (4 * 1024 * 1024); + + auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + auto_size_ctl.flash_multiple = 2.0; + auto_size_ctl.flash_threshold = 0.5; + + + auto_size_ctl.decr_mode = H5C_decr__threshold; + + auto_size_ctl.upper_hr_threshold = 0.995; + + auto_size_ctl.decrement = 0.5; + + auto_size_ctl.apply_max_decrement = FALSE; + auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + auto_size_ctl.epochs_before_eviction = 1; + + auto_size_ctl.apply_empty_reserve = FALSE; + auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 4.\n"; + } + } + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "bad cache size after set resize re-config 3.\n"; + } + } + + /* ... and now there should be none. + */ + if ( pass ) { + + if ( cache_ptr->epoch_markers_active != 0 ) { + + pass = FALSE; + failure_mssg = "Unexpected # of epoch markers 5.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* shift the decrement mode to age out with threshold. Set epochs + * before eviction to 10 again. + */ + if ( pass ) { + + auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + auto_size_ctl.rpt_fcn = test_rpt_fcn; + + auto_size_ctl.set_initial_size = TRUE; + auto_size_ctl.initial_size = 8 * 1024 * 1024; + + auto_size_ctl.min_clean_fraction = 0.5; + + auto_size_ctl.max_size = 8 * 1024 * 1024; + auto_size_ctl.min_size = 512 * 1024; + + auto_size_ctl.epoch_length = 1000; + + + auto_size_ctl.incr_mode = H5C_incr__off; + + auto_size_ctl.lower_hr_threshold = 0.75; + + auto_size_ctl.increment = 2.0; + + auto_size_ctl.apply_max_increment = TRUE; + auto_size_ctl.max_increment = (4 * 1024 * 1024); + + auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + auto_size_ctl.flash_multiple = 2.0; + auto_size_ctl.flash_threshold = 0.5; + + + auto_size_ctl.decr_mode = H5C_decr__age_out_with_threshold; + + auto_size_ctl.upper_hr_threshold = 0.995; + + auto_size_ctl.decrement = 0.5; + + auto_size_ctl.apply_max_decrement = FALSE; + auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + auto_size_ctl.epochs_before_eviction = 10; + + auto_size_ctl.apply_empty_reserve = FALSE; + auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 5.\n"; + } + } + + /* Verify that there are no active epoch markers. + */ + if ( pass ) { + + if ( cache_ptr->epoch_markers_active != 0 ) { + + pass = FALSE; + failure_mssg = "Unexpected # of epoch markers 6.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* build up a full set of epoch markers. */ + if ( pass ) { + + j = 1; + while ( ( pass ) && ( j <= 10 ) ) + { + + rpt_fcn_called = FALSE; + i = (j - 1) * 1000; + while ( ( pass ) && ( i < j * 1000 ) ) + { + protect_entry(file_ptr, SMALL_ENTRY_TYPE, i); + + if ( pass ) { + unprotect_entry(file_ptr, SMALL_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + + if ( ( ! rpt_fcn_called ) || + ( rpt_status != in_spec ) || + ( cache_ptr->epoch_markers_active != j ) ) { + + pass = FALSE; + failure_mssg = "Unexpected # of epoch markers 7.\n"; + } + + j++; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* Verify that there are now 10 active epoch markers. + */ + if ( pass ) { + + if ( cache_ptr->epoch_markers_active != 10 ) { + + pass = FALSE; + failure_mssg = "Unexpected # of epoch markers 8.\n"; + } + } + + /* shift the decrement mode to off. This should cause all epoch + * markers to be removed. + */ + if ( pass ) { + + auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + auto_size_ctl.rpt_fcn = test_rpt_fcn; + + auto_size_ctl.set_initial_size = TRUE; + auto_size_ctl.initial_size = 8 * 1024 * 1024; + + auto_size_ctl.min_clean_fraction = 0.5; + + auto_size_ctl.max_size = 8 * 1024 * 1024; + auto_size_ctl.min_size = 512 * 1024; + + auto_size_ctl.epoch_length = 1000; + + + auto_size_ctl.incr_mode = H5C_incr__off; + + auto_size_ctl.lower_hr_threshold = 0.75; + + auto_size_ctl.increment = 2.0; + + auto_size_ctl.apply_max_increment = TRUE; + auto_size_ctl.max_increment = (4 * 1024 * 1024); + + auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + auto_size_ctl.flash_multiple = 2.0; + auto_size_ctl.flash_threshold = 0.5; + + + auto_size_ctl.decr_mode = H5C_decr__off; + + auto_size_ctl.upper_hr_threshold = 0.995; + + auto_size_ctl.decrement = 0.5; + + auto_size_ctl.apply_max_decrement = FALSE; + auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + auto_size_ctl.epochs_before_eviction = 10; + + auto_size_ctl.apply_empty_reserve = FALSE; + auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 6.\n"; + } + } + + /* Verify that there are now no active epoch markers. + */ + if ( pass ) { + + if ( cache_ptr->epoch_markers_active != 0 ) { + + pass = FALSE; + failure_mssg = "Unexpected # of epoch markers 9.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + /* verify that we still have the expected number of entries in the cache, + * and that the cache is of the expected size. + */ + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (4 * 1024 * 1024) )|| + ( cache_ptr->index_size != (10 * 1000 * SMALL_ENTRY_SIZE) ) || + ( cache_ptr->index_len != 10000 ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache size change results 3.\n"; + } + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass ) { + + takedown_cache(file_ptr, FALSE, FALSE); + } + + if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + if ( core_file_driver_failed ) { + + HDfprintf(stdout, + "%s(): Unable to open test file with core file driver.\n", + fcn_name); + } + + return !pass; + +} /* check_auto_cache_resize_epoch_markers() */ + + +/*------------------------------------------------------------------------- + * Function: check_auto_cache_resize_input_errs() + * + * Purpose: Verify that H5C_set_cache_auto_resize_config() detects + * and rejects invalid input. + * + * Return: void + * + * Programmer: John Mainzer + * 10/29/04 + * + * Modifications: + * + * Added code to verify that errors in the flash cache size + * increment related fields are caught as well. + * + * JRM -- 1/17/08 + * + *------------------------------------------------------------------------- + */ + +#define RESIZE_CONFIGS_ARE_EQUAL(a, b, compare_init) \ +( ( (a).version == (b).version ) && \ + ( (a).rpt_fcn == (b).rpt_fcn ) && \ + ( ( ! compare_init ) || \ + ( (a).set_initial_size == (b).set_initial_size ) ) && \ + ( ( ! compare_init ) || \ + ( (a).initial_size == (b).initial_size ) ) && \ + ( DBL_REL_EQUAL((a).min_clean_fraction, (b).min_clean_fraction, 0.00001 ) ) && \ + ( (a).max_size == (b).max_size ) && \ + ( (a).min_size == (b).min_size ) && \ + ( (a).epoch_length == (b).epoch_length ) && \ + ( (a).incr_mode == (b).incr_mode ) && \ + ( DBL_REL_EQUAL((a).lower_hr_threshold, (b).lower_hr_threshold, 0.00001 ) ) && \ + ( DBL_REL_EQUAL((a).increment, (b).increment, 0.00001 ) ) && \ + ( (a).apply_max_increment == (b).apply_max_increment ) && \ + ( (a).max_increment == (b).max_increment ) && \ + ( (a).flash_incr_mode == (b).flash_incr_mode ) && \ + ( DBL_REL_EQUAL((a).flash_multiple, (b).flash_multiple, 0.00001 ) ) && \ + ( DBL_REL_EQUAL((a).flash_threshold, (b).flash_threshold, 0.00001 ) ) && \ + ( (a).decr_mode == (b).decr_mode ) && \ + ( DBL_REL_EQUAL((a).upper_hr_threshold, (b).upper_hr_threshold, 0.00001 ) ) && \ + ( DBL_REL_EQUAL((a).decrement, (b).decrement, 0.00001 ) ) && \ + ( (a).apply_max_decrement == (b).apply_max_decrement ) && \ + ( (a).max_decrement == (b).max_decrement ) && \ + ( (a).epochs_before_eviction == (b).epochs_before_eviction ) && \ + ( (a).apply_empty_reserve == (b).apply_empty_reserve ) && \ + ( DBL_REL_EQUAL((a).empty_reserve, (b).empty_reserve, 0.00001 ) ) ) + +static unsigned +check_auto_cache_resize_input_errs(void) +{ + const char * fcn_name = "check_auto_cache_resize_input_errs()"; + herr_t result; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + H5C_auto_size_ctl_t ref_auto_size_ctl = + { + /* int32_t version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* H5C_auto_resize_report_fcn rpt_fcn = */ test_rpt_fcn, + + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (512 * 1024), + + /* double min_clean_fraction = */ 0.5, + + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ (512 * 1024), + + /* int64_t epoch_length = */ 1000, + + + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + + /* double lower_hr_threshold = */ 0.75, + + /* double increment = */ 2.0, + + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + + + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__threshold, + + /* double upper_hr_threshold = */ 0.995, + + /* double decrement = */ 0.1, + + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + + /* int32_t epochs_before_eviction = */ 3, + + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.05 + }; + + H5C_auto_size_ctl_t invalid_auto_size_ctl; + H5C_auto_size_ctl_t test_auto_size_ctl; + + TESTING("automatic cache resize input errors"); + + core_file_driver_failed = FALSE; + + pass = TRUE; + + /* allocate a cache, and set a reference automatic cache control + * configuration. Then feed H5C_set_cache_auto_resize_config() + * invalid input, and verify that the correct error is returned, + * and that the configuration is not modified. + */ + + if ( pass ) { + + reset_entries(); + + file_ptr = setup_cache((size_t)(2 * 1024), + (size_t)(1 * 1024)); + cache_ptr = file_ptr->shared->cache; + } + + if ( pass ) { + + result = H5C_set_cache_auto_resize_config(cache_ptr, + &ref_auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 1.\n"; + } + } + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (512 * 1024) ) || + ( cache_ptr->min_clean_size != (256 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "bad cache size after initialization.\n"; + } + } + + if ( pass ) { + + result = H5C_get_cache_auto_resize_config(cache_ptr, + &test_auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_auto_resize_config failed 1."; + + } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ + ref_auto_size_ctl, FALSE) ) { + + pass = FALSE; + failure_mssg = "Unexpected auto resize config 1."; + } + } + + if ( pass ) { + + invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + invalid_auto_size_ctl.rpt_fcn = NULL; + + invalid_auto_size_ctl.set_initial_size = TRUE; + invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; + + invalid_auto_size_ctl.min_clean_fraction = 0.5; + + invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; + invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; + + invalid_auto_size_ctl.epoch_length = 5000; + + + invalid_auto_size_ctl.incr_mode = H5C_incr__threshold; + + invalid_auto_size_ctl.lower_hr_threshold = 0.7; + + invalid_auto_size_ctl.increment = 2.0; + + invalid_auto_size_ctl.apply_max_increment = TRUE; + invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); + + invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + invalid_auto_size_ctl.flash_multiple = 2.0; + invalid_auto_size_ctl.flash_threshold = 0.5; + + + invalid_auto_size_ctl.decr_mode = H5C_decr__threshold; + + invalid_auto_size_ctl.upper_hr_threshold = 0.999; + + invalid_auto_size_ctl.decrement = 0.5; + + invalid_auto_size_ctl.apply_max_decrement = TRUE; + invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + invalid_auto_size_ctl.epochs_before_eviction = 3; + + invalid_auto_size_ctl.apply_empty_reserve = TRUE; + invalid_auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(NULL, + &invalid_auto_size_ctl); + + if ( result != FAIL ) { + + pass = FALSE; + failure_mssg = + "H5C_set_cache_auto_resize_config accepted NULL cache_ptr.\n"; + } + } + + if ( pass ) { + + result = H5C_get_cache_auto_resize_config(cache_ptr, + &test_auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_auto_resize_config failed 2."; + + } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ + ref_auto_size_ctl, FALSE) ) { + + pass = FALSE; + failure_mssg = "Unexpected auto resize config 2."; + } + } + + + /* check bad version rejection. */ + + if ( pass ) { + + invalid_auto_size_ctl.version = -1; /* INVALID */ + invalid_auto_size_ctl.rpt_fcn = NULL; + + invalid_auto_size_ctl.set_initial_size = TRUE; + invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; + + invalid_auto_size_ctl.min_clean_fraction = 0.5; + + invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; + invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; + + invalid_auto_size_ctl.epoch_length = 5000; + + + invalid_auto_size_ctl.incr_mode = H5C_incr__threshold; + + invalid_auto_size_ctl.lower_hr_threshold = 0.7; + + invalid_auto_size_ctl.increment = 2.0; + + invalid_auto_size_ctl.apply_max_increment = TRUE; + invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); + + invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + invalid_auto_size_ctl.flash_multiple = 2.0; + invalid_auto_size_ctl.flash_threshold = 0.5; + + + invalid_auto_size_ctl.decr_mode = H5C_decr__threshold; + + invalid_auto_size_ctl.upper_hr_threshold = 0.999; + + invalid_auto_size_ctl.decrement = 0.5; + + invalid_auto_size_ctl.apply_max_decrement = TRUE; + invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + invalid_auto_size_ctl.epochs_before_eviction = 3; + + invalid_auto_size_ctl.apply_empty_reserve = TRUE; + invalid_auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, + &invalid_auto_size_ctl); + + if ( result != FAIL ) { + + pass = FALSE; + failure_mssg = + "H5C_set_cache_auto_resize_config accepted bad version.\n"; + } + } + + if ( pass ) { + + result = H5C_get_cache_auto_resize_config(cache_ptr, + &test_auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_auto_resize_config failed 3."; + + } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ + ref_auto_size_ctl, FALSE) ) { + + pass = FALSE; + failure_mssg = "Unexpected auto resize config 3."; + } + } + + + /* check bad initial size rejection */ + + if ( pass ) { + + invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + invalid_auto_size_ctl.rpt_fcn = NULL; + + invalid_auto_size_ctl.set_initial_size = TRUE; + invalid_auto_size_ctl.initial_size = 16 * 1024 * 1024 + 1; + /* INVALID */ + + invalid_auto_size_ctl.min_clean_fraction = 0.5; + + invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; + invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; + + invalid_auto_size_ctl.epoch_length = 5000; + + + invalid_auto_size_ctl.incr_mode = H5C_incr__threshold; + + invalid_auto_size_ctl.lower_hr_threshold = 0.75; + + invalid_auto_size_ctl.increment = 2.0; + + invalid_auto_size_ctl.apply_max_increment = TRUE; + invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); + + invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + invalid_auto_size_ctl.flash_multiple = 2.0; + invalid_auto_size_ctl.flash_threshold = 0.5; + + + invalid_auto_size_ctl.decr_mode = H5C_decr__threshold; + + invalid_auto_size_ctl.upper_hr_threshold = 0.999; + + invalid_auto_size_ctl.decrement = 0.5; + + invalid_auto_size_ctl.apply_max_decrement = TRUE; + invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + invalid_auto_size_ctl.epochs_before_eviction = 3; + + invalid_auto_size_ctl.apply_empty_reserve = TRUE; + invalid_auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, + &invalid_auto_size_ctl); + + if ( result != FAIL ) { + + pass = FALSE; + failure_mssg = + "H5C_set_cache_auto_resize_config accepted bad init size 1.\n"; + } + } + + if ( pass ) { + + result = H5C_get_cache_auto_resize_config(cache_ptr, + &test_auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_auto_resize_config failed 4."; + + } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ + ref_auto_size_ctl, FALSE) ) { + + pass = FALSE; + failure_mssg = "Unexpected auto resize config 4."; + } + } + + if ( pass ) { + + invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + invalid_auto_size_ctl.rpt_fcn = NULL; + + invalid_auto_size_ctl.set_initial_size = TRUE; + invalid_auto_size_ctl.initial_size = 1 * 1024 * 1024 - 1; + /* INVALID */ + + invalid_auto_size_ctl.min_clean_fraction = 0.5; + + invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; + invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; + + invalid_auto_size_ctl.epoch_length = 5000; + + + invalid_auto_size_ctl.incr_mode = H5C_incr__threshold; + + invalid_auto_size_ctl.lower_hr_threshold = 0.75; + + invalid_auto_size_ctl.increment = 2.0; + + invalid_auto_size_ctl.apply_max_increment = TRUE; + invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); + + invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + invalid_auto_size_ctl.flash_multiple = 2.0; + invalid_auto_size_ctl.flash_threshold = 0.5; + + + invalid_auto_size_ctl.decr_mode = H5C_decr__threshold; + + invalid_auto_size_ctl.upper_hr_threshold = 0.999; + + invalid_auto_size_ctl.decrement = 0.5; + + invalid_auto_size_ctl.apply_max_decrement = TRUE; + invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + invalid_auto_size_ctl.epochs_before_eviction = 3; + + invalid_auto_size_ctl.apply_empty_reserve = TRUE; + invalid_auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, + &invalid_auto_size_ctl); + + if ( result != FAIL ) { + + pass = FALSE; + failure_mssg = + "H5C_set_cache_auto_resize_config accepted bad init size 2.\n"; + } + } + + if ( pass ) { + + result = H5C_get_cache_auto_resize_config(cache_ptr, + &test_auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_auto_resize_config failed 5."; + + } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ + ref_auto_size_ctl, FALSE) ) { + + pass = FALSE; + failure_mssg = "Unexpected auto resize config 5."; + } + } + + + /* test for invalid min clean fraction rejection. */ + + if ( pass ) { + + invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + invalid_auto_size_ctl.rpt_fcn = NULL; + + invalid_auto_size_ctl.set_initial_size = TRUE; + invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; + + invalid_auto_size_ctl.min_clean_fraction = 1.00001; /* INVALID */ + + invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; + invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; + + invalid_auto_size_ctl.epoch_length = 5000; + + + invalid_auto_size_ctl.incr_mode = H5C_incr__threshold; + + invalid_auto_size_ctl.lower_hr_threshold = 0.75; + + invalid_auto_size_ctl.increment = 2.0; + + invalid_auto_size_ctl.apply_max_increment = TRUE; + invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); + + invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + invalid_auto_size_ctl.flash_multiple = 2.0; + invalid_auto_size_ctl.flash_threshold = 0.5; + + + invalid_auto_size_ctl.decr_mode = H5C_decr__threshold; + + invalid_auto_size_ctl.upper_hr_threshold = 0.999; + + invalid_auto_size_ctl.decrement = 0.5; + + invalid_auto_size_ctl.apply_max_decrement = TRUE; + invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + invalid_auto_size_ctl.epochs_before_eviction = 3; + + invalid_auto_size_ctl.apply_empty_reserve = TRUE; + invalid_auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, + &invalid_auto_size_ctl); + + if ( result != FAIL ) { + + pass = FALSE; + failure_mssg = + "H5C_set_cache_auto_resize_config accepted bad min clean frac 1.\n"; + } + } + + if ( pass ) { + + result = H5C_get_cache_auto_resize_config(cache_ptr, + &test_auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_auto_resize_config failed 6."; + + } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ + ref_auto_size_ctl, FALSE) ) { + + pass = FALSE; + failure_mssg = "Unexpected auto resize config 6."; + } + } + + if ( pass ) { + + invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + invalid_auto_size_ctl.rpt_fcn = NULL; + + invalid_auto_size_ctl.set_initial_size = TRUE; + invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; + + invalid_auto_size_ctl.min_clean_fraction = -0.00001; /* INVALID */ + + invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; + invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; + + invalid_auto_size_ctl.epoch_length = 5000; + + + invalid_auto_size_ctl.incr_mode = H5C_incr__threshold; + + invalid_auto_size_ctl.lower_hr_threshold = 0.75; + + invalid_auto_size_ctl.increment = 2.0; + + invalid_auto_size_ctl.apply_max_increment = TRUE; + invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); + + invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + invalid_auto_size_ctl.flash_multiple = 2.0; + invalid_auto_size_ctl.flash_threshold = 0.5; + + + invalid_auto_size_ctl.decr_mode = H5C_decr__threshold; + + invalid_auto_size_ctl.upper_hr_threshold = 0.999; + + invalid_auto_size_ctl.decrement = 0.5; + + invalid_auto_size_ctl.apply_max_decrement = TRUE; + invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + invalid_auto_size_ctl.epochs_before_eviction = 3; + + invalid_auto_size_ctl.apply_empty_reserve = TRUE; + invalid_auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, + &invalid_auto_size_ctl); + + if ( result != FAIL ) { + + pass = FALSE; + failure_mssg = + "H5C_set_cache_auto_resize_config accepted bad min clean frac 2.\n"; + } + } + + if ( pass ) { + + result = H5C_get_cache_auto_resize_config(cache_ptr, + &test_auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_auto_resize_config failed 7."; + + } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ + ref_auto_size_ctl, FALSE) ) { + + pass = FALSE; + failure_mssg = "Unexpected auto resize config 7."; + } + } + + + /* test for invalid max_size and/or min_size rejection */ + + if ( pass ) { + + invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + invalid_auto_size_ctl.rpt_fcn = NULL; + + invalid_auto_size_ctl.set_initial_size = TRUE; + invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; + + invalid_auto_size_ctl.min_clean_fraction = 0.5; + + invalid_auto_size_ctl.max_size = H5C__MAX_MAX_CACHE_SIZE + 1; + /* INVALID */ + invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; + + invalid_auto_size_ctl.epoch_length = 5000; + + + invalid_auto_size_ctl.incr_mode = H5C_incr__threshold; + + invalid_auto_size_ctl.lower_hr_threshold = 0.75; + + invalid_auto_size_ctl.increment = 2.0; + + invalid_auto_size_ctl.apply_max_increment = TRUE; + invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); + + invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + invalid_auto_size_ctl.flash_multiple = 2.0; + invalid_auto_size_ctl.flash_threshold = 0.5; + + + invalid_auto_size_ctl.decr_mode = H5C_decr__threshold; + + invalid_auto_size_ctl.upper_hr_threshold = 0.999; + + invalid_auto_size_ctl.decrement = 0.5; + + invalid_auto_size_ctl.apply_max_decrement = TRUE; + invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + invalid_auto_size_ctl.epochs_before_eviction = 3; + + invalid_auto_size_ctl.apply_empty_reserve = TRUE; + invalid_auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, + &invalid_auto_size_ctl); + + if ( result != FAIL ) { + + pass = FALSE; + failure_mssg = + "H5C_set_cache_auto_resize_config accepted bad max_size.\n"; + } + } + + if ( pass ) { + + result = H5C_get_cache_auto_resize_config(cache_ptr, + &test_auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_auto_resize_config failed 8."; + + } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ + ref_auto_size_ctl, FALSE) ) { + + pass = FALSE; + failure_mssg = "Unexpected auto resize config 8."; + } + } + + if ( pass ) { + + invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + invalid_auto_size_ctl.rpt_fcn = NULL; + + invalid_auto_size_ctl.set_initial_size = TRUE; + invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; + + invalid_auto_size_ctl.min_clean_fraction = 0.5; + + invalid_auto_size_ctl.max_size = 1 * 1024 * 1024;/* INVALID */ + invalid_auto_size_ctl.min_size = 1 * 1024 * 1024 + 1;/*PAIR */ + + invalid_auto_size_ctl.epoch_length = 5000; + + + invalid_auto_size_ctl.incr_mode = H5C_incr__threshold; + + invalid_auto_size_ctl.lower_hr_threshold = 0.75; + + invalid_auto_size_ctl.increment = 2.0; + + invalid_auto_size_ctl.apply_max_increment = TRUE; + invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); + + invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + invalid_auto_size_ctl.flash_multiple = 2.0; + invalid_auto_size_ctl.flash_threshold = 0.5; + + + invalid_auto_size_ctl.decr_mode = H5C_decr__threshold; + + invalid_auto_size_ctl.upper_hr_threshold = 0.999; + + invalid_auto_size_ctl.decrement = 0.5; + + invalid_auto_size_ctl.apply_max_decrement = TRUE; + invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + invalid_auto_size_ctl.epochs_before_eviction = 3; + + invalid_auto_size_ctl.apply_empty_reserve = TRUE; + invalid_auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, + &invalid_auto_size_ctl); + + if ( result != FAIL ) { + + pass = FALSE; + failure_mssg = + "H5C_set_cache_auto_resize_config accepted bad size pair.\n"; + } + } + + if ( pass ) { + + result = H5C_get_cache_auto_resize_config(cache_ptr, + &test_auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_auto_resize_config failed 9."; + + } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ + ref_auto_size_ctl, FALSE) ) { + + pass = FALSE; + failure_mssg = "Unexpected auto resize config 9."; + } + } + + if ( pass ) { + + invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + invalid_auto_size_ctl.rpt_fcn = NULL; + + invalid_auto_size_ctl.set_initial_size = TRUE; + invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; + + invalid_auto_size_ctl.min_clean_fraction = 0.5; + + invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; + invalid_auto_size_ctl.min_size = H5C__MIN_MAX_CACHE_SIZE - 1; + /* INVALID */ + invalid_auto_size_ctl.epoch_length = 5000; + + + invalid_auto_size_ctl.incr_mode = H5C_incr__threshold; + + invalid_auto_size_ctl.lower_hr_threshold = 0.75; + + invalid_auto_size_ctl.increment = 2.0; + + invalid_auto_size_ctl.apply_max_increment = TRUE; + invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); + + invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + invalid_auto_size_ctl.flash_multiple = 2.0; + invalid_auto_size_ctl.flash_threshold = 0.5; + + + invalid_auto_size_ctl.decr_mode = H5C_decr__threshold; + + invalid_auto_size_ctl.upper_hr_threshold = 0.999; + + invalid_auto_size_ctl.decrement = 0.5; + + invalid_auto_size_ctl.apply_max_decrement = TRUE; + invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + invalid_auto_size_ctl.epochs_before_eviction = 3; + + invalid_auto_size_ctl.apply_empty_reserve = TRUE; + invalid_auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, + &invalid_auto_size_ctl); + + if ( result != FAIL ) { + + pass = FALSE; + failure_mssg = + "H5C_set_cache_auto_resize_config accepted bad min_size.\n"; + } + } + + if ( pass ) { + + result = H5C_get_cache_auto_resize_config(cache_ptr, + &test_auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_auto_resize_config failed 10."; + + } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ + ref_auto_size_ctl, FALSE) ) { + + pass = FALSE; + failure_mssg = "Unexpected auto resize config 10."; + } + } + + + /* test for invalid epoch_length rejection */ + + if ( pass ) { + + invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + invalid_auto_size_ctl.rpt_fcn = NULL; + + invalid_auto_size_ctl.set_initial_size = TRUE; + invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; + + invalid_auto_size_ctl.min_clean_fraction = 0.1; + + invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; + invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; + + invalid_auto_size_ctl.epoch_length = H5C__MAX_AR_EPOCH_LENGTH + 1; + /* INVALID */ + + invalid_auto_size_ctl.incr_mode = H5C_incr__threshold; + + invalid_auto_size_ctl.lower_hr_threshold = 0.75; + + invalid_auto_size_ctl.increment = 2.0; + + invalid_auto_size_ctl.apply_max_increment = TRUE; + invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); + + invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + invalid_auto_size_ctl.flash_multiple = 2.0; + invalid_auto_size_ctl.flash_threshold = 0.5; + + + invalid_auto_size_ctl.decr_mode = H5C_decr__threshold; + + invalid_auto_size_ctl.upper_hr_threshold = 0.999; + + invalid_auto_size_ctl.decrement = 0.9; + + invalid_auto_size_ctl.apply_max_decrement = TRUE; + invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + invalid_auto_size_ctl.epochs_before_eviction = 3; + + invalid_auto_size_ctl.apply_empty_reserve = TRUE; + invalid_auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, + &invalid_auto_size_ctl); + + if ( result != FAIL ) { + + pass = FALSE; + failure_mssg = + "H5C_set_cache_auto_resize_config accepted bad epoch len 1.\n"; + } + } + + if ( pass ) { + + result = H5C_get_cache_auto_resize_config(cache_ptr, + &test_auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_auto_resize_config failed 11."; + + } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ + ref_auto_size_ctl, FALSE) ) { + + pass = FALSE; + failure_mssg = "Unexpected auto resize config 11."; + } + } + + if ( pass ) { + + invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + invalid_auto_size_ctl.rpt_fcn = NULL; + + invalid_auto_size_ctl.set_initial_size = TRUE; + invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; + + invalid_auto_size_ctl.min_clean_fraction = 0.1; + + invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; + invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; + + invalid_auto_size_ctl.epoch_length = H5C__MIN_AR_EPOCH_LENGTH - 1; + /* INVALID */ + + invalid_auto_size_ctl.incr_mode = H5C_incr__threshold; + + invalid_auto_size_ctl.lower_hr_threshold = 0.75; + + invalid_auto_size_ctl.increment = 2.0; + + invalid_auto_size_ctl.apply_max_increment = TRUE; + invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); + + invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + invalid_auto_size_ctl.flash_multiple = 2.0; + invalid_auto_size_ctl.flash_threshold = 0.5; + + + invalid_auto_size_ctl.decr_mode = H5C_decr__threshold; + + invalid_auto_size_ctl.upper_hr_threshold = 0.999; + + invalid_auto_size_ctl.decrement = 0.9; + + invalid_auto_size_ctl.apply_max_decrement = TRUE; + invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + invalid_auto_size_ctl.epochs_before_eviction = 3; + + invalid_auto_size_ctl.apply_empty_reserve = TRUE; + invalid_auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, + &invalid_auto_size_ctl); + + if ( result != FAIL ) { + + pass = FALSE; + failure_mssg = + "H5C_set_cache_auto_resize_config accepted bad epoch len 2.\n"; + } + } + + if ( pass ) { + + result = H5C_get_cache_auto_resize_config(cache_ptr, + &test_auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_auto_resize_config failed 12."; + + } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ + ref_auto_size_ctl, FALSE) ) { + + pass = FALSE; + failure_mssg = "Unexpected auto resize config 12."; + } + } + + + /* test for bad incr_mode rejection */ + + if ( pass ) { + + invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + invalid_auto_size_ctl.rpt_fcn = NULL; + + invalid_auto_size_ctl.set_initial_size = TRUE; + invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; + + invalid_auto_size_ctl.min_clean_fraction = 0.1; + + invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; + invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; + + invalid_auto_size_ctl.epoch_length = 5000; + + + invalid_auto_size_ctl.incr_mode = + (enum H5C_cache_incr_mode) -1; /* INVALID */ + + invalid_auto_size_ctl.lower_hr_threshold = 0.75; + + invalid_auto_size_ctl.increment = 2.0; + + invalid_auto_size_ctl.apply_max_increment = TRUE; + invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); + + invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + invalid_auto_size_ctl.flash_multiple = 2.0; + invalid_auto_size_ctl.flash_threshold = 0.5; + + + invalid_auto_size_ctl.decr_mode = H5C_decr__threshold; + + invalid_auto_size_ctl.upper_hr_threshold = 0.999; + + invalid_auto_size_ctl.decrement = 0.9; + + invalid_auto_size_ctl.apply_max_decrement = TRUE; + invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + invalid_auto_size_ctl.epochs_before_eviction = 3; + + invalid_auto_size_ctl.apply_empty_reserve = TRUE; + invalid_auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, + &invalid_auto_size_ctl); + + if ( result != FAIL ) { + + pass = FALSE; + failure_mssg = + "H5C_set_cache_auto_resize_config accepted bad incr_mode 1.\n"; + } + } + + if ( pass ) { + + result = H5C_get_cache_auto_resize_config(cache_ptr, + &test_auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_auto_resize_config failed 13."; + + } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ + ref_auto_size_ctl, FALSE) ) { + + pass = FALSE; + failure_mssg = "Unexpected auto resize config 13."; + } + } + + if ( pass ) { + + invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + invalid_auto_size_ctl.rpt_fcn = NULL; + + invalid_auto_size_ctl.set_initial_size = TRUE; + invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; + + invalid_auto_size_ctl.min_clean_fraction = 0.1; + + invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; + invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; + + invalid_auto_size_ctl.epoch_length = 5000; + + + invalid_auto_size_ctl.incr_mode = + (enum H5C_cache_incr_mode) 2; /* INVALID */ + + invalid_auto_size_ctl.lower_hr_threshold = 0.75; + + invalid_auto_size_ctl.increment = 2.0; + + invalid_auto_size_ctl.apply_max_increment = TRUE; + invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); + + invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + invalid_auto_size_ctl.flash_multiple = 2.0; + invalid_auto_size_ctl.flash_threshold = 0.5; + + + invalid_auto_size_ctl.decr_mode = H5C_decr__threshold; + + invalid_auto_size_ctl.upper_hr_threshold = 0.999; + + invalid_auto_size_ctl.decrement = 0.9; + + invalid_auto_size_ctl.apply_max_decrement = TRUE; + invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + invalid_auto_size_ctl.epochs_before_eviction = 3; + + invalid_auto_size_ctl.apply_empty_reserve = TRUE; + invalid_auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, + &invalid_auto_size_ctl); + + if ( result != FAIL ) { + + pass = FALSE; + failure_mssg = + "H5C_set_cache_auto_resize_config accepted bad incr_mode 2.\n"; + } + } + + if ( pass ) { + + result = H5C_get_cache_auto_resize_config(cache_ptr, + &test_auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_auto_resize_config failed 14."; + + } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ + ref_auto_size_ctl, FALSE) ) { + + pass = FALSE; + failure_mssg = "Unexpected auto resize config 14."; + } + } + + + /* check for bad upper and/or lower threshold rejection */ + + if ( pass ) { + + invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + invalid_auto_size_ctl.rpt_fcn = NULL; + + invalid_auto_size_ctl.set_initial_size = TRUE; + invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; + + invalid_auto_size_ctl.min_clean_fraction = 0.5; + + invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; + invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; + + invalid_auto_size_ctl.epoch_length = 5000; + + + invalid_auto_size_ctl.incr_mode = H5C_incr__threshold; + + invalid_auto_size_ctl.lower_hr_threshold = 0.7; + + invalid_auto_size_ctl.increment = 2.0; + + invalid_auto_size_ctl.apply_max_increment = TRUE; + invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); + + invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + invalid_auto_size_ctl.flash_multiple = 2.0; + invalid_auto_size_ctl.flash_threshold = 0.5; + + + invalid_auto_size_ctl.decr_mode = H5C_decr__threshold; + + invalid_auto_size_ctl.upper_hr_threshold = 1.01; /* INVALID */ + + invalid_auto_size_ctl.decrement = 0.5; + + invalid_auto_size_ctl.apply_max_decrement = TRUE; + invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + invalid_auto_size_ctl.epochs_before_eviction = 3; + + invalid_auto_size_ctl.apply_empty_reserve = TRUE; + invalid_auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, + &invalid_auto_size_ctl); + + if ( result != FAIL ) { + + pass = FALSE; + failure_mssg = + "H5C_set_cache_auto_resize_config accepted bad upper threshold.\n"; + } + } + + if ( pass ) { + + result = H5C_get_cache_auto_resize_config(cache_ptr, + &test_auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_auto_resize_config failed 15."; + + } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ + ref_auto_size_ctl, FALSE) ) { + + pass = FALSE; + failure_mssg = "Unexpected auto resize config 15."; + } + } + + if ( pass ) { + + invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + invalid_auto_size_ctl.rpt_fcn = NULL; + + invalid_auto_size_ctl.set_initial_size = TRUE; + invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; + + invalid_auto_size_ctl.min_clean_fraction = 0.5; + + invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; + invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; + + invalid_auto_size_ctl.epoch_length = 5000; + + + invalid_auto_size_ctl.incr_mode = H5C_incr__threshold; + + invalid_auto_size_ctl.lower_hr_threshold = 0.8; /* INVALID */ + + invalid_auto_size_ctl.increment = 2.0; + + invalid_auto_size_ctl.apply_max_increment = TRUE; + invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); + + invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + invalid_auto_size_ctl.flash_multiple = 2.0; + invalid_auto_size_ctl.flash_threshold = 0.5; + + + invalid_auto_size_ctl.decr_mode = H5C_decr__threshold; + + invalid_auto_size_ctl.upper_hr_threshold = 0.7; /* INVALID */ + + invalid_auto_size_ctl.decrement = 0.5; + + invalid_auto_size_ctl.apply_max_decrement = TRUE; + invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + invalid_auto_size_ctl.epochs_before_eviction = 3; + + invalid_auto_size_ctl.apply_empty_reserve = TRUE; + invalid_auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, + &invalid_auto_size_ctl); + + if ( result != FAIL ) { + + pass = FALSE; + failure_mssg = + "H5C_set_cache_auto_resize_config accepted bad threshold pair.\n"; + } + } + + if ( pass ) { + + result = H5C_get_cache_auto_resize_config(cache_ptr, + &test_auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_auto_resize_config failed 16."; + + } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ + ref_auto_size_ctl, FALSE) ) { + + pass = FALSE; + failure_mssg = "Unexpected auto resize config 16."; + } + } + + if ( pass ) { + + invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + invalid_auto_size_ctl.rpt_fcn = NULL; + + invalid_auto_size_ctl.set_initial_size = TRUE; + invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; + + invalid_auto_size_ctl.min_clean_fraction = 0.5; + + invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; + invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; + + invalid_auto_size_ctl.epoch_length = 5000; + + + invalid_auto_size_ctl.incr_mode = H5C_incr__threshold; + + invalid_auto_size_ctl.lower_hr_threshold = -0.0001; /* INVALID */ + + invalid_auto_size_ctl.increment = 2.0; + + invalid_auto_size_ctl.apply_max_increment = TRUE; + invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); + + invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + invalid_auto_size_ctl.flash_multiple = 2.0; + invalid_auto_size_ctl.flash_threshold = 0.5; + + + invalid_auto_size_ctl.decr_mode = H5C_decr__threshold; + + invalid_auto_size_ctl.upper_hr_threshold = 0.999; + + invalid_auto_size_ctl.decrement = 0.5; + + invalid_auto_size_ctl.apply_max_decrement = TRUE; + invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + invalid_auto_size_ctl.epochs_before_eviction = 3; + + invalid_auto_size_ctl.apply_empty_reserve = TRUE; + invalid_auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, + &invalid_auto_size_ctl); + + if ( result != FAIL ) { + + pass = FALSE; + failure_mssg = + "H5C_set_cache_auto_resize_config accepted bad lower threshold.\n"; + } + } + + if ( pass ) { + + result = H5C_get_cache_auto_resize_config(cache_ptr, + &test_auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_auto_resize_config failed 17."; + + } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ + ref_auto_size_ctl, FALSE) ) { + + pass = FALSE; + failure_mssg = "Unexpected auto resize config 17."; + } + } + + + /* test for bad increment rejection */ + + if ( pass ) { + + invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + invalid_auto_size_ctl.rpt_fcn = NULL; + + invalid_auto_size_ctl.set_initial_size = TRUE; + invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; + + invalid_auto_size_ctl.min_clean_fraction = 0.1; + + invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; + invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; + + invalid_auto_size_ctl.epoch_length = 5000; + + + invalid_auto_size_ctl.incr_mode = H5C_incr__threshold; + + invalid_auto_size_ctl.lower_hr_threshold = 0.75; + + invalid_auto_size_ctl.increment = 0.99999; /* INVALID */ + + invalid_auto_size_ctl.apply_max_increment = TRUE; + invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); + + invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + invalid_auto_size_ctl.flash_multiple = 2.0; + invalid_auto_size_ctl.flash_threshold = 0.5; + + + invalid_auto_size_ctl.decr_mode = H5C_decr__threshold; + + invalid_auto_size_ctl.upper_hr_threshold = 0.999; + + invalid_auto_size_ctl.decrement = 0.5; + + invalid_auto_size_ctl.apply_max_decrement = TRUE; + invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + invalid_auto_size_ctl.epochs_before_eviction = 3; + + invalid_auto_size_ctl.apply_empty_reserve = TRUE; + invalid_auto_size_ctl.empty_reserve = 0.05; + + + result = H5C_set_cache_auto_resize_config(cache_ptr, + &invalid_auto_size_ctl); + + if ( result != FAIL ) { + + pass = FALSE; + failure_mssg = + "H5C_set_cache_auto_resize_config accepted bad increment.\n"; + } + } + + if ( pass ) { + + result = H5C_get_cache_auto_resize_config(cache_ptr, + &test_auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_auto_resize_config failed 18."; + + } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ + ref_auto_size_ctl, FALSE) ) { + + pass = FALSE; + failure_mssg = "Unexpected auto resize config 18."; + } + } + + /* test for bad flash_incr_mode rejection */ + + if ( pass ) { + + invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + invalid_auto_size_ctl.rpt_fcn = NULL; + + invalid_auto_size_ctl.set_initial_size = TRUE; + invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; + + invalid_auto_size_ctl.min_clean_fraction = 0.1; + + invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; + invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; + + invalid_auto_size_ctl.epoch_length = 5000; + + + invalid_auto_size_ctl.incr_mode = H5C_incr__threshold; + + invalid_auto_size_ctl.lower_hr_threshold = 0.75; + + invalid_auto_size_ctl.increment = 2.0; + + invalid_auto_size_ctl.apply_max_increment = TRUE; + invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); + + invalid_auto_size_ctl.flash_incr_mode = + (enum H5C_cache_flash_incr_mode) -1; /* INVALID */ + invalid_auto_size_ctl.flash_multiple = 2.0; + invalid_auto_size_ctl.flash_threshold = 0.5; + + + invalid_auto_size_ctl.decr_mode = H5C_decr__threshold; + + invalid_auto_size_ctl.upper_hr_threshold = 0.999; + + invalid_auto_size_ctl.decrement = 0.9; + + invalid_auto_size_ctl.apply_max_decrement = TRUE; + invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + invalid_auto_size_ctl.epochs_before_eviction = 3; + + invalid_auto_size_ctl.apply_empty_reserve = TRUE; + invalid_auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, + &invalid_auto_size_ctl); + + if ( result != FAIL ) { + + pass = FALSE; + failure_mssg = + "H5C_set_cache_auto_resize_config accepted bad flash_incr_mode.\n"; + } + } + + if ( pass ) { + + result = H5C_get_cache_auto_resize_config(cache_ptr, + &test_auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_auto_resize_config failed 19."; + + } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ + ref_auto_size_ctl, FALSE) ) { + + pass = FALSE; + failure_mssg = "Unexpected auto resize config 19."; + } + } + + /* test for bad flash_multiple rejection */ + + if ( pass ) { + + invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + invalid_auto_size_ctl.rpt_fcn = NULL; + + invalid_auto_size_ctl.set_initial_size = TRUE; + invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; + + invalid_auto_size_ctl.min_clean_fraction = 0.1; + + invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; + invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; + + invalid_auto_size_ctl.epoch_length = 5000; + + + invalid_auto_size_ctl.incr_mode = H5C_incr__threshold; + + invalid_auto_size_ctl.lower_hr_threshold = 0.75; + + invalid_auto_size_ctl.increment = 2.0; + + invalid_auto_size_ctl.apply_max_increment = TRUE; + invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); + + invalid_auto_size_ctl.flash_incr_mode = + H5C_flash_incr__add_space; + invalid_auto_size_ctl.flash_multiple = 0.09; /* INVALID */ + invalid_auto_size_ctl.flash_threshold = 0.5; + + + invalid_auto_size_ctl.decr_mode = H5C_decr__threshold; + + invalid_auto_size_ctl.upper_hr_threshold = 0.999; + + invalid_auto_size_ctl.decrement = 0.9; + + invalid_auto_size_ctl.apply_max_decrement = TRUE; + invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + invalid_auto_size_ctl.epochs_before_eviction = 3; + + invalid_auto_size_ctl.apply_empty_reserve = TRUE; + invalid_auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, + &invalid_auto_size_ctl); + + if ( result != FAIL ) { + + pass = FALSE; + failure_mssg = + "H5C_set_cache_auto_resize_config accepted bad flash_multiple(1).\n"; + } + } + + if ( pass ) { + + result = H5C_get_cache_auto_resize_config(cache_ptr, + &test_auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_auto_resize_config failed 20."; + + } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ + ref_auto_size_ctl, FALSE) ) { + + pass = FALSE; + failure_mssg = "Unexpected auto resize config 20."; + } + } + + if ( pass ) { + + invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + invalid_auto_size_ctl.rpt_fcn = NULL; + + invalid_auto_size_ctl.set_initial_size = TRUE; + invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; + + invalid_auto_size_ctl.min_clean_fraction = 0.1; + + invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; + invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; + + invalid_auto_size_ctl.epoch_length = 5000; + + + invalid_auto_size_ctl.incr_mode = H5C_incr__threshold; + + invalid_auto_size_ctl.lower_hr_threshold = 0.75; + + invalid_auto_size_ctl.increment = 2.0; + + invalid_auto_size_ctl.apply_max_increment = TRUE; + invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); + + invalid_auto_size_ctl.flash_incr_mode = + H5C_flash_incr__add_space; + invalid_auto_size_ctl.flash_multiple = 10.01; /* INVALID */ + invalid_auto_size_ctl.flash_threshold = 0.5; + + + invalid_auto_size_ctl.decr_mode = H5C_decr__threshold; + + invalid_auto_size_ctl.upper_hr_threshold = 0.999; + + invalid_auto_size_ctl.decrement = 0.9; + + invalid_auto_size_ctl.apply_max_decrement = TRUE; + invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + invalid_auto_size_ctl.epochs_before_eviction = 3; + + invalid_auto_size_ctl.apply_empty_reserve = TRUE; + invalid_auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, + &invalid_auto_size_ctl); + + if ( result != FAIL ) { + + pass = FALSE; + failure_mssg = + "H5C_set_cache_auto_resize_config accepted bad flash_multiple(2).\n"; + } + } + + if ( pass ) { + + result = H5C_get_cache_auto_resize_config(cache_ptr, + &test_auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_auto_resize_config failed 21."; + + } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ + ref_auto_size_ctl, FALSE) ) { + + pass = FALSE; + failure_mssg = "Unexpected auto resize config 21."; + } + } + + /* test for bad flash_threshold rejection */ + + if ( pass ) { + + invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + invalid_auto_size_ctl.rpt_fcn = NULL; + + invalid_auto_size_ctl.set_initial_size = TRUE; + invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; + + invalid_auto_size_ctl.min_clean_fraction = 0.1; + + invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; + invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; + + invalid_auto_size_ctl.epoch_length = 5000; + + + invalid_auto_size_ctl.incr_mode = H5C_incr__threshold; + + invalid_auto_size_ctl.lower_hr_threshold = 0.75; + + invalid_auto_size_ctl.increment = 2.0; + + invalid_auto_size_ctl.apply_max_increment = TRUE; + invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); + + invalid_auto_size_ctl.flash_incr_mode = + H5C_flash_incr__add_space; + invalid_auto_size_ctl.flash_multiple = 1.0; + invalid_auto_size_ctl.flash_threshold = 0.09; /* INVALID */ + + + invalid_auto_size_ctl.decr_mode = H5C_decr__threshold; + + invalid_auto_size_ctl.upper_hr_threshold = 0.999; + + invalid_auto_size_ctl.decrement = 0.9; + + invalid_auto_size_ctl.apply_max_decrement = TRUE; + invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + invalid_auto_size_ctl.epochs_before_eviction = 3; + + invalid_auto_size_ctl.apply_empty_reserve = TRUE; + invalid_auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, + &invalid_auto_size_ctl); + + if ( result != FAIL ) { + + pass = FALSE; + failure_mssg = + "H5C_set_cache_auto_resize_config accepted bad flash_threshold(1).\n"; + } + } + + if ( pass ) { + + result = H5C_get_cache_auto_resize_config(cache_ptr, + &test_auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_auto_resize_config failed 22."; + + } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ + ref_auto_size_ctl, FALSE) ) { + + pass = FALSE; + failure_mssg = "Unexpected auto resize config 22."; + } + } + + if ( pass ) { + + invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + invalid_auto_size_ctl.rpt_fcn = NULL; + + invalid_auto_size_ctl.set_initial_size = TRUE; + invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; + + invalid_auto_size_ctl.min_clean_fraction = 0.1; + + invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; + invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; + + invalid_auto_size_ctl.epoch_length = 5000; + + + invalid_auto_size_ctl.incr_mode = H5C_incr__threshold; + + invalid_auto_size_ctl.lower_hr_threshold = 0.75; + + invalid_auto_size_ctl.increment = 2.0; + + invalid_auto_size_ctl.apply_max_increment = TRUE; + invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); + + invalid_auto_size_ctl.flash_incr_mode = + H5C_flash_incr__add_space; + invalid_auto_size_ctl.flash_multiple = 1.0; + invalid_auto_size_ctl.flash_threshold = 1.001; /* INVALID */ + + + invalid_auto_size_ctl.decr_mode = H5C_decr__threshold; + + invalid_auto_size_ctl.upper_hr_threshold = 0.999; + + invalid_auto_size_ctl.decrement = 0.9; + + invalid_auto_size_ctl.apply_max_decrement = TRUE; + invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + invalid_auto_size_ctl.epochs_before_eviction = 3; + + invalid_auto_size_ctl.apply_empty_reserve = TRUE; + invalid_auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, + &invalid_auto_size_ctl); + + if ( result != FAIL ) { + + pass = FALSE; + failure_mssg = + "H5C_set_cache_auto_resize_config accepted bad flash_threshold(2).\n"; + } + } + + if ( pass ) { + + result = H5C_get_cache_auto_resize_config(cache_ptr, + &test_auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_auto_resize_config failed 23."; + + } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ + ref_auto_size_ctl, FALSE) ) { + + pass = FALSE; + failure_mssg = "Unexpected auto resize config 23."; + } + } + + + /* test for bad decr_mode rejection */ + + if ( pass ) { + + invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + invalid_auto_size_ctl.rpt_fcn = NULL; + + invalid_auto_size_ctl.set_initial_size = TRUE; + invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; + + invalid_auto_size_ctl.min_clean_fraction = 0.1; + + invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; + invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; + + invalid_auto_size_ctl.epoch_length = 5000; + + + invalid_auto_size_ctl.incr_mode = H5C_incr__threshold; + + invalid_auto_size_ctl.lower_hr_threshold = 0.75; + + invalid_auto_size_ctl.increment = 2.0; + + invalid_auto_size_ctl.apply_max_increment = TRUE; + invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); + + invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + invalid_auto_size_ctl.flash_multiple = 2.0; + invalid_auto_size_ctl.flash_threshold = 0.5; + + + invalid_auto_size_ctl.decr_mode = + (enum H5C_cache_decr_mode) -1; /* INVALID */ + + invalid_auto_size_ctl.upper_hr_threshold = 0.999; + + invalid_auto_size_ctl.decrement = 0.9; + + invalid_auto_size_ctl.apply_max_decrement = TRUE; + invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + invalid_auto_size_ctl.epochs_before_eviction = 3; + + invalid_auto_size_ctl.apply_empty_reserve = TRUE; + invalid_auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, + &invalid_auto_size_ctl); + + if ( result != FAIL ) { + + pass = FALSE; + failure_mssg = + "H5C_set_cache_auto_resize_config accepted bad decr_mode 1.\n"; + } + } + + if ( pass ) { + + result = H5C_get_cache_auto_resize_config(cache_ptr, + &test_auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_auto_resize_config failed 24."; + + } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ + ref_auto_size_ctl, FALSE) ) { + + pass = FALSE; + failure_mssg = "Unexpected auto resize config 24."; + } + } + + if ( pass ) { + + invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + invalid_auto_size_ctl.rpt_fcn = NULL; + + invalid_auto_size_ctl.set_initial_size = TRUE; + invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; + + invalid_auto_size_ctl.min_clean_fraction = 0.1; + + invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; + invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; + + invalid_auto_size_ctl.epoch_length = 5000; + + + invalid_auto_size_ctl.incr_mode = H5C_incr__threshold; + + invalid_auto_size_ctl.lower_hr_threshold = 0.75; + + invalid_auto_size_ctl.increment = 2.0; + + invalid_auto_size_ctl.apply_max_increment = TRUE; + invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); + + invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + invalid_auto_size_ctl.flash_multiple = 2.0; + invalid_auto_size_ctl.flash_threshold = 0.5; + + + invalid_auto_size_ctl.decr_mode = + (enum H5C_cache_decr_mode) 4; /* INVALID */ + + invalid_auto_size_ctl.upper_hr_threshold = 0.999; + + invalid_auto_size_ctl.decrement = 0.9; + + invalid_auto_size_ctl.apply_max_decrement = TRUE; + invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + invalid_auto_size_ctl.epochs_before_eviction = 3; + + invalid_auto_size_ctl.apply_empty_reserve = TRUE; + invalid_auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, + &invalid_auto_size_ctl); + + if ( result != FAIL ) { + + pass = FALSE; + failure_mssg = + "H5C_set_cache_auto_resize_config accepted bad decr_mode 2.\n"; + } + } + + if ( pass ) { + + result = H5C_get_cache_auto_resize_config(cache_ptr, + &test_auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_auto_resize_config failed 25."; + + } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ + ref_auto_size_ctl, FALSE) ) { + + pass = FALSE; + failure_mssg = "Unexpected auto resize config 25."; + } + } + + + /* check for bad decrement rejection */ + + if ( pass ) { + + invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + invalid_auto_size_ctl.rpt_fcn = NULL; + + invalid_auto_size_ctl.set_initial_size = TRUE; + invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; + + invalid_auto_size_ctl.min_clean_fraction = 0.1; + + invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; + invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; + + invalid_auto_size_ctl.epoch_length = 5000; + + + invalid_auto_size_ctl.incr_mode = H5C_incr__threshold; + + invalid_auto_size_ctl.lower_hr_threshold = 0.75; + + invalid_auto_size_ctl.increment = 2.0; + + invalid_auto_size_ctl.apply_max_increment = TRUE; + invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); + + invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + invalid_auto_size_ctl.flash_multiple = 2.0; + invalid_auto_size_ctl.flash_threshold = 0.5; + + + invalid_auto_size_ctl.decr_mode = H5C_decr__threshold; + + invalid_auto_size_ctl.upper_hr_threshold = 0.999; + + invalid_auto_size_ctl.decrement = 1.000001; /* INVALID */ + + invalid_auto_size_ctl.apply_max_decrement = TRUE; + invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + invalid_auto_size_ctl.epochs_before_eviction = 3; + + invalid_auto_size_ctl.apply_empty_reserve = TRUE; + invalid_auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, + &invalid_auto_size_ctl); + + if ( result != FAIL ) { + + pass = FALSE; + failure_mssg = + "H5C_set_cache_auto_resize_config accepted bad decrement 1.\n"; + } + } + + if ( pass ) { + + result = H5C_get_cache_auto_resize_config(cache_ptr, + &test_auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_auto_resize_config failed 26."; + + } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ + ref_auto_size_ctl, FALSE) ) { + + pass = FALSE; + failure_mssg = "Unexpected auto resize config 26."; + } + } + + if ( pass ) { + + invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + invalid_auto_size_ctl.rpt_fcn = NULL; + + invalid_auto_size_ctl.set_initial_size = TRUE; + invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; + + invalid_auto_size_ctl.min_clean_fraction = 0.1; + + invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; + invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; + + invalid_auto_size_ctl.epoch_length = 5000; + + + invalid_auto_size_ctl.incr_mode = H5C_incr__threshold; + + invalid_auto_size_ctl.lower_hr_threshold = 0.75; + + invalid_auto_size_ctl.increment = 2.0; + + invalid_auto_size_ctl.apply_max_increment = TRUE; + invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); + + invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + invalid_auto_size_ctl.flash_multiple = 2.0; + invalid_auto_size_ctl.flash_threshold = 0.5; + + + invalid_auto_size_ctl.decr_mode = H5C_decr__threshold; + + invalid_auto_size_ctl.upper_hr_threshold = 0.999; + + invalid_auto_size_ctl.decrement = -0.000001; /* INVALID */ + + invalid_auto_size_ctl.apply_max_decrement = TRUE; + invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + invalid_auto_size_ctl.epochs_before_eviction = 3; + + invalid_auto_size_ctl.apply_empty_reserve = TRUE; + invalid_auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, + &invalid_auto_size_ctl); + + if ( result != FAIL ) { + + pass = FALSE; + failure_mssg = + "H5C_set_cache_auto_resize_config accepted bad decrement 2.\n"; + } + } + + if ( pass ) { + + result = H5C_get_cache_auto_resize_config(cache_ptr, + &test_auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_auto_resize_config failed 27."; + + } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ + ref_auto_size_ctl, FALSE) ) { + + pass = FALSE; + failure_mssg = "Unexpected auto resize config 27."; + } + } + + + /* check for rejection of bad epochs_before_eviction */ + + if ( pass ) { + + invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + invalid_auto_size_ctl.rpt_fcn = NULL; + + invalid_auto_size_ctl.set_initial_size = TRUE; + invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; + + invalid_auto_size_ctl.min_clean_fraction = 0.1; + + invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; + invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; + + invalid_auto_size_ctl.epoch_length = 5000; + + + invalid_auto_size_ctl.incr_mode = H5C_incr__threshold; + + invalid_auto_size_ctl.lower_hr_threshold = 0.75; + + invalid_auto_size_ctl.increment = 2.0; + + invalid_auto_size_ctl.apply_max_increment = TRUE; + invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); + + invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + invalid_auto_size_ctl.flash_multiple = 2.0; + invalid_auto_size_ctl.flash_threshold = 0.5; + + + invalid_auto_size_ctl.decr_mode = H5C_decr__age_out; + + invalid_auto_size_ctl.upper_hr_threshold = 0.999; + + invalid_auto_size_ctl.decrement = 0.9; + + invalid_auto_size_ctl.apply_max_decrement = TRUE; + invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + invalid_auto_size_ctl.epochs_before_eviction = 0; /* INVALID */ + + invalid_auto_size_ctl.apply_empty_reserve = TRUE; + invalid_auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, + &invalid_auto_size_ctl); + + if ( result != FAIL ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config accepted bad epochs_before_eviction 1.\n"; + } + } + + if ( pass ) { + + result = H5C_get_cache_auto_resize_config(cache_ptr, + &test_auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_auto_resize_config failed 28."; + + } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ + ref_auto_size_ctl, FALSE) ) { + + pass = FALSE; + failure_mssg = "Unexpected auto resize config 28."; + } + } + + if ( pass ) { + + invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + invalid_auto_size_ctl.rpt_fcn = NULL; + + invalid_auto_size_ctl.set_initial_size = TRUE; + invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; + + invalid_auto_size_ctl.min_clean_fraction = 0.1; + + invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; + invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; + + invalid_auto_size_ctl.epoch_length = 5000; + + + invalid_auto_size_ctl.incr_mode = H5C_incr__threshold; + + invalid_auto_size_ctl.lower_hr_threshold = 0.75; + + invalid_auto_size_ctl.increment = 2.0; + + invalid_auto_size_ctl.apply_max_increment = TRUE; + invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); + + invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + invalid_auto_size_ctl.flash_multiple = 2.0; + invalid_auto_size_ctl.flash_threshold = 0.5; + + + invalid_auto_size_ctl.decr_mode = H5C_decr__age_out_with_threshold; + + invalid_auto_size_ctl.upper_hr_threshold = 0.999; + + invalid_auto_size_ctl.decrement = 0.9; + + invalid_auto_size_ctl.apply_max_decrement = TRUE; + invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + invalid_auto_size_ctl.epochs_before_eviction = + H5C__MAX_EPOCH_MARKERS + 1; /* INVALID */ + + invalid_auto_size_ctl.apply_empty_reserve = TRUE; + invalid_auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, + &invalid_auto_size_ctl); + + if ( result != FAIL ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config accepted bad epochs_before_eviction 2.\n"; + } + } + + if ( pass ) { + + result = H5C_get_cache_auto_resize_config(cache_ptr, + &test_auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_auto_resize_config failed 29."; + + } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ + ref_auto_size_ctl, FALSE) ) { + + pass = FALSE; + failure_mssg = "Unexpected auto resize config 29."; + } + } + + + /* Check for bad apply_empty_reserve rejection */ + + if ( pass ) { + + invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + invalid_auto_size_ctl.rpt_fcn = NULL; + + invalid_auto_size_ctl.set_initial_size = TRUE; + invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; + + invalid_auto_size_ctl.min_clean_fraction = 0.1; + + invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; + invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; + + invalid_auto_size_ctl.epoch_length = 5000; + + + invalid_auto_size_ctl.incr_mode = H5C_incr__threshold; + + invalid_auto_size_ctl.lower_hr_threshold = 0.75; + + invalid_auto_size_ctl.increment = 2.0; + + invalid_auto_size_ctl.apply_max_increment = TRUE; + invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); + + invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + invalid_auto_size_ctl.flash_multiple = 2.0; + invalid_auto_size_ctl.flash_threshold = 0.5; + + + invalid_auto_size_ctl.decr_mode = H5C_decr__age_out; + + invalid_auto_size_ctl.upper_hr_threshold = 0.999; + + invalid_auto_size_ctl.decrement = 0.9; + + invalid_auto_size_ctl.apply_max_decrement = TRUE; + invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + invalid_auto_size_ctl.epochs_before_eviction = 3; + + invalid_auto_size_ctl.apply_empty_reserve = TRUE; + invalid_auto_size_ctl.empty_reserve = -0.0000001; /* INVALID */ + + result = H5C_set_cache_auto_resize_config(cache_ptr, + &invalid_auto_size_ctl); + + if ( result != FAIL ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config accepted bad empty_reserve 1.\n"; + } + } + + if ( pass ) { + + result = H5C_get_cache_auto_resize_config(cache_ptr, + &test_auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_auto_resize_config failed 30."; + + } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ + ref_auto_size_ctl, FALSE) ) { + + pass = FALSE; + failure_mssg = "Unexpected auto resize config 30."; + } + } + + if ( pass ) { + + invalid_auto_size_ctl.version = H5C__CURR_AUTO_SIZE_CTL_VER; + invalid_auto_size_ctl.rpt_fcn = NULL; + + invalid_auto_size_ctl.set_initial_size = TRUE; + invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; + + invalid_auto_size_ctl.min_clean_fraction = 0.1; + + invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; + invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; + + invalid_auto_size_ctl.epoch_length = 5000; + + + invalid_auto_size_ctl.incr_mode = H5C_incr__threshold; + + invalid_auto_size_ctl.lower_hr_threshold = 0.75; + + invalid_auto_size_ctl.increment = 2.0; + + invalid_auto_size_ctl.apply_max_increment = TRUE; + invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); + + invalid_auto_size_ctl.flash_incr_mode = H5C_flash_incr__off; + invalid_auto_size_ctl.flash_multiple = 2.0; + invalid_auto_size_ctl.flash_threshold = 0.5; + + + invalid_auto_size_ctl.decr_mode = H5C_decr__age_out_with_threshold; + + invalid_auto_size_ctl.upper_hr_threshold = 0.999; + + invalid_auto_size_ctl.decrement = 0.9; + + invalid_auto_size_ctl.apply_max_decrement = TRUE; + invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); + + invalid_auto_size_ctl.epochs_before_eviction = + H5C__MAX_EPOCH_MARKERS + 1; /* INVALID */ + + invalid_auto_size_ctl.apply_empty_reserve = TRUE; + invalid_auto_size_ctl.empty_reserve = 0.05; + + result = H5C_set_cache_auto_resize_config(cache_ptr, + &invalid_auto_size_ctl); + + if ( result != FAIL ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config accepted bad empty_reserve 2.\n"; + } + } + + if ( pass ) { + + result = H5C_get_cache_auto_resize_config(cache_ptr, + &test_auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_auto_resize_config failed 31."; + + } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ + ref_auto_size_ctl, FALSE) ) { + + pass = FALSE; + failure_mssg = "Unexpected auto resize config 31."; + } + } + + + /* finally, before we finish, try feeding + * H5C_get_cache_auto_resize_config invalid data. + */ + + if ( pass ) { + + result = H5C_get_cache_auto_resize_config(NULL, &test_auto_size_ctl); + + if ( result != FAIL ) { + + pass = FALSE; + failure_mssg = + "H5C_get_cache_auto_resize_config accepted NULL cache_ptr.\n"; + } + } + + if ( pass ) { + + result = H5C_get_cache_auto_resize_config((const H5C_t *)&test_auto_size_ctl, + &test_auto_size_ctl); + + if ( result != FAIL ) { + + pass = FALSE; + failure_mssg = + "H5C_get_cache_auto_resize_config accepted bad cache_ptr.\n"; + } + } + + if ( pass ) { + + result = H5C_get_cache_auto_resize_config(cache_ptr, NULL); + + if ( result != FAIL ) { + + pass = FALSE; + failure_mssg = + "H5C_get_cache_auto_resize_config accepted NULL config ptr.\n"; + } + } + + if ( pass ) { + + takedown_cache(file_ptr, FALSE, FALSE); + } + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + if ( core_file_driver_failed ) { + + HDfprintf(stdout, + "%s(): Unable to open test file with core file driver.\n", + fcn_name); + } + + return !pass; + +} /* check_auto_cache_resize_input_errs() */ + + +/*------------------------------------------------------------------------- + * Function: check_auto_cache_resize_aux_fcns() + * + * Purpose: Verify that the auxilary functions associated with + * the automatic cache resize capability are operating + * correctly. These functions are: + * + * H5C_get_cache_size() + * H5C_get_cache_hit_rate() + * H5C_reset_cache_hit_rate_stats() + * + * Return: void + * + * Programmer: John Mainzer + * 11/4/04 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +static unsigned +check_auto_cache_resize_aux_fcns(void) +{ + const char * fcn_name = "check_auto_cache_resize_aux_fcns()"; + herr_t result; + int32_t i; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + double hit_rate; + size_t max_size; + size_t min_clean_size; + size_t cur_size; + int32_t cur_num_entries; + H5C_auto_size_ctl_t auto_size_ctl = + { + /* int32_t version = */ H5C__CURR_AUTO_SIZE_CTL_VER, +#if 1 + /* H5C_auto_resize_report_fcn rpt_fcn = */ NULL, +#else + /* H5C_auto_resize_report_fcn rpt_fcn = */ H5C_def_auto_resize_rpt_fcn, +#endif + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024), + + /* double min_clean_fraction = */ 0.5, + + /* size_t max_size = */ (16 * 1024 * 1025), + /* size_t min_size = */ (512 * 1024), + + /* int64_t epoch_length = */ 50000, + + + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__off, + + /* double lower_hr_threshold = */ 0.75, + + /* double increment = */ 2.0, + + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + + + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__off, + + /* double upper_hr_threshold = */ 0.995, + + /* double decrement = */ 0.9, + + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + + /* int32_t epochs_before_eviction = */ 3, + + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.5 + }; + + + TESTING("automatic cache resize auxilary functions"); + + core_file_driver_failed = FALSE; + + pass = TRUE; + + /* allocate a cache, and then test the various auxilary functions. + */ + + if ( pass ) { + + reset_entries(); + + file_ptr = setup_cache((size_t)(2 * 1024), + (size_t)(1 * 1024)); + cache_ptr = file_ptr->shared->cache; + } + + if ( pass ) { + + result = H5C_set_cache_auto_resize_config(cache_ptr, + &auto_size_ctl); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_set_cache_auto_resize_config failed 1.\n"; + } + } + + if ( pass ) { + + if ( ( cache_ptr->max_cache_size != (1 * 1024 * 1024) ) || + ( cache_ptr->min_clean_size != (512 * 1024) ) ) { + + pass = FALSE; + failure_mssg = "bad cache size after initialization.\n"; + } + } + + /* lets start with the H5C_get_cache_hit_rate(), + * H5C_reset_cache_hit_rate_stats() pair. + */ + + if ( pass ) { + + if ( ( H5C_get_cache_hit_rate(NULL, &hit_rate) != FAIL ) || + ( H5C_get_cache_hit_rate(cache_ptr, NULL) != FAIL ) ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_hit_rate accepts bad params.\n"; + } + } + + if ( pass ) { + + result = H5C_get_cache_hit_rate(cache_ptr, &hit_rate); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_hit_rate failed.\n"; + + } else if ( hit_rate != 0.0 ) { + + pass = FALSE; + failure_mssg = + "H5C_get_cache_hit_rate returned unexpected hit rate 1.\n"; + } + } + + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, PICO_ENTRY_TYPE, i); + + if ( pass ) { + + unprotect_entry(file_ptr, PICO_ENTRY_TYPE, i, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + } + + if ( pass ) { + + result = H5C_get_cache_hit_rate(cache_ptr, &hit_rate); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_hit_rate failed.\n"; + + } else if ( hit_rate != 0.0 ) { + + pass = FALSE; + failure_mssg = + "H5C_get_cache_hit_rate returned unexpected hit rate 2.\n"; + + } else if ( ( cache_ptr->cache_accesses != 1000 ) || + ( cache_ptr->cache_hits != 0 ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache hit rate stats.\n"; + + } else if ( rpt_fcn_called ) { + + pass = FALSE; + failure_mssg = "Report function called?.\n"; + + } + } + + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, PICO_ENTRY_TYPE, 0); + + if ( pass ) { + + unprotect_entry(file_ptr, PICO_ENTRY_TYPE, 0, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + } + + if ( pass ) { + + result = H5C_get_cache_hit_rate(cache_ptr, &hit_rate); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_hit_rate failed.\n"; + + } else if ( ! DBL_REL_EQUAL(hit_rate, 0.5, 0.00001) ) { + + pass = FALSE; + failure_mssg = + "H5C_get_cache_hit_rate returned unexpected hit rate 3.\n"; + + } else if ( ( cache_ptr->cache_accesses != 2000 ) || + ( cache_ptr->cache_hits != 1000 ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache hit rate stats.\n"; + + } else if ( rpt_fcn_called ) { + + pass = FALSE; + failure_mssg = "Report function called?.\n"; + + } + } + + if ( pass ) { + + result = H5C_reset_cache_hit_rate_stats(NULL); + + if ( result != FAIL ) { + + pass = FALSE; + failure_mssg = + "H5C_reset_cache_hit_rate_stats accepted NULL cache_ptr.\n"; + + } else if ( ( cache_ptr->cache_accesses != 2000 ) || + ( cache_ptr->cache_hits != 1000 ) ) { + + pass = FALSE; + failure_mssg = + "Failed call to H5C_reset_cache_hit_rate_stats altered stats?\n"; + } + } + + if ( pass ) { + + result = H5C_reset_cache_hit_rate_stats(cache_ptr); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_reset_cache_hit_rate_stats failed.\n"; + + } else if ( ( cache_ptr->cache_accesses != 0 ) || + ( cache_ptr->cache_hits != 0 ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache hit rate stats.\n"; + + } + } + + if ( pass ) { + + rpt_fcn_called = FALSE; + i = 0; + while ( ( pass ) && ( i < 1000 ) ) + { + protect_entry(file_ptr, PICO_ENTRY_TYPE, i + 500); + + if ( pass ) { + + unprotect_entry(file_ptr, PICO_ENTRY_TYPE, i + 500, + NO_CHANGE, H5C__NO_FLAGS_SET); + } + i++; + } + } + + + if ( pass ) { + + result = H5C_get_cache_hit_rate(cache_ptr, &hit_rate); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_hit_rate failed.\n"; + + } else if ( ! DBL_REL_EQUAL(hit_rate, 0.5, 0.00001) ) { + + pass = FALSE; + failure_mssg = + "H5C_get_cache_hit_rate returned unexpected hit rate 4.\n"; + + } else if ( ( cache_ptr->cache_accesses != 1000 ) || + ( cache_ptr->cache_hits != 500 ) ) { + + pass = FALSE; + failure_mssg = "Unexpected cache hit rate stats.\n"; + + } else if ( rpt_fcn_called ) { + + pass = FALSE; + failure_mssg = "Report function called?.\n"; + + } + } + + /*************************************************** + * So much for testing H5C_get_cache_hit_rate() and + * H5C_reset_cache_hit_rate_stats(). Now on to + * H5C_get_cache_size(). + ***************************************************/ + + if ( pass ) { + + result = H5C_get_cache_size(NULL, &max_size, &min_clean_size, + &cur_size, &cur_num_entries); + + if ( result != FAIL ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_size accepted NULL cache_ptr.\n"; + } + } + + if ( pass ) { + + max_size = 0; + min_clean_size = 0; + cur_size = 0; + cur_num_entries = 0; + + result = H5C_get_cache_size(cache_ptr, &max_size, &min_clean_size, + &cur_size, &cur_num_entries); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_size failed 1.\n"; + + } else if ( max_size != (1 * 1024 * 1024) ) { + + pass = FALSE; + failure_mssg = + "H5C_get_cache_size reports unexpected max_size 1.\n"; + + } else if ( min_clean_size != (512 * 1024) ) { + + pass = FALSE; + failure_mssg = + "H5C_get_cache_size reports unexpected min_clean_size 1.\n"; + + } else if ( cur_size != (1500 * PICO_ENTRY_SIZE) ) { + + pass = FALSE; + failure_mssg = + "H5C_get_cache_size reports unexpected cur_size 1.\n"; + + } else if ( cur_num_entries != 1500 ) { + + pass = FALSE; + failure_mssg = + "H5C_get_cache_size reports unexpected cur_num_entries 1.\n"; + } + } + + /* read a larger entry so that cur_size and cur_num_entries will be + * different. + */ + if ( pass ) { + + protect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0); + } + + if ( pass ) { + unprotect_entry(file_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, + H5C__NO_FLAGS_SET); + } + + if ( pass ) { + + max_size = 0; + min_clean_size = 0; + cur_size = 0; + cur_num_entries = 0; + + result = H5C_get_cache_size(cache_ptr, &max_size, &min_clean_size, + &cur_size, &cur_num_entries); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_size failed 2.\n"; + + } else if ( max_size != (1 * 1024 * 1024) ) { + + pass = FALSE; + failure_mssg = + "H5C_get_cache_size reports unexpected max_size 2.\n"; + + } else if ( min_clean_size != (512 * 1024) ) { + + pass = FALSE; + failure_mssg = + "H5C_get_cache_size reports unexpected min_clean_size 2.\n"; + + } else if ( cur_size != + ((1500 * PICO_ENTRY_SIZE) + MONSTER_ENTRY_SIZE) ) { + + pass = FALSE; + failure_mssg = + "H5C_get_cache_size reports unexpected cur_size 2.\n"; + + } else if ( cur_num_entries != 1501 ) { + + pass = FALSE; + failure_mssg = + "H5C_get_cache_size reports unexpected cur_num_entries 2.\n"; + } + } + + if ( pass ) { + + max_size = 0; + min_clean_size = 0; + cur_size = 0; + cur_num_entries = 0; + + result = H5C_get_cache_size(cache_ptr, &max_size, NULL, NULL, NULL); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_size failed 3.\n"; + + } else if ( max_size != (1 * 1024 * 1024) ) { + + pass = FALSE; + failure_mssg = + "H5C_get_cache_size reports unexpected max_size 3.\n"; + + } else if ( ( min_clean_size != 0 ) || + ( cur_size != 0 ) || + ( cur_num_entries != 0 ) ) { + + pass = FALSE; + failure_mssg = "Phantom returns from H5C_get_cache_size?\n"; + + } + } + + if ( pass ) { + + max_size = 0; + min_clean_size = 0; + cur_size = 0; + cur_num_entries = 0; + + result = H5C_get_cache_size(cache_ptr, NULL, &min_clean_size, + NULL, NULL); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_size failed 4.\n"; + + } else if ( min_clean_size != (512 * 1024) ) { + + pass = FALSE; + failure_mssg = + "H5C_get_cache_size reports unexpected min_clean_size 4.\n"; + + } else if ( ( max_size != 0 ) || + ( cur_size != 0 ) || + ( cur_num_entries != 0 ) ) { + + pass = FALSE; + failure_mssg = "Phantom returns from H5C_get_cache_size?\n"; + + } + } + + if ( pass ) { + + max_size = 0; + min_clean_size = 0; + cur_size = 0; + cur_num_entries = 0; + + result = H5C_get_cache_size(cache_ptr, NULL, NULL, &cur_size, NULL); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_size failed 5.\n"; + + } else if ( cur_size != + ((1500 * PICO_ENTRY_SIZE) + MONSTER_ENTRY_SIZE) ) { + + pass = FALSE; + failure_mssg = + "H5C_get_cache_size reports unexpected cur_size 5.\n"; + + } else if ( ( max_size != 0 ) || + ( min_clean_size != 0 ) || + ( cur_num_entries != 0 ) ) { + + pass = FALSE; + failure_mssg = "Phantom returns from H5C_get_cache_size?\n"; + + } + } + + if ( pass ) { + + max_size = 0; + min_clean_size = 0; + cur_size = 0; + cur_num_entries = 0; + + result = H5C_get_cache_size(cache_ptr, NULL, NULL, NULL, + &cur_num_entries); + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_get_cache_size failed 6.\n"; + + } else if ( cur_num_entries != 1501 ) { + + pass = FALSE; + failure_mssg = + "H5C_get_cache_size reports unexpected cur_num_entries 2.\n"; + + } else if ( ( max_size != 0 ) || + ( min_clean_size != 0 ) || + ( cur_size != 0 ) ) { + + pass = FALSE; + failure_mssg = "Phantom returns from H5C_get_cache_size?\n"; + + } + } + + if ( pass ) { + + takedown_cache(file_ptr, FALSE, FALSE); + } + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + if ( core_file_driver_failed ) { + + HDfprintf(stdout, + "%s(): Unable to open test file with core file driver.\n", + fcn_name); + } + + return !pass; + +} /* check_auto_cache_resize_aux_fcns() */ + + +/*------------------------------------------------------------------------- + * Function: main + * + * Purpose: Run tests on the cache code contained in H5C.c + * + * Return: Success: + * + * Failure: + * + * Programmer: John Mainzer + * 6/24/04 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +int +main(void) +{ + hbool_t core_file_forced = FALSE; + hbool_t regular_file_forced = FALSE; + hbool_t core_file_driver_recommended = FALSE; + const char *envval = NULL; + unsigned nerrs = 0; + + core_file_driver_recommended = recommend_core_file_driver(); + + try_core_file_driver = core_file_driver_recommended; + + H5open(); + + express_test = GetTestExpress(); + + if ( express_test >= 3 ) { + + skip_long_tests = TRUE; + + } else { + + skip_long_tests = FALSE; + } + + envval = HDgetenv("HDF5_DRIVER"); + + if ( envval != NULL ) { + + if ( HDstrcmp(envval, "core") == 0 ) { + + core_file_forced = TRUE; + try_core_file_driver = TRUE; + + } else { + + regular_file_forced = TRUE; + try_core_file_driver = FALSE; + + } + } + + printf("=========================================\n"); + printf("Internal cache tests\n"); + printf(" express_test = %d\n", express_test); + printf(" skip_long_tests = %d\n", (int)skip_long_tests); + printf(" regular_file_forced = %d\n", (int)regular_file_forced); + printf(" core_file_forced = %d\n", (int)core_file_forced); + printf(" core_file_driver_recommended = %d\n", + (int)core_file_driver_recommended); + printf(" try_core_file_driver = %d\n", (int)try_core_file_driver); + printf("=========================================\n"); + + if ( try_core_file_driver ) { + + printf("\n"); + printf("All the longer cache tests will attempt to use the core file\n"); + printf("driver in an attempt to avoid disk I/O and thereby run the\n"); + printf("tests faster. If a test is unable to to do so, it will\n"); + printf("attempt to run the test using a regular file, and will note\n"); + printf("this fact at test completion.\n"); + printf("\n"); + printf("Shorter tests never attempt to use the core file driver\n"); + printf("as the overhead exceeds the gain\n"); + printf("\n"); + printf("In general, running the longer cache tests with the core\n"); + printf("file driver should speed up the tests significantly.\n"); + printf("However, if the available physical ram is less than 2 GB,\n"); + printf("it may slow the tests down instead.\n"); + printf("\n"); + } + +#if 1 + nerrs += smoke_check_1(); + nerrs += smoke_check_2(); + nerrs += smoke_check_3(); + nerrs += smoke_check_4(); + nerrs += smoke_check_5(); + nerrs += smoke_check_6(); + nerrs += smoke_check_7(); + nerrs += smoke_check_8(); + nerrs += smoke_check_9(); + nerrs += smoke_check_10(); +#endif +#if 1 + nerrs += write_permitted_check(); +#endif + /* for shorter tests, the overhead of using the core file driver doesn't + * seem to allow us to realize any significant time saveings. Thus + * set try_core_file_driver to FALSE for the remaining tests. + */ + try_core_file_driver = FALSE; + + nerrs += check_insert_entry(); + nerrs += check_flush_cache(); + nerrs += check_get_entry_status(); + nerrs += check_expunge_entry(); + nerrs += check_multiple_read_protect(); + nerrs += check_rename_entry(); + nerrs += check_pin_protected_entry(); + nerrs += check_resize_entry(); + nerrs += check_evictions_enabled(); + nerrs += check_flush_protected_err(); + nerrs += check_destroy_pinned_err(); + nerrs += check_destroy_protected_err(); + nerrs += check_duplicate_insert_err(); + nerrs += check_rename_err(); + nerrs += check_double_pin_err(); + nerrs += check_double_unpin_err(); + nerrs += check_pin_entry_errs(); + nerrs += check_double_protect_err(); + nerrs += check_double_unprotect_err(); + nerrs += check_mark_entry_dirty_errs(); + nerrs += check_expunge_entry_errs(); + nerrs += check_resize_entry_errs(); + nerrs += check_unprotect_ro_dirty_err(); + nerrs += check_protect_ro_rw_err(); + nerrs += check_check_evictions_enabled_err(); + nerrs += check_auto_cache_resize(); + nerrs += check_auto_cache_resize_disable(); + nerrs += check_auto_cache_resize_epoch_markers(); + nerrs += check_auto_cache_resize_input_errs(); + nerrs += check_auto_cache_resize_aux_fcns(); + + return( nerrs > 0 ); + +} /* main() */ diff --git a/test/cache1.c b/test/cache1.c index 230b547..0422525 100644 --- a/test/cache1.c +++ b/test/cache1.c @@ -36,23 +36,23 @@ static void smoke_check_7(void); static void smoke_check_8(void); static void smoke_check_9(void); static void smoke_check_10(void); -static void write_permitted_check(void); -static void check_insert_entry(void); -static void check_flush_cache(void); -static void check_flush_cache__empty_cache(H5C1_t * cache_ptr); -static void check_flush_cache__multi_entry(H5C1_t * cache_ptr); -static void check_flush_cache__multi_entry_test(H5C1_t * cache_ptr, +static void write_permitted1_check(void); +static void check_insert_entry1(void); +static void check_flush_cache1(void); +static void check_flush_cache1__empty_cache(H5C1_t * cache_ptr); +static void check_flush_cache1__multi_entry(H5C1_t * cache_ptr); +static void check_flush_cache1__multi_entry_test(H5C1_t * cache_ptr, int test_num, unsigned int flush_flags, int spec_size, struct flush_cache_test_spec spec[]); -static void check_flush_cache__pe_multi_entry_test(H5C1_t * cache_ptr, +static void check_flush_cache1__pe_multi_entry_test(H5C1_t * cache_ptr, int test_num, unsigned int flush_flags, int spec_size, struct pe_flush_cache_test_spec spec[]); -static void check_flush_cache__single_entry(H5C1_t * cache_ptr); -static void check_flush_cache__single_entry_test(H5C1_t * cache_ptr, +static void check_flush_cache1__single_entry(H5C1_t * cache_ptr); +static void check_flush_cache1__single_entry_test(H5C1_t * cache_ptr, int test_num, int entry_type, int entry_idx, @@ -64,7 +64,7 @@ static void check_flush_cache__single_entry_test(H5C1_t * cache_ptr, hbool_t expected_cleared, hbool_t expected_flushed, hbool_t expected_destroyed); -static void check_flush_cache__pinned_single_entry_test(H5C1_t * cache_ptr, +static void check_flush_cache1__pinned_single_entry_test(H5C1_t * cache_ptr, int test_num, int entry_type, int entry_idx, @@ -78,8 +78,8 @@ static void check_flush_cache__pinned_single_entry_test(H5C1_t * cache_ptr, hbool_t expected_cleared, hbool_t expected_flushed, hbool_t expected_destroyed); -static void check_flush_cache__flush_ops(H5C1_t * cache_ptr); -static void check_flush_cache__flush_op_test(H5C1_t * cache_ptr, +static void check_flush_cache1__flush_ops(H5C1_t * cache_ptr); +static void check_flush_cache1__flush_op_test(H5C1_t * cache_ptr, int test_num, unsigned int flush_flags, int spec_size, @@ -90,16 +90,16 @@ static void check_flush_cache__flush_op_test(H5C1_t * cache_ptr, size_t expected_index_size, int check_size, struct fo_flush_entry_check check[]); -static void check_flush_cache__flush_op_eviction_test(H5C1_t * cache_ptr); +static void check_flush_cache1__flush_op_eviction_test(H5C1_t * cache_ptr); static void check_flush_protected_err(void); static void check_get_entry_status(void); -static void check_expunge_entry(void); +static void check_expunge_entry1(void); static void check_multiple_read_protect(void); -static void check_rename_entry(void); -static void check_rename_entry__run_test(H5C1_t * cache_ptr, int test_num, +static void check_rename_entry1(void); +static void check_rename_entry1__run_test(H5C1_t * cache_ptr, int test_num, struct rename_entry_test_spec * spec_ptr); -static void check_pin_protected_entry(void); -static void check_resize_entry(void); +static void check_pin_protected_entry1(void); +static void check_resize_entry1(void); static void check_evictions_enabled(void); static void check_destroy_pinned_err(void); static void check_destroy_protected_err(void); @@ -111,8 +111,8 @@ static void check_pin_entry_errs(void); static void check_double_protect_err(void); static void check_double_unprotect_err(void); static void check_mark_entry_dirty_errs(void); -static void check_expunge_entry_errs(void); -static void check_resize_entry_errs(void); +static void check_expunge_entry1_errs(void); +static void check_resize_entry1_errs(void); static void check_unprotect_ro_dirty_err(void); static void check_protect_ro_rw_err(void); static void check_check_evictions_enabled_err(void); @@ -144,7 +144,7 @@ static void check_auto_cache_resize_aux_fcns(void); * Modifications: * * JRM -- 1/18/05 - * Added code to skip this test if the skip_long_tests global + * Added code to skip this test if the skip_long_tests1 global * is true. * *------------------------------------------------------------------------- @@ -165,7 +165,7 @@ smoke_check_1(void) TESTING("smoke check #1 -- all clean, ins, dest, ren, 4/2 MB cache"); - if ( skip_long_tests ) { + if ( skip_long_tests1 ) { SKIPPED(); @@ -174,26 +174,26 @@ smoke_check_1(void) return; } - pass = TRUE; + pass1 = TRUE; if ( show_progress ) /* 1 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - reset_entries(); + reset_entries1(); if ( show_progress ) /* 2 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - cache_ptr = setup_cache((size_t)(4 * 1024 * 1024), + cache_ptr = setup_cache1((size_t)(4 * 1024 * 1024), (size_t)(2 * 1024 * 1024)); if ( show_progress ) /* 3 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - row_major_scan_forward(/* cache_ptr */ cache_ptr, + row_major_scan_forward1(/* cache_ptr */ cache_ptr, /* lag */ lag, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -209,10 +209,10 @@ smoke_check_1(void) /* dirty_unprotects */ dirty_unprotects); if ( show_progress ) /* 4 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - row_major_scan_backward(/* cache_ptr */ cache_ptr, + row_major_scan_backward1(/* cache_ptr */ cache_ptr, /* lag */ lag, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -228,10 +228,10 @@ smoke_check_1(void) /* dirty_unprotects */ dirty_unprotects); if ( show_progress ) /* 5 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - row_major_scan_forward(/* cache_ptr */ cache_ptr, + row_major_scan_forward1(/* cache_ptr */ cache_ptr, /* lag */ lag, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -247,21 +247,21 @@ smoke_check_1(void) /* dirty_unprotects */ dirty_unprotects); if ( show_progress ) /* 6 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* flush and destroy all entries in the cache: */ - flush_cache(/* cache_ptr */ cache_ptr, + flush_cache1(/* cache_ptr */ cache_ptr, /* destroy_entries */ TRUE, /* dump_stats */ FALSE, /* dump_detailed_stats */ FALSE); if ( show_progress ) /* 7 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - col_major_scan_forward(/* cache_ptr */ cache_ptr, + col_major_scan_forward1(/* cache_ptr */ cache_ptr, /* lag */ lag, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -272,21 +272,21 @@ smoke_check_1(void) /* dirty_unprotects */ dirty_unprotects); if ( show_progress ) /* 8 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* flush all entries in the cache: */ - flush_cache(/* cache_ptr */ cache_ptr, + flush_cache1(/* cache_ptr */ cache_ptr, /* destroy_entries */ FALSE, /* dump_stats */ FALSE, /* dump_detailed_stats */ FALSE); if ( show_progress ) /* 9 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - col_major_scan_backward(/* cache_ptr */ cache_ptr, + col_major_scan_backward1(/* cache_ptr */ cache_ptr, /* lag */ lag, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -297,24 +297,24 @@ smoke_check_1(void) /* dirty_unprotects */ dirty_unprotects); if ( show_progress ) /* 10 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - takedown_cache(cache_ptr, display_stats, TRUE); + takedown_cache1(cache_ptr, display_stats, TRUE); if ( show_progress ) /* 11 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - verify_clean(); - verify_unprotected(); + verify_clean1(); + verify_unprotected1(); - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) { + if ( ! pass1 ) { - HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + HDfprintf(stdout, "%s(): failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } return; @@ -338,7 +338,7 @@ smoke_check_1(void) * Modifications: * * JRM -- 1/18/05 - * Added code to skip this test if the skip_long_tests global + * Added code to skip this test if the skip_long_tests1 global * is true. * *------------------------------------------------------------------------- @@ -359,7 +359,7 @@ smoke_check_2(void) TESTING("smoke check #2 -- ~1/2 dirty, ins, dest, ren, 4/2 MB cache"); - if ( skip_long_tests ) { + if ( skip_long_tests1 ) { SKIPPED(); @@ -368,26 +368,26 @@ smoke_check_2(void) return; } - pass = TRUE; + pass1 = TRUE; if ( show_progress ) /* 1 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - reset_entries(); + reset_entries1(); if ( show_progress ) /* 2 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - cache_ptr = setup_cache((size_t)(4 * 1024 * 1024), + cache_ptr = setup_cache1((size_t)(4 * 1024 * 1024), (size_t)(2 * 1024 * 1024)); if ( show_progress ) /* 3 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - row_major_scan_forward(/* cache_ptr */ cache_ptr, + row_major_scan_forward1(/* cache_ptr */ cache_ptr, /* lag */ lag, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -403,10 +403,10 @@ smoke_check_2(void) /* dirty_unprotects */ dirty_unprotects); if ( show_progress ) /* 4 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - row_major_scan_backward(/* cache_ptr */ cache_ptr, + row_major_scan_backward1(/* cache_ptr */ cache_ptr, /* lag */ lag, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -422,10 +422,10 @@ smoke_check_2(void) /* dirty_unprotects */ dirty_unprotects); if ( show_progress ) /* 5 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - row_major_scan_forward(/* cache_ptr */ cache_ptr, + row_major_scan_forward1(/* cache_ptr */ cache_ptr, /* lag */ lag, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -441,21 +441,21 @@ smoke_check_2(void) /* dirty_unprotects */ dirty_unprotects); if ( show_progress ) /* 6 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* flush and destroy all entries in the cache: */ - flush_cache(/* cache_ptr */ cache_ptr, + flush_cache1(/* cache_ptr */ cache_ptr, /* destroy_entries */ TRUE, /* dump_stats */ FALSE, /* dump_detailed_stats */ FALSE); if ( show_progress ) /* 7 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - col_major_scan_forward(/* cache_ptr */ cache_ptr, + col_major_scan_forward1(/* cache_ptr */ cache_ptr, /* lag */ lag, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -466,21 +466,21 @@ smoke_check_2(void) /* dirty_unprotects */ dirty_unprotects); if ( show_progress ) /* 8 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* flush all entries in the cache: */ - flush_cache(/* cache_ptr */ cache_ptr, + flush_cache1(/* cache_ptr */ cache_ptr, /* destroy_entries */ FALSE, /* dump_stats */ FALSE, /* dump_detailed_stats */ FALSE); if ( show_progress ) /* 9 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - col_major_scan_backward(/* cache_ptr */ cache_ptr, + col_major_scan_backward1(/* cache_ptr */ cache_ptr, /* lag */ lag, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -491,24 +491,24 @@ smoke_check_2(void) /* dirty_unprotects */ dirty_unprotects); if ( show_progress ) /* 10 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - takedown_cache(cache_ptr, display_stats, TRUE); + takedown_cache1(cache_ptr, display_stats, TRUE); if ( show_progress ) /* 11 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - verify_clean(); - verify_unprotected(); + verify_clean1(); + verify_unprotected1(); - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) { + if ( ! pass1 ) { - HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + HDfprintf(stdout, "%s(): failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } return; @@ -531,7 +531,7 @@ smoke_check_2(void) * Modifications: * * JRM -- 1/18/05 - * Added code to skip this test if the skip_long_tests global + * Added code to skip this test if the skip_long_tests1 global * is true. * *------------------------------------------------------------------------- @@ -552,7 +552,7 @@ smoke_check_3(void) TESTING("smoke check #3 -- all clean, ins, dest, ren, 2/1 KB cache"); - if ( skip_long_tests ) { + if ( skip_long_tests1 ) { SKIPPED(); @@ -561,26 +561,26 @@ smoke_check_3(void) return; } - pass = TRUE; + pass1 = TRUE; if ( show_progress ) /* 1 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - reset_entries(); + reset_entries1(); if ( show_progress ) /* 2 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - cache_ptr = setup_cache((size_t)(2 * 1024), + cache_ptr = setup_cache1((size_t)(2 * 1024), (size_t)(1 * 1024)); if ( show_progress ) /* 3 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - row_major_scan_forward(/* cache_ptr */ cache_ptr, + row_major_scan_forward1(/* cache_ptr */ cache_ptr, /* lag */ lag, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -596,10 +596,10 @@ smoke_check_3(void) /* dirty_unprotects */ dirty_unprotects); if ( show_progress ) /* 4 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - row_major_scan_backward(/* cache_ptr */ cache_ptr, + row_major_scan_backward1(/* cache_ptr */ cache_ptr, /* lag */ lag, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -615,10 +615,10 @@ smoke_check_3(void) /* dirty_unprotects */ dirty_unprotects); if ( show_progress ) /* 5 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - row_major_scan_forward(/* cache_ptr */ cache_ptr, + row_major_scan_forward1(/* cache_ptr */ cache_ptr, /* lag */ lag, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -634,21 +634,21 @@ smoke_check_3(void) /* dirty_unprotects */ dirty_unprotects); if ( show_progress ) /* 6 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* flush and destroy all entries in the cache: */ - flush_cache(/* cache_ptr */ cache_ptr, + flush_cache1(/* cache_ptr */ cache_ptr, /* destroy_entries */ TRUE, /* dump_stats */ FALSE, /* dump_detailed_stats */ FALSE); if ( show_progress ) /* 7 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - col_major_scan_forward(/* cache_ptr */ cache_ptr, + col_major_scan_forward1(/* cache_ptr */ cache_ptr, /* lag */ lag, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -659,21 +659,21 @@ smoke_check_3(void) /* dirty_unprotects */ dirty_unprotects); if ( show_progress ) /* 8 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* flush all entries in the cache: */ - flush_cache(/* cache_ptr */ cache_ptr, + flush_cache1(/* cache_ptr */ cache_ptr, /* destroy_entries */ FALSE, /* dump_stats */ FALSE, /* dump_detailed_stats */ FALSE); if ( show_progress ) /* 9 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - col_major_scan_backward(/* cache_ptr */ cache_ptr, + col_major_scan_backward1(/* cache_ptr */ cache_ptr, /* lag */ lag, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -684,24 +684,24 @@ smoke_check_3(void) /* dirty_unprotects */ dirty_unprotects); if ( show_progress ) /* 10 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - takedown_cache(cache_ptr, display_stats, TRUE); + takedown_cache1(cache_ptr, display_stats, TRUE); if ( show_progress ) /* 11 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - verify_clean(); - verify_unprotected(); + verify_clean1(); + verify_unprotected1(); - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) { + if ( ! pass1 ) { - HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + HDfprintf(stdout, "%s(): failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } return; @@ -725,7 +725,7 @@ smoke_check_3(void) * Modifications: * * JRM -- 1/18/05 - * Added code to skip this test if the skip_long_tests global + * Added code to skip this test if the skip_long_tests1 global * is true. * *------------------------------------------------------------------------- @@ -746,7 +746,7 @@ smoke_check_4(void) TESTING("smoke check #4 -- ~1/2 dirty, ins, dest, ren, 2/1 KB cache"); - if ( skip_long_tests ) { + if ( skip_long_tests1 ) { SKIPPED(); @@ -755,26 +755,26 @@ smoke_check_4(void) return; } - pass = TRUE; + pass1 = TRUE; if ( show_progress ) /* 1 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - reset_entries(); + reset_entries1(); if ( show_progress ) /* 2 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - cache_ptr = setup_cache((size_t)(2 * 1024), + cache_ptr = setup_cache1((size_t)(2 * 1024), (size_t)(1 * 1024)); if ( show_progress ) /* 3 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - row_major_scan_forward(/* cache_ptr */ cache_ptr, + row_major_scan_forward1(/* cache_ptr */ cache_ptr, /* lag */ lag, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -790,10 +790,10 @@ smoke_check_4(void) /* dirty_unprotects */ dirty_unprotects); if ( show_progress ) /* 4 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - row_major_scan_backward(/* cache_ptr */ cache_ptr, + row_major_scan_backward1(/* cache_ptr */ cache_ptr, /* lag */ lag, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -809,10 +809,10 @@ smoke_check_4(void) /* dirty_unprotects */ dirty_unprotects); if ( show_progress ) /* 5 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - row_major_scan_forward(/* cache_ptr */ cache_ptr, + row_major_scan_forward1(/* cache_ptr */ cache_ptr, /* lag */ lag, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -828,21 +828,21 @@ smoke_check_4(void) /* dirty_unprotects */ dirty_unprotects); if ( show_progress ) /* 6 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* flush and destroy all entries in the cache: */ - flush_cache(/* cache_ptr */ cache_ptr, + flush_cache1(/* cache_ptr */ cache_ptr, /* destroy_entries */ TRUE, /* dump_stats */ FALSE, /* dump_detailed_stats */ FALSE); if ( show_progress ) /* 7 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - col_major_scan_forward(/* cache_ptr */ cache_ptr, + col_major_scan_forward1(/* cache_ptr */ cache_ptr, /* lag */ lag, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -853,21 +853,21 @@ smoke_check_4(void) /* dirty_unprotects */ dirty_unprotects); if ( show_progress ) /* 8 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* flush all entries in the cache: */ - flush_cache(/* cache_ptr */ cache_ptr, + flush_cache1(/* cache_ptr */ cache_ptr, /* destroy_entries */ FALSE, /* dump_stats */ FALSE, /* dump_detailed_stats */ FALSE); if ( show_progress ) /* 9 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - col_major_scan_backward(/* cache_ptr */ cache_ptr, + col_major_scan_backward1(/* cache_ptr */ cache_ptr, /* lag */ lag, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -878,24 +878,24 @@ smoke_check_4(void) /* dirty_unprotects */ dirty_unprotects); if ( show_progress ) /* 10 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - takedown_cache(cache_ptr, display_stats, TRUE); + takedown_cache1(cache_ptr, display_stats, TRUE); if ( show_progress ) /* 11 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - verify_clean(); - verify_unprotected(); + verify_clean1(); + verify_unprotected1(); - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) { + if ( ! pass1 ) { - HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + HDfprintf(stdout, "%s(): failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } return; @@ -919,7 +919,7 @@ smoke_check_4(void) * Modifications: * * JRM -- 1/18/05 - * Added code to skip this test if the skip_long_tests global + * Added code to skip this test if the skip_long_tests1 global * is true. * *------------------------------------------------------------------------- @@ -988,7 +988,7 @@ smoke_check_5(void) TESTING("smoke check #5 -- all clean, ins, prot, unprot, AR cache 1"); - if ( skip_long_tests ) { + if ( skip_long_tests1 ) { SKIPPED(); @@ -997,42 +997,42 @@ smoke_check_5(void) return; } - if ( run_full_test ) { + if ( run_full_test1 ) { max_index = (10 * 1024) - 1; } - pass = TRUE; + pass1 = TRUE; if ( show_progress ) /* 1 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - reset_entries(); + reset_entries1(); if ( show_progress ) /* 2 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - cache_ptr = setup_cache((size_t)(2 * 1024), + cache_ptr = setup_cache1((size_t)(2 * 1024), (size_t)(1 * 1024)); - if ( pass ) { + if ( pass1 ) { result = H5C1_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 1.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 1.\n"; } } if ( show_progress ) /* 3 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - hl_row_major_scan_forward(/* cache_ptr */ cache_ptr, + hl_row_major_scan_forward1(/* cache_ptr */ cache_ptr, /* max_index */ max_index, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -1042,10 +1042,10 @@ smoke_check_5(void) /* dirty_inserts */ dirty_inserts); if ( show_progress ) /* 4 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - hl_row_major_scan_backward(/* cache_ptr */ cache_ptr, + hl_row_major_scan_backward1(/* cache_ptr */ cache_ptr, /* max_index */ max_index, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -1055,10 +1055,10 @@ smoke_check_5(void) /* dirty_inserts */ dirty_inserts); if ( show_progress ) /* 5 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - hl_row_major_scan_forward(/* cache_ptr */ cache_ptr, + hl_row_major_scan_forward1(/* cache_ptr */ cache_ptr, /* max_index */ max_index, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -1068,21 +1068,21 @@ smoke_check_5(void) /* dirty_inserts */ dirty_inserts); if ( show_progress ) /* 6 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* flush and destroy all entries in the cache: */ - flush_cache(/* cache_ptr */ cache_ptr, + flush_cache1(/* cache_ptr */ cache_ptr, /* destroy_entries */ TRUE, /* dump_stats */ FALSE, /* dump_detailed_stats */ FALSE); if ( show_progress ) /* 7 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - hl_col_major_scan_forward(/* cache_ptr */ cache_ptr, + hl_col_major_scan_forward1(/* cache_ptr */ cache_ptr, /* max_index */ max_index, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -1093,21 +1093,21 @@ smoke_check_5(void) /* dirty_unprotects */ dirty_unprotects); if ( show_progress ) /* 8 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* flush all entries in the cache: */ - flush_cache(/* cache_ptr */ cache_ptr, + flush_cache1(/* cache_ptr */ cache_ptr, /* destroy_entries */ FALSE, /* dump_stats */ FALSE, /* dump_detailed_stats */ FALSE); if ( show_progress ) /* 9 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - hl_col_major_scan_backward(/* cache_ptr */ cache_ptr, + hl_col_major_scan_backward1(/* cache_ptr */ cache_ptr, /* max_index */ max_index, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -1118,24 +1118,24 @@ smoke_check_5(void) /* dirty_unprotects */ dirty_unprotects); if ( show_progress ) /* 10 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - takedown_cache(cache_ptr, display_stats, TRUE); + takedown_cache1(cache_ptr, display_stats, TRUE); if ( show_progress ) /* 11 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - verify_clean(); - verify_unprotected(); + verify_clean1(); + verify_unprotected1(); - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) { + if ( ! pass1 ) { - HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + HDfprintf(stdout, "%s(): failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } return; @@ -1159,7 +1159,7 @@ smoke_check_5(void) * Modifications: * * JRM -- 1/18/05 - * Added code to skip this test if the skip_long_tests global + * Added code to skip this test if the skip_long_tests1 global * is true. * *------------------------------------------------------------------------- @@ -1228,9 +1228,9 @@ smoke_check_6(void) TESTING("smoke check #6 -- ~1/2 dirty, ins, prot, unprot, AR cache 1"); - pass = TRUE; + pass1 = TRUE; - if ( skip_long_tests ) { + if ( skip_long_tests1 ) { SKIPPED(); @@ -1239,40 +1239,40 @@ smoke_check_6(void) return; } - if ( run_full_test ) { + if ( run_full_test1 ) { max_index = (10 * 1024) - 1; } if ( show_progress ) /* 1 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - reset_entries(); + reset_entries1(); if ( show_progress ) /* 2 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - cache_ptr = setup_cache((size_t)(2 * 1024), + cache_ptr = setup_cache1((size_t)(2 * 1024), (size_t)(1 * 1024)); - if ( pass ) { + if ( pass1 ) { result = H5C1_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 1.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 1.\n"; } } if ( show_progress ) /* 3 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - hl_row_major_scan_forward(/* cache_ptr */ cache_ptr, + hl_row_major_scan_forward1(/* cache_ptr */ cache_ptr, /* max_index */ max_index, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -1282,10 +1282,10 @@ smoke_check_6(void) /* dirty_inserts */ dirty_inserts); if ( show_progress ) /* 4 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - hl_row_major_scan_backward(/* cache_ptr */ cache_ptr, + hl_row_major_scan_backward1(/* cache_ptr */ cache_ptr, /* max_index */ max_index, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -1295,10 +1295,10 @@ smoke_check_6(void) /* dirty_inserts */ dirty_inserts); if ( show_progress ) /* 5 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - hl_row_major_scan_forward(/* cache_ptr */ cache_ptr, + hl_row_major_scan_forward1(/* cache_ptr */ cache_ptr, /* max_index */ max_index, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -1308,21 +1308,21 @@ smoke_check_6(void) /* dirty_inserts */ dirty_inserts); if ( show_progress ) /* 6 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* flush and destroy all entries in the cache: */ - flush_cache(/* cache_ptr */ cache_ptr, + flush_cache1(/* cache_ptr */ cache_ptr, /* destroy_entries */ TRUE, /* dump_stats */ FALSE, /* dump_detailed_stats */ FALSE); if ( show_progress ) /* 7 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - hl_col_major_scan_forward(/* cache_ptr */ cache_ptr, + hl_col_major_scan_forward1(/* cache_ptr */ cache_ptr, /* max_index */ max_index, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -1333,21 +1333,21 @@ smoke_check_6(void) /* dirty_unprotects */ dirty_unprotects); if ( show_progress ) /* 8 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* flush all entries in the cache: */ - flush_cache(/* cache_ptr */ cache_ptr, + flush_cache1(/* cache_ptr */ cache_ptr, /* destroy_entries */ FALSE, /* dump_stats */ FALSE, /* dump_detailed_stats */ FALSE); if ( show_progress ) /* 9 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - hl_col_major_scan_backward(/* cache_ptr */ cache_ptr, + hl_col_major_scan_backward1(/* cache_ptr */ cache_ptr, /* max_index */ max_index, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -1358,24 +1358,24 @@ smoke_check_6(void) /* dirty_unprotects */ dirty_unprotects); if ( show_progress ) /* 10 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - takedown_cache(cache_ptr, display_stats, TRUE); + takedown_cache1(cache_ptr, display_stats, TRUE); if ( show_progress ) /* 11 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - verify_clean(); - verify_unprotected(); + verify_clean1(); + verify_unprotected1(); - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) { + if ( ! pass1 ) { - HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + HDfprintf(stdout, "%s(): failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } return; @@ -1399,7 +1399,7 @@ smoke_check_6(void) * Modifications: * * JRM -- 1/18/05 - * Added code to skip this test if the skip_long_tests global + * Added code to skip this test if the skip_long_tests1 global * is true. * *------------------------------------------------------------------------- @@ -1469,7 +1469,7 @@ smoke_check_7(void) TESTING("smoke check #7 -- all clean, ins, prot, unprot, AR cache 2"); - if ( skip_long_tests ) { + if ( skip_long_tests1 ) { SKIPPED(); @@ -1478,42 +1478,42 @@ smoke_check_7(void) return; } - if ( run_full_test ) { + if ( run_full_test1 ) { max_index = (10 * 1024) - 1; } - pass = TRUE; + pass1 = TRUE; if ( show_progress ) /* 1 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - reset_entries(); + reset_entries1(); if ( show_progress ) /* 2 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - cache_ptr = setup_cache((size_t)(2 * 1024), + cache_ptr = setup_cache1((size_t)(2 * 1024), (size_t)(1 * 1024)); - if ( pass ) { + if ( pass1 ) { result = H5C1_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 1.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 1.\n"; } } if ( show_progress ) /* 3 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - hl_row_major_scan_forward(/* cache_ptr */ cache_ptr, + hl_row_major_scan_forward1(/* cache_ptr */ cache_ptr, /* max_index */ max_index, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -1523,10 +1523,10 @@ smoke_check_7(void) /* dirty_inserts */ dirty_inserts); if ( show_progress ) /* 4 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - hl_row_major_scan_backward(/* cache_ptr */ cache_ptr, + hl_row_major_scan_backward1(/* cache_ptr */ cache_ptr, /* max_index */ max_index, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -1536,10 +1536,10 @@ smoke_check_7(void) /* dirty_inserts */ dirty_inserts); if ( show_progress ) /* 5 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - hl_row_major_scan_forward(/* cache_ptr */ cache_ptr, + hl_row_major_scan_forward1(/* cache_ptr */ cache_ptr, /* max_index */ max_index, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -1549,21 +1549,21 @@ smoke_check_7(void) /* dirty_inserts */ dirty_inserts); if ( show_progress ) /* 6 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* flush and destroy all entries in the cache: */ - flush_cache(/* cache_ptr */ cache_ptr, + flush_cache1(/* cache_ptr */ cache_ptr, /* destroy_entries */ TRUE, /* dump_stats */ FALSE, /* dump_detailed_stats */ FALSE); if ( show_progress ) /* 7 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - hl_col_major_scan_forward(/* cache_ptr */ cache_ptr, + hl_col_major_scan_forward1(/* cache_ptr */ cache_ptr, /* max_index */ max_index, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -1574,21 +1574,21 @@ smoke_check_7(void) /* dirty_unprotects */ dirty_unprotects); if ( show_progress ) /* 8 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* flush all entries in the cache: */ - flush_cache(/* cache_ptr */ cache_ptr, + flush_cache1(/* cache_ptr */ cache_ptr, /* destroy_entries */ FALSE, /* dump_stats */ FALSE, /* dump_detailed_stats */ FALSE); if ( show_progress ) /* 9 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - hl_col_major_scan_backward(/* cache_ptr */ cache_ptr, + hl_col_major_scan_backward1(/* cache_ptr */ cache_ptr, /* max_index */ max_index, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -1599,24 +1599,24 @@ smoke_check_7(void) /* dirty_unprotects */ dirty_unprotects); if ( show_progress ) /* 10 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - takedown_cache(cache_ptr, display_stats, TRUE); + takedown_cache1(cache_ptr, display_stats, TRUE); if ( show_progress ) /* 11 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - verify_clean(); - verify_unprotected(); + verify_clean1(); + verify_unprotected1(); - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) { + if ( ! pass1 ) { - HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + HDfprintf(stdout, "%s(): failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } return; @@ -1640,7 +1640,7 @@ smoke_check_7(void) * Modifications: * * JRM -- 1/18/05 - * Added code to skip this test if the skip_long_tests global + * Added code to skip this test if the skip_long_tests1 global * is true. * *------------------------------------------------------------------------- @@ -1710,7 +1710,7 @@ smoke_check_8(void) TESTING("smoke check #8 -- ~1/2 dirty, ins, prot, unprot, AR cache 2"); - if ( skip_long_tests ) { + if ( skip_long_tests1 ) { SKIPPED(); @@ -1719,42 +1719,42 @@ smoke_check_8(void) return; } - if ( run_full_test ) { + if ( run_full_test1 ) { max_index = (10 * 1024) - 1; } - pass = TRUE; + pass1 = TRUE; if ( show_progress ) /* 1 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - reset_entries(); + reset_entries1(); if ( show_progress ) /* 2 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - cache_ptr = setup_cache((size_t)(2 * 1024), + cache_ptr = setup_cache1((size_t)(2 * 1024), (size_t)(1 * 1024)); - if ( pass ) { + if ( pass1 ) { result = H5C1_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 1.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 1.\n"; } } if ( show_progress ) /* 3 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - hl_row_major_scan_forward(/* cache_ptr */ cache_ptr, + hl_row_major_scan_forward1(/* cache_ptr */ cache_ptr, /* max_index */ max_index, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -1764,10 +1764,10 @@ smoke_check_8(void) /* dirty_inserts */ dirty_inserts); if ( show_progress ) /* 4 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - hl_row_major_scan_backward(/* cache_ptr */ cache_ptr, + hl_row_major_scan_backward1(/* cache_ptr */ cache_ptr, /* max_index */ max_index, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -1777,10 +1777,10 @@ smoke_check_8(void) /* dirty_inserts */ dirty_inserts); if ( show_progress ) /* 5 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - hl_row_major_scan_forward(/* cache_ptr */ cache_ptr, + hl_row_major_scan_forward1(/* cache_ptr */ cache_ptr, /* max_index */ max_index, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -1790,21 +1790,21 @@ smoke_check_8(void) /* dirty_inserts */ dirty_inserts); if ( show_progress ) /* 6 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* flush and destroy all entries in the cache: */ - flush_cache(/* cache_ptr */ cache_ptr, + flush_cache1(/* cache_ptr */ cache_ptr, /* destroy_entries */ TRUE, /* dump_stats */ FALSE, /* dump_detailed_stats */ FALSE); if ( show_progress ) /* 7 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - hl_col_major_scan_forward(/* cache_ptr */ cache_ptr, + hl_col_major_scan_forward1(/* cache_ptr */ cache_ptr, /* max_index */ max_index, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -1815,21 +1815,21 @@ smoke_check_8(void) /* dirty_unprotects */ dirty_unprotects); if ( show_progress ) /* 8 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* flush all entries in the cache: */ - flush_cache(/* cache_ptr */ cache_ptr, + flush_cache1(/* cache_ptr */ cache_ptr, /* destroy_entries */ FALSE, /* dump_stats */ FALSE, /* dump_detailed_stats */ FALSE); if ( show_progress ) /* 9 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - hl_col_major_scan_backward(/* cache_ptr */ cache_ptr, + hl_col_major_scan_backward1(/* cache_ptr */ cache_ptr, /* max_index */ max_index, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -1840,24 +1840,24 @@ smoke_check_8(void) /* dirty_unprotects */ dirty_unprotects); if ( show_progress ) /* 10 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - takedown_cache(cache_ptr, display_stats, TRUE); + takedown_cache1(cache_ptr, display_stats, TRUE); if ( show_progress ) /* 11 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - verify_clean(); - verify_unprotected(); + verify_clean1(); + verify_unprotected1(); - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) { + if ( ! pass1 ) { - HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + HDfprintf(stdout, "%s(): failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } return; @@ -1905,7 +1905,7 @@ smoke_check_9(void) TESTING("smoke check #9 -- all clean, ins, dest, ren, 4/2 MB, corked"); - if ( skip_long_tests ) { + if ( skip_long_tests1 ) { SKIPPED(); @@ -1914,43 +1914,43 @@ smoke_check_9(void) return; } - pass = TRUE; + pass1 = TRUE; if ( show_progress ) /* 1 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - reset_entries(); + reset_entries1(); if ( show_progress ) /* 2 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - cache_ptr = setup_cache((size_t)(4 * 1024 * 1024), + cache_ptr = setup_cache1((size_t)(4 * 1024 * 1024), (size_t)(2 * 1024 * 1024)); /* disable evictions */ if ( show_progress ) /* 3 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - if ( pass ) { + if ( pass1 ) { result = H5C1_set_evictions_enabled(cache_ptr, FALSE); if ( result < 0 ) { - pass = FALSE; - failure_mssg = "can't disable evictions 1.\n"; + pass1 = FALSE; + failure_mssg1 = "can't disable evictions 1.\n"; } } if ( show_progress ) /* 4 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions disabled\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d -- evictions disabled\n", + fcn_name, mile_stone++, (int)pass1); - row_major_scan_forward(/* cache_ptr */ cache_ptr, + row_major_scan_forward1(/* cache_ptr */ cache_ptr, /* lag */ lag, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -1968,25 +1968,25 @@ smoke_check_9(void) /* enable evictions */ if ( show_progress ) /* 5 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - if ( pass ) { + if ( pass1 ) { result = H5C1_set_evictions_enabled(cache_ptr, TRUE); if ( result < 0 ) { - pass = FALSE; - failure_mssg = "can't enable evictions 1.\n"; + pass1 = FALSE; + failure_mssg1 = "can't enable evictions 1.\n"; } } if ( show_progress ) /* 6 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions enabled \n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d -- evictions enabled \n", + fcn_name, mile_stone++, (int)pass1); - row_major_scan_backward(/* cache_ptr */ cache_ptr, + row_major_scan_backward1(/* cache_ptr */ cache_ptr, /* lag */ lag, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -2002,25 +2002,25 @@ smoke_check_9(void) /* dirty_unprotects */ dirty_unprotects); if ( show_progress ) /* 7 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - if ( pass ) { + if ( pass1 ) { result = H5C1_set_evictions_enabled(cache_ptr, FALSE); if ( result < 0 ) { - pass = FALSE; - failure_mssg = "can't disable evictions 2.\n"; + pass1 = FALSE; + failure_mssg1 = "can't disable evictions 2.\n"; } } if ( show_progress ) /* 8 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions disabled \n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d -- evictions disabled \n", + fcn_name, mile_stone++, (int)pass1); - row_major_scan_forward(/* cache_ptr */ cache_ptr, + row_major_scan_forward1(/* cache_ptr */ cache_ptr, /* lag */ lag, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -2036,51 +2036,51 @@ smoke_check_9(void) /* dirty_unprotects */ dirty_unprotects); if ( show_progress ) /* 9 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - if ( pass ) { + if ( pass1 ) { result = H5C1_set_evictions_enabled(cache_ptr, TRUE); if ( result < 0 ) { - pass = FALSE; - failure_mssg = "can't enable evictions 2.\n"; + pass1 = FALSE; + failure_mssg1 = "can't enable evictions 2.\n"; } } if ( show_progress ) /* 10 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions enabled \n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d -- evictions enabled \n", + fcn_name, mile_stone++, (int)pass1); /* flush and destroy all entries in the cache: */ - flush_cache(/* cache_ptr */ cache_ptr, + flush_cache1(/* cache_ptr */ cache_ptr, /* destroy_entries */ TRUE, /* dump_stats */ FALSE, /* dump_detailed_stats */ FALSE); if ( show_progress ) /* 11 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - if ( pass ) { + if ( pass1 ) { result = H5C1_set_evictions_enabled(cache_ptr, FALSE); if ( result < 0 ) { - pass = FALSE; - failure_mssg = "can't disable evictions 3.\n"; + pass1 = FALSE; + failure_mssg1 = "can't disable evictions 3.\n"; } } if ( show_progress ) /* 12 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions disabled\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d -- evictions disabled\n", + fcn_name, mile_stone++, (int)pass1); - col_major_scan_forward(/* cache_ptr */ cache_ptr, + col_major_scan_forward1(/* cache_ptr */ cache_ptr, /* lag */ lag, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -2091,36 +2091,36 @@ smoke_check_9(void) /* dirty_unprotects */ dirty_unprotects); if ( show_progress ) /* 13 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* flush all entries in the cache: */ - flush_cache(/* cache_ptr */ cache_ptr, + flush_cache1(/* cache_ptr */ cache_ptr, /* destroy_entries */ FALSE, /* dump_stats */ FALSE, /* dump_detailed_stats */ FALSE); if ( show_progress ) /* 14 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - if ( pass ) { + if ( pass1 ) { result = H5C1_set_evictions_enabled(cache_ptr, TRUE); if ( result < 0 ) { - pass = FALSE; - failure_mssg = "can't enable evictions 3.\n"; + pass1 = FALSE; + failure_mssg1 = "can't enable evictions 3.\n"; } } if ( show_progress ) /* 15 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions enabled\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d -- evictions enabled\n", + fcn_name, mile_stone++, (int)pass1); - col_major_scan_backward(/* cache_ptr */ cache_ptr, + col_major_scan_backward1(/* cache_ptr */ cache_ptr, /* lag */ lag, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -2131,40 +2131,40 @@ smoke_check_9(void) /* dirty_unprotects */ dirty_unprotects); if ( show_progress ) /* 16 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - if ( pass ) { + if ( pass1 ) { result = H5C1_set_evictions_enabled(cache_ptr, FALSE); if ( result < 0 ) { - pass = FALSE; - failure_mssg = "can't disable evictions 4.\n"; + pass1 = FALSE; + failure_mssg1 = "can't disable evictions 4.\n"; } } if ( show_progress ) /* 17 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions disabled\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d -- evictions disabled\n", + fcn_name, mile_stone++, (int)pass1); - takedown_cache(cache_ptr, display_stats, TRUE); + takedown_cache1(cache_ptr, display_stats, TRUE); if ( show_progress ) /* 18 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - verify_clean(); - verify_unprotected(); + verify_clean1(); + verify_unprotected1(); - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) { + if ( ! pass1 ) { - HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + HDfprintf(stdout, "%s(): failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } return; @@ -2212,7 +2212,7 @@ smoke_check_10(void) TESTING("smoke check #10 -- ~1/2 dirty, ins, dest, ren, 4/2 MB, corked"); - if ( skip_long_tests ) { + if ( skip_long_tests1 ) { SKIPPED(); @@ -2221,26 +2221,26 @@ smoke_check_10(void) return; } - pass = TRUE; + pass1 = TRUE; if ( show_progress ) /* 1 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - reset_entries(); + reset_entries1(); if ( show_progress ) /* 2 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - cache_ptr = setup_cache((size_t)(4 * 1024 * 1024), + cache_ptr = setup_cache1((size_t)(4 * 1024 * 1024), (size_t)(2 * 1024 * 1024)); if ( show_progress ) /* 3 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions enabled\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d -- evictions enabled\n", + fcn_name, mile_stone++, (int)pass1); - row_major_scan_forward(/* cache_ptr */ cache_ptr, + row_major_scan_forward1(/* cache_ptr */ cache_ptr, /* lag */ lag, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -2256,25 +2256,25 @@ smoke_check_10(void) /* dirty_unprotects */ dirty_unprotects); if ( show_progress ) /* 4 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - if ( pass ) { + if ( pass1 ) { result = H5C1_set_evictions_enabled(cache_ptr, FALSE); if ( result < 0 ) { - pass = FALSE; - failure_mssg = "can't disable evictions 1.\n"; + pass1 = FALSE; + failure_mssg1 = "can't disable evictions 1.\n"; } } if ( show_progress ) /* 5 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions disabled\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d -- evictions disabled\n", + fcn_name, mile_stone++, (int)pass1); - row_major_scan_backward(/* cache_ptr */ cache_ptr, + row_major_scan_backward1(/* cache_ptr */ cache_ptr, /* lag */ lag, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -2290,25 +2290,25 @@ smoke_check_10(void) /* dirty_unprotects */ dirty_unprotects); if ( show_progress ) /* 6 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - if ( pass ) { + if ( pass1 ) { result = H5C1_set_evictions_enabled(cache_ptr, TRUE); if ( result < 0 ) { - pass = FALSE; - failure_mssg = "can't enable evictions 1.\n"; + pass1 = FALSE; + failure_mssg1 = "can't enable evictions 1.\n"; } } if ( show_progress ) /* 7 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions enabled\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d -- evictions enabled\n", + fcn_name, mile_stone++, (int)pass1); - row_major_scan_forward(/* cache_ptr */ cache_ptr, + row_major_scan_forward1(/* cache_ptr */ cache_ptr, /* lag */ lag, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -2324,51 +2324,51 @@ smoke_check_10(void) /* dirty_unprotects */ dirty_unprotects); if ( show_progress ) /* 8 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - if ( pass ) { + if ( pass1 ) { result = H5C1_set_evictions_enabled(cache_ptr, FALSE); if ( result < 0 ) { - pass = FALSE; - failure_mssg = "can't disable evictions 2.\n"; + pass1 = FALSE; + failure_mssg1 = "can't disable evictions 2.\n"; } } if ( show_progress ) /* 9 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions disabled\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d -- evictions disabled\n", + fcn_name, mile_stone++, (int)pass1); /* flush and destroy all entries in the cache: */ - flush_cache(/* cache_ptr */ cache_ptr, + flush_cache1(/* cache_ptr */ cache_ptr, /* destroy_entries */ TRUE, /* dump_stats */ FALSE, /* dump_detailed_stats */ FALSE); if ( show_progress ) /* 10 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - if ( pass ) { + if ( pass1 ) { result = H5C1_set_evictions_enabled(cache_ptr, TRUE); if ( result < 0 ) { - pass = FALSE; - failure_mssg = "can't enable evictions 2.\n"; + pass1 = FALSE; + failure_mssg1 = "can't enable evictions 2.\n"; } } if ( show_progress ) /* 11 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions enabled\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d -- evictions enabled\n", + fcn_name, mile_stone++, (int)pass1); - col_major_scan_forward(/* cache_ptr */ cache_ptr, + col_major_scan_forward1(/* cache_ptr */ cache_ptr, /* lag */ lag, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -2379,51 +2379,51 @@ smoke_check_10(void) /* dirty_unprotects */ dirty_unprotects); if ( show_progress ) /* 12 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - if ( pass ) { + if ( pass1 ) { result = H5C1_set_evictions_enabled(cache_ptr, FALSE); if ( result < 0 ) { - pass = FALSE; - failure_mssg = "can't disable evictions 3.\n"; + pass1 = FALSE; + failure_mssg1 = "can't disable evictions 3.\n"; } } if ( show_progress ) /* 13 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions disabled\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d -- evictions disabled\n", + fcn_name, mile_stone++, (int)pass1); /* flush all entries in the cache: */ - flush_cache(/* cache_ptr */ cache_ptr, + flush_cache1(/* cache_ptr */ cache_ptr, /* destroy_entries */ FALSE, /* dump_stats */ FALSE, /* dump_detailed_stats */ FALSE); if ( show_progress ) /* 14 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - if ( pass ) { + if ( pass1 ) { result = H5C1_set_evictions_enabled(cache_ptr, TRUE); if ( result < 0 ) { - pass = FALSE; - failure_mssg = "can't enable evictions 3.\n"; + pass1 = FALSE; + failure_mssg1 = "can't enable evictions 3.\n"; } } if ( show_progress ) /* 15 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions enabled\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d -- evictions enabled\n", + fcn_name, mile_stone++, (int)pass1); - col_major_scan_backward(/* cache_ptr */ cache_ptr, + col_major_scan_backward1(/* cache_ptr */ cache_ptr, /* lag */ lag, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -2434,39 +2434,39 @@ smoke_check_10(void) /* dirty_unprotects */ dirty_unprotects); if ( show_progress ) /* 16 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - if ( pass ) { + if ( pass1 ) { result = H5C1_set_evictions_enabled(cache_ptr, FALSE); if ( result < 0 ) { - pass = FALSE; - failure_mssg = "can't disable evictions 4.\n"; + pass1 = FALSE; + failure_mssg1 = "can't disable evictions 4.\n"; } } if ( show_progress ) /* 17 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d -- evictions disabled\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d -- evictions disabled\n", + fcn_name, mile_stone++, (int)pass1); - takedown_cache(cache_ptr, display_stats, TRUE); + takedown_cache1(cache_ptr, display_stats, TRUE); if ( show_progress ) /* 18 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - verify_clean(); - verify_unprotected(); + verify_clean1(); + verify_unprotected1(); - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) { + if ( ! pass1 ) { - HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + HDfprintf(stdout, "%s(): failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } return; @@ -2475,12 +2475,12 @@ smoke_check_10(void) /*------------------------------------------------------------------------- - * Function: write_permitted_check() + * Function: write_permitted1_check() * * Purpose: A basic test of the write permitted function. In essence, * we load the cache up with dirty entryies, set - * write_permitted to FALSE, and then protect a bunch of - * entries. If there are any writes while write_permitted is + * write_permitted1 to FALSE, and then protect a bunch of + * entries. If there are any writes while write_permitted1 is * FALSE, the test will fail. * * Return: void @@ -2494,12 +2494,12 @@ smoke_check_10(void) */ static void -write_permitted_check(void) +write_permitted1_check(void) { #if H5C1_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS - const char * fcn_name = "write_permitted_check"; + const char * fcn_name = "write_permitted1_check"; hbool_t show_progress = FALSE; hbool_t display_stats = FALSE; int32_t lag = 10; @@ -2512,26 +2512,26 @@ write_permitted_check(void) #if H5C1_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS - pass = TRUE; + pass1 = TRUE; if ( show_progress ) /* 1 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - reset_entries(); + reset_entries1(); if ( show_progress ) /* 2 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - cache_ptr = setup_cache((size_t)(1 * 1024 * 1024), + cache_ptr = setup_cache1((size_t)(1 * 1024 * 1024), (size_t)(0)); if ( show_progress ) /* 3 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - row_major_scan_forward(/* cache_ptr */ cache_ptr, + row_major_scan_forward1(/* cache_ptr */ cache_ptr, /* lag */ lag, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -2547,12 +2547,12 @@ write_permitted_check(void) /* dirty_unprotects */ TRUE); if ( show_progress ) /* 4 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - write_permitted = FALSE; + write_permitted1 = FALSE; - row_major_scan_backward(/* cache_ptr */ cache_ptr, + row_major_scan_backward1(/* cache_ptr */ cache_ptr, /* lag */ lag, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -2568,12 +2568,12 @@ write_permitted_check(void) /* dirty_unprotects */ NO_CHANGE); if ( show_progress ) /* 5 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - write_permitted = TRUE; + write_permitted1 = TRUE; - row_major_scan_forward(/* cache_ptr */ cache_ptr, + row_major_scan_forward1(/* cache_ptr */ cache_ptr, /* lag */ lag, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -2589,21 +2589,21 @@ write_permitted_check(void) /* dirty_unprotects */ TRUE); if ( show_progress ) /* 6 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* flush and destroy all entries in the cache: */ - flush_cache(/* cache_ptr */ cache_ptr, + flush_cache1(/* cache_ptr */ cache_ptr, /* destroy_entries */ TRUE, /* dump_stats */ FALSE, /* dump_detailed_stats */ FALSE); if ( show_progress ) /* 7 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - col_major_scan_forward(/* cache_ptr */ cache_ptr, + col_major_scan_forward1(/* cache_ptr */ cache_ptr, /* lag */ lag, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -2614,12 +2614,12 @@ write_permitted_check(void) /* dirty_unprotects */ TRUE); if ( show_progress ) /* 8 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - write_permitted = FALSE; + write_permitted1 = FALSE; - col_major_scan_backward(/* cache_ptr */ cache_ptr, + col_major_scan_backward1(/* cache_ptr */ cache_ptr, /* lag */ lag, /* verbose */ FALSE, /* reset_stats */ TRUE, @@ -2629,27 +2629,27 @@ write_permitted_check(void) /* dirty_inserts */ FALSE, /* dirty_unprotects */ NO_CHANGE); - write_permitted = TRUE; + write_permitted1 = TRUE; if ( show_progress ) /* 9 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - takedown_cache(cache_ptr, display_stats, TRUE); + takedown_cache1(cache_ptr, display_stats, TRUE); if ( show_progress ) /* 10 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - verify_clean(); - verify_unprotected(); + verify_clean1(); + verify_unprotected1(); - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) { + if ( ! pass1 ) { - HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + HDfprintf(stdout, "%s(): failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } #else /* H5C1_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ @@ -2662,11 +2662,11 @@ write_permitted_check(void) return; -} /* write_permitted_check() */ +} /* write_permitted1_check() */ /*------------------------------------------------------------------------- - * Function: check_insert_entry() + * Function: check_insert_entry1() * * Purpose: Verify that H5C1_insert_entry behaves as expected. * Test the behaviour with different flags. @@ -2687,9 +2687,9 @@ write_permitted_check(void) */ static void -check_insert_entry(void) +check_insert_entry1(void) { - const char * fcn_name = "check_insert_entry"; + const char * fcn_name = "check_insert_entry1"; int entry_type = PICO_ENTRY_TYPE; int i; herr_t result; @@ -2706,33 +2706,33 @@ check_insert_entry(void) TESTING("H5C1_insert_entry() functionality"); - pass = TRUE; + pass1 = TRUE; /* Allocate a cache, and insert entries into it using all * combinations of flags. Verify that the entries are inserted, * and that the flags have the desired effects. * - * Note that the dirty parameter in insert_entry is no longer + * Note that the dirty parameter in insert_entry1 is no longer * used, as we have decided that all inserted entries are * dirty by definition. (Which sounds very reasonable, but didn't * used to be the case.) */ - if ( pass ) { + if ( pass1 ) { - reset_entries(); + reset_entries1(); - cache_ptr = setup_cache((size_t)(2 * 1024 * 1024), + cache_ptr = setup_cache1((size_t)(2 * 1024 * 1024), (size_t)(1 * 1024 * 1024)); } - if ( pass ) { + if ( pass1 ) { - insert_entry(cache_ptr, entry_type, 0, TRUE, H5C1__NO_FLAGS_SET); - insert_entry(cache_ptr, entry_type, 1, TRUE, + insert_entry1(cache_ptr, entry_type, 0, TRUE, H5C1__NO_FLAGS_SET); + insert_entry1(cache_ptr, entry_type, 1, TRUE, H5C1__SET_FLUSH_MARKER_FLAG); - insert_entry(cache_ptr, entry_type, 2, TRUE, H5C1__PIN_ENTRY_FLAG); - insert_entry(cache_ptr, entry_type, 3, TRUE, + insert_entry1(cache_ptr, entry_type, 2, TRUE, H5C1__PIN_ENTRY_FLAG); + insert_entry1(cache_ptr, entry_type, 3, TRUE, (H5C1__SET_FLUSH_MARKER_FLAG | H5C1__PIN_ENTRY_FLAG)); } @@ -2740,8 +2740,8 @@ check_insert_entry(void) /* Verify that the entries are inserted as desired. */ i = 0; - base_addr = entries[0]; - while ( ( pass ) && ( i < 4 ) ) + base_addr = entries1[0]; + while ( ( pass1 ) && ( i < 4 ) ) { entry_ptr = &(base_addr[i]); @@ -2753,40 +2753,40 @@ check_insert_entry(void) if ( result < 0 ) { - pass = FALSE; - failure_mssg = "H5AC1_get_entry_status() reports failure."; + pass1 = FALSE; + failure_mssg1 = "H5AC1_get_entry_status() reports failure."; } - if ( pass ) { + if ( pass1 ) { /* check the universals */ if ( ( ! in_cache ) || ( ! is_dirty ) || ( is_protected ) || - ( entry_size != entry_sizes[entry_type] ) ) { + ( entry_size != entry_sizes1[entry_type] ) ) { - pass = FALSE; - failure_mssg = "Unexpected insert results 1."; + pass1 = FALSE; + failure_mssg1 = "Unexpected insert results 1."; } } - if ( pass ) { + if ( pass1 ) { /* verify that the pinned flag got set correctly */ if ( ( i == 2 ) || ( i == 3 ) ) { if ( ! is_pinned ) { - pass = FALSE; - failure_mssg = "Unexpected insert results 2."; + pass1 = FALSE; + failure_mssg1 = "Unexpected insert results 2."; } } else if ( is_pinned ) { - pass = FALSE; - failure_mssg = "Unexpected insert results 3."; + pass1 = FALSE; + failure_mssg1 = "Unexpected insert results 3."; } else if ( is_pinned != ((entry_ptr->header).is_pinned) ) { - pass = FALSE; - failure_mssg = "Unexpected insert results 4."; + pass1 = FALSE; + failure_mssg1 = "Unexpected insert results 4."; } } @@ -2794,24 +2794,24 @@ check_insert_entry(void) * Now start looking at the cache data structures directly. */ - if ( pass ) { + if ( pass1 ) { /* Verify that the flush marker got set correctly */ if ( ( i == 1 ) || ( i == 3 ) ) { if ( ! ((entry_ptr->header).flush_marker) ) { - pass = FALSE; - failure_mssg = "Unexpected insert results 5."; + pass1 = FALSE; + failure_mssg1 = "Unexpected insert results 5."; } } else if ( (entry_ptr->header).flush_marker ) { - pass = FALSE; - failure_mssg = "Unexpected insert results 6."; + pass1 = FALSE; + failure_mssg1 = "Unexpected insert results 6."; } } - if ( pass ) { + if ( pass1 ) { /* Verify that pinned entries are in the pinned entry list */ if ( (entry_ptr->header).is_pinned ) { @@ -2827,13 +2827,13 @@ check_insert_entry(void) if ( search_ptr == NULL ) { - pass = FALSE; - failure_mssg = "Unexpected insert results 7."; + pass1 = FALSE; + failure_mssg1 = "Unexpected insert results 7."; } } } - if ( pass ) { + if ( pass1 ) { /* Verify that unpinned entries are in the LRU list */ if ( ! ((entry_ptr->header).is_pinned) ) { @@ -2849,14 +2849,14 @@ check_insert_entry(void) if ( search_ptr == NULL ) { - pass = FALSE; - failure_mssg = "Unexpected insert results 8."; + pass1 = FALSE; + failure_mssg1 = "Unexpected insert results 8."; } } } #if H5C1_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS - if ( pass ) { + if ( pass1 ) { /* Verify that unpinned entries are in the dirty LRU list */ if ( ! ((entry_ptr->header).is_pinned) ) { @@ -2872,8 +2872,8 @@ check_insert_entry(void) if ( search_ptr == NULL ) { - pass = FALSE; - failure_mssg = "Unexpected insert results 9."; + pass1 = FALSE; + failure_mssg1 = "Unexpected insert results 9."; } } } @@ -2889,27 +2889,27 @@ check_insert_entry(void) * as expected. */ - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->index_len != 4 ) || - ( cache_ptr->index_size != 4 * entry_sizes[entry_type] ) || + ( cache_ptr->index_size != 4 * entry_sizes1[entry_type] ) || ( cache_ptr->slist_len != 4 ) || - ( cache_ptr->slist_size != 4 * entry_sizes[entry_type] ) || + ( cache_ptr->slist_size != 4 * entry_sizes1[entry_type] ) || ( cache_ptr->pl_len != 0 ) || ( cache_ptr->pl_size != (size_t)0 ) || ( cache_ptr->pel_len != 2 ) || - ( cache_ptr->pel_size != 2 * entry_sizes[entry_type] ) || + ( cache_ptr->pel_size != 2 * entry_sizes1[entry_type] ) || ( cache_ptr->LRU_list_len != 2 ) || - ( cache_ptr->LRU_list_size != 2 * entry_sizes[entry_type] ) || + ( cache_ptr->LRU_list_size != 2 * entry_sizes1[entry_type] ) || #if H5C1_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS ( cache_ptr->dLRU_list_len != 2 ) || - ( cache_ptr->dLRU_list_size != 2 * entry_sizes[entry_type] ) || + ( cache_ptr->dLRU_list_size != 2 * entry_sizes1[entry_type] ) || #endif /* H5C1_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ ( cache_ptr->cLRU_list_len != 0 ) || ( cache_ptr->cLRU_list_size != (size_t)0 ) ) { - pass = FALSE; - failure_mssg = "Unexpected insert results 10."; + pass1 = FALSE; + failure_mssg1 = "Unexpected insert results 10."; } } @@ -2918,7 +2918,7 @@ check_insert_entry(void) * stats are collected. */ #if H5C1_COLLECT_CACHE_STATS - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->insertions[entry_type] != 4 ) || ( cache_ptr->pinned_insertions[entry_type] != 2 ) || @@ -2926,16 +2926,16 @@ check_insert_entry(void) ( cache_ptr->unpins[entry_type] != 0 ) || ( cache_ptr->dirty_pins[entry_type] != 0 ) || ( cache_ptr->max_index_len != 4 ) || - ( cache_ptr->max_index_size != 4 * entry_sizes[entry_type] ) || + ( cache_ptr->max_index_size != 4 * entry_sizes1[entry_type] ) || ( cache_ptr->max_slist_len != 4 ) || - ( cache_ptr->max_slist_size != 4 * entry_sizes[entry_type] ) || + ( cache_ptr->max_slist_size != 4 * entry_sizes1[entry_type] ) || ( cache_ptr->max_pl_len != 0 ) || ( cache_ptr->max_pl_size != (size_t)0 ) || ( cache_ptr->max_pel_len != 2 ) || - ( cache_ptr->max_pel_size != 2 * entry_sizes[entry_type] ) ) { + ( cache_ptr->max_pel_size != 2 * entry_sizes1[entry_type] ) ) { - pass = FALSE; - failure_mssg = "Unexpected insert results 11."; + pass1 = FALSE; + failure_mssg1 = "Unexpected insert results 11."; } } #endif /* H5C1_COLLECT_CACHE_STATS */ @@ -2943,34 +2943,34 @@ check_insert_entry(void) /* Unpin the pinned entries so we can take down the cache cleanly. */ - if ( pass ) { + if ( pass1 ) { - unpin_entry(cache_ptr, entry_type, 2); - unpin_entry(cache_ptr, entry_type, 3); + unpin_entry1(cache_ptr, entry_type, 2); + unpin_entry1(cache_ptr, entry_type, 3); } - if ( pass ) { + if ( pass1 ) { - takedown_cache(cache_ptr, FALSE, FALSE); + takedown_cache1(cache_ptr, FALSE, FALSE); } - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) { + if ( ! pass1 ) { - HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + HDfprintf(stdout, "%s(): failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } return; -} /* check_insert_entry() */ +} /* check_insert_entry1() */ /*------------------------------------------------------------------------- - * Function: check_flush_cache() + * Function: check_flush_cache1() * - * Purpose: Verify that flush_cache behaves as expected. In particular, + * Purpose: Verify that flush_cache1 behaves as expected. In particular, * test the behaviour with different flags. * * Return: void @@ -2984,25 +2984,25 @@ check_insert_entry(void) */ static void -check_flush_cache(void) +check_flush_cache1(void) { - const char * fcn_name = "check_flush_cache"; + const char * fcn_name = "check_flush_cache1"; H5C1_t * cache_ptr = NULL; TESTING("H5C1_flush_cache() functionality"); - pass = TRUE; + pass1 = TRUE; /* allocate a cache, and flush it under various circumstances. * To the extent possible, verify that the desired actions took * place. */ - if ( pass ) { + if ( pass1 ) { - reset_entries(); + reset_entries1(); - cache_ptr = setup_cache((size_t)(2 * 1024 * 1024), + cache_ptr = setup_cache1((size_t)(2 * 1024 * 1024), (size_t)(1 * 1024 * 1024)); } @@ -3010,52 +3010,52 @@ check_flush_cache(void) * checking in this case, so simply check the return values. */ - if ( pass ) { + if ( pass1 ) { - check_flush_cache__empty_cache(cache_ptr); + check_flush_cache1__empty_cache(cache_ptr); } /* now do a series of similar tests with a cache with a single entry. * Start with a clean entry, with no flags set. */ - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry(cache_ptr); + check_flush_cache1__single_entry(cache_ptr); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__multi_entry(cache_ptr); + check_flush_cache1__multi_entry(cache_ptr); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__flush_ops(cache_ptr); + check_flush_cache1__flush_ops(cache_ptr); } - if ( pass ) { + if ( pass1 ) { - takedown_cache(cache_ptr, FALSE, FALSE); + takedown_cache1(cache_ptr, FALSE, FALSE); } - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) { + if ( ! pass1 ) { - HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + HDfprintf(stdout, "%s(): failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } return; -} /* check_flush_cache() */ +} /* check_flush_cache1() */ /*------------------------------------------------------------------------- - * Function: check_flush_cache__empty_cache() + * Function: check_flush_cache1__empty_cache() * - * Purpose: Verify that flush_cache behaves as expected with an empty + * Purpose: Verify that flush_cache1 behaves as expected with an empty * cache. * * Return: void @@ -3069,21 +3069,21 @@ check_flush_cache(void) */ static void -check_flush_cache__empty_cache(H5C1_t * cache_ptr) +check_flush_cache1__empty_cache(H5C1_t * cache_ptr) { - /* const char * fcn_name = "check_flush_cache__empty_cache"; */ + /* const char * fcn_name = "check_flush_cache1__empty_cache"; */ herr_t result; if ( cache_ptr == NULL ) { - pass = FALSE; - failure_mssg = "cache_ptr NULL on entry to empty cache case."; + pass1 = FALSE; + failure_mssg1 = "cache_ptr NULL on entry to empty cache case."; } else if ( ( cache_ptr->index_len != 0 ) || ( cache_ptr->index_size != 0 ) ) { - pass = FALSE; - failure_mssg = "cache not empty at beginning of empty cache case."; + pass1 = FALSE; + failure_mssg1 = "cache not empty at beginning of empty cache case."; } @@ -3091,61 +3091,61 @@ check_flush_cache__empty_cache(H5C1_t * cache_ptr) * checking in this case, so simply check the return values. */ - if ( pass ) { + if ( pass1 ) { result = H5C1_flush_cache(NULL, -1, -1, cache_ptr, H5C1__NO_FLAGS_SET); if ( result < 0 ) { - pass = FALSE; - failure_mssg = "flush with flags = 0x00 failed on empty cache.\n"; + pass1 = FALSE; + failure_mssg1 = "flush with flags = 0x00 failed on empty cache.\n"; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_flush_cache(NULL, -1, -1, cache_ptr, H5C1__FLUSH_INVALIDATE_FLAG); if ( result < 0 ) { - pass = FALSE; - failure_mssg = "flush with flags = 0x04 failed on empty cache.\n"; + pass1 = FALSE; + failure_mssg1 = "flush with flags = 0x04 failed on empty cache.\n"; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_flush_cache(NULL, -1, -1, cache_ptr, H5C1__FLUSH_CLEAR_ONLY_FLAG); if ( result < 0 ) { - pass = FALSE; - failure_mssg = "flush with flags = 0x08 failed on empty cache.\n"; + pass1 = FALSE; + failure_mssg1 = "flush with flags = 0x08 failed on empty cache.\n"; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_flush_cache(NULL, -1, -1, cache_ptr, H5C1__FLUSH_MARKED_ENTRIES_FLAG); if ( result < 0 ) { - pass = FALSE; - failure_mssg = "flush with flags = 0x10 failed on empty cache.\n"; + pass1 = FALSE; + failure_mssg1 = "flush with flags = 0x10 failed on empty cache.\n"; } } -} /* check_flush_cache__empty_cache() */ +} /* check_flush_cache1__empty_cache() */ /*------------------------------------------------------------------------- - * Function: check_flush_cache__multi_entry() + * Function: check_flush_cache1__multi_entry() * - * Purpose: Verify that flush_cache behaves as expected when the cache + * Purpose: Verify that flush_cache1 behaves as expected when the cache * contains multiple elements. * * Return: void @@ -3162,23 +3162,23 @@ check_flush_cache__empty_cache(H5C1_t * cache_ptr) */ static void -check_flush_cache__multi_entry(H5C1_t * cache_ptr) +check_flush_cache1__multi_entry(H5C1_t * cache_ptr) { - /* const char * fcn_name = "check_flush_cache__multi_entry"; */ + /* const char * fcn_name = "check_flush_cache1__multi_entry"; */ if ( cache_ptr == NULL ) { - pass = FALSE; - failure_mssg = "cache_ptr NULL on entry to multi entry case."; + pass1 = FALSE; + failure_mssg1 = "cache_ptr NULL on entry to multi entry case."; } else if ( ( cache_ptr->index_len != 0 ) || ( cache_ptr->index_size != 0 ) ) { - pass = FALSE; - failure_mssg = "cache not empty at beginning of multi entry case."; + pass1 = FALSE; + failure_mssg1 = "cache not empty at beginning of multi entry case."; } - if ( pass ) + if ( pass1 ) { int test_num = 1; unsigned int flush_flags = H5C1__NO_FLAGS_SET; @@ -3283,12 +3283,12 @@ check_flush_cache__multi_entry(H5C1_t * cache_ptr) } }; - check_flush_cache__multi_entry_test(cache_ptr, test_num, + check_flush_cache1__multi_entry_test(cache_ptr, test_num, flush_flags, spec_size, spec); } - if ( pass ) + if ( pass1 ) { int test_num = 2; unsigned int flush_flags = H5C1__FLUSH_INVALIDATE_FLAG; @@ -3393,12 +3393,12 @@ check_flush_cache__multi_entry(H5C1_t * cache_ptr) } }; - check_flush_cache__multi_entry_test(cache_ptr, test_num, + check_flush_cache1__multi_entry_test(cache_ptr, test_num, flush_flags, spec_size, spec); } - if ( pass ) + if ( pass1 ) { int test_num = 3; unsigned int flush_flags = H5C1__FLUSH_CLEAR_ONLY_FLAG; @@ -3503,12 +3503,12 @@ check_flush_cache__multi_entry(H5C1_t * cache_ptr) } }; - check_flush_cache__multi_entry_test(cache_ptr, test_num, + check_flush_cache1__multi_entry_test(cache_ptr, test_num, flush_flags, spec_size, spec); } - if ( pass ) + if ( pass1 ) { int test_num = 4; unsigned int flush_flags = H5C1__FLUSH_MARKED_ENTRIES_FLAG; @@ -3613,12 +3613,12 @@ check_flush_cache__multi_entry(H5C1_t * cache_ptr) } }; - check_flush_cache__multi_entry_test(cache_ptr, test_num, + check_flush_cache1__multi_entry_test(cache_ptr, test_num, flush_flags, spec_size, spec); } - if ( pass ) + if ( pass1 ) { int test_num = 5; unsigned int flush_flags = H5C1__FLUSH_INVALIDATE_FLAG | @@ -3724,12 +3724,12 @@ check_flush_cache__multi_entry(H5C1_t * cache_ptr) } }; - check_flush_cache__multi_entry_test(cache_ptr, test_num, + check_flush_cache1__multi_entry_test(cache_ptr, test_num, flush_flags, spec_size, spec); } - if ( pass ) + if ( pass1 ) { int test_num = 6; unsigned int flush_flags = H5C1__FLUSH_INVALIDATE_FLAG | @@ -3835,12 +3835,12 @@ check_flush_cache__multi_entry(H5C1_t * cache_ptr) } }; - check_flush_cache__multi_entry_test(cache_ptr, test_num, + check_flush_cache1__multi_entry_test(cache_ptr, test_num, flush_flags, spec_size, spec); } - if ( pass ) + if ( pass1 ) { int test_num = 7; unsigned int flush_flags = H5C1__FLUSH_CLEAR_ONLY_FLAG | @@ -3946,12 +3946,12 @@ check_flush_cache__multi_entry(H5C1_t * cache_ptr) } }; - check_flush_cache__multi_entry_test(cache_ptr, test_num, + check_flush_cache1__multi_entry_test(cache_ptr, test_num, flush_flags, spec_size, spec); } - if ( pass ) + if ( pass1 ) { int test_num = 8; unsigned int flush_flags = H5C1__FLUSH_INVALIDATE_FLAG | @@ -4058,13 +4058,13 @@ check_flush_cache__multi_entry(H5C1_t * cache_ptr) } }; - check_flush_cache__multi_entry_test(cache_ptr, test_num, + check_flush_cache1__multi_entry_test(cache_ptr, test_num, flush_flags, spec_size, spec); } /* verify that all other flags are ignored */ - if ( pass ) + if ( pass1 ) { int test_num = 9; unsigned int flush_flags = (unsigned) @@ -4172,7 +4172,7 @@ check_flush_cache__multi_entry(H5C1_t * cache_ptr) } }; - check_flush_cache__multi_entry_test(cache_ptr, test_num, + check_flush_cache1__multi_entry_test(cache_ptr, test_num, flush_flags, spec_size, spec); } @@ -4182,7 +4182,7 @@ check_flush_cache__multi_entry(H5C1_t * cache_ptr) * of the flush routine to unravel collections of pinned entries. */ - if ( pass ) + if ( pass1 ) { int test_num = 1; unsigned int flush_flags = H5C1__NO_FLAGS_SET; @@ -4339,12 +4339,12 @@ check_flush_cache__multi_entry(H5C1_t * cache_ptr) } }; - check_flush_cache__pe_multi_entry_test(cache_ptr, test_num, + check_flush_cache1__pe_multi_entry_test(cache_ptr, test_num, flush_flags, spec_size, spec); } - if ( pass ) + if ( pass1 ) { int test_num = 2; unsigned int flush_flags = H5C1__FLUSH_INVALIDATE_FLAG; @@ -4485,11 +4485,11 @@ check_flush_cache__multi_entry(H5C1_t * cache_ptr) } }; - check_flush_cache__pe_multi_entry_test(cache_ptr, test_num, + check_flush_cache1__pe_multi_entry_test(cache_ptr, test_num, flush_flags, spec_size, spec); } - if ( pass ) + if ( pass1 ) { int test_num = 3; unsigned int flush_flags = H5C1__FLUSH_INVALIDATE_FLAG | @@ -4622,12 +4622,12 @@ check_flush_cache__multi_entry(H5C1_t * cache_ptr) } }; - check_flush_cache__pe_multi_entry_test(cache_ptr, test_num, + check_flush_cache1__pe_multi_entry_test(cache_ptr, test_num, flush_flags, spec_size, spec); } - if ( pass ) + if ( pass1 ) { int test_num = 4; unsigned int flush_flags = H5C1__FLUSH_INVALIDATE_FLAG | @@ -4768,12 +4768,12 @@ check_flush_cache__multi_entry(H5C1_t * cache_ptr) } }; - check_flush_cache__pe_multi_entry_test(cache_ptr, test_num, + check_flush_cache1__pe_multi_entry_test(cache_ptr, test_num, flush_flags, spec_size, spec); } - if ( pass ) + if ( pass1 ) { int test_num = 5; unsigned int flush_flags = H5C1__FLUSH_INVALIDATE_FLAG | @@ -4911,17 +4911,17 @@ check_flush_cache__multi_entry(H5C1_t * cache_ptr) } }; - check_flush_cache__pe_multi_entry_test(cache_ptr, test_num, + check_flush_cache1__pe_multi_entry_test(cache_ptr, test_num, flush_flags, spec_size, spec); } return; -} /* check_flush_cache__multi_entry() */ +} /* check_flush_cache1__multi_entry() */ /*------------------------------------------------------------------------- - * Function: check_flush_cache__multi_entry_test() + * Function: check_flush_cache1__multi_entry_test() * * Purpose: Run a multi entry flush cache test. * @@ -4936,13 +4936,13 @@ check_flush_cache__multi_entry(H5C1_t * cache_ptr) */ static void -check_flush_cache__multi_entry_test(H5C1_t * cache_ptr, +check_flush_cache1__multi_entry_test(H5C1_t * cache_ptr, int test_num, unsigned int flush_flags, int spec_size, struct flush_cache_test_spec spec[]) { - /* const char * fcn_name = "check_flush_cache__multi_entry_test"; */ + /* const char * fcn_name = "check_flush_cache1__multi_entry_test"; */ static char msg[128]; herr_t result; int i; @@ -4953,94 +4953,94 @@ check_flush_cache__multi_entry_test(H5C1_t * cache_ptr, #if 0 /* JRM */ /* This gets used a lot, so lets leave it in. */ - HDfprintf(stdout, "check_flush_cache__multi_entry_test: test %d\n", + HDfprintf(stdout, "check_flush_cache1__multi_entry_test: test %d\n", test_num); #endif /* JRM */ if ( cache_ptr == NULL ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "cache_ptr NULL on entry to single entry test #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ( cache_ptr->index_len != 0 ) || ( cache_ptr->index_size != 0 ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "cache not empty at beginning of multi entry test #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ( spec_size < 1 ) || ( spec == NULL ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "missing/bad test spec on entry to multi entry test #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } i = 0; - while ( ( pass ) && ( i < spec_size ) ) + while ( ( pass1 ) && ( i < spec_size ) ) { if ( ( spec[i].entry_num != i ) || ( spec[i].entry_type < 0 ) || ( spec[i].entry_type >= NUMBER_OF_ENTRY_TYPES ) || ( spec[i].entry_index < 0 ) || - ( spec[i].entry_index > max_indices[spec[i].entry_type] ) ) { + ( spec[i].entry_index > max_indices1[spec[i].entry_type] ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "bad data in spec[%d] on entry to multi entry test #%d.", i, test_num); - failure_mssg = msg; + failure_mssg1 = msg; } i++; } i = 0; - while ( ( pass ) && ( i < spec_size ) ) + while ( ( pass1 ) && ( i < spec_size ) ) { if ( spec[i].insert_flag ) { - insert_entry(cache_ptr, spec[i].entry_type, spec[i].entry_index, + insert_entry1(cache_ptr, spec[i].entry_type, spec[i].entry_index, spec[i].dirty_flag, spec[i].flags); } else { - protect_entry(cache_ptr, spec[i].entry_type, spec[i].entry_index); + protect_entry1(cache_ptr, spec[i].entry_type, spec[i].entry_index); - unprotect_entry(cache_ptr, spec[i].entry_type, spec[i].entry_index, + unprotect_entry1(cache_ptr, spec[i].entry_type, spec[i].entry_index, (int)(spec[i].dirty_flag), spec[i].flags); } - total_entry_size += entry_sizes[spec[i].entry_type]; + total_entry_size += entry_sizes1[spec[i].entry_type]; i++; } - if ( pass ) { + if ( pass1 ) { result = H5C1_flush_cache(NULL, -1, -1, cache_ptr, flush_flags); if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "flush with flags 0x%x failed in multi entry test #%d.", flush_flags, test_num); - failure_mssg = msg; + failure_mssg1 = msg; } } i = 0; - while ( ( pass ) && ( i < spec_size ) ) + while ( ( pass1 ) && ( i < spec_size ) ) { - base_addr = entries[spec[i].entry_type]; + base_addr = entries1[spec[i].entry_type]; entry_ptr = &(base_addr[spec[i].entry_index]); if ( ( entry_ptr->loaded != spec[i].expected_loaded ) || @@ -5063,16 +5063,16 @@ check_flush_cache__multi_entry_test(H5C1_t * cache_ptr, #endif - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Bad status on entry %d after flush in multi entry test #%d.", i, test_num); - failure_mssg = msg; + failure_mssg1 = msg; } i++; } - if ( pass ) { + if ( pass1 ) { if ( ( ( (flush_flags & H5C1__FLUSH_INVALIDATE_FLAG) == 0 ) && @@ -5091,44 +5091,44 @@ check_flush_cache__multi_entry_test(H5C1_t * cache_ptr, ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected cache len/size after flush in multi entry test #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } } /* clean up the cache to prep for the next test */ - if ( pass ) { + if ( pass1 ) { result = H5C1_flush_cache(NULL, -1, -1, cache_ptr, H5C1__FLUSH_INVALIDATE_FLAG); if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Flush failed on cleanup in multi entry test #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ( cache_ptr->index_len != 0 ) || ( cache_ptr->index_size != 0 ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected cache len/size after cleanup in multi entry test #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } } i = 0; - while ( ( pass ) && ( i < spec_size ) ) + while ( ( pass1 ) && ( i < spec_size ) ) { - base_addr = entries[spec[i].entry_type]; + base_addr = entries1[spec[i].entry_type]; entry_ptr = &(base_addr[spec[i].entry_index]); entry_ptr->loaded = FALSE; @@ -5141,11 +5141,11 @@ check_flush_cache__multi_entry_test(H5C1_t * cache_ptr, return; -} /* check_flush_cache__multi_entry_test() */ +} /* check_flush_cache1__multi_entry_test() */ /*------------------------------------------------------------------------- - * Function: check_flush_cache__pe_multi_entry_test() + * Function: check_flush_cache1__pe_multi_entry_test() * * Purpose: Run a multi entry flush cache test. * @@ -5160,13 +5160,13 @@ check_flush_cache__multi_entry_test(H5C1_t * cache_ptr, */ static void -check_flush_cache__pe_multi_entry_test(H5C1_t * cache_ptr, +check_flush_cache1__pe_multi_entry_test(H5C1_t * cache_ptr, int test_num, unsigned int flush_flags, int spec_size, struct pe_flush_cache_test_spec spec[]) { - /* const char * fcn_name = "check_flush_cache__pe_multi_entry_test"; */ + /* const char * fcn_name = "check_flush_cache1__pe_multi_entry_test"; */ static char msg[128]; herr_t result; int i; @@ -5178,78 +5178,78 @@ check_flush_cache__pe_multi_entry_test(H5C1_t * cache_ptr, #if 0 /* JRM */ /* This is useful debugging code. Leave it in for now. */ - HDfprintf(stdout, "check_flush_cache__pe_multi_entry_test: test %d\n", + HDfprintf(stdout, "check_flush_cache1__pe_multi_entry_test: test %d\n", test_num); #endif /* JRM */ if ( cache_ptr == NULL ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "cache_ptr NULL on entry to pe multi entry test #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ( cache_ptr->index_len != 0 ) || ( cache_ptr->index_size != 0 ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "cache not empty at beginning of pe multi entry test #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ( spec_size < 1 ) || ( spec == NULL ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "missing/bad test spec on entry to pe multi entry test #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } i = 0; - while ( ( pass ) && ( i < spec_size ) ) + while ( ( pass1 ) && ( i < spec_size ) ) { if ( ( spec[i].entry_num != i ) || ( spec[i].entry_type < 0 ) || ( spec[i].entry_type >= NUMBER_OF_ENTRY_TYPES ) || ( spec[i].entry_index < 0 ) || - ( spec[i].entry_index > max_indices[spec[i].entry_type] ) || + ( spec[i].entry_index > max_indices1[spec[i].entry_type] ) || ( spec[i].num_pins < 0 ) || ( spec[i].num_pins > MAX_PINS ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "bad data in spec[%d] on entry to pe multi entry test #%d.", i, test_num); - failure_mssg = msg; + failure_mssg1 = msg; } i++; } i = 0; - while ( ( pass ) && ( i < spec_size ) ) + while ( ( pass1 ) && ( i < spec_size ) ) { if ( spec[i].insert_flag ) { - insert_entry(cache_ptr, spec[i].entry_type, spec[i].entry_index, + insert_entry1(cache_ptr, spec[i].entry_type, spec[i].entry_index, spec[i].dirty_flag, spec[i].flags); } else { - protect_entry(cache_ptr, spec[i].entry_type, spec[i].entry_index); + protect_entry1(cache_ptr, spec[i].entry_type, spec[i].entry_index); - unprotect_entry(cache_ptr, spec[i].entry_type, spec[i].entry_index, + unprotect_entry1(cache_ptr, spec[i].entry_type, spec[i].entry_index, (int)(spec[i].dirty_flag), spec[i].flags); } - total_entry_size += entry_sizes[spec[i].entry_type]; + total_entry_size += entry_sizes1[spec[i].entry_type]; for ( j = 0; j < spec[i].num_pins; j++ ) { - create_pinned_entry_dependency(cache_ptr, + create_pinned_entry_dependency1(cache_ptr, spec[i].entry_type, spec[i].entry_index, spec[i].pin_type[j], @@ -5259,24 +5259,24 @@ check_flush_cache__pe_multi_entry_test(H5C1_t * cache_ptr, i++; } - if ( pass ) { + if ( pass1 ) { result = H5C1_flush_cache(NULL, -1, -1, cache_ptr, flush_flags); if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "flush with flags 0x%x failed in pe multi entry test #%d.", flush_flags, test_num); - failure_mssg = msg; + failure_mssg1 = msg; } } i = 0; - while ( ( pass ) && ( i < spec_size ) ) + while ( ( pass1 ) && ( i < spec_size ) ) { - base_addr = entries[spec[i].entry_type]; + base_addr = entries1[spec[i].entry_type]; entry_ptr = &(base_addr[spec[i].entry_index]); if ( ( entry_ptr->loaded != spec[i].expected_loaded ) || @@ -5299,16 +5299,16 @@ check_flush_cache__pe_multi_entry_test(H5C1_t * cache_ptr, #endif - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Bad status on entry %d after flush in pe multi entry test #%d.", i, test_num); - failure_mssg = msg; + failure_mssg1 = msg; } i++; } - if ( pass ) { + if ( pass1 ) { if ( ( ( (flush_flags & H5C1__FLUSH_INVALIDATE_FLAG) == 0 ) && @@ -5327,44 +5327,44 @@ check_flush_cache__pe_multi_entry_test(H5C1_t * cache_ptr, ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected cache len/size after flush in pe multi entry test #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } } /* clean up the cache to prep for the next test */ - if ( pass ) { + if ( pass1 ) { result = H5C1_flush_cache(NULL, -1, -1, cache_ptr, H5C1__FLUSH_INVALIDATE_FLAG); if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Flush failed on cleanup in pe multi entry test #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ( cache_ptr->index_len != 0 ) || ( cache_ptr->index_size != 0 ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected cache len/size after cleanup in pe multi entry test #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } } i = 0; - while ( ( pass ) && ( i < spec_size ) ) + while ( ( pass1 ) && ( i < spec_size ) ) { - base_addr = entries[spec[i].entry_type]; + base_addr = entries1[spec[i].entry_type]; entry_ptr = &(base_addr[spec[i].entry_index]); entry_ptr->loaded = FALSE; @@ -5377,11 +5377,11 @@ check_flush_cache__pe_multi_entry_test(H5C1_t * cache_ptr, return; -} /* check_flush_cache__pe_multi_entry_test() */ +} /* check_flush_cache1__pe_multi_entry_test() */ /*------------------------------------------------------------------------- - * Function: check_flush_cache__flush_ops() + * Function: check_flush_cache1__flush_ops() * * Purpose: Run the flush ops cache tests. * @@ -5389,7 +5389,7 @@ check_flush_cache__pe_multi_entry_test(H5C1_t * cache_ptr, * the case in which the flush callback dirties, resizes, * and/or renames entries. * - * Do nothing if pass is FALSE on entry. + * Do nothing if pass1 is FALSE on entry. * * Return: void * @@ -5402,23 +5402,23 @@ check_flush_cache__pe_multi_entry_test(H5C1_t * cache_ptr, */ static void -check_flush_cache__flush_ops(H5C1_t * cache_ptr) +check_flush_cache1__flush_ops(H5C1_t * cache_ptr) { - /* const char * fcn_name = "check_flush_cache__flush_ops"; */ + /* const char * fcn_name = "check_flush_cache1__flush_ops"; */ if ( cache_ptr == NULL ) { - pass = FALSE; - failure_mssg = "cache_ptr NULL on entry to flush ops test."; + pass1 = FALSE; + failure_mssg1 = "cache_ptr NULL on entry to flush ops test."; } else if ( ( cache_ptr->index_len != 0 ) || ( cache_ptr->index_size != 0 ) ) { - pass = FALSE; - failure_mssg = "cache not empty at beginning of flush ops test."; + pass1 = FALSE; + failure_mssg1 = "cache not empty at beginning of flush ops test."; } - if ( pass ) /* test #1 */ + if ( pass1 ) /* test #1 */ { /* start with a very simple test, in which there are two entries * resident in cache, and the second entry dirties the first in @@ -5510,7 +5510,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) } }; - check_flush_cache__flush_op_test(cache_ptr, + check_flush_cache1__flush_op_test(cache_ptr, test_num, flush_flags, spec_size, @@ -5523,7 +5523,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) checks); } - if ( pass ) /* test #2 */ + if ( pass1 ) /* test #2 */ { /* Same as test 1, only this time set the flush invalidate flag. * Note that we must repeat all tests with the flush invalidate flag @@ -5618,7 +5618,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) } }; - check_flush_cache__flush_op_test(cache_ptr, + check_flush_cache1__flush_op_test(cache_ptr, test_num, flush_flags, spec_size, @@ -5631,7 +5631,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) checks); } - if ( pass ) /* test #3 */ + if ( pass1 ) /* test #3 */ { /* Single entry test verifying that the cache can handle the case in * which the call back function resizes the entry for which it has @@ -5695,7 +5695,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) } }; - check_flush_cache__flush_op_test(cache_ptr, + check_flush_cache1__flush_op_test(cache_ptr, test_num, flush_flags, spec_size, @@ -5708,7 +5708,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) checks); } - if ( pass ) /* test #4 */ + if ( pass1 ) /* test #4 */ { /* Repeat test #4 with the flush invalidate flag. * @@ -5774,7 +5774,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) } }; - check_flush_cache__flush_op_test(cache_ptr, + check_flush_cache1__flush_op_test(cache_ptr, test_num, flush_flags, spec_size, @@ -5787,7 +5787,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) checks); } - if ( pass ) /* test #5 & #6 */ + if ( pass1 ) /* test #5 & #6 */ { /* Single entry test verifying that the cache can handle the case in * which the call back function renames the entry for which it has @@ -5854,7 +5854,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) } }; - check_flush_cache__flush_op_test(cache_ptr, + check_flush_cache1__flush_op_test(cache_ptr, test_num, flush_flags, spec_size, @@ -5877,12 +5877,12 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) * matter in this case. But we will do similar tests later with * other entries in the cache. */ - if ( pass ) { + if ( pass1 ) { spec[0].flush_ops[0].flag = TRUE; test_num = 6; - check_flush_cache__flush_op_test(cache_ptr, + check_flush_cache1__flush_op_test(cache_ptr, test_num, flush_flags, spec_size, @@ -5896,7 +5896,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) } } - if ( pass ) /* test #7 & #8 */ + if ( pass1 ) /* test #7 & #8 */ { /* Run tests 5 & 6 again, using the flush invalidate flag on the * second test. @@ -5966,7 +5966,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) } }; - check_flush_cache__flush_op_test(cache_ptr, + check_flush_cache1__flush_op_test(cache_ptr, test_num, flush_flags, spec_size, @@ -5990,7 +5990,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) * other entries in the cache. */ - if ( pass ) { + if ( pass1 ) { test_num = 8; flush_flags = H5C1__FLUSH_INVALIDATE_FLAG; @@ -5999,7 +5999,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) spec[0].flush_ops[0].flag = TRUE; spec[0].expected_destroyed = TRUE; - check_flush_cache__flush_op_test(cache_ptr, + check_flush_cache1__flush_op_test(cache_ptr, test_num, flush_flags, spec_size, @@ -6013,7 +6013,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) } } - if ( pass ) /* test #9 & #10 */ + if ( pass1 ) /* test #9 & #10 */ { /* Single entry test verifying that the cache can handle the case in * which the call back function both resizes and renames the entry @@ -6080,7 +6080,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) } }; - check_flush_cache__flush_op_test(cache_ptr, + check_flush_cache1__flush_op_test(cache_ptr, test_num, flush_flags, spec_size, @@ -6103,12 +6103,12 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) * matter in this case. But we will do similar tests later with * other entries in the cache. */ - if ( pass ) { + if ( pass1 ) { spec[0].flush_ops[0].flag = TRUE; test_num = 10; - check_flush_cache__flush_op_test(cache_ptr, + check_flush_cache1__flush_op_test(cache_ptr, test_num, flush_flags, spec_size, @@ -6122,7 +6122,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) } } - if ( pass ) /* test #11 & #12 */ + if ( pass1 ) /* test #11 & #12 */ { /* Repeat the previous test with the flush invalidate flag on the * second test. @@ -6192,7 +6192,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) } }; - check_flush_cache__flush_op_test(cache_ptr, + check_flush_cache1__flush_op_test(cache_ptr, test_num, flush_flags, spec_size, @@ -6215,7 +6215,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) * matter in this case. But we will do similar tests later with * other entries in the cache. */ - if ( pass ) { + if ( pass1 ) { test_num = 12; flush_flags = H5C1__FLUSH_INVALIDATE_FLAG; @@ -6225,7 +6225,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) spec[0].expected_destroyed = TRUE; - check_flush_cache__flush_op_test(cache_ptr, + check_flush_cache1__flush_op_test(cache_ptr, test_num, flush_flags, spec_size, @@ -6239,7 +6239,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) } } - if ( pass ) /* test #13 */ + if ( pass1 ) /* test #13 */ { /* Test the ability of the cache to handle the case in which * the flush function of an entry that is resident in cache @@ -6322,7 +6322,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) } }; - check_flush_cache__flush_op_test(cache_ptr, + check_flush_cache1__flush_op_test(cache_ptr, test_num, flush_flags, spec_size, @@ -6335,7 +6335,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) checks); } - if ( pass ) /* test #14 */ + if ( pass1 ) /* test #14 */ { /* Repeat previous test with the flush invalidate flag. * @@ -6420,7 +6420,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) } }; - check_flush_cache__flush_op_test(cache_ptr, + check_flush_cache1__flush_op_test(cache_ptr, test_num, flush_flags, spec_size, @@ -6433,7 +6433,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) checks); } - if ( pass ) /* test #15 */ + if ( pass1 ) /* test #15 */ { /* Test the ability of the cache to handle the case in which * the flush function of an entry that is resident in cache @@ -6517,7 +6517,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) } }; - check_flush_cache__flush_op_test(cache_ptr, + check_flush_cache1__flush_op_test(cache_ptr, test_num, flush_flags, spec_size, @@ -6530,7 +6530,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) checks); } - if ( pass ) /* test #16 */ + if ( pass1 ) /* test #16 */ { /* Repeat previous test with the flush invalidate flag. * @@ -6614,7 +6614,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) } }; - check_flush_cache__flush_op_test(cache_ptr, + check_flush_cache1__flush_op_test(cache_ptr, test_num, flush_flags, spec_size, @@ -6627,7 +6627,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) checks); } - if ( pass ) /* test #17 & #18 */ + if ( pass1 ) /* test #17 & #18 */ { /* Test the ability of the cache to handle the case in which * the flush function of an entry that is resident in cache @@ -6711,7 +6711,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) } }; - check_flush_cache__flush_op_test(cache_ptr, + check_flush_cache1__flush_op_test(cache_ptr, test_num, flush_flags, spec_size, @@ -6731,7 +6731,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) * the renamed entries are moved forward in the slist. In the second * they are moved backwards. */ - if ( pass ) { + if ( pass1 ) { test_num = 18; spec[0].flush_ops[2].flag = TRUE; @@ -6739,7 +6739,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) checks[0].at_main_addr = TRUE; checks[1].at_main_addr = TRUE; - check_flush_cache__flush_op_test(cache_ptr, + check_flush_cache1__flush_op_test(cache_ptr, test_num, flush_flags, spec_size, @@ -6753,7 +6753,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) } } - if ( pass ) /* test #19 & #20 */ + if ( pass1 ) /* test #19 & #20 */ { /* Repeat the above test with the flush invalidate flag on the * second test. @@ -6840,7 +6840,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) } }; - check_flush_cache__flush_op_test(cache_ptr, + check_flush_cache1__flush_op_test(cache_ptr, test_num, flush_flags, spec_size, @@ -6860,7 +6860,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) * the renamed entries are moved forward in the slist. In the second * they are moved backwards. */ - if ( pass ) { + if ( pass1 ) { test_num = 20; flush_flags = H5C1__FLUSH_INVALIDATE_FLAG; @@ -6876,7 +6876,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) checks[1].in_cache = FALSE; checks[1].expected_destroyed = TRUE; - check_flush_cache__flush_op_test(cache_ptr, + check_flush_cache1__flush_op_test(cache_ptr, test_num, flush_flags, spec_size, @@ -6890,7 +6890,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) } } - if ( pass ) /* test #21 */ + if ( pass1 ) /* test #21 */ { /* Now mix things up a bit. * @@ -7095,7 +7095,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) } }; - check_flush_cache__flush_op_test(cache_ptr, + check_flush_cache1__flush_op_test(cache_ptr, test_num, flush_flags, spec_size, @@ -7106,10 +7106,10 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) expected_index_size, check_size, checks); - reset_entries(); + reset_entries1(); } - if ( pass ) /* test #22 */ + if ( pass1 ) /* test #22 */ { /* Mix things up some more. * @@ -7366,7 +7366,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) } }; - check_flush_cache__flush_op_test(cache_ptr, + check_flush_cache1__flush_op_test(cache_ptr, test_num, flush_flags, spec_size, @@ -7377,10 +7377,10 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) expected_index_size, check_size, checks); - reset_entries(); + reset_entries1(); } - if ( pass ) /* test #23 */ + if ( pass1 ) /* test #23 */ { /* Repeat test #23 with the flush invalidate flag set. * @@ -7636,7 +7636,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) } }; - check_flush_cache__flush_op_test(cache_ptr, + check_flush_cache1__flush_op_test(cache_ptr, test_num, flush_flags, spec_size, @@ -7647,14 +7647,14 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) expected_index_size, check_size, checks); - reset_entries(); + reset_entries1(); } /* So much for tests involving only flush operations. * * Now create some tests mixing flush ops and pins. */ - if ( pass ) /* test #24 */ + if ( pass1 ) /* test #24 */ { /* Pico entries 50 and 150 pin pico entry 100, and also dirty * pico entry 100 on flush. @@ -7773,7 +7773,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) } }; - check_flush_cache__flush_op_test(cache_ptr, + check_flush_cache1__flush_op_test(cache_ptr, test_num, flush_flags, spec_size, @@ -7786,7 +7786,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) checks); } - if ( pass ) /* test #25 */ + if ( pass1 ) /* test #25 */ { /* Repeat the previous test with the flush invalidate flag. * @@ -7907,7 +7907,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) } }; - check_flush_cache__flush_op_test(cache_ptr, + check_flush_cache1__flush_op_test(cache_ptr, test_num, flush_flags, spec_size, @@ -7920,7 +7920,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) checks); } - if ( pass ) /* test #26 */ + if ( pass1 ) /* test #26 */ { /* This one is complex. * @@ -8338,7 +8338,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) }; - check_flush_cache__flush_op_test(cache_ptr, + check_flush_cache1__flush_op_test(cache_ptr, test_num, flush_flags, spec_size, @@ -8350,10 +8350,10 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) check_size, checks); - reset_entries(); + reset_entries1(); } - if ( pass ) /* test #27 */ + if ( pass1 ) /* test #27 */ { /* Repeat test #26 with the flush invalidate flag. * @@ -8775,7 +8775,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) }; - check_flush_cache__flush_op_test(cache_ptr, + check_flush_cache1__flush_op_test(cache_ptr, test_num, flush_flags, spec_size, @@ -8787,10 +8787,10 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) check_size, checks); - reset_entries(); + reset_entries1(); } - if ( pass ) /* test #28 */ + if ( pass1 ) /* test #28 */ { /* Test the expected fheap case, in which an entry dirties * and resizes itself, and dirties an entry which it has @@ -8966,7 +8966,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) } }; - check_flush_cache__flush_op_test(cache_ptr, + check_flush_cache1__flush_op_test(cache_ptr, test_num, flush_flags, spec_size, @@ -8978,10 +8978,10 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) check_size, checks); - reset_entries(); + reset_entries1(); } - if ( pass ) /* test #29 */ + if ( pass1 ) /* test #29 */ { /* Repeat test #28 with the flush invalidate flag. * @@ -9159,7 +9159,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) } }; - check_flush_cache__flush_op_test(cache_ptr, + check_flush_cache1__flush_op_test(cache_ptr, test_num, flush_flags, spec_size, @@ -9171,19 +9171,19 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) check_size, checks); - reset_entries(); + reset_entries1(); } /* finally finish up with the flush ops eviction test */ - check_flush_cache__flush_op_eviction_test(cache_ptr); + check_flush_cache1__flush_op_eviction_test(cache_ptr); return; -} /* check_flush_cache__flush_ops() */ +} /* check_flush_cache1__flush_ops() */ /*------------------------------------------------------------------------- - * Function: check_flush_cache__flush_op_test() + * Function: check_flush_cache1__flush_op_test() * * Purpose: Run a flush op flush cache test. Of the nature of * flush operations, this is a multi-entry test. @@ -9199,7 +9199,7 @@ check_flush_cache__flush_ops(H5C1_t * cache_ptr) */ static void -check_flush_cache__flush_op_test(H5C1_t * cache_ptr, +check_flush_cache1__flush_op_test(H5C1_t * cache_ptr, int test_num, unsigned int flush_flags, int spec_size, @@ -9211,7 +9211,7 @@ check_flush_cache__flush_op_test(H5C1_t * cache_ptr, int check_size, struct fo_flush_entry_check check[]) { - /* const char * fcn_name = "check_flush_cache__flush_op_test"; */ + /* const char * fcn_name = "check_flush_cache1__flush_op_test"; */ static char msg[128]; herr_t result; int i; @@ -9220,67 +9220,67 @@ check_flush_cache__flush_op_test(H5C1_t * cache_ptr, test_entry_t * entry_ptr; #if 0 /* This is useful debugging code -- lets keep it around. */ - HDfprintf(stdout, "check_flush_cache__flush_op_test: test %d\n", + HDfprintf(stdout, "check_flush_cache1__flush_op_test: test %d\n", test_num); #endif if ( cache_ptr == NULL ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "cache_ptr NULL on entry to flush op test #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ( cache_ptr->index_len != 0 ) || ( cache_ptr->index_size != 0 ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "cache not empty at beginning of flush op test #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ( spec_size < 1 ) || ( spec == NULL ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "missing/bad test spec on entry to flush op test #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } i = 0; - while ( ( pass ) && ( i < spec_size ) ) + while ( ( pass1 ) && ( i < spec_size ) ) { if ( ( spec[i].entry_num != i ) || ( spec[i].entry_type < 0 ) || ( spec[i].entry_type >= NUMBER_OF_ENTRY_TYPES ) || ( spec[i].entry_index < 0 ) || - ( spec[i].entry_index > max_indices[spec[i].entry_type] ) || + ( spec[i].entry_index > max_indices1[spec[i].entry_type] ) || ( spec[i].num_pins < 0 ) || ( spec[i].num_pins > MAX_PINS ) || ( spec[i].num_flush_ops < 0 ) || ( spec[i].num_flush_ops > MAX_FLUSH_OPS ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "bad data in spec[%d] on entry to flush op test #%d.", i, test_num); - failure_mssg = msg; + failure_mssg1 = msg; } i++; } i = 0; - while ( ( pass ) && ( i < check_size ) ) + while ( ( pass1 ) && ( i < check_size ) ) { if ( ( check[i].entry_num != i ) || ( check[i].entry_type < 0 ) || ( check[i].entry_type >= NUMBER_OF_ENTRY_TYPES ) || ( check[i].entry_index < 0 ) || - ( check[i].entry_index > max_indices[check[i].entry_type] ) || + ( check[i].entry_index > max_indices1[check[i].entry_type] ) || ( check[i].expected_size <= (size_t)0 ) || ( ( check[i].in_cache != TRUE ) && ( check[i].in_cache != FALSE ) ) || @@ -9301,35 +9301,35 @@ check_flush_cache__flush_op_test(H5C1_t * cache_ptr, ( ( check[i].expected_destroyed != TRUE ) && ( check[i].expected_destroyed != FALSE ) ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "bad data in check[%d] on entry to flush op test #%d.", i, test_num); - failure_mssg = msg; + failure_mssg1 = msg; } i++; } i = 0; - while ( ( pass ) && ( i < spec_size ) ) + while ( ( pass1 ) && ( i < spec_size ) ) { if ( spec[i].insert_flag ) { - insert_entry(cache_ptr, spec[i].entry_type, spec[i].entry_index, + insert_entry1(cache_ptr, spec[i].entry_type, spec[i].entry_index, TRUE, spec[i].flags); } else { - protect_entry(cache_ptr, spec[i].entry_type, spec[i].entry_index); + protect_entry1(cache_ptr, spec[i].entry_type, spec[i].entry_index); - unprotect_entry_with_size_change(cache_ptr, spec[i].entry_type, + unprotect_entry1_with_size_change(cache_ptr, spec[i].entry_type, spec[i].entry_index, spec[i].flags, spec[i].new_size); } for ( j = 0; j < spec[i].num_pins; j++ ) { - create_pinned_entry_dependency(cache_ptr, + create_pinned_entry_dependency1(cache_ptr, spec[i].entry_type, spec[i].entry_index, spec[i].pin_type[j], @@ -9338,7 +9338,7 @@ check_flush_cache__flush_op_test(H5C1_t * cache_ptr, for ( j = 0; j < spec[i].num_flush_ops; j++ ) { - add_flush_op(spec[i].entry_type, + add_flush_op1(spec[i].entry_type, spec[i].entry_index, spec[i].flush_ops[j].op_code, spec[i].flush_ops[j].type, @@ -9350,38 +9350,38 @@ check_flush_cache__flush_op_test(H5C1_t * cache_ptr, i++; } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->index_len != init_expected_index_len ) || ( cache_ptr->index_size != init_expected_index_size ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected cache len/size before flush in flush op test #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_flush_cache(NULL, -1, -1, cache_ptr, flush_flags); if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "flush with flags 0x%x failed in flush op test #%d.", flush_flags, test_num); - failure_mssg = msg; + failure_mssg1 = msg; } } i = 0; - while ( ( pass ) && ( i < spec_size ) ) + while ( ( pass1 ) && ( i < spec_size ) ) { - base_addr = entries[spec[i].entry_type]; + base_addr = entries1[spec[i].entry_type]; entry_ptr = &(base_addr[spec[i].entry_index]); if ( ( entry_ptr->loaded != spec[i].expected_loaded ) || @@ -9406,32 +9406,32 @@ check_flush_cache__flush_op_test(H5C1_t * cache_ptr, (int)(entry_ptr->header.is_dirty)); #endif - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Bad status on entry %d after flush op test #%d.", i, test_num); - failure_mssg = msg; + failure_mssg1 = msg; } i++; } - if ( pass ) { + if ( pass1 ) { i = 0; - while ( ( pass ) && ( i < check_size ) ) + while ( ( pass1 ) && ( i < check_size ) ) { - if ( check[i].in_cache != entry_in_cache(cache_ptr, + if ( check[i].in_cache != entry_in_cache1(cache_ptr, check[i].entry_type, check[i].entry_index) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Check1 failed on entry %d after flush op test #%d.", i, test_num); - failure_mssg = msg; + failure_mssg1 = msg; } - base_addr = entries[check[i].entry_type]; + base_addr = entries1[check[i].entry_type]; entry_ptr = &(base_addr[check[i].entry_index]); if ( ( entry_ptr->size != check[i].expected_size ) || @@ -9523,17 +9523,17 @@ check_flush_cache__flush_op_test(H5C1_t * cache_ptr, (int)(check[i].expected_destroyed)); } #endif - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Check2 failed on entry %d after flush op test #%d.", i, test_num); - failure_mssg = msg; + failure_mssg1 = msg; } i++; } } - if ( pass ) { + if ( pass1 ) { if ( ( ( (flush_flags & H5C1__FLUSH_INVALIDATE_FLAG) == 0 ) && @@ -9552,47 +9552,47 @@ check_flush_cache__flush_op_test(H5C1_t * cache_ptr, ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected cache len/size after flush in flush op test #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } } /* clean up the cache to prep for the next test */ - if ( pass ) { + if ( pass1 ) { result = H5C1_flush_cache(NULL, -1, -1, cache_ptr, H5C1__FLUSH_INVALIDATE_FLAG); if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Flush failed on cleanup in flush op test #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ( cache_ptr->index_len != 0 ) || ( cache_ptr->index_size != 0 ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected cache len/size after cleanup in flush op test #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } } i = 0; - while ( ( pass ) && ( i < spec_size ) ) + while ( ( pass1 ) && ( i < spec_size ) ) { - base_addr = entries[spec[i].entry_type]; + base_addr = entries1[spec[i].entry_type]; entry_ptr = &(base_addr[spec[i].entry_index]); - entry_ptr->size = entry_sizes[spec[i].entry_type]; + entry_ptr->size = entry_sizes1[spec[i].entry_type]; entry_ptr->loaded = FALSE; entry_ptr->cleared = FALSE; @@ -9603,12 +9603,12 @@ check_flush_cache__flush_op_test(H5C1_t * cache_ptr, } i = 0; - while ( ( pass ) && ( i < check_size ) ) + while ( ( pass1 ) && ( i < check_size ) ) { - base_addr = entries[check[i].entry_type]; + base_addr = entries1[check[i].entry_type]; entry_ptr = &(base_addr[check[i].entry_index]); - entry_ptr->size = entry_sizes[check[i].entry_type]; + entry_ptr->size = entry_sizes1[check[i].entry_type]; entry_ptr->loaded = FALSE; entry_ptr->cleared = FALSE; @@ -9620,16 +9620,16 @@ check_flush_cache__flush_op_test(H5C1_t * cache_ptr, return; -} /* check_flush_cache__flush_op_test() */ +} /* check_flush_cache1__flush_op_test() */ /*------------------------------------------------------------------------- - * Function: check_flush_cache__flush_op_eviction_test() + * Function: check_flush_cache1__flush_op_eviction_test() * * Purpose: Verify that flush operations work as expected when an * entry is evicted. * - * Do nothing if pass is FALSE on entry. + * Do nothing if pass1 is FALSE on entry. * * Return: void * @@ -9642,13 +9642,13 @@ check_flush_cache__flush_op_test(H5C1_t * cache_ptr, */ static void -check_flush_cache__flush_op_eviction_test(H5C1_t * cache_ptr) +check_flush_cache1__flush_op_eviction_test(H5C1_t * cache_ptr) { - /* const char * fcn_name = "check_flush_cache__flush_op_eviction_test"; */ + /* const char * fcn_name = "check_flush_cache1__flush_op_eviction_test"; */ int i; - int num_variable_entries = 8; - int num_monster_entries = 31; - int num_large_entries = 0; + int num_variable_entries1 = 8; + int num_monster_entries1 = 31; + int num_large_entries1 = 0; herr_t result; test_entry_t * entry_ptr; test_entry_t * base_addr; @@ -9718,20 +9718,20 @@ check_flush_cache__flush_op_eviction_test(H5C1_t * cache_ptr) if ( cache_ptr == NULL ) { - pass = FALSE; - failure_mssg = "cache_ptr NULL on entry to flush ops test."; + pass1 = FALSE; + failure_mssg1 = "cache_ptr NULL on entry to flush ops test."; } else if ( ( cache_ptr->index_len != 0 ) || ( cache_ptr->index_size != 0 ) ) { - pass = FALSE; - failure_mssg = "cache not empty at start of flush ops eviction test."; + pass1 = FALSE; + failure_mssg1 = "cache not empty at start of flush ops eviction test."; } else if ( ( cache_ptr->max_cache_size != (2 * 1024 * 1024 ) ) || ( cache_ptr->min_clean_size != (1 * 1024 * 1024 ) ) ) { - pass = FALSE; - failure_mssg = "unexpected cache config at start of flush op eviction test."; + pass1 = FALSE; + failure_mssg1 = "unexpected cache config at start of flush op eviction test."; } else { @@ -9742,7 +9742,7 @@ check_flush_cache__flush_op_eviction_test(H5C1_t * cache_ptr) cache_ptr->min_clean_size = 0; } - if ( pass ) { + if ( pass1 ) { /* the basic idea in this test is to insert a bunch of entries * with flush operations associated with them, and then load @@ -9764,67 +9764,67 @@ check_flush_cache__flush_op_eviction_test(H5C1_t * cache_ptr) * Start by just loading the entries. */ - protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 0); - unprotect_entry_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 0, + protect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 0); + unprotect_entry1_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 0, H5C1__DIRTIED_FLAG | H5C1__SIZE_CHANGED_FLAG, (VARIABLE_ENTRY_SIZE / 2)); - protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 1); - unprotect_entry_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 1, + protect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 1); + unprotect_entry1_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 1, H5C1__NO_FLAGS_SET, (size_t)0); - protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 2); - unprotect_entry_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 2, + protect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 2); + unprotect_entry1_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 2, H5C1__NO_FLAGS_SET, (size_t)0); - protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 3); - unprotect_entry_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 3, + protect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 3); + unprotect_entry1_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 3, H5C1__DIRTIED_FLAG | H5C1__SIZE_CHANGED_FLAG, (VARIABLE_ENTRY_SIZE / 2)); - protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 4); - unprotect_entry_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 4, + protect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 4); + unprotect_entry1_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 4, H5C1__DIRTIED_FLAG | H5C1__SIZE_CHANGED_FLAG, (VARIABLE_ENTRY_SIZE / 2)); - protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 5); - unprotect_entry_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 5, + protect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 5); + unprotect_entry1_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 5, H5C1__DIRTIED_FLAG | H5C1__SIZE_CHANGED_FLAG, (VARIABLE_ENTRY_SIZE / 2)); - protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 6); - unprotect_entry_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 6, + protect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 6); + unprotect_entry1_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 6, H5C1__NO_FLAGS_SET, (size_t)0); - protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 7); - unprotect_entry_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 7, + protect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 7); + unprotect_entry1_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 7, H5C1__NO_FLAGS_SET, (size_t)0); if ( ( cache_ptr->index_len != 8 ) || ( cache_ptr->index_size != (4 * (VARIABLE_ENTRY_SIZE / 2)) + (4 * VARIABLE_ENTRY_SIZE) ) ) { - pass = FALSE; - failure_mssg = "unexpected size/len in flush op eviction test 1."; + pass1 = FALSE; + failure_mssg1 = "unexpected size/len in flush op eviction test 1."; } } - if ( pass ) { + if ( pass1 ) { /* Now set up the pinning relationships: * * Briefly, (VET, 0) is pinned by (VET, 1), (VET, 2), and (VET, 3) * (VET, 7) is pinned by (VET, 3), and (VET, 5) */ - create_pinned_entry_dependency(cache_ptr, VARIABLE_ENTRY_TYPE, 1, + create_pinned_entry_dependency1(cache_ptr, VARIABLE_ENTRY_TYPE, 1, VARIABLE_ENTRY_TYPE, 0); - create_pinned_entry_dependency(cache_ptr, VARIABLE_ENTRY_TYPE, 2, + create_pinned_entry_dependency1(cache_ptr, VARIABLE_ENTRY_TYPE, 2, VARIABLE_ENTRY_TYPE, 0); - create_pinned_entry_dependency(cache_ptr, VARIABLE_ENTRY_TYPE, 3, + create_pinned_entry_dependency1(cache_ptr, VARIABLE_ENTRY_TYPE, 3, VARIABLE_ENTRY_TYPE, 0); - create_pinned_entry_dependency(cache_ptr, VARIABLE_ENTRY_TYPE, 3, + create_pinned_entry_dependency1(cache_ptr, VARIABLE_ENTRY_TYPE, 3, VARIABLE_ENTRY_TYPE, 7); - create_pinned_entry_dependency(cache_ptr, VARIABLE_ENTRY_TYPE, 5, + create_pinned_entry_dependency1(cache_ptr, VARIABLE_ENTRY_TYPE, 5, VARIABLE_ENTRY_TYPE, 7); /* Next, set up the flush operations: @@ -9841,29 +9841,29 @@ check_flush_cache__flush_op_eviction_test(H5C1_t * cache_ptr) * * (VET, 7) dirties (VET, 6) */ - add_flush_op(VARIABLE_ENTRY_TYPE, 1, FLUSH_OP__DIRTY, + add_flush_op1(VARIABLE_ENTRY_TYPE, 1, FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 0, FALSE, (size_t)0); - add_flush_op(VARIABLE_ENTRY_TYPE, 1, FLUSH_OP__RESIZE, + add_flush_op1(VARIABLE_ENTRY_TYPE, 1, FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 0, FALSE, 3 * VARIABLE_ENTRY_SIZE / 4); - add_flush_op(VARIABLE_ENTRY_TYPE, 2, FLUSH_OP__DIRTY, + add_flush_op1(VARIABLE_ENTRY_TYPE, 2, FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 0, FALSE, (size_t)0); - add_flush_op(VARIABLE_ENTRY_TYPE, 2, FLUSH_OP__RESIZE, + add_flush_op1(VARIABLE_ENTRY_TYPE, 2, FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 0, FALSE, VARIABLE_ENTRY_SIZE); - add_flush_op(VARIABLE_ENTRY_TYPE, 2, FLUSH_OP__RENAME, + add_flush_op1(VARIABLE_ENTRY_TYPE, 2, FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 0, FALSE, (size_t)0); - add_flush_op(VARIABLE_ENTRY_TYPE, 3, FLUSH_OP__DIRTY, + add_flush_op1(VARIABLE_ENTRY_TYPE, 3, FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 0, FALSE, (size_t)0); - add_flush_op(VARIABLE_ENTRY_TYPE, 3, FLUSH_OP__RESIZE, + add_flush_op1(VARIABLE_ENTRY_TYPE, 3, FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 3, FALSE, VARIABLE_ENTRY_SIZE); - add_flush_op(VARIABLE_ENTRY_TYPE, 7, FLUSH_OP__DIRTY, + add_flush_op1(VARIABLE_ENTRY_TYPE, 7, FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 6, FALSE, (size_t)0); } - if ( pass ) { + if ( pass1 ) { /* to summarize, at present the following variable size entries * are in cache with the following characteristics: @@ -9899,15 +9899,15 @@ check_flush_cache__flush_op_eviction_test(H5C1_t * cache_ptr) /* Now fill up the cache with other, unrelated entries */ for ( i = 0; i < 31; i++ ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); - unprotect_entry_with_size_change(cache_ptr, MONSTER_ENTRY_TYPE, i, + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i); + unprotect_entry1_with_size_change(cache_ptr, MONSTER_ENTRY_TYPE, i, H5C1__DIRTIED_FLAG, (size_t)0); } for ( i = 0; i < 1; i++ ) { - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, i); - unprotect_entry_with_size_change(cache_ptr, LARGE_ENTRY_TYPE, i, + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, i); + unprotect_entry1_with_size_change(cache_ptr, LARGE_ENTRY_TYPE, i, H5C1__DIRTIED_FLAG, (size_t)0); } @@ -9919,22 +9919,22 @@ check_flush_cache__flush_op_eviction_test(H5C1_t * cache_ptr) (31 * MONSTER_ENTRY_SIZE) + (1 * LARGE_ENTRY_SIZE)) ) ) { - pass = FALSE; - failure_mssg = "unexpected size/len in flush op eviction test 2."; + pass1 = FALSE; + failure_mssg1 = "unexpected size/len in flush op eviction test 2."; } else { /* verify the expected status of all entries we have loaded to date: */ - num_large_entries = 1; - verify_entry_status(cache_ptr, + num_large_entries1 = 1; + verify_entry_status1(cache_ptr, 0, - (num_variable_entries + num_monster_entries + num_large_entries), + (num_variable_entries1 + num_monster_entries1 + num_large_entries1), expected); } } - if ( pass ) { + if ( pass1 ) { /* Now load a large entry. This should result in the eviction * of (VET,1), and the increase in the size of (VET, 0) from .5 @@ -9972,10 +9972,10 @@ check_flush_cache__flush_op_eviction_test(H5C1_t * cache_ptr) expected[1].flushed = TRUE; expected[1].destroyed = TRUE; - num_large_entries = 2; + num_large_entries1 = 2; - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, 1); - unprotect_entry_with_size_change(cache_ptr, LARGE_ENTRY_TYPE, 1, + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, 1); + unprotect_entry1_with_size_change(cache_ptr, LARGE_ENTRY_TYPE, 1, H5C1__DIRTIED_FLAG, (size_t)0); if ( ( cache_ptr->index_len != 40 ) || @@ -9989,18 +9989,18 @@ check_flush_cache__flush_op_eviction_test(H5C1_t * cache_ptr) (31 * MONSTER_ENTRY_SIZE) + (2 * LARGE_ENTRY_SIZE)) ) ) { - pass = FALSE; - failure_mssg = "unexpected size/len in flush op eviction test 3."; + pass1 = FALSE; + failure_mssg1 = "unexpected size/len in flush op eviction test 3."; } /* verify entry status */ - verify_entry_status(cache_ptr, + verify_entry_status1(cache_ptr, 1, - (num_variable_entries + num_monster_entries + num_large_entries), + (num_variable_entries1 + num_monster_entries1 + num_large_entries1), expected); } - if ( pass ) { + if ( pass1 ) { /* Now load another large entry. This should result in the eviction * of (VET, 2), the increase in the size of (VET, 0) from .75 @@ -10038,10 +10038,10 @@ check_flush_cache__flush_op_eviction_test(H5C1_t * cache_ptr) expected[2].flushed = TRUE; expected[2].destroyed = TRUE; - num_large_entries = 3; + num_large_entries1 = 3; - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, 2); - unprotect_entry_with_size_change(cache_ptr, LARGE_ENTRY_TYPE, 2, + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, 2); + unprotect_entry1_with_size_change(cache_ptr, LARGE_ENTRY_TYPE, 2, H5C1__DIRTIED_FLAG, (size_t)0); if ( ( cache_ptr->index_len != 40 ) || @@ -10054,18 +10054,18 @@ check_flush_cache__flush_op_eviction_test(H5C1_t * cache_ptr) (31 * MONSTER_ENTRY_SIZE) + (3 * LARGE_ENTRY_SIZE)) ) ) { - pass = FALSE; - failure_mssg = "unexpected size/len in flush op eviction test 4."; + pass1 = FALSE; + failure_mssg1 = "unexpected size/len in flush op eviction test 4."; } /* verify entry status */ - verify_entry_status(cache_ptr, + verify_entry_status1(cache_ptr, 2, - (num_variable_entries + num_monster_entries + num_large_entries), + (num_variable_entries1 + num_monster_entries1 + num_large_entries1), expected); } - if ( pass ) { + if ( pass1 ) { /* load two more large entries. This should result in (VET, 3) being * flushed, and increasing its size from 1/2 VARIABLE_ENTRY_SIZE to @@ -10111,14 +10111,14 @@ check_flush_cache__flush_op_eviction_test(H5C1_t * cache_ptr) expected[6].flushed = TRUE; expected[6].destroyed = TRUE; - num_large_entries = 5; + num_large_entries1 = 5; - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, 3); - unprotect_entry_with_size_change(cache_ptr, LARGE_ENTRY_TYPE, 3, + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, 3); + unprotect_entry1_with_size_change(cache_ptr, LARGE_ENTRY_TYPE, 3, H5C1__DIRTIED_FLAG, (size_t)0); - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, 4); - unprotect_entry_with_size_change(cache_ptr, LARGE_ENTRY_TYPE, 4, + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, 4); + unprotect_entry1_with_size_change(cache_ptr, LARGE_ENTRY_TYPE, 4, H5C1__DIRTIED_FLAG, (size_t)0); /* verify cache size */ @@ -10132,18 +10132,18 @@ check_flush_cache__flush_op_eviction_test(H5C1_t * cache_ptr) (31 * MONSTER_ENTRY_SIZE) + (5 * LARGE_ENTRY_SIZE)) ) ) { - pass = FALSE; - failure_mssg = "unexpected size/len in flush op eviction test 5."; + pass1 = FALSE; + failure_mssg1 = "unexpected size/len in flush op eviction test 5."; } /* verify entry status */ - verify_entry_status(cache_ptr, + verify_entry_status1(cache_ptr, 3, - (num_variable_entries + num_monster_entries + num_large_entries), + (num_variable_entries1 + num_monster_entries1 + num_large_entries1), expected); } - if ( pass ) { + if ( pass1 ) { /* now touch all the non VARIABLE_ENTRY_TYPE entries in the * cache to bring all the VARIABLE_ENTRY_TYPE entries to the @@ -10154,15 +10154,15 @@ check_flush_cache__flush_op_eviction_test(H5C1_t * cache_ptr) */ for ( i = 0; i < 31; i++ ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); - unprotect_entry_with_size_change(cache_ptr, MONSTER_ENTRY_TYPE, i, + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i); + unprotect_entry1_with_size_change(cache_ptr, MONSTER_ENTRY_TYPE, i, H5C1__DIRTIED_FLAG, (size_t)0); } for ( i = 0; i < 5; i++ ) { - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, i); - unprotect_entry_with_size_change(cache_ptr, LARGE_ENTRY_TYPE, i, + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, i); + unprotect_entry1_with_size_change(cache_ptr, LARGE_ENTRY_TYPE, i, H5C1__DIRTIED_FLAG, (size_t)0); } @@ -10172,18 +10172,18 @@ check_flush_cache__flush_op_eviction_test(H5C1_t * cache_ptr) (2 * VARIABLE_ENTRY_SIZE) + (4 * LARGE_ENTRY_SIZE) ) ) { - pass = FALSE; - failure_mssg = "unexpected size/len in flush op eviction test 6."; + pass1 = FALSE; + failure_mssg1 = "unexpected size/len in flush op eviction test 6."; } /* verify entry status */ - verify_entry_status(cache_ptr, + verify_entry_status1(cache_ptr, 4, - (num_variable_entries + num_monster_entries + num_large_entries), + (num_variable_entries1 + num_monster_entries1 + num_large_entries1), expected); } - if ( pass ) { + if ( pass1 ) { /* Now load three more large entries. This should result * in the eviction of (VET, 3), and the unpinning of (VET, 0) @@ -10217,12 +10217,12 @@ check_flush_cache__flush_op_eviction_test(H5C1_t * cache_ptr) expected[3].in_cache = FALSE; expected[3].destroyed = TRUE; - num_large_entries = 8; + num_large_entries1 = 8; for ( i = 5; i < 8; i++ ) { - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, i); - unprotect_entry_with_size_change(cache_ptr, LARGE_ENTRY_TYPE, i, + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, i); + unprotect_entry1_with_size_change(cache_ptr, LARGE_ENTRY_TYPE, i, H5C1__DIRTIED_FLAG, (size_t)0); } @@ -10236,18 +10236,18 @@ check_flush_cache__flush_op_eviction_test(H5C1_t * cache_ptr) (31 * MONSTER_ENTRY_SIZE) + (8 * LARGE_ENTRY_SIZE)) ) ) { - pass = FALSE; - failure_mssg = "unexpected size/len in flush op eviction test 7."; + pass1 = FALSE; + failure_mssg1 = "unexpected size/len in flush op eviction test 7."; } /* verify entry status */ - verify_entry_status(cache_ptr, + verify_entry_status1(cache_ptr, 5, - (num_variable_entries + num_monster_entries + num_large_entries), + (num_variable_entries1 + num_monster_entries1 + num_large_entries1), expected); } - if ( pass ) { + if ( pass1 ) { /* load another large entry. (VET, 4) should be evicted. * @@ -10279,12 +10279,12 @@ check_flush_cache__flush_op_eviction_test(H5C1_t * cache_ptr) expected[4].in_cache = FALSE; expected[4].destroyed = TRUE; - num_large_entries = 9; + num_large_entries1 = 9; for ( i = 8; i < 9; i++ ) { - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, i); - unprotect_entry_with_size_change(cache_ptr, LARGE_ENTRY_TYPE, i, + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, i); + unprotect_entry1_with_size_change(cache_ptr, LARGE_ENTRY_TYPE, i, H5C1__DIRTIED_FLAG, (size_t)0); } @@ -10299,18 +10299,18 @@ check_flush_cache__flush_op_eviction_test(H5C1_t * cache_ptr) (31 * MONSTER_ENTRY_SIZE) + (9 * LARGE_ENTRY_SIZE)) ) ) { - pass = FALSE; - failure_mssg = "unexpected size/len in flush op eviction test 8."; + pass1 = FALSE; + failure_mssg1 = "unexpected size/len in flush op eviction test 8."; } /* verify entry status */ - verify_entry_status(cache_ptr, + verify_entry_status1(cache_ptr, 6, - (num_variable_entries + num_monster_entries + num_large_entries), + (num_variable_entries1 + num_monster_entries1 + num_large_entries1), expected); } - if ( pass ) { + if ( pass1 ) { /* Load another large entry. * @@ -10345,12 +10345,12 @@ check_flush_cache__flush_op_eviction_test(H5C1_t * cache_ptr) expected[5].destroyed = TRUE; expected[7].is_pinned = FALSE; - num_large_entries = 10; + num_large_entries1 = 10; for ( i = 9; i < 10; i++ ) { - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, i); - unprotect_entry_with_size_change(cache_ptr, LARGE_ENTRY_TYPE, i, + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, i); + unprotect_entry1_with_size_change(cache_ptr, LARGE_ENTRY_TYPE, i, H5C1__DIRTIED_FLAG, (size_t)0); } @@ -10363,18 +10363,18 @@ check_flush_cache__flush_op_eviction_test(H5C1_t * cache_ptr) (31 * MONSTER_ENTRY_SIZE) + (10 * LARGE_ENTRY_SIZE)) ) ) { - pass = FALSE; - failure_mssg = "unexpected size/len in flush op eviction test 9."; + pass1 = FALSE; + failure_mssg1 = "unexpected size/len in flush op eviction test 9."; } /* verify entry status */ - verify_entry_status(cache_ptr, + verify_entry_status1(cache_ptr, 7, - (num_variable_entries + num_monster_entries + num_large_entries), + (num_variable_entries1 + num_monster_entries1 + num_large_entries1), expected); } - if ( pass ) { + if ( pass1 ) { /* Again, touch all the non VARIABLE_ENTRY_TYPE entries in the * cache to bring all the VARIABLE_ENTRY_TYPE entries to the @@ -10385,15 +10385,15 @@ check_flush_cache__flush_op_eviction_test(H5C1_t * cache_ptr) */ for ( i = 0; i < 31; i++ ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); - unprotect_entry_with_size_change(cache_ptr, MONSTER_ENTRY_TYPE, i, + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i); + unprotect_entry1_with_size_change(cache_ptr, MONSTER_ENTRY_TYPE, i, H5C1__DIRTIED_FLAG, (size_t)0); } for ( i = 0; i < 10; i++ ) { - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, i); - unprotect_entry_with_size_change(cache_ptr, LARGE_ENTRY_TYPE, i, + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, i); + unprotect_entry1_with_size_change(cache_ptr, LARGE_ENTRY_TYPE, i, H5C1__DIRTIED_FLAG, (size_t)0); } @@ -10406,18 +10406,18 @@ check_flush_cache__flush_op_eviction_test(H5C1_t * cache_ptr) (31 * MONSTER_ENTRY_SIZE) + (10 * LARGE_ENTRY_SIZE)) ) ) { - pass = FALSE; - failure_mssg = "unexpected size/len in flush op eviction test 10."; + pass1 = FALSE; + failure_mssg1 = "unexpected size/len in flush op eviction test 10."; } /* verify entry status */ - verify_entry_status(cache_ptr, + verify_entry_status1(cache_ptr, 8, - (num_variable_entries + num_monster_entries + num_large_entries), + (num_variable_entries1 + num_monster_entries1 + num_large_entries1), expected); } - if ( pass ) { + if ( pass1 ) { /* load two more large entries. * @@ -10431,7 +10431,7 @@ check_flush_cache__flush_op_eviction_test(H5C1_t * cache_ptr) * The cache will then flush all the monster and large entries, but since they * are all dirty, they will not be evicted. * - * Finally, it will reach (VET, 0) again, and evict it on the second pass. + * Finally, it will reach (VET, 0) again, and evict it on the second pass1. * This finally makes the necessary space. * * The following table shows the expected states of the variable @@ -10461,7 +10461,7 @@ check_flush_cache__flush_op_eviction_test(H5C1_t * cache_ptr) * Note that we reset the loaded, cleared, flushed, and destroyed fields of * (VET,6) so we can track what is happening. */ - base_addr = entries[VARIABLE_ENTRY_TYPE]; + base_addr = entries1[VARIABLE_ENTRY_TYPE]; entry_ptr = &(base_addr[6]); entry_ptr->loaded = FALSE; entry_ptr->cleared = FALSE; @@ -10481,13 +10481,13 @@ check_flush_cache__flush_op_eviction_test(H5C1_t * cache_ptr) expected[7].flushed = TRUE; expected[7].destroyed = TRUE; - num_large_entries = 12; + num_large_entries1 = 12; /* a newly loaded entry is not inserted in the cache until after space has been * made for it. Thus (LET, 11) will not be flushed. */ - for ( i = num_variable_entries; - i < num_variable_entries + num_monster_entries + num_large_entries - 1; + for ( i = num_variable_entries1; + i < num_variable_entries1 + num_monster_entries1 + num_large_entries1 - 1; i++ ) { expected[i].is_dirty = FALSE; @@ -10496,8 +10496,8 @@ check_flush_cache__flush_op_eviction_test(H5C1_t * cache_ptr) for ( i = 10; i < 12; i++ ) { - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, i); - unprotect_entry_with_size_change(cache_ptr, LARGE_ENTRY_TYPE, i, + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, i); + unprotect_entry1_with_size_change(cache_ptr, LARGE_ENTRY_TYPE, i, H5C1__DIRTIED_FLAG, (size_t)0); } @@ -10510,40 +10510,40 @@ check_flush_cache__flush_op_eviction_test(H5C1_t * cache_ptr) (31 * MONSTER_ENTRY_SIZE) + (12 * LARGE_ENTRY_SIZE)) ) ) { - pass = FALSE; - failure_mssg = "unexpected size/len in flush op eviction test 11."; + pass1 = FALSE; + failure_mssg1 = "unexpected size/len in flush op eviction test 11."; } /* verify entry status */ - verify_entry_status(cache_ptr, + verify_entry_status1(cache_ptr, 9, - (num_variable_entries + num_monster_entries + num_large_entries), + (num_variable_entries1 + num_monster_entries1 + num_large_entries1), expected); } - if ( pass ) { + if ( pass1 ) { /* Again, touch all the non VARIABLE_ENTRY_TYPE entries in the * cache to bring the last remaining VARIABLE_ENTRY_TYPE entry to the * end of the LRU list. */ - for ( i = 0; i < num_monster_entries; i++ ) + for ( i = 0; i < num_monster_entries1; i++ ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); - unprotect_entry_with_size_change(cache_ptr, MONSTER_ENTRY_TYPE, i, + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i); + unprotect_entry1_with_size_change(cache_ptr, MONSTER_ENTRY_TYPE, i, H5C1__DIRTIED_FLAG, (size_t)0); } - for ( i = 0; i < num_large_entries; i++ ) + for ( i = 0; i < num_large_entries1; i++ ) { - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, i); - unprotect_entry_with_size_change(cache_ptr, LARGE_ENTRY_TYPE, i, + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, i); + unprotect_entry1_with_size_change(cache_ptr, LARGE_ENTRY_TYPE, i, H5C1__DIRTIED_FLAG, (size_t)0); } /* update the expected array to mark all these entries dirty again. */ - for ( i = num_variable_entries; - i < num_variable_entries + num_monster_entries + num_large_entries - 1; + for ( i = num_variable_entries1; + i < num_variable_entries1 + num_monster_entries1 + num_large_entries1 - 1; i++ ) { expected[i].is_dirty = TRUE; @@ -10558,25 +10558,25 @@ check_flush_cache__flush_op_eviction_test(H5C1_t * cache_ptr) (31 * MONSTER_ENTRY_SIZE) + (12 * LARGE_ENTRY_SIZE)) ) ) { - pass = FALSE; - failure_mssg = "unexpected size/len in flush op eviction test 12."; + pass1 = FALSE; + failure_mssg1 = "unexpected size/len in flush op eviction test 12."; } /* verify entry status */ - verify_entry_status(cache_ptr, + verify_entry_status1(cache_ptr, 10, - (num_variable_entries + num_monster_entries + num_large_entries), + (num_variable_entries1 + num_monster_entries1 + num_large_entries1), expected); } - if ( pass ) { + if ( pass1 ) { /* Load two more large entries. * * Since (VET, 6) is dirty, at first this will just cause (VET, 6) to be flushed. * * But all other entries in the cache are dirty, so the cache will flush them all, - * and then evict (VET, 6) on the second pass. + * and then evict (VET, 6) on the second pass1. * * The following table shows the expected states of the variable * size entries after the test. @@ -10608,13 +10608,13 @@ check_flush_cache__flush_op_eviction_test(H5C1_t * cache_ptr) expected[6].flushed = TRUE; expected[6].destroyed = TRUE; - num_large_entries = 14; + num_large_entries1 = 14; /* a newly loaded entry is not inserted in the cache until after space has been * made for it. Thus (LET, 13) will not be flushed. */ - for ( i = num_variable_entries; - i < num_variable_entries + num_monster_entries + num_large_entries - 1; + for ( i = num_variable_entries1; + i < num_variable_entries1 + num_monster_entries1 + num_large_entries1 - 1; i++ ) { expected[i].is_dirty = FALSE; @@ -10623,8 +10623,8 @@ check_flush_cache__flush_op_eviction_test(H5C1_t * cache_ptr) for ( i = 12; i < 14; i++ ) { - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, i); - unprotect_entry_with_size_change(cache_ptr, LARGE_ENTRY_TYPE, i, + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, i); + unprotect_entry1_with_size_change(cache_ptr, LARGE_ENTRY_TYPE, i, H5C1__DIRTIED_FLAG, (size_t)0); } @@ -10636,14 +10636,14 @@ check_flush_cache__flush_op_eviction_test(H5C1_t * cache_ptr) ( cache_ptr->index_size != ((31 * MONSTER_ENTRY_SIZE) + (14 * LARGE_ENTRY_SIZE)) ) ) { - pass = FALSE; - failure_mssg = "unexpected size/len in flush op eviction test 13."; + pass1 = FALSE; + failure_mssg1 = "unexpected size/len in flush op eviction test 13."; } /* verify entry status */ - verify_entry_status(cache_ptr, + verify_entry_status1(cache_ptr, 11, - (num_variable_entries + num_monster_entries + num_large_entries), + (num_variable_entries1 + num_monster_entries1 + num_large_entries1), expected); } @@ -10652,21 +10652,21 @@ check_flush_cache__flush_op_eviction_test(H5C1_t * cache_ptr) * flush the cache and end the test. */ - if ( pass ) { + if ( pass1 ) { result = H5C1_flush_cache(NULL, -1, -1, cache_ptr, H5C1__FLUSH_INVALIDATE_FLAG); if ( result < 0 ) { - pass = FALSE; - failure_mssg = "Cache flush invalidate failed after flush op eviction test"; + pass1 = FALSE; + failure_mssg1 = "Cache flush invalidate failed after flush op eviction test"; } else if ( ( cache_ptr->index_len != 0 ) || ( cache_ptr->index_size != 0 ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache len/size after cleanup of flush op eviction test"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache len/size after cleanup of flush op eviction test"; } } @@ -10680,7 +10680,7 @@ check_flush_cache__flush_op_eviction_test(H5C1_t * cache_ptr) * to start testing the stats whenever it is convenient to do * so. */ - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->insertions[VARIABLE_ENTRY_TYPE] != 0 ) || ( cache_ptr->pinned_insertions[VARIABLE_ENTRY_TYPE] != 0 ) || @@ -10700,12 +10700,12 @@ check_flush_cache__flush_op_eviction_test(H5C1_t * cache_ptr) ( cache_ptr->entry_flush_size_changes[VARIABLE_ENTRY_TYPE] != 1 ) || ( cache_ptr->cache_flush_size_changes[VARIABLE_ENTRY_TYPE] != 0 ) ) { - pass = FALSE; - failure_mssg = "Unexpected variable size entry stats."; + pass1 = FALSE; + failure_mssg1 = "Unexpected variable size entry stats."; } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->insertions[LARGE_ENTRY_TYPE] != 0 ) || ( cache_ptr->pinned_insertions[LARGE_ENTRY_TYPE] != 0 ) || @@ -10725,12 +10725,12 @@ check_flush_cache__flush_op_eviction_test(H5C1_t * cache_ptr) ( cache_ptr->entry_flush_size_changes[LARGE_ENTRY_TYPE] != 0 ) || ( cache_ptr->cache_flush_size_changes[LARGE_ENTRY_TYPE] != 0 ) ) { - pass = FALSE; - failure_mssg = "Unexpected monster entry stats."; + pass1 = FALSE; + failure_mssg1 = "Unexpected monster entry stats."; } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->insertions[MONSTER_ENTRY_TYPE] != 0 ) || ( cache_ptr->pinned_insertions[MONSTER_ENTRY_TYPE] != 0 ) || @@ -10750,26 +10750,26 @@ check_flush_cache__flush_op_eviction_test(H5C1_t * cache_ptr) ( cache_ptr->entry_flush_size_changes[MONSTER_ENTRY_TYPE] != 0 ) || ( cache_ptr->cache_flush_size_changes[MONSTER_ENTRY_TYPE] != 0 ) ) { - pass = FALSE; - failure_mssg = "Unexpected monster entry stats."; + pass1 = FALSE; + failure_mssg1 = "Unexpected monster entry stats."; } } #endif /* H5C1_COLLECT_CACHE_STATS */ - if ( pass ) { + if ( pass1 ) { - reset_entries(); + reset_entries1(); } return; -} /* check_flush_cache__flush_op_eviction_test() */ +} /* check_flush_cache1__flush_op_eviction_test() */ /*------------------------------------------------------------------------- - * Function: check_flush_cache__single_entry() + * Function: check_flush_cache1__single_entry() * - * Purpose: Verify that flush_cache behaves as expected when the cache + * Purpose: Verify that flush_cache1 behaves as expected when the cache * contains only one element. * * Return: void @@ -10791,25 +10791,25 @@ check_flush_cache__flush_op_eviction_test(H5C1_t * cache_ptr) */ static void -check_flush_cache__single_entry(H5C1_t * cache_ptr) +check_flush_cache1__single_entry(H5C1_t * cache_ptr) { - /* const char * fcn_name = "check_flush_cache__single_entry"; */ + /* const char * fcn_name = "check_flush_cache1__single_entry"; */ if ( cache_ptr == NULL ) { - pass = FALSE; - failure_mssg = "cache_ptr NULL on entry to single entry case."; + pass1 = FALSE; + failure_mssg1 = "cache_ptr NULL on entry to single entry case."; } else if ( ( cache_ptr->index_len != 0 ) || ( cache_ptr->index_size != 0 ) ) { - pass = FALSE; - failure_mssg = "cache not empty at beginning of single entry case."; + pass1 = FALSE; + failure_mssg1 = "cache not empty at beginning of single entry case."; } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 1, @@ -10826,9 +10826,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 2, @@ -10845,9 +10845,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 3, @@ -10864,9 +10864,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 4, @@ -10883,9 +10883,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 5, @@ -10902,9 +10902,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 6, @@ -10921,9 +10921,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 7, @@ -10940,9 +10940,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 8, @@ -10959,9 +10959,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 9, @@ -10979,9 +10979,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 10, @@ -10999,9 +10999,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 11, @@ -11019,9 +11019,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 12, @@ -11039,9 +11039,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 13, @@ -11059,9 +11059,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 14, @@ -11079,9 +11079,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 15, @@ -11100,9 +11100,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 16, @@ -11121,9 +11121,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 17, @@ -11140,9 +11140,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 18, @@ -11159,9 +11159,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 19, @@ -11178,9 +11178,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 20, @@ -11197,9 +11197,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 21, @@ -11216,9 +11216,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 22, @@ -11235,9 +11235,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 23, @@ -11254,9 +11254,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 24, @@ -11273,9 +11273,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 25, @@ -11293,9 +11293,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 26, @@ -11313,9 +11313,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 27, @@ -11333,9 +11333,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 28, @@ -11353,9 +11353,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 29, @@ -11373,9 +11373,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 30, @@ -11393,9 +11393,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 31, @@ -11414,9 +11414,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 32, @@ -11435,9 +11435,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 33, @@ -11454,9 +11454,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 34, @@ -11473,9 +11473,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 35, @@ -11492,9 +11492,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 36, @@ -11511,9 +11511,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 37, @@ -11530,9 +11530,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 38, @@ -11549,9 +11549,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 39, @@ -11568,9 +11568,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 40, @@ -11587,9 +11587,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 41, @@ -11607,9 +11607,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 42, @@ -11627,9 +11627,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 43, @@ -11647,9 +11647,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 44, @@ -11667,9 +11667,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 45, @@ -11687,9 +11687,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 46, @@ -11707,9 +11707,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 47, @@ -11728,9 +11728,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 48, @@ -11749,9 +11749,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 49, @@ -11768,9 +11768,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 50, @@ -11787,9 +11787,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 51, @@ -11806,9 +11806,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 52, @@ -11825,9 +11825,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 53, @@ -11844,9 +11844,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 54, @@ -11863,9 +11863,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 55, @@ -11882,9 +11882,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 56, @@ -11901,9 +11901,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 57, @@ -11921,9 +11921,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 58, @@ -11941,9 +11941,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 59, @@ -11961,9 +11961,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 60, @@ -11981,9 +11981,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 61, @@ -12001,9 +12001,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 62, @@ -12021,9 +12021,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 63, @@ -12042,9 +12042,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) ); } - if ( pass ) { + if ( pass1 ) { - check_flush_cache__single_entry_test + check_flush_cache1__single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ 64, @@ -12125,7 +12125,7 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) * H5C1__SET_FLUSH_MARKER_FLAG apply here as well. */ - if ( pass ) { + if ( pass1 ) { int i; struct pinned_single_entry_test_spec @@ -12407,9 +12407,9 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) { 256, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, TRUE, TRUE, H5C1__SET_FLUSH_MARKER_FLAG, H5C1__FLUSH_MARKED_ENTRIES_FLAG | H5C1__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE } }; i = 0; - while ( ( pass ) && ( i < 256 ) ) + while ( ( pass1 ) && ( i < 256 ) ) { - check_flush_cache__pinned_single_entry_test + check_flush_cache1__pinned_single_entry_test ( /* cache_ptr */ cache_ptr, /* test_num */ spec[i].test_num, @@ -12432,11 +12432,11 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) return; -} /* check_flush_cache__single_entry() */ +} /* check_flush_cache1__single_entry() */ /*------------------------------------------------------------------------- - * Function: check_flush_cache__single_entry_test() + * Function: check_flush_cache1__single_entry_test() * * Purpose: Run a single entry flush cache test. * @@ -12451,7 +12451,7 @@ check_flush_cache__single_entry(H5C1_t * cache_ptr) */ static void -check_flush_cache__single_entry_test(H5C1_t * cache_ptr, +check_flush_cache1__single_entry_test(H5C1_t * cache_ptr, int test_num, int entry_type, int entry_idx, @@ -12464,7 +12464,7 @@ check_flush_cache__single_entry_test(H5C1_t * cache_ptr, hbool_t expected_flushed, hbool_t expected_destroyed) { - /* const char * fcn_name = "check_flush_cache__single_entry_test"; */ + /* const char * fcn_name = "check_flush_cache1__single_entry_test"; */ static char msg[128]; herr_t result; test_entry_t * base_addr; @@ -12472,60 +12472,60 @@ check_flush_cache__single_entry_test(H5C1_t * cache_ptr, if ( cache_ptr == NULL ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "cache_ptr NULL on entry to single entry test #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ( cache_ptr->index_len != 0 ) || ( cache_ptr->index_size != 0 ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "cache not empty at beginning of single entry test #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ( entry_type < 0 ) || ( entry_type >= NUMBER_OF_ENTRY_TYPES ) || - ( entry_idx < 0 ) || ( entry_idx > max_indices[entry_type] ) ) { + ( entry_idx < 0 ) || ( entry_idx > max_indices1[entry_type] ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Bad parameters on entry to single entry test #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } - if ( pass ) { + if ( pass1 ) { - base_addr = entries[entry_type]; + base_addr = entries1[entry_type]; entry_ptr = &(base_addr[entry_idx]); if ( insert_flag ) { - insert_entry(cache_ptr, entry_type, entry_idx, dirty_flag, flags); + insert_entry1(cache_ptr, entry_type, entry_idx, dirty_flag, flags); } else { - protect_entry(cache_ptr, entry_type, entry_idx); + protect_entry1(cache_ptr, entry_type, entry_idx); - unprotect_entry(cache_ptr, entry_type, entry_idx, + unprotect_entry1(cache_ptr, entry_type, entry_idx, (int)dirty_flag, flags); } } - if ( pass ) { + if ( pass1 ) { result = H5C1_flush_cache(NULL, -1, -1, cache_ptr, flush_flags); if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "flush with flags 0x%x failed in single entry test #%d.", flush_flags, test_num); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ( entry_ptr->loaded != expected_loaded ) || ( entry_ptr->cleared != expected_cleared ) || @@ -12545,17 +12545,17 @@ check_flush_cache__single_entry_test(H5C1_t * cache_ptr, (int)(entry_ptr->destroyed), (int)expected_destroyed); #endif - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected entry status after flush in single entry test #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ( ( (flush_flags & H5C1__FLUSH_INVALIDATE_FLAG) == 0 ) && ( ( cache_ptr->index_len != 1 ) || - ( cache_ptr->index_size != entry_sizes[entry_type] ) + ( cache_ptr->index_size != entry_sizes1[entry_type] ) ) ) || @@ -12568,37 +12568,37 @@ check_flush_cache__single_entry_test(H5C1_t * cache_ptr, ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected cache len/size after flush in single entry test #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } } /* clean up the cache to prep for the next test */ - if ( pass ) { + if ( pass1 ) { result = H5C1_flush_cache(NULL, -1, -1, cache_ptr, H5C1__FLUSH_INVALIDATE_FLAG); if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Flush failed on cleanup in single entry test #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ( cache_ptr->index_len != 0 ) || ( cache_ptr->index_size != 0 ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected cache len/size after cleanup in single entry test #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } else { @@ -12611,11 +12611,11 @@ check_flush_cache__single_entry_test(H5C1_t * cache_ptr, return; -} /* check_flush_cache__single_entry_test() */ +} /* check_flush_cache1__single_entry_test() */ /*------------------------------------------------------------------------- - * Function: check_flush_cache__pinned_single_entry_test() + * Function: check_flush_cache1__pinned_single_entry_test() * * Purpose: Run a pinned single entry flush cache test. * @@ -12638,7 +12638,7 @@ check_flush_cache__single_entry_test(H5C1_t * cache_ptr, */ static void -check_flush_cache__pinned_single_entry_test(H5C1_t * cache_ptr, +check_flush_cache1__pinned_single_entry_test(H5C1_t * cache_ptr, int test_num, int entry_type, int entry_idx, @@ -12653,7 +12653,7 @@ check_flush_cache__pinned_single_entry_test(H5C1_t * cache_ptr, hbool_t expected_flushed, hbool_t expected_destroyed) { - /* const char *fcn_name = "check_flush_cache__pinned_single_entry_test"; */ + /* const char *fcn_name = "check_flush_cache1__pinned_single_entry_test"; */ static char msg[128]; hbool_t expected_loaded = TRUE; herr_t result; @@ -12662,73 +12662,73 @@ check_flush_cache__pinned_single_entry_test(H5C1_t * cache_ptr, if ( cache_ptr == NULL ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "cache_ptr NULL on entry to pinned single entry test #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ( cache_ptr->index_len != 0 ) || ( cache_ptr->index_size != 0 ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "cache not empty at beginning of pinned single entry test #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ( entry_type < 0 ) || ( entry_type >= NUMBER_OF_ENTRY_TYPES ) || - ( entry_idx < 0 ) || ( entry_idx > max_indices[entry_type] ) ) { + ( entry_idx < 0 ) || ( entry_idx > max_indices1[entry_type] ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Bad parameters on entry to pinned single entry test #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } - if ( pass ) { + if ( pass1 ) { - base_addr = entries[entry_type]; + base_addr = entries1[entry_type]; entry_ptr = &(base_addr[entry_idx]); - protect_entry(cache_ptr, entry_type, entry_idx); + protect_entry1(cache_ptr, entry_type, entry_idx); if ( pop_mark_dirty_prot ) { - mark_pinned_or_protected_entry_dirty(cache_ptr, + mark_pinned_or_protected_entry_dirty1(cache_ptr, entry_type, entry_idx); } - unprotect_entry(cache_ptr, entry_type, entry_idx, + unprotect_entry1(cache_ptr, entry_type, entry_idx, (int)dirty_flag, (flags | H5C1__PIN_ENTRY_FLAG)); if ( mark_dirty ) { - mark_pinned_entry_dirty(cache_ptr, entry_type, entry_idx, + mark_pinned_entry_dirty1(cache_ptr, entry_type, entry_idx, FALSE, (size_t)0); } if ( pop_mark_dirty_pinned ) { - mark_pinned_or_protected_entry_dirty(cache_ptr, + mark_pinned_or_protected_entry_dirty1(cache_ptr, entry_type, entry_idx); } } - if ( pass ) { + if ( pass1 ) { result = H5C1_flush_cache(NULL, -1, -1, cache_ptr, flush_flags); if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "flush with flags 0x%x failed in pinned single entry test #%d.", flush_flags, test_num); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ( entry_ptr->loaded != expected_loaded ) || ( entry_ptr->cleared != expected_cleared ) || @@ -12746,17 +12746,17 @@ check_flush_cache__pinned_single_entry_test(H5C1_t * cache_ptr, (int)(entry_ptr->destroyed), (int)expected_destroyed); - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected entry status after flush in pinned single entry test #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ( ( (flush_flags & H5C1__FLUSH_INVALIDATE_FLAG) == 0 ) && ( ( cache_ptr->index_len != 1 ) || - ( cache_ptr->index_size != entry_sizes[entry_type] ) + ( cache_ptr->index_size != entry_sizes1[entry_type] ) ) ) || @@ -12769,53 +12769,53 @@ check_flush_cache__pinned_single_entry_test(H5C1_t * cache_ptr, ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected cache len/size after flush in pinned single entry test #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } } /* clean up the cache to prep for the next test */ - if ( pass ) { + if ( pass1 ) { if ( unprotect_unpin ) { - protect_entry(cache_ptr, entry_type, entry_idx); + protect_entry1(cache_ptr, entry_type, entry_idx); - unprotect_entry(cache_ptr, entry_type, entry_idx, + unprotect_entry1(cache_ptr, entry_type, entry_idx, (int)dirty_flag, H5C1__UNPIN_ENTRY_FLAG); } else { - unpin_entry(cache_ptr, entry_type, entry_idx); + unpin_entry1(cache_ptr, entry_type, entry_idx); } } - if ( pass ) { + if ( pass1 ) { result = H5C1_flush_cache(NULL, -1, -1, cache_ptr, H5C1__FLUSH_INVALIDATE_FLAG); if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Flush failed on cleanup in pinned single entry test #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ( cache_ptr->index_len != 0 ) || ( cache_ptr->index_size != 0 ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected cache len/size after cleanup in pinned single entry test #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } else { @@ -12828,7 +12828,7 @@ check_flush_cache__pinned_single_entry_test(H5C1_t * cache_ptr, return; -} /* check_flush_cache__pinned_single_entry_test() */ +} /* check_flush_cache1__pinned_single_entry_test() */ /*------------------------------------------------------------------------- @@ -12863,20 +12863,20 @@ check_get_entry_status(void) TESTING("H5C1_get_entry_status() functionality"); - pass = TRUE; + pass1 = TRUE; - if ( pass ) { + if ( pass1 ) { - reset_entries(); + reset_entries1(); - cache_ptr = setup_cache((size_t)(2 * 1024 * 1024), + cache_ptr = setup_cache1((size_t)(2 * 1024 * 1024), (size_t)(1 * 1024 * 1024)); - base_addr = entries[0]; + base_addr = entries1[0]; entry_ptr = &(base_addr[0]); } - if ( pass ) { + if ( pass1 ) { /* entry not in cache -- only in_cache should be touched by * the call. Thus, only check that boolean. @@ -12887,142 +12887,142 @@ check_get_entry_status(void) if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "H5AC1_get_entry_status() reports failure 1."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( in_cache ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected status 1."); - failure_mssg = msg; + failure_mssg1 = msg; } } - protect_entry(cache_ptr, 0, 0); + protect_entry1(cache_ptr, 0, 0); - unprotect_entry(cache_ptr, 0, 0, FALSE, H5C1__NO_FLAGS_SET); + unprotect_entry1(cache_ptr, 0, 0, FALSE, H5C1__NO_FLAGS_SET); - if ( pass ) { + if ( pass1 ) { result = H5C1_get_entry_status(cache_ptr, entry_ptr->addr, &entry_size, &in_cache, &is_dirty, &is_protected, &is_pinned); if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "H5AC1_get_entry_status() reports failure 2."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( !in_cache || is_dirty || is_protected || is_pinned ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected status 2."); - failure_mssg = msg; + failure_mssg1 = msg; } } - protect_entry(cache_ptr, 0, 0); + protect_entry1(cache_ptr, 0, 0); - if ( pass ) { + if ( pass1 ) { result = H5C1_get_entry_status(cache_ptr, entry_ptr->addr, &entry_size, &in_cache, &is_dirty, &is_protected, &is_pinned); if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "H5AC1_get_entry_status() reports failure 3."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( !in_cache || is_dirty || !is_protected || is_pinned ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected status 3."); - failure_mssg = msg; + failure_mssg1 = msg; } } - unprotect_entry(cache_ptr, 0, 0, FALSE, H5C1__PIN_ENTRY_FLAG); + unprotect_entry1(cache_ptr, 0, 0, FALSE, H5C1__PIN_ENTRY_FLAG); - if ( pass ) { + if ( pass1 ) { result = H5C1_get_entry_status(cache_ptr, entry_ptr->addr, &entry_size, &in_cache, &is_dirty, &is_protected, &is_pinned); if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "H5AC1_get_entry_status() reports failure 4."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( !in_cache || is_dirty || is_protected || !is_pinned ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected status 4."); - failure_mssg = msg; + failure_mssg1 = msg; } } - mark_pinned_entry_dirty(cache_ptr, 0, 0, FALSE, (size_t)0); + mark_pinned_entry_dirty1(cache_ptr, 0, 0, FALSE, (size_t)0); - if ( pass ) { + if ( pass1 ) { result = H5C1_get_entry_status(cache_ptr, entry_ptr->addr, &entry_size, &in_cache, &is_dirty, &is_protected, &is_pinned); if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "H5AC1_get_entry_status() reports failure 5."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( !in_cache || !is_dirty || is_protected || !is_pinned ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected status 5."); - failure_mssg = msg; + failure_mssg1 = msg; } } - unpin_entry(cache_ptr, 0, 0); + unpin_entry1(cache_ptr, 0, 0); - if ( pass ) { + if ( pass1 ) { result = H5C1_get_entry_status(cache_ptr, entry_ptr->addr, &entry_size, &in_cache, &is_dirty, &is_protected, &is_pinned); if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "H5AC1_get_entry_status() reports failure 6."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( !in_cache || !is_dirty || is_protected || is_pinned ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected status 6."); - failure_mssg = msg; + failure_mssg1 = msg; } } - if ( pass ) { + if ( pass1 ) { - takedown_cache(cache_ptr, FALSE, FALSE); + takedown_cache1(cache_ptr, FALSE, FALSE); } - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) { + if ( ! pass1 ) { - HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + HDfprintf(stdout, "%s(): failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } return; @@ -13031,7 +13031,7 @@ check_get_entry_status(void) /*------------------------------------------------------------------------- - * Function: check_expunge_entry() + * Function: check_expunge_entry1() * * Purpose: Verify that H5C1_expunge_entry() behaves as expected. * @@ -13048,9 +13048,9 @@ check_get_entry_status(void) */ static void -check_expunge_entry(void) +check_expunge_entry1(void) { - const char * fcn_name = "check_expunge_entry"; + const char * fcn_name = "check_expunge_entry1"; static char msg[128]; herr_t result; hbool_t in_cache; @@ -13064,20 +13064,20 @@ check_expunge_entry(void) TESTING("H5C1_expunge_entry() functionality"); - pass = TRUE; + pass1 = TRUE; - if ( pass ) { + if ( pass1 ) { - reset_entries(); + reset_entries1(); - cache_ptr = setup_cache((size_t)(2 * 1024 * 1024), + cache_ptr = setup_cache1((size_t)(2 * 1024 * 1024), (size_t)(1 * 1024 * 1024)); - base_addr = entries[0]; + base_addr = entries1[0]; entry_ptr = &(base_addr[0]); } - if ( pass ) { + if ( pass1 ) { /* entry not in cache -- only in_cache should be touched by * the status call. Thus, only check that boolean. @@ -13089,25 +13089,25 @@ check_expunge_entry(void) if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "H5AC1_get_entry_status() reports failure 1."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( in_cache ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected status 1."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ( entry_ptr->loaded ) || ( entry_ptr->cleared ) || ( entry_ptr->flushed ) || ( entry_ptr->destroyed ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected entry history 1."); - failure_mssg = msg; + failure_mssg1 = msg; } } @@ -13116,36 +13116,36 @@ check_expunge_entry(void) * it without marking it dirty. */ - protect_entry(cache_ptr, 0, 0); + protect_entry1(cache_ptr, 0, 0); - unprotect_entry(cache_ptr, 0, 0, FALSE, H5C1__NO_FLAGS_SET); + unprotect_entry1(cache_ptr, 0, 0, FALSE, H5C1__NO_FLAGS_SET); - if ( pass ) { + if ( pass1 ) { result = H5C1_get_entry_status(cache_ptr, entry_ptr->addr, &entry_size, &in_cache, &is_dirty, &is_protected, &is_pinned); if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "H5AC1_get_entry_status() reports failure 2."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( !in_cache || is_dirty || is_protected || is_pinned ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected status 2."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ( ! entry_ptr->loaded ) || ( entry_ptr->cleared ) || ( entry_ptr->flushed ) || ( entry_ptr->destroyed ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected entry history 2."); - failure_mssg = msg; + failure_mssg1 = msg; } } @@ -13154,9 +13154,9 @@ check_expunge_entry(void) * Also verify that the entry was loaded, cleared, and destroyed, but * not flushed. */ - expunge_entry(cache_ptr, 0, 0); + expunge_entry1(cache_ptr, 0, 0); - if ( pass ) { + if ( pass1 ) { /* entry shouldn't be in cache -- only in_cache should be touched * by the status call. Thus, only check that boolean. @@ -13167,25 +13167,25 @@ check_expunge_entry(void) if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "H5AC1_get_entry_status() reports failure 3."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( in_cache ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected status 3."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ( ! entry_ptr->loaded ) || ( ! entry_ptr->cleared ) || ( entry_ptr->flushed ) || ( ! entry_ptr->destroyed ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected entry history 3."); - failure_mssg = msg; + failure_mssg1 = msg; } } @@ -13194,10 +13194,10 @@ check_expunge_entry(void) * mark the entry as dirty. Verify that it is not flushed. */ - base_addr = entries[0]; + base_addr = entries1[0]; entry_ptr = &(base_addr[1]); - if ( pass ) { + if ( pass1 ) { /* entry not in cache -- only in_cache should be touched by * the status call. Thus, only check that boolean. @@ -13209,25 +13209,25 @@ check_expunge_entry(void) if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "H5AC1_get_entry_status() reports failure 4."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( in_cache ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected status 4."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ( entry_ptr->loaded ) || ( entry_ptr->cleared ) || ( entry_ptr->flushed ) || ( entry_ptr->destroyed ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected entry history 4."); - failure_mssg = msg; + failure_mssg1 = msg; } } @@ -13236,11 +13236,11 @@ check_expunge_entry(void) * it with the dirty flag set. */ - protect_entry(cache_ptr, 0, 1); + protect_entry1(cache_ptr, 0, 1); - unprotect_entry(cache_ptr, 0, 1, TRUE, H5C1__NO_FLAGS_SET); + unprotect_entry1(cache_ptr, 0, 1, TRUE, H5C1__NO_FLAGS_SET); - if ( pass ) { + if ( pass1 ) { result = H5C1_get_entry_status(cache_ptr, entry_ptr->addr, &entry_size, &in_cache, &is_dirty, &is_protected, @@ -13248,25 +13248,25 @@ check_expunge_entry(void) if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "H5AC1_get_entry_status() reports failure 5."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( !in_cache || !is_dirty || is_protected || is_pinned ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected status 5."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ( ! entry_ptr->loaded ) || ( entry_ptr->cleared ) || ( entry_ptr->flushed ) || ( entry_ptr->destroyed ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected entry history 5."); - failure_mssg = msg; + failure_mssg1 = msg; } } @@ -13275,9 +13275,9 @@ check_expunge_entry(void) * Also verify that the entry was loaded, cleared and destroyed, but not * flushed. */ - expunge_entry(cache_ptr, 0, 1); + expunge_entry1(cache_ptr, 0, 1); - if ( pass ) { + if ( pass1 ) { /* entry shouldn't be in cache -- only in_cache should be touched * by the status call. Thus, only check that boolean. @@ -13289,45 +13289,45 @@ check_expunge_entry(void) if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "H5AC1_get_entry_status() reports failure 6."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( in_cache ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected status 6."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ( ! entry_ptr->loaded ) || ( ! entry_ptr->cleared ) || ( entry_ptr->flushed ) || ( ! entry_ptr->destroyed ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected entry history 6."); - failure_mssg = msg; + failure_mssg1 = msg; } } - if ( pass ) { + if ( pass1 ) { - takedown_cache(cache_ptr, FALSE, FALSE); + takedown_cache1(cache_ptr, FALSE, FALSE); } - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) { + if ( ! pass1 ) { - HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + HDfprintf(stdout, "%s(): failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } return; -} /* check_expunge_entry() */ +} /* check_expunge_entry1() */ /*------------------------------------------------------------------------- @@ -13358,7 +13358,7 @@ check_multiple_read_protect(void) TESTING("multiple read only protects on a single entry"); - pass = TRUE; + pass1 = TRUE; /* allocate a cache. Should succeed. * @@ -13381,21 +13381,21 @@ check_multiple_read_protect(void) * Also, verify internal state of read protects at every step. */ - if ( pass ) { + if ( pass1 ) { - reset_entries(); + reset_entries1(); - cache_ptr = setup_cache((size_t)(2 * 1024), + cache_ptr = setup_cache1((size_t)(2 * 1024), (size_t)(1 * 1024)); - entry_ptr = &((entries[0])[0]); + entry_ptr = &((entries1[0])[0]); if ( ( entry_ptr->header.is_protected ) || ( entry_ptr->header.is_read_only ) || ( entry_ptr->header.ro_ref_count != 0 ) ) { - pass = FALSE; - failure_mssg = "Unexpected ro protected status 1.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected ro protected status 1.\n"; } } @@ -13404,21 +13404,21 @@ check_multiple_read_protect(void) ( cache_ptr->read_protects[0] != 0 ) || ( cache_ptr->max_read_protects[0] != 0 ) ) { - pass = FALSE; - failure_mssg = "Unexpected protect stats 1.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected protect stats 1.\n"; } #endif /* H5C1_COLLECT_CACHE_STATS */ - if ( pass ) + if ( pass1 ) { - protect_entry_ro(cache_ptr, 0, 0); + protect_entry_ro1(cache_ptr, 0, 0); if ( ( ! ( entry_ptr->header.is_protected ) ) || ( ! ( entry_ptr->header.is_read_only ) ) || ( entry_ptr->header.ro_ref_count != 1 ) ) { - pass = FALSE; - failure_mssg = "Unexpected ro protected status 2.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected ro protected status 2.\n"; } } @@ -13427,21 +13427,21 @@ check_multiple_read_protect(void) ( cache_ptr->read_protects[0] != 1 ) || ( cache_ptr->max_read_protects[0] != 1 ) ) { - pass = FALSE; - failure_mssg = "Unexpected protect stats 2.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected protect stats 2.\n"; } #endif /* H5C1_COLLECT_CACHE_STATS */ - if ( pass ) + if ( pass1 ) { - protect_entry_ro(cache_ptr, 0, 0); + protect_entry_ro1(cache_ptr, 0, 0); if ( ( ! ( entry_ptr->header.is_protected ) ) || ( ! ( entry_ptr->header.is_read_only ) ) || ( entry_ptr->header.ro_ref_count != 2 ) ) { - pass = FALSE; - failure_mssg = "Unexpected ro protected status 3.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected ro protected status 3.\n"; } } @@ -13450,21 +13450,21 @@ check_multiple_read_protect(void) ( cache_ptr->read_protects[0] != 2 ) || ( cache_ptr->max_read_protects[0] != 2 ) ) { - pass = FALSE; - failure_mssg = "Unexpected protect stats 3.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected protect stats 3.\n"; } #endif /* H5C1_COLLECT_CACHE_STATS */ - if ( pass ) + if ( pass1 ) { - unprotect_entry(cache_ptr, 0, 0, FALSE, H5C1__NO_FLAGS_SET); + unprotect_entry1(cache_ptr, 0, 0, FALSE, H5C1__NO_FLAGS_SET); if ( ( ! ( entry_ptr->header.is_protected ) ) || ( ! ( entry_ptr->header.is_read_only ) ) || ( entry_ptr->header.ro_ref_count != 1 ) ) { - pass = FALSE; - failure_mssg = "Unexpected ro protected status 4.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected ro protected status 4.\n"; } } @@ -13473,21 +13473,21 @@ check_multiple_read_protect(void) ( cache_ptr->read_protects[0] != 2 ) || ( cache_ptr->max_read_protects[0] != 2 ) ) { - pass = FALSE; - failure_mssg = "Unexpected protect stats 4.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected protect stats 4.\n"; } #endif /* H5C1_COLLECT_CACHE_STATS */ - if ( pass ) + if ( pass1 ) { - protect_entry_ro(cache_ptr, 0, 0); + protect_entry_ro1(cache_ptr, 0, 0); if ( ( ! ( entry_ptr->header.is_protected ) ) || ( ! ( entry_ptr->header.is_read_only ) ) || ( entry_ptr->header.ro_ref_count != 2 ) ) { - pass = FALSE; - failure_mssg = "Unexpected ro protected status 5.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected ro protected status 5.\n"; } } @@ -13496,21 +13496,21 @@ check_multiple_read_protect(void) ( cache_ptr->read_protects[0] != 3 ) || ( cache_ptr->max_read_protects[0] != 2 ) ) { - pass = FALSE; - failure_mssg = "Unexpected protect stats 5.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected protect stats 5.\n"; } #endif /* H5C1_COLLECT_CACHE_STATS */ - if ( pass ) + if ( pass1 ) { - protect_entry_ro(cache_ptr, 0, 0); + protect_entry_ro1(cache_ptr, 0, 0); if ( ( ! ( entry_ptr->header.is_protected ) ) || ( ! ( entry_ptr->header.is_read_only ) ) || ( entry_ptr->header.ro_ref_count != 3 ) ) { - pass = FALSE; - failure_mssg = "Unexpected ro protected status 6.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected ro protected status 6.\n"; } } @@ -13519,21 +13519,21 @@ check_multiple_read_protect(void) ( cache_ptr->read_protects[0] != 4 ) || ( cache_ptr->max_read_protects[0] != 3 ) ) { - pass = FALSE; - failure_mssg = "Unexpected protect stats 6.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected protect stats 6.\n"; } #endif /* H5C1_COLLECT_CACHE_STATS */ - if ( pass ) + if ( pass1 ) { - unprotect_entry(cache_ptr, 0, 0, FALSE, H5C1__NO_FLAGS_SET); + unprotect_entry1(cache_ptr, 0, 0, FALSE, H5C1__NO_FLAGS_SET); if ( ( ! ( entry_ptr->header.is_protected ) ) || ( ! ( entry_ptr->header.is_read_only ) ) || ( entry_ptr->header.ro_ref_count != 2 ) ) { - pass = FALSE; - failure_mssg = "Unexpected ro protected status 7.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected ro protected status 7.\n"; } } @@ -13542,21 +13542,21 @@ check_multiple_read_protect(void) ( cache_ptr->read_protects[0] != 4 ) || ( cache_ptr->max_read_protects[0] != 3 ) ) { - pass = FALSE; - failure_mssg = "Unexpected protect stats 7.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected protect stats 7.\n"; } #endif /* H5C1_COLLECT_CACHE_STATS */ - if ( pass ) + if ( pass1 ) { - unprotect_entry(cache_ptr, 0, 0, FALSE, H5C1__NO_FLAGS_SET); + unprotect_entry1(cache_ptr, 0, 0, FALSE, H5C1__NO_FLAGS_SET); if ( ( ! ( entry_ptr->header.is_protected ) ) || ( ! ( entry_ptr->header.is_read_only ) ) || ( entry_ptr->header.ro_ref_count != 1 ) ) { - pass = FALSE; - failure_mssg = "Unexpected ro protected status 8.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected ro protected status 8.\n"; } } @@ -13565,21 +13565,21 @@ check_multiple_read_protect(void) ( cache_ptr->read_protects[0] != 4 ) || ( cache_ptr->max_read_protects[0] != 3 ) ) { - pass = FALSE; - failure_mssg = "Unexpected protect stats 8.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected protect stats 8.\n"; } #endif /* H5C1_COLLECT_CACHE_STATS */ - if ( pass ) + if ( pass1 ) { - unprotect_entry(cache_ptr, 0, 0, FALSE, H5C1__NO_FLAGS_SET); + unprotect_entry1(cache_ptr, 0, 0, FALSE, H5C1__NO_FLAGS_SET); if ( ( entry_ptr->header.is_protected ) || ( entry_ptr->header.is_read_only ) || ( entry_ptr->header.ro_ref_count != 0 ) ) { - pass = FALSE; - failure_mssg = "Unexpected ro protected status 9.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected ro protected status 9.\n"; } } @@ -13588,8 +13588,8 @@ check_multiple_read_protect(void) ( cache_ptr->read_protects[0] != 4 ) || ( cache_ptr->max_read_protects[0] != 3 ) ) { - pass = FALSE; - failure_mssg = "Unexpected protect stats 9.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected protect stats 9.\n"; } #endif /* H5C1_COLLECT_CACHE_STATS */ @@ -13598,16 +13598,16 @@ check_multiple_read_protect(void) * that the stats are getting collected properly here as well. */ - if ( pass ) + if ( pass1 ) { - protect_entry(cache_ptr, 0, 0); + protect_entry1(cache_ptr, 0, 0); if ( ( ! ( entry_ptr->header.is_protected ) ) || ( entry_ptr->header.is_read_only ) || ( entry_ptr->header.ro_ref_count != 0 ) ) { - pass = FALSE; - failure_mssg = "Unexpected ro protected status 10.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected ro protected status 10.\n"; } } @@ -13616,21 +13616,21 @@ check_multiple_read_protect(void) ( cache_ptr->read_protects[0] != 4 ) || ( cache_ptr->max_read_protects[0] != 3 ) ) { - pass = FALSE; - failure_mssg = "Unexpected protect stats 10.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected protect stats 10.\n"; } #endif /* H5C1_COLLECT_CACHE_STATS */ - if ( pass ) + if ( pass1 ) { - unprotect_entry(cache_ptr, 0, 0, FALSE, H5C1__NO_FLAGS_SET); + unprotect_entry1(cache_ptr, 0, 0, FALSE, H5C1__NO_FLAGS_SET); if ( ( entry_ptr->header.is_protected ) || ( entry_ptr->header.is_read_only ) || ( entry_ptr->header.ro_ref_count != 0 ) ) { - pass = FALSE; - failure_mssg = "Unexpected ro protected status 11.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected ro protected status 11.\n"; } } @@ -13639,8 +13639,8 @@ check_multiple_read_protect(void) ( cache_ptr->read_protects[0] != 4 ) || ( cache_ptr->max_read_protects[0] != 3 ) ) { - pass = FALSE; - failure_mssg = "Unexpected protect stats 11.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected protect stats 11.\n"; } #endif /* H5C1_COLLECT_CACHE_STATS */ @@ -13653,46 +13653,46 @@ check_multiple_read_protect(void) * at the end to ensure that all is at it should be. */ - if ( pass ) { + if ( pass1 ) { - protect_entry(cache_ptr, 0, 2); /* (0,2) write */ - protect_entry_ro(cache_ptr, 0, 4); /* (0,4) read only (1) */ - protect_entry(cache_ptr, 0, 6); /* (0,6) write */ + protect_entry1(cache_ptr, 0, 2); /* (0,2) write */ + protect_entry_ro1(cache_ptr, 0, 4); /* (0,4) read only (1) */ + protect_entry1(cache_ptr, 0, 6); /* (0,6) write */ - unprotect_entry(cache_ptr, 0, 2, FALSE, /* (0,2) unprotect */ + unprotect_entry1(cache_ptr, 0, 2, FALSE, /* (0,2) unprotect */ H5C1__NO_FLAGS_SET); - protect_entry_ro(cache_ptr, 0, 2); /* (0,2) read only (1) */ - protect_entry(cache_ptr, 0, 1); /* (0,1) write */ - protect_entry_ro(cache_ptr, 0, 4); /* (0,4) read only (2) */ - protect_entry(cache_ptr, 0, 0); /* (0,0) write */ - protect_entry_ro(cache_ptr, 0, 2); /* (0,2) read only (2) */ + protect_entry_ro1(cache_ptr, 0, 2); /* (0,2) read only (1) */ + protect_entry1(cache_ptr, 0, 1); /* (0,1) write */ + protect_entry_ro1(cache_ptr, 0, 4); /* (0,4) read only (2) */ + protect_entry1(cache_ptr, 0, 0); /* (0,0) write */ + protect_entry_ro1(cache_ptr, 0, 2); /* (0,2) read only (2) */ - unprotect_entry(cache_ptr, 0, 2, FALSE, /* (0,2) read only (1) pin */ + unprotect_entry1(cache_ptr, 0, 2, FALSE, /* (0,2) read only (1) pin */ H5C1__PIN_ENTRY_FLAG); - unprotect_entry(cache_ptr, 0, 6, FALSE, /* (0,6) unprotect */ + unprotect_entry1(cache_ptr, 0, 6, FALSE, /* (0,6) unprotect */ H5C1__NO_FLAGS_SET); - protect_entry_ro(cache_ptr, 0, 4); /* (0,4) read only (3) */ + protect_entry_ro1(cache_ptr, 0, 4); /* (0,4) read only (3) */ - unprotect_entry(cache_ptr, 0, 2, FALSE, /* (0,2) unprotect */ + unprotect_entry1(cache_ptr, 0, 2, FALSE, /* (0,2) unprotect */ H5C1__NO_FLAGS_SET); - unprotect_entry(cache_ptr, 0, 1, FALSE, /* (0,1) unprotect */ + unprotect_entry1(cache_ptr, 0, 1, FALSE, /* (0,1) unprotect */ H5C1__NO_FLAGS_SET); - if ( pass ) { + if ( pass1 ) { - entry_ptr = &((entries[0])[4]); + entry_ptr = &((entries1[0])[4]); if ( H5C1_pin_protected_entry(cache_ptr, (void *)entry_ptr) < 0 ) { - pass = FALSE; - failure_mssg = "H5C1_pin_protected_entry() failed.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_pin_protected_entry() failed.\n"; } else if ( ! (entry_ptr->header.is_pinned) ) { - pass = FALSE; - failure_mssg = "entry (0,4) not pinned.\n"; + pass1 = FALSE; + failure_mssg1 = "entry (0,4) not pinned.\n"; } else { @@ -13702,24 +13702,24 @@ check_multiple_read_protect(void) } } - unprotect_entry(cache_ptr, 0, 4, FALSE, /* (0,4) read only (2) */ + unprotect_entry1(cache_ptr, 0, 4, FALSE, /* (0,4) read only (2) */ H5C1__NO_FLAGS_SET); - unprotect_entry(cache_ptr, 0, 4, FALSE, /* (0,4) read only (1) */ + unprotect_entry1(cache_ptr, 0, 4, FALSE, /* (0,4) read only (1) */ H5C1__UNPIN_ENTRY_FLAG); - if ( ( pass ) && ( entry_ptr->header.is_pinned ) ) { + if ( ( pass1 ) && ( entry_ptr->header.is_pinned ) ) { - pass = FALSE; - failure_mssg = "enty (0,4) still pinned.\n"; + pass1 = FALSE; + failure_mssg1 = "enty (0,4) still pinned.\n"; } - unprotect_entry(cache_ptr, 0, 4, FALSE, /* (0,4) unprotect */ + unprotect_entry1(cache_ptr, 0, 4, FALSE, /* (0,4) unprotect */ H5C1__NO_FLAGS_SET); - unprotect_entry(cache_ptr, 0, 0, FALSE, /* (0,0) unprotect */ + unprotect_entry1(cache_ptr, 0, 0, FALSE, /* (0,0) unprotect */ H5C1__NO_FLAGS_SET); - unpin_entry(cache_ptr, 0, 2); + unpin_entry1(cache_ptr, 0, 2); } #if H5C1_COLLECT_CACHE_STATS @@ -13727,23 +13727,23 @@ check_multiple_read_protect(void) ( cache_ptr->read_protects[0] != 9 ) || ( cache_ptr->max_read_protects[0] != 3 ) ) { - pass = FALSE; - failure_mssg = "Unexpected protect stats 11.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected protect stats 11.\n"; } #endif /* H5C1_COLLECT_CACHE_STATS */ - if ( pass ) { + if ( pass1 ) { - takedown_cache(cache_ptr, FALSE, FALSE); + takedown_cache1(cache_ptr, FALSE, FALSE); } - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) { + if ( ! pass1 ) { - HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + HDfprintf(stdout, "%s: failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } return; @@ -13752,7 +13752,7 @@ check_multiple_read_protect(void) /*------------------------------------------------------------------------- - * Function: check_rename_entry() + * Function: check_rename_entry1() * * Purpose: Verify that H5C1_rename_entry behaves as expected. In * particular, verify that it works correctly with pinned @@ -13769,9 +13769,9 @@ check_multiple_read_protect(void) */ static void -check_rename_entry(void) +check_rename_entry1(void) { - const char * fcn_name = "check_rename_entry"; + const char * fcn_name = "check_rename_entry1"; int i; H5C1_t * cache_ptr = NULL; struct rename_entry_test_spec test_specs[4] = @@ -13804,7 +13804,7 @@ check_rename_entry(void) TESTING("H5C1_rename_entry() functionality"); - pass = TRUE; + pass1 = TRUE; /* allocate a cache, load entries into it, and then rename * them. To the extent possible, verify that the desired @@ -13831,45 +13831,45 @@ check_rename_entry(void) * list. */ - if ( pass ) { + if ( pass1 ) { - reset_entries(); + reset_entries1(); - cache_ptr = setup_cache((size_t)(2 * 1024 * 1024), + cache_ptr = setup_cache1((size_t)(2 * 1024 * 1024), (size_t)(1 * 1024 * 1024)); } i = 0; - while ( ( pass ) && ( i < 4 ) ) + while ( ( pass1 ) && ( i < 4 ) ) { - check_rename_entry__run_test(cache_ptr, i, &(test_specs[i])); + check_rename_entry1__run_test(cache_ptr, i, &(test_specs[i])); i++; } - if ( pass ) { + if ( pass1 ) { - takedown_cache(cache_ptr, FALSE, FALSE); + takedown_cache1(cache_ptr, FALSE, FALSE); } - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) { + if ( ! pass1 ) { - HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + HDfprintf(stdout, "%s(): failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } return; -} /* check_rename_entry() */ +} /* check_rename_entry1() */ /*------------------------------------------------------------------------- - * Function: check_rename_entry__run_test() + * Function: check_rename_entry1__run_test() * * Purpose: Run a rename entry test. * - * Do nothing if pass is FALSE on entry. + * Do nothing if pass1 is FALSE on entry. * * Return: void * @@ -13884,11 +13884,11 @@ check_rename_entry(void) */ static void -check_rename_entry__run_test(H5C1_t * cache_ptr, +check_rename_entry1__run_test(H5C1_t * cache_ptr, int test_num, struct rename_entry_test_spec * spec_ptr) { - /* const char * fcn_name = "check_rename_entry__run_test"; */ + /* const char * fcn_name = "check_rename_entry1__run_test"; */ static char msg[128]; unsigned int flags = H5C1__NO_FLAGS_SET; test_entry_t * base_addr; @@ -13897,25 +13897,25 @@ check_rename_entry__run_test(H5C1_t * cache_ptr, if ( cache_ptr == NULL ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "cache_ptr NULL on entry to rename test #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( spec_ptr == NULL ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "spec_ptr NULL on entry to rename test #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } - if ( pass ) { + if ( pass1 ) { - base_addr = entries[spec_ptr->entry_type]; + base_addr = entries1[spec_ptr->entry_type]; entry_ptr = &(base_addr[spec_ptr->entry_index]); if ( ( entry_ptr->self != entry_ptr ) || @@ -13924,11 +13924,11 @@ check_rename_entry__run_test(H5C1_t * cache_ptr, ( ! ( entry_ptr->at_main_addr ) ) || ( entry_ptr->addr != entry_ptr->main_addr ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "bad entry_ptr in rename test #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( spec_ptr->is_pinned ) { @@ -13936,32 +13936,32 @@ check_rename_entry__run_test(H5C1_t * cache_ptr, } } - protect_entry(cache_ptr, spec_ptr->entry_type, spec_ptr->entry_index); + protect_entry1(cache_ptr, spec_ptr->entry_type, spec_ptr->entry_index); - unprotect_entry(cache_ptr, spec_ptr->entry_type, spec_ptr->entry_index, + unprotect_entry1(cache_ptr, spec_ptr->entry_type, spec_ptr->entry_index, (int)(spec_ptr->is_dirty), flags); - rename_entry(cache_ptr, spec_ptr->entry_type, spec_ptr->entry_index, FALSE); + rename_entry1(cache_ptr, spec_ptr->entry_type, spec_ptr->entry_index, FALSE); - if ( pass ) { + if ( pass1 ) { /* verify that the rename took place, and that the cache's internal * structures are as expected. Note that some sanity checking is - * done by rename_entry(), so we don't have to repeat it here. + * done by rename_entry1(), so we don't have to repeat it here. */ if ( spec_ptr->is_pinned ) { if ( ! ( entry_ptr->header.is_pinned ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Pinned entry not pinned after rename in test #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } - if ( pass ) { + if ( pass1 ) { test_ptr = cache_ptr->pel_head_ptr; @@ -13973,49 +13973,49 @@ check_rename_entry__run_test(H5C1_t * cache_ptr, if ( test_ptr == NULL ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Pinned entry not in pel after rename in test #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } } - unpin_entry(cache_ptr, spec_ptr->entry_type, spec_ptr->entry_index); + unpin_entry1(cache_ptr, spec_ptr->entry_type, spec_ptr->entry_index); } else { if ( entry_ptr->header.is_pinned ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unpinned entry pinned after rename in test #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } if ( ( entry_ptr->header.prev != NULL ) || ( cache_ptr->LRU_head_ptr != (H5C1_cache_entry_t *)entry_ptr ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Entry not at head of LRU after rename in test #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } } } /* put the entry back where it started from */ - rename_entry(cache_ptr, spec_ptr->entry_type, spec_ptr->entry_index, TRUE); + rename_entry1(cache_ptr, spec_ptr->entry_type, spec_ptr->entry_index, TRUE); return; -} /* check_rename_entry__run_test() */ +} /* check_rename_entry1__run_test() */ /*------------------------------------------------------------------------- - * Function: check_pin_protected_entry() + * Function: check_pin_protected_entry1() * * Purpose: Verify that H5C1_pin_protected_entry behaves as expected. * @@ -14030,9 +14030,9 @@ check_rename_entry__run_test(H5C1_t * cache_ptr, */ static void -check_pin_protected_entry(void) +check_pin_protected_entry1(void) { - const char * fcn_name = "check_pin_protected_entry"; + const char * fcn_name = "check_pin_protected_entry1"; static char msg[128]; herr_t result; H5C1_t * cache_ptr = NULL; @@ -14041,42 +14041,42 @@ check_pin_protected_entry(void) TESTING("H5C1_pin_protected_entry() functionality"); - pass = TRUE; + pass1 = TRUE; /* Create a cache, protect an entry, and then use H5C1_pin_protected_entry() * to pin it. Verify that the entry is in fact pined. Unprotect the entry * to unpin it, and then destroy the cache. */ - if ( pass ) { + if ( pass1 ) { - reset_entries(); + reset_entries1(); - cache_ptr = setup_cache((size_t)(2 * 1024 * 1024), + cache_ptr = setup_cache1((size_t)(2 * 1024 * 1024), (size_t)(1 * 1024 * 1024)); } - protect_entry(cache_ptr, 0, 0); + protect_entry1(cache_ptr, 0, 0); - if ( pass ) { + if ( pass1 ) { - base_addr = entries[0]; + base_addr = entries1[0]; entry_ptr = &(base_addr[0]); result = H5C1_pin_protected_entry(cache_ptr, (void *)entry_ptr); if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "H5C1_pin_protected_entry() reports failure."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ! ( entry_ptr->header.is_pinned ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "entry not pinned when it should be."); - failure_mssg = msg; + failure_mssg1 = msg; } else { @@ -14084,30 +14084,30 @@ check_pin_protected_entry(void) } } - unprotect_entry(cache_ptr, 0, 0, FALSE, H5C1__UNPIN_ENTRY_FLAG); + unprotect_entry1(cache_ptr, 0, 0, FALSE, H5C1__UNPIN_ENTRY_FLAG); - if ( pass ) { + if ( pass1 ) { - takedown_cache(cache_ptr, FALSE, FALSE); + takedown_cache1(cache_ptr, FALSE, FALSE); } - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) { + if ( ! pass1 ) { - HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + HDfprintf(stdout, "%s(): failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } return; -} /* check_pin_protected_entry() */ +} /* check_pin_protected_entry1() */ /*------------------------------------------------------------------------- - * Function: check_resize_entry() + * Function: check_resize_entry1() * - * Purpose: Verify that H5C1_resize_entry() and H5C1_unprotect() resize + * Purpose: Verify that H5C1_resize_entry1() and H5C1_unprotect() resize * entries as expected. * * Return: void @@ -14123,9 +14123,9 @@ check_pin_protected_entry(void) */ static void -check_resize_entry(void) +check_resize_entry1(void) { - const char * fcn_name = "check_resize_entry"; + const char * fcn_name = "check_resize_entry1"; static char msg[128]; herr_t result; hbool_t in_cache; @@ -14154,10 +14154,10 @@ check_resize_entry(void) * expected sizes. * * Protect and unprotect the entry again to pin it. Use - * H5C1_resize_entry to reduce its size. Verify that the entry + * H5C1_resize_entry1 to reduce its size. Verify that the entry * and cache have the expected sizes. * - * Use H5C1_resize_entry again to restore the entry to its original + * Use H5C1_resize_entry1 again to restore the entry to its original * size. Verify that the entry and cache have the expected sizes. * * Use a protect / unprotect cycle to unpin and destroy the entry. @@ -14169,39 +14169,39 @@ check_resize_entry(void) * the cache. */ - pass = TRUE; + pass1 = TRUE; /* tests with only one entry in the cache: */ - if ( pass ) { + if ( pass1 ) { - reset_entries(); + reset_entries1(); - cache_ptr = setup_cache((size_t)(2 * 1024 * 1024), + cache_ptr = setup_cache1((size_t)(2 * 1024 * 1024), (size_t)(1 * 1024 * 1024)); - base_addr = entries[LARGE_ENTRY_TYPE]; + base_addr = entries1[LARGE_ENTRY_TYPE]; entry_ptr = &(base_addr[0]); entry_size = LARGE_ENTRY_SIZE; } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->index_len != 0 ) || ( cache_ptr->index_size != 0 ) || ( cache_ptr->slist_len != 0 ) || ( cache_ptr->slist_size != 0 ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected cache status 1."); - failure_mssg = msg; + failure_mssg1 = msg; } } - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, 0); - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->index_len != 1 ) || ( cache_ptr->index_size != LARGE_ENTRY_SIZE ) || @@ -14209,14 +14209,14 @@ check_resize_entry(void) ( cache_ptr->slist_size != 0 ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected cache status 2."); - failure_mssg = msg; + failure_mssg1 = msg; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_entry_status(cache_ptr, entry_ptr->addr, &reported_entry_size, &in_cache, @@ -14224,42 +14224,42 @@ check_resize_entry(void) if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "H5AC1_get_entry_status() reports failure 1."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( !in_cache || is_dirty || !is_protected || is_pinned ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected status 1."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ( ! entry_ptr->loaded ) || ( entry_ptr->cleared ) || ( entry_ptr->flushed ) || ( entry_ptr->destroyed ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected entry history 1."); - failure_mssg = msg; + failure_mssg1 = msg; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_unprotect(NULL, -1, -1, cache_ptr, - &(types[LARGE_ENTRY_TYPE]), entry_ptr->addr, + &(types1[LARGE_ENTRY_TYPE]), entry_ptr->addr, (void *)entry_ptr, H5C1__SIZE_CHANGED_FLAG | H5C1__DIRTIED_FLAG, (LARGE_ENTRY_SIZE / 2)); if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "H5C1_unprotect() reports failure 1."); - failure_mssg = msg; + failure_mssg1 = msg; } else { @@ -14272,21 +14272,21 @@ check_resize_entry(void) } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->index_len != 1 ) || ( cache_ptr->index_size != (LARGE_ENTRY_SIZE / 2) ) || ( cache_ptr->slist_len != 1 ) || ( cache_ptr->slist_size != (LARGE_ENTRY_SIZE / 2) ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected cache status 3."); - failure_mssg = msg; + failure_mssg1 = msg; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_entry_status(cache_ptr, entry_ptr->addr, &reported_entry_size, &in_cache, @@ -14294,45 +14294,45 @@ check_resize_entry(void) if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "H5AC1_get_entry_status() reports failure 2."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( !in_cache || !is_dirty || is_protected || is_pinned || ( reported_entry_size != (LARGE_ENTRY_SIZE / 2) ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected status 2."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ( ! entry_ptr->loaded ) || ( entry_ptr->cleared ) || ( entry_ptr->flushed ) || ( entry_ptr->destroyed ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected entry history 2."); - failure_mssg = msg; + failure_mssg1 = msg; } } - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, 0); - if ( pass ) { + if ( pass1 ) { result = H5C1_unprotect(NULL, -1, -1, cache_ptr, - &(types[LARGE_ENTRY_TYPE]), entry_ptr->addr, + &(types1[LARGE_ENTRY_TYPE]), entry_ptr->addr, (void *)entry_ptr, (H5C1__DIRTIED_FLAG | H5C1__SIZE_CHANGED_FLAG), LARGE_ENTRY_SIZE); if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "H5C1_unprotect() reports failure 2."); - failure_mssg = msg; + failure_mssg1 = msg; } else { @@ -14345,21 +14345,21 @@ check_resize_entry(void) } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->index_len != 1 ) || ( cache_ptr->index_size != LARGE_ENTRY_SIZE ) || ( cache_ptr->slist_len != 1 ) || ( cache_ptr->slist_size != LARGE_ENTRY_SIZE ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected cache status 4."); - failure_mssg = msg; + failure_mssg1 = msg; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_entry_status(cache_ptr, entry_ptr->addr, &reported_entry_size, &in_cache, @@ -14367,64 +14367,64 @@ check_resize_entry(void) if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "H5AC1_get_entry_status() reports failure 3."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( !in_cache || !is_dirty || is_protected || is_pinned || ( reported_entry_size != LARGE_ENTRY_SIZE ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected status 3."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ( ! entry_ptr->loaded ) || ( entry_ptr->cleared ) || ( entry_ptr->flushed ) || ( entry_ptr->destroyed ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected entry history 3."); - failure_mssg = msg; + failure_mssg1 = msg; } } - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, 0); - unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, 0, FALSE, H5C1__PIN_ENTRY_FLAG); + unprotect_entry1(cache_ptr, LARGE_ENTRY_TYPE, 0, FALSE, H5C1__PIN_ENTRY_FLAG); - if ( pass ) { + if ( pass1 ) { result = H5C1_resize_pinned_entry(cache_ptr, (void *)entry_ptr, (LARGE_ENTRY_SIZE / 4)); if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "H5C1_resize_pinned_entry() reports failure 1."); - failure_mssg = msg; + failure_mssg1 = msg; } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->index_len != 1 ) || ( cache_ptr->index_size != (LARGE_ENTRY_SIZE / 4) ) || ( cache_ptr->slist_len != 1 ) || ( cache_ptr->slist_size != (LARGE_ENTRY_SIZE / 4) ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected cache status 5."); - failure_mssg = msg; + failure_mssg1 = msg; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_entry_status(cache_ptr, entry_ptr->addr, &reported_entry_size, &in_cache, @@ -14432,60 +14432,60 @@ check_resize_entry(void) if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "H5AC1_get_entry_status() reports failure 4."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( !in_cache || !is_dirty || is_protected || ! is_pinned || ( reported_entry_size != (LARGE_ENTRY_SIZE / 4) ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected status 4."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ( ! entry_ptr->loaded ) || ( entry_ptr->cleared ) || ( entry_ptr->flushed ) || ( entry_ptr->destroyed ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected entry history 4."); - failure_mssg = msg; + failure_mssg1 = msg; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_resize_pinned_entry(cache_ptr, (void *)entry_ptr, LARGE_ENTRY_SIZE); if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "H5C1_resize_pinned_entry() reports failure 2."); - failure_mssg = msg; + failure_mssg1 = msg; } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->index_len != 1 ) || ( cache_ptr->index_size != LARGE_ENTRY_SIZE ) || ( cache_ptr->slist_len != 1 ) || ( cache_ptr->slist_size != LARGE_ENTRY_SIZE ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected cache status 6."); - failure_mssg = msg; + failure_mssg1 = msg; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_entry_status(cache_ptr, entry_ptr->addr, &reported_entry_size, &in_cache, @@ -14493,36 +14493,36 @@ check_resize_entry(void) if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "H5AC1_get_entry_status() reports failure 5."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( !in_cache || !is_dirty || is_protected || ! is_pinned || ( reported_entry_size != LARGE_ENTRY_SIZE ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected status 5."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ( ! entry_ptr->loaded ) || ( entry_ptr->cleared ) || ( entry_ptr->flushed ) || ( entry_ptr->destroyed ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected entry history 5."); - failure_mssg = msg; + failure_mssg1 = msg; } } - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, 0); - unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, 0, FALSE, + unprotect_entry1(cache_ptr, LARGE_ENTRY_TYPE, 0, FALSE, H5C1__UNPIN_ENTRY_FLAG | H5C1__DELETED_FLAG); - if ( pass ) { + if ( pass1 ) { result = H5C1_get_entry_status(cache_ptr, entry_ptr->addr, &entry_size, &in_cache, &is_dirty, &is_protected, @@ -14530,39 +14530,39 @@ check_resize_entry(void) if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "H5AC1_get_entry_status() reports failure 6."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( in_cache ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected status 6."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ( ! entry_ptr->loaded ) || ( ! entry_ptr->cleared ) || ( entry_ptr->flushed ) || ( ! entry_ptr->destroyed ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected entry history 6."); - failure_mssg = msg; + failure_mssg1 = msg; } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->index_len != 0 ) || ( cache_ptr->index_size != 0 ) || ( cache_ptr->slist_len != 0 ) || ( cache_ptr->slist_size != 0 ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected cache status 7."); - failure_mssg = msg; + failure_mssg1 = msg; } } @@ -14570,33 +14570,33 @@ check_resize_entry(void) /* now repreat the above tests with several entries in the cache: */ - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->index_len != 0 ) || ( cache_ptr->index_size != 0 ) || ( cache_ptr->slist_len != 0 ) || ( cache_ptr->slist_size != 0 ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected cache status 8."); - failure_mssg = msg; + failure_mssg1 = msg; } - base_addr = entries[LARGE_ENTRY_TYPE]; + base_addr = entries1[LARGE_ENTRY_TYPE]; entry_ptr = &(base_addr[3]); entry_size = LARGE_ENTRY_SIZE; } - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, 0); - unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, 0, FALSE, H5C1__NO_FLAGS_SET); + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, 0); + unprotect_entry1(cache_ptr, LARGE_ENTRY_TYPE, 0, FALSE, H5C1__NO_FLAGS_SET); - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, 1); - unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, 1, TRUE, H5C1__NO_FLAGS_SET); + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, 1); + unprotect_entry1(cache_ptr, LARGE_ENTRY_TYPE, 1, TRUE, H5C1__NO_FLAGS_SET); - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, 2); - unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, 2, FALSE, H5C1__NO_FLAGS_SET); + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, 2); + unprotect_entry1(cache_ptr, LARGE_ENTRY_TYPE, 2, FALSE, H5C1__NO_FLAGS_SET); - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->index_len != 3 ) || ( cache_ptr->index_size != 3 * LARGE_ENTRY_SIZE ) || @@ -14604,16 +14604,16 @@ check_resize_entry(void) ( cache_ptr->slist_size != LARGE_ENTRY_SIZE ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected cache status 9."); - failure_mssg = msg; + failure_mssg1 = msg; } } - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, 3); + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, 3); - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->index_len != 4 ) || ( cache_ptr->index_size != 4 * LARGE_ENTRY_SIZE ) || @@ -14621,14 +14621,14 @@ check_resize_entry(void) ( cache_ptr->slist_size != LARGE_ENTRY_SIZE ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected cache status 10."); - failure_mssg = msg; + failure_mssg1 = msg; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_entry_status(cache_ptr, entry_ptr->addr, &reported_entry_size, &in_cache, @@ -14636,42 +14636,42 @@ check_resize_entry(void) if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "H5AC1_get_entry_status() reports failure 7."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( !in_cache || is_dirty || !is_protected || is_pinned ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected status 7."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ( ! entry_ptr->loaded ) || ( entry_ptr->cleared ) || ( entry_ptr->flushed ) || ( entry_ptr->destroyed ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected entry history 7."); - failure_mssg = msg; + failure_mssg1 = msg; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_unprotect(NULL, -1, -1, cache_ptr, - &(types[LARGE_ENTRY_TYPE]), entry_ptr->addr, + &(types1[LARGE_ENTRY_TYPE]), entry_ptr->addr, (void *)entry_ptr, H5C1__SIZE_CHANGED_FLAG | H5C1__DIRTIED_FLAG, (LARGE_ENTRY_SIZE / 2)); if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "H5C1_unprotect() reports failure 3."); - failure_mssg = msg; + failure_mssg1 = msg; } else { @@ -14684,7 +14684,7 @@ check_resize_entry(void) } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->index_len != 4 ) || ( cache_ptr->index_size != @@ -14693,14 +14693,14 @@ check_resize_entry(void) ( cache_ptr->slist_size != (LARGE_ENTRY_SIZE + (LARGE_ENTRY_SIZE / 2)) ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected cache status 11."); - failure_mssg = msg; + failure_mssg1 = msg; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_entry_status(cache_ptr, entry_ptr->addr, &reported_entry_size, &in_cache, @@ -14708,45 +14708,45 @@ check_resize_entry(void) if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "H5AC1_get_entry_status() reports failure 8."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( !in_cache || !is_dirty || is_protected || is_pinned || ( reported_entry_size != (LARGE_ENTRY_SIZE / 2) ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected status 8."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ( ! entry_ptr->loaded ) || ( entry_ptr->cleared ) || ( entry_ptr->flushed ) || ( entry_ptr->destroyed ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected entry history 8."); - failure_mssg = msg; + failure_mssg1 = msg; } } - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, 3); + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, 3); - if ( pass ) { + if ( pass1 ) { result = H5C1_unprotect(NULL, -1, -1, cache_ptr, - &(types[LARGE_ENTRY_TYPE]), entry_ptr->addr, + &(types1[LARGE_ENTRY_TYPE]), entry_ptr->addr, (void *)entry_ptr, (H5C1__DIRTIED_FLAG | H5C1__SIZE_CHANGED_FLAG), LARGE_ENTRY_SIZE); if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "H5C1_unprotect() reports failure 4."); - failure_mssg = msg; + failure_mssg1 = msg; } else { @@ -14759,21 +14759,21 @@ check_resize_entry(void) } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->index_len != 4 ) || ( cache_ptr->index_size != 4 * LARGE_ENTRY_SIZE ) || ( cache_ptr->slist_len != 2 ) || ( cache_ptr->slist_size != 2 * LARGE_ENTRY_SIZE ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected cache status 12."); - failure_mssg = msg; + failure_mssg1 = msg; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_entry_status(cache_ptr, entry_ptr->addr, &reported_entry_size, &in_cache, @@ -14781,50 +14781,50 @@ check_resize_entry(void) if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "H5AC1_get_entry_status() reports failure 9."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( !in_cache || !is_dirty || is_protected || is_pinned || ( reported_entry_size != LARGE_ENTRY_SIZE ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected status 9."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ( ! entry_ptr->loaded ) || ( entry_ptr->cleared ) || ( entry_ptr->flushed ) || ( entry_ptr->destroyed ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected entry history 9."); - failure_mssg = msg; + failure_mssg1 = msg; } } - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, 3); + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, 3); - unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, 3, FALSE, H5C1__PIN_ENTRY_FLAG); + unprotect_entry1(cache_ptr, LARGE_ENTRY_TYPE, 3, FALSE, H5C1__PIN_ENTRY_FLAG); - if ( pass ) { + if ( pass1 ) { result = H5C1_resize_pinned_entry(cache_ptr, (void *)entry_ptr, (LARGE_ENTRY_SIZE / 4)); if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "H5C1_resize_pinned_entry() reports failure 3."); - failure_mssg = msg; + failure_mssg1 = msg; } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->index_len != 4 ) || ( cache_ptr->index_size != @@ -14833,14 +14833,14 @@ check_resize_entry(void) ( cache_ptr->slist_size != (LARGE_ENTRY_SIZE + (LARGE_ENTRY_SIZE / 4)) ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected cache status 13."); - failure_mssg = msg; + failure_mssg1 = msg; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_entry_status(cache_ptr, entry_ptr->addr, &reported_entry_size, &in_cache, @@ -14848,60 +14848,60 @@ check_resize_entry(void) if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "H5AC1_get_entry_status() reports failure 10."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( !in_cache || !is_dirty || is_protected || ! is_pinned || ( reported_entry_size != (LARGE_ENTRY_SIZE / 4) ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected status 10."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ( ! entry_ptr->loaded ) || ( entry_ptr->cleared ) || ( entry_ptr->flushed ) || ( entry_ptr->destroyed ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected entry history 10."); - failure_mssg = msg; + failure_mssg1 = msg; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_resize_pinned_entry(cache_ptr, (void *)entry_ptr, LARGE_ENTRY_SIZE); if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "H5C1_resize_pinned_entry() reports failure 4."); - failure_mssg = msg; + failure_mssg1 = msg; } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->index_len != 4 ) || ( cache_ptr->index_size != (4 * LARGE_ENTRY_SIZE) ) || ( cache_ptr->slist_len != 2 ) || ( cache_ptr->slist_size != (2 * LARGE_ENTRY_SIZE) ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected cache status 14."); - failure_mssg = msg; + failure_mssg1 = msg; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_entry_status(cache_ptr, entry_ptr->addr, &reported_entry_size, &in_cache, @@ -14909,36 +14909,36 @@ check_resize_entry(void) if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "H5AC1_get_entry_status() reports failure 11."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( !in_cache || !is_dirty || is_protected || ! is_pinned || ( reported_entry_size != LARGE_ENTRY_SIZE ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected status 11."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ( ! entry_ptr->loaded ) || ( entry_ptr->cleared ) || ( entry_ptr->flushed ) || ( entry_ptr->destroyed ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected entry history 11."); - failure_mssg = msg; + failure_mssg1 = msg; } } - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, 3); + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, 3); - unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, 3, FALSE, + unprotect_entry1(cache_ptr, LARGE_ENTRY_TYPE, 3, FALSE, H5C1__UNPIN_ENTRY_FLAG | H5C1__DELETED_FLAG); - if ( pass ) { + if ( pass1 ) { result = H5C1_get_entry_status(cache_ptr, entry_ptr->addr, &entry_size, &in_cache, &is_dirty, &is_protected, @@ -14946,83 +14946,83 @@ check_resize_entry(void) if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "H5AC1_get_entry_status() reports failure 12."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( in_cache ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected status 12."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ( ! entry_ptr->loaded ) || ( ! entry_ptr->cleared ) || ( entry_ptr->flushed ) || ( ! entry_ptr->destroyed ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected entry history 12."); - failure_mssg = msg; + failure_mssg1 = msg; } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->index_len != 3 ) || ( cache_ptr->index_size != (3 * LARGE_ENTRY_SIZE) ) || ( cache_ptr->slist_len != 1 ) || ( cache_ptr->slist_size != LARGE_ENTRY_SIZE ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected cache status 15."); - failure_mssg = msg; + failure_mssg1 = msg; } } - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, 2); - unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, 2, FALSE, H5C1__DELETED_FLAG); + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, 2); + unprotect_entry1(cache_ptr, LARGE_ENTRY_TYPE, 2, FALSE, H5C1__DELETED_FLAG); - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, 1); - unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, 1, FALSE, H5C1__DELETED_FLAG); + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, 1); + unprotect_entry1(cache_ptr, LARGE_ENTRY_TYPE, 1, FALSE, H5C1__DELETED_FLAG); - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, 0); - unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, 0, FALSE, H5C1__DELETED_FLAG); + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, 0); + unprotect_entry1(cache_ptr, LARGE_ENTRY_TYPE, 0, FALSE, H5C1__DELETED_FLAG); - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->index_len != 0 ) || ( cache_ptr->index_size != 0 ) || ( cache_ptr->slist_len != 0 ) || ( cache_ptr->slist_size != 0 ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected cache status 16."); - failure_mssg = msg; + failure_mssg1 = msg; } } - if ( pass ) { + if ( pass1 ) { - takedown_cache(cache_ptr, FALSE, FALSE); + takedown_cache1(cache_ptr, FALSE, FALSE); } - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) { + if ( ! pass1 ) { - HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + HDfprintf(stdout, "%s(): failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } return; -} /* check_resize_entry() */ +} /* check_resize_entry1() */ /*------------------------------------------------------------------------- @@ -15096,30 +15096,30 @@ check_evictions_enabled(void) * Now flush and discard the cache -- should succeed. */ - pass = TRUE; + pass1 = TRUE; if ( show_progress ) /* 1 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* create the cache */ - if ( pass ) { + if ( pass1 ) { - reset_entries(); + reset_entries1(); - cache_ptr = setup_cache((size_t)(1 * 1024 * 1024), + cache_ptr = setup_cache1((size_t)(1 * 1024 * 1024), (size_t)( 512 * 1024)); - base_addr = entries[MONSTER_ENTRY_TYPE]; + base_addr = entries1[MONSTER_ENTRY_TYPE]; entry_size = MONSTER_ENTRY_SIZE; } if ( show_progress ) /* 2 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* verivy that it is empty */ - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->index_len != 0 ) || ( cache_ptr->index_size != 0 ) || @@ -15127,48 +15127,48 @@ check_evictions_enabled(void) ( cache_ptr->slist_size != 0 ) || ( cache_ptr->evictions_enabled != TRUE ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected cache status 1."); - failure_mssg = msg; + failure_mssg1 = msg; } } if ( show_progress ) /* 3 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* verify that H5C1_get_evictions_enabled() returns the expected value */ - if ( pass ) { + if ( pass1 ) { result = H5C1_get_evictions_enabled(cache_ptr, &evictions_enabled); if ( ( result != SUCCEED ) || ( evictions_enabled != TRUE ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected evictions enabled 1."); - failure_mssg = msg; + failure_mssg1 = msg; } } if ( show_progress ) /* 4 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* fill the cache */ for ( i = 0; i < 16 ; i++ ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i); + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i, FALSE, H5C1__NO_FLAGS_SET); } if ( show_progress ) /* 5 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* verify that the cache is full */ - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->index_len != 16 ) || ( cache_ptr->index_size != 16 * MONSTER_ENTRY_SIZE ) || @@ -15177,28 +15177,28 @@ check_evictions_enabled(void) ( cache_ptr->evictions_enabled != TRUE ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected cache status 2."); - failure_mssg = msg; + failure_mssg1 = msg; } } if ( show_progress ) /* 6 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* protect and unprotect another entry */ - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 16); - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 16, + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 16); + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 16, FALSE, H5C1__NO_FLAGS_SET); if ( show_progress ) /* 7 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* verify that the an entry has been evicted */ - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->index_len != 16 ) || ( cache_ptr->index_size != 16 * MONSTER_ENTRY_SIZE ) || @@ -15206,18 +15206,18 @@ check_evictions_enabled(void) ( cache_ptr->slist_size != 0 ) || ( cache_ptr->evictions_enabled != TRUE ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected cache status 3."); - failure_mssg = msg; + failure_mssg1 = msg; } } if ( show_progress ) /* 8 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - if ( pass ) { + if ( pass1 ) { entry_ptr = &(base_addr[0]); @@ -15226,42 +15226,42 @@ check_evictions_enabled(void) if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "H5AC1_get_entry_status() reports failure 1."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( in_cache ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected status 1."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ( ! entry_ptr->loaded ) || ( entry_ptr->cleared ) || ( ! entry_ptr->flushed ) || ( ! entry_ptr->destroyed ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected entry history 1."); - failure_mssg = msg; + failure_mssg1 = msg; } } if ( show_progress ) /* 9 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* insert an entry */ - insert_entry(cache_ptr, MONSTER_ENTRY_TYPE, 17, TRUE, H5C1__NO_FLAGS_SET); + insert_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 17, TRUE, H5C1__NO_FLAGS_SET); if ( show_progress ) /* 10 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* verify that another entry has been evicted */ - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->index_len != 16 ) || ( cache_ptr->index_size != 16 * MONSTER_ENTRY_SIZE ) || @@ -15269,18 +15269,18 @@ check_evictions_enabled(void) ( cache_ptr->slist_size != MONSTER_ENTRY_SIZE ) || ( cache_ptr->evictions_enabled != TRUE ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected cache status 4."); - failure_mssg = msg; + failure_mssg1 = msg; } } if ( show_progress ) /* 11 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - if ( pass ) { + if ( pass1 ) { entry_ptr = &(base_addr[1]); @@ -15289,52 +15289,52 @@ check_evictions_enabled(void) if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "H5AC1_get_entry_status() reports failure 2."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( in_cache ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected status 2."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ( ! entry_ptr->loaded ) || ( entry_ptr->cleared ) || ( ! entry_ptr->flushed ) || ( ! entry_ptr->destroyed ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected entry history 2."); - failure_mssg = msg; + failure_mssg1 = msg; } } if ( show_progress ) /* 12 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* disable evictions */ - if ( pass ) { + if ( pass1 ) { result = H5C1_set_evictions_enabled(cache_ptr, FALSE); if ( result != SUCCEED ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "can't disable evictions 1."); - failure_mssg = msg; + failure_mssg1 = msg; } } if ( show_progress ) /* 13 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* verify that evictions are disabled */ - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->index_len != 16 ) || ( cache_ptr->index_size != 16 * MONSTER_ENTRY_SIZE ) || @@ -15342,28 +15342,28 @@ check_evictions_enabled(void) ( cache_ptr->slist_size != MONSTER_ENTRY_SIZE ) || ( cache_ptr->evictions_enabled != FALSE ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected cache status 5."); - failure_mssg = msg; + failure_mssg1 = msg; } } if ( show_progress ) /* 14 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* protect and unprotect another entry */ - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 18); - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 18, + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 18); + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 18, FALSE, H5C1__NO_FLAGS_SET); if ( show_progress ) /* 15 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* verify that no entry has been evicted */ - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->index_len != 17 ) || ( cache_ptr->index_size != 17 * MONSTER_ENTRY_SIZE ) || @@ -15371,26 +15371,26 @@ check_evictions_enabled(void) ( cache_ptr->slist_size != MONSTER_ENTRY_SIZE ) || ( cache_ptr->evictions_enabled != FALSE ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected cache status 6."); - failure_mssg = msg; + failure_mssg1 = msg; } } if ( show_progress ) /* 16 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* insert another entry */ - insert_entry(cache_ptr, MONSTER_ENTRY_TYPE, 19, TRUE, H5C1__NO_FLAGS_SET); + insert_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 19, TRUE, H5C1__NO_FLAGS_SET); if ( show_progress ) /* 17 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* verify that no entry has been evicted */ - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->index_len != 18 ) || ( cache_ptr->index_size != 18 * MONSTER_ENTRY_SIZE ) || @@ -15398,45 +15398,45 @@ check_evictions_enabled(void) ( cache_ptr->slist_size != 2 * MONSTER_ENTRY_SIZE ) || ( cache_ptr->evictions_enabled != FALSE ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected cache status 7."); - failure_mssg = msg; + failure_mssg1 = msg; } } if ( show_progress ) /* 18 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* re-enable evictions */ - if ( pass ) { + if ( pass1 ) { result = H5C1_set_evictions_enabled(cache_ptr, TRUE); if ( result != SUCCEED ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "can't enable evictions 1."); - failure_mssg = msg; + failure_mssg1 = msg; } } if ( show_progress ) /* 19 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* protect and unprotect an entry that is in the cache */ - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 19); - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 19, + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 19); + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 19, FALSE, H5C1__NO_FLAGS_SET); if ( show_progress ) /* 20 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* verify that no entries have been evicted */ - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->index_len != 18 ) || ( cache_ptr->index_size != 18 * MONSTER_ENTRY_SIZE ) || @@ -15444,31 +15444,31 @@ check_evictions_enabled(void) ( cache_ptr->slist_size != 2 * MONSTER_ENTRY_SIZE ) || ( cache_ptr->evictions_enabled != TRUE ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected cache status 8."); - failure_mssg = msg; + failure_mssg1 = msg; } } if ( show_progress ) /* 21 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* protect and unprotect an entry that isn't in the cache */ - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 20); - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 20, + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 20); + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 20, FALSE, H5C1__NO_FLAGS_SET); if ( show_progress ) /* 22 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* verify that the entries have been evicted to bring the * cache back down to its normal size. */ - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->index_len != 16 ) || ( cache_ptr->index_size != 16 * MONSTER_ENTRY_SIZE ) || @@ -15476,18 +15476,18 @@ check_evictions_enabled(void) ( cache_ptr->slist_size != 2 * MONSTER_ENTRY_SIZE ) || ( cache_ptr->evictions_enabled != TRUE ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected cache status 9."); - failure_mssg = msg; + failure_mssg1 = msg; } } if ( show_progress ) /* 23 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - if ( pass ) { + if ( pass1 ) { entry_ptr = &(base_addr[2]); @@ -15496,34 +15496,34 @@ check_evictions_enabled(void) if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "H5AC1_get_entry_status() reports failure 3."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( in_cache ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected status 3."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ( ! entry_ptr->loaded ) || ( entry_ptr->cleared ) || ( ! entry_ptr->flushed ) || ( ! entry_ptr->destroyed ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected entry history 3."); - failure_mssg = msg; + failure_mssg1 = msg; } } if ( show_progress ) /* 24 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - if ( pass ) { + if ( pass1 ) { entry_ptr = &(base_addr[3]); @@ -15532,64 +15532,64 @@ check_evictions_enabled(void) if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "H5AC1_get_entry_status() reports failure 4."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( in_cache ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected status 4."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ( ! entry_ptr->loaded ) || ( entry_ptr->cleared ) || ( ! entry_ptr->flushed ) || ( ! entry_ptr->destroyed ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected entry history 4."); - failure_mssg = msg; + failure_mssg1 = msg; } } if ( show_progress ) /* 25 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* disable evictions again */ - if ( pass ) { + if ( pass1 ) { result = H5C1_set_evictions_enabled(cache_ptr, FALSE); if ( result != SUCCEED ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "can't disable evictions 2."); - failure_mssg = msg; + failure_mssg1 = msg; } } if ( show_progress ) /* 26 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* protect and unprotect an entry that isn't in the cache, forcing * the cache to grow. */ - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 21); - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 21, + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 21); + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 21, FALSE, H5C1__NO_FLAGS_SET); if ( show_progress ) /* 27 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* verify that the cache has grown */ - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->index_len != 17 ) || ( cache_ptr->index_size != 17 * MONSTER_ENTRY_SIZE ) || @@ -15597,43 +15597,43 @@ check_evictions_enabled(void) ( cache_ptr->slist_size != 2 * MONSTER_ENTRY_SIZE ) || ( cache_ptr->evictions_enabled != FALSE ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected cache status 10."); - failure_mssg = msg; + failure_mssg1 = msg; } } if ( show_progress ) /* 28 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* re-enable evictions again */ - if ( pass ) { + if ( pass1 ) { result = H5C1_set_evictions_enabled(cache_ptr, TRUE); if ( result != SUCCEED ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "can't enable evictions 2."); - failure_mssg = msg; + failure_mssg1 = msg; } } if ( show_progress ) /* 29 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* insert an entry */ - insert_entry(cache_ptr, MONSTER_ENTRY_TYPE, 22, TRUE, H5C1__NO_FLAGS_SET); + insert_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 22, TRUE, H5C1__NO_FLAGS_SET); if ( show_progress ) /* 30 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* verify that the cache has returned to its maximum size */ - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->index_len != 16 ) || ( cache_ptr->index_size != 16 * MONSTER_ENTRY_SIZE ) || @@ -15641,18 +15641,18 @@ check_evictions_enabled(void) ( cache_ptr->slist_size != 3 * MONSTER_ENTRY_SIZE ) || ( cache_ptr->evictions_enabled != TRUE ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected cache status 11."); - failure_mssg = msg; + failure_mssg1 = msg; } } if ( show_progress ) /* 31 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - if ( pass ) { + if ( pass1 ) { entry_ptr = &(base_addr[4]); @@ -15661,65 +15661,65 @@ check_evictions_enabled(void) if ( result < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "H5AC1_get_entry_status() reports failure 5."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( in_cache ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected status 5."); - failure_mssg = msg; + failure_mssg1 = msg; } else if ( ( ! entry_ptr->loaded ) || ( entry_ptr->cleared ) || ( ! entry_ptr->flushed ) || ( ! entry_ptr->destroyed ) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected entry history 5."); - failure_mssg = msg; + failure_mssg1 = msg; } } if ( show_progress ) /* 32 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); /* disable evictions one last time before we shut down */ - if ( pass ) { + if ( pass1 ) { result = H5C1_set_evictions_enabled(cache_ptr, FALSE); if ( result != SUCCEED ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "can't disable evictions 3."); - failure_mssg = msg; + failure_mssg1 = msg; } } if ( show_progress ) /* 33 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - if ( pass ) { + if ( pass1 ) { - takedown_cache(cache_ptr, FALSE, FALSE); + takedown_cache1(cache_ptr, FALSE, FALSE); } if ( show_progress ) /* 34 */ - HDfprintf(stdout, "%s() - %0d -- pass = %d\n", - fcn_name, mile_stone++, (int)pass); + HDfprintf(stdout, "%s() - %0d -- pass1 = %d\n", + fcn_name, mile_stone++, (int)pass1); - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) { + if ( ! pass1 ) { - HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + HDfprintf(stdout, "%s(): failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } return; @@ -15751,51 +15751,51 @@ check_flush_protected_err(void) TESTING("flush cache with protected entry error"); - pass = TRUE; + pass1 = TRUE; /* allocate a cache, protect an entry, and try to flush. This * should fail. Unprotect the entry and flush again -- should * succeed. */ - if ( pass ) { + if ( pass1 ) { - reset_entries(); + reset_entries1(); - cache_ptr = setup_cache((size_t)(2 * 1024), + cache_ptr = setup_cache1((size_t)(2 * 1024), (size_t)(1 * 1024)); - protect_entry(cache_ptr, 0, 0); + protect_entry1(cache_ptr, 0, 0); if ( H5C1_flush_cache(NULL, -1, -1, cache_ptr, H5C1__NO_FLAGS_SET) >= 0 ) { - pass = FALSE; - failure_mssg = "flush succeeded on cache with protected entry.\n"; + pass1 = FALSE; + failure_mssg1 = "flush succeeded on cache with protected entry.\n"; } else { - unprotect_entry(cache_ptr, 0, 0, TRUE, H5C1__NO_FLAGS_SET); + unprotect_entry1(cache_ptr, 0, 0, TRUE, H5C1__NO_FLAGS_SET); if ( H5C1_flush_cache(NULL, -1, -1, cache_ptr, H5C1__NO_FLAGS_SET) < 0 ) { - pass = FALSE; - failure_mssg = "flush failed after unprotect.\n"; + pass1 = FALSE; + failure_mssg1 = "flush failed after unprotect.\n"; } else { - takedown_cache(cache_ptr, FALSE, FALSE); + takedown_cache1(cache_ptr, FALSE, FALSE); } } } - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) { + if ( ! pass1 ) { - HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + HDfprintf(stdout, "%s(): failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } return; @@ -15828,47 +15828,47 @@ check_destroy_pinned_err(void) TESTING("destroy cache with permanently pinned entry error"); - pass = TRUE; + pass1 = TRUE; /* allocate a cache, pin an entry, and try to flush destroy. This * should fail. Unpin the entry and flush destroy again -- should * succeed. */ - if ( pass ) { + if ( pass1 ) { - reset_entries(); + reset_entries1(); - cache_ptr = setup_cache((size_t)(2 * 1024), + cache_ptr = setup_cache1((size_t)(2 * 1024), (size_t)(1 * 1024)); - protect_entry(cache_ptr, 0, 0); - unprotect_entry(cache_ptr, 0, 0, FALSE, H5C1__PIN_ENTRY_FLAG); + protect_entry1(cache_ptr, 0, 0); + unprotect_entry1(cache_ptr, 0, 0, FALSE, H5C1__PIN_ENTRY_FLAG); if ( H5C1_dest(NULL, -1, -1, cache_ptr) >= 0 ) { - pass = FALSE; - failure_mssg = "destroy succeeded on cache with pinned entry.\n"; + pass1 = FALSE; + failure_mssg1 = "destroy succeeded on cache with pinned entry.\n"; } else { - unpin_entry(cache_ptr, 0, 0); + unpin_entry1(cache_ptr, 0, 0); if ( H5C1_dest(NULL, -1, -1, cache_ptr) < 0 ) { - pass = FALSE; - failure_mssg = "destroy failed after unpin.\n"; + pass1 = FALSE; + failure_mssg1 = "destroy failed after unpin.\n"; } } } - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) { + if ( ! pass1 ) { - HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + HDfprintf(stdout, "%s(): failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } return; @@ -15900,46 +15900,46 @@ check_destroy_protected_err(void) TESTING("destroy cache with protected entry error"); - pass = TRUE; + pass1 = TRUE; /* allocate a cache, protect an entry, and try to flush. This * should fail. Unprotect the entry and flush again -- should * succeed. */ - if ( pass ) { + if ( pass1 ) { - reset_entries(); + reset_entries1(); - cache_ptr = setup_cache((size_t)(2 * 1024), + cache_ptr = setup_cache1((size_t)(2 * 1024), (size_t)(1 * 1024)); - protect_entry(cache_ptr, 0, 0); + protect_entry1(cache_ptr, 0, 0); if ( H5C1_dest(NULL, -1, -1, cache_ptr) >= 0 ) { - pass = FALSE; - failure_mssg = "destroy succeeded on cache with protected entry.\n"; + pass1 = FALSE; + failure_mssg1 = "destroy succeeded on cache with protected entry.\n"; } else { - unprotect_entry(cache_ptr, 0, 0, TRUE, H5C1__NO_FLAGS_SET); + unprotect_entry1(cache_ptr, 0, 0, TRUE, H5C1__NO_FLAGS_SET); if ( H5C1_dest(NULL, -1, -1, cache_ptr) < 0 ) { - pass = FALSE; - failure_mssg = "destroy failed after unprotect.\n"; + pass1 = FALSE; + failure_mssg1 = "destroy failed after unprotect.\n"; } } } - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) { + if ( ! pass1 ) { - HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + HDfprintf(stdout, "%s(): failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } return; @@ -15974,51 +15974,51 @@ check_duplicate_insert_err(void) TESTING("duplicate entry insertion error"); - pass = TRUE; + pass1 = TRUE; /* allocate a cache, protect an entry, and then try to insert * the entry again. This should fail. Unprotect the entry and * destroy the cache -- should succeed. */ - if ( pass ) { + if ( pass1 ) { - reset_entries(); + reset_entries1(); - cache_ptr = setup_cache((size_t)(2 * 1024), + cache_ptr = setup_cache1((size_t)(2 * 1024), (size_t)(1 * 1024)); - protect_entry(cache_ptr, 0, 0); + protect_entry1(cache_ptr, 0, 0); - if ( pass ) { + if ( pass1 ) { - base_addr = entries[0]; + base_addr = entries1[0]; entry_ptr = &(base_addr[0]); result = H5C1_insert_entry(NULL, -1, -1, cache_ptr, - &(types[0]), entry_ptr->addr, + &(types1[0]), entry_ptr->addr, (void *)entry_ptr, H5C1__NO_FLAGS_SET); if ( result >= 0 ) { - pass = FALSE; - failure_mssg = "insert of duplicate entry succeeded.\n"; + pass1 = FALSE; + failure_mssg1 = "insert of duplicate entry succeeded.\n"; } else { - unprotect_entry(cache_ptr, 0, 0, TRUE, H5C1__NO_FLAGS_SET); + unprotect_entry1(cache_ptr, 0, 0, TRUE, H5C1__NO_FLAGS_SET); - takedown_cache(cache_ptr, FALSE, FALSE); + takedown_cache1(cache_ptr, FALSE, FALSE); } } } - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) { + if ( ! pass1 ) { - HDfprintf(stdout, "%s(): failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + HDfprintf(stdout, "%s(): failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } return; @@ -16054,64 +16054,64 @@ check_rename_err(void) TESTING("rename to existing entry errors"); - pass = TRUE; + pass1 = TRUE; /* allocate a cache, and insert several entries. Try to rename * entries to other entries resident in the cache. This should * fail. Destroy the cache -- should succeed. */ - if ( pass ) { + if ( pass1 ) { - reset_entries(); + reset_entries1(); - cache_ptr = setup_cache((size_t)(2 * 1024), + cache_ptr = setup_cache1((size_t)(2 * 1024), (size_t)(1 * 1024)); - insert_entry(cache_ptr, 0, 0, TRUE, H5C1__NO_FLAGS_SET); - insert_entry(cache_ptr, 0, 1, TRUE, H5C1__NO_FLAGS_SET); - insert_entry(cache_ptr, 1, 0, TRUE, H5C1__NO_FLAGS_SET); + insert_entry1(cache_ptr, 0, 0, TRUE, H5C1__NO_FLAGS_SET); + insert_entry1(cache_ptr, 0, 1, TRUE, H5C1__NO_FLAGS_SET); + insert_entry1(cache_ptr, 1, 0, TRUE, H5C1__NO_FLAGS_SET); - entry_0_0_ptr = &((entries[0])[0]); - entry_0_1_ptr = &((entries[0])[1]); - entry_1_0_ptr = &((entries[1])[0]); + entry_0_0_ptr = &((entries1[0])[0]); + entry_0_1_ptr = &((entries1[0])[1]); + entry_1_0_ptr = &((entries1[1])[0]); } - if ( pass ) { + if ( pass1 ) { - result = H5C1_rename_entry(cache_ptr, &(types[0]), + result = H5C1_rename_entry(cache_ptr, &(types1[0]), entry_0_0_ptr->addr, entry_0_1_ptr->addr); if ( result >= 0 ) { - pass = FALSE; - failure_mssg = "rename to addr of same type succeeded.\n"; + pass1 = FALSE; + failure_mssg1 = "rename to addr of same type succeeded.\n"; } } - if ( pass ) { + if ( pass1 ) { - result = H5C1_rename_entry(cache_ptr, &(types[0]), + result = H5C1_rename_entry(cache_ptr, &(types1[0]), entry_0_0_ptr->addr, entry_1_0_ptr->addr); if ( result >= 0 ) { - pass = FALSE; - failure_mssg = "rename to addr of different type succeeded.\n"; + pass1 = FALSE; + failure_mssg1 = "rename to addr of different type succeeded.\n"; } } - if ( pass ) { + if ( pass1 ) { - takedown_cache(cache_ptr, FALSE, FALSE); + takedown_cache1(cache_ptr, FALSE, FALSE); } - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) { + if ( ! pass1 ) { - HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + HDfprintf(stdout, "%s: failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } return; @@ -16147,7 +16147,7 @@ check_double_pin_err(void) TESTING("pin a pinned entry error"); - pass = TRUE; + pass1 = TRUE; /* allocate a cache, protect an entry, unprotect it with the pin flag, * protect it again, and then try to unprotect it again with the pin @@ -16155,51 +16155,51 @@ check_double_pin_err(void) * -- should succeed. */ - if ( pass ) { + if ( pass1 ) { - reset_entries(); + reset_entries1(); - cache_ptr = setup_cache((size_t)(2 * 1024), + cache_ptr = setup_cache1((size_t)(2 * 1024), (size_t)(1 * 1024)); - protect_entry(cache_ptr, 0, 0); + protect_entry1(cache_ptr, 0, 0); - unprotect_entry(cache_ptr, 0, 0, FALSE, H5C1__PIN_ENTRY_FLAG); + unprotect_entry1(cache_ptr, 0, 0, FALSE, H5C1__PIN_ENTRY_FLAG); - protect_entry(cache_ptr, 0, 0); + protect_entry1(cache_ptr, 0, 0); - entry_ptr = &((entries[0])[0]); + entry_ptr = &((entries1[0])[0]); } - if ( pass ) { + if ( pass1 ) { - result = H5C1_unprotect(NULL, -1, -1, cache_ptr, &(types[0]), + result = H5C1_unprotect(NULL, -1, -1, cache_ptr, &(types1[0]), entry_ptr->addr, (void *)entry_ptr, H5C1__PIN_ENTRY_FLAG, (size_t)0); if ( result > 0 ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "attempt to pin a pinned entry succeeded.\n"; } else { - unprotect_entry(cache_ptr, 0, 0, FALSE, H5C1__UNPIN_ENTRY_FLAG); + unprotect_entry1(cache_ptr, 0, 0, FALSE, H5C1__UNPIN_ENTRY_FLAG); } } - if ( pass ) { + if ( pass1 ) { - takedown_cache(cache_ptr, FALSE, FALSE); + takedown_cache1(cache_ptr, FALSE, FALSE); } - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) { + if ( ! pass1 ) { - HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + HDfprintf(stdout, "%s: failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } return; @@ -16235,7 +16235,7 @@ check_double_unpin_err(void) TESTING("unpin an unpinned entry error"); - pass = TRUE; + pass1 = TRUE; /* allocate a cache, protect an entry, unprotect it with the unpin flag. * -- This should fail. @@ -16245,60 +16245,60 @@ check_double_unpin_err(void) * Destroy the cache -- should succeed. */ - if ( pass ) { + if ( pass1 ) { - reset_entries(); + reset_entries1(); - cache_ptr = setup_cache((size_t)(2 * 1024), + cache_ptr = setup_cache1((size_t)(2 * 1024), (size_t)(1 * 1024)); - protect_entry(cache_ptr, 0, 0); + protect_entry1(cache_ptr, 0, 0); - entry_ptr = &((entries[0])[0]); + entry_ptr = &((entries1[0])[0]); } - if ( pass ) { + if ( pass1 ) { - result = H5C1_unprotect(NULL, -1, -1, cache_ptr, &(types[0]), + result = H5C1_unprotect(NULL, -1, -1, cache_ptr, &(types1[0]), entry_ptr->addr, (void *)entry_ptr, H5C1__UNPIN_ENTRY_FLAG, (size_t)0); if ( result > 0 ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "attempt to unpin an unpinned entry succeeded 1.\n"; } else { - unprotect_entry(cache_ptr, 0, 0, FALSE, H5C1__NO_FLAGS_SET); + unprotect_entry1(cache_ptr, 0, 0, FALSE, H5C1__NO_FLAGS_SET); } } - if ( pass ) { + if ( pass1 ) { result = H5C1_unpin_entry(cache_ptr, (void *)entry_ptr); if ( result > 0 ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "attempt to unpin an unpinned entry succeeded 2.\n"; } } - if ( pass ) { + if ( pass1 ) { - takedown_cache(cache_ptr, FALSE, FALSE); + takedown_cache1(cache_ptr, FALSE, FALSE); } - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) { + if ( ! pass1 ) { - HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + HDfprintf(stdout, "%s: failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } return; @@ -16334,7 +16334,7 @@ check_pin_entry_errs(void) TESTING("pin entry related errors"); - pass = TRUE; + pass1 = TRUE; /* Allocate a cache, protect an entry, unprotect it with no flags, * and then call H5C1_pin_protected_entry() to pin it -- This should fail. @@ -16348,68 +16348,68 @@ check_pin_entry_errs(void) * Destroy the cache -- should succeed. */ - if ( pass ) { + if ( pass1 ) { - reset_entries(); + reset_entries1(); - cache_ptr = setup_cache((size_t)(2 * 1024), + cache_ptr = setup_cache1((size_t)(2 * 1024), (size_t)(1 * 1024)); - protect_entry(cache_ptr, 0, 0); + protect_entry1(cache_ptr, 0, 0); - unprotect_entry(cache_ptr, 0, 0, FALSE, H5C1__NO_FLAGS_SET); + unprotect_entry1(cache_ptr, 0, 0, FALSE, H5C1__NO_FLAGS_SET); - entry_ptr = &((entries[0])[0]); + entry_ptr = &((entries1[0])[0]); } - if ( pass ) { + if ( pass1 ) { result = H5C1_pin_protected_entry(cache_ptr, (void *)entry_ptr); if ( result > 0 ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "attempt to pin an unprotected entry succeeded.\n"; } else { - protect_entry(cache_ptr, 0, 0); + protect_entry1(cache_ptr, 0, 0); - unprotect_entry(cache_ptr, 0, 0, FALSE, H5C1__PIN_ENTRY_FLAG); + unprotect_entry1(cache_ptr, 0, 0, FALSE, H5C1__PIN_ENTRY_FLAG); - protect_entry(cache_ptr, 0, 0); + protect_entry1(cache_ptr, 0, 0); } } - if ( pass ) { + if ( pass1 ) { result = H5C1_pin_protected_entry(cache_ptr, (void *)entry_ptr); if ( result > 0 ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "attempt to pin a pinned, protected entry succeeded.\n"; } else { - unprotect_entry(cache_ptr, 0, 0, FALSE, H5C1__UNPIN_ENTRY_FLAG); + unprotect_entry1(cache_ptr, 0, 0, FALSE, H5C1__UNPIN_ENTRY_FLAG); } } - if ( pass ) { + if ( pass1 ) { - takedown_cache(cache_ptr, FALSE, FALSE); + takedown_cache1(cache_ptr, FALSE, FALSE); } - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) { + if ( ! pass1 ) { - HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + HDfprintf(stdout, "%s: failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } return; @@ -16430,7 +16430,7 @@ check_pin_entry_errs(void) * * Modifications: * - * - Modified call to H5C1_protect() to pass H5C1__NO_FLAGS_SET in the + * - Modified call to H5C1_protect() to pass1 H5C1__NO_FLAGS_SET in the * the new flags parameter. * * JRM -- 3/28/07 @@ -16448,54 +16448,54 @@ check_double_protect_err(void) TESTING("protect a protected entry error"); - pass = TRUE; + pass1 = TRUE; /* allocate a cache, protect an entry, and then try to protect * the entry again. This should fail. Unprotect the entry and * destroy the cache -- should succeed. */ - if ( pass ) { + if ( pass1 ) { - reset_entries(); + reset_entries1(); - cache_ptr = setup_cache((size_t)(2 * 1024), + cache_ptr = setup_cache1((size_t)(2 * 1024), (size_t)(1 * 1024)); - protect_entry(cache_ptr, 0, 0); + protect_entry1(cache_ptr, 0, 0); - entry_ptr = &((entries[0])[0]); + entry_ptr = &((entries1[0])[0]); } - if ( pass ) { + if ( pass1 ) { - cache_entry_ptr = H5C1_protect(NULL, -1, -1, cache_ptr, &(types[0]), + cache_entry_ptr = H5C1_protect(NULL, -1, -1, cache_ptr, &(types1[0]), entry_ptr->addr, NULL, NULL, H5C1__NO_FLAGS_SET); if ( cache_entry_ptr != NULL ) { - pass = FALSE; - failure_mssg = "attempt to protect a protected entry succeeded.\n"; + pass1 = FALSE; + failure_mssg1 = "attempt to protect a protected entry succeeded.\n"; } } - if ( pass ) { + if ( pass1 ) { - unprotect_entry(cache_ptr, 0, 0, FALSE, H5C1__NO_FLAGS_SET); + unprotect_entry1(cache_ptr, 0, 0, FALSE, H5C1__NO_FLAGS_SET); } - if ( pass ) { + if ( pass1 ) { - takedown_cache(cache_ptr, FALSE, FALSE); + takedown_cache1(cache_ptr, FALSE, FALSE); } - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) { + if ( ! pass1 ) { - HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + HDfprintf(stdout, "%s: failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } return; @@ -16537,52 +16537,52 @@ check_double_unprotect_err(void) TESTING("unprotect an unprotected entry error"); - pass = TRUE; + pass1 = TRUE; /* allocate a cache, protect an entry, unprotect it, and then try to * unprotect the entry again. This should fail. Destroy the cache * -- should succeed. */ - if ( pass ) { + if ( pass1 ) { - reset_entries(); + reset_entries1(); - cache_ptr = setup_cache((size_t)(2 * 1024), + cache_ptr = setup_cache1((size_t)(2 * 1024), (size_t)(1 * 1024)); - protect_entry(cache_ptr, 0, 0); + protect_entry1(cache_ptr, 0, 0); - unprotect_entry(cache_ptr, 0, 0, FALSE, H5C1__NO_FLAGS_SET); + unprotect_entry1(cache_ptr, 0, 0, FALSE, H5C1__NO_FLAGS_SET); - entry_ptr = &((entries[0])[0]); + entry_ptr = &((entries1[0])[0]); } - if ( pass ) { + if ( pass1 ) { - result = H5C1_unprotect(NULL, -1, -1, cache_ptr, &(types[0]), + result = H5C1_unprotect(NULL, -1, -1, cache_ptr, &(types1[0]), entry_ptr->addr, (void *)entry_ptr, H5C1__NO_FLAGS_SET, (size_t)0); if ( result > 0 ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "attempt to unprotect an unprotected entry succeeded 1.\n"; } } - if ( pass ) { + if ( pass1 ) { - takedown_cache(cache_ptr, FALSE, FALSE); + takedown_cache1(cache_ptr, FALSE, FALSE); } - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) { + if ( ! pass1 ) { - HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + HDfprintf(stdout, "%s: failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } return; @@ -16627,7 +16627,7 @@ check_mark_entry_dirty_errs(void) TESTING("mark entry dirty related errors"); - pass = TRUE; + pass1 = TRUE; /* allocate a cache, protect an entry, and then attempt to mark it dirty * with the H5C1_mark_pinned_entry_dirty() call -- This should fail. @@ -16641,40 +16641,40 @@ check_mark_entry_dirty_errs(void) * Destroy the cache -- should succeed. */ - if ( pass ) { + if ( pass1 ) { - reset_entries(); + reset_entries1(); - cache_ptr = setup_cache((size_t)(2 * 1024), + cache_ptr = setup_cache1((size_t)(2 * 1024), (size_t)(1 * 1024)); - protect_entry(cache_ptr, 0, 0); + protect_entry1(cache_ptr, 0, 0); - unprotect_entry(cache_ptr, 0, 0, FALSE, H5C1__PIN_ENTRY_FLAG); + unprotect_entry1(cache_ptr, 0, 0, FALSE, H5C1__PIN_ENTRY_FLAG); - protect_entry(cache_ptr, 0, 0); + protect_entry1(cache_ptr, 0, 0); - entry_ptr = &((entries[0])[0]); + entry_ptr = &((entries1[0])[0]); } - if ( pass ) { + if ( pass1 ) { result = H5C1_mark_pinned_entry_dirty(cache_ptr, (void *)entry_ptr, FALSE, (size_t)0); if ( result > 0 ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "attempt dirty a pinned and protected entry succeeded.\n"; } else { - unprotect_entry(cache_ptr, 0, 0, FALSE, H5C1__UNPIN_ENTRY_FLAG); + unprotect_entry1(cache_ptr, 0, 0, FALSE, H5C1__UNPIN_ENTRY_FLAG); } } - if ( pass ) { + if ( pass1 ) { result = H5C1_mark_pinned_entry_dirty(cache_ptr, (void *)entry_ptr, FALSE, (size_t)0); @@ -16682,13 +16682,13 @@ check_mark_entry_dirty_errs(void) if ( result > 0 ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "attempt to dirty a unpinned and unprotected entry succeeded 1.\n"; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_mark_pinned_or_protected_entry_dirty(cache_ptr, (void *)entry_ptr); @@ -16696,23 +16696,23 @@ check_mark_entry_dirty_errs(void) if ( result > 0 ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "attempt to dirty a unpinned and unprotected entry succeeded 2.\n"; } } - if ( pass ) { + if ( pass1 ) { - takedown_cache(cache_ptr, FALSE, FALSE); + takedown_cache1(cache_ptr, FALSE, FALSE); } - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) { + if ( ! pass1 ) { - HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + HDfprintf(stdout, "%s: failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } return; @@ -16721,7 +16721,7 @@ check_mark_entry_dirty_errs(void) /*------------------------------------------------------------------------- - * Function: check_expunge_entry_errs() + * Function: check_expunge_entry1_errs() * * Purpose: Verify that invalid calls to H5C1_expunge_entry() * generate errors as expected. @@ -16739,16 +16739,16 @@ check_mark_entry_dirty_errs(void) */ static void -check_expunge_entry_errs(void) +check_expunge_entry1_errs(void) { - const char * fcn_name = "check_expunge_entry_errs()"; + const char * fcn_name = "check_expunge_entry1_errs()"; herr_t result; H5C1_t * cache_ptr = NULL; test_entry_t * entry_ptr; TESTING("expunge entry related errors"); - pass = TRUE; + pass1 = TRUE; /* Allocate a cache, protect an entry, and then call H5C1_expunge_entry() * to expunge it -- this should fail @@ -16762,90 +16762,90 @@ check_expunge_entry_errs(void) * Destroy the cache -- should succeed. */ - if ( pass ) { + if ( pass1 ) { - reset_entries(); + reset_entries1(); - cache_ptr = setup_cache((size_t)(2 * 1024), + cache_ptr = setup_cache1((size_t)(2 * 1024), (size_t)(1 * 1024)); - entry_ptr = &((entries[0])[0]); + entry_ptr = &((entries1[0])[0]); - protect_entry(cache_ptr, 0, 0); + protect_entry1(cache_ptr, 0, 0); } - if ( pass ) { + if ( pass1 ) { result = H5C1_expunge_entry(NULL, -1, -1, cache_ptr, - &(types[0]), entry_ptr->addr); + &(types1[0]), entry_ptr->addr); if ( result > 0 ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "attempt to expunge a protected entry succeeded.\n"; } else { - unprotect_entry(cache_ptr, 0, 0, FALSE, H5C1__PIN_ENTRY_FLAG); + unprotect_entry1(cache_ptr, 0, 0, FALSE, H5C1__PIN_ENTRY_FLAG); } } - if ( pass ) { + if ( pass1 ) { result = H5C1_expunge_entry(NULL, -1, -1, cache_ptr, - &(types[0]), entry_ptr->addr); + &(types1[0]), entry_ptr->addr); if ( result > 0 ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "attempt to expunge a pinned entry succeeded.\n"; } else { - unpin_entry(cache_ptr, 0, 0); + unpin_entry1(cache_ptr, 0, 0); } } - if ( pass ) { + if ( pass1 ) { result = H5C1_expunge_entry(NULL, -1, -1, cache_ptr, - &(types[0]), entry_ptr->addr); + &(types1[0]), entry_ptr->addr); if ( result < 0 ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "attempt to expunge an unpinned and unprotected entry failed.\n"; } } - if ( pass ) { + if ( pass1 ) { - takedown_cache(cache_ptr, FALSE, FALSE); + takedown_cache1(cache_ptr, FALSE, FALSE); } - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) { + if ( ! pass1 ) { - HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + HDfprintf(stdout, "%s: failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } return; -} /* check_expunge_entry_errs() */ +} /* check_expunge_entry1_errs() */ /*------------------------------------------------------------------------- - * Function: check_resize_entry_errs() + * Function: check_resize_entry1_errs() * * Purpose: Verify that invalid calls to H5C1_resize_pinned_entry() * generates errors as expected. @@ -16863,16 +16863,16 @@ check_expunge_entry_errs(void) */ static void -check_resize_entry_errs(void) +check_resize_entry1_errs(void) { - const char * fcn_name = "check_resize_entry_errs()"; + const char * fcn_name = "check_resize_entry1_errs()"; herr_t result; H5C1_t * cache_ptr = NULL; test_entry_t * entry_ptr; TESTING("resize entry related errors"); - pass = TRUE; + pass1 = TRUE; /* Allocate a cache, protect an entry, and then call * H5C1_resize_pinned_entry() to resize it -- this should fail. @@ -16885,69 +16885,69 @@ check_resize_entry_errs(void) * This should succeed. */ - if ( pass ) { + if ( pass1 ) { - reset_entries(); + reset_entries1(); - cache_ptr = setup_cache((size_t)(2 * 1024), + cache_ptr = setup_cache1((size_t)(2 * 1024), (size_t)(1 * 1024)); - entry_ptr = &((entries[0])[0]); + entry_ptr = &((entries1[0])[0]); - protect_entry(cache_ptr, 0, 0); + protect_entry1(cache_ptr, 0, 0); } - if ( pass ) { + if ( pass1 ) { result = H5C1_resize_pinned_entry(cache_ptr, (void *)entry_ptr, (size_t)1); if ( result > 0 ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "Call to H5C1_resize_pinned_entry on a protected entry succeeded.\n"; } else { - unprotect_entry(cache_ptr, 0, 0, FALSE, H5C1__PIN_ENTRY_FLAG); + unprotect_entry1(cache_ptr, 0, 0, FALSE, H5C1__PIN_ENTRY_FLAG); } } - if ( pass ) { + if ( pass1 ) { result = H5C1_resize_pinned_entry(cache_ptr, (void *)entry_ptr, (size_t)0); if ( result > 0 ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "Call to H5C1_resize_pinned_entry with 0 new size succeeded.\n"; } else { - unpin_entry(cache_ptr, 0, 0); + unpin_entry1(cache_ptr, 0, 0); } } - if ( pass ) { + if ( pass1 ) { - takedown_cache(cache_ptr, FALSE, FALSE); + takedown_cache1(cache_ptr, FALSE, FALSE); } - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) { + if ( ! pass1 ) { - HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + HDfprintf(stdout, "%s: failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } return; -} /* check_resize_entry_errs() */ +} /* check_resize_entry1_errs() */ /*------------------------------------------------------------------------- @@ -16978,48 +16978,48 @@ check_unprotect_ro_dirty_err(void) TESTING("unprotect a read only entry dirty error"); - pass = TRUE; + pass1 = TRUE; /* allocate a cache, protect an entry read only, and then unprotect it * with the dirtied flag set. This should fail. Destroy the cache * -- should succeed. */ - if ( pass ) { + if ( pass1 ) { - reset_entries(); + reset_entries1(); - cache_ptr = setup_cache((size_t)(2 * 1024), + cache_ptr = setup_cache1((size_t)(2 * 1024), (size_t)(1 * 1024)); - protect_entry_ro(cache_ptr, 0, 0); + protect_entry_ro1(cache_ptr, 0, 0); - entry_ptr = &((entries[0])[0]); + entry_ptr = &((entries1[0])[0]); } - if ( pass ) { + if ( pass1 ) { - result = H5C1_unprotect(NULL, -1, -1, cache_ptr, &(types[0]), + result = H5C1_unprotect(NULL, -1, -1, cache_ptr, &(types1[0]), entry_ptr->addr, (void *)entry_ptr, H5C1__DIRTIED_FLAG, (size_t)0); if ( result >= 0 ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "attempt to unprotect a ro entry dirty succeeded 1.\n"; } } - if ( pass ) { + if ( pass1 ) { - unprotect_entry(cache_ptr, 0, 0, FALSE, H5C1__NO_FLAGS_SET); + unprotect_entry1(cache_ptr, 0, 0, FALSE, H5C1__NO_FLAGS_SET); } - if ( pass ) { + if ( pass1 ) { - takedown_cache(cache_ptr, FALSE, FALSE); + takedown_cache1(cache_ptr, FALSE, FALSE); } /* allocate a another cache, protect an entry read only twice, and @@ -17028,51 +17028,51 @@ check_unprotect_ro_dirty_err(void) * This should succeed. */ - if ( pass ) { + if ( pass1 ) { - reset_entries(); + reset_entries1(); - cache_ptr = setup_cache((size_t)(2 * 1024), + cache_ptr = setup_cache1((size_t)(2 * 1024), (size_t)(1 * 1024)); - protect_entry_ro(cache_ptr, 0, 0); - protect_entry_ro(cache_ptr, 0, 0); + protect_entry_ro1(cache_ptr, 0, 0); + protect_entry_ro1(cache_ptr, 0, 0); - entry_ptr = &((entries[0])[0]); + entry_ptr = &((entries1[0])[0]); } - if ( pass ) { + if ( pass1 ) { - result = H5C1_unprotect(NULL, -1, -1, cache_ptr, &(types[0]), + result = H5C1_unprotect(NULL, -1, -1, cache_ptr, &(types1[0]), entry_ptr->addr, (void *)entry_ptr, H5C1__DIRTIED_FLAG, (size_t)0); if ( result > 0 ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "attempt to unprotect a ro entry dirty succeeded 2.\n"; } } - if ( pass ) { + if ( pass1 ) { - unprotect_entry(cache_ptr, 0, 0, FALSE, H5C1__NO_FLAGS_SET); - unprotect_entry(cache_ptr, 0, 0, FALSE, H5C1__NO_FLAGS_SET); + unprotect_entry1(cache_ptr, 0, 0, FALSE, H5C1__NO_FLAGS_SET); + unprotect_entry1(cache_ptr, 0, 0, FALSE, H5C1__NO_FLAGS_SET); } - if ( pass ) { + if ( pass1 ) { - takedown_cache(cache_ptr, FALSE, FALSE); + takedown_cache1(cache_ptr, FALSE, FALSE); } - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) { + if ( ! pass1 ) { - HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + HDfprintf(stdout, "%s: failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } return; @@ -17108,7 +17108,7 @@ check_protect_ro_rw_err(void) TESTING("protect a read only entry rw error"); - pass = TRUE; + pass1 = TRUE; /* allocate a cache, protect an entry read only, and then try to protect * it again rw. This should fail. @@ -17116,46 +17116,46 @@ check_protect_ro_rw_err(void) * Unprotect the entry and destroy the cache -- should succeed. */ - if ( pass ) { + if ( pass1 ) { - reset_entries(); + reset_entries1(); - cache_ptr = setup_cache((size_t)(2 * 1024), + cache_ptr = setup_cache1((size_t)(2 * 1024), (size_t)(1 * 1024)); - protect_entry_ro(cache_ptr, 0, 0); + protect_entry_ro1(cache_ptr, 0, 0); - entry_ptr = &((entries[0])[0]); + entry_ptr = &((entries1[0])[0]); } - if ( pass ) { + if ( pass1 ) { - thing_ptr = H5C1_protect(NULL, -1, -1, cache_ptr, &(types[0]), + thing_ptr = H5C1_protect(NULL, -1, -1, cache_ptr, &(types1[0]), entry_ptr->addr, NULL, NULL, H5C1__NO_FLAGS_SET); if ( thing_ptr != NULL ) { - pass = FALSE; - failure_mssg = "attempt to protect a ro entry rw succeeded.\n"; + pass1 = FALSE; + failure_mssg1 = "attempt to protect a ro entry rw succeeded.\n"; } } - if ( pass ) { + if ( pass1 ) { - unprotect_entry(cache_ptr, 0, 0, FALSE, H5C1__NO_FLAGS_SET); + unprotect_entry1(cache_ptr, 0, 0, FALSE, H5C1__NO_FLAGS_SET); } - if ( pass ) { + if ( pass1 ) { - takedown_cache(cache_ptr, FALSE, FALSE); + takedown_cache1(cache_ptr, FALSE, FALSE); } - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) { + if ( ! pass1 ) { - HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + HDfprintf(stdout, "%s: failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } return; @@ -17191,11 +17191,11 @@ check_check_evictions_enabled_err(void) TESTING("get/set evictions enabled errors"); - pass = TRUE; + pass1 = TRUE; /* allocate a cache. * - * Call H5C1_get_evictions_enabled(), passing it a NULL cache_ptr, + * Call H5C1_get_evictions_enabled(), pass1ing it a NULL cache_ptr, * should fail. * * Repeat with a NULL evictions_enabled_ptr, should fail as well. @@ -17206,49 +17206,49 @@ check_check_evictions_enabled_err(void) * Unprotect the entry and destroy the cache -- should succeed. */ - if ( pass ) { + if ( pass1 ) { - reset_entries(); + reset_entries1(); - cache_ptr = setup_cache((size_t)(2 * 1024), + cache_ptr = setup_cache1((size_t)(2 * 1024), (size_t)(1 * 1024)); } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_evictions_enabled(NULL, &evictions_enabled); if ( result == SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_evictions_enabled succeeded() 1.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_evictions_enabled succeeded() 1.\n"; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_evictions_enabled(cache_ptr, NULL); if ( result == SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_evictions_enabled succeeded() 2.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_evictions_enabled succeeded() 2.\n"; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_set_evictions_enabled(cache_ptr, TRUE); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_evictions_enabled failed().\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_evictions_enabled failed().\n"; } } - if ( pass ) { + if ( pass1 ) { (cache_ptr->resize_ctl).incr_mode = H5C1_incr__threshold; @@ -17256,8 +17256,8 @@ check_check_evictions_enabled_err(void) if ( result == SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_evictions_enabled succeeded() 1.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_evictions_enabled succeeded() 1.\n"; } else if ( cache_ptr->evictions_enabled == TRUE ) { @@ -17266,7 +17266,7 @@ check_check_evictions_enabled_err(void) (cache_ptr->resize_ctl).incr_mode = H5C1_incr__off; } - if ( pass ) { + if ( pass1 ) { (cache_ptr->resize_ctl).decr_mode = H5C1_decr__threshold; @@ -17274,25 +17274,25 @@ check_check_evictions_enabled_err(void) if ( result == SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_evictions_enabled succeeded() 2.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_evictions_enabled succeeded() 2.\n"; } (cache_ptr->resize_ctl).decr_mode = H5C1_decr__off; } - if ( pass ) { + if ( pass1 ) { - takedown_cache(cache_ptr, FALSE, FALSE); + takedown_cache1(cache_ptr, FALSE, FALSE); } - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) { + if ( ! pass1 ) { - HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + HDfprintf(stdout, "%s: failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } return; @@ -17395,7 +17395,7 @@ check_auto_cache_resize(void) TESTING("automatic cache resizing"); - pass = TRUE; + pass1 = TRUE; if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); @@ -17404,32 +17404,32 @@ check_auto_cache_resize(void) * performs as expected. */ - if ( pass ) { + if ( pass1 ) { - reset_entries(); + reset_entries1(); - cache_ptr = setup_cache((size_t)(2 * 1024), + cache_ptr = setup_cache1((size_t)(2 * 1024), (size_t)(1 * 1024)); } - if ( pass ) { + if ( pass1 ) { result = H5C1_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 1.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 1.\n"; } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->max_cache_size != (512 * 1024) ) || ( cache_ptr->min_clean_size != (256 * 1024) ) ) { - pass = FALSE; - failure_mssg = "bad cache size after initialization.\n"; + pass1 = FALSE; + failure_mssg1 = "bad cache size after initialization.\n"; } } @@ -17438,16 +17438,16 @@ check_auto_cache_resize(void) /* force low hit rate with cache not full -- should result in not * full status. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, PICO_ENTRY_TYPE, i); + protect_entry1(cache_ptr, PICO_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, PICO_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, PICO_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -17458,8 +17458,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (512 * 1024) ) || ( cache_ptr->min_clean_size != (256 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 1.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 1.\n"; } } @@ -17468,16 +17468,16 @@ check_auto_cache_resize(void) /* force low hit rate with cache full -- should result in increase * of cache size from .5 to 1 meg. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -17488,8 +17488,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (1 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (512 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 2.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 2.\n"; } } @@ -17498,16 +17498,16 @@ check_auto_cache_resize(void) /* force low hit rate with cache not full -- should result in not * full status. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, PICO_ENTRY_TYPE, i); + protect_entry1(cache_ptr, PICO_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, PICO_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, PICO_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -17518,8 +17518,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (1 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (512 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 3.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 3.\n"; } } @@ -17528,16 +17528,16 @@ check_auto_cache_resize(void) /* force low hit rate with cache full again -- should result in increase * of cache size from 1 to 2 meg. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -17548,8 +17548,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 4.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 4.\n"; } } @@ -17558,16 +17558,16 @@ check_auto_cache_resize(void) /* force low hit rate with cache full again -- should result in increase * of cache size from 2 to 4 meg. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -17578,8 +17578,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 5.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 5.\n"; } } @@ -17588,16 +17588,16 @@ check_auto_cache_resize(void) /* force low hit rate with cache full again -- should result in increase * of cache size from 4 to 8 meg. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -17608,8 +17608,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 6.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 6.\n"; } } @@ -17619,16 +17619,16 @@ check_auto_cache_resize(void) * of cache size from 8 to 12 meg. Note that max increase reduced the * size of the increase. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -17639,8 +17639,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (12 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (6 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 7.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 7.\n"; } } @@ -17649,16 +17649,16 @@ check_auto_cache_resize(void) /* force low hit rate with cache full again -- should result in increase * of cache size from 12 to 14 meg. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -17669,8 +17669,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (14 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (7 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 8.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 8.\n"; } } @@ -17679,16 +17679,16 @@ check_auto_cache_resize(void) /* force low hit rate with cache full and at maximum size -- should * in no change in size and a result of at_max_size. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -17699,8 +17699,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (14 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (7 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 9.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 9.\n"; } } @@ -17710,16 +17710,16 @@ check_auto_cache_resize(void) * result in a decrease from 14 to 13 Meg -- note that max decrease * reduced the size of the reduction */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -17730,8 +17730,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (13 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (6 * 1024 * 1024 + 512 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 10.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 10.\n"; } } @@ -17742,7 +17742,7 @@ check_auto_cache_resize(void) * with. */ - if ( pass ) { + if ( pass1 ) { auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; auto_size_ctl.rpt_fcn = test_rpt_fcn; @@ -17790,18 +17790,18 @@ check_auto_cache_resize(void) if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 2.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 2.\n"; } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->max_cache_size != (4 * 1000 * 1000 + 10) ) || ( cache_ptr->min_clean_size != (400 * 1000 + 1) ) ) { - pass = FALSE; - failure_mssg = "bad cache size after set resize re-config 1.\n"; + pass1 = FALSE; + failure_mssg1 = "bad cache size after set resize re-config 1.\n"; } } @@ -17810,16 +17810,16 @@ check_auto_cache_resize(void) /* force high hit rate -- should result in a decrease from ~4 to ~3 * M -- note that max decrease reduces the size of the reduction */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -17830,8 +17830,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (3 * 1000 * 1000 + 10) ) || ( cache_ptr->min_clean_size != (300 * 1000 + 1) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 11.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 11.\n"; } } @@ -17841,16 +17841,16 @@ check_auto_cache_resize(void) * to ~2 M -- again note that max decrease reduces the size of the * reduction. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -17861,8 +17861,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (2 * 1000 * 1000 + 10) ) || ( cache_ptr->min_clean_size != (200 * 1000 + 1) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 12.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 12.\n"; } } @@ -17872,16 +17872,16 @@ check_auto_cache_resize(void) * to ~1 M -- again note that max decrease reduces the size of the * reduction, but only by five bites. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -17892,8 +17892,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (1 * 1000 * 1000 + 10) ) || ( cache_ptr->min_clean_size != (100 * 1000 + 1) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 13.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 13.\n"; } } @@ -17903,16 +17903,16 @@ check_auto_cache_resize(void) * to ~0.5 M -- max decrease is no longer a factor. New size is five * bytes above the minimum. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -17923,8 +17923,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (500 * 1000 + 5) ) || ( cache_ptr->min_clean_size != (50 * 1000) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 14.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 14.\n"; } } @@ -17933,16 +17933,16 @@ check_auto_cache_resize(void) /* force high hit rate again -- should result in a decrease of five * bytes to the minimum cache size. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -17953,8 +17953,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (500 * 1000) ) || ( cache_ptr->min_clean_size != (50 * 1000) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 15.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 15.\n"; } } @@ -17963,16 +17963,16 @@ check_auto_cache_resize(void) /* force high hit rate again -- Already at minimum size so no change in * cache size and result should be at_min_size. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -17983,8 +17983,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (500 * 1000) ) || ( cache_ptr->min_clean_size != (50 * 1000) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 16.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 16.\n"; } } @@ -17993,27 +17993,27 @@ check_auto_cache_resize(void) /* force in range hit rate -- should be no change in cache size, * and result should be in_spec. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 900 ) ) + while ( ( pass1 ) && ( i < 900 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; } - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i + 1000); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i + 1000); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i + 1000, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i + 1000, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -18024,8 +18024,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (500 * 1000) ) || ( cache_ptr->min_clean_size != (50 * 1000) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 17.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 17.\n"; } } @@ -18034,16 +18034,16 @@ check_auto_cache_resize(void) /* force low hit rate with cache full -- should * increase cache size from .5 to 1 M. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -18054,8 +18054,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (1 * 1000 * 1000) ) || ( cache_ptr->min_clean_size != (100 * 1000) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 18.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 18.\n"; } } @@ -18064,16 +18064,16 @@ check_auto_cache_resize(void) /* force high hit rate -- should result in a decrease to the * minimum cache size. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -18084,8 +18084,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (500 * 1000) ) || ( cache_ptr->min_clean_size != (50 * 1000) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 19.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 19.\n"; } } @@ -18096,7 +18096,7 @@ check_auto_cache_resize(void) * disabled. ******************************************************************/ - if ( pass ) { + if ( pass1 ) { auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; auto_size_ctl.rpt_fcn = test_rpt_fcn; @@ -18144,18 +18144,18 @@ check_auto_cache_resize(void) if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 3.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 3.\n"; } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "bad cache size after set resize re-config 2.\n"; + pass1 = FALSE; + failure_mssg1 = "bad cache size after set resize re-config 2.\n"; } } @@ -18164,16 +18164,16 @@ check_auto_cache_resize(void) /* force high hit rate -- should result in a decrease to the * minimum cache size. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -18184,8 +18184,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (1 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (512 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 20.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 20.\n"; } } @@ -18194,16 +18194,16 @@ check_auto_cache_resize(void) /* force low hit rate with cache full -- should increase cache size * from 1 to 4 Meg. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -18214,8 +18214,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 21.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 21.\n"; } } @@ -18224,16 +18224,16 @@ check_auto_cache_resize(void) /* force low hit rate again with cache full -- should increase cache * size from 4 to 16 Meg. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -18244,8 +18244,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (16 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != ( 8 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 22.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 22.\n"; } } @@ -18254,16 +18254,16 @@ check_auto_cache_resize(void) /* force high hit rate -- should result in a decrease cache size from * 16 to 4 Meg. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -18274,8 +18274,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 23.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 23.\n"; } } @@ -18288,7 +18288,7 @@ check_auto_cache_resize(void) * Reconfigure the cache for this testing. ******************************************************************/ - if ( pass ) { + if ( pass1 ) { auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; auto_size_ctl.rpt_fcn = test_rpt_fcn; @@ -18336,18 +18336,18 @@ check_auto_cache_resize(void) if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 4.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 4.\n"; } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "bad cache size after set resize re-config 3.\n"; + pass1 = FALSE; + failure_mssg1 = "bad cache size after set resize re-config 3.\n"; } } @@ -18361,16 +18361,16 @@ check_auto_cache_resize(void) * increase its size. Since we are already at max size, it will * not be able to. */ - if ( pass ) { /* first epoch */ + if ( pass1 ) { /* first epoch */ rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -18381,23 +18381,23 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 24.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 24.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - if ( pass ) { /* second epoch */ + if ( pass1 ) { /* second epoch */ rpt_fcn_called = FALSE; i = 1000; - while ( ( pass ) && ( i < 2000 ) ) + while ( ( pass1 ) && ( i < 2000 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -18408,23 +18408,23 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 25.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 25.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - if ( pass ) { /* third epoch */ + if ( pass1 ) { /* third epoch */ rpt_fcn_called = FALSE; i = 2000; - while ( ( pass ) && ( i < 3000 ) ) + while ( ( pass1 ) && ( i < 3000 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -18435,8 +18435,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 26.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 26.\n"; } } @@ -18446,16 +18446,16 @@ check_auto_cache_resize(void) * we would see cache size reduction now. However, nothing will * happen until we get the hit rate above the lower threshold. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 3000; - while ( ( pass ) && ( i < 4000 ) ) + while ( ( pass1 ) && ( i < 4000 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -18466,8 +18466,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 27.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 27.\n"; } } @@ -18476,16 +18476,16 @@ check_auto_cache_resize(void) /* fifth epoch -- force the hit rate to 100%. We should see cache size * reduction now. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 3000; - while ( ( pass ) && ( i < 4000 ) ) + while ( ( pass1 ) && ( i < 4000 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -18496,8 +18496,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (2001 * 1024) ) || ( cache_ptr->min_clean_size != (int)(2001 * 512) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 28.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 28.\n"; } } @@ -18505,16 +18505,16 @@ check_auto_cache_resize(void) /* sixth epoch -- force the hit rate to 100% again. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 3000; - while ( ( pass ) && ( i < 4000 ) ) + while ( ( pass1 ) && ( i < 4000 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -18525,8 +18525,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (1001 * 1024) ) || ( cache_ptr->min_clean_size != (int)(1001 * 512) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 29.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 29.\n"; } } @@ -18534,16 +18534,16 @@ check_auto_cache_resize(void) /* seventh epoch -- force the hit rate to 100% again. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 3000; - while ( ( pass ) && ( i < 4000 ) ) + while ( ( pass1 ) && ( i < 4000 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -18554,8 +18554,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (1000 * 1024) ) || ( cache_ptr->min_clean_size != (int)(1000 * 512) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 30.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 30.\n"; } } @@ -18564,16 +18564,16 @@ check_auto_cache_resize(void) /* eigth epoch -- force the hit rate to 100% again -- should be steady * state. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 3000; - while ( ( pass ) && ( i < 4000 ) ) + while ( ( pass1 ) && ( i < 4000 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -18584,8 +18584,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (1000 * 1024) ) || ( cache_ptr->min_clean_size != (int)(1000 * 512) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 31.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 31.\n"; } } @@ -18595,16 +18595,16 @@ check_auto_cache_resize(void) * get all entries other than the one evicted, and the cache size * should be decreased to the minimum. */ - if ( pass ) { /* ninth epoch */ + if ( pass1 ) { /* ninth epoch */ rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -18615,23 +18615,23 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (1000 * 1024) ) || ( cache_ptr->min_clean_size != (int)(1000 * 512) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 32.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 32.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - if ( pass ) { /* tenth epoch */ + if ( pass1 ) { /* tenth epoch */ rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -18642,23 +18642,23 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (1000 * 1024) ) || ( cache_ptr->min_clean_size != (int)(1000 * 512) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 33.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 33.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - if ( pass ) { /* eleventh epoch -- cache size reduction */ + if ( pass1 ) { /* eleventh epoch -- cache size reduction */ rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -18672,23 +18672,23 @@ check_auto_cache_resize(void) ( cache_ptr->index_size != MONSTER_ENTRY_SIZE + MEDIUM_ENTRY_SIZE ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 34.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 34.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - if ( pass ) { /* twelth epoch -- at minimum size so no more ageouts */ + if ( pass1 ) { /* twelth epoch -- at minimum size so no more ageouts */ rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -18702,8 +18702,8 @@ check_auto_cache_resize(void) ( cache_ptr->index_size != MONSTER_ENTRY_SIZE + MEDIUM_ENTRY_SIZE ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 35.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 35.\n"; } } @@ -18715,7 +18715,7 @@ check_auto_cache_resize(void) * the structure of the test a bit. */ - if ( pass ) { + if ( pass1 ) { auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; auto_size_ctl.rpt_fcn = test_rpt_fcn; @@ -18763,18 +18763,18 @@ check_auto_cache_resize(void) if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 5.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 5.\n"; } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "bad cache size after set resize re-config 4.\n"; + pass1 = FALSE; + failure_mssg1 = "bad cache size after set resize re-config 4.\n"; } } @@ -18788,16 +18788,16 @@ check_auto_cache_resize(void) * increase its size. Since we are already at max size, it will * not be able to. */ - if ( pass ) { /* first epoch */ + if ( pass1 ) { /* first epoch */ rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -18808,23 +18808,23 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 36.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 36.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - if ( pass ) { /* second epoch */ + if ( pass1 ) { /* second epoch */ rpt_fcn_called = FALSE; i = 1000; - while ( ( pass ) && ( i < 2000 ) ) + while ( ( pass1 ) && ( i < 2000 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -18835,23 +18835,23 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 37.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 37.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - if ( pass ) { /* third epoch */ + if ( pass1 ) { /* third epoch */ rpt_fcn_called = FALSE; i = 2000; - while ( ( pass ) && ( i < 3000 ) ) + while ( ( pass1 ) && ( i < 3000 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -18862,8 +18862,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 38.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 38.\n"; } } @@ -18873,16 +18873,16 @@ check_auto_cache_resize(void) * we would see cache size reduction now. However, nothing will * happen until we get the hit rate above the lower threshold. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 3000; - while ( ( pass ) && ( i < 4000 ) ) + while ( ( pass1 ) && ( i < 4000 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -18893,8 +18893,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 39.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 39.\n"; } } @@ -18903,16 +18903,16 @@ check_auto_cache_resize(void) /* fifth epoch -- force the hit rate to 100%. We should see cache size * reduction now. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 3000; - while ( ( pass ) && ( i < 4000 ) ) + while ( ( pass1 ) && ( i < 4000 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -18923,8 +18923,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (7 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (7 * 512 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 40.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 40.\n"; } } @@ -18932,16 +18932,16 @@ check_auto_cache_resize(void) /* sixth epoch -- force the hit rate to 100% again. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 2000; - while ( ( pass ) && ( i < 3000 ) ) + while ( ( pass1 ) && ( i < 3000 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -18952,8 +18952,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (6 * 512 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 41.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 41.\n"; } } @@ -18961,16 +18961,16 @@ check_auto_cache_resize(void) /* seventh epoch -- keep hit rate at 100%, and keep 2K entries active. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 3000; - while ( ( pass ) && ( i < 4000 ) ) + while ( ( pass1 ) && ( i < 4000 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -18981,8 +18981,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (5 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (5 * 512 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 42.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 42.\n"; } } @@ -18990,16 +18990,16 @@ check_auto_cache_resize(void) /* eigth epoch -- still 100% hit rate */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 2000; - while ( ( pass ) && ( i < 3000 ) ) + while ( ( pass1 ) && ( i < 3000 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -19010,8 +19010,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (4 * 512 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 43.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 43.\n"; } } @@ -19019,16 +19019,16 @@ check_auto_cache_resize(void) /* ninth epoch --hit rate at 100%. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 3000; - while ( ( pass ) && ( i < 4000 ) ) + while ( ( pass1 ) && ( i < 4000 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -19039,8 +19039,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (3 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (3 * 512 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 44.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 44.\n"; } } @@ -19048,16 +19048,16 @@ check_auto_cache_resize(void) /* tenth epoch -- still 100% hit rate */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 2000; - while ( ( pass ) && ( i < 3000 ) ) + while ( ( pass1 ) && ( i < 3000 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -19068,8 +19068,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 512 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 45.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 45.\n"; } } @@ -19077,16 +19077,16 @@ check_auto_cache_resize(void) /* eleventh epoch -- hit rate at 100% -- starting to stableize */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 3000; - while ( ( pass ) && ( i < 4000 ) ) + while ( ( pass1 ) && ( i < 4000 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -19097,8 +19097,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (2000 * 1024) ) || ( cache_ptr->min_clean_size != (int)(2000 * 512) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 46.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 46.\n"; } } @@ -19107,16 +19107,16 @@ check_auto_cache_resize(void) /* twelth epoch -- force the hit rate to 100% again -- should be steady * state. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 2000; - while ( ( pass ) && ( i < 3000 ) ) + while ( ( pass1 ) && ( i < 3000 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -19127,8 +19127,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (2000 * 1024) ) || ( cache_ptr->min_clean_size != (int)(2000 * 512) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 47.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 47.\n"; } } @@ -19138,16 +19138,16 @@ check_auto_cache_resize(void) * get all entries other than the one evicted, and the cache size * should be decreased to the minimum. */ - if ( pass ) { /* thirteenth epoch */ + if ( pass1 ) { /* thirteenth epoch */ rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -19158,23 +19158,23 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (2000 * 1024) ) || ( cache_ptr->min_clean_size != (int)(2000 * 512) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 48.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 48.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - if ( pass ) { /* fourteenth epoch */ + if ( pass1 ) { /* fourteenth epoch */ rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -19187,23 +19187,23 @@ check_auto_cache_resize(void) ( cache_ptr->min_clean_size != (1001 * 512 + MONSTER_ENTRY_SIZE / 2) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 49.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 49.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - if ( pass ) { /* fifteenth epoch -- cache size reduction */ + if ( pass1 ) { /* fifteenth epoch -- cache size reduction */ rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -19217,23 +19217,23 @@ check_auto_cache_resize(void) ( cache_ptr->index_size != MONSTER_ENTRY_SIZE + MEDIUM_ENTRY_SIZE ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 50.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 50.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - if ( pass ) { /* sixteenth epoch -- at minimum size so no more ageouts */ + if ( pass1 ) { /* sixteenth epoch -- at minimum size so no more ageouts */ rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -19247,8 +19247,8 @@ check_auto_cache_resize(void) ( cache_ptr->index_size != MONSTER_ENTRY_SIZE + MEDIUM_ENTRY_SIZE ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 51.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 51.\n"; } } @@ -19259,7 +19259,7 @@ check_auto_cache_resize(void) * Again, some structural changes in the test are necessary. */ - if ( pass ) { + if ( pass1 ) { auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; auto_size_ctl.rpt_fcn = test_rpt_fcn; @@ -19307,18 +19307,18 @@ check_auto_cache_resize(void) if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 6.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 6.\n"; } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "bad cache size after set resize re-config 5.\n"; + pass1 = FALSE; + failure_mssg1 = "bad cache size after set resize re-config 5.\n"; } } @@ -19332,16 +19332,16 @@ check_auto_cache_resize(void) * increase its size. Since we are already at max size, it will * not be able to. */ - if ( pass ) { /* first epoch */ + if ( pass1 ) { /* first epoch */ rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -19352,23 +19352,23 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 52.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 52.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - if ( pass ) { /* second epoch */ + if ( pass1 ) { /* second epoch */ rpt_fcn_called = FALSE; i = 1000; - while ( ( pass ) && ( i < 2000 ) ) + while ( ( pass1 ) && ( i < 2000 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -19379,23 +19379,23 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 53.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 53.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - if ( pass ) { /* third epoch */ + if ( pass1 ) { /* third epoch */ rpt_fcn_called = FALSE; i = 2000; - while ( ( pass ) && ( i < 3000 ) ) + while ( ( pass1 ) && ( i < 3000 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -19406,8 +19406,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 54.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 54.\n"; } } @@ -19417,16 +19417,16 @@ check_auto_cache_resize(void) * we would see cache size reduction now. However, nothing will * happen until we get the hit rate above the lower threshold. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 3000; - while ( ( pass ) && ( i < 4000 ) ) + while ( ( pass1 ) && ( i < 4000 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -19437,8 +19437,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 55.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 55.\n"; } } @@ -19447,16 +19447,16 @@ check_auto_cache_resize(void) /* fifth epoch -- force the hit rate to 100%. We should see cache size * reduction now. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 3000; - while ( ( pass ) && ( i < 4000 ) ) + while ( ( pass1 ) && ( i < 4000 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -19467,8 +19467,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (4002 * 1024) ) || ( cache_ptr->min_clean_size != (int)(4002 * 512) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 56.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 56.\n"; } } @@ -19476,16 +19476,16 @@ check_auto_cache_resize(void) /* sixth epoch -- force the hit rate to 100% again. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 3000; - while ( ( pass ) && ( i < 4000 ) ) + while ( ( pass1 ) && ( i < 4000 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -19496,8 +19496,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (2002 * 1024) ) || ( cache_ptr->min_clean_size != (int)(2002 * 512) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 57.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 57.\n"; } } @@ -19505,16 +19505,16 @@ check_auto_cache_resize(void) /* seventh epoch -- force the hit rate to 100% again. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 3000; - while ( ( pass ) && ( i < 4000 ) ) + while ( ( pass1 ) && ( i < 4000 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -19525,8 +19525,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (2000 * 1024) ) || ( cache_ptr->min_clean_size != (int)(2000 * 512) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 58.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 58.\n"; } } @@ -19535,16 +19535,16 @@ check_auto_cache_resize(void) /* eigth epoch -- force the hit rate to 100% again -- should be steady * state. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 3000; - while ( ( pass ) && ( i < 4000 ) ) + while ( ( pass1 ) && ( i < 4000 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -19555,8 +19555,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (2000 * 1024) ) || ( cache_ptr->min_clean_size != (int)(2000 * 512) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 59.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 59.\n"; } } @@ -19566,16 +19566,16 @@ check_auto_cache_resize(void) * get all entries other than the one evicted, and the cache size * should be decreased to the minimum. */ - if ( pass ) { /* ninth epoch */ + if ( pass1 ) { /* ninth epoch */ rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -19586,23 +19586,23 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (2000 * 1024) ) || ( cache_ptr->min_clean_size != (int)(2000 * 512) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 60.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 60.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - if ( pass ) { /* tenth epoch */ + if ( pass1 ) { /* tenth epoch */ rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -19613,23 +19613,23 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (2000 * 1024) ) || ( cache_ptr->min_clean_size != (2000 * 512) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 61.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 61.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - if ( pass ) { /* eleventh epoch -- cache size reduction */ + if ( pass1 ) { /* eleventh epoch -- cache size reduction */ rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -19643,23 +19643,23 @@ check_auto_cache_resize(void) ( cache_ptr->index_size != MONSTER_ENTRY_SIZE + MEDIUM_ENTRY_SIZE ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 62.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 62.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - if ( pass ) { /* twelth epoch -- at minimum size so no more ageouts */ + if ( pass1 ) { /* twelth epoch -- at minimum size so no more ageouts */ rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -19673,8 +19673,8 @@ check_auto_cache_resize(void) ( cache_ptr->index_size != MONSTER_ENTRY_SIZE + MEDIUM_ENTRY_SIZE ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 63.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 63.\n"; } } @@ -19687,7 +19687,7 @@ check_auto_cache_resize(void) * Again, there are some minor structural changes in the test. */ - if ( pass ) { + if ( pass1 ) { auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; auto_size_ctl.rpt_fcn = test_rpt_fcn; @@ -19735,18 +19735,18 @@ check_auto_cache_resize(void) if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 7.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 7.\n"; } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "bad cache size after set resize re-config 6.\n"; + pass1 = FALSE; + failure_mssg1 = "bad cache size after set resize re-config 6.\n"; } } @@ -19757,16 +19757,16 @@ check_auto_cache_resize(void) * so cache size reduction should kick in as soon as we get the * hit rate above .999. */ - if ( pass ) { /* first epoch -- hit rate 0 */ + if ( pass1 ) { /* first epoch -- hit rate 0 */ rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, i); + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, LARGE_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -19777,23 +19777,23 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 64.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 64.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - if ( pass ) { /* second epoch -- hit rate 0 */ + if ( pass1 ) { /* second epoch -- hit rate 0 */ rpt_fcn_called = FALSE; i = 1000; - while ( ( pass ) && ( i < 2000 ) ) + while ( ( pass1 ) && ( i < 2000 ) ) { - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, i); + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, LARGE_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -19804,23 +19804,23 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 65.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 65.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - if ( pass ) { /* third epoch -- hit rate 1.0 -- should see decrease */ + if ( pass1 ) { /* third epoch -- hit rate 1.0 -- should see decrease */ rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, i); + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, LARGE_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -19831,24 +19831,24 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (1001 * LARGE_ENTRY_SIZE) ) || ( cache_ptr->min_clean_size != (1001 * LARGE_ENTRY_SIZE / 2) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 66.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 66.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); /* fourth epoch -- load up the cache again -- hit rate 0 */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -19859,24 +19859,24 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (1001 * LARGE_ENTRY_SIZE) ) || ( cache_ptr->min_clean_size != (1001 * LARGE_ENTRY_SIZE / 2) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 67.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 67.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); /* fifth epoch -- still loading up the cache -- hit rate 0 */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 1000; - while ( ( pass ) && ( i < 2000 ) ) + while ( ( pass1 ) && ( i < 2000 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -19887,24 +19887,24 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (1001 * LARGE_ENTRY_SIZE) ) || ( cache_ptr->min_clean_size != (1001 * LARGE_ENTRY_SIZE / 2) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 68.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 68.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); /* sixth epoch -- force hit rate to .998 -- should be no reduction */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 1002; - while ( ( pass ) && ( i < 2002 ) ) + while ( ( pass1 ) && ( i < 2002 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -19915,8 +19915,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (1001 * LARGE_ENTRY_SIZE) ) || ( cache_ptr->min_clean_size != (1001 * LARGE_ENTRY_SIZE / 2) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 69.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 69.\n"; } } @@ -19924,16 +19924,16 @@ check_auto_cache_resize(void) /* seventh epoch -- force hit rate to .999 -- should see reduction */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 1003; - while ( ( pass ) && ( i < 2003 ) ) + while ( ( pass1 ) && ( i < 2003 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -19944,8 +19944,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (1000 * MEDIUM_ENTRY_SIZE) ) || ( cache_ptr->min_clean_size != (1000 * MEDIUM_ENTRY_SIZE / 2) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 70.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 70.\n"; } } @@ -19957,7 +19957,7 @@ check_auto_cache_resize(void) * and/or bugs. */ - if ( pass ) { + if ( pass1 ) { auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; auto_size_ctl.rpt_fcn = test_rpt_fcn; @@ -20005,18 +20005,18 @@ check_auto_cache_resize(void) if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 8.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 8.\n"; } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) || ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) ) { - pass = FALSE; - failure_mssg = "bad cache size after set resize re-config 7.\n"; + pass1 = FALSE; + failure_mssg1 = "bad cache size after set resize re-config 7.\n"; } } @@ -20026,16 +20026,16 @@ check_auto_cache_resize(void) * so the decrease code will not be executed until the hit rate exceeds * .75. */ - if ( pass ) { /* first epoch -- hit rate 0 */ + if ( pass1 ) { /* first epoch -- hit rate 0 */ rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, i); + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, LARGE_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -20046,23 +20046,23 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) || ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 71.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 71.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - if ( pass ) { /* second epoch -- hit rate 0 */ + if ( pass1 ) { /* second epoch -- hit rate 0 */ rpt_fcn_called = FALSE; i = 1000; - while ( ( pass ) && ( i < 2000 ) ) + while ( ( pass1 ) && ( i < 2000 ) ) { - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, i); + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, LARGE_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -20073,8 +20073,8 @@ check_auto_cache_resize(void) ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) || ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 72.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 72.\n"; } } @@ -20088,16 +20088,16 @@ check_auto_cache_resize(void) * * In this epoch, all we should see is a reduction in the index size. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, i); + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, LARGE_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -20109,8 +20109,8 @@ check_auto_cache_resize(void) ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) || ( cache_ptr->index_size != (7 * 1000 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 73.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 73.\n"; } } @@ -20119,16 +20119,16 @@ check_auto_cache_resize(void) /* fourth epoch -- hit rate still 1.0. Index size should decrease, * but otherwise no change expected. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, i); + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, LARGE_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -20140,8 +20140,8 @@ check_auto_cache_resize(void) ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) || ( cache_ptr->index_size != (6 * 1000 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 74.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 74.\n"; } } @@ -20150,16 +20150,16 @@ check_auto_cache_resize(void) /* fifth epoch -- hit rate still 1.0. Index size should decrease, * but otherwise no change expected. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, i); + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, LARGE_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -20171,8 +20171,8 @@ check_auto_cache_resize(void) ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) || ( cache_ptr->index_size != (5 * 1000 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 75.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 75.\n"; } } @@ -20182,16 +20182,16 @@ check_auto_cache_resize(void) * but otherwise no change expected. Note that the cache size is * now just on the edge of meeting the clean reserve. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, i); + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, LARGE_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -20203,8 +20203,8 @@ check_auto_cache_resize(void) ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) || ( cache_ptr->index_size != (4 * 1000 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 76.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 76.\n"; } } @@ -20212,16 +20212,16 @@ check_auto_cache_resize(void) /* seventh epoch -- hit rate still 1.0. No change in index size expected. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, i); + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, LARGE_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -20233,8 +20233,8 @@ check_auto_cache_resize(void) ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) || ( cache_ptr->index_size != (4 * 1000 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 77.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 77.\n"; } } @@ -20243,16 +20243,16 @@ check_auto_cache_resize(void) /* eighth epoch -- start loading 1 KB entries. Hit rate 0 so * decrease code shouldn't be called. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -20264,8 +20264,8 @@ check_auto_cache_resize(void) ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) || ( cache_ptr->index_size != (5 * 1000 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 78.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 78.\n"; } } @@ -20275,16 +20275,16 @@ check_auto_cache_resize(void) * to 1.0. Decrease code should be triggered, but the max decrease * should prevent the empty reserve from being met in this epoch. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -20296,8 +20296,8 @@ check_auto_cache_resize(void) ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) || ( cache_ptr->index_size != (4 * 1000 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 79.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 79.\n"; } } @@ -20307,16 +20307,16 @@ check_auto_cache_resize(void) * to 1.0. Decrease code should be triggered, and the empty reserve * should finally be met. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -20328,8 +20328,8 @@ check_auto_cache_resize(void) ( cache_ptr->min_clean_size != (7 * 1000 * 1024 / 2) ) || ( cache_ptr->index_size != (3 * 1000 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 80.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 80.\n"; } } @@ -20339,16 +20339,16 @@ check_auto_cache_resize(void) * to 1.0. Decrease code should be triggered, and the empty reserve * should be met again. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -20360,8 +20360,8 @@ check_auto_cache_resize(void) ( cache_ptr->min_clean_size != (3 * 1000 * 1024) ) || ( cache_ptr->index_size != (2 * 1000 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 81.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 81.\n"; } } @@ -20369,16 +20369,16 @@ check_auto_cache_resize(void) /* twelth epoch -- hit rate 1.0 -- decrease as before. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -20390,8 +20390,8 @@ check_auto_cache_resize(void) ( cache_ptr->min_clean_size != (5 * 1000 * 1024 / 2) ) || ( cache_ptr->index_size != (1 * 1000 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 82.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 82.\n"; } } @@ -20399,16 +20399,16 @@ check_auto_cache_resize(void) /* thirteenth epoch -- hit rate 1.0 -- decrease as before. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -20420,8 +20420,8 @@ check_auto_cache_resize(void) ( cache_ptr->min_clean_size != (2 * 1000 * 1024) ) || ( cache_ptr->index_size != (1 * 1000 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 83.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 83.\n"; } } @@ -20429,16 +20429,16 @@ check_auto_cache_resize(void) /* fourteenth epoch -- hit rate 1.0 -- decrease as before. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -20450,8 +20450,8 @@ check_auto_cache_resize(void) ( cache_ptr->min_clean_size != (3 * 1000 * 1024 / 2) ) || ( cache_ptr->index_size != (1 * 1000 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 84.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 84.\n"; } } @@ -20459,16 +20459,16 @@ check_auto_cache_resize(void) /* fifteenth epoch -- hit rate 1.0 -- decrease as before. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -20480,8 +20480,8 @@ check_auto_cache_resize(void) ( cache_ptr->min_clean_size != (1 * 1000 * 1024) ) || ( cache_ptr->index_size != (1 * 1000 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 85.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 85.\n"; } } @@ -20489,16 +20489,16 @@ check_auto_cache_resize(void) /* sixteenth epoch -- hit rate 1.0 -- should be stable now */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -20510,16 +20510,16 @@ check_auto_cache_resize(void) ( cache_ptr->min_clean_size != (1 * 1000 * 1024) ) || ( cache_ptr->index_size != (1 * 1000 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 86.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 86.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - if ( pass ) { + if ( pass1 ) { - takedown_cache(cache_ptr, FALSE, FALSE); + takedown_cache1(cache_ptr, FALSE, FALSE); } /* now test the flash cache size increment code. At least at present, @@ -20540,11 +20540,11 @@ check_auto_cache_resize(void) * modes. Verify that all performs as expected. */ - if ( pass ) { + if ( pass1 ) { - reset_entries(); + reset_entries1(); - cache_ptr = setup_cache((size_t)(2 * 1024), + cache_ptr = setup_cache1((size_t)(2 * 1024), (size_t)(1 * 1024)); } @@ -20554,7 +20554,7 @@ check_auto_cache_resize(void) * increment algorithm. */ - if ( pass ) { + if ( pass1 ) { auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; auto_size_ctl.rpt_fcn = test_rpt_fcn; @@ -20602,12 +20602,12 @@ check_auto_cache_resize(void) if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 12.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 12.\n"; } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->max_cache_size != (64 * 1024) ) || ( cache_ptr->min_clean_size != (32 * 1024) ) || @@ -20615,32 +20615,32 @@ check_auto_cache_resize(void) ( cache_ptr->index_size != 0 ) || ( cache_ptr->cache_accesses != 0 ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache config (0).\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache config (0).\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); /* Load a huge entry into the cache */ - if ( pass ) { + if ( pass1 ) { - protect_entry(cache_ptr, HUGE_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, HUGE_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, HUGE_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, HUGE_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } - if ( ( pass ) && + if ( ( pass1 ) && ( ( ( cache_ptr->max_cache_size != (64 * 1024) ) || ( cache_ptr->min_clean_size != (32 * 1024) ) || ( cache_ptr->index_len != 1 ) || ( cache_ptr->index_size != HUGE_ENTRY_SIZE ) || ( cache_ptr->cache_accesses != 1 ) ) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache config (1).\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache config (1).\n"; } } @@ -20651,16 +20651,16 @@ check_auto_cache_resize(void) * for a monster entry in the cache, we will add space to the * cache to make room for the entry. */ - if ( pass ) { + if ( pass1 ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } - if ( ( pass ) && + if ( ( pass1 ) && ( ( ( cache_ptr->max_cache_size != (80 * 1024) ) || ( cache_ptr->min_clean_size != (40 * 1024) ) || ( cache_ptr->index_len != 2 ) || @@ -20668,8 +20668,8 @@ check_auto_cache_resize(void) MONSTER_ENTRY_SIZE) ) || ( cache_ptr->cache_accesses != 1 ) ) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache config (2).\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache config (2).\n"; } } @@ -20680,14 +20680,14 @@ check_auto_cache_resize(void) * sufficient space for the monster entry in the cache, we again * add space to the cache to make space for the entry. */ - if ( pass ) { + if ( pass1 ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 1); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 1); - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 1, + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 1, NO_CHANGE, H5C1__NO_FLAGS_SET); - if ( ( pass ) && + if ( ( pass1 ) && ( ( ( cache_ptr->max_cache_size != (144 * 1024) ) || ( cache_ptr->min_clean_size != ( 72 * 1024) ) || ( cache_ptr->index_len != 3 ) || @@ -20695,8 +20695,8 @@ check_auto_cache_resize(void) HUGE_ENTRY_SIZE) ) || ( cache_ptr->cache_accesses != 1 ) ) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache config (3).\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache config (3).\n"; } } @@ -20705,22 +20705,22 @@ check_auto_cache_resize(void) /* Load a third moster entry. Should be no cache size increase this * time. */ - if ( pass ) { + if ( pass1 ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 2); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 2); - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 2, + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 2, NO_CHANGE, H5C1__NO_FLAGS_SET); - if ( ( pass ) && + if ( ( pass1 ) && ( ( ( cache_ptr->max_cache_size != (144 * 1024) ) || ( cache_ptr->min_clean_size != ( 72 * 1024) ) || ( cache_ptr->index_len != 2 ) || ( cache_ptr->index_size != (2 * MONSTER_ENTRY_SIZE) ) || ( cache_ptr->cache_accesses != 2 ) ) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache config (4).\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache config (4).\n"; } } @@ -20729,32 +20729,32 @@ check_auto_cache_resize(void) /* delete existing entries to prepare for next test, and reset * the size of the cache. */ - if ( pass ) { + if ( pass1 ) { - expunge_entry(cache_ptr, MONSTER_ENTRY_TYPE, 1); - expunge_entry(cache_ptr, MONSTER_ENTRY_TYPE, 2); + expunge_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 1); + expunge_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 2); - if ( pass ) { + if ( pass1 ) { result = H5C1_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 13.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 13.\n"; } } - if ( ( pass ) && + if ( ( pass1 ) && ( ( ( cache_ptr->max_cache_size != (64 * 1024) ) || ( cache_ptr->min_clean_size != (32 * 1024) ) || ( cache_ptr->index_len != 0 ) || ( cache_ptr->index_size != 0 ) || ( cache_ptr->cache_accesses != 0 ) ) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache config (5).\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache config (5).\n"; } } @@ -20765,27 +20765,27 @@ check_auto_cache_resize(void) if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); /* insert a huge entry into the cache */ - if ( pass ) { + if ( pass1 ) { - insert_entry(cache_ptr, HUGE_ENTRY_TYPE, 1, TRUE, + insert_entry1(cache_ptr, HUGE_ENTRY_TYPE, 1, TRUE, H5C1__NO_FLAGS_SET); /* protect and unprotect a couple times to increment cache_accesses */ - protect_entry(cache_ptr, HUGE_ENTRY_TYPE, 1); - unprotect_entry(cache_ptr, HUGE_ENTRY_TYPE, 1, + protect_entry1(cache_ptr, HUGE_ENTRY_TYPE, 1); + unprotect_entry1(cache_ptr, HUGE_ENTRY_TYPE, 1, NO_CHANGE, H5C1__NO_FLAGS_SET); - protect_entry(cache_ptr, HUGE_ENTRY_TYPE, 1); - unprotect_entry(cache_ptr, HUGE_ENTRY_TYPE, 1, + protect_entry1(cache_ptr, HUGE_ENTRY_TYPE, 1); + unprotect_entry1(cache_ptr, HUGE_ENTRY_TYPE, 1, NO_CHANGE, H5C1__NO_FLAGS_SET); - if ( ( pass ) && + if ( ( pass1 ) && ( ( ( cache_ptr->max_cache_size != (64 * 1024) ) || ( cache_ptr->min_clean_size != (32 * 1024) ) || ( cache_ptr->index_len != 1 ) || ( cache_ptr->index_size != HUGE_ENTRY_SIZE ) || ( cache_ptr->cache_accesses != 2 ) ) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache config (6).\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache config (6).\n"; } } @@ -20796,12 +20796,12 @@ check_auto_cache_resize(void) * for a monster entry in the cache, we will add space to the * cache to make room for the entry. */ - if ( pass ) { + if ( pass1 ) { - insert_entry(cache_ptr, MONSTER_ENTRY_TYPE, 4, TRUE, + insert_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 4, TRUE, H5C1__NO_FLAGS_SET); - if ( ( pass ) && + if ( ( pass1 ) && ( ( ( cache_ptr->max_cache_size != (80 * 1024) ) || ( cache_ptr->min_clean_size != (40 * 1024) ) || ( cache_ptr->index_len != 2 ) || @@ -20809,8 +20809,8 @@ check_auto_cache_resize(void) HUGE_ENTRY_SIZE + MONSTER_ENTRY_SIZE ) || ( cache_ptr->cache_accesses != 0 ) ) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache config (7).\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache config (7).\n"; } } @@ -20818,12 +20818,12 @@ check_auto_cache_resize(void) /* Insert a second monster entry. Cache size should increase again. */ - if ( pass ) { + if ( pass1 ) { - insert_entry(cache_ptr, MONSTER_ENTRY_TYPE, 5, TRUE, + insert_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 5, TRUE, H5C1__NO_FLAGS_SET); - if ( ( pass ) && + if ( ( pass1 ) && ( ( ( cache_ptr->max_cache_size != (144 * 1024) ) || ( cache_ptr->min_clean_size != ( 72 * 1024) ) || ( cache_ptr->index_len != 3 ) || @@ -20831,8 +20831,8 @@ check_auto_cache_resize(void) 2 * MONSTER_ENTRY_SIZE + HUGE_ENTRY_SIZE ) || ( cache_ptr->cache_accesses != 0 ) ) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache config (8).\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache config (8).\n"; } } @@ -20841,22 +20841,22 @@ check_auto_cache_resize(void) /* Insert a third monster entry. Should be no cache size increase this * time. */ - if ( pass ) { + if ( pass1 ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 6); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 6); - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 6, + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 6, NO_CHANGE, H5C1__NO_FLAGS_SET); - if ( ( pass ) && + if ( ( pass1 ) && ( ( ( cache_ptr->max_cache_size != (144 * 1024) ) || ( cache_ptr->min_clean_size != ( 72 * 1024) ) || ( cache_ptr->index_len != 2 ) || ( cache_ptr->index_size != (2 * MONSTER_ENTRY_SIZE) ) || ( cache_ptr->cache_accesses != 1 ) ) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache config (9).\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache config (9).\n"; } } @@ -20867,31 +20867,31 @@ check_auto_cache_resize(void) * variable entries before we run the test, so will protect and * unprotect them now so as to get the correct initial size. */ - if ( pass ) { + if ( pass1 ) { - expunge_entry(cache_ptr, MONSTER_ENTRY_TYPE, 5); - expunge_entry(cache_ptr, MONSTER_ENTRY_TYPE, 6); + expunge_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 5); + expunge_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 6); - protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10); - unprotect_entry_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 10, + protect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 10); + unprotect_entry1_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 10, H5C1__DIRTIED_FLAG|H5C1__SIZE_CHANGED_FLAG, 1024); - protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 11); - unprotect_entry_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 11, + protect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 11); + unprotect_entry1_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 11, H5C1__DIRTIED_FLAG|H5C1__SIZE_CHANGED_FLAG, 1024); - protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 12); - unprotect_entry_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 12, + protect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 12); + unprotect_entry1_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 12, H5C1__DIRTIED_FLAG|H5C1__SIZE_CHANGED_FLAG, 1024); - protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 13); - unprotect_entry_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 13, + protect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 13); + unprotect_entry1_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 13, H5C1__DIRTIED_FLAG|H5C1__SIZE_CHANGED_FLAG, 1024); - flush_cache(cache_ptr, TRUE, FALSE, FALSE); + flush_cache1(cache_ptr, TRUE, FALSE, FALSE); - if ( pass ) { + if ( pass1 ) { auto_size_ctl.initial_size = 6 * 1024; result = H5C1_set_cache_auto_resize_config(cache_ptr, @@ -20899,53 +20899,53 @@ check_auto_cache_resize(void) if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 13.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 13.\n"; } } - if ( ( pass ) && + if ( ( pass1 ) && ( ( ( cache_ptr->max_cache_size != (6 * 1024) ) || ( cache_ptr->min_clean_size != (3 * 1024) ) || ( cache_ptr->index_len != 0 ) || ( cache_ptr->index_size != 0 ) || ( cache_ptr->cache_accesses != 0 ) ) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache config (10).\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache config (10).\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); /* Now load the variable entries into the cache */ - if ( pass ) { + if ( pass1 ) { - protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10); - unprotect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10, NO_CHANGE, + protect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 10); + unprotect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 10, NO_CHANGE, H5C1__NO_FLAGS_SET); - protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 11); - unprotect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 11, NO_CHANGE, + protect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 11); + unprotect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 11, NO_CHANGE, H5C1__NO_FLAGS_SET); - protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 12); - unprotect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 12, NO_CHANGE, + protect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 12); + unprotect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 12, NO_CHANGE, H5C1__NO_FLAGS_SET); - protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 13); - unprotect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 13, NO_CHANGE, + protect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 13); + unprotect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 13, NO_CHANGE, H5C1__NO_FLAGS_SET); - if ( ( pass ) && + if ( ( pass1 ) && ( ( ( cache_ptr->max_cache_size != (6 * 1024) ) || ( cache_ptr->min_clean_size != (3 * 1024) ) || ( cache_ptr->index_len != 4 ) || ( cache_ptr->index_size != 4 * 1024 ) || ( cache_ptr->cache_accesses != 4 ) ) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache config (11).\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache config (11).\n"; } } @@ -20954,22 +20954,22 @@ check_auto_cache_resize(void) /* protect a variable entry, and re-size it to 3K. Should be * no effect on the size of the cache. */ - if ( pass ) { + if ( pass1 ) { - protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10); - unprotect_entry_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 10, + protect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 10); + unprotect_entry1_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 10, H5C1__DIRTIED_FLAG|H5C1__SIZE_CHANGED_FLAG, 3 * 1024); - if ( ( pass ) && + if ( ( pass1 ) && ( ( ( cache_ptr->max_cache_size != (6 * 1024) ) || ( cache_ptr->min_clean_size != (3 * 1024) ) || ( cache_ptr->index_len != 4 ) || ( cache_ptr->index_size != 6 * 1024 ) || ( cache_ptr->cache_accesses != 5 ) ) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache config (12).\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache config (12).\n"; } } @@ -20979,22 +20979,22 @@ check_auto_cache_resize(void) * resize the cache to 13 KB. Note that cache_accesses will be 0 * in this case, since cache_accesses is incremented on the protect. */ - if ( pass ) { + if ( pass1 ) { - protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10); - unprotect_entry_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 10, + protect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 10); + unprotect_entry1_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 10, H5C1__DIRTIED_FLAG|H5C1__SIZE_CHANGED_FLAG, 10 * 1024); - if ( ( pass ) && + if ( ( pass1 ) && ( ( ( cache_ptr->max_cache_size != (13 * 1024) ) || ( cache_ptr->min_clean_size != (13 * 512) ) || ( cache_ptr->index_len != 4 ) || ( cache_ptr->index_size != 13 * 1024 ) || ( cache_ptr->cache_accesses != 0 ) ) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache config (13).\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache config (13).\n"; } } @@ -21003,22 +21003,22 @@ check_auto_cache_resize(void) /* protect a second variable entry, and re-size it to 10K. Should * resize to 22 KB. */ - if ( pass ) { + if ( pass1 ) { - protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 11); - unprotect_entry_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 11, + protect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 11); + unprotect_entry1_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 11, H5C1__DIRTIED_FLAG|H5C1__SIZE_CHANGED_FLAG, 10 * 1024); - if ( ( pass ) && + if ( ( pass1 ) && ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) || ( cache_ptr->min_clean_size != (11 * 1024) ) || ( cache_ptr->index_len != 4 ) || ( cache_ptr->index_size != 22 * 1024 ) || ( cache_ptr->cache_accesses != 0 ) ) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache config (14).\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache config (14).\n"; } } @@ -21027,22 +21027,22 @@ check_auto_cache_resize(void) /* protect a third variable entry, and re-size it to 10K. Should * be no change in cache size. */ - if ( pass ) { + if ( pass1 ) { - protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 12); - unprotect_entry_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 12, + protect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 12); + unprotect_entry1_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 12, H5C1__DIRTIED_FLAG|H5C1__SIZE_CHANGED_FLAG, 10 * 1024); - if ( ( pass ) && + if ( ( pass1 ) && ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) || ( cache_ptr->min_clean_size != (11 * 1024) ) || ( cache_ptr->index_len != 4 ) || ( cache_ptr->index_size != 31 * 1024 ) || ( cache_ptr->cache_accesses != 1 ) ) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache config (15).\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache config (15).\n"; } } @@ -21052,19 +21052,19 @@ check_auto_cache_resize(void) * restore the cache to its initial size as well, in preparation * for the next test. */ - if ( pass ) { + if ( pass1 ) { - protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10); - unprotect_entry_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 10, + protect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 10); + unprotect_entry1_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 10, H5C1__DIRTIED_FLAG|H5C1__SIZE_CHANGED_FLAG, 1 * 1024); - protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 11); - unprotect_entry_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 11, + protect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 11); + unprotect_entry1_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 11, H5C1__DIRTIED_FLAG|H5C1__SIZE_CHANGED_FLAG, 1 * 1024); - protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 12); - unprotect_entry_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 12, + protect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 12); + unprotect_entry1_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 12, H5C1__DIRTIED_FLAG|H5C1__SIZE_CHANGED_FLAG, 1 * 1024); - if ( pass ) { + if ( pass1 ) { auto_size_ctl.initial_size = 6 * 1024; result = H5C1_set_cache_auto_resize_config(cache_ptr, @@ -21072,20 +21072,20 @@ check_auto_cache_resize(void) if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 14.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 14.\n"; } } - if ( ( pass ) && + if ( ( pass1 ) && ( ( ( cache_ptr->max_cache_size != (6 * 1024) ) || ( cache_ptr->min_clean_size != (3 * 1024) ) || ( cache_ptr->index_len != 4 ) || ( cache_ptr->index_size != 4 * 1024 ) || ( cache_ptr->cache_accesses != 0 ) ) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache config (16).\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache config (16).\n"; } } @@ -21093,82 +21093,82 @@ check_auto_cache_resize(void) /* Now test flash cache resizes with pinned entries... */ - if ( pass ) { + if ( pass1 ) { - protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10); - unprotect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10, NO_CHANGE, + protect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 10); + unprotect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 10, NO_CHANGE, H5C1__PIN_ENTRY_FLAG); - resize_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10, 2 * 1024, TRUE); + resize_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 10, 2 * 1024, TRUE); - if ( ( pass ) && + if ( ( pass1 ) && ( ( ( cache_ptr->max_cache_size != (6 * 1024) ) || ( cache_ptr->min_clean_size != (6 * 512) ) || ( cache_ptr->index_len != 4 ) || ( cache_ptr->index_size != 5 * 1024 ) || ( cache_ptr->cache_accesses != 1 ) ) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache config (17).\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache config (17).\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - if ( pass ) { + if ( pass1 ) { - resize_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10, 10 * 1024, TRUE); + resize_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 10, 10 * 1024, TRUE); - if ( ( pass ) && + if ( ( pass1 ) && ( ( ( cache_ptr->max_cache_size != (13 * 1024) ) || ( cache_ptr->min_clean_size != (13 * 512) ) || ( cache_ptr->index_len != 4 ) || ( cache_ptr->index_size != 13 * 1024 ) || ( cache_ptr->cache_accesses != 0 ) ) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache config (18).\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache config (18).\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - if ( pass ) { + if ( pass1 ) { - protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 11); - unprotect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 11, NO_CHANGE, + protect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 11); + unprotect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 11, NO_CHANGE, H5C1__PIN_ENTRY_FLAG); - resize_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 11, 10 * 1024, TRUE); + resize_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 11, 10 * 1024, TRUE); - if ( ( pass ) && + if ( ( pass1 ) && ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) || ( cache_ptr->min_clean_size != (11 * 1024) ) || ( cache_ptr->index_len != 4 ) || ( cache_ptr->index_size != 22 * 1024 ) || ( cache_ptr->cache_accesses != 0 ) ) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache config (19).\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache config (19).\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - if ( pass ) { + if ( pass1 ) { - protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 12); - unprotect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 12, NO_CHANGE, + protect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 12); + unprotect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 12, NO_CHANGE, H5C1__PIN_ENTRY_FLAG); - resize_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 12, 10 * 1024, TRUE); + resize_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 12, 10 * 1024, TRUE); - if ( ( pass ) && + if ( ( pass1 ) && ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) || ( cache_ptr->min_clean_size != (11 * 1024) ) || ( cache_ptr->index_len != 4 ) || ( cache_ptr->index_size != 31 * 1024 ) || ( cache_ptr->cache_accesses != 1 ) ) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache config (20).\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache config (20).\n"; } } @@ -21177,29 +21177,29 @@ check_auto_cache_resize(void) /* Unpin the entries. Note that no entries are evicted as we don't * load any entries. */ - if ( pass ) { + if ( pass1 ) { - protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10); - unprotect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10, NO_CHANGE, + protect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 10); + unprotect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 10, NO_CHANGE, H5C1__UNPIN_ENTRY_FLAG); - protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 11); - unprotect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 11, NO_CHANGE, + protect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 11); + unprotect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 11, NO_CHANGE, H5C1__UNPIN_ENTRY_FLAG); - protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 12); - unprotect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 12, NO_CHANGE, + protect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 12); + unprotect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 12, NO_CHANGE, H5C1__UNPIN_ENTRY_FLAG); - if ( ( pass ) && + if ( ( pass1 ) && ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) || ( cache_ptr->min_clean_size != (11 * 1024) ) || ( cache_ptr->index_len != 4 ) || ( cache_ptr->index_size != 31 * 1024 ) || ( cache_ptr->cache_accesses != 4 ) ) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache config (21).\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache config (21).\n"; } } @@ -21209,19 +21209,19 @@ check_auto_cache_resize(void) * restore the cache to its initial size as well, in preparation * for the next test. */ - if ( pass ) { + if ( pass1 ) { - protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10); - unprotect_entry_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 10, + protect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 10); + unprotect_entry1_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 10, H5C1__DIRTIED_FLAG|H5C1__SIZE_CHANGED_FLAG, 1 * 1024); - protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 11); - unprotect_entry_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 11, + protect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 11); + unprotect_entry1_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 11, H5C1__DIRTIED_FLAG|H5C1__SIZE_CHANGED_FLAG, 1 * 1024); - protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 12); - unprotect_entry_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 12, + protect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 12); + unprotect_entry1_with_size_change(cache_ptr, VARIABLE_ENTRY_TYPE, 12, H5C1__DIRTIED_FLAG|H5C1__SIZE_CHANGED_FLAG, 1 * 1024); - if ( pass ) { + if ( pass1 ) { auto_size_ctl.initial_size = 6 * 1024; result = H5C1_set_cache_auto_resize_config(cache_ptr, @@ -21229,99 +21229,99 @@ check_auto_cache_resize(void) if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 15.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 15.\n"; } } - if ( ( pass ) && + if ( ( pass1 ) && ( ( ( cache_ptr->max_cache_size != (6 * 1024) ) || ( cache_ptr->min_clean_size != (3 * 1024) ) || ( cache_ptr->index_len != 4 ) || ( cache_ptr->index_size != 4 * 1024 ) || ( cache_ptr->cache_accesses != 0 ) ) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache config (22).\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache config (22).\n"; } } - if ( pass ) { + if ( pass1 ) { - protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10); - unprotect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10, NO_CHANGE, + protect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 10); + unprotect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 10, NO_CHANGE, H5C1__PIN_ENTRY_FLAG); - resize_pinned_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10, 2 * 1024); + resize_pinned_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 10, 2 * 1024); - if ( ( pass ) && + if ( ( pass1 ) && ( ( ( cache_ptr->max_cache_size != (6 * 1024) ) || ( cache_ptr->min_clean_size != (6 * 512) ) || ( cache_ptr->index_len != 4 ) || ( cache_ptr->index_size != 5 * 1024 ) || ( cache_ptr->cache_accesses != 1 ) ) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache config (23).\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache config (23).\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - if ( pass ) { + if ( pass1 ) { - resize_pinned_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10, 10 * 1024); + resize_pinned_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 10, 10 * 1024); - if ( ( pass ) && + if ( ( pass1 ) && ( ( ( cache_ptr->max_cache_size != (13 * 1024) ) || ( cache_ptr->min_clean_size != (13 * 512) ) || ( cache_ptr->index_len != 4 ) || ( cache_ptr->index_size != 13 * 1024 ) || ( cache_ptr->cache_accesses != 0 ) ) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache config (24).\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache config (24).\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - if ( pass ) { + if ( pass1 ) { - protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 11); - unprotect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 11, NO_CHANGE, + protect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 11); + unprotect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 11, NO_CHANGE, H5C1__PIN_ENTRY_FLAG); - resize_pinned_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 11, 10 * 1024); + resize_pinned_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 11, 10 * 1024); - if ( ( pass ) && + if ( ( pass1 ) && ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) || ( cache_ptr->min_clean_size != (11 * 1024) ) || ( cache_ptr->index_len != 4 ) || ( cache_ptr->index_size != 22 * 1024 ) || ( cache_ptr->cache_accesses != 0 ) ) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache config (25).\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache config (25).\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - if ( pass ) { + if ( pass1 ) { - protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 12); - unprotect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 12, NO_CHANGE, + protect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 12); + unprotect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 12, NO_CHANGE, H5C1__PIN_ENTRY_FLAG); - resize_pinned_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 12, 10 * 1024); + resize_pinned_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 12, 10 * 1024); - if ( ( pass ) && + if ( ( pass1 ) && ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) || ( cache_ptr->min_clean_size != (11 * 1024) ) || ( cache_ptr->index_len != 4 ) || ( cache_ptr->index_size != 31 * 1024 ) || ( cache_ptr->cache_accesses != 1 ) ) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache config (26).\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache config (26).\n"; } } @@ -21330,51 +21330,51 @@ check_auto_cache_resize(void) /* Unpin the entries. Note that no entries are evicted as we don't * load any entries. */ - if ( pass ) { + if ( pass1 ) { - protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10); - unprotect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10, NO_CHANGE, + protect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 10); + unprotect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 10, NO_CHANGE, H5C1__UNPIN_ENTRY_FLAG); - protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 11); - unprotect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 11, NO_CHANGE, + protect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 11); + unprotect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 11, NO_CHANGE, H5C1__UNPIN_ENTRY_FLAG); - protect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 12); - unprotect_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 12, NO_CHANGE, + protect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 12); + unprotect_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 12, NO_CHANGE, H5C1__UNPIN_ENTRY_FLAG); - if ( ( pass ) && + if ( ( pass1 ) && ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) || ( cache_ptr->min_clean_size != (11 * 1024) ) || ( cache_ptr->index_len != 4 ) || ( cache_ptr->index_size != 31 * 1024 ) || ( cache_ptr->cache_accesses != 4 ) ) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache config (27).\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache config (27).\n"; } } /* We have finished a basic check of the flash cache size increment * code. Tidy up for a more extensive test... */ - if ( pass ) { + if ( pass1 ) { - expunge_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 10); - expunge_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 11); - expunge_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 12); - expunge_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 13); + expunge_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 10); + expunge_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 11); + expunge_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 12); + expunge_entry1(cache_ptr, VARIABLE_ENTRY_TYPE, 13); - if ( ( pass ) && + if ( ( pass1 ) && ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) || ( cache_ptr->min_clean_size != (11 * 1024) ) || ( cache_ptr->index_len != 0 ) || ( cache_ptr->index_size != 0 ) || ( cache_ptr->cache_accesses != 4 ) ) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache config (28).\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache config (28).\n"; } } @@ -21384,7 +21384,7 @@ check_auto_cache_resize(void) * and flash_threshold just to make sure that such changed perform * as expected. */ - if ( pass ) { + if ( pass1 ) { auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; auto_size_ctl.rpt_fcn = test_rpt_fcn; @@ -21432,14 +21432,14 @@ check_auto_cache_resize(void) if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 15.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 15.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->max_cache_size != (4 * 1024) ) || ( cache_ptr->min_clean_size != (4 * 512) ) || @@ -21447,8 +21447,8 @@ check_auto_cache_resize(void) ( cache_ptr->index_size != 0 ) || ( cache_ptr->cache_accesses != 0 ) ) { - pass = FALSE; - failure_mssg = "bad cache after initialization 15.\n"; + pass1 = FALSE; + failure_mssg1 = "bad cache after initialization 15.\n"; } } @@ -21457,15 +21457,15 @@ check_auto_cache_resize(void) /* protect and unprotect a large entry -- no change in cache size since * a large entry will just fill the available space in the cache. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, 0); - unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, 0, NO_CHANGE, + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, 0); + unprotect_entry1(cache_ptr, LARGE_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); - if ( ( pass ) && + if ( ( pass1 ) && ( ( ( cache_ptr->max_cache_size != (4 * 1024) ) || ( cache_ptr->min_clean_size != (4 * 512) ) || ( cache_ptr->index_len != 1 ) || @@ -21473,8 +21473,8 @@ check_auto_cache_resize(void) ( cache_ptr->cache_accesses != 1 ) || ( rpt_fcn_called == TRUE ) ) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache config (29).\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache config (29).\n"; } } @@ -21484,15 +21484,15 @@ check_auto_cache_resize(void) * flash cache size increase to 12 KB (remember that flash_multiple is * set to 2.0). */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, 1); - unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, 1, NO_CHANGE, + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, 1); + unprotect_entry1(cache_ptr, LARGE_ENTRY_TYPE, 1, NO_CHANGE, H5C1__NO_FLAGS_SET); - if ( ( pass ) && + if ( ( pass1 ) && ( ( ( cache_ptr->max_cache_size != (12 * 1024) ) || ( cache_ptr->min_clean_size != (12 * 512) ) || ( cache_ptr->index_len != 2 ) || @@ -21500,8 +21500,8 @@ check_auto_cache_resize(void) ( cache_ptr->cache_accesses != 1 ) || ( rpt_fcn_called != TRUE ) ) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache config (30).\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache config (30).\n"; } } @@ -21510,18 +21510,18 @@ check_auto_cache_resize(void) /* protect and unprotect two more large entries -- shouldnt trigger a * flash cache size increase. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, 2); - unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, 2, NO_CHANGE, + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, 2); + unprotect_entry1(cache_ptr, LARGE_ENTRY_TYPE, 2, NO_CHANGE, H5C1__NO_FLAGS_SET); - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, 3); - unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, 3, NO_CHANGE, + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, 3); + unprotect_entry1(cache_ptr, LARGE_ENTRY_TYPE, 3, NO_CHANGE, H5C1__NO_FLAGS_SET); - if ( ( pass ) && + if ( ( pass1 ) && ( ( ( cache_ptr->max_cache_size != (12 * 1024) ) || ( cache_ptr->min_clean_size != (12 * 512) ) || ( cache_ptr->index_len != 3 ) || @@ -21529,8 +21529,8 @@ check_auto_cache_resize(void) ( cache_ptr->cache_accesses != 3 ) || ( rpt_fcn_called != FALSE ) ) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache config (31).\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache config (31).\n"; } } @@ -21539,16 +21539,16 @@ check_auto_cache_resize(void) /* do many accesses of a single entry to talk the cache into reducing * its size to the minimum. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, TINY_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, TINY_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, TINY_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, TINY_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -21559,23 +21559,23 @@ check_auto_cache_resize(void) ( cache_ptr->min_clean_size != (2 * 1024) ) || ( cache_ptr->index_size != (1 * TINY_ENTRY_SIZE) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache config (32).\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache config (32).\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); /* Force another flash increase */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, 0); - unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, 0, NO_CHANGE, + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, 0); + unprotect_entry1(cache_ptr, LARGE_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); - if ( ( pass ) && + if ( ( pass1 ) && ( ( ( cache_ptr->max_cache_size != (4 * 1024 + 128) ) || ( cache_ptr->min_clean_size != (2 * 1024 + 64) ) || ( cache_ptr->index_len != 2 ) || @@ -21585,24 +21585,24 @@ check_auto_cache_resize(void) ( rpt_fcn_called == FALSE ) || ( rpt_status != flash_increase ) ) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache config (33).\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache config (33).\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); /* force regular size increase up to maximum */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 500 ) ) + while ( ( pass1 ) && ( i < 500 ) ) { - protect_entry(cache_ptr, TINY_ENTRY_TYPE, i); + protect_entry1(cache_ptr, TINY_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, TINY_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, TINY_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -21613,27 +21613,27 @@ check_auto_cache_resize(void) ( rpt_fcn_called == FALSE ) || ( rpt_status != at_max_size ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache config (34).\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache config (34).\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - if ( pass ) { + if ( pass1 ) { - takedown_cache(cache_ptr, FALSE, FALSE); + takedown_cache1(cache_ptr, FALSE, FALSE); } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) { + if ( ! pass1 ) { - HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + HDfprintf(stdout, "%s: failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } return; @@ -21718,7 +21718,7 @@ check_auto_cache_resize_disable(void) TESTING("automatic cache resize disable"); - pass = TRUE; + pass1 = TRUE; if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); @@ -21727,32 +21727,32 @@ check_auto_cache_resize_disable(void) * performs as expected. */ - if ( pass ) { + if ( pass1 ) { - reset_entries(); + reset_entries1(); - cache_ptr = setup_cache((size_t)(2 * 1024), + cache_ptr = setup_cache1((size_t)(2 * 1024), (size_t)(1 * 1024)); } - if ( pass ) { + if ( pass1 ) { result = H5C1_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 1.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 1.\n"; } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->max_cache_size != (512 * 1024) ) || ( cache_ptr->min_clean_size != (256 * 1024) ) ) { - pass = FALSE; - failure_mssg = "bad cache size after initialization.\n"; + pass1 = FALSE; + failure_mssg1 = "bad cache size after initialization.\n"; } } @@ -21766,7 +21766,7 @@ check_auto_cache_resize_disable(void) * modes. ******************************************************************/ - if ( pass ) { + if ( pass1 ) { auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; auto_size_ctl.rpt_fcn = test_rpt_fcn; @@ -21814,18 +21814,18 @@ check_auto_cache_resize_disable(void) if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 2.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 2.\n"; } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "bad cache size after set resize re-config 1.\n"; + pass1 = FALSE; + failure_mssg1 = "bad cache size after set resize re-config 1.\n"; } } @@ -21834,16 +21834,16 @@ check_auto_cache_resize_disable(void) /* force low hit rate with cache full -- increase disabled so should * be no change in cache size, and result should be increase_disabled. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -21855,8 +21855,8 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 1.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 1.\n"; } } @@ -21865,16 +21865,16 @@ check_auto_cache_resize_disable(void) /* force high hit rate -- make sure that we haven't disabled decreases. * should result in a decrease cache size from 4 to 2 Meg. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -21885,8 +21885,8 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 2.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 2.\n"; } } @@ -21895,16 +21895,16 @@ check_auto_cache_resize_disable(void) /* force low hit rate again -- increase disabled so should * be no change in cache size, and result should be increase_disabled. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -21916,8 +21916,8 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 3.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 3.\n"; } } @@ -21927,7 +21927,7 @@ check_auto_cache_resize_disable(void) * threshold instead of the increment. */ - if ( pass ) { + if ( pass1 ) { auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; auto_size_ctl.rpt_fcn = test_rpt_fcn; @@ -21975,18 +21975,18 @@ check_auto_cache_resize_disable(void) if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 3.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 3.\n"; } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "bad cache size after set resize re-config 2.\n"; + pass1 = FALSE; + failure_mssg1 = "bad cache size after set resize re-config 2.\n"; } } @@ -21995,16 +21995,16 @@ check_auto_cache_resize_disable(void) /* force low hit rate with cache full -- increase disabled so should * be no change in cache size, and result should be in_spec. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -22016,8 +22016,8 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 4.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 4.\n"; } } @@ -22026,16 +22026,16 @@ check_auto_cache_resize_disable(void) /* force high hit rate -- make sure that we haven't disabled decreases. * should result in a decrease cache size from 4 to 2 Meg. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -22046,8 +22046,8 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 5.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 5.\n"; } } @@ -22056,16 +22056,16 @@ check_auto_cache_resize_disable(void) /* force low hit rate again -- increase disabled so should * be no change in cache size, and result should be increase_disabled. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -22077,8 +22077,8 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 6.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 6.\n"; } } @@ -22088,7 +22088,7 @@ check_auto_cache_resize_disable(void) * incr_mode. */ - if ( pass ) { + if ( pass1 ) { auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; auto_size_ctl.rpt_fcn = test_rpt_fcn; @@ -22136,18 +22136,18 @@ check_auto_cache_resize_disable(void) if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 4.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 4.\n"; } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "bad cache size after set resize re-config 3.\n"; + pass1 = FALSE; + failure_mssg1 = "bad cache size after set resize re-config 3.\n"; } } @@ -22156,16 +22156,16 @@ check_auto_cache_resize_disable(void) /* force low hit rate with cache full -- increase disabled so should * be no change in cache size, and result should be in_spec. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -22177,8 +22177,8 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 7.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 7.\n"; } } @@ -22187,16 +22187,16 @@ check_auto_cache_resize_disable(void) /* force high hit rate -- make sure that we haven't disabled decreases. * should result in a decrease cache size from 4 to 2 Meg. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -22207,8 +22207,8 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 8.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 8.\n"; } } @@ -22217,16 +22217,16 @@ check_auto_cache_resize_disable(void) /* force low hit rate again -- increase disabled so should * be no change in cache size, and result should be increase_disabled. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -22238,8 +22238,8 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 9.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 9.\n"; } } @@ -22248,7 +22248,7 @@ check_auto_cache_resize_disable(void) /* Now, disable size decreases, and repeat the above tests. */ - if ( pass ) { + if ( pass1 ) { auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; auto_size_ctl.rpt_fcn = test_rpt_fcn; @@ -22296,20 +22296,20 @@ check_auto_cache_resize_disable(void) if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 5.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 5.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "bad cache size after set resize re-config 4.\n"; + pass1 = FALSE; + failure_mssg1 = "bad cache size after set resize re-config 4.\n"; } } @@ -22318,16 +22318,16 @@ check_auto_cache_resize_disable(void) /* force high hit rate -- should be no change in cache size, * and result should be decrease_disabled. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -22338,8 +22338,8 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 10.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 10.\n"; } } @@ -22347,16 +22347,16 @@ check_auto_cache_resize_disable(void) /* force low hit rate -- cache size should increase from 4 to 6 Meg. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -22367,8 +22367,8 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 11.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 11.\n"; } } @@ -22377,16 +22377,16 @@ check_auto_cache_resize_disable(void) /* force high hit rate again -- should be no change in cache size, * and result should be decrease_disabled. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -22397,8 +22397,8 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 12.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 12.\n"; } } @@ -22408,7 +22408,7 @@ check_auto_cache_resize_disable(void) * threshold instead of the decrement. */ - if ( pass ) { + if ( pass1 ) { auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; auto_size_ctl.rpt_fcn = test_rpt_fcn; @@ -22456,18 +22456,18 @@ check_auto_cache_resize_disable(void) if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 6.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 6.\n"; } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "bad cache size after set resize re-config 5.\n"; + pass1 = FALSE; + failure_mssg1 = "bad cache size after set resize re-config 5.\n"; } } @@ -22476,16 +22476,16 @@ check_auto_cache_resize_disable(void) /* force high hit rate -- should be no change in cache size, * and result should be in_spec. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -22497,8 +22497,8 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 13.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 13.\n"; } } @@ -22506,16 +22506,16 @@ check_auto_cache_resize_disable(void) /* force low hit rate -- cache size should increase from 4 to 6 Meg. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -22526,8 +22526,8 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 14.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 14.\n"; } } @@ -22536,16 +22536,16 @@ check_auto_cache_resize_disable(void) /* force high hit rate again -- should be no change in cache size, * and result should be in_spec. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -22557,8 +22557,8 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 15.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 15.\n"; } } @@ -22567,7 +22567,7 @@ check_auto_cache_resize_disable(void) /* Repeat the above tests, disabling decrease through the decr_mode. */ - if ( pass ) { + if ( pass1 ) { auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; auto_size_ctl.rpt_fcn = test_rpt_fcn; @@ -22615,18 +22615,18 @@ check_auto_cache_resize_disable(void) if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 7.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 7.\n"; } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "bad cache size after set resize re-config 6.\n"; + pass1 = FALSE; + failure_mssg1 = "bad cache size after set resize re-config 6.\n"; } } @@ -22635,16 +22635,16 @@ check_auto_cache_resize_disable(void) /* force high hit rate -- should be no change in cache size, * and result should be in_spec. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -22656,8 +22656,8 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 16.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 16.\n"; } } @@ -22665,16 +22665,16 @@ check_auto_cache_resize_disable(void) /* force low hit rate -- cache size should increase from 4 to 6 Meg. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -22685,8 +22685,8 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 17.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 17.\n"; } } @@ -22695,16 +22695,16 @@ check_auto_cache_resize_disable(void) /* force high hit rate again -- should be no change in cache size, * and result should be in_spec. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -22716,8 +22716,8 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 18.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 18.\n"; } } @@ -22728,7 +22728,7 @@ check_auto_cache_resize_disable(void) * Start by disabling size decrement by setting max_decrement to zero. */ - if ( pass ) { + if ( pass1 ) { auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; auto_size_ctl.rpt_fcn = test_rpt_fcn; @@ -22776,41 +22776,41 @@ check_auto_cache_resize_disable(void) if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 8.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 8.\n"; } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "bad cache size after set resize re-config 7.\n"; + pass1 = FALSE; + failure_mssg1 = "bad cache size after set resize re-config 7.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); /* flush the cache and destroy all entries so we start from a known point */ - flush_cache(cache_ptr, TRUE, FALSE, FALSE); + flush_cache1(cache_ptr, TRUE, FALSE, FALSE); if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); /* load up the cache with small entries. Note that it will take an * epoch for the ageout code to initialize itself if it is enabled. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i); + protect_entry1(cache_ptr, SMALL_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, SMALL_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -22822,8 +22822,8 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 19.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 19.\n"; } } @@ -22831,16 +22831,16 @@ check_auto_cache_resize_disable(void) /* Load up some more small entries. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 1000; - while ( ( pass ) && ( i < 2000 ) ) + while ( ( pass1 ) && ( i < 2000 ) ) { - protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i); + protect_entry1(cache_ptr, SMALL_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, SMALL_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -22852,8 +22852,8 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 20.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 20.\n"; } } @@ -22863,16 +22863,16 @@ check_auto_cache_resize_disable(void) * is satisfied. We would see a decrease here if decrease were * possible. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i); + protect_entry1(cache_ptr, SMALL_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, SMALL_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -22884,8 +22884,8 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 21.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 21.\n"; } } @@ -22893,16 +22893,16 @@ check_auto_cache_resize_disable(void) /* force low hit rate -- cache size should increase from 4 to 6 Meg. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -22913,8 +22913,8 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 22.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 22.\n"; } } @@ -22925,16 +22925,16 @@ check_auto_cache_resize_disable(void) * Should be no change in cache size, and result should be * decrease_disabled. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -22946,8 +22946,8 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 23.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 23.\n"; } } @@ -22956,7 +22956,7 @@ check_auto_cache_resize_disable(void) /* Now disable size decrement in age out mode via the empty reserve. */ - if ( pass ) { + if ( pass1 ) { auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; auto_size_ctl.rpt_fcn = test_rpt_fcn; @@ -23004,41 +23004,41 @@ check_auto_cache_resize_disable(void) if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 9.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 9.\n"; } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "bad cache size after set resize re-config 8.\n"; + pass1 = FALSE; + failure_mssg1 = "bad cache size after set resize re-config 8.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); /* flush the cache and destroy all entries so we start from a known point */ - flush_cache(cache_ptr, TRUE, FALSE, FALSE); + flush_cache1(cache_ptr, TRUE, FALSE, FALSE); if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); /* load up the cache with small entries. Note that it will take an * epoch for the ageout code to initialize itself if it is enabled. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i); + protect_entry1(cache_ptr, SMALL_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, SMALL_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -23050,8 +23050,8 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 24.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 24.\n"; } } @@ -23059,16 +23059,16 @@ check_auto_cache_resize_disable(void) /* Load up some more small entries. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 1000; - while ( ( pass ) && ( i < 2000 ) ) + while ( ( pass1 ) && ( i < 2000 ) ) { - protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i); + protect_entry1(cache_ptr, SMALL_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, SMALL_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -23080,8 +23080,8 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 25.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 25.\n"; } } @@ -23091,16 +23091,16 @@ check_auto_cache_resize_disable(void) * is satisfied. We would see a decrease here if decrease were * possible. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i); + protect_entry1(cache_ptr, SMALL_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, SMALL_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -23112,8 +23112,8 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 26.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 26.\n"; } } @@ -23121,16 +23121,16 @@ check_auto_cache_resize_disable(void) /* force low hit rate -- cache size should increase from 4 to 6 Meg. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -23141,8 +23141,8 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 27.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 27.\n"; } } @@ -23153,16 +23153,16 @@ check_auto_cache_resize_disable(void) * Should be no change in cache size, and result should be * decrease_disabled. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -23174,8 +23174,8 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 28.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 28.\n"; } } @@ -23191,7 +23191,7 @@ check_auto_cache_resize_disable(void) * to 1.0. Test this now. */ - if ( pass ) { + if ( pass1 ) { auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; auto_size_ctl.rpt_fcn = test_rpt_fcn; @@ -23239,41 +23239,41 @@ check_auto_cache_resize_disable(void) if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 10.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 10.\n"; } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "bad cache size after set resize re-config 9.\n"; + pass1 = FALSE; + failure_mssg1 = "bad cache size after set resize re-config 9.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); /* flush the cache and destroy all entries so we start from a known point */ - flush_cache(cache_ptr, TRUE, FALSE, FALSE); + flush_cache1(cache_ptr, TRUE, FALSE, FALSE); if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); /* load up the cache with small entries. Note that it will take an * epoch for the ageout code to initialize itself if it is enabled. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i); + protect_entry1(cache_ptr, SMALL_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, SMALL_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -23285,8 +23285,8 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 29.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 29.\n"; } } @@ -23294,16 +23294,16 @@ check_auto_cache_resize_disable(void) /* Load up some more small entries. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 1000; - while ( ( pass ) && ( i < 2000 ) ) + while ( ( pass1 ) && ( i < 2000 ) ) { - protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i); + protect_entry1(cache_ptr, SMALL_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, SMALL_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -23315,8 +23315,8 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 30.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 30.\n"; } } @@ -23328,16 +23328,16 @@ check_auto_cache_resize_disable(void) * * rpt_status should be decrease_disabled. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i); + protect_entry1(cache_ptr, SMALL_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, SMALL_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -23351,8 +23351,8 @@ check_auto_cache_resize_disable(void) ( cache_ptr->index_len != 2000 ) || ( cache_ptr->index_size != 2000 * SMALL_ENTRY_SIZE ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 31.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 31.\n"; } } @@ -23360,16 +23360,16 @@ check_auto_cache_resize_disable(void) /* force low hit rate -- cache size should increase from 4 to 6 Meg. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -23380,8 +23380,8 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 32.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 32.\n"; } } @@ -23394,16 +23394,16 @@ check_auto_cache_resize_disable(void) * Should be no change in cache size, and result should be * decrease_disabled. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 999); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 999); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 999, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 999, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -23415,8 +23415,8 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 33.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 33.\n"; } } @@ -23430,7 +23430,7 @@ check_auto_cache_resize_disable(void) * check them all. *********************************************************************/ - if ( pass ) { + if ( pass1 ) { auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; auto_size_ctl.rpt_fcn = test_rpt_fcn; @@ -23478,18 +23478,18 @@ check_auto_cache_resize_disable(void) if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 11.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 11.\n"; } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "bad cache size after set resize re-config 10.\n"; + pass1 = FALSE; + failure_mssg1 = "bad cache size after set resize re-config 10.\n"; } } @@ -23498,16 +23498,16 @@ check_auto_cache_resize_disable(void) /* force low hit rate -- should be no response as the auto-resize * code should be disabled. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -23520,8 +23520,8 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 34.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 34.\n"; } } @@ -23530,16 +23530,16 @@ check_auto_cache_resize_disable(void) /* force high hit rate -- should be no response as the auto-resize * code should be disabled. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -23552,14 +23552,14 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 35.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 35.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - if ( pass ) { + if ( pass1 ) { auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; auto_size_ctl.rpt_fcn = test_rpt_fcn; @@ -23607,18 +23607,18 @@ check_auto_cache_resize_disable(void) if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 12.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 12.\n"; } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "bad cache size after set resize re-config 11.\n"; + pass1 = FALSE; + failure_mssg1 = "bad cache size after set resize re-config 11.\n"; } } @@ -23627,16 +23627,16 @@ check_auto_cache_resize_disable(void) /* force low hit rate -- should be no response as the auto-resize * code should be disabled. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -23649,8 +23649,8 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 36.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 36.\n"; } } @@ -23659,16 +23659,16 @@ check_auto_cache_resize_disable(void) /* force high hit rate -- should be no response as the auto-resize * code should be disabled. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -23681,14 +23681,14 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 37.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 37.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - if ( pass ) { + if ( pass1 ) { auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; auto_size_ctl.rpt_fcn = test_rpt_fcn; @@ -23736,18 +23736,18 @@ check_auto_cache_resize_disable(void) if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 13.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 13.\n"; } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "bad cache size after set resize re-config 12.\n"; + pass1 = FALSE; + failure_mssg1 = "bad cache size after set resize re-config 12.\n"; } } @@ -23756,16 +23756,16 @@ check_auto_cache_resize_disable(void) /* force low hit rate -- should be no response as the auto-resize * code should be disabled. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -23778,8 +23778,8 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 38.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 38.\n"; } } @@ -23788,16 +23788,16 @@ check_auto_cache_resize_disable(void) /* force high hit rate -- should be no response as the auto-resize * code should be disabled. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -23810,14 +23810,14 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 39.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 39.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - if ( pass ) { + if ( pass1 ) { auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; auto_size_ctl.rpt_fcn = test_rpt_fcn; @@ -23865,18 +23865,18 @@ check_auto_cache_resize_disable(void) if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 14.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 14.\n"; } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "bad cache size after set resize re-config 13.\n"; + pass1 = FALSE; + failure_mssg1 = "bad cache size after set resize re-config 13.\n"; } } @@ -23885,16 +23885,16 @@ check_auto_cache_resize_disable(void) /* force low hit rate -- should be no response as the auto-resize * code should be disabled. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -23907,8 +23907,8 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 40.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 40.\n"; } } @@ -23917,16 +23917,16 @@ check_auto_cache_resize_disable(void) /* force high hit rate -- should be no response as the auto-resize * code should be disabled. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -23939,14 +23939,14 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 41.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 41.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - if ( pass ) { + if ( pass1 ) { auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; auto_size_ctl.rpt_fcn = test_rpt_fcn; @@ -23995,18 +23995,18 @@ check_auto_cache_resize_disable(void) if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 15.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 15.\n"; } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "bad cache size after set resize re-config 14.\n"; + pass1 = FALSE; + failure_mssg1 = "bad cache size after set resize re-config 14.\n"; } } @@ -24015,16 +24015,16 @@ check_auto_cache_resize_disable(void) /* force low hit rate -- should be no response as the auto-resize * code should be disabled. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -24037,8 +24037,8 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 42.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 42.\n"; } } @@ -24047,16 +24047,16 @@ check_auto_cache_resize_disable(void) /* force high hit rate -- should be no response as the auto-resize * code should be disabled. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -24069,14 +24069,14 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 43.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 43.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - if ( pass ) { + if ( pass1 ) { auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; auto_size_ctl.rpt_fcn = test_rpt_fcn; @@ -24125,18 +24125,18 @@ check_auto_cache_resize_disable(void) if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 16.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 16.\n"; } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "bad cache size after set resize re-config 15.\n"; + pass1 = FALSE; + failure_mssg1 = "bad cache size after set resize re-config 15.\n"; } } @@ -24145,16 +24145,16 @@ check_auto_cache_resize_disable(void) /* force low hit rate -- should be no response as the auto-resize * code should be disabled. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -24167,8 +24167,8 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 44.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 44.\n"; } } @@ -24177,16 +24177,16 @@ check_auto_cache_resize_disable(void) /* force high hit rate -- should be no response as the auto-resize * code should be disabled. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -24199,8 +24199,8 @@ check_auto_cache_resize_disable(void) ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 45.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 45.\n"; } } @@ -24234,7 +24234,7 @@ check_auto_cache_resize_disable(void) */ - if ( pass ) { + if ( pass1 ) { auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; auto_size_ctl.rpt_fcn = test_rpt_fcn; @@ -24283,18 +24283,18 @@ check_auto_cache_resize_disable(void) if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 17.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 17.\n"; } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->max_cache_size != (64 * 1024) ) || ( cache_ptr->min_clean_size != (32 * 1024) ) ) { - pass = FALSE; - failure_mssg = "bad cache size after set resize re-config 16.\n"; + pass1 = FALSE; + failure_mssg1 = "bad cache size after set resize re-config 16.\n"; } } @@ -24302,15 +24302,15 @@ check_auto_cache_resize_disable(void) * size. Protect and unprotect an entry to allow the cache to evict * entries and get within bounds */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; - protect_entry(cache_ptr, LARGE_ENTRY_TYPE, 0); - unprotect_entry(cache_ptr, LARGE_ENTRY_TYPE, 0, + protect_entry1(cache_ptr, LARGE_ENTRY_TYPE, 0); + unprotect_entry1(cache_ptr, LARGE_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); - if ( ( pass ) && + if ( ( pass1 ) && ( ( ( cache_ptr->max_cache_size != (64 * 1024) ) || ( cache_ptr->min_clean_size != (32 * 1024) ) || ( cache_ptr->index_len != 1 ) || @@ -24328,8 +24328,8 @@ check_auto_cache_resize_disable(void) HDfprintf(stdout, "rpt_fcn_called = %ld.\n", (long)(rpt_fcn_called)); - pass = FALSE; - failure_mssg = "Unexpected cache size change results 46.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 46.\n"; } } @@ -24342,15 +24342,15 @@ check_auto_cache_resize_disable(void) * This finishes the additional tests needed for the flash cache * size increase code. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); - if ( ( pass ) && + if ( ( pass1 ) && ( ( ( cache_ptr->max_cache_size != (64 * 1024) ) || ( cache_ptr->min_clean_size != (32 * 1024) ) || ( cache_ptr->index_len != 1 ) || @@ -24368,26 +24368,26 @@ check_auto_cache_resize_disable(void) HDfprintf(stdout, "rpt_fcn_called = %ld.\n", (long)(rpt_fcn_called)); - pass = FALSE; - failure_mssg = "Unexpected cache size change results 47.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 47.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - if ( pass ) { + if ( pass1 ) { - takedown_cache(cache_ptr, FALSE, FALSE); + takedown_cache1(cache_ptr, FALSE, FALSE); } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) { + if ( ! pass1 ) { - HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + HDfprintf(stdout, "%s: failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } return; @@ -24469,36 +24469,36 @@ check_auto_cache_resize_epoch_markers(void) TESTING("automatic cache resize epoch marker management"); - pass = TRUE; + pass1 = TRUE; if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - if ( pass ) { + if ( pass1 ) { - reset_entries(); + reset_entries1(); - cache_ptr = setup_cache((size_t)(2 * 1024), + cache_ptr = setup_cache1((size_t)(2 * 1024), (size_t)(1 * 1024)); } - if ( pass ) { + if ( pass1 ) { result = H5C1_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 1.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 1.\n"; } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->max_cache_size != (512 * 1024) ) || ( cache_ptr->min_clean_size != (256 * 1024) ) ) { - pass = FALSE; - failure_mssg = "bad cache size after initialization.\n"; + pass1 = FALSE; + failure_mssg1 = "bad cache size after initialization.\n"; } } @@ -24508,7 +24508,7 @@ check_auto_cache_resize_epoch_markers(void) /* Now make sure that we are managing the epoch markers correctly. */ - if ( pass ) { + if ( pass1 ) { auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; auto_size_ctl.rpt_fcn = test_rpt_fcn; @@ -24556,18 +24556,18 @@ check_auto_cache_resize_epoch_markers(void) if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 2.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 2.\n"; } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "bad cache size after set resize re-config 1.\n"; + pass1 = FALSE; + failure_mssg1 = "bad cache size after set resize re-config 1.\n"; } } @@ -24577,25 +24577,25 @@ check_auto_cache_resize_epoch_markers(void) * active. Verify that this is true. */ - if ( pass ) { + if ( pass1 ) { if ( cache_ptr->epoch_markers_active != 0 ) { - pass = FALSE; - failure_mssg = "Unexpected # of epoch markers 1.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected # of epoch markers 1.\n"; } } - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i); + protect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, MEDIUM_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MEDIUM_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -24607,28 +24607,28 @@ check_auto_cache_resize_epoch_markers(void) ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) || ( cache_ptr->index_size != (1 * 1000 * MEDIUM_ENTRY_SIZE) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 0.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 0.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - if ( pass ) { + if ( pass1 ) { j = 2; - while ( ( pass ) && ( j <= 10 ) ) + while ( ( pass1 ) && ( j <= 10 ) ) { rpt_fcn_called = FALSE; i = (j - 2) * 1000; - while ( ( pass ) && ( i < (j - 1) * 1000 ) ) + while ( ( pass1 ) && ( i < (j - 1) * 1000 ) ) { - protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i); + protect_entry1(cache_ptr, SMALL_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, SMALL_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -24638,8 +24638,8 @@ check_auto_cache_resize_epoch_markers(void) ( rpt_status != in_spec ) || ( cache_ptr->epoch_markers_active != j ) ) { - pass = FALSE; - failure_mssg = "Unexpected # of epoch markers 2.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected # of epoch markers 2.\n"; } j++; @@ -24651,16 +24651,16 @@ check_auto_cache_resize_epoch_markers(void) /* we now have a full complement of epoch markers -- see if * we get the expected reduction. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 9000; - while ( ( pass ) && ( i < 10000 ) ) + while ( ( pass1 ) && ( i < 10000 ) ) { - protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i); + protect_entry1(cache_ptr, SMALL_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, SMALL_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -24675,8 +24675,8 @@ check_auto_cache_resize_epoch_markers(void) ( cache_ptr->index_size != (10 * 1000 * SMALL_ENTRY_SIZE + MEDIUM_ENTRY_SIZE) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 1.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 1.\n"; } } @@ -24685,7 +24685,7 @@ check_auto_cache_resize_epoch_markers(void) /* now reduce the epochs before eviction, and see if the cache * deletes the extra markers */ - if ( pass ) { + if ( pass1 ) { auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; auto_size_ctl.rpt_fcn = test_rpt_fcn; @@ -24733,18 +24733,18 @@ check_auto_cache_resize_epoch_markers(void) if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 3.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 3.\n"; } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "bad cache size after set resize re-config 2.\n"; + pass1 = FALSE; + failure_mssg1 = "bad cache size after set resize re-config 2.\n"; } } @@ -24752,12 +24752,12 @@ check_auto_cache_resize_epoch_markers(void) /* There should be exactly one active epoch marker at present. */ - if ( pass ) { + if ( pass1 ) { if ( cache_ptr->epoch_markers_active != 1 ) { - pass = FALSE; - failure_mssg = "Unexpected # of epoch markers 3.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected # of epoch markers 3.\n"; } } @@ -24765,16 +24765,16 @@ check_auto_cache_resize_epoch_markers(void) * not accessed in this epoch gets evicted, and the cache size * is reduced. */ - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 9000; - while ( ( pass ) && ( i < 10000 ) ) + while ( ( pass1 ) && ( i < 10000 ) ) { - protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i); + protect_entry1(cache_ptr, SMALL_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, SMALL_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -24786,8 +24786,8 @@ check_auto_cache_resize_epoch_markers(void) ( cache_ptr->min_clean_size != (256 * 1024) ) || ( cache_ptr->index_size != (1 * 1000 * SMALL_ENTRY_SIZE) ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 2.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 2.\n"; } } @@ -24795,19 +24795,19 @@ check_auto_cache_resize_epoch_markers(void) /* There should be exactly one active epoch marker at present... */ - if ( pass ) { + if ( pass1 ) { if ( cache_ptr->epoch_markers_active != 1 ) { - pass = FALSE; - failure_mssg = "Unexpected # of epoch markers 4.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected # of epoch markers 4.\n"; } } /* shift the decrement mode to threshold, and verify that we remove * all epoch markers. */ - if ( pass ) { + if ( pass1 ) { auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; auto_size_ctl.rpt_fcn = test_rpt_fcn; @@ -24855,29 +24855,29 @@ check_auto_cache_resize_epoch_markers(void) if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 4.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 4.\n"; } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - pass = FALSE; - failure_mssg = "bad cache size after set resize re-config 3.\n"; + pass1 = FALSE; + failure_mssg1 = "bad cache size after set resize re-config 3.\n"; } } /* ... and now there should be none. */ - if ( pass ) { + if ( pass1 ) { if ( cache_ptr->epoch_markers_active != 0 ) { - pass = FALSE; - failure_mssg = "Unexpected # of epoch markers 5.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected # of epoch markers 5.\n"; } } @@ -24886,7 +24886,7 @@ check_auto_cache_resize_epoch_markers(void) /* shift the decrement mode to age out with threshold. Set epochs * before eviction to 10 again. */ - if ( pass ) { + if ( pass1 ) { auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; auto_size_ctl.rpt_fcn = test_rpt_fcn; @@ -24934,39 +24934,39 @@ check_auto_cache_resize_epoch_markers(void) if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 5.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 5.\n"; } } /* Verify that there are no active epoch markers. */ - if ( pass ) { + if ( pass1 ) { if ( cache_ptr->epoch_markers_active != 0 ) { - pass = FALSE; - failure_mssg = "Unexpected # of epoch markers 6.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected # of epoch markers 6.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); /* build up a full set of epoch markers. */ - if ( pass ) { + if ( pass1 ) { j = 1; - while ( ( pass ) && ( j <= 10 ) ) + while ( ( pass1 ) && ( j <= 10 ) ) { rpt_fcn_called = FALSE; i = (j - 1) * 1000; - while ( ( pass ) && ( i < j * 1000 ) ) + while ( ( pass1 ) && ( i < j * 1000 ) ) { - protect_entry(cache_ptr, SMALL_ENTRY_TYPE, i); + protect_entry1(cache_ptr, SMALL_ENTRY_TYPE, i); - if ( pass ) { - unprotect_entry(cache_ptr, SMALL_ENTRY_TYPE, i, + if ( pass1 ) { + unprotect_entry1(cache_ptr, SMALL_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -24976,8 +24976,8 @@ check_auto_cache_resize_epoch_markers(void) ( rpt_status != in_spec ) || ( cache_ptr->epoch_markers_active != j ) ) { - pass = FALSE; - failure_mssg = "Unexpected # of epoch markers 7.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected # of epoch markers 7.\n"; } j++; @@ -24988,19 +24988,19 @@ check_auto_cache_resize_epoch_markers(void) /* Verify that there are now 10 active epoch markers. */ - if ( pass ) { + if ( pass1 ) { if ( cache_ptr->epoch_markers_active != 10 ) { - pass = FALSE; - failure_mssg = "Unexpected # of epoch markers 8.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected # of epoch markers 8.\n"; } } /* shift the decrement mode to off. This should cause all epoch * markers to be removed. */ - if ( pass ) { + if ( pass1 ) { auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; auto_size_ctl.rpt_fcn = test_rpt_fcn; @@ -25048,19 +25048,19 @@ check_auto_cache_resize_epoch_markers(void) if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 6.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 6.\n"; } } /* Verify that there are now no active epoch markers. */ - if ( pass ) { + if ( pass1 ) { if ( cache_ptr->epoch_markers_active != 0 ) { - pass = FALSE; - failure_mssg = "Unexpected # of epoch markers 9.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected # of epoch markers 9.\n"; } } @@ -25069,33 +25069,33 @@ check_auto_cache_resize_epoch_markers(void) /* verify that we still have the expected number of entries in the cache, * and that the cache is of the expected size. */ - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (4 * 1024 * 1024) )|| ( cache_ptr->index_size != (10 * 1000 * SMALL_ENTRY_SIZE) ) || ( cache_ptr->index_len != 10000 ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache size change results 3.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache size change results 3.\n"; } } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - if ( pass ) { + if ( pass1 ) { - takedown_cache(cache_ptr, FALSE, FALSE); + takedown_cache1(cache_ptr, FALSE, FALSE); } if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) { + if ( ! pass1 ) { - HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + HDfprintf(stdout, "%s: failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } return; @@ -25212,7 +25212,7 @@ check_auto_cache_resize_input_errs(void) TESTING("automatic cache resize input errors"); - pass = TRUE; + pass1 = TRUE; /* allocate a cache, and set a reference automatic cache control * configuration. Then feed H5C1_set_cache_auto_resize_config() @@ -25220,55 +25220,55 @@ check_auto_cache_resize_input_errs(void) * and that the configuration is not modified. */ - if ( pass ) { + if ( pass1 ) { - reset_entries(); + reset_entries1(); - cache_ptr = setup_cache((size_t)(2 * 1024), + cache_ptr = setup_cache1((size_t)(2 * 1024), (size_t)(1 * 1024)); } - if ( pass ) { + if ( pass1 ) { result = H5C1_set_cache_auto_resize_config(cache_ptr, &ref_auto_size_ctl); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 1.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 1.\n"; } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->max_cache_size != (512 * 1024) ) || ( cache_ptr->min_clean_size != (256 * 1024) ) ) { - pass = FALSE; - failure_mssg = "bad cache size after initialization.\n"; + pass1 = FALSE; + failure_mssg1 = "bad cache size after initialization.\n"; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_cache_auto_resize_config(cache_ptr, &test_auto_size_ctl); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_auto_resize_config failed 1."; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_auto_resize_config failed 1."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { - pass = FALSE; - failure_mssg = "Unexpected auto resize config 1."; + pass1 = FALSE; + failure_mssg1 = "Unexpected auto resize config 1."; } } - if ( pass ) { + if ( pass1 ) { invalid_auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; invalid_auto_size_ctl.rpt_fcn = NULL; @@ -25317,34 +25317,34 @@ check_auto_cache_resize_input_errs(void) if ( result != FAIL ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config accepted NULL cache_ptr.\n"; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_cache_auto_resize_config(cache_ptr, &test_auto_size_ctl); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_auto_resize_config failed 2."; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_auto_resize_config failed 2."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { - pass = FALSE; - failure_mssg = "Unexpected auto resize config 2."; + pass1 = FALSE; + failure_mssg1 = "Unexpected auto resize config 2."; } } /* check bad version rejection. */ - if ( pass ) { + if ( pass1 ) { invalid_auto_size_ctl.version = -1; /* INVALID */ invalid_auto_size_ctl.rpt_fcn = NULL; @@ -25393,34 +25393,34 @@ check_auto_cache_resize_input_errs(void) if ( result != FAIL ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config accepted bad version.\n"; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_cache_auto_resize_config(cache_ptr, &test_auto_size_ctl); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_auto_resize_config failed 3."; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_auto_resize_config failed 3."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { - pass = FALSE; - failure_mssg = "Unexpected auto resize config 3."; + pass1 = FALSE; + failure_mssg1 = "Unexpected auto resize config 3."; } } /* check bad initial size rejection */ - if ( pass ) { + if ( pass1 ) { invalid_auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; invalid_auto_size_ctl.rpt_fcn = NULL; @@ -25470,31 +25470,31 @@ check_auto_cache_resize_input_errs(void) if ( result != FAIL ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config accepted bad init size 1.\n"; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_cache_auto_resize_config(cache_ptr, &test_auto_size_ctl); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_auto_resize_config failed 4."; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_auto_resize_config failed 4."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { - pass = FALSE; - failure_mssg = "Unexpected auto resize config 4."; + pass1 = FALSE; + failure_mssg1 = "Unexpected auto resize config 4."; } } - if ( pass ) { + if ( pass1 ) { invalid_auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; invalid_auto_size_ctl.rpt_fcn = NULL; @@ -25544,34 +25544,34 @@ check_auto_cache_resize_input_errs(void) if ( result != FAIL ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config accepted bad init size 2.\n"; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_cache_auto_resize_config(cache_ptr, &test_auto_size_ctl); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_auto_resize_config failed 5."; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_auto_resize_config failed 5."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { - pass = FALSE; - failure_mssg = "Unexpected auto resize config 5."; + pass1 = FALSE; + failure_mssg1 = "Unexpected auto resize config 5."; } } /* test for invalid min clean fraction rejection. */ - if ( pass ) { + if ( pass1 ) { invalid_auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; invalid_auto_size_ctl.rpt_fcn = NULL; @@ -25620,31 +25620,31 @@ check_auto_cache_resize_input_errs(void) if ( result != FAIL ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config accepted bad min clean frac 1.\n"; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_cache_auto_resize_config(cache_ptr, &test_auto_size_ctl); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_auto_resize_config failed 6."; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_auto_resize_config failed 6."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { - pass = FALSE; - failure_mssg = "Unexpected auto resize config 6."; + pass1 = FALSE; + failure_mssg1 = "Unexpected auto resize config 6."; } } - if ( pass ) { + if ( pass1 ) { invalid_auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; invalid_auto_size_ctl.rpt_fcn = NULL; @@ -25693,34 +25693,34 @@ check_auto_cache_resize_input_errs(void) if ( result != FAIL ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config accepted bad min clean frac 2.\n"; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_cache_auto_resize_config(cache_ptr, &test_auto_size_ctl); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_auto_resize_config failed 7."; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_auto_resize_config failed 7."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { - pass = FALSE; - failure_mssg = "Unexpected auto resize config 7."; + pass1 = FALSE; + failure_mssg1 = "Unexpected auto resize config 7."; } } /* test for invalid max_size and/or min_size rejection */ - if ( pass ) { + if ( pass1 ) { invalid_auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; invalid_auto_size_ctl.rpt_fcn = NULL; @@ -25770,31 +25770,31 @@ check_auto_cache_resize_input_errs(void) if ( result != FAIL ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config accepted bad max_size.\n"; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_cache_auto_resize_config(cache_ptr, &test_auto_size_ctl); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_auto_resize_config failed 8."; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_auto_resize_config failed 8."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { - pass = FALSE; - failure_mssg = "Unexpected auto resize config 8."; + pass1 = FALSE; + failure_mssg1 = "Unexpected auto resize config 8."; } } - if ( pass ) { + if ( pass1 ) { invalid_auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; invalid_auto_size_ctl.rpt_fcn = NULL; @@ -25843,31 +25843,31 @@ check_auto_cache_resize_input_errs(void) if ( result != FAIL ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config accepted bad size pair.\n"; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_cache_auto_resize_config(cache_ptr, &test_auto_size_ctl); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_auto_resize_config failed 9."; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_auto_resize_config failed 9."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { - pass = FALSE; - failure_mssg = "Unexpected auto resize config 9."; + pass1 = FALSE; + failure_mssg1 = "Unexpected auto resize config 9."; } } - if ( pass ) { + if ( pass1 ) { invalid_auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; invalid_auto_size_ctl.rpt_fcn = NULL; @@ -25916,34 +25916,34 @@ check_auto_cache_resize_input_errs(void) if ( result != FAIL ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config accepted bad min_size.\n"; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_cache_auto_resize_config(cache_ptr, &test_auto_size_ctl); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_auto_resize_config failed 10."; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_auto_resize_config failed 10."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { - pass = FALSE; - failure_mssg = "Unexpected auto resize config 10."; + pass1 = FALSE; + failure_mssg1 = "Unexpected auto resize config 10."; } } /* test for invalid epoch_length rejection */ - if ( pass ) { + if ( pass1 ) { invalid_auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; invalid_auto_size_ctl.rpt_fcn = NULL; @@ -25992,31 +25992,31 @@ check_auto_cache_resize_input_errs(void) if ( result != FAIL ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config accepted bad epoch len 1.\n"; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_cache_auto_resize_config(cache_ptr, &test_auto_size_ctl); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_auto_resize_config failed 11."; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_auto_resize_config failed 11."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { - pass = FALSE; - failure_mssg = "Unexpected auto resize config 11."; + pass1 = FALSE; + failure_mssg1 = "Unexpected auto resize config 11."; } } - if ( pass ) { + if ( pass1 ) { invalid_auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; invalid_auto_size_ctl.rpt_fcn = NULL; @@ -26065,34 +26065,34 @@ check_auto_cache_resize_input_errs(void) if ( result != FAIL ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config accepted bad epoch len 2.\n"; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_cache_auto_resize_config(cache_ptr, &test_auto_size_ctl); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_auto_resize_config failed 12."; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_auto_resize_config failed 12."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { - pass = FALSE; - failure_mssg = "Unexpected auto resize config 12."; + pass1 = FALSE; + failure_mssg1 = "Unexpected auto resize config 12."; } } /* test for bad incr_mode rejection */ - if ( pass ) { + if ( pass1 ) { invalid_auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; invalid_auto_size_ctl.rpt_fcn = NULL; @@ -26142,31 +26142,31 @@ check_auto_cache_resize_input_errs(void) if ( result != FAIL ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config accepted bad incr_mode 1.\n"; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_cache_auto_resize_config(cache_ptr, &test_auto_size_ctl); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_auto_resize_config failed 13."; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_auto_resize_config failed 13."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { - pass = FALSE; - failure_mssg = "Unexpected auto resize config 13."; + pass1 = FALSE; + failure_mssg1 = "Unexpected auto resize config 13."; } } - if ( pass ) { + if ( pass1 ) { invalid_auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; invalid_auto_size_ctl.rpt_fcn = NULL; @@ -26216,34 +26216,34 @@ check_auto_cache_resize_input_errs(void) if ( result != FAIL ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config accepted bad incr_mode 2.\n"; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_cache_auto_resize_config(cache_ptr, &test_auto_size_ctl); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_auto_resize_config failed 14."; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_auto_resize_config failed 14."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { - pass = FALSE; - failure_mssg = "Unexpected auto resize config 14."; + pass1 = FALSE; + failure_mssg1 = "Unexpected auto resize config 14."; } } /* check for bad upper and/or lower threshold rejection */ - if ( pass ) { + if ( pass1 ) { invalid_auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; invalid_auto_size_ctl.rpt_fcn = NULL; @@ -26292,31 +26292,31 @@ check_auto_cache_resize_input_errs(void) if ( result != FAIL ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config accepted bad upper threshold.\n"; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_cache_auto_resize_config(cache_ptr, &test_auto_size_ctl); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_auto_resize_config failed 15."; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_auto_resize_config failed 15."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { - pass = FALSE; - failure_mssg = "Unexpected auto resize config 15."; + pass1 = FALSE; + failure_mssg1 = "Unexpected auto resize config 15."; } } - if ( pass ) { + if ( pass1 ) { invalid_auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; invalid_auto_size_ctl.rpt_fcn = NULL; @@ -26365,31 +26365,31 @@ check_auto_cache_resize_input_errs(void) if ( result != FAIL ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config accepted bad threshold pair.\n"; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_cache_auto_resize_config(cache_ptr, &test_auto_size_ctl); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_auto_resize_config failed 16."; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_auto_resize_config failed 16."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { - pass = FALSE; - failure_mssg = "Unexpected auto resize config 16."; + pass1 = FALSE; + failure_mssg1 = "Unexpected auto resize config 16."; } } - if ( pass ) { + if ( pass1 ) { invalid_auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; invalid_auto_size_ctl.rpt_fcn = NULL; @@ -26438,34 +26438,34 @@ check_auto_cache_resize_input_errs(void) if ( result != FAIL ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config accepted bad lower threshold.\n"; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_cache_auto_resize_config(cache_ptr, &test_auto_size_ctl); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_auto_resize_config failed 17."; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_auto_resize_config failed 17."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { - pass = FALSE; - failure_mssg = "Unexpected auto resize config 17."; + pass1 = FALSE; + failure_mssg1 = "Unexpected auto resize config 17."; } } /* test for bad increment rejection */ - if ( pass ) { + if ( pass1 ) { invalid_auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; invalid_auto_size_ctl.rpt_fcn = NULL; @@ -26515,34 +26515,34 @@ check_auto_cache_resize_input_errs(void) if ( result != FAIL ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config accepted bad increment.\n"; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_cache_auto_resize_config(cache_ptr, &test_auto_size_ctl); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_auto_resize_config failed 18."; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_auto_resize_config failed 18."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { - pass = FALSE; - failure_mssg = "Unexpected auto resize config 18."; + pass1 = FALSE; + failure_mssg1 = "Unexpected auto resize config 18."; } } /* test for bad flash_incr_mode rejection */ - if ( pass ) { + if ( pass1 ) { invalid_auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; invalid_auto_size_ctl.rpt_fcn = NULL; @@ -26592,33 +26592,33 @@ check_auto_cache_resize_input_errs(void) if ( result != FAIL ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config accepted bad flash_incr_mode.\n"; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_cache_auto_resize_config(cache_ptr, &test_auto_size_ctl); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_auto_resize_config failed 19."; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_auto_resize_config failed 19."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { - pass = FALSE; - failure_mssg = "Unexpected auto resize config 19."; + pass1 = FALSE; + failure_mssg1 = "Unexpected auto resize config 19."; } } /* test for bad flash_multiple rejection */ - if ( pass ) { + if ( pass1 ) { invalid_auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; invalid_auto_size_ctl.rpt_fcn = NULL; @@ -26668,31 +26668,31 @@ check_auto_cache_resize_input_errs(void) if ( result != FAIL ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config accepted bad flash_multiple(1).\n"; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_cache_auto_resize_config(cache_ptr, &test_auto_size_ctl); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_auto_resize_config failed 20."; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_auto_resize_config failed 20."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { - pass = FALSE; - failure_mssg = "Unexpected auto resize config 20."; + pass1 = FALSE; + failure_mssg1 = "Unexpected auto resize config 20."; } } - if ( pass ) { + if ( pass1 ) { invalid_auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; invalid_auto_size_ctl.rpt_fcn = NULL; @@ -26742,33 +26742,33 @@ check_auto_cache_resize_input_errs(void) if ( result != FAIL ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config accepted bad flash_multiple(2).\n"; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_cache_auto_resize_config(cache_ptr, &test_auto_size_ctl); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_auto_resize_config failed 21."; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_auto_resize_config failed 21."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { - pass = FALSE; - failure_mssg = "Unexpected auto resize config 21."; + pass1 = FALSE; + failure_mssg1 = "Unexpected auto resize config 21."; } } /* test for bad flash_threshold rejection */ - if ( pass ) { + if ( pass1 ) { invalid_auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; invalid_auto_size_ctl.rpt_fcn = NULL; @@ -26818,31 +26818,31 @@ check_auto_cache_resize_input_errs(void) if ( result != FAIL ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config accepted bad flash_threshold(1).\n"; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_cache_auto_resize_config(cache_ptr, &test_auto_size_ctl); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_auto_resize_config failed 22."; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_auto_resize_config failed 22."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { - pass = FALSE; - failure_mssg = "Unexpected auto resize config 22."; + pass1 = FALSE; + failure_mssg1 = "Unexpected auto resize config 22."; } } - if ( pass ) { + if ( pass1 ) { invalid_auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; invalid_auto_size_ctl.rpt_fcn = NULL; @@ -26892,33 +26892,33 @@ check_auto_cache_resize_input_errs(void) if ( result != FAIL ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config accepted bad flash_threshold(2).\n"; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_cache_auto_resize_config(cache_ptr, &test_auto_size_ctl); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_auto_resize_config failed 23."; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_auto_resize_config failed 23."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { - pass = FALSE; - failure_mssg = "Unexpected auto resize config 23."; + pass1 = FALSE; + failure_mssg1 = "Unexpected auto resize config 23."; } } /* test for bad decr_mode rejection */ - if ( pass ) { + if ( pass1 ) { invalid_auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; invalid_auto_size_ctl.rpt_fcn = NULL; @@ -26968,31 +26968,31 @@ check_auto_cache_resize_input_errs(void) if ( result != FAIL ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config accepted bad decr_mode 1.\n"; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_cache_auto_resize_config(cache_ptr, &test_auto_size_ctl); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_auto_resize_config failed 24."; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_auto_resize_config failed 24."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { - pass = FALSE; - failure_mssg = "Unexpected auto resize config 24."; + pass1 = FALSE; + failure_mssg1 = "Unexpected auto resize config 24."; } } - if ( pass ) { + if ( pass1 ) { invalid_auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; invalid_auto_size_ctl.rpt_fcn = NULL; @@ -27042,34 +27042,34 @@ check_auto_cache_resize_input_errs(void) if ( result != FAIL ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config accepted bad decr_mode 2.\n"; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_cache_auto_resize_config(cache_ptr, &test_auto_size_ctl); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_auto_resize_config failed 25."; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_auto_resize_config failed 25."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { - pass = FALSE; - failure_mssg = "Unexpected auto resize config 25."; + pass1 = FALSE; + failure_mssg1 = "Unexpected auto resize config 25."; } } /* check for bad decrement rejection */ - if ( pass ) { + if ( pass1 ) { invalid_auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; invalid_auto_size_ctl.rpt_fcn = NULL; @@ -27118,31 +27118,31 @@ check_auto_cache_resize_input_errs(void) if ( result != FAIL ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config accepted bad decrement 1.\n"; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_cache_auto_resize_config(cache_ptr, &test_auto_size_ctl); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_auto_resize_config failed 26."; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_auto_resize_config failed 26."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { - pass = FALSE; - failure_mssg = "Unexpected auto resize config 26."; + pass1 = FALSE; + failure_mssg1 = "Unexpected auto resize config 26."; } } - if ( pass ) { + if ( pass1 ) { invalid_auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; invalid_auto_size_ctl.rpt_fcn = NULL; @@ -27191,34 +27191,34 @@ check_auto_cache_resize_input_errs(void) if ( result != FAIL ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config accepted bad decrement 2.\n"; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_cache_auto_resize_config(cache_ptr, &test_auto_size_ctl); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_auto_resize_config failed 27."; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_auto_resize_config failed 27."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { - pass = FALSE; - failure_mssg = "Unexpected auto resize config 27."; + pass1 = FALSE; + failure_mssg1 = "Unexpected auto resize config 27."; } } /* check for rejection of bad epochs_before_eviction */ - if ( pass ) { + if ( pass1 ) { invalid_auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; invalid_auto_size_ctl.rpt_fcn = NULL; @@ -27267,30 +27267,30 @@ check_auto_cache_resize_input_errs(void) if ( result != FAIL ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config accepted bad epochs_before_eviction 1.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config accepted bad epochs_before_eviction 1.\n"; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_cache_auto_resize_config(cache_ptr, &test_auto_size_ctl); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_auto_resize_config failed 28."; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_auto_resize_config failed 28."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { - pass = FALSE; - failure_mssg = "Unexpected auto resize config 28."; + pass1 = FALSE; + failure_mssg1 = "Unexpected auto resize config 28."; } } - if ( pass ) { + if ( pass1 ) { invalid_auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; invalid_auto_size_ctl.rpt_fcn = NULL; @@ -27340,33 +27340,33 @@ check_auto_cache_resize_input_errs(void) if ( result != FAIL ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config accepted bad epochs_before_eviction 2.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config accepted bad epochs_before_eviction 2.\n"; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_cache_auto_resize_config(cache_ptr, &test_auto_size_ctl); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_auto_resize_config failed 29."; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_auto_resize_config failed 29."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { - pass = FALSE; - failure_mssg = "Unexpected auto resize config 29."; + pass1 = FALSE; + failure_mssg1 = "Unexpected auto resize config 29."; } } /* Check for bad apply_empty_reserve rejection */ - if ( pass ) { + if ( pass1 ) { invalid_auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; invalid_auto_size_ctl.rpt_fcn = NULL; @@ -27415,30 +27415,30 @@ check_auto_cache_resize_input_errs(void) if ( result != FAIL ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config accepted bad empty_reserve 1.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config accepted bad empty_reserve 1.\n"; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_cache_auto_resize_config(cache_ptr, &test_auto_size_ctl); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_auto_resize_config failed 30."; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_auto_resize_config failed 30."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { - pass = FALSE; - failure_mssg = "Unexpected auto resize config 30."; + pass1 = FALSE; + failure_mssg1 = "Unexpected auto resize config 30."; } } - if ( pass ) { + if ( pass1 ) { invalid_auto_size_ctl.version = H5C1__CURR_AUTO_SIZE_CTL_VER; invalid_auto_size_ctl.rpt_fcn = NULL; @@ -27488,26 +27488,26 @@ check_auto_cache_resize_input_errs(void) if ( result != FAIL ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config accepted bad empty_reserve 2.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config accepted bad empty_reserve 2.\n"; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_cache_auto_resize_config(cache_ptr, &test_auto_size_ctl); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_auto_resize_config failed 31."; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_auto_resize_config failed 31."; } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ ref_auto_size_ctl, FALSE) ) { - pass = FALSE; - failure_mssg = "Unexpected auto resize config 31."; + pass1 = FALSE; + failure_mssg1 = "Unexpected auto resize config 31."; } } @@ -27516,54 +27516,54 @@ check_auto_cache_resize_input_errs(void) * H5C1_get_cache_auto_resize_config invalid data. */ - if ( pass ) { + if ( pass1 ) { result = H5C1_get_cache_auto_resize_config(NULL, &test_auto_size_ctl); if ( result != FAIL ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_auto_resize_config accepted NULL cache_ptr.\n"; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_cache_auto_resize_config((H5C1_t *)&test_auto_size_ctl, &test_auto_size_ctl); if ( result != FAIL ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_auto_resize_config accepted bad cache_ptr.\n"; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_cache_auto_resize_config(cache_ptr, NULL); if ( result != FAIL ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_auto_resize_config accepted NULL config ptr.\n"; } } - if ( pass ) { + if ( pass1 ) { - takedown_cache(cache_ptr, FALSE, FALSE); + takedown_cache1(cache_ptr, FALSE, FALSE); } - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) { + if ( ! pass1 ) { - HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + HDfprintf(stdout, "%s: failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } return; @@ -27656,38 +27656,38 @@ check_auto_cache_resize_aux_fcns(void) TESTING("automatic cache resize auxilary functions"); - pass = TRUE; + pass1 = TRUE; /* allocate a cache, and then test the various auxilary functions. */ - if ( pass ) { + if ( pass1 ) { - reset_entries(); + reset_entries1(); - cache_ptr = setup_cache((size_t)(2 * 1024), + cache_ptr = setup_cache1((size_t)(2 * 1024), (size_t)(1 * 1024)); } - if ( pass ) { + if ( pass1 ) { result = H5C1_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_set_cache_auto_resize_config failed 1.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_set_cache_auto_resize_config failed 1.\n"; } } - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr->max_cache_size != (1 * 1024 * 1024) ) || ( cache_ptr->min_clean_size != (512 * 1024) ) ) { - pass = FALSE; - failure_mssg = "bad cache size after initialization.\n"; + pass1 = FALSE; + failure_mssg1 = "bad cache size after initialization.\n"; } } @@ -27695,173 +27695,173 @@ check_auto_cache_resize_aux_fcns(void) * H5C1_reset_cache_hit_rate_stats() pair. */ - if ( pass ) { + if ( pass1 ) { if ( ( H5C1_get_cache_hit_rate(NULL, &hit_rate) != FAIL ) || ( H5C1_get_cache_hit_rate(cache_ptr, NULL) != FAIL ) ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_hit_rate accepts bad params.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_hit_rate accepts bad params.\n"; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_cache_hit_rate(cache_ptr, &hit_rate); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_hit_rate failed.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_hit_rate failed.\n"; } else if ( hit_rate != 0.0 ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_hit_rate returned unexpected hit rate 1.\n"; } } - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, PICO_ENTRY_TYPE, i); + protect_entry1(cache_ptr, PICO_ENTRY_TYPE, i); - if ( pass ) { + if ( pass1 ) { - unprotect_entry(cache_ptr, PICO_ENTRY_TYPE, i, + unprotect_entry1(cache_ptr, PICO_ENTRY_TYPE, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_cache_hit_rate(cache_ptr, &hit_rate); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_hit_rate failed.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_hit_rate failed.\n"; } else if ( hit_rate != 0.0 ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_hit_rate returned unexpected hit rate 2.\n"; } else if ( ( cache_ptr->cache_accesses != 1000 ) || ( cache_ptr->cache_hits != 0 ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache hit rate stats.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache hit rate stats.\n"; } else if ( rpt_fcn_called ) { - pass = FALSE; - failure_mssg = "Report function called?.\n"; + pass1 = FALSE; + failure_mssg1 = "Report function called?.\n"; } } - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, PICO_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, PICO_ENTRY_TYPE, 0); - if ( pass ) { + if ( pass1 ) { - unprotect_entry(cache_ptr, PICO_ENTRY_TYPE, 0, + unprotect_entry1(cache_ptr, PICO_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_cache_hit_rate(cache_ptr, &hit_rate); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_hit_rate failed.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_hit_rate failed.\n"; } else if ( hit_rate != 0.5 ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_hit_rate returned unexpected hit rate 3.\n"; } else if ( ( cache_ptr->cache_accesses != 2000 ) || ( cache_ptr->cache_hits != 1000 ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache hit rate stats.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache hit rate stats.\n"; } else if ( rpt_fcn_called ) { - pass = FALSE; - failure_mssg = "Report function called?.\n"; + pass1 = FALSE; + failure_mssg1 = "Report function called?.\n"; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_reset_cache_hit_rate_stats(NULL); if ( result != FAIL ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_reset_cache_hit_rate_stats accepted NULL cache_ptr.\n"; } else if ( ( cache_ptr->cache_accesses != 2000 ) || ( cache_ptr->cache_hits != 1000 ) ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "Failed call to H5C1_reset_cache_hit_rate_stats altered stats?\n"; } } - if ( pass ) { + if ( pass1 ) { result = H5C1_reset_cache_hit_rate_stats(cache_ptr); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_reset_cache_hit_rate_stats failed.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_reset_cache_hit_rate_stats failed.\n"; } else if ( ( cache_ptr->cache_accesses != 0 ) || ( cache_ptr->cache_hits != 0 ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache hit rate stats.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache hit rate stats.\n"; } } - if ( pass ) { + if ( pass1 ) { rpt_fcn_called = FALSE; i = 0; - while ( ( pass ) && ( i < 1000 ) ) + while ( ( pass1 ) && ( i < 1000 ) ) { - protect_entry(cache_ptr, PICO_ENTRY_TYPE, i + 500); + protect_entry1(cache_ptr, PICO_ENTRY_TYPE, i + 500); - if ( pass ) { + if ( pass1 ) { - unprotect_entry(cache_ptr, PICO_ENTRY_TYPE, i + 500, + unprotect_entry1(cache_ptr, PICO_ENTRY_TYPE, i + 500, NO_CHANGE, H5C1__NO_FLAGS_SET); } i++; @@ -27869,31 +27869,31 @@ check_auto_cache_resize_aux_fcns(void) } - if ( pass ) { + if ( pass1 ) { result = H5C1_get_cache_hit_rate(cache_ptr, &hit_rate); if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_hit_rate failed.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_hit_rate failed.\n"; } else if ( hit_rate != 0.5 ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_hit_rate returned unexpected hit rate 4.\n"; } else if ( ( cache_ptr->cache_accesses != 1000 ) || ( cache_ptr->cache_hits != 500 ) ) { - pass = FALSE; - failure_mssg = "Unexpected cache hit rate stats.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected cache hit rate stats.\n"; } else if ( rpt_fcn_called ) { - pass = FALSE; - failure_mssg = "Report function called?.\n"; + pass1 = FALSE; + failure_mssg1 = "Report function called?.\n"; } } @@ -27904,19 +27904,19 @@ check_auto_cache_resize_aux_fcns(void) * H5C1_get_cache_size(). ***************************************************/ - if ( pass ) { + if ( pass1 ) { result = H5C1_get_cache_size(NULL, &max_size, &min_clean_size, &cur_size, &cur_num_entries); if ( result != FAIL ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_size accepted NULL cache_ptr.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_size accepted NULL cache_ptr.\n"; } } - if ( pass ) { + if ( pass1 ) { max_size = 0; min_clean_size = 0; @@ -27928,31 +27928,31 @@ check_auto_cache_resize_aux_fcns(void) if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_size failed 1.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_size failed 1.\n"; } else if ( max_size != (1 * 1024 * 1024) ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_size reports unexpected max_size 1.\n"; } else if ( min_clean_size != (512 * 1024) ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_size reports unexpected min_clean_size 1.\n"; } else if ( cur_size != (1500 * PICO_ENTRY_SIZE) ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_size reports unexpected cur_size 1.\n"; } else if ( cur_num_entries != 1500 ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_size reports unexpected cur_num_entries 1.\n"; } } @@ -27960,17 +27960,17 @@ check_auto_cache_resize_aux_fcns(void) /* read a larger entry so that cur_size and cur_num_entries will be * different. */ - if ( pass ) { + if ( pass1 ) { - protect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0); + protect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0); } - if ( pass ) { - unprotect_entry(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, + if ( pass1 ) { + unprotect_entry1(cache_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, H5C1__NO_FLAGS_SET); } - if ( pass ) { + if ( pass1 ) { max_size = 0; min_clean_size = 0; @@ -27982,37 +27982,37 @@ check_auto_cache_resize_aux_fcns(void) if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_size failed 2.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_size failed 2.\n"; } else if ( max_size != (1 * 1024 * 1024) ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_size reports unexpected max_size 2.\n"; } else if ( min_clean_size != (512 * 1024) ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_size reports unexpected min_clean_size 2.\n"; } else if ( cur_size != ((1500 * PICO_ENTRY_SIZE) + MONSTER_ENTRY_SIZE) ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_size reports unexpected cur_size 2.\n"; } else if ( cur_num_entries != 1501 ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_size reports unexpected cur_num_entries 2.\n"; } } - if ( pass ) { + if ( pass1 ) { max_size = 0; min_clean_size = 0; @@ -28023,26 +28023,26 @@ check_auto_cache_resize_aux_fcns(void) if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_size failed 3.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_size failed 3.\n"; } else if ( max_size != (1 * 1024 * 1024) ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_size reports unexpected max_size 3.\n"; } else if ( ( min_clean_size != 0 ) || ( cur_size != 0 ) || ( cur_num_entries != 0 ) ) { - pass = FALSE; - failure_mssg = "Phantom returns from H5C1_get_cache_size?\n"; + pass1 = FALSE; + failure_mssg1 = "Phantom returns from H5C1_get_cache_size?\n"; } } - if ( pass ) { + if ( pass1 ) { max_size = 0; min_clean_size = 0; @@ -28054,26 +28054,26 @@ check_auto_cache_resize_aux_fcns(void) if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_size failed 4.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_size failed 4.\n"; } else if ( min_clean_size != (512 * 1024) ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_size reports unexpected min_clean_size 4.\n"; } else if ( ( max_size != 0 ) || ( cur_size != 0 ) || ( cur_num_entries != 0 ) ) { - pass = FALSE; - failure_mssg = "Phantom returns from H5C1_get_cache_size?\n"; + pass1 = FALSE; + failure_mssg1 = "Phantom returns from H5C1_get_cache_size?\n"; } } - if ( pass ) { + if ( pass1 ) { max_size = 0; min_clean_size = 0; @@ -28084,27 +28084,27 @@ check_auto_cache_resize_aux_fcns(void) if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_size failed 5.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_size failed 5.\n"; } else if ( cur_size != ((1500 * PICO_ENTRY_SIZE) + MONSTER_ENTRY_SIZE) ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_size reports unexpected cur_size 5.\n"; } else if ( ( max_size != 0 ) || ( min_clean_size != 0 ) || ( cur_num_entries != 0 ) ) { - pass = FALSE; - failure_mssg = "Phantom returns from H5C1_get_cache_size?\n"; + pass1 = FALSE; + failure_mssg1 = "Phantom returns from H5C1_get_cache_size?\n"; } } - if ( pass ) { + if ( pass1 ) { max_size = 0; min_clean_size = 0; @@ -28116,36 +28116,36 @@ check_auto_cache_resize_aux_fcns(void) if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "H5C1_get_cache_size failed 6.\n"; + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_size failed 6.\n"; } else if ( cur_num_entries != 1501 ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5C1_get_cache_size reports unexpected cur_num_entries 2.\n"; } else if ( ( max_size != 0 ) || ( min_clean_size != 0 ) || ( cur_size != 0 ) ) { - pass = FALSE; - failure_mssg = "Phantom returns from H5C1_get_cache_size?\n"; + pass1 = FALSE; + failure_mssg1 = "Phantom returns from H5C1_get_cache_size?\n"; } } - if ( pass ) { + if ( pass1 ) { - takedown_cache(cache_ptr, FALSE, FALSE); + takedown_cache1(cache_ptr, FALSE, FALSE); } - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) { + if ( ! pass1 ) { - HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + HDfprintf(stdout, "%s: failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } return; @@ -28175,16 +28175,16 @@ main(void) { H5open(); - skip_long_tests = FALSE; + skip_long_tests1 = FALSE; #ifdef NDEBUG - run_full_test = TRUE; + run_full_test1 = TRUE; #else /* NDEBUG */ - run_full_test = FALSE; + run_full_test1 = FALSE; #endif /* NDEBUG */ #if 0 - run_full_test = TRUE; + run_full_test1 = TRUE; #endif #if 1 @@ -28200,15 +28200,15 @@ main(void) smoke_check_10(); #endif - write_permitted_check(); - check_insert_entry(); - check_flush_cache(); + write_permitted1_check(); + check_insert_entry1(); + check_flush_cache1(); check_get_entry_status(); - check_expunge_entry(); + check_expunge_entry1(); check_multiple_read_protect(); - check_rename_entry(); - check_pin_protected_entry(); - check_resize_entry(); + check_rename_entry1(); + check_pin_protected_entry1(); + check_resize_entry1(); check_evictions_enabled(); check_flush_protected_err(); check_destroy_pinned_err(); @@ -28221,8 +28221,8 @@ main(void) check_double_protect_err(); check_double_unprotect_err(); check_mark_entry_dirty_errs(); - check_expunge_entry_errs(); - check_resize_entry_errs(); + check_expunge_entry1_errs(); + check_resize_entry1_errs(); check_unprotect_ro_dirty_err(); check_protect_ro_rw_err(); check_check_evictions_enabled_err(); diff --git a/test/cache1_api.c b/test/cache1_api.c index 32e7bd2..8fe57ec 100644 --- a/test/cache1_api.c +++ b/test/cache1_api.c @@ -27,8 +27,8 @@ /* global variable declarations: */ -const char *FILENAME[] = { - "cache_api", +const char *FILENAME1[] = { + "cache1_api", NULL }; @@ -87,7 +87,7 @@ static void check_and_validate_cache_size(hid_t file_id, int32_t * cur_num_entries_ptr, hbool_t dump_data); -static void mdc_api_call_smoke_check(int express_test); +static void mdc_api_call_smoke_check(int express_test1); static void check_fapl_mdc_api_errs(void); @@ -240,7 +240,7 @@ check_fapl_mdc_api_calls(void) TESTING("MDC/FAPL related API calls"); - pass = TRUE; + pass1 = TRUE; XLATE_EXT_TO_INT_MDC_CONFIG(default_auto_size_ctl, default_config) XLATE_EXT_TO_INT_MDC_CONFIG(mod_auto_size_ctl, mod_config) @@ -249,18 +249,18 @@ check_fapl_mdc_api_calls(void) * initial mdc configuration */ - if ( pass ) { + if ( pass1 ) { fapl_id = H5Pcreate(H5P_FILE_ACCESS); if ( fapl_id < 0 ) { - pass = FALSE; - failure_mssg = "H5Pcreate(H5P_FILE_ACCESS) failed.\n"; + pass1 = FALSE; + failure_mssg1 = "H5Pcreate(H5P_FILE_ACCESS) failed.\n"; } } - if ( pass ) { + if ( pass1 ) { scratch.version = H5C1__CURR_AUTO_SIZE_CTL_VER; @@ -268,13 +268,13 @@ check_fapl_mdc_api_calls(void) if ( result < 0 ) { - pass = FALSE; - failure_mssg = "H5Pget_mdc_config() failed.\n"; + pass1 = FALSE; + failure_mssg1 = "H5Pget_mdc_config() failed.\n"; } else if (!CACHE_CONFIGS_EQUAL(default_config, scratch, TRUE, TRUE)) { - pass = FALSE; - failure_mssg = "retrieved config doesn't match default."; + pass1 = FALSE; + failure_mssg1 = "retrieved config doesn't match default."; } } @@ -283,18 +283,18 @@ check_fapl_mdc_api_calls(void) * the changes can be read back */ - if ( pass ) { + if ( pass1 ) { result = H5Pset_mdc_config(fapl_id, &mod_config); if ( result < 0 ) { - pass = FALSE; - failure_mssg = "H5Pset_mdc_config() failed.\n"; + pass1 = FALSE; + failure_mssg1 = "H5Pset_mdc_config() failed.\n"; } } - if ( pass ) { + if ( pass1 ) { scratch.version = H5C1__CURR_AUTO_SIZE_CTL_VER; @@ -302,22 +302,22 @@ check_fapl_mdc_api_calls(void) if ( result < 0 ) { - pass = FALSE; - failure_mssg = "H5Pget_mdc_config() failed.\n"; + pass1 = FALSE; + failure_mssg1 = "H5Pget_mdc_config() failed.\n"; } else if ( ! CACHE_CONFIGS_EQUAL(mod_config, scratch, TRUE, TRUE) ) { - pass = FALSE; - failure_mssg = "retrieved config doesn't match mod config."; + pass1 = FALSE; + failure_mssg1 = "retrieved config doesn't match mod config."; } } - if ( pass ) { + if ( pass1 ) { if ( H5Pclose(fapl_id) < 0 ) { - pass = FALSE; - failure_mssg = "H5Pclose() failed.\n"; + pass1 = FALSE; + failure_mssg1 = "H5Pclose() failed.\n"; } } @@ -329,84 +329,84 @@ check_fapl_mdc_api_calls(void) */ /* setup the file name */ - if ( pass ) { + if ( pass1 ) { - if ( h5_fixname(FILENAME[0], H5P_DEFAULT, filename, sizeof(filename)) + if ( h5_fixname(FILENAME1[0], H5P_DEFAULT, filename, sizeof(filename)) == NULL ) { - pass = FALSE; - failure_mssg = "h5_fixname() failed.\n"; + pass1 = FALSE; + failure_mssg1 = "h5_fixname() failed.\n"; } } /* create the file using the default FAPL */ - if ( pass ) { + if ( pass1 ) { file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); if ( file_id < 0 ) { - pass = FALSE; - failure_mssg = "H5Fcreate() failed.\n"; + pass1 = FALSE; + failure_mssg1 = "H5Fcreate() failed.\n"; } } /* get a pointer to the files internal data structure */ - if ( pass ) { + if ( pass1 ) { file_ptr = H5I_object_verify(file_id, H5I_FILE); if ( file_ptr == NULL ) { - pass = FALSE; - failure_mssg = "Can't get file_ptr.\n"; + pass1 = FALSE; + failure_mssg1 = "Can't get file_ptr.\n"; } else { - cache_ptr = file_ptr->shared->cache; + cache_ptr = file_ptr->shared->cache1; } } /* verify that we can access the internal version of the cache config */ - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr == NULL ) || ( cache_ptr->magic != H5C1__H5C1_T_MAGIC ) || ( cache_ptr->resize_ctl.version != H5C1__CURR_AUTO_SIZE_CTL_VER ) ){ - pass = FALSE; - failure_mssg = "Can't access cache resize_ctl.\n"; + pass1 = FALSE; + failure_mssg1 = "Can't access cache resize_ctl.\n"; } } /* conpare the cache's internal configuration with the expected value */ - if ( pass ) { + if ( pass1 ) { if ( ! RESIZE_CONFIGS_ARE_EQUAL(default_auto_size_ctl, \ cache_ptr->resize_ctl, TRUE) ) { - pass = FALSE; - failure_mssg = "Unexpected value(s) in cache resize_ctl.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected value(s) in cache resize_ctl.\n"; } } /* get a copy of the files FAPL */ - if ( pass ) { + if ( pass1 ) { fapl_id = H5Fget_access_plist(file_id); if ( fapl_id < 0 ) { - pass = FALSE; - failure_mssg = "H5Fget_access_plist() failed.\n"; + pass1 = FALSE; + failure_mssg1 = "H5Fget_access_plist() failed.\n"; } } /* compare the initial cache config from the copy of the file's FAPL * to the expected value. If all goes well, close the copy of the FAPL. */ - if ( pass ) { + if ( pass1 ) { scratch.version = H5C1__CURR_AUTO_SIZE_CTL_VER; @@ -414,33 +414,33 @@ check_fapl_mdc_api_calls(void) if ( result < 0 ) { - pass = FALSE; - failure_mssg = "H5Pget_mdc_config() failed.\n"; + pass1 = FALSE; + failure_mssg1 = "H5Pget_mdc_config() failed.\n"; } else if (!CACHE_CONFIGS_EQUAL(default_config, scratch, TRUE, TRUE)) { - pass = FALSE; - failure_mssg = "config retrieved from file doesn't match default."; + pass1 = FALSE; + failure_mssg1 = "config retrieved from file doesn't match default."; } else if ( H5Pclose(fapl_id) < 0 ) { - pass = FALSE; - failure_mssg = "H5Pclose() failed.\n"; + pass1 = FALSE; + failure_mssg1 = "H5Pclose() failed.\n"; } } /* close the file and delete it */ - if ( pass ) { + if ( pass1 ) { if ( H5Fclose(file_id) < 0 ) { - pass = FALSE; - failure_mssg = "H5Fclose() failed.\n"; + pass1 = FALSE; + failure_mssg1 = "H5Fclose() failed.\n"; } else if ( HDremove(filename) < 0 ) { - pass = FALSE; - failure_mssg = "HDremove() failed.\n"; + pass1 = FALSE; + failure_mssg1 = "HDremove() failed.\n"; } } @@ -453,109 +453,109 @@ check_fapl_mdc_api_calls(void) */ /* Create a FAPL */ - if ( pass ) { + if ( pass1 ) { fapl_id = H5Pcreate(H5P_FILE_ACCESS); if ( fapl_id < 0 ) { - pass = FALSE; - failure_mssg = "H5Pcreate(H5P_FILE_ACCESS) failed.\n"; + pass1 = FALSE; + failure_mssg1 = "H5Pcreate(H5P_FILE_ACCESS) failed.\n"; } } /* Modify the initial mdc configuration in the FAPL. */ - if ( pass ) { + if ( pass1 ) { result = H5Pset_mdc_config(fapl_id, &mod_config); if ( result < 0 ) { - pass = FALSE; - failure_mssg = "H5Pset_mdc_config() failed.\n"; + pass1 = FALSE; + failure_mssg1 = "H5Pset_mdc_config() failed.\n"; } } /* setup the file name */ - if ( pass ) { + if ( pass1 ) { - if ( h5_fixname(FILENAME[0], H5P_DEFAULT, filename, sizeof(filename)) + if ( h5_fixname(FILENAME1[0], H5P_DEFAULT, filename, sizeof(filename)) == NULL ) { - pass = FALSE; - failure_mssg = "h5_fixname() failed.\n"; + pass1 = FALSE; + failure_mssg1 = "h5_fixname() failed.\n"; } } /* create the file using the modified FAPL */ - if ( pass ) { + if ( pass1 ) { file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id); if ( file_id < 0 ) { - pass = FALSE; - failure_mssg = "H5Fcreate() failed.\n"; + pass1 = FALSE; + failure_mssg1 = "H5Fcreate() failed.\n"; } } /* get a pointer to the files internal data structure */ - if ( pass ) { + if ( pass1 ) { file_ptr = H5I_object_verify(file_id, H5I_FILE); if ( file_ptr == NULL ) { - pass = FALSE; - failure_mssg = "Can't get file_ptr.\n"; + pass1 = FALSE; + failure_mssg1 = "Can't get file_ptr.\n"; } else { - cache_ptr = file_ptr->shared->cache; + cache_ptr = file_ptr->shared->cache1; } } /* verify that we can access the internal version of the cache config */ - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr == NULL ) || ( cache_ptr->magic != H5C1__H5C1_T_MAGIC ) || ( cache_ptr->resize_ctl.version != H5C1__CURR_AUTO_SIZE_CTL_VER ) ){ - pass = FALSE; - failure_mssg = "Can't access cache resize_ctl.\n"; + pass1 = FALSE; + failure_mssg1 = "Can't access cache resize_ctl.\n"; } } /* conpare the cache's internal configuration with the expected value */ - if ( pass ) { + if ( pass1 ) { if ( ! RESIZE_CONFIGS_ARE_EQUAL(mod_auto_size_ctl, \ cache_ptr->resize_ctl, TRUE) ) { - pass = FALSE; - failure_mssg = "Unexpected value(s) in cache resize_ctl.\n"; + pass1 = FALSE; + failure_mssg1 = "Unexpected value(s) in cache resize_ctl.\n"; } } /* get a copy of the files FAPL */ - if ( pass ) { + if ( pass1 ) { test_fapl_id = H5Fget_access_plist(file_id); if ( test_fapl_id < 0 ) { - pass = FALSE; - failure_mssg = "H5Fget_access_plist() failed.\n"; + pass1 = FALSE; + failure_mssg1 = "H5Fget_access_plist() failed.\n"; } } /* compare the initial cache config from the copy of the file's FAPL * to the expected value. If all goes well, close the copy of the FAPL. */ - if ( pass ) { + if ( pass1 ) { scratch.version = H5C1__CURR_AUTO_SIZE_CTL_VER; @@ -563,51 +563,51 @@ check_fapl_mdc_api_calls(void) if ( result < 0 ) { - pass = FALSE; - failure_mssg = "H5Pget_mdc_config() failed.\n"; + pass1 = FALSE; + failure_mssg1 = "H5Pget_mdc_config() failed.\n"; } else if ( ! CACHE_CONFIGS_EQUAL(mod_config, scratch, TRUE, TRUE) ) { - pass = FALSE; - failure_mssg = "config retrieved from file doesn't match."; + pass1 = FALSE; + failure_mssg1 = "config retrieved from file doesn't match."; } else if ( H5Pclose(test_fapl_id) < 0 ) { - pass = FALSE; - failure_mssg = "H5Pclose() failed.\n"; + pass1 = FALSE; + failure_mssg1 = "H5Pclose() failed.\n"; } } /* close the fapl used to create the file */ - if ( pass ) { + if ( pass1 ) { if ( H5Pclose(fapl_id) < 0 ) { - pass = FALSE; - failure_mssg = "H5Pclose() failed.\n"; + pass1 = FALSE; + failure_mssg1 = "H5Pclose() failed.\n"; } } /* close the file and delete it */ - if ( pass ) { + if ( pass1 ) { if ( H5Fclose(file_id) < 0 ) { - pass = FALSE; - failure_mssg = "H5Fclose() failed.\n"; + pass1 = FALSE; + failure_mssg1 = "H5Fclose() failed.\n"; } else if ( HDremove(filename) < 0 ) { - pass = FALSE; - failure_mssg = "HDremove() failed.\n"; + pass1 = FALSE; + failure_mssg1 = "HDremove() failed.\n"; } } - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) - HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + if ( ! pass1 ) + HDfprintf(stdout, "%s: failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } /* check_fapl_mdc_api_calls() */ @@ -619,7 +619,7 @@ check_fapl_mdc_api_calls(void) * has both internal and external configuration matching * *config_ptr. * - * Do nothin on success. On failure, set pass to FALSE, and + * Do nothin on success. On failure, set pass1 to FALSE, and * load an error message into failue_mssg. Note that * failure_msg is assumed to be at least 128 bytes in length. * @@ -649,68 +649,68 @@ validate_mdc_config(hid_t file_id, XLATE_EXT_TO_INT_MDC_CONFIG(int_config, (*ext_config_ptr)) /* get a pointer to the files internal data structure */ - if ( pass ) { + if ( pass1 ) { file_ptr = H5I_object_verify(file_id, H5I_FILE); if ( file_ptr == NULL ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Can't get file_ptr #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } else { - cache_ptr = file_ptr->shared->cache; + cache_ptr = file_ptr->shared->cache1; } } /* verify that we can access the internal version of the cache config */ - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr == NULL ) || ( cache_ptr->magic != H5C1__H5C1_T_MAGIC ) || ( cache_ptr->resize_ctl.version != H5C1__CURR_AUTO_SIZE_CTL_VER ) ){ - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Can't access cache resize_ctl #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } } /* compare the cache's internal configuration with the expected value */ - if ( pass ) { + if ( pass1 ) { if ( ! RESIZE_CONFIGS_ARE_EQUAL(int_config, cache_ptr->resize_ctl, compare_init) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected internal config #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } } /* obtain external cache config */ - if ( pass ) { + if ( pass1 ) { scratch.version = H5AC1__CURR_CACHE_CONFIG_VERSION; if ( H5Fget_mdc_config(file_id, &scratch) < 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "H5Fget_mdc_config() failed #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } } - if ( pass ) { + if ( pass1 ) { /* Recall that in any configuration supplied by the cache * at run time, the set_initial_size field will always - * be FALSE, regardless of the value passed in. Thus we + * be FALSE, regardless of the value pass1ed in. Thus we * always presume that this field need not match that of * the supplied external configuration. * @@ -722,10 +722,10 @@ validate_mdc_config(hid_t file_id, if ( ! CACHE_CONFIGS_EQUAL((*ext_config_ptr), scratch, \ FALSE, compare_init) ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "Unexpected external config #%d.", test_num); - failure_mssg = msg; + failure_mssg1 = msg; } } @@ -906,7 +906,7 @@ check_file_mdc_api_calls(void) TESTING("MDC/FILE related API calls"); - pass = TRUE; + pass1 = TRUE; /* Open a file with the default FAPL. Verify that the cache is * configured as per the default both by looking at its internal @@ -917,25 +917,25 @@ check_file_mdc_api_calls(void) */ /* setup the file name */ - if ( pass ) { + if ( pass1 ) { - if ( h5_fixname(FILENAME[0], H5P_DEFAULT, filename, sizeof(filename)) + if ( h5_fixname(FILENAME1[0], H5P_DEFAULT, filename, sizeof(filename)) == NULL ) { - pass = FALSE; - failure_mssg = "h5_fixname() failed.\n"; + pass1 = FALSE; + failure_mssg1 = "h5_fixname() failed.\n"; } } /* create the file using the default FAPL */ - if ( pass ) { + if ( pass1 ) { file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); if ( file_id < 0 ) { - pass = FALSE; - failure_mssg = "H5Fcreate() failed.\n"; + pass1 = FALSE; + failure_mssg1 = "H5Fcreate() failed.\n"; } } @@ -943,12 +943,12 @@ check_file_mdc_api_calls(void) validate_mdc_config(file_id, &default_config, TRUE, 1); /* set alternate config 1 */ - if ( pass ) { + if ( pass1 ) { if ( H5Fset_mdc_config(file_id, &mod_config_1) < 0 ) { - pass = FALSE; - failure_mssg = "H5Fset_mdc_config() failed 1.\n"; + pass1 = FALSE; + failure_mssg1 = "H5Fset_mdc_config() failed 1.\n"; } } @@ -956,12 +956,12 @@ check_file_mdc_api_calls(void) validate_mdc_config(file_id, &mod_config_1, TRUE, 2); /* set alternate config 2 */ - if ( pass ) { + if ( pass1 ) { if ( H5Fset_mdc_config(file_id, &mod_config_2) < 0 ) { - pass = FALSE; - failure_mssg = "H5Fset_mdc_config() failed 2.\n"; + pass1 = FALSE; + failure_mssg1 = "H5Fset_mdc_config() failed 2.\n"; } } @@ -969,12 +969,12 @@ check_file_mdc_api_calls(void) validate_mdc_config(file_id, &mod_config_2, TRUE, 3); /* set alternate config 3 */ - if ( pass ) { + if ( pass1 ) { if ( H5Fset_mdc_config(file_id, &mod_config_3) < 0 ) { - pass = FALSE; - failure_mssg = "H5Fset_mdc_config() failed 3.\n"; + pass1 = FALSE; + failure_mssg1 = "H5Fset_mdc_config() failed 3.\n"; } } @@ -982,12 +982,12 @@ check_file_mdc_api_calls(void) validate_mdc_config(file_id, &mod_config_3, TRUE, 4); /* set alternate config 4 */ - if ( pass ) { + if ( pass1 ) { if ( H5Fset_mdc_config(file_id, &mod_config_4) < 0 ) { - pass = FALSE; - failure_mssg = "H5Fset_mdc_config() failed 4.\n"; + pass1 = FALSE; + failure_mssg1 = "H5Fset_mdc_config() failed 4.\n"; } } @@ -1000,17 +1000,17 @@ check_file_mdc_api_calls(void) * chance to do much yet. */ - if ( pass ) { + if ( pass1 ) { if ( H5Fget_mdc_hit_rate(file_id, &hit_rate) < 0 ) { - pass = FALSE; - failure_mssg = "H5Fget_mdc_hit_rate() failed 1.\n"; + pass1 = FALSE; + failure_mssg1 = "H5Fget_mdc_hit_rate() failed 1.\n"; } else if ( hit_rate != 0.0 ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5Fget_mdc_hit_rate() returned unexpected hit rate.\n"; } @@ -1024,20 +1024,20 @@ check_file_mdc_api_calls(void) #endif } - if ( pass ) { + if ( pass1 ) { if ( H5Fget_mdc_size(file_id, &max_size, &min_clean_size, &cur_size, &cur_num_entries) < 0 ) { - pass = FALSE; - failure_mssg = "H5Fget_mdc_size() failed 1.\n"; + pass1 = FALSE; + failure_mssg1 = "H5Fget_mdc_size() failed 1.\n"; } else if ( ( mod_config_4.initial_size != max_size ) || ( min_clean_size != (size_t) ((double)max_size * mod_config_4.min_clean_fraction) ) ) { - pass = FALSE; - failure_mssg = "H5Fget_mdc_size() returned unexpected value(s).\n"; + pass1 = FALSE; + failure_mssg1 = "H5Fget_mdc_size() returned unexpected value(s).\n"; } #if 0 /* this may be useful now and then -- keep it around */ @@ -1053,25 +1053,25 @@ check_file_mdc_api_calls(void) } /* close the file and delete it */ - if ( pass ) { + if ( pass1 ) { if ( H5Fclose(file_id) < 0 ) { - pass = FALSE; - failure_mssg = "H5Fclose() failed.\n"; + pass1 = FALSE; + failure_mssg1 = "H5Fclose() failed.\n"; } else if ( HDremove(filename) < 0 ) { - pass = FALSE; - failure_mssg = "HDremove() failed.\n"; + pass1 = FALSE; + failure_mssg1 = "HDremove() failed.\n"; } } - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) - HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + if ( ! pass1 ) + HDfprintf(stdout, "%s: failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } /* check_file_mdc_api_calls() */ @@ -1085,14 +1085,14 @@ check_file_mdc_api_calls(void) * * If the number of cache accesses exceeds the value provided * in the min_accesses parameter, and the hit rate is less than - * min_hit_rate, set pass to FALSE, and set failure_mssg to + * min_hit_rate, set pass1 to FALSE, and set failure_mssg1 to * a string indicating that hit rate was unexpectedly low. * * Return hit rate in *hit_rate_ptr, and print the data to * stdout if requested. * - * If an error is detected, set pass to FALSE, and set - * failure_mssg to an appropriate value. + * If an error is detected, set pass1 to FALSE, and set + * failure_mssg1 to an appropriate value. * * Return: void * @@ -1121,34 +1121,34 @@ check_and_validate_cache_hit_rate(hid_t file_id, H5C1_t * cache_ptr = NULL; /* get a pointer to the files internal data structure */ - if ( pass ) { + if ( pass1 ) { file_ptr = H5I_object_verify(file_id, H5I_FILE); if ( file_ptr == NULL ) { - pass = FALSE; - failure_mssg = "Can't get file_ptr."; + pass1 = FALSE; + failure_mssg1 = "Can't get file_ptr."; } else { - cache_ptr = file_ptr->shared->cache; + cache_ptr = file_ptr->shared->cache1; } } /* verify that we can access the cache data structure */ - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr == NULL ) || ( cache_ptr->magic != H5C1__H5C1_T_MAGIC ) ) { - pass = FALSE; - failure_mssg = "Can't access cache resize_ctl."; + pass1 = FALSE; + failure_mssg1 = "Can't access cache resize_ctl."; } } /* compare the cache's internal configuration with the expected value */ - if ( pass ) { + if ( pass1 ) { cache_hits = cache_ptr->cache_hits; cache_accesses = cache_ptr->cache_accesses; @@ -1166,47 +1166,47 @@ check_and_validate_cache_hit_rate(hid_t file_id, if ( result < 0 ) { - pass = FALSE; - failure_mssg = "H5Fget_mdc_hit_rate() failed."; + pass1 = FALSE; + failure_mssg1 = "H5Fget_mdc_hit_rate() failed."; } else if ( hit_rate != expected_hit_rate ) { - pass = FALSE; - failure_mssg = "unexpected hit rate."; + pass1 = FALSE; + failure_mssg1 = "unexpected hit rate."; } } - if ( pass ) { /* reset the hit rate */ + if ( pass1 ) { /* reset the hit rate */ result = H5Freset_mdc_hit_rate_stats(file_id); if ( result < 0 ) { - pass = FALSE; - failure_mssg = "H5Freset_mdc_hit_rate_stats() failed."; + pass1 = FALSE; + failure_mssg1 = "H5Freset_mdc_hit_rate_stats() failed."; } } /* set *hit_rate_ptr if appropriate */ - if ( ( pass ) && ( hit_rate_ptr != NULL ) ) { + if ( ( pass1 ) && ( hit_rate_ptr != NULL ) ) { *hit_rate_ptr = hit_rate; } /* dump data to stdout if requested */ - if ( ( pass ) && ( dump_data ) ) { + if ( ( pass1 ) && ( dump_data ) ) { HDfprintf(stdout, "cache_hits: %ld, cache_accesses: %ld, hit_rate: %lf\n", (long)cache_hits, (long)cache_accesses, hit_rate); } - if ( ( pass ) && + if ( ( pass1 ) && ( cache_accesses > min_accesses ) && ( hit_rate < min_hit_rate ) ) { - pass = FALSE; - failure_mssg = "Unexpectedly low hit rate."; + pass1 = FALSE; + failure_mssg1 = "Unexpectedly low hit rate."; } return; @@ -1225,8 +1225,8 @@ check_and_validate_cache_hit_rate(hid_t file_id, * parameters if these parameters are not NULL. Print the * data to stdout if requested. * - * If an error is detected, set pass to FALSE, and set - * failure_mssg to an appropriate value. + * If an error is detected, set pass1 to FALSE, and set + * failure_mssg1 to an appropriate value. * * Return: void * @@ -1260,34 +1260,34 @@ check_and_validate_cache_size(hid_t file_id, H5C1_t * cache_ptr = NULL; /* get a pointer to the files internal data structure */ - if ( pass ) { + if ( pass1 ) { file_ptr = H5I_object_verify(file_id, H5I_FILE); if ( file_ptr == NULL ) { - pass = FALSE; - failure_mssg = "Can't get file_ptr."; + pass1 = FALSE; + failure_mssg1 = "Can't get file_ptr."; } else { - cache_ptr = file_ptr->shared->cache; + cache_ptr = file_ptr->shared->cache1; } } /* verify that we can access the cache data structure */ - if ( pass ) { + if ( pass1 ) { if ( ( cache_ptr == NULL ) || ( cache_ptr->magic != H5C1__H5C1_T_MAGIC ) ) { - pass = FALSE; - failure_mssg = "Can't access cache data structure."; + pass1 = FALSE; + failure_mssg1 = "Can't access cache data structure."; } } /* compare the cache's internal configuration with the expected value */ - if ( pass ) { + if ( pass1 ) { expected_max_size = cache_ptr->max_cache_size; expected_min_clean_size = cache_ptr->min_clean_size; @@ -1302,44 +1302,44 @@ check_and_validate_cache_size(hid_t file_id, if ( result < 0 ) { - pass = FALSE; - failure_mssg = "H5Fget_mdc_size() failed."; + pass1 = FALSE; + failure_mssg1 = "H5Fget_mdc_size() failed."; } else if ( ( max_size != expected_max_size ) || ( min_clean_size != expected_min_clean_size ) || ( cur_size != expected_cur_size ) || ( cur_num_entries != (int)expected_cur_num_entries ) ) { - pass = FALSE; - failure_mssg = "H5Fget_mdc_size() returned unexpected value(s)."; + pass1 = FALSE; + failure_mssg1 = "H5Fget_mdc_size() returned unexpected value(s)."; } } /* return size values if requested */ - if ( ( pass ) && ( max_size_ptr != NULL ) ) { + if ( ( pass1 ) && ( max_size_ptr != NULL ) ) { *max_size_ptr = max_size; } - if ( ( pass ) && ( min_clean_size_ptr != NULL ) ) { + if ( ( pass1 ) && ( min_clean_size_ptr != NULL ) ) { *min_clean_size_ptr = min_clean_size; } - if ( ( pass ) && ( cur_size_ptr != NULL ) ) { + if ( ( pass1 ) && ( cur_size_ptr != NULL ) ) { *cur_size_ptr = cur_size; } - if ( ( pass ) && ( cur_num_entries_ptr != NULL ) ) { + if ( ( pass1 ) && ( cur_num_entries_ptr != NULL ) ) { *cur_num_entries_ptr = cur_num_entries; } /* dump data to stdout if requested */ - if ( ( pass ) && ( dump_data ) ) { + if ( ( pass1 ) && ( dump_data ) ) { HDfprintf(stdout, "max_sz: %ld, min_clean_sz: %ld, cur_sz: %ld, cur_ent: %ld\n", @@ -1376,7 +1376,7 @@ check_and_validate_cache_size(hid_t file_id, #define NUM_RANDOM_ACCESSES 200000 static void -mdc_api_call_smoke_check(int express_test) +mdc_api_call_smoke_check(int express_test1) { const char * fcn_name = "mdc_api_call_smoke_check()"; char filename[512]; @@ -1504,7 +1504,7 @@ mdc_api_call_smoke_check(int express_test) TESTING("MDC API smoke check"); - if ( express_test > 0 ) { + if ( express_test1 > 0 ) { SKIPPED(); @@ -1513,7 +1513,7 @@ mdc_api_call_smoke_check(int express_test) return; } - pass = TRUE; + pass1 = TRUE; /* Open a file with the default FAPL. Verify that the cache is * configured as per the default both by looking at its internal @@ -1525,31 +1525,31 @@ mdc_api_call_smoke_check(int express_test) /* setup the file name */ - if ( ( pass ) && ( report_progress ) ) { + if ( ( pass1 ) && ( report_progress ) ) { HDfprintf(stdout,"\nSetting up file ... "); HDfflush(stdout); } - if ( pass ) { + if ( pass1 ) { - if ( h5_fixname(FILENAME[0], H5P_DEFAULT, filename, sizeof(filename)) + if ( h5_fixname(FILENAME1[0], H5P_DEFAULT, filename, sizeof(filename)) == NULL ) { - pass = FALSE; - failure_mssg = "h5_fixname() failed.\n"; + pass1 = FALSE; + failure_mssg1 = "h5_fixname() failed.\n"; } } /* create the file using the default FAPL */ - if ( pass ) { + if ( pass1 ) { file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); if ( file_id < 0 ) { - pass = FALSE; - failure_mssg = "H5Fcreate() failed.\n"; + pass1 = FALSE; + failure_mssg1 = "H5Fcreate() failed.\n"; } } @@ -1557,19 +1557,19 @@ mdc_api_call_smoke_check(int express_test) validate_mdc_config(file_id, &default_config, TRUE, 1); /* set alternate config 1 */ - if ( pass ) { + if ( pass1 ) { if ( H5Fset_mdc_config(file_id, &mod_config_1) < 0 ) { - pass = FALSE; - failure_mssg = "H5Fset_mdc_config() failed 1.\n"; + pass1 = FALSE; + failure_mssg1 = "H5Fset_mdc_config() failed 1.\n"; } } /* verify that the cache is now set to the alternate config */ validate_mdc_config(file_id, &mod_config_1, TRUE, 2); - if ( ( pass ) && ( report_progress ) ) { + if ( ( pass1 ) && ( report_progress ) ) { HDfprintf(stdout,"Done.\n"); /* setting up file */ HDfflush(stdout); @@ -1578,17 +1578,17 @@ mdc_api_call_smoke_check(int express_test) /* create the datasets */ - if ( ( pass ) && ( report_progress ) ) { + if ( ( pass1 ) && ( report_progress ) ) { HDfprintf(stdout,"Creating datasets ... "); HDfflush(stdout); } - if ( pass ) { + if ( pass1 ) { i = 0; - while ( ( pass ) && ( i < NUM_DSETS ) ) + while ( ( pass1 ) && ( i < NUM_DSETS ) ) { /* create a dataspace for the chunked dataset */ dims[0] = DSET_SIZE; @@ -1597,15 +1597,15 @@ mdc_api_call_smoke_check(int express_test) if ( dataspace_id < 0 ) { - pass = FALSE; - failure_mssg = "H5Screate_simple() failed."; + pass1 = FALSE; + failure_mssg1 = "H5Screate_simple() failed."; } /* set the dataset creation plist to specify that the raw data is * to be partioned into 10X10 element chunks. */ - if ( pass ) { + if ( pass1 ) { chunk_size[0] = CHUNK_SIZE; chunk_size[1] = CHUNK_SIZE; @@ -1613,22 +1613,22 @@ mdc_api_call_smoke_check(int express_test) if ( properties < 0 ) { - pass = FALSE; - failure_mssg = "H5Pcreate() failed."; + pass1 = FALSE; + failure_mssg1 = "H5Pcreate() failed."; } } - if ( pass ) { + if ( pass1 ) { if ( H5Pset_chunk(properties, 2, chunk_size) < 0 ) { - pass = FALSE; - failure_mssg = "H5Pset_chunk() failed."; + pass1 = FALSE; + failure_mssg1 = "H5Pset_chunk() failed."; } } /* create the dataset */ - if ( pass ) { + if ( pass1 ) { sprintf(dset_name, "/dset%03d", i); dataset_ids[i] = H5Dcreate2(file_id, dset_name, H5T_STD_I32BE, @@ -1636,20 +1636,20 @@ mdc_api_call_smoke_check(int express_test) if ( dataset_ids[i] < 0 ) { - pass = FALSE; - failure_mssg = "H5Dcreate2() failed."; + pass1 = FALSE; + failure_mssg1 = "H5Dcreate2() failed."; } } /* get the file space ID */ - if ( pass ) { + if ( pass1 ) { filespace_ids[i] = H5Dget_space(dataset_ids[i]); if ( filespace_ids[i] < 0 ) { - pass = FALSE; - failure_mssg = "H5Dget_space() failed."; + pass1 = FALSE; + failure_mssg1 = "H5Dget_space() failed."; } } @@ -1658,7 +1658,7 @@ mdc_api_call_smoke_check(int express_test) } /* create the mem space to be used to read and write chunks */ - if ( pass ) { + if ( pass1 ) { dims[0] = CHUNK_SIZE; dims[1] = CHUNK_SIZE; @@ -1666,13 +1666,13 @@ mdc_api_call_smoke_check(int express_test) if ( memspace_id < 0 ) { - pass = FALSE; - failure_mssg = "H5Screate_simple() failed."; + pass1 = FALSE; + failure_mssg1 = "H5Screate_simple() failed."; } } /* select in memory hyperslab */ - if ( pass ) { + if ( pass1 ) { offset[0] = 0; /*offset of hyperslab in memory*/ offset[1] = 0; @@ -1683,12 +1683,12 @@ mdc_api_call_smoke_check(int express_test) if ( status < 0 ) { - pass = FALSE; - failure_mssg = "H5Sselect_hyperslab() failed."; + pass1 = FALSE; + failure_mssg1 = "H5Sselect_hyperslab() failed."; } } - if ( ( pass ) && ( report_progress ) ) { + if ( ( pass1 ) && ( report_progress ) ) { HDfprintf(stdout,"Done.\n"); HDfflush(stdout); @@ -1698,19 +1698,19 @@ mdc_api_call_smoke_check(int express_test) i = 0; progress_counter = 0; - if ( ( pass ) && ( report_progress ) ) { + if ( ( pass1 ) && ( report_progress ) ) { HDfprintf(stdout, "Initializing datasets "); HDfflush(stdout); } - while ( ( pass ) && ( i < DSET_SIZE ) ) + while ( ( pass1 ) && ( i < DSET_SIZE ) ) { j = 0; - while ( ( pass ) && ( j < DSET_SIZE ) ) + while ( ( pass1 ) && ( j < DSET_SIZE ) ) { m = 0; - while ( ( pass ) && ( m < NUM_DSETS ) ) + while ( ( pass1 ) && ( m < NUM_DSETS ) ) { /* initialize the slab */ for ( k = 0; k < CHUNK_SIZE; k++ ) @@ -1732,8 +1732,8 @@ mdc_api_call_smoke_check(int express_test) if ( status < 0 ) { - pass = FALSE; - failure_mssg = "disk H5Sselect_hyperslab() failed."; + pass1 = FALSE; + failure_mssg1 = "disk H5Sselect_hyperslab() failed."; } /* write the chunk to file */ @@ -1742,8 +1742,8 @@ mdc_api_call_smoke_check(int express_test) if ( status < 0 ) { - pass = FALSE; - failure_mssg = "H5Dwrite() failed."; + pass1 = FALSE; + failure_mssg1 = "H5Dwrite() failed."; } m++; } @@ -1759,7 +1759,7 @@ mdc_api_call_smoke_check(int express_test) * similarly, check cache size. */ - if ( ( pass ) && ( i % (DSET_SIZE / 4) == 0 ) ) { + if ( ( pass1 ) && ( i % (DSET_SIZE / 4) == 0 ) ) { check_and_validate_cache_hit_rate(file_id, NULL, dump_hit_rate, min_accesses, min_hit_rate); @@ -1770,7 +1770,7 @@ mdc_api_call_smoke_check(int express_test) i += CHUNK_SIZE; - if ( ( pass ) && ( report_progress ) ) { + if ( ( pass1 ) && ( report_progress ) ) { progress_counter += CHUNK_SIZE; @@ -1783,19 +1783,19 @@ mdc_api_call_smoke_check(int express_test) } } - if ( ( pass ) && ( report_progress ) ) { + if ( ( pass1 ) && ( report_progress ) ) { HDfprintf(stdout," Done.\n"); /* initializing data sets */ HDfflush(stdout); } /* set alternate config 2 */ - if ( pass ) { + if ( pass1 ) { if ( H5Fset_mdc_config(file_id, &mod_config_2) < 0 ) { - pass = FALSE; - failure_mssg = "H5Fset_mdc_config() failed 2.\n"; + pass1 = FALSE; + failure_mssg1 = "H5Fset_mdc_config() failed 2.\n"; } } @@ -1804,7 +1804,7 @@ mdc_api_call_smoke_check(int express_test) /* do random reads on all datasets */ - if ( ( pass ) && ( report_progress ) ) { + if ( ( pass1 ) && ( report_progress ) ) { HDfprintf(stdout, "Doing random reads on all datasets "); HDfflush(stdout); @@ -1812,7 +1812,7 @@ mdc_api_call_smoke_check(int express_test) n = 0; progress_counter = 0; - while ( ( pass ) && ( n < NUM_RANDOM_ACCESSES ) ) + while ( ( pass1 ) && ( n < NUM_RANDOM_ACCESSES ) ) { m = rand() % NUM_DSETS; i = (rand() % (DSET_SIZE / CHUNK_SIZE)) * CHUNK_SIZE; @@ -1828,25 +1828,25 @@ mdc_api_call_smoke_check(int express_test) if ( status < 0 ) { - pass = FALSE; - failure_mssg = "disk hyperslab create failed."; + pass1 = FALSE; + failure_mssg1 = "disk hyperslab create failed."; } /* read the chunk from file */ - if ( pass ) { + if ( pass1 ) { status = H5Dread(dataset_ids[m], H5T_NATIVE_INT, memspace_id, filespace_ids[m], H5P_DEFAULT, data_chunk); if ( status < 0 ) { - pass = FALSE; - failure_mssg = "disk hyperslab create failed."; + pass1 = FALSE; + failure_mssg1 = "disk hyperslab create failed."; } } /* validate the slab */ - if ( pass ) { + if ( pass1 ) { valid_chunk = TRUE; for ( k = 0; k < CHUNK_SIZE; k++ ) @@ -1875,8 +1875,8 @@ mdc_api_call_smoke_check(int express_test) if ( ! valid_chunk ) { #if 1 - pass = FALSE; - failure_mssg = "slab validation failed."; + pass1 = FALSE; + failure_mssg1 = "slab validation failed."; #else /* as above */ fprintf(stdout, "Chunk (%0d, %0d) in /dset%03d is invalid.\n", i, j, m); @@ -1884,7 +1884,7 @@ mdc_api_call_smoke_check(int express_test) } } - if ( ( pass ) && ( n % (NUM_RANDOM_ACCESSES / 4) == 0 ) ) { + if ( ( pass1 ) && ( n % (NUM_RANDOM_ACCESSES / 4) == 0 ) ) { check_and_validate_cache_hit_rate(file_id, NULL, dump_hit_rate, min_accesses, min_hit_rate); @@ -1895,7 +1895,7 @@ mdc_api_call_smoke_check(int express_test) n++; - if ( ( pass ) && ( report_progress ) ) { + if ( ( pass1 ) && ( report_progress ) ) { progress_counter++; @@ -1908,7 +1908,7 @@ mdc_api_call_smoke_check(int express_test) } } - if ( ( pass ) && ( report_progress ) ) { + if ( ( pass1 ) && ( report_progress ) ) { HDfprintf(stdout, " Done.\n"); /* random reads on all data sets */ HDfflush(stdout); @@ -1917,12 +1917,12 @@ mdc_api_call_smoke_check(int express_test) /* close the file spaces we are done with */ i = 1; - while ( ( pass ) && ( i < NUM_DSETS ) ) + while ( ( pass1 ) && ( i < NUM_DSETS ) ) { if ( H5Sclose(filespace_ids[i]) < 0 ) { - pass = FALSE; - failure_mssg = "H5Sclose() failed."; + pass1 = FALSE; + failure_mssg1 = "H5Sclose() failed."; } i++; } @@ -1930,23 +1930,23 @@ mdc_api_call_smoke_check(int express_test) /* close the datasets we are done with */ i = 1; - while ( ( pass ) && ( i < NUM_DSETS ) ) + while ( ( pass1 ) && ( i < NUM_DSETS ) ) { if ( H5Dclose(dataset_ids[i]) < 0 ) { - pass = FALSE; - failure_mssg = "H5Dclose() failed."; + pass1 = FALSE; + failure_mssg1 = "H5Dclose() failed."; } i++; } /* set alternate config 3 */ - if ( pass ) { + if ( pass1 ) { if ( H5Fset_mdc_config(file_id, &mod_config_3) < 0 ) { - pass = FALSE; - failure_mssg = "H5Fset_mdc_config() failed 3.\n"; + pass1 = FALSE; + failure_mssg1 = "H5Fset_mdc_config() failed 3.\n"; } } @@ -1955,7 +1955,7 @@ mdc_api_call_smoke_check(int express_test) /* do random reads on data set 0 only */ - if ( ( pass ) && ( report_progress ) ) { + if ( ( pass1 ) && ( report_progress ) ) { HDfprintf(stdout, "Doing random reads on dataset 0 "); HDfflush(stdout); @@ -1964,7 +1964,7 @@ mdc_api_call_smoke_check(int express_test) m = 0; n = 0; progress_counter = 0; - while ( ( pass ) && ( n < NUM_RANDOM_ACCESSES ) ) + while ( ( pass1 ) && ( n < NUM_RANDOM_ACCESSES ) ) { i = (rand() % (DSET_SIZE / CHUNK_SIZE)) * CHUNK_SIZE; j = (rand() % (DSET_SIZE / CHUNK_SIZE)) * CHUNK_SIZE; @@ -1979,25 +1979,25 @@ mdc_api_call_smoke_check(int express_test) if ( status < 0 ) { - pass = FALSE; - failure_mssg = "disk hyperslab create failed."; + pass1 = FALSE; + failure_mssg1 = "disk hyperslab create failed."; } /* read the chunk from file */ - if ( pass ) { + if ( pass1 ) { status = H5Dread(dataset_ids[m], H5T_NATIVE_INT, memspace_id, filespace_ids[m], H5P_DEFAULT, data_chunk); if ( status < 0 ) { - pass = FALSE; - failure_mssg = "disk hyperslab create failed."; + pass1 = FALSE; + failure_mssg1 = "disk hyperslab create failed."; } } /* validate the slab */ - if ( pass ) { + if ( pass1 ) { valid_chunk = TRUE; for ( k = 0; k < CHUNK_SIZE; k++ ) @@ -2022,8 +2022,8 @@ mdc_api_call_smoke_check(int express_test) if ( ! valid_chunk ) { - pass = FALSE; - failure_mssg = "slab validation failed."; + pass1 = FALSE; + failure_mssg1 = "slab validation failed."; #if 0 /* as above */ fprintf(stdout, "Chunk (%0d, %0d) in /dset%03d is invalid.\n", i, j, m); @@ -2031,7 +2031,7 @@ mdc_api_call_smoke_check(int express_test) } } - if ( ( pass ) && ( n % (NUM_RANDOM_ACCESSES / 4) == 0 ) ) { + if ( ( pass1 ) && ( n % (NUM_RANDOM_ACCESSES / 4) == 0 ) ) { check_and_validate_cache_hit_rate(file_id, NULL, dump_hit_rate, min_accesses, min_hit_rate); @@ -2042,7 +2042,7 @@ mdc_api_call_smoke_check(int express_test) n++; - if ( ( pass ) && ( report_progress ) ) { + if ( ( pass1 ) && ( report_progress ) ) { progress_counter++; @@ -2055,14 +2055,14 @@ mdc_api_call_smoke_check(int express_test) } } - if ( ( pass ) && ( report_progress ) ) { + if ( ( pass1 ) && ( report_progress ) ) { HDfprintf(stdout, " Done.\n"); /* random reads data set 0 */ HDfflush(stdout); } - if ( ( pass ) && ( report_progress ) ) { + if ( ( pass1 ) && ( report_progress ) ) { HDfprintf(stdout,"Shutting down ... "); HDfflush(stdout); @@ -2070,73 +2070,73 @@ mdc_api_call_smoke_check(int express_test) /* close file space 0 */ - if ( pass ) { + if ( pass1 ) { if ( H5Sclose(filespace_ids[0]) < 0 ) { - pass = FALSE; - failure_mssg = "H5Sclose(filespace_ids[0]) failed."; + pass1 = FALSE; + failure_mssg1 = "H5Sclose(filespace_ids[0]) failed."; } } /* close the data space */ - if ( pass ) { + if ( pass1 ) { if ( H5Sclose(dataspace_id) < 0 ) { - pass = FALSE; - failure_mssg = "H5Sclose(dataspace) failed."; + pass1 = FALSE; + failure_mssg1 = "H5Sclose(dataspace) failed."; } } /* close the mem space */ - if ( pass ) { + if ( pass1 ) { if ( H5Sclose(memspace_id) < 0 ) { - pass = FALSE; - failure_mssg = "H5Sclose(memspace_id) failed."; + pass1 = FALSE; + failure_mssg1 = "H5Sclose(memspace_id) failed."; } } /* close dataset 0 */ - if ( pass ) { + if ( pass1 ) { if ( H5Dclose(dataset_ids[0]) < 0 ) { - pass = FALSE; - failure_mssg = "H5Dclose(dataset_ids[0]) failed."; + pass1 = FALSE; + failure_mssg1 = "H5Dclose(dataset_ids[0]) failed."; } } /* close the file and delete it */ - if ( pass ) { + if ( pass1 ) { if ( H5Fclose(file_id) < 0 ) { - pass = FALSE; - failure_mssg = "H5Fclose() failed.\n"; + pass1 = FALSE; + failure_mssg1 = "H5Fclose() failed.\n"; } else if ( HDremove(filename) < 0 ) { - pass = FALSE; - failure_mssg = "HDremove() failed.\n"; + pass1 = FALSE; + failure_mssg1 = "HDremove() failed.\n"; } } - if ( ( pass ) && ( report_progress ) ) { + if ( ( pass1 ) && ( report_progress ) ) { HDfprintf(stdout,"Done.\n"); /* shutting down */ HDfflush(stdout); } - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) - HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + if ( ! pass1 ) + HDfprintf(stdout, "%s: failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } /* mdc_api_call_smoke_check() */ @@ -3534,21 +3534,21 @@ check_fapl_mdc_api_errs(void) TESTING("MDC/FAPL related API input errors"); - pass = TRUE; + pass1 = TRUE; /* first test H5Pget_mdc_config(). */ scratch.version = H5C1__CURR_AUTO_SIZE_CTL_VER; - if ( pass ) { + if ( pass1 ) { H5E_BEGIN_TRY { result = H5Pget_mdc_config(-1, &scratch); } H5E_END_TRY; if ( result >= 0 ) { - pass = FALSE; - failure_mssg = "H5Pget_mdc_config() accepted invalid plist_id."; + pass1 = FALSE; + failure_mssg1 = "H5Pget_mdc_config() accepted invalid plist_id."; } } @@ -3556,27 +3556,27 @@ check_fapl_mdc_api_errs(void) * default MDC configuration. */ - if ( pass ) { + if ( pass1 ) { fapl_id = H5Pcreate(H5P_FILE_ACCESS); if ( fapl_id < 0 ) { - pass = FALSE; - failure_mssg = "H5Pcreate(H5P_FILE_ACCESS) failed.\n"; + pass1 = FALSE; + failure_mssg1 = "H5Pcreate(H5P_FILE_ACCESS) failed.\n"; } } scratch.version = H5C1__CURR_AUTO_SIZE_CTL_VER; - if ( ( pass ) && + if ( ( pass1 ) && ( ( H5Pget_mdc_config(fapl_id, &scratch) < 0 ) || ( !CACHE_CONFIGS_EQUAL(default_config, scratch, TRUE, TRUE) ) ) ) { - pass = FALSE; - failure_mssg = "New FAPL has unexpected metadata cache config?!?!?.\n"; + pass1 = FALSE; + failure_mssg1 = "New FAPL has unexpected metadata cache config?!?!?.\n"; } - if ( pass ) { + if ( pass1 ) { H5E_BEGIN_TRY { result = H5Pget_mdc_config(fapl_id, NULL); @@ -3584,15 +3584,15 @@ check_fapl_mdc_api_errs(void) if ( result >= 0 ) { - pass = FALSE; - failure_mssg = "H5Pget_mdc_config() accepted NULL config_ptr."; + pass1 = FALSE; + failure_mssg1 = "H5Pget_mdc_config() accepted NULL config_ptr."; } } /* one last test for H5Pget_mdc_config() */ scratch.version = -1; /* a convenient, invalid value */ - if ( pass ) { + if ( pass1 ) { H5E_BEGIN_TRY { result = H5Pget_mdc_config(fapl_id, &scratch); @@ -3600,8 +3600,8 @@ check_fapl_mdc_api_errs(void) if ( result >= 0 ) { - pass = FALSE; - failure_mssg = "H5Pget_mdc_config() accepted bad config version."; + pass1 = FALSE; + failure_mssg1 = "H5Pget_mdc_config() accepted bad config version."; } } @@ -3610,7 +3610,7 @@ check_fapl_mdc_api_errs(void) */ scratch.version = H5C1__CURR_AUTO_SIZE_CTL_VER; - if ( pass ) { + if ( pass1 ) { H5E_BEGIN_TRY { result = H5Pset_mdc_config(-1, &default_config); @@ -3618,12 +3618,12 @@ check_fapl_mdc_api_errs(void) if ( result >= 0 ) { - pass = FALSE; - failure_mssg = "H5Pset_mdc_config() accepted bad invalid plist_id."; + pass1 = FALSE; + failure_mssg1 = "H5Pset_mdc_config() accepted bad invalid plist_id."; } } - if ( pass ) { + if ( pass1 ) { H5E_BEGIN_TRY { result = H5Pset_mdc_config(fapl_id, NULL); @@ -3631,13 +3631,13 @@ check_fapl_mdc_api_errs(void) if ( result >= 0 ) { - pass = FALSE; - failure_mssg = "H5Pset_mdc_config() accepted NULL config_ptr."; + pass1 = FALSE; + failure_mssg1 = "H5Pset_mdc_config() accepted NULL config_ptr."; } } i = 0; - while ( ( pass ) && ( i < NUM_INVALID_CONFIGS ) ) + while ( ( pass1 ) && ( i < NUM_INVALID_CONFIGS ) ) { H5E_BEGIN_TRY { result = H5Pset_mdc_config(fapl_id, &(invalid_configs[i])); @@ -3645,10 +3645,10 @@ check_fapl_mdc_api_errs(void) if ( result >= 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "H5Pset_mdc_config() accepted invalid_configs[%d].", i); - failure_mssg = msg; + failure_mssg1 = msg; } i++; } @@ -3657,19 +3657,19 @@ check_fapl_mdc_api_errs(void) * the configuration in the FAPL. */ scratch.version = H5C1__CURR_AUTO_SIZE_CTL_VER; - if ( ( pass ) && + if ( ( pass1 ) && ( ( H5Pget_mdc_config(fapl_id, &scratch) < 0 ) || ( !CACHE_CONFIGS_EQUAL(default_config, scratch, TRUE, TRUE) ) ) ) { - pass = FALSE; - failure_mssg = "FAPL metadata cache config changed???.\n"; + pass1 = FALSE; + failure_mssg1 = "FAPL metadata cache config changed???.\n"; } - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) - HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + if ( ! pass1 ) + HDfprintf(stdout, "%s: failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } /* check_fapl_mdc_api_errs() */ @@ -3710,29 +3710,29 @@ check_file_mdc_api_errs(void) TESTING("MDC/FILE related API input errors"); - pass = TRUE; + pass1 = TRUE; /* Create a file for test purposes, and veify that its metadata cache * set to the default MDC configuration. */ /* setup the file name */ - if ( pass ) { + if ( pass1 ) { if ( show_progress ) { HDfprintf(stdout, "%s: calling h5_fixname().\n", fcn_name); } - if ( h5_fixname(FILENAME[0], H5P_DEFAULT, filename, sizeof(filename)) + if ( h5_fixname(FILENAME1[0], H5P_DEFAULT, filename, sizeof(filename)) == NULL ) { - pass = FALSE; - failure_mssg = "h5_fixname() failed.\n"; + pass1 = FALSE; + failure_mssg1 = "h5_fixname() failed.\n"; } } - if ( pass ) { + if ( pass1 ) { if ( show_progress ) { @@ -3743,8 +3743,8 @@ check_file_mdc_api_errs(void) if ( file_id < 0 ) { - pass = FALSE; - failure_mssg = "H5Fcreate() failed.\n"; + pass1 = FALSE; + failure_mssg1 = "H5Fcreate() failed.\n"; } } @@ -3754,7 +3754,7 @@ check_file_mdc_api_errs(void) /* test H5Fget_mdc_config(). */ scratch.version = H5C1__CURR_AUTO_SIZE_CTL_VER; - if ( pass ) { + if ( pass1 ) { if ( show_progress ) { @@ -3767,12 +3767,12 @@ check_file_mdc_api_errs(void) if ( result >= 0 ) { - pass = FALSE; - failure_mssg = "H5Fget_mdc_config() accepted invalid file_id."; + pass1 = FALSE; + failure_mssg1 = "H5Fget_mdc_config() accepted invalid file_id."; } } - if ( pass ) { + if ( pass1 ) { if ( show_progress ) { @@ -3785,13 +3785,13 @@ check_file_mdc_api_errs(void) if ( result >= 0 ) { - pass = FALSE; - failure_mssg = "H5Fget_mdc_config() accepted NULL config_ptr."; + pass1 = FALSE; + failure_mssg1 = "H5Fget_mdc_config() accepted NULL config_ptr."; } } scratch.version = -1; /* a convenient, invalid value */ - if ( pass ) { + if ( pass1 ) { if ( show_progress ) { @@ -3804,8 +3804,8 @@ check_file_mdc_api_errs(void) if ( result >= 0 ) { - pass = FALSE; - failure_mssg = "H5Fget_mdc_config() accepted bad config version."; + pass1 = FALSE; + failure_mssg1 = "H5Fget_mdc_config() accepted bad config version."; } } @@ -3813,7 +3813,7 @@ check_file_mdc_api_errs(void) /* test H5Fset_mdc_config() */ scratch.version = H5C1__CURR_AUTO_SIZE_CTL_VER; - if ( pass ) { + if ( pass1 ) { if ( show_progress ) { @@ -3826,12 +3826,12 @@ check_file_mdc_api_errs(void) if ( result >= 0 ) { - pass = FALSE; - failure_mssg = "H5Fset_mdc_config() accepted bad invalid file_id."; + pass1 = FALSE; + failure_mssg1 = "H5Fset_mdc_config() accepted bad invalid file_id."; } } - if ( pass ) { + if ( pass1 ) { if ( show_progress ) { @@ -3844,13 +3844,13 @@ check_file_mdc_api_errs(void) if ( result >= 0 ) { - pass = FALSE; - failure_mssg = "H5Fset_mdc_config() accepted NULL config_ptr."; + pass1 = FALSE; + failure_mssg1 = "H5Fset_mdc_config() accepted NULL config_ptr."; } } i = 0; - while ( ( pass ) && ( i < NUM_INVALID_CONFIGS ) ) + while ( ( pass1 ) && ( i < NUM_INVALID_CONFIGS ) ) { if ( show_progress ) { @@ -3865,10 +3865,10 @@ check_file_mdc_api_errs(void) if ( result >= 0 ) { - pass = FALSE; + pass1 = FALSE; HDsnprintf(msg, (size_t)128, "H5Fset_mdc_config() accepted invalid_configs[%d].", i); - failure_mssg = msg; + failure_mssg1 = msg; } i++; } @@ -3880,7 +3880,7 @@ check_file_mdc_api_errs(void) /* test H5Fget_mdc_hit_rate() */ - if ( pass ) { + if ( pass1 ) { if ( show_progress ) { @@ -3894,12 +3894,12 @@ check_file_mdc_api_errs(void) if ( result >= 0 ) { - pass = FALSE; - failure_mssg = "H5Fget_mdc_hit_rate() accepted bad file_id."; + pass1 = FALSE; + failure_mssg1 = "H5Fget_mdc_hit_rate() accepted bad file_id."; } } - if ( pass ) { + if ( pass1 ) { if ( show_progress ) { @@ -3913,14 +3913,14 @@ check_file_mdc_api_errs(void) if ( result >= 0 ) { - pass = FALSE; - failure_mssg = "H5Fget_mdc_hit_rate() accepted NULL hit_rate_ptr."; + pass1 = FALSE; + failure_mssg1 = "H5Fget_mdc_hit_rate() accepted NULL hit_rate_ptr."; } } /* test H5Freset_mdc_hit_rate_stats() */ - if ( pass ) { + if ( pass1 ) { if ( show_progress ) { @@ -3934,15 +3934,15 @@ check_file_mdc_api_errs(void) if ( result >= 0 ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "H5Freset_mdc_hit_rate_stats() accepted bad file_id."; } } /* test H5Fget_mdc_size() */ - if ( pass ) { + if ( pass1 ) { if ( show_progress ) { @@ -3956,12 +3956,12 @@ check_file_mdc_api_errs(void) if ( result >= 0 ) { - pass = FALSE; - failure_mssg = "H5Fget_mdc_size() accepted bad file_id."; + pass1 = FALSE; + failure_mssg1 = "H5Fget_mdc_size() accepted bad file_id."; } } - if ( pass ) { + if ( pass1 ) { if ( show_progress ) { @@ -3976,14 +3976,14 @@ check_file_mdc_api_errs(void) &cur_num_entries) < 0 ) || ( H5Fget_mdc_size(file_id, NULL, NULL, NULL, NULL) < 0 ) ) { - pass = FALSE; - failure_mssg = "H5Fget_mdc_size() failed to handle NULL params."; + pass1 = FALSE; + failure_mssg1 = "H5Fget_mdc_size() failed to handle NULL params."; } } /* close the file and delete it */ - if ( pass ) { + if ( pass1 ) { if ( show_progress ) { @@ -3992,21 +3992,21 @@ check_file_mdc_api_errs(void) if ( H5Fclose(file_id) < 0 ) { - pass = FALSE; - failure_mssg = "H5Fclose() failed.\n"; + pass1 = FALSE; + failure_mssg1 = "H5Fclose() failed.\n"; } else if ( HDremove(filename) < 0 ) { - pass = FALSE; - failure_mssg = "HDremove() failed.\n"; + pass1 = FALSE; + failure_mssg1 = "HDremove() failed.\n"; } } - if ( pass ) { PASSED(); } else { H5_FAILED(); } + if ( pass1 ) { PASSED(); } else { H5_FAILED(); } - if ( ! pass ) - HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", - fcn_name, failure_mssg); + if ( ! pass1 ) + HDfprintf(stdout, "%s: failure_mssg1 = \"%s\".\n", + fcn_name, failure_mssg1); } /* check_file_mdc_api_errs() */ @@ -4031,11 +4031,11 @@ check_file_mdc_api_errs(void) int main(void) { - int express_test; + int express_test1; H5open(); - express_test = GetTestExpress(); + express_test1 = GetTestExpress(); #if 1 check_fapl_mdc_api_calls(); @@ -4044,7 +4044,7 @@ main(void) check_file_mdc_api_calls(); #endif #if 1 - mdc_api_call_smoke_check(express_test); + mdc_api_call_smoke_check(express_test1); #endif #if 1 check_fapl_mdc_api_errs(); diff --git a/test/cache1_common.c b/test/cache1_common.c index cd9a0fd..584c9c1 100644 --- a/test/cache1_common.c +++ b/test/cache1_common.c @@ -27,38 +27,38 @@ /* global variable declarations: */ -hbool_t write_permitted = TRUE; -hbool_t pass = TRUE; /* set to false on error */ -hbool_t skip_long_tests = TRUE; -hbool_t run_full_test = TRUE; -const char *failure_mssg = NULL; - -test_entry_t pico_entries[NUM_PICO_ENTRIES]; -test_entry_t nano_entries[NUM_NANO_ENTRIES]; -test_entry_t micro_entries[NUM_MICRO_ENTRIES]; -test_entry_t tiny_entries[NUM_TINY_ENTRIES]; -test_entry_t small_entries[NUM_SMALL_ENTRIES]; -test_entry_t medium_entries[NUM_MEDIUM_ENTRIES]; -test_entry_t large_entries[NUM_LARGE_ENTRIES]; -test_entry_t huge_entries[NUM_HUGE_ENTRIES]; -test_entry_t monster_entries[NUM_MONSTER_ENTRIES]; -test_entry_t variable_entries[NUM_VARIABLE_ENTRIES]; - -test_entry_t * entries[NUMBER_OF_ENTRY_TYPES] = +hbool_t write_permitted1 = TRUE; +hbool_t pass1 = TRUE; /* set to false on error */ +hbool_t skip_long_tests1 = TRUE; +hbool_t run_full_test1 = TRUE; +const char *failure_mssg1 = NULL; + +test_entry_t pico_entries1[NUM_PICO_ENTRIES]; +test_entry_t nano_entries1[NUM_NANO_ENTRIES]; +test_entry_t micro_entries1[NUM_MICRO_ENTRIES]; +test_entry_t tiny_entries1[NUM_TINY_ENTRIES]; +test_entry_t small_entries1[NUM_SMALL_ENTRIES]; +test_entry_t medium_entries1[NUM_MEDIUM_ENTRIES]; +test_entry_t large_entries1[NUM_LARGE_ENTRIES]; +test_entry_t huge_entries1[NUM_HUGE_ENTRIES]; +test_entry_t monster_entries1[NUM_MONSTER_ENTRIES]; +test_entry_t variable_entries1[NUM_VARIABLE_ENTRIES]; + +test_entry_t * entries1[NUMBER_OF_ENTRY_TYPES] = { - pico_entries, - nano_entries, - micro_entries, - tiny_entries, - small_entries, - medium_entries, - large_entries, - huge_entries, - monster_entries, - variable_entries + pico_entries1, + nano_entries1, + micro_entries1, + tiny_entries1, + small_entries1, + medium_entries1, + large_entries1, + huge_entries1, + monster_entries1, + variable_entries1 }; -const int32_t max_indices[NUMBER_OF_ENTRY_TYPES] = +const int32_t max_indices1[NUMBER_OF_ENTRY_TYPES] = { NUM_PICO_ENTRIES - 1, NUM_NANO_ENTRIES - 1, @@ -72,7 +72,7 @@ const int32_t max_indices[NUMBER_OF_ENTRY_TYPES] = NUM_VARIABLE_ENTRIES - 1 }; -const size_t entry_sizes[NUMBER_OF_ENTRY_TYPES] = +const size_t entry_sizes1[NUMBER_OF_ENTRY_TYPES] = { PICO_ENTRY_SIZE, NANO_ENTRY_SIZE, @@ -86,7 +86,7 @@ const size_t entry_sizes[NUMBER_OF_ENTRY_TYPES] = VARIABLE_ENTRY_SIZE }; -const haddr_t base_addrs[NUMBER_OF_ENTRY_TYPES] = +const haddr_t base_addrs1[NUMBER_OF_ENTRY_TYPES] = { PICO_BASE_ADDR, NANO_BASE_ADDR, @@ -100,7 +100,7 @@ const haddr_t base_addrs[NUMBER_OF_ENTRY_TYPES] = VARIABLE_BASE_ADDR }; -const haddr_t alt_base_addrs[NUMBER_OF_ENTRY_TYPES] = +const haddr_t alt_base_addrs1[NUMBER_OF_ENTRY_TYPES] = { PICO_ALT_BASE_ADDR, NANO_ALT_BASE_ADDR, @@ -114,7 +114,7 @@ const haddr_t alt_base_addrs[NUMBER_OF_ENTRY_TYPES] = VARIABLE_ALT_BASE_ADDR }; -const char * entry_type_names[NUMBER_OF_ENTRY_TYPES] = +const char * entry_type_names1[NUMBER_OF_ENTRY_TYPES] = { "pico entries -- 1 B", "nano entries -- 4 B", @@ -131,7 +131,7 @@ const char * entry_type_names[NUMBER_OF_ENTRY_TYPES] = /* callback table declaration */ -const H5C1_class_t types[NUMBER_OF_ENTRY_TYPES] = +const H5C1_class_t types1[NUMBER_OF_ENTRY_TYPES] = { { PICO_ENTRY_TYPE, @@ -228,7 +228,7 @@ static herr_t size(H5F_t * f, void * thing, size_t * size_ptr); /* address translation funtions: */ /*------------------------------------------------------------------------- - * Function: addr_to_type_and_index + * Function: addr_to_type_and_index1 * * Purpose: Given an address, compute the type and index of the * associated entry. @@ -243,7 +243,7 @@ static herr_t size(H5F_t * f, void * thing, size_t * size_ptr); *------------------------------------------------------------------------- */ void -addr_to_type_and_index(haddr_t addr, +addr_to_type_and_index1(haddr_t addr, int32_t * type_ptr, int32_t * index_ptr) { @@ -254,7 +254,7 @@ addr_to_type_and_index(haddr_t addr, HDassert( type_ptr ); HDassert( index_ptr ); - /* we only have a small number of entry types, so just do a + /* we only have a small number of entry types1, so just do a * linear search. If NUMBER_OF_ENTRY_TYPES grows, we may want * to do a binary search instead. */ @@ -262,7 +262,7 @@ addr_to_type_and_index(haddr_t addr, if ( addr >= PICO_ALT_BASE_ADDR ) { while ( ( i < NUMBER_OF_ENTRY_TYPES ) && - ( addr >= alt_base_addrs[i] ) ) + ( addr >= alt_base_addrs1[i] ) ) { i++; } @@ -270,7 +270,7 @@ addr_to_type_and_index(haddr_t addr, } else { while ( ( i < NUMBER_OF_ENTRY_TYPES ) && - ( addr >= base_addrs[i] ) ) + ( addr >= base_addrs1[i] ) ) { i++; } @@ -282,34 +282,34 @@ addr_to_type_and_index(haddr_t addr, if ( addr >= PICO_ALT_BASE_ADDR ) { - idx = (int32_t)((addr - alt_base_addrs[type]) / entry_sizes[type]); - HDassert( ( idx >= 0 ) && ( idx <= max_indices[type] ) ); - HDassert( !((entries[type])[idx].at_main_addr) ); - HDassert( addr == (entries[type])[idx].alt_addr ); + idx = (int32_t)((addr - alt_base_addrs1[type]) / entry_sizes1[type]); + HDassert( ( idx >= 0 ) && ( idx <= max_indices1[type] ) ); + HDassert( !((entries1[type])[idx].at_main_addr) ); + HDassert( addr == (entries1[type])[idx].alt_addr ); } else { - idx = (int32_t)((addr - base_addrs[type]) / entry_sizes[type]); - HDassert( ( idx >= 0 ) && ( idx <= max_indices[type] ) ); - HDassert( (entries[type])[idx].at_main_addr ); - HDassert( addr == (entries[type])[idx].main_addr ); + idx = (int32_t)((addr - base_addrs1[type]) / entry_sizes1[type]); + HDassert( ( idx >= 0 ) && ( idx <= max_indices1[type] ) ); + HDassert( (entries1[type])[idx].at_main_addr ); + HDassert( addr == (entries1[type])[idx].main_addr ); } - HDassert( addr == (entries[type])[idx].addr ); + HDassert( addr == (entries1[type])[idx].addr ); *type_ptr = type; *index_ptr = idx; return; -} /* addr_to_type_and_index() */ +} /* addr_to_type_and_index1() */ #if 0 /* This function has never been used, but we may want it * some time. Lets keep it for now. */ /*------------------------------------------------------------------------- - * Function: type_and_index_to_addr + * Function: type_and_index_to_addr1 * * Purpose: Given a type and index of an entry, compute the associated * addr and return that value. @@ -324,30 +324,30 @@ addr_to_type_and_index(haddr_t addr, *------------------------------------------------------------------------- */ haddr_t -type_and_index_to_addr(int32_t type, +type_and_index_to_addr1(int32_t type, int32_t idx) { haddr_t addr; HDassert( ( type >= 0 ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); - HDassert( ( idx >= 0 ) && ( idx <= max_indices[type] ) ); + HDassert( ( idx >= 0 ) && ( idx <= max_indices1[type] ) ); - addr = base_addrs[type] + (((haddr_t)idx) * entry_sizes[type]); + addr = base_addrs1[type] + (((haddr_t)idx) * entry_sizes1[type]); - HDassert( addr == (entries[type])[idx].addr ); + HDassert( addr == (entries1[type])[idx].addr ); - if ( (entries[type])[idx].at_main_addr ) { + if ( (entries1[type])[idx].at_main_addr ) { - HDassert( addr == (entries[type])[idx].main_addr ); + HDassert( addr == (entries1[type])[idx].main_addr ); } else { - HDassert( addr == (entries[type])[idx].alt_addr ); + HDassert( addr == (entries1[type])[idx].alt_addr ); } return(addr); -} /* type_and_index_to_addr() */ +} /* type_and_index_to_addr1() */ #endif @@ -356,15 +356,15 @@ type_and_index_to_addr(int32_t type, /*------------------------------------------------------------------------- * - * Function: check_if_write_permitted + * Function: check_if_write_permitted1 * * Purpose: Determine if a write is permitted under the current - * circumstances, and set *write_permitted_ptr accordingly. + * circumstances, and set *write_permitted1_ptr accordingly. * As a general rule it is, but when we are running in parallel * mode with collective I/O, we must ensure that a read cannot * cause a write. * - * In the event of failure, the value of *write_permitted_ptr + * In the event of failure, the value of *write_permitted1_ptr * is undefined. * * Return: Non-negative on success/Negative on failure. @@ -377,17 +377,17 @@ type_and_index_to_addr(int32_t type, */ herr_t -check_write_permitted(const H5F_t UNUSED * f, +check_write_permitted1(const H5F_t UNUSED * f, hid_t UNUSED dxpl_id, - hbool_t * write_permitted_ptr) + hbool_t * write_permitted1_ptr) { - HDassert( write_permitted_ptr ); - *write_permitted_ptr = write_permitted; + HDassert( write_permitted1_ptr ); + *write_permitted1_ptr = write_permitted1; return(SUCCEED); -} /* check_write_permitted() */ +} /* check_write_permitted1() */ /*------------------------------------------------------------------------- @@ -420,16 +420,16 @@ clear(H5F_t * f, HDassert( thing ); entry_ptr = (test_entry_t *)thing; - base_addr = entries[entry_ptr->type]; + base_addr = entries1[entry_ptr->type]; HDassert( entry_ptr->index >= 0 ); - HDassert( entry_ptr->index <= max_indices[entry_ptr->type] ); + HDassert( entry_ptr->index <= max_indices1[entry_ptr->type] ); HDassert( entry_ptr == &(base_addr[entry_ptr->index]) ); HDassert( entry_ptr == entry_ptr->self ); HDassert( entry_ptr->header.addr == entry_ptr->addr ); HDassert( entry_ptr->header.size == entry_ptr->size ); HDassert( ( entry_ptr->type == VARIABLE_ENTRY_TYPE ) || - ( entry_ptr->size == entry_sizes[entry_ptr->type] ) ); + ( entry_ptr->size == entry_sizes1[entry_ptr->type] ) ); entry_ptr->header.is_dirty = FALSE; entry_ptr->is_dirty = FALSE; @@ -556,10 +556,10 @@ destroy(H5F_t UNUSED * f, HDassert( thing ); entry_ptr = (test_entry_t *)thing; - base_addr = entries[entry_ptr->type]; + base_addr = entries1[entry_ptr->type]; HDassert( entry_ptr->index >= 0 ); - HDassert( entry_ptr->index <= max_indices[entry_ptr->type] ); + HDassert( entry_ptr->index <= max_indices1[entry_ptr->type] ); HDassert( entry_ptr == &(base_addr[entry_ptr->index]) ); HDassert( entry_ptr == entry_ptr->self ); HDassert( entry_ptr->cache_ptr != NULL ); @@ -568,7 +568,7 @@ destroy(H5F_t UNUSED * f, ( entry_ptr->header.addr == entry_ptr->addr ) ); HDassert( entry_ptr->header.size == entry_ptr->size ); HDassert( ( entry_ptr->type == VARIABLE_ENTRY_TYPE ) || - ( entry_ptr->size == entry_sizes[entry_ptr->type] ) ); + ( entry_ptr->size == entry_sizes1[entry_ptr->type] ) ); HDassert( !(entry_ptr->is_dirty) ); HDassert( !(entry_ptr->header.is_dirty) ); @@ -577,7 +577,7 @@ destroy(H5F_t UNUSED * f, for ( i = 0; i < entry_ptr->num_pins; i++ ) { - pinned_base_addr = entries[entry_ptr->pin_type[i]]; + pinned_base_addr = entries1[entry_ptr->pin_type[i]]; pinned_entry_ptr = &(pinned_base_addr[entry_ptr->pin_idx[i]]); HDassert( 0 <= pinned_entry_ptr->type ); @@ -585,7 +585,7 @@ destroy(H5F_t UNUSED * f, HDassert( pinned_entry_ptr->type == entry_ptr->pin_type[i] ); HDassert( pinned_entry_ptr->index >= 0 ); HDassert( pinned_entry_ptr->index <= - max_indices[pinned_entry_ptr->type] ); + max_indices1[pinned_entry_ptr->type] ); HDassert( pinned_entry_ptr->index == entry_ptr->pin_idx[i] ); HDassert( pinned_entry_ptr == pinned_entry_ptr->self ); HDassert( pinned_entry_ptr->header.is_pinned ); @@ -596,7 +596,7 @@ destroy(H5F_t UNUSED * f, if ( pinned_entry_ptr->pinning_ref_count <= 0 ) { - unpin_entry(pinned_entry_ptr->cache_ptr, + unpin_entry1(pinned_entry_ptr->cache_ptr, pinned_entry_ptr->type, pinned_entry_ptr->index); } @@ -727,17 +727,17 @@ flush(H5F_t *f, HDassert( thing ); entry_ptr = (test_entry_t *)thing; - base_addr = entries[entry_ptr->type]; + base_addr = entries1[entry_ptr->type]; HDassert( entry_ptr->index >= 0 ); - HDassert( entry_ptr->index <= max_indices[entry_ptr->type] ); + HDassert( entry_ptr->index <= max_indices1[entry_ptr->type] ); HDassert( entry_ptr == &(base_addr[entry_ptr->index]) ); HDassert( entry_ptr == entry_ptr->self ); HDassert( entry_ptr->header.addr == entry_ptr->addr ); HDassert( entry_ptr->addr == addr ); HDassert( entry_ptr->header.size == entry_ptr->size ); HDassert( ( entry_ptr->type == VARIABLE_ENTRY_TYPE ) || - ( entry_ptr->size == entry_sizes[entry_ptr->type] ) ); + ( entry_ptr->size == entry_sizes1[entry_ptr->type] ) ); HDassert( entry_ptr->header.is_dirty == entry_ptr->is_dirty ); HDassert( entry_ptr->cache_ptr != NULL ); HDassert( entry_ptr->cache_ptr->magic == H5C1__H5C1_T_MAGIC ); @@ -748,7 +748,7 @@ flush(H5F_t *f, for ( i = 0; i < entry_ptr->num_flush_ops; i++ ) { - execute_flush_op(entry_ptr->cache_ptr, + execute_flush_op1(entry_ptr->cache_ptr, entry_ptr, &((entry_ptr->flush_ops)[i]), flags_ptr); @@ -759,10 +759,10 @@ flush(H5F_t *f, entry_ptr->flushed = TRUE; - if ( ( ! write_permitted ) && ( entry_ptr->is_dirty ) ) { + if ( ( ! write_permitted1 ) && ( entry_ptr->is_dirty ) ) { - pass = FALSE; - failure_mssg = "called flush when write_permitted is FALSE."; + pass1 = FALSE; + failure_mssg1 = "called flush when write_permitted1 is FALSE."; } if ( entry_ptr->is_dirty ) { @@ -896,9 +896,9 @@ load(H5F_t UNUSED *f, test_entry_t * entry_ptr; test_entry_t * base_addr; - addr_to_type_and_index(addr, &type, &idx); + addr_to_type_and_index1(addr, &type, &idx); - base_addr = entries[type]; + base_addr = entries1[type]; entry_ptr = &(base_addr[idx]); HDassert( entry_ptr->type == type ); @@ -906,12 +906,12 @@ load(H5F_t UNUSED *f, HDassert( entry_ptr->type < NUMBER_OF_ENTRY_TYPES ); HDassert( entry_ptr->index == idx ); HDassert( entry_ptr->index >= 0 ); - HDassert( entry_ptr->index <= max_indices[type] ); + HDassert( entry_ptr->index <= max_indices1[type] ); HDassert( entry_ptr == entry_ptr->self ); HDassert( entry_ptr->addr == addr ); #if 1 /* JRM */ if ( ! ( ( entry_ptr->type == VARIABLE_ENTRY_TYPE ) || - ( entry_ptr->size == entry_sizes[type] ) ) ) { + ( entry_ptr->size == entry_sizes1[type] ) ) ) { HDfprintf(stdout, "entry type/index/size = %d/%d/%ld\n", (int)(entry_ptr->type), @@ -920,7 +920,7 @@ load(H5F_t UNUSED *f, } #endif /* JRM */ HDassert( ( entry_ptr->type == VARIABLE_ENTRY_TYPE ) || - ( entry_ptr->size == entry_sizes[type] ) ); + ( entry_ptr->size == entry_sizes1[type] ) ); entry_ptr->loaded = TRUE; @@ -1036,15 +1036,15 @@ size(H5F_t UNUSED * f, HDassert( thing ); entry_ptr = (test_entry_t *)thing; - base_addr = entries[entry_ptr->type]; + base_addr = entries1[entry_ptr->type]; HDassert( entry_ptr->index >= 0 ); - HDassert( entry_ptr->index <= max_indices[entry_ptr->type] ); + HDassert( entry_ptr->index <= max_indices1[entry_ptr->type] ); HDassert( entry_ptr == &(base_addr[entry_ptr->index]) ); HDassert( entry_ptr == entry_ptr->self ); HDassert( entry_ptr->header.addr == entry_ptr->addr ); HDassert( ( entry_ptr->type == VARIABLE_ENTRY_TYPE ) || \ - ( entry_ptr->size == entry_sizes[entry_ptr->type] ) ); + ( entry_ptr->size == entry_sizes1[entry_ptr->type] ) ); *size_ptr = entry_ptr->size; @@ -1131,9 +1131,9 @@ variable_size(H5F_t * f, void * thing, size_t * size_ptr) /**************************************************************************/ /*------------------------------------------------------------------------- - * Function: add_flush_op + * Function: add_flush_op1 * - * Purpose: Do noting if pass is FALSE on entry. + * Purpose: Do noting if pass1 is FALSE on entry. * * Otherwise, add the specified flush operation to the * target instance of test_entry_t. @@ -1149,7 +1149,7 @@ variable_size(H5F_t * f, void * thing, size_t * size_ptr) */ void -add_flush_op(int target_type, +add_flush_op1(int target_type, int target_idx, int op_code, int type, @@ -1163,18 +1163,18 @@ add_flush_op(int target_type, HDassert( ( 0 <= target_type ) && ( target_type < NUMBER_OF_ENTRY_TYPES ) ); HDassert( ( 0 <= target_idx ) && - ( target_idx <= max_indices[target_type] ) ); + ( target_idx <= max_indices1[target_type] ) ); HDassert( ( 0 <= op_code ) && ( op_code <= FLUSH_OP__MAX_OP ) ); HDassert( ( op_code != FLUSH_OP__RESIZE ) || ( type == VARIABLE_ENTRY_TYPE ) ); HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); - HDassert( ( 0 <= idx ) && ( idx <= max_indices[type] ) ); + HDassert( ( 0 <= idx ) && ( idx <= max_indices1[type] ) ); HDassert( ( flag == TRUE ) || ( flag == FALSE ) ); HDassert( new_size <= VARIABLE_ENTRY_SIZE ); - if ( pass ) { + if ( pass1 ) { - target_base_addr = entries[target_type]; + target_base_addr = entries1[target_type]; target_entry_ptr = &(target_base_addr[target_idx]); HDassert( target_entry_ptr->index == target_idx ); @@ -1193,18 +1193,18 @@ add_flush_op(int target_type, return; -} /* add_flush_op() */ +} /* add_flush_op1() */ /*------------------------------------------------------------------------- - * Function: create_pinned_entry_dependency + * Function: create_pinned_entry_dependency1 * - * Purpose: Do noting if pass is FALSE on entry. + * Purpose: Do noting if pass1 is FALSE on entry. * * Otherwise, set up a pinned entry dependency so we can * test the pinned entry modifications to the flush routine. * - * Given the types and indicies of the pinned and pinning + * Given the types1 and indicies of the pinned and pinning * entries, add the pinned entry to the list of pinned * entries in the pinning entry, increment the * pinning reference count of the pinned entry, and @@ -1221,7 +1221,7 @@ add_flush_op(int target_type, */ void -create_pinned_entry_dependency(H5C1_t * cache_ptr, +create_pinned_entry_dependency1(H5C1_t * cache_ptr, int pinning_type, int pinning_idx, int pinned_type, @@ -1232,21 +1232,21 @@ create_pinned_entry_dependency(H5C1_t * cache_ptr, test_entry_t * pinned_base_addr; test_entry_t * pinned_entry_ptr; - if ( pass ) { + if ( pass1 ) { HDassert( ( 0 <= pinning_type ) && ( pinning_type < NUMBER_OF_ENTRY_TYPES ) ); HDassert( ( 0 <= pinning_idx ) && - ( pinning_idx <= max_indices[pinning_type] ) ); + ( pinning_idx <= max_indices1[pinning_type] ) ); HDassert( ( 0 <= pinned_type ) && ( pinned_type < NUMBER_OF_ENTRY_TYPES ) ); HDassert( ( 0 <= pinned_idx ) && - ( pinned_idx <= max_indices[pinned_type] ) ); + ( pinned_idx <= max_indices1[pinned_type] ) ); - pinning_base_addr = entries[pinning_type]; + pinning_base_addr = entries1[pinning_type]; pinning_entry_ptr = &(pinning_base_addr[pinning_idx]); - pinned_base_addr = entries[pinned_type]; + pinned_base_addr = entries1[pinned_type]; pinned_entry_ptr = &(pinned_base_addr[pinned_idx]); HDassert( pinning_entry_ptr->index == pinning_idx ); @@ -1265,8 +1265,8 @@ create_pinned_entry_dependency(H5C1_t * cache_ptr, if ( pinned_entry_ptr->pinning_ref_count == 0 ) { - protect_entry(cache_ptr, pinned_type, pinned_idx); - unprotect_entry(cache_ptr, pinned_type, pinned_idx, FALSE, + protect_entry1(cache_ptr, pinned_type, pinned_idx); + unprotect_entry1(cache_ptr, pinned_type, pinned_idx, FALSE, H5C1__PIN_ENTRY_FLAG); } @@ -1275,11 +1275,11 @@ create_pinned_entry_dependency(H5C1_t * cache_ptr, return; -} /* create_pinned_entry_dependency() */ +} /* create_pinned_entry_dependency1() */ /*------------------------------------------------------------------------- - * Function: dirty_entry + * Function: dirty_entry1 * * Purpose: Given a pointer to a cache, an entry type, and an index, * dirty the target entry. @@ -1289,7 +1289,7 @@ create_pinned_entry_dependency(H5C1_t * cache_ptr, * isn't, scream and die. If it is, use the * H5C1_mark_pinned_entry_dirty() call to dirty it. * - * Do nothing if pass is false on entry. + * Do nothing if pass1 is false on entry. * * Return: void * @@ -1304,7 +1304,7 @@ create_pinned_entry_dependency(H5C1_t * cache_ptr, */ void -dirty_entry(H5C1_t * cache_ptr, +dirty_entry1(H5C1_t * cache_ptr, int32_t type, int32_t idx, hbool_t dirty_pin) @@ -1314,20 +1314,20 @@ dirty_entry(H5C1_t * cache_ptr, HDassert( cache_ptr ); HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); - HDassert( ( 0 <= idx ) && ( idx <= max_indices[type] ) ); + HDassert( ( 0 <= idx ) && ( idx <= max_indices1[type] ) ); - if ( pass ) { + if ( pass1 ) { if ( dirty_pin ) { - if ( ! entry_in_cache(cache_ptr, type, idx) ) { + if ( ! entry_in_cache1(cache_ptr, type, idx) ) { - pass = FALSE; - failure_mssg = "entry to be dirty pinned is not in cache."; + pass1 = FALSE; + failure_mssg1 = "entry to be dirty pinned is not in cache."; } else { - base_addr = entries[type]; + base_addr = entries1[type]; entry_ptr = &(base_addr[idx]); HDassert( entry_ptr->index == idx ); @@ -1336,34 +1336,34 @@ dirty_entry(H5C1_t * cache_ptr, if ( ! ( (entry_ptr->header).is_pinned ) ) { - pass = FALSE; - failure_mssg = "entry to be dirty pinned is not pinned."; + pass1 = FALSE; + failure_mssg1 = "entry to be dirty pinned is not pinned."; } else { - mark_pinned_entry_dirty(cache_ptr, type, idx, FALSE, (size_t)0); + mark_pinned_entry_dirty1(cache_ptr, type, idx, FALSE, (size_t)0); } } } else { - protect_entry(cache_ptr, type, idx); - unprotect_entry(cache_ptr, type, idx, TRUE, H5C1__NO_FLAGS_SET); + protect_entry1(cache_ptr, type, idx); + unprotect_entry1(cache_ptr, type, idx, TRUE, H5C1__NO_FLAGS_SET); } } return; -} /* dirty_entry() */ +} /* dirty_entry1() */ /*------------------------------------------------------------------------- - * Function: execute_flush_op + * Function: execute_flush_op1 * * Purpose: Given a pointer to an instance of struct flush_op, execute * it. * - * Do nothing if pass is false on entry. + * Do nothing if pass1 is false on entry. * * Return: void * @@ -1378,7 +1378,7 @@ dirty_entry(H5C1_t * cache_ptr, */ void -execute_flush_op(H5C1_t * cache_ptr, +execute_flush_op1(H5C1_t * cache_ptr, struct test_entry_t * entry_ptr, struct flush_op * op_ptr, unsigned * flags_ptr) @@ -1394,15 +1394,15 @@ execute_flush_op(H5C1_t * cache_ptr, HDassert( ( 0 <= entry_ptr->type ) && ( entry_ptr->type < NUMBER_OF_ENTRY_TYPES ) ); HDassert( ( 0 <= entry_ptr->index ) && - ( entry_ptr->index <= max_indices[entry_ptr->type] ) ); + ( entry_ptr->index <= max_indices1[entry_ptr->type] ) ); HDassert( ( 0 <= op_ptr->type ) && ( op_ptr->type < NUMBER_OF_ENTRY_TYPES ) ); HDassert( ( 0 <= op_ptr->idx ) && - ( op_ptr->idx <= max_indices[op_ptr->type] ) ); + ( op_ptr->idx <= max_indices1[op_ptr->type] ) ); HDassert( ( op_ptr->flag == FALSE ) || ( op_ptr->flag == TRUE ) ); HDassert( flags_ptr != NULL ); - if ( pass ) { + if ( pass1 ) { switch ( op_ptr->op_code ) { @@ -1413,7 +1413,7 @@ execute_flush_op(H5C1_t * cache_ptr, HDassert( ( entry_ptr->type != op_ptr->type ) || ( entry_ptr->index != op_ptr->idx ) ); - dirty_entry(cache_ptr, op_ptr->type, op_ptr->idx, op_ptr->flag); + dirty_entry1(cache_ptr, op_ptr->type, op_ptr->idx, op_ptr->flag); break; case FLUSH_OP__RESIZE: @@ -1444,30 +1444,30 @@ execute_flush_op(H5C1_t * cache_ptr, /* change the size of some other entry */ - resize_entry(cache_ptr, op_ptr->type, op_ptr->idx, + resize_entry1(cache_ptr, op_ptr->type, op_ptr->idx, op_ptr->size, op_ptr->flag); } break; case FLUSH_OP__RENAME: - rename_entry(cache_ptr, op_ptr->type, op_ptr->idx, + rename_entry1(cache_ptr, op_ptr->type, op_ptr->idx, op_ptr->flag); break; default: - pass = FALSE; - failure_mssg = "Undefined flush op code."; + pass1 = FALSE; + failure_mssg1 = "Undefined flush op code."; break; } } return; -} /* execute_flush_op() */ +} /* execute_flush_op1() */ /*------------------------------------------------------------------------- - * Function: entry_in_cache + * Function: entry_in_cache1 * * Purpose: Given a pointer to a cache, an entry type, and an index, * determine if the entry is currently in the cache. @@ -1487,7 +1487,7 @@ execute_flush_op(H5C1_t * cache_ptr, */ hbool_t -entry_in_cache(H5C1_t * cache_ptr, +entry_in_cache1(H5C1_t * cache_ptr, int32_t type, int32_t idx) { @@ -1498,9 +1498,9 @@ entry_in_cache(H5C1_t * cache_ptr, HDassert( cache_ptr ); HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); - HDassert( ( 0 <= idx ) && ( idx <= max_indices[type] ) ); + HDassert( ( 0 <= idx ) && ( idx <= max_indices1[type] ) ); - base_addr = entries[type]; + base_addr = entries1[type]; entry_ptr = &(base_addr[idx]); HDassert( entry_ptr->index == idx ); @@ -1518,11 +1518,11 @@ entry_in_cache(H5C1_t * cache_ptr, return(in_cache); -} /* entry_in_cache() */ +} /* entry_in_cache1() */ /*------------------------------------------------------------------------- - * Function: reset_entries + * Function: reset_entries1 * * Purpose: reset the contents of the entries arrays to know values. * @@ -1545,7 +1545,7 @@ entry_in_cache(H5C1_t * cache_ptr, */ void -reset_entries(void) +reset_entries1(void) { int i; @@ -1559,9 +1559,9 @@ reset_entries(void) for ( i = 0; i < NUMBER_OF_ENTRY_TYPES; i++ ) { - entry_size = entry_sizes[i]; - max_index = max_indices[i]; - base_addr = entries[i]; + entry_size = entry_sizes1[i]; + max_index = max_indices1[i]; + base_addr = entries1[i]; HDassert( base_addr ); @@ -1633,11 +1633,11 @@ reset_entries(void) return; -} /* reset_entries() */ +} /* reset_entries1() */ /*------------------------------------------------------------------------- - * Function: resize_entry + * Function: resize_entry1 * * Purpose: Given a pointer to a cache, an entry type, an index, and * a size, set the size of the target entry to the size. Note @@ -1649,7 +1649,7 @@ reset_entries(void) * isn't, scream and die. If it is, use the * H5C1_mark_pinned_entry_dirty() call to resize it. * - * Do nothing if pass is false on entry. + * Do nothing if pass1 is false on entry. * * Return: void * @@ -1664,7 +1664,7 @@ reset_entries(void) */ void -resize_entry(H5C1_t * cache_ptr, +resize_entry1(H5C1_t * cache_ptr, int32_t type, int32_t idx, size_t new_size, @@ -1676,12 +1676,12 @@ resize_entry(H5C1_t * cache_ptr, HDassert( cache_ptr ); HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); HDassert( type == VARIABLE_ENTRY_TYPE ); - HDassert( ( 0 <= idx ) && ( idx <= max_indices[type] ) ); - HDassert( ( 0 < new_size ) && ( new_size <= entry_sizes[type] ) ); + HDassert( ( 0 <= idx ) && ( idx <= max_indices1[type] ) ); + HDassert( ( 0 < new_size ) && ( new_size <= entry_sizes1[type] ) ); - if ( pass ) { + if ( pass1 ) { - base_addr = entries[type]; + base_addr = entries1[type]; entry_ptr = &(base_addr[idx]); HDassert( entry_ptr->index == idx ); @@ -1690,45 +1690,45 @@ resize_entry(H5C1_t * cache_ptr, if ( resize_pin ) { - if ( ! entry_in_cache(cache_ptr, type, idx) ) { + if ( ! entry_in_cache1(cache_ptr, type, idx) ) { - pass = FALSE; - failure_mssg = "entry to be resized pinned is not in cache."; + pass1 = FALSE; + failure_mssg1 = "entry to be resized pinned is not in cache."; } else { if ( ! ( (entry_ptr->header).is_pinned ) ) { - pass = FALSE; - failure_mssg = "entry to be resized pinned is not pinned."; + pass1 = FALSE; + failure_mssg1 = "entry to be resized pinned is not pinned."; } else { - mark_pinned_entry_dirty(cache_ptr, type, idx, + mark_pinned_entry_dirty1(cache_ptr, type, idx, TRUE, new_size); } } } else { - protect_entry(cache_ptr, type, idx); - unprotect_entry_with_size_change(cache_ptr, type, idx, + protect_entry1(cache_ptr, type, idx); + unprotect_entry1_with_size_change(cache_ptr, type, idx, H5C1__SIZE_CHANGED_FLAG, new_size); } } return; -} /* resize_entry() */ +} /* resize_entry1() */ /*------------------------------------------------------------------------- - * Function: resize_pinned_entry + * Function: resize_pinned_entry1 * * Purpose: Given a pointer to a cache, an entry type, an index, and * a new size, change the size of the target pinned entry * to match the supplied new size. * - * Do nothing if pass is false on entry. + * Do nothing if pass1 is false on entry. * * Return: void * @@ -1743,7 +1743,7 @@ resize_entry(H5C1_t * cache_ptr, */ void -resize_pinned_entry(H5C1_t * cache_ptr, +resize_pinned_entry1(H5C1_t * cache_ptr, int32_t type, int32_t idx, size_t new_size) @@ -1754,20 +1754,20 @@ resize_pinned_entry(H5C1_t * cache_ptr, HDassert( cache_ptr ); HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); - HDassert( ( 0 <= idx ) && ( idx <= max_indices[type] ) ); + HDassert( ( 0 <= idx ) && ( idx <= max_indices1[type] ) ); HDassert( type = VARIABLE_ENTRY_TYPE ) ; - HDassert( ( 0 < new_size ) && ( new_size <= entry_sizes[type] ) ); + HDassert( ( 0 < new_size ) && ( new_size <= entry_sizes1[type] ) ); - if ( pass ) { + if ( pass1 ) { - if ( ! entry_in_cache(cache_ptr, type, idx) ) { + if ( ! entry_in_cache1(cache_ptr, type, idx) ) { - pass = FALSE; - failure_mssg = "entry not in cache."; + pass1 = FALSE; + failure_mssg1 = "entry not in cache."; } else { - base_addr = entries[type]; + base_addr = entries1[type]; entry_ptr = &(base_addr[idx]); HDassert( entry_ptr->index == idx ); @@ -1776,8 +1776,8 @@ resize_pinned_entry(H5C1_t * cache_ptr, if ( ! ( (entry_ptr->header).is_pinned ) ) { - pass = FALSE; - failure_mssg = "entry to be resized is not pinned."; + pass1 = FALSE; + failure_mssg1 = "entry to be resized is not pinned."; } else { @@ -1789,8 +1789,8 @@ resize_pinned_entry(H5C1_t * cache_ptr, if ( result != SUCCEED ) { - pass = FALSE; - failure_mssg = "error(s) in H5C1_resize_pinned_entry()."; + pass1 = FALSE; + failure_mssg1 = "error(s) in H5C1_resize_pinned_entry()."; } else { @@ -1803,16 +1803,16 @@ resize_pinned_entry(H5C1_t * cache_ptr, return; -} /* resize_pinned_entry() */ +} /* resize_pinned_entry1() */ /*------------------------------------------------------------------------- - * Function: verify_clean + * Function: verify_clean1 * * Purpose: Verify that all cache entries are marked as clean. If any - * are not, set pass to FALSE. + * are not, set pass1 to FALSE. * - * Do nothing if pass is FALSE on entry. + * Do nothing if pass1 is FALSE on entry. * * Return: void * @@ -1825,7 +1825,7 @@ resize_pinned_entry(H5C1_t * cache_ptr, */ void -verify_clean(void) +verify_clean1(void) { int i; @@ -1834,12 +1834,12 @@ verify_clean(void) int32_t max_index; test_entry_t * base_addr; - if ( pass ) { + if ( pass1 ) { for ( i = 0; i < NUMBER_OF_ENTRY_TYPES; i++ ) { - max_index = max_indices[i]; - base_addr = entries[i]; + max_index = max_indices1[i]; + base_addr = entries1[i]; HDassert( base_addr ); @@ -1855,24 +1855,24 @@ verify_clean(void) if ( dirty_count > 0 ) { - pass = FALSE; - failure_mssg = "verify_clean() found dirty entry(s)."; + pass1 = FALSE; + failure_mssg1 = "verify_clean1() found dirty entry(s)."; } } return; -} /* verify_clean() */ +} /* verify_clean1() */ /*------------------------------------------------------------------------- - * Function: verify_entry_status + * Function: verify_entry_status1 * * Purpose: Verify that a list of entries have the expected status. * If any discrepencies are found, set the failure message - * and set pass to FALSE. + * and set pass1 to FALSE. * - * Do nothing if pass is FALSE on entry. + * Do nothing if pass1 is FALSE on entry. * * Return: void * @@ -1885,7 +1885,7 @@ verify_clean(void) */ void -verify_entry_status(H5C1_t * cache_ptr, +verify_entry_status1(H5C1_t * cache_ptr, int tag, int num_entries, struct expected_entry_status expected[]) @@ -1897,9 +1897,9 @@ verify_entry_status(H5C1_t * cache_ptr, test_entry_t * base_addr; i = 0; - while ( ( pass ) && ( i < num_entries ) ) + while ( ( pass1 ) && ( i < num_entries ) ) { - base_addr = entries[expected[i].entry_type]; + base_addr = entries1[expected[i].entry_type]; entry_ptr = &(base_addr[expected[i].entry_index]); if ( ( ! expected[i].in_cache ) && @@ -1907,19 +1907,19 @@ verify_entry_status(H5C1_t * cache_ptr, ( expected[i].is_protected ) || ( expected[i].is_pinned ) ) ) { - pass = FALSE; + pass1 = FALSE; sprintf(msg, "Contradictory data in expected[%d].\n", i); - failure_mssg = msg; + failure_mssg1 = msg; } - if ( pass ) { + if ( pass1 ) { - in_cache = entry_in_cache(cache_ptr, expected[i].entry_type, + in_cache = entry_in_cache1(cache_ptr, expected[i].entry_type, expected[i].entry_index); if ( in_cache != expected[i].in_cache ) { - pass = FALSE; + pass1 = FALSE; sprintf(msg, "%d entry (%d, %d) in cache actual/expected = %d/%d.\n", tag, @@ -1927,15 +1927,15 @@ verify_entry_status(H5C1_t * cache_ptr, (int)expected[i].entry_index, (int)in_cache, (int)expected[i].in_cache); - failure_mssg = msg; + failure_mssg1 = msg; } } - if ( pass ) { + if ( pass1 ) { if ( entry_ptr->size != expected[i].size ) { - pass = FALSE; + pass1 = FALSE; sprintf(msg, "%d entry (%d, %d) size actualexpected = %ld/%ld.\n", tag, @@ -1943,15 +1943,15 @@ verify_entry_status(H5C1_t * cache_ptr, (int)expected[i].entry_index, (long)(entry_ptr->size), (long)expected[i].size); - failure_mssg = msg; + failure_mssg1 = msg; } } - if ( ( pass ) && ( in_cache ) ) { + if ( ( pass1 ) && ( in_cache ) ) { if ( entry_ptr->header.size != expected[i].size ) { - pass = FALSE; + pass1 = FALSE; sprintf(msg, "%d entry (%d, %d) header size actual/expected = %ld/%ld.\n", tag, @@ -1959,15 +1959,15 @@ verify_entry_status(H5C1_t * cache_ptr, (int)expected[i].entry_index, (long)(entry_ptr->header.size), (long)expected[i].size); - failure_mssg = msg; + failure_mssg1 = msg; } } - if ( pass ) { + if ( pass1 ) { if ( entry_ptr->at_main_addr != expected[i].at_main_addr ) { - pass = FALSE; + pass1 = FALSE; sprintf(msg, "%d entry (%d, %d) at main addr actual/expected = %d/%d.\n", tag, @@ -1975,15 +1975,15 @@ verify_entry_status(H5C1_t * cache_ptr, (int)expected[i].entry_index, (int)(entry_ptr->at_main_addr), (int)expected[i].at_main_addr); - failure_mssg = msg; + failure_mssg1 = msg; } } - if ( pass ) { + if ( pass1 ) { if ( entry_ptr->is_dirty != expected[i].is_dirty ) { - pass = FALSE; + pass1 = FALSE; sprintf(msg, "%d entry (%d, %d) is_dirty actual/expected = %d/%d.\n", tag, @@ -1991,15 +1991,15 @@ verify_entry_status(H5C1_t * cache_ptr, (int)expected[i].entry_index, (int)(entry_ptr->is_dirty), (int)expected[i].is_dirty); - failure_mssg = msg; + failure_mssg1 = msg; } } - if ( ( pass ) && ( in_cache ) ) { + if ( ( pass1 ) && ( in_cache ) ) { if ( entry_ptr->header.is_dirty != expected[i].is_dirty ) { - pass = FALSE; + pass1 = FALSE; sprintf(msg, "%d entry (%d, %d) header is_dirty actual/expected = %d/%d.\n", tag, @@ -2007,15 +2007,15 @@ verify_entry_status(H5C1_t * cache_ptr, (int)expected[i].entry_index, (int)(entry_ptr->header.is_dirty), (int)expected[i].is_dirty); - failure_mssg = msg; + failure_mssg1 = msg; } } - if ( pass ) { + if ( pass1 ) { if ( entry_ptr->is_protected != expected[i].is_protected ) { - pass = FALSE; + pass1 = FALSE; sprintf(msg, "%d entry (%d, %d) is_protected actual/expected = %d/%d.\n", tag, @@ -2023,15 +2023,15 @@ verify_entry_status(H5C1_t * cache_ptr, (int)expected[i].entry_index, (int)(entry_ptr->is_protected), (int)expected[i].is_protected); - failure_mssg = msg; + failure_mssg1 = msg; } } - if ( ( pass ) && ( in_cache ) ) { + if ( ( pass1 ) && ( in_cache ) ) { if ( entry_ptr->header.is_protected != expected[i].is_protected ) { - pass = FALSE; + pass1 = FALSE; sprintf(msg, "%d entry (%d, %d) header is_protected actual/expected = %d/%d.\n", tag, @@ -2039,15 +2039,15 @@ verify_entry_status(H5C1_t * cache_ptr, (int)expected[i].entry_index, (int)(entry_ptr->header.is_protected), (int)expected[i].is_protected); - failure_mssg = msg; + failure_mssg1 = msg; } } - if ( pass ) { + if ( pass1 ) { if ( entry_ptr->is_pinned != expected[i].is_pinned ) { - pass = FALSE; + pass1 = FALSE; sprintf(msg, "%d entry (%d, %d) is_pinned actual/expected = %d/%d.\n", tag, @@ -2055,15 +2055,15 @@ verify_entry_status(H5C1_t * cache_ptr, (int)expected[i].entry_index, (int)(entry_ptr->is_pinned), (int)expected[i].is_pinned); - failure_mssg = msg; + failure_mssg1 = msg; } } - if ( ( pass ) && ( in_cache ) ) { + if ( ( pass1 ) && ( in_cache ) ) { if ( entry_ptr->header.is_pinned != expected[i].is_pinned ) { - pass = FALSE; + pass1 = FALSE; sprintf(msg, "%d entry (%d, %d) header is_pinned actual/expected = %d/%d.\n", tag, @@ -2071,18 +2071,18 @@ verify_entry_status(H5C1_t * cache_ptr, (int)expected[i].entry_index, (int)(entry_ptr->header.is_pinned), (int)expected[i].is_pinned); - failure_mssg = msg; + failure_mssg1 = msg; } } - if ( pass ) { + if ( pass1 ) { if ( ( entry_ptr->loaded != expected[i].loaded ) || ( entry_ptr->cleared != expected[i].cleared ) || ( entry_ptr->flushed != expected[i].flushed ) || ( entry_ptr->destroyed != expected[i].destroyed ) ) { - pass = FALSE; + pass1 = FALSE; sprintf(msg, "%d entry (%d,%d) loaded = %d(%d), clrd = %d(%d), flshd = %d(%d), dest = %d(%d)\n", tag, @@ -2096,7 +2096,7 @@ verify_entry_status(H5C1_t * cache_ptr, (int)(expected[i].flushed), (int)(entry_ptr->destroyed), (int)(expected[i].destroyed)); - failure_mssg = msg; + failure_mssg1 = msg; } } i++; @@ -2104,16 +2104,16 @@ verify_entry_status(H5C1_t * cache_ptr, return; -} /* verify_entry_status() */ +} /* verify_entry_status1() */ /*------------------------------------------------------------------------- - * Function: verify_unprotected + * Function: verify_unprotected1 * * Purpose: Verify that no cache entries are marked as protected. If - * any are, set pass to FALSE. + * any are, set pass1 to FALSE. * - * Do nothing if pass is FALSE on entry. + * Do nothing if pass1 is FALSE on entry. * * Return: void * @@ -2126,7 +2126,7 @@ verify_entry_status(H5C1_t * cache_ptr, */ void -verify_unprotected(void) +verify_unprotected1(void) { int i; @@ -2135,12 +2135,12 @@ verify_unprotected(void) int32_t max_index; test_entry_t * base_addr; - if ( pass ) { + if ( pass1 ) { for ( i = 0; i < NUMBER_OF_ENTRY_TYPES; i++ ) { - max_index = max_indices[i]; - base_addr = entries[i]; + max_index = max_indices1[i]; + base_addr = entries1[i]; HDassert( base_addr ); @@ -2159,18 +2159,18 @@ verify_unprotected(void) if ( protected_count > 0 ) { - pass = FALSE; - failure_mssg = "verify_unprotected() found protected entry(s)."; + pass1 = FALSE; + failure_mssg1 = "verify_unprotected1() found protected entry(s)."; } } return; -} /* verify_unprotected() */ +} /* verify_unprotected1() */ /*------------------------------------------------------------------------- - * Function: setup_cache() + * Function: setup_cache1() * * Purpose: Allocate a cache of the desired size and configure it for * use in the test bed. Return a pointer to the new cache @@ -2187,7 +2187,7 @@ verify_unprotected(void) */ H5C1_t * -setup_cache(size_t max_cache_size, +setup_cache1(size_t max_cache_size, size_t min_clean_size) { H5C1_t * cache_ptr = NULL; @@ -2195,16 +2195,16 @@ setup_cache(size_t max_cache_size, cache_ptr = H5C1_create(max_cache_size, min_clean_size, (NUMBER_OF_ENTRY_TYPES - 1), - (const char **)entry_type_names, - check_write_permitted, + (const char **)entry_type_names1, + check_write_permitted1, TRUE, NULL, NULL); if ( cache_ptr == NULL ) { - pass = FALSE; - failure_mssg = "H5C1_create() returned NULL."; + pass1 = FALSE; + failure_mssg1 = "H5C1_create() returned NULL."; } else { @@ -2213,14 +2213,14 @@ setup_cache(size_t max_cache_size, return(cache_ptr); -} /* setup_cache() */ +} /* setup_cache1() */ /*------------------------------------------------------------------------- - * Function: takedown_cache() + * Function: takedown_cache1() * * Purpose: Flush the specified cache and disable it. If requested, - * dump stats first. If pass is FALSE, do nothing. + * dump stats first. If pass1 is FALSE, do nothing. * * Return: void * @@ -2233,13 +2233,13 @@ setup_cache(size_t max_cache_size, */ void -takedown_cache(H5C1_t * cache_ptr, +takedown_cache1(H5C1_t * cache_ptr, hbool_t dump_stats, hbool_t dump_detailed_stats) { HDassert(cache_ptr); - if ( pass ) { + if ( pass1 ) { if ( dump_stats ) { @@ -2251,15 +2251,15 @@ takedown_cache(H5C1_t * cache_ptr, return; -} /* takedown_cache() */ +} /* takedown_cache1() */ /*------------------------------------------------------------------------- - * Function: expunge_entry() + * Function: expunge_entry1() * * Purpose: Expunge the entry indicated by the type and index. * - * Do nothing if pass is FALSE on entry. + * Do nothing if pass1 is FALSE on entry. * * Return: void * @@ -2274,22 +2274,22 @@ takedown_cache(H5C1_t * cache_ptr, */ void -expunge_entry(H5C1_t * cache_ptr, +expunge_entry1(H5C1_t * cache_ptr, int32_t type, int32_t idx) { - /* const char * fcn_name = "expunge_entry()"; */ + /* const char * fcn_name = "expunge_entry1()"; */ herr_t result; test_entry_t * base_addr; test_entry_t * entry_ptr; - if ( pass ) { + if ( pass1 ) { HDassert( cache_ptr ); HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); - HDassert( ( 0 <= idx ) && ( idx <= max_indices[type] ) ); + HDassert( ( 0 <= idx ) && ( idx <= max_indices1[type] ) ); - base_addr = entries[type]; + base_addr = entries1[type]; entry_ptr = &(base_addr[idx]); HDassert( entry_ptr->index == idx ); @@ -2301,24 +2301,24 @@ expunge_entry(H5C1_t * cache_ptr, HDassert( ! ( entry_ptr->header.is_pinned ) ); HDassert( ! ( entry_ptr->is_pinned ) ); - result = H5C1_expunge_entry(NULL, -1, -1, cache_ptr, &(types[type]), + result = H5C1_expunge_entry(NULL, -1, -1, cache_ptr, &(types1[type]), entry_ptr->addr); if ( result < 0 ) { - pass = FALSE; - failure_mssg = "error in H5C1_expunge_entry()."; + pass1 = FALSE; + failure_mssg1 = "error in H5C1_expunge_entry()."; } } return; -} /* expunge_entry() */ +} /* expunge_entry1() */ /*------------------------------------------------------------------------- - * Function: flush_cache() + * Function: flush_cache1() * * Purpose: Flush the specified cache, destroying all entries if requested. If requested, dump stats first. @@ -2334,7 +2334,7 @@ expunge_entry(H5C1_t * cache_ptr, */ void -flush_cache(H5C1_t * cache_ptr, +flush_cache1(H5C1_t * cache_ptr, hbool_t destroy_entries, hbool_t dump_stats, hbool_t dump_detailed_stats) @@ -2343,9 +2343,9 @@ flush_cache(H5C1_t * cache_ptr, HDassert(cache_ptr); - verify_unprotected(); + verify_unprotected1(); - if ( pass ) { + if ( pass1 ) { if ( destroy_entries ) { @@ -2366,17 +2366,17 @@ flush_cache(H5C1_t * cache_ptr, if ( result < 0 ) { - pass = FALSE; - failure_mssg = "error in H5C1_flush_cache()."; + pass1 = FALSE; + failure_mssg1 = "error in H5C1_flush_cache()."; } return; -} /* flush_cache() */ +} /* flush_cache1() */ /*------------------------------------------------------------------------- - * Function: insert_entry() + * Function: insert_entry1() * * Purpose: Insert the entry indicated by the type and index. Mark * it clean or dirty as indicated. @@ -2385,7 +2385,7 @@ flush_cache(H5C1_t * cache_ptr, * a clean entry, but the interface permits it so we should * test it. * - * Do nothing if pass is false. + * Do nothing if pass1 is false. * * Return: void * @@ -2414,7 +2414,7 @@ flush_cache(H5C1_t * cache_ptr, */ void -insert_entry(H5C1_t * cache_ptr, +insert_entry1(H5C1_t * cache_ptr, int32_t type, int32_t idx, hbool_t UNUSED dirty, @@ -2425,13 +2425,13 @@ insert_entry(H5C1_t * cache_ptr, test_entry_t * base_addr; test_entry_t * entry_ptr; - if ( pass ) { + if ( pass1 ) { HDassert( cache_ptr ); HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); - HDassert( ( 0 <= idx ) && ( idx <= max_indices[type] ) ); + HDassert( ( 0 <= idx ) && ( idx <= max_indices1[type] ) ); - base_addr = entries[type]; + base_addr = entries1[type]; entry_ptr = &(base_addr[idx]); HDassert( entry_ptr->index == idx ); @@ -2443,17 +2443,17 @@ insert_entry(H5C1_t * cache_ptr, entry_ptr->is_dirty = TRUE; - result = H5C1_insert_entry(NULL, -1, -1, cache_ptr, &(types[type]), + result = H5C1_insert_entry(NULL, -1, -1, cache_ptr, &(types1[type]), entry_ptr->addr, (void *)entry_ptr, flags); if ( ( result < 0 ) || ( entry_ptr->header.is_protected ) || - ( entry_ptr->header.type != &(types[type]) ) || + ( entry_ptr->header.type != &(types1[type]) ) || ( entry_ptr->size != entry_ptr->header.size ) || ( entry_ptr->addr != entry_ptr->header.addr ) ) { - pass = FALSE; - failure_mssg = "error in H5C1_insert()."; + pass1 = FALSE; + failure_mssg1 = "error in H5C1_insert()."; #if 0 /* This is useful debugging code. Lets keep it around. */ @@ -2461,8 +2461,8 @@ insert_entry(H5C1_t * cache_ptr, HDfprintf(stdout, "entry_ptr->header.is_protected = %d\n", (int)(entry_ptr->header.is_protected)); HDfprintf(stdout, - "entry_ptr->header.type != &(types[type]) = %d\n", - (int)(entry_ptr->header.type != &(types[type]))); + "entry_ptr->header.type != &(types1[type]) = %d\n", + (int)(entry_ptr->header.type != &(types1[type]))); HDfprintf(stdout, "entry_ptr->size != entry_ptr->header.size = %d\n", (int)(entry_ptr->size != entry_ptr->header.size)); @@ -2492,15 +2492,15 @@ insert_entry(H5C1_t * cache_ptr, return; -} /* insert_entry() */ +} /* insert_entry1() */ /*------------------------------------------------------------------------- - * Function: mark_pinned_entry_dirty() + * Function: mark_pinned_entry_dirty1() * * Purpose: Mark the specified entry as dirty. * - * Do nothing if pass is FALSE on entry. + * Do nothing if pass1 is FALSE on entry. * * Return: void * @@ -2515,24 +2515,24 @@ insert_entry(H5C1_t * cache_ptr, */ void -mark_pinned_entry_dirty(H5C1_t * cache_ptr, +mark_pinned_entry_dirty1(H5C1_t * cache_ptr, int32_t type, int32_t idx, hbool_t size_changed, size_t new_size) { - /* const char * fcn_name = "mark_pinned_entry_dirty()"; */ + /* const char * fcn_name = "mark_pinned_entry_dirty1()"; */ herr_t result; test_entry_t * base_addr; test_entry_t * entry_ptr; - if ( pass ) { + if ( pass1 ) { HDassert( cache_ptr ); HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); - HDassert( ( 0 <= idx ) && ( idx <= max_indices[type] ) ); + HDassert( ( 0 <= idx ) && ( idx <= max_indices1[type] ) ); - base_addr = entries[type]; + base_addr = entries1[type]; entry_ptr = &(base_addr[idx]); HDassert( entry_ptr->index == idx ); @@ -2559,7 +2559,7 @@ mark_pinned_entry_dirty(H5C1_t * cache_ptr, if ( ( result < 0 ) || ( ! (entry_ptr->header.is_dirty) ) || ( ! (entry_ptr->header.is_pinned) ) || - ( entry_ptr->header.type != &(types[type]) ) || + ( entry_ptr->header.type != &(types1[type]) ) || ( entry_ptr->size != entry_ptr->header.size ) || ( entry_ptr->addr != entry_ptr->header.addr ) ) { @@ -2570,8 +2570,8 @@ mark_pinned_entry_dirty(H5C1_t * cache_ptr, HDfprintf(stdout, "entry_ptr->header.is_pinned = %d.\n", (int)(entry_ptr->header.is_pinned)); HDfprintf(stdout, - "(entry_ptr->header.type != &(types[type])) = %d.\n", - (int)(entry_ptr->header.type != &(types[type]))); + "(entry_ptr->header.type != &(types1[type])) = %d.\n", + (int)(entry_ptr->header.type != &(types1[type]))); HDfprintf(stdout, "entry_ptr->size = %ld, entry_ptr->header.size = %ld.\n", (long)(entry_ptr->size), (long)(entry_ptr->header.size)); @@ -2579,8 +2579,8 @@ mark_pinned_entry_dirty(H5C1_t * cache_ptr, "entry_ptr->addr = %ld, entry_ptr->header.addr = %ld.\n", (long)(entry_ptr->addr), (long)(entry_ptr->header.addr)); #endif - pass = FALSE; - failure_mssg = "error in H5C1_mark_pinned_entry_dirty()."; + pass1 = FALSE; + failure_mssg1 = "error in H5C1_mark_pinned_entry_dirty()."; } @@ -2590,15 +2590,15 @@ mark_pinned_entry_dirty(H5C1_t * cache_ptr, return; -} /* mark_pinned_entry_dirty() */ +} /* mark_pinned_entry_dirty1() */ /*------------------------------------------------------------------------- - * Function: mark_pinned_or_protected_entry_dirty() + * Function: mark_pinned_or_protected_entry_dirty1() * * Purpose: Mark the specified entry as dirty. * - * Do nothing if pass is FALSE on entry. + * Do nothing if pass1 is FALSE on entry. * * Return: void * @@ -2613,22 +2613,22 @@ mark_pinned_entry_dirty(H5C1_t * cache_ptr, */ void -mark_pinned_or_protected_entry_dirty(H5C1_t * cache_ptr, +mark_pinned_or_protected_entry_dirty1(H5C1_t * cache_ptr, int32_t type, int32_t idx) { - /* const char * fcn_name = "mark_pinned_or_protected_entry_dirty()"; */ + /* const char * fcn_name = "mark_pinned_or_protected_entry_dirty1()"; */ herr_t result; test_entry_t * base_addr; test_entry_t * entry_ptr; - if ( pass ) { + if ( pass1 ) { HDassert( cache_ptr ); HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); - HDassert( ( 0 <= idx ) && ( idx <= max_indices[type] ) ); + HDassert( ( 0 <= idx ) && ( idx <= max_indices1[type] ) ); - base_addr = entries[type]; + base_addr = entries1[type]; entry_ptr = &(base_addr[idx]); HDassert( entry_ptr->index == idx ); @@ -2660,14 +2660,14 @@ mark_pinned_or_protected_entry_dirty(H5C1_t * cache_ptr, ( ! ( entry_ptr->header.is_dirty ) ) ) || - ( entry_ptr->header.type != &(types[type]) ) + ( entry_ptr->header.type != &(types1[type]) ) || ( entry_ptr->size != entry_ptr->header.size ) || ( entry_ptr->addr != entry_ptr->header.addr ) ) { - pass = FALSE; - failure_mssg = + pass1 = FALSE; + failure_mssg1 = "error in H5C1_mark_pinned_or_protected_entry_dirty()."; } @@ -2678,11 +2678,11 @@ mark_pinned_or_protected_entry_dirty(H5C1_t * cache_ptr, return; -} /* mark_pinned_or_protected_entry_dirty() */ +} /* mark_pinned_or_protected_entry_dirty1() */ /*------------------------------------------------------------------------- - * Function: rename_entry() + * Function: rename_entry1() * * Purpose: Rename the entry indicated by the type and index to its * main or alternate address as indicated. If the entry is @@ -2703,7 +2703,7 @@ mark_pinned_or_protected_entry_dirty(H5C1_t * cache_ptr, */ void -rename_entry(H5C1_t * cache_ptr, +rename_entry1(H5C1_t * cache_ptr, int32_t type, int32_t idx, hbool_t main_addr) @@ -2717,9 +2717,9 @@ rename_entry(H5C1_t * cache_ptr, HDassert( cache_ptr ); HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); - HDassert( ( 0 <= idx ) && ( idx <= max_indices[type] ) ); + HDassert( ( 0 <= idx ) && ( idx <= max_indices1[type] ) ); - base_addr = entries[type]; + base_addr = entries1[type]; entry_ptr = &(base_addr[idx]); HDassert( entry_ptr->index == idx ); @@ -2755,7 +2755,7 @@ rename_entry(H5C1_t * cache_ptr, entry_ptr->is_dirty = TRUE; - result = H5C1_rename_entry(cache_ptr, &(types[type]), + result = H5C1_rename_entry(cache_ptr, &(types1[type]), old_addr, new_addr); } @@ -2765,8 +2765,8 @@ rename_entry(H5C1_t * cache_ptr, ( ( ! ( entry_ptr->header.destroy_in_progress ) ) && ( entry_ptr->header.addr != new_addr ) ) ) { - pass = FALSE; - failure_mssg = "error in H5C1_rename_entry()."; + pass1 = FALSE; + failure_mssg1 = "error in H5C1_rename_entry()."; } else { @@ -2782,15 +2782,15 @@ rename_entry(H5C1_t * cache_ptr, return; -} /* rename_entry() */ +} /* rename_entry1() */ /*------------------------------------------------------------------------- - * Function: protect_entry() + * Function: protect_entry1() * * Purpose: Protect the entry indicated by the type and index. * - * Do nothing if pass is FALSE on entry. + * Do nothing if pass1 is FALSE on entry. * * Return: void * @@ -2799,7 +2799,7 @@ rename_entry(H5C1_t * cache_ptr, * * Modifications: * - * - Modified call to H5C1_protect to pass H5C1__NO_FLAGS_SET in the + * - Modified call to H5C1_protect to pass1 H5C1__NO_FLAGS_SET in the * new flags parameter. * JRM -- 3/28/07 * @@ -2807,22 +2807,22 @@ rename_entry(H5C1_t * cache_ptr, */ void -protect_entry(H5C1_t * cache_ptr, +protect_entry1(H5C1_t * cache_ptr, int32_t type, int32_t idx) { - /* const char * fcn_name = "protect_entry()"; */ + /* const char * fcn_name = "protect_entry1()"; */ test_entry_t * base_addr; test_entry_t * entry_ptr; H5C1_cache_entry_t * cache_entry_ptr; - if ( pass ) { + if ( pass1 ) { HDassert( cache_ptr ); HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); - HDassert( ( 0 <= idx ) && ( idx <= max_indices[type] ) ); + HDassert( ( 0 <= idx ) && ( idx <= max_indices1[type] ) ); - base_addr = entries[type]; + base_addr = entries1[type]; entry_ptr = &(base_addr[idx]); HDassert( entry_ptr->index == idx ); @@ -2830,13 +2830,13 @@ protect_entry(H5C1_t * cache_ptr, HDassert( entry_ptr == entry_ptr->self ); HDassert( !(entry_ptr->is_protected) ); - cache_entry_ptr = H5C1_protect(NULL, -1, -1, cache_ptr, &(types[type]), + cache_entry_ptr = H5C1_protect(NULL, -1, -1, cache_ptr, &(types1[type]), entry_ptr->addr, NULL, NULL, H5C1__NO_FLAGS_SET); if ( ( cache_entry_ptr != (void *)entry_ptr ) || ( !(entry_ptr->header.is_protected) ) || - ( entry_ptr->header.type != &(types[type]) ) || + ( entry_ptr->header.type != &(types1[type]) ) || ( entry_ptr->size != entry_ptr->header.size ) || ( entry_ptr->addr != entry_ptr->header.addr ) ) { @@ -2853,8 +2853,8 @@ protect_entry(H5C1_t * cache_ptr, HDfprintf(stdout, "entry_ptr->header.is_protected = %d\n", (int)(entry_ptr->header.is_protected)); HDfprintf(stdout, - "( entry_ptr->header.type != &(types[type]) ) = %d\n", - (int)( entry_ptr->header.type != &(types[type]) )); + "( entry_ptr->header.type != &(types1[type]) ) = %d\n", + (int)( entry_ptr->header.type != &(types1[type]) )); HDfprintf(stdout, "entry_ptr->size = %d, entry_ptr->header.size = %d\n", (int)(entry_ptr->size), (int)(entry_ptr->header.size)); @@ -2862,8 +2862,8 @@ protect_entry(H5C1_t * cache_ptr, "entry_ptr->addr = %d, entry_ptr->header.addr = %d\n", (int)(entry_ptr->addr), (int)(entry_ptr->header.addr)); #endif - pass = FALSE; - failure_mssg = "error in H5C1_protect()."; + pass1 = FALSE; + failure_mssg1 = "error in H5C1_protect()."; } else { @@ -2880,16 +2880,16 @@ protect_entry(H5C1_t * cache_ptr, return; -} /* protect_entry() */ +} /* protect_entry1() */ /*------------------------------------------------------------------------- - * Function: protect_entry_ro() + * Function: protect_entry_ro1() * * Purpose: Do a read only protect the entry indicated by the type * and index. * - * Do nothing if pass is FALSE on entry. + * Do nothing if pass1 is FALSE on entry. * * Return: void * @@ -2904,22 +2904,22 @@ protect_entry(H5C1_t * cache_ptr, */ void -protect_entry_ro(H5C1_t * cache_ptr, +protect_entry_ro1(H5C1_t * cache_ptr, int32_t type, int32_t idx) { - /* const char * fcn_name = "protect_entry_ro()"; */ + /* const char * fcn_name = "protect_entry_ro1()"; */ test_entry_t * base_addr; test_entry_t * entry_ptr; H5C1_cache_entry_t * cache_entry_ptr; - if ( pass ) { + if ( pass1 ) { HDassert( cache_ptr ); HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); - HDassert( ( 0 <= idx ) && ( idx <= max_indices[type] ) ); + HDassert( ( 0 <= idx ) && ( idx <= max_indices1[type] ) ); - base_addr = entries[type]; + base_addr = entries1[type]; entry_ptr = &(base_addr[idx]); HDassert( entry_ptr->index == idx ); @@ -2929,7 +2929,7 @@ protect_entry_ro(H5C1_t * cache_ptr, ( ( entry_ptr->is_read_only ) && ( entry_ptr->ro_ref_count > 0 ) ) ); - cache_entry_ptr = H5C1_protect(NULL, -1, -1, cache_ptr, &(types[type]), + cache_entry_ptr = H5C1_protect(NULL, -1, -1, cache_ptr, &(types1[type]), entry_ptr->addr, NULL, NULL, H5C1__READ_ONLY_FLAG); @@ -2937,12 +2937,12 @@ protect_entry_ro(H5C1_t * cache_ptr, ( !(entry_ptr->header.is_protected) ) || ( !(entry_ptr->header.is_read_only) ) || ( entry_ptr->header.ro_ref_count <= 0 ) || - ( entry_ptr->header.type != &(types[type]) ) || + ( entry_ptr->header.type != &(types1[type]) ) || ( entry_ptr->size != entry_ptr->header.size ) || ( entry_ptr->addr != entry_ptr->header.addr ) ) { - pass = FALSE; - failure_mssg = "error in read only H5C1_protect()."; + pass1 = FALSE; + failure_mssg1 = "error in read only H5C1_protect()."; } else { @@ -2960,15 +2960,15 @@ protect_entry_ro(H5C1_t * cache_ptr, return; -} /* protect_entry_ro() */ +} /* protect_entry_ro1() */ /*------------------------------------------------------------------------- - * Function: unpin_entry() + * Function: unpin_entry1() * * Purpose: Unpin the entry indicated by the type and index. * - * Do nothing if pass is FALSE on entry. + * Do nothing if pass1 is FALSE on entry. * * Return: void * @@ -2983,22 +2983,22 @@ protect_entry_ro(H5C1_t * cache_ptr, */ void -unpin_entry(H5C1_t * cache_ptr, +unpin_entry1(H5C1_t * cache_ptr, int32_t type, int32_t idx) { - /* const char * fcn_name = "unpin_entry()"; */ + /* const char * fcn_name = "unpin_entry1()"; */ herr_t result; test_entry_t * base_addr; test_entry_t * entry_ptr; - if ( pass ) { + if ( pass1 ) { HDassert( cache_ptr ); HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); - HDassert( ( 0 <= idx ) && ( idx <= max_indices[type] ) ); + HDassert( ( 0 <= idx ) && ( idx <= max_indices1[type] ) ); - base_addr = entries[type]; + base_addr = entries1[type]; entry_ptr = &(base_addr[idx]); HDassert( entry_ptr->index == idx ); @@ -3013,12 +3013,12 @@ unpin_entry(H5C1_t * cache_ptr, if ( ( result < 0 ) || ( entry_ptr->header.is_pinned ) || - ( entry_ptr->header.type != &(types[type]) ) || + ( entry_ptr->header.type != &(types1[type]) ) || ( entry_ptr->size != entry_ptr->header.size ) || ( entry_ptr->addr != entry_ptr->header.addr ) ) { - pass = FALSE; - failure_mssg = "error in H5C1_unpin()."; + pass1 = FALSE; + failure_mssg1 = "error in H5C1_unpin()."; } @@ -3030,15 +3030,15 @@ unpin_entry(H5C1_t * cache_ptr, return; -} /* unpin_entry() */ +} /* unpin_entry1() */ /*------------------------------------------------------------------------- - * Function: unprotect_entry() + * Function: unprotect_entry1() * * Purpose: Unprotect the entry indicated by the type and index. * - * Do nothing if pass is FALSE on entry. + * Do nothing if pass1 is FALSE on entry. * * Return: void * @@ -3069,26 +3069,26 @@ unpin_entry(H5C1_t * cache_ptr, */ void -unprotect_entry(H5C1_t * cache_ptr, +unprotect_entry1(H5C1_t * cache_ptr, int32_t type, int32_t idx, int dirty, unsigned int flags) { - /* const char * fcn_name = "unprotect_entry()"; */ + /* const char * fcn_name = "unprotect_entry1()"; */ herr_t result; hbool_t pin_flag_set; hbool_t unpin_flag_set; test_entry_t * base_addr; test_entry_t * entry_ptr; - if ( pass ) { + if ( pass1 ) { HDassert( cache_ptr ); HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); - HDassert( ( 0 <= idx ) && ( idx <= max_indices[type] ) ); + HDassert( ( 0 <= idx ) && ( idx <= max_indices1[type] ) ); - base_addr = entries[type]; + base_addr = entries1[type]; entry_ptr = &(base_addr[idx]); HDassert( entry_ptr->index == idx ); @@ -3111,7 +3111,7 @@ unprotect_entry(H5C1_t * cache_ptr, entry_ptr->is_dirty = (entry_ptr->is_dirty || dirty); } - result = H5C1_unprotect(NULL, -1, -1, cache_ptr, &(types[type]), + result = H5C1_unprotect(NULL, -1, -1, cache_ptr, &(types1[type]), entry_ptr->addr, (void *)entry_ptr, flags, (size_t)0); @@ -3119,7 +3119,7 @@ unprotect_entry(H5C1_t * cache_ptr, ( ( entry_ptr->header.is_protected ) && ( ( ! ( entry_ptr->is_read_only ) ) || ( entry_ptr->ro_ref_count <= 0 ) ) ) || - ( entry_ptr->header.type != &(types[type]) ) || + ( entry_ptr->header.type != &(types1[type]) ) || ( entry_ptr->size != entry_ptr->header.size ) || ( entry_ptr->addr != entry_ptr->header.addr ) ) { @@ -3132,7 +3132,7 @@ unprotect_entry(H5C1_t * cache_ptr, ( entry_ptr->ro_ref_count <= 0 ) ) ) { HDfprintf(stdout, "protected and not RO or refcnt <= 0.\n"); } - if ( entry_ptr->header.type != &(types[type]) ) { + if ( entry_ptr->header.type != &(types1[type]) ) { HDfprintf(stdout, "type disagreement.\n"); } if ( entry_ptr->size != entry_ptr->header.size ) { @@ -3143,8 +3143,8 @@ unprotect_entry(H5C1_t * cache_ptr, } #endif /* JRM */ - pass = FALSE; - failure_mssg = "error in H5C1_unprotect()."; + pass1 = FALSE; + failure_mssg1 = "error in H5C1_unprotect()."; } else @@ -3194,21 +3194,21 @@ unprotect_entry(H5C1_t * cache_ptr, return; -} /* unprotect_entry() */ +} /* unprotect_entry1() */ /*------------------------------------------------------------------------- - * Function: unprotect_entry_with_size_change() + * Function: unprotect_entry1_with_size_change() * - * Purpose: Version of unprotect_entry() that allow access to the new - * size change parameters in H5C1_unprotect_entry() + * Purpose: Version of unprotect_entry1() that allow access to the new + * size change parameters in H5C1_unprotect_entry1() * * At present, only the sizes of VARIABLE_ENTRY_TYPE entries * can be changed. Thus this function will scream and die * if the H5C1__SIZE_CHANGED_FLAG is set and the type is not * VARIABLE_ENTRY_TYPE. * - * Do nothing if pass is FALSE on entry. + * Do nothing if pass1 is FALSE on entry. * * Return: void * @@ -3223,13 +3223,13 @@ unprotect_entry(H5C1_t * cache_ptr, */ void -unprotect_entry_with_size_change(H5C1_t * cache_ptr, +unprotect_entry1_with_size_change(H5C1_t * cache_ptr, int32_t type, int32_t idx, unsigned int flags, size_t new_size) { - /* const char * fcn_name = "unprotect_entry_with_size_change()"; */ + /* const char * fcn_name = "unprotect_entry1_with_size_change()"; */ herr_t result; hbool_t dirty_flag_set; hbool_t pin_flag_set; @@ -3238,14 +3238,14 @@ unprotect_entry_with_size_change(H5C1_t * cache_ptr, test_entry_t * base_addr; test_entry_t * entry_ptr; - if ( pass ) { + if ( pass1 ) { HDassert( cache_ptr ); HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); - HDassert( ( 0 <= idx ) && ( idx <= max_indices[type] ) ); - HDassert( new_size <= entry_sizes[type] ); + HDassert( ( 0 <= idx ) && ( idx <= max_indices1[type] ) ); + HDassert( new_size <= entry_sizes1[type] ); - base_addr = entries[type]; + base_addr = entries1[type]; entry_ptr = &(base_addr[idx]); HDassert( entry_ptr->index == idx ); @@ -3275,18 +3275,18 @@ unprotect_entry_with_size_change(H5C1_t * cache_ptr, entry_ptr->size = new_size; } - result = H5C1_unprotect(NULL, -1, -1, cache_ptr, &(types[type]), + result = H5C1_unprotect(NULL, -1, -1, cache_ptr, &(types1[type]), entry_ptr->addr, (void *)entry_ptr, flags, new_size); if ( ( result < 0 ) || ( entry_ptr->header.is_protected ) || - ( entry_ptr->header.type != &(types[type]) ) || + ( entry_ptr->header.type != &(types1[type]) ) || ( entry_ptr->size != entry_ptr->header.size ) || ( entry_ptr->addr != entry_ptr->header.addr ) ) { - pass = FALSE; - failure_mssg = "error in H5C1_unprotect()."; + pass1 = FALSE; + failure_mssg1 = "error in H5C1_unprotect()."; } else @@ -3318,15 +3318,15 @@ unprotect_entry_with_size_change(H5C1_t * cache_ptr, return; -} /* unprotect_entry_with_size_change() */ +} /* unprotect_entry1_with_size_change() */ /*------------------------------------------------------------------------- - * Function: row_major_scan_forward() + * Function: row_major_scan_forward1() * * Purpose: Do a sequence of inserts, protects, unprotects, renames, * destroys while scanning through the set of entries. If - * pass is false on entry, do nothing. + * pass1 is false on entry, do nothing. * * Return: void * @@ -3343,7 +3343,7 @@ unprotect_entry_with_size_change(H5C1_t * cache_ptr, */ void -row_major_scan_forward(H5C1_t * cache_ptr, +row_major_scan_forward1(H5C1_t * cache_ptr, int32_t lag, hbool_t verbose, hbool_t reset_stats, @@ -3358,7 +3358,7 @@ row_major_scan_forward(H5C1_t * cache_ptr, int dirty_destroys, int dirty_unprotects) { - const char * fcn_name = "row_major_scan_forward"; + const char * fcn_name = "row_major_scan_forward1"; int32_t type; int32_t idx; @@ -3369,227 +3369,227 @@ row_major_scan_forward(H5C1_t * cache_ptr, type = 0; - if ( ( pass ) && ( reset_stats ) ) { + if ( ( pass1 ) && ( reset_stats ) ) { H5C1_stats__reset(cache_ptr); } - while ( ( pass ) && ( type < NUMBER_OF_ENTRY_TYPES ) ) + while ( ( pass1 ) && ( type < NUMBER_OF_ENTRY_TYPES ) ) { idx = -lag; - while ( ( pass ) && ( idx <= (max_indices[type] + lag) ) ) + while ( ( pass1 ) && ( idx <= (max_indices1[type] + lag) ) ) { if ( verbose ) { HDfprintf(stdout, "%d:%d: ", type, idx); } - if ( ( pass ) && ( do_inserts ) && ( (idx + lag) >= 0 ) && - ( (idx + lag) <= max_indices[type] ) && + if ( ( pass1 ) && ( do_inserts ) && ( (idx + lag) >= 0 ) && + ( (idx + lag) <= max_indices1[type] ) && ( ((idx + lag) % 2) == 0 ) && - ( ! entry_in_cache(cache_ptr, type, (idx + lag)) ) ) { + ( ! entry_in_cache1(cache_ptr, type, (idx + lag)) ) ) { if ( verbose ) HDfprintf(stdout, "(i, %d, %d) ", type, (idx + lag)); - insert_entry(cache_ptr, type, (idx + lag), dirty_inserts, + insert_entry1(cache_ptr, type, (idx + lag), dirty_inserts, H5C1__NO_FLAGS_SET); } - if ( ( pass ) && ( (idx + lag - 1) >= 0 ) && - ( (idx + lag - 1) <= max_indices[type] ) && + if ( ( pass1 ) && ( (idx + lag - 1) >= 0 ) && + ( (idx + lag - 1) <= max_indices1[type] ) && ( ( (idx + lag - 1) % 3 ) == 0 ) ) { if ( verbose ) HDfprintf(stdout, "(p, %d, %d) ", type, (idx + lag - 1)); - protect_entry(cache_ptr, type, (idx + lag - 1)); + protect_entry1(cache_ptr, type, (idx + lag - 1)); } - if ( ( pass ) && ( (idx + lag - 2) >= 0 ) && - ( (idx + lag - 2) <= max_indices[type] ) && + if ( ( pass1 ) && ( (idx + lag - 2) >= 0 ) && + ( (idx + lag - 2) <= max_indices1[type] ) && ( ( (idx + lag - 2) % 3 ) == 0 ) ) { if ( verbose ) HDfprintf(stdout, "(u, %d, %d) ", type, (idx + lag - 2)); - unprotect_entry(cache_ptr, type, idx+lag-2, NO_CHANGE, + unprotect_entry1(cache_ptr, type, idx+lag-2, NO_CHANGE, H5C1__NO_FLAGS_SET); } - if ( ( pass ) && ( do_renames ) && ( (idx + lag - 2) >= 0 ) && - ( (idx + lag - 2) <= max_indices[type] ) && + if ( ( pass1 ) && ( do_renames ) && ( (idx + lag - 2) >= 0 ) && + ( (idx + lag - 2) <= max_indices1[type] ) && ( ( (idx + lag - 2) % 3 ) == 0 ) ) { - rename_entry(cache_ptr, type, (idx + lag - 2), + rename_entry1(cache_ptr, type, (idx + lag - 2), rename_to_main_addr); } - if ( ( pass ) && ( (idx + lag - 3) >= 0 ) && - ( (idx + lag - 3) <= max_indices[type] ) && + if ( ( pass1 ) && ( (idx + lag - 3) >= 0 ) && + ( (idx + lag - 3) <= max_indices1[type] ) && ( ( (idx + lag - 3) % 5 ) == 0 ) ) { if ( verbose ) HDfprintf(stdout, "(p, %d, %d) ", type, (idx + lag - 3)); - protect_entry(cache_ptr, type, (idx + lag - 3)); + protect_entry1(cache_ptr, type, (idx + lag - 3)); } - if ( ( pass ) && ( (idx + lag - 5) >= 0 ) && - ( (idx + lag - 5) <= max_indices[type] ) && + if ( ( pass1 ) && ( (idx + lag - 5) >= 0 ) && + ( (idx + lag - 5) <= max_indices1[type] ) && ( ( (idx + lag - 5) % 5 ) == 0 ) ) { if ( verbose ) HDfprintf(stdout, "(u, %d, %d) ", type, (idx + lag - 5)); - unprotect_entry(cache_ptr, type, idx+lag-5, NO_CHANGE, + unprotect_entry1(cache_ptr, type, idx+lag-5, NO_CHANGE, H5C1__NO_FLAGS_SET); } if ( do_mult_ro_protects ) { - if ( ( pass ) && ( (idx + lag - 5) >= 0 ) && - ( (idx + lag - 5) < max_indices[type] ) && + if ( ( pass1 ) && ( (idx + lag - 5) >= 0 ) && + ( (idx + lag - 5) < max_indices1[type] ) && ( (idx + lag - 5) % 9 == 0 ) ) { if ( verbose ) HDfprintf(stdout, "(p-ro, %d, %d) ", type, (idx + lag - 5)); - protect_entry_ro(cache_ptr, type, (idx + lag - 5)); + protect_entry_ro1(cache_ptr, type, (idx + lag - 5)); } - if ( ( pass ) && ( (idx + lag - 6) >= 0 ) && - ( (idx + lag - 6) < max_indices[type] ) && + if ( ( pass1 ) && ( (idx + lag - 6) >= 0 ) && + ( (idx + lag - 6) < max_indices1[type] ) && ( (idx + lag - 6) % 11 == 0 ) ) { if ( verbose ) HDfprintf(stdout, "(p-ro, %d, %d) ", type, (idx + lag - 6)); - protect_entry_ro(cache_ptr, type, (idx + lag - 6)); + protect_entry_ro1(cache_ptr, type, (idx + lag - 6)); } - if ( ( pass ) && ( (idx + lag - 7) >= 0 ) && - ( (idx + lag - 7) < max_indices[type] ) && + if ( ( pass1 ) && ( (idx + lag - 7) >= 0 ) && + ( (idx + lag - 7) < max_indices1[type] ) && ( (idx + lag - 7) % 13 == 0 ) ) { if ( verbose ) HDfprintf(stdout, "(p-ro, %d, %d) ", type, (idx + lag - 7)); - protect_entry_ro(cache_ptr, type, (idx + lag - 7)); + protect_entry_ro1(cache_ptr, type, (idx + lag - 7)); } - if ( ( pass ) && ( (idx + lag - 7) >= 0 ) && - ( (idx + lag - 7) < max_indices[type] ) && + if ( ( pass1 ) && ( (idx + lag - 7) >= 0 ) && + ( (idx + lag - 7) < max_indices1[type] ) && ( (idx + lag - 7) % 9 == 0 ) ) { if ( verbose ) HDfprintf(stdout, "(u-ro, %d, %d) ", type, (idx + lag - 7)); - unprotect_entry(cache_ptr, type, (idx + lag - 7), + unprotect_entry1(cache_ptr, type, (idx + lag - 7), FALSE, H5C1__NO_FLAGS_SET); } - if ( ( pass ) && ( (idx + lag - 8) >= 0 ) && - ( (idx + lag - 8) < max_indices[type] ) && + if ( ( pass1 ) && ( (idx + lag - 8) >= 0 ) && + ( (idx + lag - 8) < max_indices1[type] ) && ( (idx + lag - 8) % 11 == 0 ) ) { if ( verbose ) HDfprintf(stdout, "(u-ro, %d, %d) ", type, (idx + lag - 8)); - unprotect_entry(cache_ptr, type, (idx + lag - 8), + unprotect_entry1(cache_ptr, type, (idx + lag - 8), FALSE, H5C1__NO_FLAGS_SET); } - if ( ( pass ) && ( (idx + lag - 9) >= 0 ) && - ( (idx + lag - 9) < max_indices[type] ) && + if ( ( pass1 ) && ( (idx + lag - 9) >= 0 ) && + ( (idx + lag - 9) < max_indices1[type] ) && ( (idx + lag - 9) % 13 == 0 ) ) { if ( verbose ) HDfprintf(stdout, "(u-ro, %d, %d) ", type, (idx + lag - 9)); - unprotect_entry(cache_ptr, type, (idx + lag - 9), + unprotect_entry1(cache_ptr, type, (idx + lag - 9), FALSE, H5C1__NO_FLAGS_SET); } } /* if ( do_mult_ro_protects ) */ - if ( ( pass ) && ( idx >= 0 ) && ( idx <= max_indices[type] ) ) { + if ( ( pass1 ) && ( idx >= 0 ) && ( idx <= max_indices1[type] ) ) { if ( verbose ) HDfprintf(stdout, "(p, %d, %d) ", type, idx); - protect_entry(cache_ptr, type, idx); + protect_entry1(cache_ptr, type, idx); } - if ( ( pass ) && ( (idx - lag + 2) >= 0 ) && - ( (idx - lag + 2) <= max_indices[type] ) && + if ( ( pass1 ) && ( (idx - lag + 2) >= 0 ) && + ( (idx - lag + 2) <= max_indices1[type] ) && ( ( (idx - lag + 2) % 7 ) == 0 ) ) { if ( verbose ) HDfprintf(stdout, "(u, %d, %d) ", type, (idx - lag + 2)); - unprotect_entry(cache_ptr, type, idx-lag+2, NO_CHANGE, + unprotect_entry1(cache_ptr, type, idx-lag+2, NO_CHANGE, H5C1__NO_FLAGS_SET); } - if ( ( pass ) && ( (idx - lag + 1) >= 0 ) && - ( (idx - lag + 1) <= max_indices[type] ) && + if ( ( pass1 ) && ( (idx - lag + 1) >= 0 ) && + ( (idx - lag + 1) <= max_indices1[type] ) && ( ( (idx - lag + 1) % 7 ) == 0 ) ) { if ( verbose ) HDfprintf(stdout, "(p, %d, %d) ", type, (idx - lag + 1)); - protect_entry(cache_ptr, type, (idx - lag + 1)); + protect_entry1(cache_ptr, type, (idx - lag + 1)); } if ( do_destroys ) { - if ( ( pass ) && ( (idx - lag) >= 0 ) && - ( ( idx - lag) <= max_indices[type] ) ) { + if ( ( pass1 ) && ( (idx - lag) >= 0 ) && + ( ( idx - lag) <= max_indices1[type] ) ) { switch ( (idx - lag) %4 ) { case 0: /* we just did an insert */ - unprotect_entry(cache_ptr, type, idx - lag, + unprotect_entry1(cache_ptr, type, idx - lag, NO_CHANGE, H5C1__NO_FLAGS_SET); break; case 1: - if ( (entries[type])[idx-lag].is_dirty ) { + if ( (entries1[type])[idx-lag].is_dirty ) { - unprotect_entry(cache_ptr, type, idx - lag, + unprotect_entry1(cache_ptr, type, idx - lag, NO_CHANGE, H5C1__NO_FLAGS_SET); } else { - unprotect_entry(cache_ptr, type, idx - lag, + unprotect_entry1(cache_ptr, type, idx - lag, dirty_unprotects, H5C1__NO_FLAGS_SET); } break; case 2: /* we just did an insrt */ - unprotect_entry(cache_ptr, type, idx - lag, + unprotect_entry1(cache_ptr, type, idx - lag, NO_CHANGE, H5C1__DELETED_FLAG); break; case 3: - if ( (entries[type])[idx-lag].is_dirty ) { + if ( (entries1[type])[idx-lag].is_dirty ) { - unprotect_entry(cache_ptr, type, idx - lag, + unprotect_entry1(cache_ptr, type, idx - lag, NO_CHANGE, H5C1__DELETED_FLAG); } else { - unprotect_entry(cache_ptr, type, idx - lag, + unprotect_entry1(cache_ptr, type, idx - lag, dirty_destroys, H5C1__DELETED_FLAG); } @@ -3603,13 +3603,13 @@ row_major_scan_forward(H5C1_t * cache_ptr, } else { - if ( ( pass ) && ( (idx - lag) >= 0 ) && - ( ( idx - lag) <= max_indices[type] ) ) { + if ( ( pass1 ) && ( (idx - lag) >= 0 ) && + ( ( idx - lag) <= max_indices1[type] ) ) { if ( verbose ) HDfprintf(stdout, "(u, %d, %d) ", type, (idx - lag)); - unprotect_entry(cache_ptr, type, idx - lag, + unprotect_entry1(cache_ptr, type, idx - lag, dirty_unprotects, H5C1__NO_FLAGS_SET); } } @@ -3622,22 +3622,22 @@ row_major_scan_forward(H5C1_t * cache_ptr, type++; } - if ( ( pass ) && ( display_stats ) ) { + if ( ( pass1 ) && ( display_stats ) ) { H5C1_stats(cache_ptr, "test cache", display_detailed_stats); } return; -} /* row_major_scan_forward() */ +} /* row_major_scan_forward1() */ /*------------------------------------------------------------------------- - * Function: hl_row_major_scan_forward() + * Function: hl_row_major_scan_forward1() * * Purpose: Do a high locality sequence of inserts, protects, and * unprotects while scanning through the set of entries. - * If pass is false on entry, do nothing. + * If pass1 is false on entry, do nothing. * * Return: void * @@ -3655,7 +3655,7 @@ row_major_scan_forward(H5C1_t * cache_ptr, */ void -hl_row_major_scan_forward(H5C1_t * cache_ptr, +hl_row_major_scan_forward1(H5C1_t * cache_ptr, int32_t max_index, hbool_t verbose, hbool_t reset_stats, @@ -3664,7 +3664,7 @@ hl_row_major_scan_forward(H5C1_t * cache_ptr, hbool_t do_inserts, hbool_t dirty_inserts) { - const char * fcn_name = "hl_row_major_scan_forward"; + const char * fcn_name = "hl_row_major_scan_forward1"; int32_t type; int32_t idx; int32_t i; @@ -3680,46 +3680,46 @@ hl_row_major_scan_forward(H5C1_t * cache_ptr, type = 0; - if ( ( pass ) && ( reset_stats ) ) { + if ( ( pass1 ) && ( reset_stats ) ) { H5C1_stats__reset(cache_ptr); } - while ( ( pass ) && ( type < NUMBER_OF_ENTRY_TYPES ) ) + while ( ( pass1 ) && ( type < NUMBER_OF_ENTRY_TYPES ) ) { idx = -lag; - local_max_index = MIN(max_index, max_indices[type]); + local_max_index = MIN(max_index, max_indices1[type]); - while ( ( pass ) && ( idx <= (local_max_index + lag) ) ) + while ( ( pass1 ) && ( idx <= (local_max_index + lag) ) ) { - if ( ( pass ) && ( do_inserts ) && ( (idx + lag) >= 0 ) && - ( (idx + lag) <= max_indices[type] ) && + if ( ( pass1 ) && ( do_inserts ) && ( (idx + lag) >= 0 ) && + ( (idx + lag) <= max_indices1[type] ) && ( ((idx + lag) % 2) == 0 ) && - ( ! entry_in_cache(cache_ptr, type, (idx + lag)) ) ) { + ( ! entry_in_cache1(cache_ptr, type, (idx + lag)) ) ) { if ( verbose ) HDfprintf(stdout, "(i, %d, %d) ", type, (idx + lag)); - insert_entry(cache_ptr, type, (idx + lag), dirty_inserts, + insert_entry1(cache_ptr, type, (idx + lag), dirty_inserts, H5C1__NO_FLAGS_SET); } i = idx; - while ( ( pass ) && ( i >= idx - lag ) && ( i >= 0 ) ) + while ( ( pass1 ) && ( i >= idx - lag ) && ( i >= 0 ) ) { - if ( ( pass ) && ( i >= 0 ) && ( i <= local_max_index ) ) { + if ( ( pass1 ) && ( i >= 0 ) && ( i <= local_max_index ) ) { if ( verbose ) HDfprintf(stdout, "(p, %d, %d) ", type, i); - protect_entry(cache_ptr, type, i); + protect_entry1(cache_ptr, type, i); if ( verbose ) HDfprintf(stdout, "(u, %d, %d) ", type, i); - unprotect_entry(cache_ptr, type, i, NO_CHANGE, + unprotect_entry1(cache_ptr, type, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i--; @@ -3733,22 +3733,22 @@ hl_row_major_scan_forward(H5C1_t * cache_ptr, type++; } - if ( ( pass ) && ( display_stats ) ) { + if ( ( pass1 ) && ( display_stats ) ) { H5C1_stats(cache_ptr, "test cache", display_detailed_stats); } return; -} /* hl_row_major_scan_forward() */ +} /* hl_row_major_scan_forward1() */ /*------------------------------------------------------------------------- - * Function: row_major_scan_backward() + * Function: row_major_scan_backward1() * * Purpose: Do a sequence of inserts, protects, unprotects, renames, * destroys while scanning backwards through the set of - * entries. If pass is false on entry, do nothing. + * entries. If pass1 is false on entry, do nothing. * * Return: void * @@ -3765,7 +3765,7 @@ hl_row_major_scan_forward(H5C1_t * cache_ptr, */ void -row_major_scan_backward(H5C1_t * cache_ptr, +row_major_scan_backward1(H5C1_t * cache_ptr, int32_t lag, hbool_t verbose, hbool_t reset_stats, @@ -3780,7 +3780,7 @@ row_major_scan_backward(H5C1_t * cache_ptr, int dirty_destroys, int dirty_unprotects) { - const char * fcn_name = "row_major_scan_backward"; + const char * fcn_name = "row_major_scan_backward1"; int32_t type; int32_t idx; @@ -3791,225 +3791,225 @@ row_major_scan_backward(H5C1_t * cache_ptr, type = NUMBER_OF_ENTRY_TYPES - 1; - if ( ( pass ) && ( reset_stats ) ) { + if ( ( pass1 ) && ( reset_stats ) ) { H5C1_stats__reset(cache_ptr); } - while ( ( pass ) && ( type >= 0 ) ) + while ( ( pass1 ) && ( type >= 0 ) ) { - idx = max_indices[type] + lag; + idx = max_indices1[type] + lag; - while ( ( pass ) && ( idx >= -lag ) ) + while ( ( pass1 ) && ( idx >= -lag ) ) { - if ( ( pass ) && ( do_inserts ) && ( (idx - lag) >= 0 ) && - ( (idx - lag) <= max_indices[type] ) && + if ( ( pass1 ) && ( do_inserts ) && ( (idx - lag) >= 0 ) && + ( (idx - lag) <= max_indices1[type] ) && ( ((idx - lag) % 2) == 1 ) && - ( ! entry_in_cache(cache_ptr, type, (idx - lag)) ) ) { + ( ! entry_in_cache1(cache_ptr, type, (idx - lag)) ) ) { if ( verbose ) HDfprintf(stdout, "(i, %d, %d) ", type, (idx - lag)); - insert_entry(cache_ptr, type, (idx - lag), dirty_inserts, + insert_entry1(cache_ptr, type, (idx - lag), dirty_inserts, H5C1__NO_FLAGS_SET); } - if ( ( pass ) && ( (idx - lag + 1) >= 0 ) && - ( (idx - lag + 1) <= max_indices[type] ) && + if ( ( pass1 ) && ( (idx - lag + 1) >= 0 ) && + ( (idx - lag + 1) <= max_indices1[type] ) && ( ( (idx - lag + 1) % 3 ) == 0 ) ) { if ( verbose ) HDfprintf(stdout, "(p, %d, %d) ", type, (idx - lag + 1)); - protect_entry(cache_ptr, type, (idx - lag + 1)); + protect_entry1(cache_ptr, type, (idx - lag + 1)); } - if ( ( pass ) && ( (idx - lag + 2) >= 0 ) && - ( (idx - lag + 2) <= max_indices[type] ) && + if ( ( pass1 ) && ( (idx - lag + 2) >= 0 ) && + ( (idx - lag + 2) <= max_indices1[type] ) && ( ( (idx - lag + 2) % 3 ) == 0 ) ) { if ( verbose ) HDfprintf(stdout, "(u, %d, %d) ", type, (idx - lag + 2)); - unprotect_entry(cache_ptr, type, idx-lag+2, NO_CHANGE, + unprotect_entry1(cache_ptr, type, idx-lag+2, NO_CHANGE, H5C1__NO_FLAGS_SET); } - if ( ( pass ) && ( do_renames ) && ( (idx - lag + 2) >= 0 ) && - ( (idx - lag + 2) <= max_indices[type] ) && + if ( ( pass1 ) && ( do_renames ) && ( (idx - lag + 2) >= 0 ) && + ( (idx - lag + 2) <= max_indices1[type] ) && ( ( (idx - lag + 2) % 3 ) == 0 ) ) { - rename_entry(cache_ptr, type, (idx - lag + 2), + rename_entry1(cache_ptr, type, (idx - lag + 2), rename_to_main_addr); } - if ( ( pass ) && ( (idx - lag + 3) >= 0 ) && - ( (idx - lag + 3) <= max_indices[type] ) && + if ( ( pass1 ) && ( (idx - lag + 3) >= 0 ) && + ( (idx - lag + 3) <= max_indices1[type] ) && ( ( (idx - lag + 3) % 5 ) == 0 ) ) { if ( verbose ) HDfprintf(stdout, "(p, %d, %d) ", type, (idx - lag + 3)); - protect_entry(cache_ptr, type, (idx - lag + 3)); + protect_entry1(cache_ptr, type, (idx - lag + 3)); } - if ( ( pass ) && ( (idx - lag + 5) >= 0 ) && - ( (idx - lag + 5) <= max_indices[type] ) && + if ( ( pass1 ) && ( (idx - lag + 5) >= 0 ) && + ( (idx - lag + 5) <= max_indices1[type] ) && ( ( (idx - lag + 5) % 5 ) == 0 ) ) { if ( verbose ) HDfprintf(stdout, "(u, %d, %d) ", type, (idx - lag + 5)); - unprotect_entry(cache_ptr, type, idx-lag+5, NO_CHANGE, + unprotect_entry1(cache_ptr, type, idx-lag+5, NO_CHANGE, H5C1__NO_FLAGS_SET); } if ( do_mult_ro_protects ) { - if ( ( pass ) && ( (idx - lag + 5) >= 0 ) && - ( (idx - lag + 5) < max_indices[type] ) && + if ( ( pass1 ) && ( (idx - lag + 5) >= 0 ) && + ( (idx - lag + 5) < max_indices1[type] ) && ( (idx - lag + 5) % 9 == 0 ) ) { if ( verbose ) HDfprintf(stdout, "(p-ro, %d, %d) ", type, (idx - lag + 5)); - protect_entry_ro(cache_ptr, type, (idx - lag + 5)); + protect_entry_ro1(cache_ptr, type, (idx - lag + 5)); } - if ( ( pass ) && ( (idx - lag + 6) >= 0 ) && - ( (idx - lag + 6) < max_indices[type] ) && + if ( ( pass1 ) && ( (idx - lag + 6) >= 0 ) && + ( (idx - lag + 6) < max_indices1[type] ) && ( (idx - lag + 6) % 11 == 0 ) ) { if ( verbose ) HDfprintf(stdout, "(p-ro, %d, %d) ", type, (idx - lag + 6)); - protect_entry_ro(cache_ptr, type, (idx - lag + 6)); + protect_entry_ro1(cache_ptr, type, (idx - lag + 6)); } - if ( ( pass ) && ( (idx - lag + 7) >= 0 ) && - ( (idx - lag + 7) < max_indices[type] ) && + if ( ( pass1 ) && ( (idx - lag + 7) >= 0 ) && + ( (idx - lag + 7) < max_indices1[type] ) && ( (idx - lag + 7) % 13 == 0 ) ) { if ( verbose ) HDfprintf(stdout, "(p-ro, %d, %d) ", type, (idx - lag + 7)); - protect_entry_ro(cache_ptr, type, (idx - lag + 7)); + protect_entry_ro1(cache_ptr, type, (idx - lag + 7)); } - if ( ( pass ) && ( (idx - lag + 7) >= 0 ) && - ( (idx - lag + 7) < max_indices[type] ) && + if ( ( pass1 ) && ( (idx - lag + 7) >= 0 ) && + ( (idx - lag + 7) < max_indices1[type] ) && ( (idx - lag + 7) % 9 == 0 ) ) { if ( verbose ) HDfprintf(stdout, "(u-ro, %d, %d) ", type, (idx - lag + 7)); - unprotect_entry(cache_ptr, type, (idx - lag + 7), + unprotect_entry1(cache_ptr, type, (idx - lag + 7), FALSE, H5C1__NO_FLAGS_SET); } - if ( ( pass ) && ( (idx - lag + 8) >= 0 ) && - ( (idx - lag + 8) < max_indices[type] ) && + if ( ( pass1 ) && ( (idx - lag + 8) >= 0 ) && + ( (idx - lag + 8) < max_indices1[type] ) && ( (idx - lag + 8) % 11 == 0 ) ) { if ( verbose ) HDfprintf(stdout, "(u-ro, %d, %d) ", type, (idx - lag + 8)); - unprotect_entry(cache_ptr, type, (idx - lag + 8), + unprotect_entry1(cache_ptr, type, (idx - lag + 8), FALSE, H5C1__NO_FLAGS_SET); } - if ( ( pass ) && ( (idx - lag + 9) >= 0 ) && - ( (idx - lag + 9) < max_indices[type] ) && + if ( ( pass1 ) && ( (idx - lag + 9) >= 0 ) && + ( (idx - lag + 9) < max_indices1[type] ) && ( (idx - lag + 9) % 13 == 0 ) ) { if ( verbose ) HDfprintf(stdout, "(u-ro, %d, %d) ", type, (idx - lag + 9)); - unprotect_entry(cache_ptr, type, (idx - lag + 9), + unprotect_entry1(cache_ptr, type, (idx - lag + 9), FALSE, H5C1__NO_FLAGS_SET); } } /* if ( do_mult_ro_protects ) */ - if ( ( pass ) && ( idx >= 0 ) && ( idx <= max_indices[type] ) ) { + if ( ( pass1 ) && ( idx >= 0 ) && ( idx <= max_indices1[type] ) ) { if ( verbose ) HDfprintf(stdout, "(p, %d, %d) ", type, idx); - protect_entry(cache_ptr, type, idx); + protect_entry1(cache_ptr, type, idx); } - if ( ( pass ) && ( (idx + lag - 2) >= 0 ) && - ( (idx + lag - 2) <= max_indices[type] ) && + if ( ( pass1 ) && ( (idx + lag - 2) >= 0 ) && + ( (idx + lag - 2) <= max_indices1[type] ) && ( ( (idx + lag - 2) % 7 ) == 0 ) ) { if ( verbose ) HDfprintf(stdout, "(u, %d, %d) ", type, (idx + lag - 2)); - unprotect_entry(cache_ptr, type, idx+lag-2, NO_CHANGE, + unprotect_entry1(cache_ptr, type, idx+lag-2, NO_CHANGE, H5C1__NO_FLAGS_SET); } - if ( ( pass ) && ( (idx + lag - 1) >= 0 ) && - ( (idx + lag - 1) <= max_indices[type] ) && + if ( ( pass1 ) && ( (idx + lag - 1) >= 0 ) && + ( (idx + lag - 1) <= max_indices1[type] ) && ( ( (idx + lag - 1) % 7 ) == 0 ) ) { if ( verbose ) HDfprintf(stdout, "(p, %d, %d) ", type, (idx + lag - 1)); - protect_entry(cache_ptr, type, (idx + lag - 1)); + protect_entry1(cache_ptr, type, (idx + lag - 1)); } if ( do_destroys ) { - if ( ( pass ) && ( (idx + lag) >= 0 ) && - ( ( idx + lag) <= max_indices[type] ) ) { + if ( ( pass1 ) && ( (idx + lag) >= 0 ) && + ( ( idx + lag) <= max_indices1[type] ) ) { switch ( (idx + lag) %4 ) { case 0: - if ( (entries[type])[idx+lag].is_dirty ) { + if ( (entries1[type])[idx+lag].is_dirty ) { - unprotect_entry(cache_ptr, type, idx + lag, + unprotect_entry1(cache_ptr, type, idx + lag, NO_CHANGE, H5C1__NO_FLAGS_SET); } else { - unprotect_entry(cache_ptr, type, idx + lag, + unprotect_entry1(cache_ptr, type, idx + lag, dirty_unprotects, H5C1__NO_FLAGS_SET); } break; case 1: /* we just did an insert */ - unprotect_entry(cache_ptr, type, idx + lag, + unprotect_entry1(cache_ptr, type, idx + lag, NO_CHANGE, H5C1__NO_FLAGS_SET); break; case 2: - if ( (entries[type])[idx + lag].is_dirty ) { + if ( (entries1[type])[idx + lag].is_dirty ) { - unprotect_entry(cache_ptr, type, idx + lag, + unprotect_entry1(cache_ptr, type, idx + lag, NO_CHANGE, H5C1__DELETED_FLAG); } else { - unprotect_entry(cache_ptr, type, idx + lag, + unprotect_entry1(cache_ptr, type, idx + lag, dirty_destroys, H5C1__DELETED_FLAG); } break; case 3: /* we just did an insrt */ - unprotect_entry(cache_ptr, type, idx + lag, + unprotect_entry1(cache_ptr, type, idx + lag, NO_CHANGE, H5C1__DELETED_FLAG); break; @@ -4020,13 +4020,13 @@ row_major_scan_backward(H5C1_t * cache_ptr, } } else { - if ( ( pass ) && ( (idx + lag) >= 0 ) && - ( ( idx + lag) <= max_indices[type] ) ) { + if ( ( pass1 ) && ( (idx + lag) >= 0 ) && + ( ( idx + lag) <= max_indices1[type] ) ) { if ( verbose ) HDfprintf(stdout, "(u, %d, %d) ", type, (idx - lag)); - unprotect_entry(cache_ptr, type, idx + lag, + unprotect_entry1(cache_ptr, type, idx + lag, dirty_unprotects, H5C1__NO_FLAGS_SET); } } @@ -4039,22 +4039,22 @@ row_major_scan_backward(H5C1_t * cache_ptr, type--; } - if ( ( pass ) && ( display_stats ) ) { + if ( ( pass1 ) && ( display_stats ) ) { H5C1_stats(cache_ptr, "test cache", display_detailed_stats); } return; -} /* row_major_scan_backward() */ +} /* row_major_scan_backward1() */ /*------------------------------------------------------------------------- - * Function: hl_row_major_scan_backward() + * Function: hl_row_major_scan_backward1() * * Purpose: Do a high locality sequence of inserts, protects, and * unprotects while scanning through the set of entries. - * If pass is false on entry, do nothing. + * If pass1 is false on entry, do nothing. * * Return: void * @@ -4072,7 +4072,7 @@ row_major_scan_backward(H5C1_t * cache_ptr, */ void -hl_row_major_scan_backward(H5C1_t * cache_ptr, +hl_row_major_scan_backward1(H5C1_t * cache_ptr, int32_t max_index, hbool_t verbose, hbool_t reset_stats, @@ -4081,7 +4081,7 @@ hl_row_major_scan_backward(H5C1_t * cache_ptr, hbool_t do_inserts, hbool_t dirty_inserts) { - const char * fcn_name = "hl_row_major_scan_backward"; + const char * fcn_name = "hl_row_major_scan_backward1"; int32_t type; int32_t idx; int32_t i; @@ -4097,46 +4097,46 @@ hl_row_major_scan_backward(H5C1_t * cache_ptr, type = NUMBER_OF_ENTRY_TYPES - 1; - if ( ( pass ) && ( reset_stats ) ) { + if ( ( pass1 ) && ( reset_stats ) ) { H5C1_stats__reset(cache_ptr); } - while ( ( pass ) && ( type >= 0 ) ) + while ( ( pass1 ) && ( type >= 0 ) ) { - idx = max_indices[type] + lag; + idx = max_indices1[type] + lag; - local_max_index = MIN(max_index, max_indices[type]); + local_max_index = MIN(max_index, max_indices1[type]); - while ( ( pass ) && ( idx >= -lag ) ) + while ( ( pass1 ) && ( idx >= -lag ) ) { - if ( ( pass ) && ( do_inserts ) && ( (idx + lag) >= 0 ) && + if ( ( pass1 ) && ( do_inserts ) && ( (idx + lag) >= 0 ) && ( (idx + lag) <= local_max_index ) && ( ((idx + lag) % 2) == 0 ) && - ( ! entry_in_cache(cache_ptr, type, (idx + lag)) ) ) { + ( ! entry_in_cache1(cache_ptr, type, (idx + lag)) ) ) { if ( verbose ) HDfprintf(stdout, "(i, %d, %d) ", type, (idx + lag)); - insert_entry(cache_ptr, type, (idx + lag), dirty_inserts, + insert_entry1(cache_ptr, type, (idx + lag), dirty_inserts, H5C1__NO_FLAGS_SET); } i = idx; - while ( ( pass ) && ( i >= idx - lag ) && ( i >= 0 ) ) + while ( ( pass1 ) && ( i >= idx - lag ) && ( i >= 0 ) ) { - if ( ( pass ) && ( i >= 0 ) && ( i <= local_max_index ) ) { + if ( ( pass1 ) && ( i >= 0 ) && ( i <= local_max_index ) ) { if ( verbose ) HDfprintf(stdout, "(p, %d, %d) ", type, i); - protect_entry(cache_ptr, type, i); + protect_entry1(cache_ptr, type, i); if ( verbose ) HDfprintf(stdout, "(u, %d, %d) ", type, i); - unprotect_entry(cache_ptr, type, i, NO_CHANGE, + unprotect_entry1(cache_ptr, type, i, NO_CHANGE, H5C1__NO_FLAGS_SET); } i--; @@ -4150,22 +4150,22 @@ hl_row_major_scan_backward(H5C1_t * cache_ptr, type--; } - if ( ( pass ) && ( display_stats ) ) { + if ( ( pass1 ) && ( display_stats ) ) { H5C1_stats(cache_ptr, "test cache", display_detailed_stats); } return; -} /* hl_row_major_scan_backward() */ +} /* hl_row_major_scan_backward1() */ /*------------------------------------------------------------------------- - * Function: col_major_scan_forward() + * Function: col_major_scan_forward1() * * Purpose: Do a sequence of inserts, protects, and unprotects * while scanning through the set of entries. If - * pass is false on entry, do nothing. + * pass1 is false on entry, do nothing. * * Return: void * @@ -4178,7 +4178,7 @@ hl_row_major_scan_backward(H5C1_t * cache_ptr, */ void -col_major_scan_forward(H5C1_t * cache_ptr, +col_major_scan_forward1(H5C1_t * cache_ptr, int32_t lag, hbool_t verbose, hbool_t reset_stats, @@ -4188,7 +4188,7 @@ col_major_scan_forward(H5C1_t * cache_ptr, hbool_t dirty_inserts, int dirty_unprotects) { - const char * fcn_name = "col_major_scan_forward()"; + const char * fcn_name = "col_major_scan_forward1()"; int32_t type; int32_t idx; @@ -4199,46 +4199,46 @@ col_major_scan_forward(H5C1_t * cache_ptr, type = 0; - if ( ( pass ) && ( reset_stats ) ) { + if ( ( pass1 ) && ( reset_stats ) ) { H5C1_stats__reset(cache_ptr); } idx = -lag; - while ( ( pass ) && ( (idx - lag) <= MAX_ENTRIES ) ) + while ( ( pass1 ) && ( (idx - lag) <= MAX_ENTRIES ) ) { type = 0; - while ( ( pass ) && ( type < NUMBER_OF_ENTRY_TYPES ) ) + while ( ( pass1 ) && ( type < NUMBER_OF_ENTRY_TYPES ) ) { - if ( ( pass ) && ( do_inserts ) && ( (idx + lag) >= 0 ) && - ( (idx + lag) <= max_indices[type] ) && + if ( ( pass1 ) && ( do_inserts ) && ( (idx + lag) >= 0 ) && + ( (idx + lag) <= max_indices1[type] ) && ( ((idx + lag) % 3) == 0 ) && - ( ! entry_in_cache(cache_ptr, type, (idx + lag)) ) ) { + ( ! entry_in_cache1(cache_ptr, type, (idx + lag)) ) ) { if ( verbose ) HDfprintf(stdout, "(i, %d, %d) ", type, (idx + lag)); - insert_entry(cache_ptr, type, (idx + lag), dirty_inserts, + insert_entry1(cache_ptr, type, (idx + lag), dirty_inserts, H5C1__NO_FLAGS_SET); } - if ( ( pass ) && ( idx >= 0 ) && ( idx <= max_indices[type] ) ) { + if ( ( pass1 ) && ( idx >= 0 ) && ( idx <= max_indices1[type] ) ) { if ( verbose ) HDfprintf(stdout, "(p, %d, %d) ", type, idx); - protect_entry(cache_ptr, type, idx); + protect_entry1(cache_ptr, type, idx); } - if ( ( pass ) && ( (idx - lag) >= 0 ) && - ( (idx - lag) <= max_indices[type] ) ) { + if ( ( pass1 ) && ( (idx - lag) >= 0 ) && + ( (idx - lag) <= max_indices1[type] ) ) { if ( verbose ) HDfprintf(stdout, "(u, %d, %d) ", type, (idx - lag)); - unprotect_entry(cache_ptr, type, idx - lag, + unprotect_entry1(cache_ptr, type, idx - lag, dirty_unprotects, H5C1__NO_FLAGS_SET); } @@ -4251,22 +4251,22 @@ col_major_scan_forward(H5C1_t * cache_ptr, idx++; } - if ( ( pass ) && ( display_stats ) ) { + if ( ( pass1 ) && ( display_stats ) ) { H5C1_stats(cache_ptr, "test cache", display_detailed_stats); } return; -} /* col_major_scan_forward() */ +} /* col_major_scan_forward1() */ /*------------------------------------------------------------------------- - * Function: hl_col_major_scan_forward() + * Function: hl_col_major_scan_forward1() * * Purpose: Do a high locality sequence of inserts, protects, and * unprotects while scanning through the set of entries. If - * pass is false on entry, do nothing. + * pass1 is false on entry, do nothing. * * Return: void * @@ -4284,7 +4284,7 @@ col_major_scan_forward(H5C1_t * cache_ptr, */ void -hl_col_major_scan_forward(H5C1_t * cache_ptr, +hl_col_major_scan_forward1(H5C1_t * cache_ptr, int32_t max_index, hbool_t verbose, hbool_t reset_stats, @@ -4294,7 +4294,7 @@ hl_col_major_scan_forward(H5C1_t * cache_ptr, hbool_t dirty_inserts, int dirty_unprotects) { - const char * fcn_name = "hl_col_major_scan_forward()"; + const char * fcn_name = "hl_col_major_scan_forward1()"; int32_t type; int32_t idx; int32_t lag = 200; @@ -4310,7 +4310,7 @@ hl_col_major_scan_forward(H5C1_t * cache_ptr, type = 0; - if ( ( pass ) && ( reset_stats ) ) { + if ( ( pass1 ) && ( reset_stats ) ) { H5C1_stats__reset(cache_ptr); } @@ -4319,44 +4319,44 @@ hl_col_major_scan_forward(H5C1_t * cache_ptr, local_max_index = MIN(max_index, MAX_ENTRIES); - while ( ( pass ) && ( idx <= local_max_index ) ) + while ( ( pass1 ) && ( idx <= local_max_index ) ) { i = idx; - while ( ( pass ) && ( i >= 0 ) && ( i >= (idx - lag) ) ) { + while ( ( pass1 ) && ( i >= 0 ) && ( i >= (idx - lag) ) ) { type = 0; - while ( ( pass ) && ( type < NUMBER_OF_ENTRY_TYPES ) ) + while ( ( pass1 ) && ( type < NUMBER_OF_ENTRY_TYPES ) ) { - if ( ( pass ) && ( do_inserts ) && ( i == idx ) && + if ( ( pass1 ) && ( do_inserts ) && ( i == idx ) && ( i <= local_max_index ) && ( (i % 3) == 0 ) && - ( ! entry_in_cache(cache_ptr, type, i) ) ) { + ( ! entry_in_cache1(cache_ptr, type, i) ) ) { if ( verbose ) HDfprintf(stdout, "(i, %d, %d) ", type, i); - insert_entry(cache_ptr, type, i, dirty_inserts, + insert_entry1(cache_ptr, type, i, dirty_inserts, H5C1__NO_FLAGS_SET); } - if ( ( pass ) && ( i >= 0 ) && ( i <= local_max_index ) ) { + if ( ( pass1 ) && ( i >= 0 ) && ( i <= local_max_index ) ) { if ( verbose ) HDfprintf(stdout, "(p, %d, %d) ", type, i); - protect_entry(cache_ptr, type, i); + protect_entry1(cache_ptr, type, i); } - if ( ( pass ) && ( i >= 0 ) && - ( i <= max_indices[type] ) ) { + if ( ( pass1 ) && ( i >= 0 ) && + ( i <= max_indices1[type] ) ) { if ( verbose ) HDfprintf(stdout, "(u, %d, %d) ", type, i); - unprotect_entry(cache_ptr, type, i, + unprotect_entry1(cache_ptr, type, i, dirty_unprotects, H5C1__NO_FLAGS_SET); } @@ -4372,22 +4372,22 @@ hl_col_major_scan_forward(H5C1_t * cache_ptr, idx++; } - if ( ( pass ) && ( display_stats ) ) { + if ( ( pass1 ) && ( display_stats ) ) { H5C1_stats(cache_ptr, "test cache", display_detailed_stats); } return; -} /* hl_col_major_scan_forward() */ +} /* hl_col_major_scan_forward1() */ /*------------------------------------------------------------------------- - * Function: col_major_scan_backward() + * Function: col_major_scan_backward1() * * Purpose: Do a sequence of inserts, protects, and unprotects * while scanning backwards through the set of - * entries. If pass is false on entry, do nothing. + * entries. If pass1 is false on entry, do nothing. * * Return: void * @@ -4400,7 +4400,7 @@ hl_col_major_scan_forward(H5C1_t * cache_ptr, */ void -col_major_scan_backward(H5C1_t * cache_ptr, +col_major_scan_backward1(H5C1_t * cache_ptr, int32_t lag, hbool_t verbose, hbool_t reset_stats, @@ -4410,7 +4410,7 @@ col_major_scan_backward(H5C1_t * cache_ptr, hbool_t dirty_inserts, int dirty_unprotects) { - const char * fcn_name = "col_major_scan_backward()"; + const char * fcn_name = "col_major_scan_backward1()"; int mile_stone = 1; int32_t type; int32_t idx; @@ -4420,7 +4420,7 @@ col_major_scan_backward(H5C1_t * cache_ptr, HDassert( lag > 5 ); - if ( ( pass ) && ( reset_stats ) ) { + if ( ( pass1 ) && ( reset_stats ) ) { H5C1_stats__reset(cache_ptr); } @@ -4431,39 +4431,39 @@ col_major_scan_backward(H5C1_t * cache_ptr, HDfprintf(stdout, "%s: point %d.\n", fcn_name, mile_stone++); - while ( ( pass ) && ( (idx + lag) >= 0 ) ) + while ( ( pass1 ) && ( (idx + lag) >= 0 ) ) { type = NUMBER_OF_ENTRY_TYPES - 1; - while ( ( pass ) && ( type >= 0 ) ) + while ( ( pass1 ) && ( type >= 0 ) ) { - if ( ( pass ) && ( do_inserts) && ( (idx - lag) >= 0 ) && - ( (idx - lag) <= max_indices[type] ) && + if ( ( pass1 ) && ( do_inserts) && ( (idx - lag) >= 0 ) && + ( (idx - lag) <= max_indices1[type] ) && ( ((idx - lag) % 3) == 0 ) && - ( ! entry_in_cache(cache_ptr, type, (idx - lag)) ) ) { + ( ! entry_in_cache1(cache_ptr, type, (idx - lag)) ) ) { if ( verbose ) HDfprintf(stdout, "(i, %d, %d) ", type, (idx - lag)); - insert_entry(cache_ptr, type, (idx - lag), dirty_inserts, + insert_entry1(cache_ptr, type, (idx - lag), dirty_inserts, H5C1__NO_FLAGS_SET); } - if ( ( pass ) && ( idx >= 0 ) && ( idx <= max_indices[type] ) ) { + if ( ( pass1 ) && ( idx >= 0 ) && ( idx <= max_indices1[type] ) ) { if ( verbose ) HDfprintf(stdout, "(p, %d, %d) ", type, idx); - protect_entry(cache_ptr, type, idx); + protect_entry1(cache_ptr, type, idx); } - if ( ( pass ) && ( (idx + lag) >= 0 ) && - ( (idx + lag) <= max_indices[type] ) ) { + if ( ( pass1 ) && ( (idx + lag) >= 0 ) && + ( (idx + lag) <= max_indices1[type] ) ) { if ( verbose ) HDfprintf(stdout, "(u, %d, %d) ", type, (idx + lag)); - unprotect_entry(cache_ptr, type, idx + lag, + unprotect_entry1(cache_ptr, type, idx + lag, dirty_unprotects, H5C1__NO_FLAGS_SET); } @@ -4479,7 +4479,7 @@ col_major_scan_backward(H5C1_t * cache_ptr, if ( verbose ) /* 2 */ HDfprintf(stdout, "%s: point %d.\n", fcn_name, mile_stone++); - if ( ( pass ) && ( display_stats ) ) { + if ( ( pass1 ) && ( display_stats ) ) { H5C1_stats(cache_ptr, "test cache", display_detailed_stats); } @@ -4489,15 +4489,15 @@ col_major_scan_backward(H5C1_t * cache_ptr, return; -} /* col_major_scan_backward() */ +} /* col_major_scan_backward1() */ /*------------------------------------------------------------------------- - * Function: hl_col_major_scan_backward() + * Function: hl_col_major_scan_backward1() * * Purpose: Do a high locality sequence of inserts, protects, and * unprotects while scanning backwards through the set of - * entries. If pass is false on entry, do nothing. + * entries. If pass1 is false on entry, do nothing. * * Return: void * @@ -4515,7 +4515,7 @@ col_major_scan_backward(H5C1_t * cache_ptr, */ void -hl_col_major_scan_backward(H5C1_t * cache_ptr, +hl_col_major_scan_backward1(H5C1_t * cache_ptr, int32_t max_index, hbool_t verbose, hbool_t reset_stats, @@ -4525,7 +4525,7 @@ hl_col_major_scan_backward(H5C1_t * cache_ptr, hbool_t dirty_inserts, int dirty_unprotects) { - const char * fcn_name = "hl_col_major_scan_backward()"; + const char * fcn_name = "hl_col_major_scan_backward1()"; int32_t type; int32_t idx; int32_t lag = 50; @@ -4543,50 +4543,50 @@ hl_col_major_scan_backward(H5C1_t * cache_ptr, local_max_index = MIN(max_index, MAX_ENTRIES); - if ( ( pass ) && ( reset_stats ) ) { + if ( ( pass1 ) && ( reset_stats ) ) { H5C1_stats__reset(cache_ptr); } idx = local_max_index; - while ( ( pass ) && ( idx >= 0 ) ) + while ( ( pass1 ) && ( idx >= 0 ) ) { i = idx; - while ( ( pass ) && ( i <= local_max_index ) && ( i <= (idx + lag) ) ) { + while ( ( pass1 ) && ( i <= local_max_index ) && ( i <= (idx + lag) ) ) { type = 0; - while ( ( pass ) && ( type < NUMBER_OF_ENTRY_TYPES ) ) + while ( ( pass1 ) && ( type < NUMBER_OF_ENTRY_TYPES ) ) { - if ( ( pass ) && ( do_inserts ) && ( i == idx ) && + if ( ( pass1 ) && ( do_inserts ) && ( i == idx ) && ( i <= local_max_index ) && - ( ! entry_in_cache(cache_ptr, type, i) ) ) { + ( ! entry_in_cache1(cache_ptr, type, i) ) ) { if ( verbose ) HDfprintf(stdout, "(i, %d, %d) ", type, i); - insert_entry(cache_ptr, type, i, dirty_inserts, + insert_entry1(cache_ptr, type, i, dirty_inserts, H5C1__NO_FLAGS_SET); } - if ( ( pass ) && ( i >= 0 ) && ( i <= local_max_index ) ) { + if ( ( pass1 ) && ( i >= 0 ) && ( i <= local_max_index ) ) { if ( verbose ) HDfprintf(stdout, "(p, %d, %d) ", type, i); - protect_entry(cache_ptr, type, i); + protect_entry1(cache_ptr, type, i); } - if ( ( pass ) && ( i >= 0 ) && + if ( ( pass1 ) && ( i >= 0 ) && ( i <= local_max_index ) ) { if ( verbose ) HDfprintf(stdout, "(u, %d, %d) ", type, i); - unprotect_entry(cache_ptr, type, i, + unprotect_entry1(cache_ptr, type, i, dirty_unprotects, H5C1__NO_FLAGS_SET); } @@ -4602,12 +4602,12 @@ hl_col_major_scan_backward(H5C1_t * cache_ptr, idx--; } - if ( ( pass ) && ( display_stats ) ) { + if ( ( pass1 ) && ( display_stats ) ) { H5C1_stats(cache_ptr, "test cache", display_detailed_stats); } return; -} /* hl_col_major_scan_backward() */ +} /* hl_col_major_scan_backward1() */ diff --git a/test/cache1_common.h b/test/cache1_common.h index 2faa1b9..ac9c680 100644 --- a/test/cache1_common.h +++ b/test/cache1_common.h @@ -141,17 +141,17 @@ typedef struct flush_op */ int type; /* type code of the cache entry that * is the target of the operation. - * This value is passed into the + * This value is pass1ed into the * function implementing the flush * operation. */ int idx; /* index of the cache entry that * is the target of the operation. - * This value is passed into the + * This value is pass1ed into the * function implementing the flush * operation. */ - hbool_t flag; /* boolean flag passed into the + hbool_t flag; /* boolean flag pass1ed into the * function implementing the flush * operation. The meaning of the * flag is dependant upon the flush @@ -243,7 +243,7 @@ typedef struct test_entry_t * value must be in the range * [0, MAX_PINS]. */ - int pin_type[MAX_PINS]; /* array of the types of entries + int pin_type[MAX_PINS]; /* array of the types1 of entries * pinned by this entry. */ int pin_idx[MAX_PINS]; /* array of the indicies of @@ -460,35 +460,35 @@ struct expected_entry_status extern const char *FILENAME[]; -extern hbool_t write_permitted; -extern hbool_t pass; /* set to false on error */ -extern hbool_t skip_long_tests; -extern hbool_t run_full_test; -extern const char *failure_mssg; - -extern test_entry_t pico_entries[NUM_PICO_ENTRIES]; -extern test_entry_t nano_entries[NUM_NANO_ENTRIES]; -extern test_entry_t micro_entries[NUM_MICRO_ENTRIES]; -extern test_entry_t tiny_entries[NUM_TINY_ENTRIES]; -extern test_entry_t small_entries[NUM_SMALL_ENTRIES]; -extern test_entry_t medium_entries[NUM_MEDIUM_ENTRIES]; -extern test_entry_t large_entries[NUM_LARGE_ENTRIES]; -extern test_entry_t huge_entries[NUM_HUGE_ENTRIES]; -extern test_entry_t monster_entries[NUM_MONSTER_ENTRIES]; - -extern test_entry_t * entries[NUMBER_OF_ENTRY_TYPES]; -extern const int32_t max_indices[NUMBER_OF_ENTRY_TYPES]; -extern const size_t entry_sizes[NUMBER_OF_ENTRY_TYPES]; -extern const haddr_t base_addrs[NUMBER_OF_ENTRY_TYPES]; -extern const haddr_t alt_base_addrs[NUMBER_OF_ENTRY_TYPES]; -extern const char * entry_type_names[NUMBER_OF_ENTRY_TYPES]; +extern hbool_t write_permitted1; +extern hbool_t pass1; /* set to false on error */ +extern hbool_t skip_long_tests1; +extern hbool_t run_full_test1; +extern const char *failure_mssg1; + +extern test_entry_t pico_entries1[NUM_PICO_ENTRIES]; +extern test_entry_t nano_entries1[NUM_NANO_ENTRIES]; +extern test_entry_t micro_entries1[NUM_MICRO_ENTRIES]; +extern test_entry_t tiny_entries1[NUM_TINY_ENTRIES]; +extern test_entry_t small_entries1[NUM_SMALL_ENTRIES]; +extern test_entry_t medium_entries1[NUM_MEDIUM_ENTRIES]; +extern test_entry_t large_entries1[NUM_LARGE_ENTRIES]; +extern test_entry_t huge_entries1[NUM_HUGE_ENTRIES]; +extern test_entry_t monster_entries1[NUM_MONSTER_ENTRIES]; + +extern test_entry_t * entries1[NUMBER_OF_ENTRY_TYPES]; +extern const int32_t max_indices1[NUMBER_OF_ENTRY_TYPES]; +extern const size_t entry_sizes1[NUMBER_OF_ENTRY_TYPES]; +extern const haddr_t base_addrs1[NUMBER_OF_ENTRY_TYPES]; +extern const haddr_t alt_base_addrs1[NUMBER_OF_ENTRY_TYPES]; +extern const char * entry_type_names1[NUMBER_OF_ENTRY_TYPES]; /* call back function declarations: */ -herr_t check_write_permitted(const H5F_t * f, +herr_t check_write_permitted1(const H5F_t * f, hid_t dxpl_id, - hbool_t * write_permitted_ptr); + hbool_t * write_permitted1_ptr); herr_t pico_clear(H5F_t * f, void * thing, hbool_t dest); herr_t nano_clear(H5F_t * f, void * thing, hbool_t dest); @@ -571,12 +571,12 @@ herr_t variable_size(H5F_t * f, void * thing, size_t * size_ptr); /* callback table extern */ -extern const H5C1_class_t types[NUMBER_OF_ENTRY_TYPES]; +extern const H5C1_class_t types1[NUMBER_OF_ENTRY_TYPES]; /* function declarations: */ -void add_flush_op(int target_type, +void add_flush_op1(int target_type, int target_idx, int op_code, int type, @@ -585,84 +585,84 @@ void add_flush_op(int target_type, size_t size); -void addr_to_type_and_index(haddr_t addr, +void addr_to_type_and_index1(haddr_t addr, int32_t * type_ptr, int32_t * index_ptr); #if 0 /* keep this for a while -- it may be useful */ -haddr_t type_and_index_to_addr(int32_t type, +haddr_t type_and_index_to_addr1(int32_t type, int32_t idx); #endif -void dirty_entry(H5C1_t * cache_ptr, +void dirty_entry1(H5C1_t * cache_ptr, int32_t type, int32_t idx, hbool_t dirty_pin); -void expunge_entry(H5C1_t * cache_ptr, +void expunge_entry1(H5C1_t * cache_ptr, int32_t type, int32_t idx); -void insert_entry(H5C1_t * cache_ptr, +void insert_entry1(H5C1_t * cache_ptr, int32_t type, int32_t idx, hbool_t dirty, unsigned int flags); -void mark_pinned_entry_dirty(H5C1_t * cache_ptr, +void mark_pinned_entry_dirty1(H5C1_t * cache_ptr, int32_t type, int32_t idx, hbool_t size_changed, size_t new_size); -void mark_pinned_or_protected_entry_dirty(H5C1_t * cache_ptr, +void mark_pinned_or_protected_entry_dirty1(H5C1_t * cache_ptr, int32_t type, int32_t idx); -void rename_entry(H5C1_t * cache_ptr, +void rename_entry1(H5C1_t * cache_ptr, int32_t type, int32_t idx, hbool_t main_addr); -void protect_entry(H5C1_t * cache_ptr, +void protect_entry1(H5C1_t * cache_ptr, int32_t type, int32_t idx); -void protect_entry_ro(H5C1_t * cache_ptr, +void protect_entry_ro1(H5C1_t * cache_ptr, int32_t type, int32_t idx); -hbool_t entry_in_cache(H5C1_t * cache_ptr, +hbool_t entry_in_cache1(H5C1_t * cache_ptr, int32_t type, int32_t idx); -void create_pinned_entry_dependency(H5C1_t * cache_ptr, +void create_pinned_entry_dependency1(H5C1_t * cache_ptr, int pinning_type, int pinning_idx, int pinned_type, int pinned_idx); -void execute_flush_op(H5C1_t * cache_ptr, +void execute_flush_op1(H5C1_t * cache_ptr, struct test_entry_t * entry_ptr, struct flush_op * op_ptr, unsigned * flags_ptr); -void reset_entries(void); +void reset_entries1(void); -void resize_entry(H5C1_t * cache_ptr, +void resize_entry1(H5C1_t * cache_ptr, int32_t type, int32_t idx, size_t new_size, hbool_t resize_pin); -void resize_pinned_entry(H5C1_t * cache_ptr, +void resize_pinned_entry1(H5C1_t * cache_ptr, int32_t type, int32_t idx, size_t new_size); -H5C1_t * setup_cache(size_t max_cache_size, size_t min_clean_size); +H5C1_t * setup_cache1(size_t max_cache_size, size_t min_clean_size); -void row_major_scan_forward(H5C1_t * cache_ptr, +void row_major_scan_forward1(H5C1_t * cache_ptr, int32_t lag, hbool_t verbose, hbool_t reset_stats, @@ -677,7 +677,7 @@ void row_major_scan_forward(H5C1_t * cache_ptr, int dirty_destroys, int dirty_unprotects); -void hl_row_major_scan_forward(H5C1_t * cache_ptr, +void hl_row_major_scan_forward1(H5C1_t * cache_ptr, int32_t max_index, hbool_t verbose, hbool_t reset_stats, @@ -686,7 +686,7 @@ void hl_row_major_scan_forward(H5C1_t * cache_ptr, hbool_t do_inserts, hbool_t dirty_inserts); -void row_major_scan_backward(H5C1_t * cache_ptr, +void row_major_scan_backward1(H5C1_t * cache_ptr, int32_t lag, hbool_t verbose, hbool_t reset_stats, @@ -701,7 +701,7 @@ void row_major_scan_backward(H5C1_t * cache_ptr, int dirty_destroys, int dirty_unprotects); -void hl_row_major_scan_backward(H5C1_t * cache_ptr, +void hl_row_major_scan_backward1(H5C1_t * cache_ptr, int32_t max_index, hbool_t verbose, hbool_t reset_stats, @@ -710,7 +710,7 @@ void hl_row_major_scan_backward(H5C1_t * cache_ptr, hbool_t do_inserts, hbool_t dirty_inserts); -void col_major_scan_forward(H5C1_t * cache_ptr, +void col_major_scan_forward1(H5C1_t * cache_ptr, int32_t lag, hbool_t verbose, hbool_t reset_stats, @@ -720,7 +720,7 @@ void col_major_scan_forward(H5C1_t * cache_ptr, hbool_t dirty_inserts, int dirty_unprotects); -void hl_col_major_scan_forward(H5C1_t * cache_ptr, +void hl_col_major_scan_forward1(H5C1_t * cache_ptr, int32_t max_index, hbool_t verbose, hbool_t reset_stats, @@ -730,7 +730,7 @@ void hl_col_major_scan_forward(H5C1_t * cache_ptr, hbool_t dirty_inserts, int dirty_unprotects); -void col_major_scan_backward(H5C1_t * cache_ptr, +void col_major_scan_backward1(H5C1_t * cache_ptr, int32_t lag, hbool_t verbose, hbool_t reset_stats, @@ -740,7 +740,7 @@ void col_major_scan_backward(H5C1_t * cache_ptr, hbool_t dirty_inserts, int dirty_unprotects); -void hl_col_major_scan_backward(H5C1_t * cache_ptr, +void hl_col_major_scan_backward1(H5C1_t * cache_ptr, int32_t max_index, hbool_t verbose, hbool_t reset_stats, @@ -750,37 +750,37 @@ void hl_col_major_scan_backward(H5C1_t * cache_ptr, hbool_t dirty_inserts, int dirty_unprotects); -void takedown_cache(H5C1_t * cache_ptr, +void takedown_cache1(H5C1_t * cache_ptr, hbool_t dump_stats, hbool_t dump_detailed_stats); -void flush_cache(H5C1_t * cache_ptr, +void flush_cache1(H5C1_t * cache_ptr, hbool_t destroy_entries, hbool_t dump_stats, hbool_t dump_detailed_stats); -void unpin_entry(H5C1_t * cache_ptr, +void unpin_entry1(H5C1_t * cache_ptr, int32_t type, int32_t idx); -void unprotect_entry(H5C1_t * cache_ptr, +void unprotect_entry1(H5C1_t * cache_ptr, int32_t type, int32_t idx, int dirty, unsigned int flags); -void unprotect_entry_with_size_change(H5C1_t * cache_ptr, +void unprotect_entry1_with_size_change(H5C1_t * cache_ptr, int32_t type, int32_t idx, unsigned int flags, size_t new_size); -void verify_clean(void); +void verify_clean1(void); -void verify_entry_status(H5C1_t * cache_ptr, +void verify_entry_status1(H5C1_t * cache_ptr, int tag, int num_entries, struct expected_entry_status expected[]); -void verify_unprotected(void); +void verify_unprotected1(void); diff --git a/test/cache2.c b/test/cache2.c deleted file mode 100644 index 196860c..0000000 --- a/test/cache2.c +++ /dev/null @@ -1,29322 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * Copyright by the Board of Trustees of the University of Illinois. * - * All rights reserved. * - * * - * This file is part of HDF5. The full HDF5 copyright notice, including * - * terms governing use, modification, and redistribution, is contained in * - * the files COPYING and Copyright.html. COPYING can be found at the root * - * of the source code distribution tree; Copyright.html can be found at the * - * root level of an installed copy of the electronic HDF5 document set and * - * is linked from the top-level documents page. It can also be found at * - * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * - * access to either file, you may request a copy from help@hdfgroup.org. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* Programmer: John Mainzer - * 6/9/04 - * - * This file contains tests for the cache implemented in - * H5C.c - */ - -#include - -#include "h5test.h" -#include "H5Iprivate.h" -#include "H5AC2private.h" -#include "cache2_common.h" - -/* private function declarations: */ - -static unsigned smoke_check_1(void); -static unsigned smoke_check_2(void); -static unsigned smoke_check_3(void); -static unsigned smoke_check_4(void); -static unsigned smoke_check_5(void); -static unsigned smoke_check_6(void); -static unsigned smoke_check_7(void); -static unsigned smoke_check_8(void); -static unsigned smoke_check_9(void); -static unsigned smoke_check_10(void); -static unsigned write_permitted_check(void); -static unsigned check_insert_entry(void); -static unsigned check_flush_cache(void); -static void check_flush_cache__empty_cache(H5F_t * file_ptr); -static void check_flush_cache__multi_entry(H5F_t * file_ptr); -static void check_flush_cache__multi_entry_test(H5F_t * file_ptr, - int test_num, - unsigned int flush_flags, - int spec_size, - struct flush_cache_test_spec spec[]); -static void check_flush_cache__pe_multi_entry_test(H5F_t * file_ptr, - int test_num, - unsigned int flush_flags, - int spec_size, - struct pe_flush_cache_test_spec spec[]); -static void check_flush_cache__single_entry(H5F_t * file_ptr); -static void check_flush_cache__single_entry_test(H5F_t * file_ptr, - int test_num, - int entry_type, - int entry_idx, - hbool_t insert_flag, - hbool_t dirty_flag, - unsigned int flags, - unsigned int flush_flags, - hbool_t expected_deserialized, - hbool_t expected_cleared, - hbool_t expected_serialized, - hbool_t expected_destroyed); -static void check_flush_cache__pinned_single_entry_test(H5F_t * file_ptr, - int test_num, - int entry_type, - int entry_idx, - hbool_t dirty_flag, - hbool_t mark_dirty, - hbool_t pop_mark_dirty_prot, - hbool_t pop_mark_dirty_pinned, - hbool_t unprotect_unpin, - unsigned int flags, - unsigned int flush_flags, - hbool_t expected_cleared, - hbool_t expected_serialized, - hbool_t expected_destroyed); -static void check_flush_cache__flush_ops(H5F_t * file_ptr); -static void check_flush_cache__flush_op_test(H5F_t * file_ptr, - int test_num, - unsigned int flush_flags, - int spec_size, - struct fo_flush_cache_test_spec spec[], - int init_expected_index_len, - size_t init_expected_index_size, - int expected_index_len, - size_t expected_index_size, - int check_size, - struct fo_flush_entry_check check[]); -static void check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr); -static unsigned check_get_entry_status(void); -static unsigned check_expunge_entry(void); -static unsigned check_multiple_read_protect(void); -static unsigned check_rename_entry(void); -static void check_rename_entry__run_test(H5F_t * file_ptr, int test_num, - struct rename_entry_test_spec * spec_ptr); -static unsigned check_pin_protected_entry(void); -static unsigned check_resize_entry(void); -static unsigned check_evictions_enabled(void); -static unsigned check_flush_protected_err(void); -static unsigned check_destroy_pinned_err(void); -static unsigned check_destroy_protected_err(void); -static unsigned check_duplicate_insert_err(void); -static unsigned check_rename_err(void); -static unsigned check_double_pin_err(void); -static unsigned check_double_unpin_err(void); -static unsigned check_pin_entry_errs(void); -static unsigned check_double_protect_err(void); -static unsigned check_double_unprotect_err(void); -static unsigned check_mark_entry_dirty_errs(void); -static unsigned check_expunge_entry_errs(void); -static unsigned check_resize_entry_errs(void); -static unsigned check_unprotect_ro_dirty_err(void); -static unsigned check_protect_ro_rw_err(void); -static unsigned check_check_evictions_enabled_err(void); -static unsigned check_auto_cache_resize(void); -static unsigned check_auto_cache_resize_disable(void); -static unsigned check_auto_cache_resize_epoch_markers(void); -static unsigned check_auto_cache_resize_input_errs(void); -static unsigned check_auto_cache_resize_aux_fcns(void); - - -/**************************************************************************/ -/**************************************************************************/ -/********************************* tests: *********************************/ -/**************************************************************************/ -/**************************************************************************/ - -/*------------------------------------------------------------------------- - * Function: smoke_check_1() - * - * Purpose: A basic functional test, inserts, destroys, and renames in - * the mix, along with repeated protects and unprotects. - * All entries are marked as clean. - * - * Return: void - * - * Programmer: John Mainzer - * 6/16/04 - * - * Modifications: - * - * JRM -- 1/18/05 - * Added code to skip this test if the skip_long_tests2 global - * is true. - * - *------------------------------------------------------------------------- - */ - -static unsigned -smoke_check_1(void) -{ - const char * fcn_name = "smoke_check_1"; - hbool_t show_progress = FALSE; - hbool_t dirty_inserts = FALSE; - int dirty_unprotects = FALSE; - int dirty_destroys = FALSE; - hbool_t display_stats = FALSE; - int32_t lag = 10; - int32_t max_index = (10 * 1024) - 1; - int mile_stone = 1; - H5F_t * file_ptr = NULL; - - core_file_driver_failed = FALSE; - - TESTING("smoke check #1 -- all clean, ins, dest, ren, 4/2 MB cache"); - - switch ( express_test2 ) - { - case 0: - max_index = (10 * 1024) - 1; - break; - - case 1: - max_index = (1 * 1024) - 1; - break; - - case 2: - max_index = (512) - 1; - break; - - default: - SKIPPED(); - HDfprintf(stdout, " Long tests disabled.\n"); - return 0; /* <========== note return */ - break; - } - - pass2 = TRUE; - - if ( show_progress ) /* 1 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - reset_entries2(); - - if ( show_progress ) /* 2 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - file_ptr = setup_cache2((size_t)(4 * 1024 * 1024), - (size_t)(2 * 1024 * 1024)); - - if ( show_progress ) /* 3 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - row_major_scan_forward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ FALSE, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts, - /* do_renames */ TRUE, - /* rename_to_main_addr */ FALSE, - /* do_destroys */ TRUE, - /* do_mult_ro_protects */ TRUE, - /* dirty_destroys */ dirty_destroys, - /* dirty_unprotects */ dirty_unprotects); - - if ( show_progress ) /* 4 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - row_major_scan_backward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ FALSE, - /* do_inserts */ FALSE, - /* dirty_inserts */ dirty_inserts, - /* do_renames */ TRUE, - /* rename_to_main_addr */ TRUE, - /* do_destroys */ FALSE, - /* do_mult_ro_protects */ TRUE, - /* dirty_destroys */ dirty_destroys, - /* dirty_unprotects */ dirty_unprotects); - - if ( show_progress ) /* 5 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - row_major_scan_forward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ FALSE, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts, - /* do_renames */ TRUE, - /* rename_to_main_addr */ FALSE, - /* do_destroys */ FALSE, - /* do_mult_ro_protects */ TRUE, - /* dirty_destroys */ dirty_destroys, - /* dirty_unprotects */ dirty_unprotects); - - if ( show_progress ) /* 6 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* flush and destroy all entries in the cache: */ - - flush_cache2(/* file_ptr */ file_ptr, - /* destroy_entries */ TRUE, - /* dump_stats */ FALSE, - /* dump_detailed_stats */ FALSE); - - if ( show_progress ) /* 7 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - col_major_scan_forward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ TRUE, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts, - /* dirty_unprotects */ dirty_unprotects); - - if ( show_progress ) /* 8 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* flush all entries in the cache: */ - - flush_cache2(/* file_ptr */ file_ptr, - /* destroy_entries */ FALSE, - /* dump_stats */ FALSE, - /* dump_detailed_stats */ FALSE); - - if ( show_progress ) /* 9 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - col_major_scan_backward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ TRUE, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts, - /* dirty_unprotects */ dirty_unprotects); - - if ( show_progress ) /* 10 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - takedown_cache2(file_ptr, display_stats, TRUE); - - if ( show_progress ) /* 11 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - verify_clean2(); - verify_unprotected2(); - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - HDfprintf(stdout, "%s(): failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - if ( core_file_driver_failed ) { - - HDfprintf(stdout, - "%s(): Unable to open test file with core file driver.\n", - fcn_name); - } - - return !pass2; - -} /* smoke_check_1() */ - - -/*------------------------------------------------------------------------- - * Function: smoke_check_2() - * - * Purpose: A basic functional test, with inserts, destroys, and - * renames in the mix, along with some repeated protects - * and unprotects. About half the entries are marked as - * dirty. - * - * Return: void - * - * Programmer: John Mainzer - * 6/24/04 - * - * Modifications: - * - * JRM -- 1/18/05 - * Added code to skip this test if the skip_long_tests2 global - * is true. - * - *------------------------------------------------------------------------- - */ - -static unsigned -smoke_check_2(void) -{ - const char * fcn_name = "smoke_check_2"; - hbool_t show_progress = FALSE; - hbool_t dirty_inserts = TRUE; - int dirty_unprotects = TRUE; - int dirty_destroys = TRUE; - hbool_t display_stats = FALSE; - int32_t max_index = (10 * 1024) - 1; - int32_t lag = 10; - int mile_stone = 1; - H5F_t * file_ptr = NULL; - - TESTING("smoke check #2 -- ~1/2 dirty, ins, dest, ren, 4/2 MB cache"); - - core_file_driver_failed = FALSE; - - switch ( express_test2 ) - { - case 0: - max_index = (10 * 1024) - 1; - break; - - case 1: - max_index = (1 * 1024) - 1; - break; - - case 2: - max_index = (512) - 1; - break; - - default: - SKIPPED(); - HDfprintf(stdout, " Long tests disabled.\n"); - return 0; /* <========== note return */ - break; - } - - pass2 = TRUE; - - if ( show_progress ) /* 1 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - reset_entries2(); - - if ( show_progress ) /* 2 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - file_ptr = setup_cache2((size_t)(4 * 1024 * 1024), - (size_t)(2 * 1024 * 1024)); - - if ( show_progress ) /* 3 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - row_major_scan_forward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ TRUE, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts, - /* do_renames */ TRUE, - /* rename_to_main_addr */ FALSE, - /* do_destroys */ TRUE, - /* do_mult_ro_protects */ TRUE, - /* dirty_destroys */ dirty_destroys, - /* dirty_unprotects */ dirty_unprotects); - - if ( show_progress ) /* 4 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - row_major_scan_backward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ TRUE, - /* do_inserts */ FALSE, - /* dirty_inserts */ dirty_inserts, - /* do_renames */ TRUE, - /* rename_to_main_addr */ TRUE, - /* do_destroys */ FALSE, - /* do_mult_ro_protects */ TRUE, - /* dirty_destroys */ dirty_destroys, - /* dirty_unprotects */ dirty_unprotects); - - if ( show_progress ) /* 5 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - row_major_scan_forward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ TRUE, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts, - /* do_renames */ TRUE, - /* rename_to_main_addr */ FALSE, - /* do_destroys */ FALSE, - /* do_mult_ro_protects */ TRUE, - /* dirty_destroys */ dirty_destroys, - /* dirty_unprotects */ dirty_unprotects); - - if ( show_progress ) /* 6 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* flush and destroy all entries in the cache: */ - - flush_cache2(/* file_ptr */ file_ptr, - /* destroy_entries */ TRUE, - /* dump_stats */ FALSE, - /* dump_detailed_stats */ FALSE); - - if ( show_progress ) /* 7 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - col_major_scan_forward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ TRUE, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts, - /* dirty_unprotects */ dirty_unprotects); - - if ( show_progress ) /* 8 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* flush all entries in the cache: */ - - flush_cache2(/* file_ptr */ file_ptr, - /* destroy_entries */ FALSE, - /* dump_stats */ FALSE, - /* dump_detailed_stats */ FALSE); - - if ( show_progress ) /* 9 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - col_major_scan_backward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ TRUE, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts, - /* dirty_unprotects */ dirty_unprotects); - - if ( show_progress ) /* 10 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - takedown_cache2(file_ptr, display_stats, TRUE); - - if ( show_progress ) /* 11 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - verify_clean2(); - verify_unprotected2(); - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - HDfprintf(stdout, "%s(): failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - if ( core_file_driver_failed ) { - - HDfprintf(stdout, - "%s(): Unable to open test file with core file driver.\n", - fcn_name); - } - - return !pass2; - -} /* smoke_check_2() */ - - -/*------------------------------------------------------------------------- - * Function: smoke_check_3() - * - * Purpose: A basic functional test on a tiny cache, with inserts, - * destroys, and renames in the mix, along with repeated - * protects and unprotects. All entries are marked as clean. - * - * Return: void - * - * Programmer: John Mainzer - * 6/16/04 - * - * Modifications: - * - * JRM -- 1/18/05 - * Added code to skip this test if the skip_long_tests2 global - * is true. - * - *------------------------------------------------------------------------- - */ - -static unsigned -smoke_check_3(void) -{ - const char * fcn_name = "smoke_check_3"; - hbool_t show_progress = FALSE; - hbool_t dirty_inserts = FALSE; - int dirty_unprotects = FALSE; - int dirty_destroys = FALSE; - hbool_t display_stats = FALSE; - int32_t max_index = (10 * 1024) - 1; - int32_t lag = 10; - int mile_stone = 1; - H5F_t * file_ptr = NULL; - - TESTING("smoke check #3 -- all clean, ins, dest, ren, 2/1 KB cache"); - - core_file_driver_failed = FALSE; - - switch ( express_test2 ) - { - case 0: - max_index = (10 * 1024) - 1; - break; - - case 1: - max_index = (1 * 1024) - 1; - break; - - case 2: - max_index = (512) - 1; - break; - - default: - SKIPPED(); - HDfprintf(stdout, " Long tests disabled.\n"); - return 0; /* <========== note return */ - break; - } - - pass2 = TRUE; - - if ( show_progress ) /* 1 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - reset_entries2(); - - if ( show_progress ) /* 2 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - file_ptr = setup_cache2((size_t)(2 * 1024), - (size_t)(1 * 1024)); - - if ( show_progress ) /* 3 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - row_major_scan_forward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ TRUE, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts, - /* do_renames */ TRUE, - /* rename_to_main_addr */ FALSE, - /* do_destroys */ TRUE, - /* do_mult_ro_protects */ TRUE, - /* dirty_destroys */ dirty_destroys, - /* dirty_unprotects */ dirty_unprotects); - - if ( show_progress ) /* 4 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - row_major_scan_backward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ TRUE, - /* do_inserts */ FALSE, - /* dirty_inserts */ dirty_inserts, - /* do_renames */ TRUE, - /* rename_to_main_addr */ TRUE, - /* do_destroys */ FALSE, - /* do_mult_ro_protects */ TRUE, - /* dirty_destroys */ dirty_destroys, - /* dirty_unprotects */ dirty_unprotects); - - if ( show_progress ) /* 5 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - row_major_scan_forward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ TRUE, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts, - /* do_renames */ TRUE, - /* rename_to_main_addr */ FALSE, - /* do_destroys */ FALSE, - /* do_mult_ro_protects */ TRUE, - /* dirty_destroys */ dirty_destroys, - /* dirty_unprotects */ dirty_unprotects); - - if ( show_progress ) /* 6 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* flush and destroy all entries in the cache: */ - - flush_cache2(/* file_ptr */ file_ptr, - /* destroy_entries */ TRUE, - /* dump_stats */ FALSE, - /* dump_detailed_stats */ FALSE); - - if ( show_progress ) /* 7 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - col_major_scan_forward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ TRUE, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts, - /* dirty_unprotects */ dirty_unprotects); - - if ( show_progress ) /* 8 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* flush all entries in the cache: */ - - flush_cache2(/* file_ptr */ file_ptr, - /* destroy_entries */ FALSE, - /* dump_stats */ FALSE, - /* dump_detailed_stats */ FALSE); - - if ( show_progress ) /* 9 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - col_major_scan_backward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ TRUE, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts, - /* dirty_unprotects */ dirty_unprotects); - - if ( show_progress ) /* 10 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - takedown_cache2(file_ptr, display_stats, TRUE); - - if ( show_progress ) /* 11 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - verify_clean2(); - verify_unprotected2(); - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - HDfprintf(stdout, "%s(): failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - if ( core_file_driver_failed ) { - - HDfprintf(stdout, - "%s(): Unable to open test file with core file driver.\n", - fcn_name); - } - - return !pass2; - -} /* smoke_check_3() */ - - -/*------------------------------------------------------------------------- - * Function: smoke_check_4() - * - * Purpose: A basic functional test on a tiny cache, with inserts, - * destroys, and renames in the mix, along with repeated - * protects and unprotects. About half the entries are - * marked as dirty. - * - * Return: void - * - * Programmer: John Mainzer - * 6/24/04 - * - * Modifications: - * - * JRM -- 1/18/05 - * Added code to skip this test if the skip_long_tests2 global - * is true. - * - *------------------------------------------------------------------------- - */ - -static unsigned -smoke_check_4(void) -{ - const char * fcn_name = "smoke_check_4"; - hbool_t show_progress = FALSE; - hbool_t dirty_inserts = TRUE; - int dirty_unprotects = TRUE; - int dirty_destroys = TRUE; - hbool_t display_stats = FALSE; - int32_t max_index = (10 * 1024) - 1; - int32_t lag = 10; - int mile_stone = 1; - H5F_t * file_ptr = NULL; - - TESTING("smoke check #4 -- ~1/2 dirty, ins, dest, ren, 2/1 KB cache"); - - core_file_driver_failed = FALSE; - - switch ( express_test2 ) - { - case 0: - max_index = (10 * 1024) - 1; - break; - - case 1: - max_index = (1 * 1024) - 1; - break; - - case 2: - max_index = (512) - 1; - break; - - default: - SKIPPED(); - HDfprintf(stdout, " Long tests disabled.\n"); - return 0; /* <========== note return */ - break; - } - - pass2 = TRUE; - - if ( show_progress ) /* 1 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - reset_entries2(); - - if ( show_progress ) /* 2 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - file_ptr = setup_cache2((size_t)(2 * 1024), - (size_t)(1 * 1024)); - - if ( show_progress ) /* 3 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - row_major_scan_forward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ TRUE, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts, - /* do_renames */ TRUE, - /* rename_to_main_addr */ FALSE, - /* do_destroys */ TRUE, - /* do_mult_ro_protects */ TRUE, - /* dirty_destroys */ dirty_destroys, - /* dirty_unprotects */ dirty_unprotects); - - if ( show_progress ) /* 4 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - row_major_scan_backward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ TRUE, - /* do_inserts */ FALSE, - /* dirty_inserts */ dirty_inserts, - /* do_renames */ TRUE, - /* rename_to_main_addr */ TRUE, - /* do_destroys */ FALSE, - /* do_mult_ro_protects */ TRUE, - /* dirty_destroys */ dirty_destroys, - /* dirty_unprotects */ dirty_unprotects); - - if ( show_progress ) /* 5 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - row_major_scan_forward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ TRUE, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts, - /* do_renames */ TRUE, - /* rename_to_main_addr */ FALSE, - /* do_destroys */ FALSE, - /* do_mult_ro_protects */ TRUE, - /* dirty_destroys */ dirty_destroys, - /* dirty_unprotects */ dirty_unprotects); - - if ( show_progress ) /* 6 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* flush and destroy all entries in the cache: */ - - flush_cache2(/* file_ptr */ file_ptr, - /* destroy_entries */ TRUE, - /* dump_stats */ FALSE, - /* dump_detailed_stats */ FALSE); - - if ( show_progress ) /* 7 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - col_major_scan_forward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ TRUE, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts, - /* dirty_unprotects */ dirty_unprotects); - - if ( show_progress ) /* 8 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* flush all entries in the cache: */ - - flush_cache2(/* file_ptr */ file_ptr, - /* destroy_entries */ FALSE, - /* dump_stats */ FALSE, - /* dump_detailed_stats */ FALSE); - - if ( show_progress ) /* 9 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - col_major_scan_backward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ TRUE, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts, - /* dirty_unprotects */ dirty_unprotects); - - if ( show_progress ) /* 10 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - takedown_cache2(file_ptr, display_stats, TRUE); - - if ( show_progress ) /* 11 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - verify_clean2(); - verify_unprotected2(); - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - HDfprintf(stdout, "%s(): failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - if ( core_file_driver_failed ) { - - HDfprintf(stdout, - "%s(): Unable to open test file with core file driver.\n", - fcn_name); - } - - return !pass2; - -} /* smoke_check_4() */ - - -/*------------------------------------------------------------------------- - * Function: smoke_check_5() - * - * Purpose: A basic functional test on a cache with automatic cache - * resizing enabled, with inserts in the mix, along with - * repeated protects and unprotects. All entries are marked - * as clean. - * - * Return: void - * - * Programmer: John Mainzer - * 10/14/04 - * - * Modifications: - * - * JRM -- 1/18/05 - * Added code to skip this test if the skip_long_tests2 global - * is true. - * - *------------------------------------------------------------------------- - */ - -static unsigned -smoke_check_5(void) -{ - const char * fcn_name = "smoke_check_5"; - herr_t result; - hbool_t show_progress = FALSE; - hbool_t dirty_inserts = FALSE; - int dirty_unprotects = FALSE; - hbool_t display_stats = FALSE; - int32_t max_index = 1024; - int mile_stone = 1; - H5F_t * file_ptr = NULL; - H5C2_t * cache_ptr = NULL; - H5C2_auto_size_ctl_t auto_size_ctl = - { - /* int32_t version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, -#if 1 - /* H5C2_auto_resize_report_fcn rpt_fcn = */ NULL, -#else - /* H5C2_auto_resize_report_fcn rpt_fcn = */ H5C2_def_auto_resize_rpt_fcn, -#endif - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (2 * 1024 * 1024), - - /* double min_clean_fraction = */ 0.1, - - /* size_t max_size = */ (32 * 1024 * 1025), - /* size_t min_size = */ (512 * 1024), - - /* int64_t epoch_length = */ 50000, - - - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - - /* double lower_hr_threshold = */ 0.75, - - /* double increment = */ 2.0, - - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - - - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__threshold, - - /* double upper_hr_threshold = */ 0.995, - - /* double decrement = */ 0.9, - - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - - /* int32_t epochs_before_eviction = */ 3, - - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.5 - }; - - TESTING("smoke check #5 -- all clean, ins, prot, unprot, AR cache 1"); - - core_file_driver_failed = FALSE; - - switch ( express_test2 ) - { - case 0: - max_index = (10 * 1024) - 1; - break; - - case 1: - max_index = (1 * 1024) - 1; - break; - - case 2: - max_index = (512) - 1; - break; - - default: - SKIPPED(); - HDfprintf(stdout, " Long tests disabled.\n"); - return 0; /* <========== note return */ - break; - } - - pass2 = TRUE; - - if ( show_progress ) /* 1 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - reset_entries2(); - - if ( show_progress ) /* 2 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - file_ptr = setup_cache2((size_t)(2 * 1024), - (size_t)(1 * 1024)); - cache_ptr = file_ptr->shared->cache2; - - if ( pass2 ) { - - result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 1.\n"; - } - } - - if ( show_progress ) /* 3 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - hl_row_major_scan_forward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ FALSE, - /* do_inserts */ FALSE, - /* dirty_inserts */ dirty_inserts); - - if ( show_progress ) /* 4 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - hl_row_major_scan_backward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ FALSE, - /* do_inserts */ FALSE, - /* dirty_inserts */ dirty_inserts); - - if ( show_progress ) /* 5 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - hl_row_major_scan_forward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ FALSE, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts); - - if ( show_progress ) /* 6 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* flush and destroy all entries in the cache: */ - - flush_cache2(/* file_ptr */ file_ptr, - /* destroy_entries */ TRUE, - /* dump_stats */ FALSE, - /* dump_detailed_stats */ FALSE); - - if ( show_progress ) /* 7 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - hl_col_major_scan_forward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ FALSE, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts, - /* dirty_unprotects */ dirty_unprotects); - - if ( show_progress ) /* 8 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* flush all entries in the cache: */ - - flush_cache2(/* file_ptr */ file_ptr, - /* destroy_entries */ FALSE, - /* dump_stats */ FALSE, - /* dump_detailed_stats */ FALSE); - - if ( show_progress ) /* 9 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - hl_col_major_scan_backward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ FALSE, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts, - /* dirty_unprotects */ dirty_unprotects); - - if ( show_progress ) /* 10 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - takedown_cache2(file_ptr, display_stats, TRUE); - - if ( show_progress ) /* 11 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - verify_clean2(); - verify_unprotected2(); - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - HDfprintf(stdout, "%s(): failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - if ( core_file_driver_failed ) { - - HDfprintf(stdout, - "%s(): Unable to open test file with core file driver.\n", - fcn_name); - } - - return !pass2; - -} /* smoke_check_5() */ - - -/*------------------------------------------------------------------------- - * Function: smoke_check_6() - * - * Purpose: A basic functional test on a cache with automatic cache - * resizing enabled, with inserts in the mix, along with - * repeated protects and unprotects. About one half of all - * entries are marked as dirty. - * - * Return: void - * - * Programmer: John Mainzer - * 10/25/04 - * - * Modifications: - * - * JRM -- 1/18/05 - * Added code to skip this test if the skip_long_tests2 global - * is true. - * - *------------------------------------------------------------------------- - */ - -static unsigned -smoke_check_6(void) -{ - const char * fcn_name = "smoke_check_6"; - herr_t result; - hbool_t show_progress = FALSE; - hbool_t dirty_inserts = TRUE; - int dirty_unprotects = FALSE; - hbool_t display_stats = FALSE; - int mile_stone = 1; - int32_t max_index = 1024; - H5F_t * file_ptr = NULL; - H5C2_t * cache_ptr = NULL; - H5C2_auto_size_ctl_t auto_size_ctl = - { - /* int32_t version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, -#if 1 - /* H5C2_auto_resize_report_fcn rpt_fcn = */ NULL, -#else - /* H5C2_auto_resize_report_fcn rpt_fcn = */ H5C2_def_auto_resize_rpt_fcn, -#endif - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (2 * 1024 * 1024), - - /* double min_clean_fraction = */ 0.1, - - /* size_t max_size = */ (32 * 1024 * 1025), - /* size_t min_size = */ (512 * 1024), - - /* int64_t epoch_length = */ 50000, - - - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - - /* double lower_hr_threshold = */ 0.75, - - /* double increment = */ 2.0, - - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - - - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__threshold, - - /* double upper_hr_threshold = */ 0.995, - - /* double decrement = */ 0.9, - - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - - /* int32_t epochs_before_eviction = */ 3, - - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.05 - }; - - TESTING("smoke check #6 -- ~1/2 dirty, ins, prot, unprot, AR cache 1"); - - core_file_driver_failed = FALSE; - - pass2 = TRUE; - - switch ( express_test2 ) - { - case 0: - max_index = (10 * 1024) - 1; - break; - - case 1: - max_index = (1 * 1024) - 1; - break; - - case 2: - max_index = (512) - 1; - break; - - default: - SKIPPED(); - HDfprintf(stdout, " Long tests disabled.\n"); - return 0; /* <========== note return */ - break; - } - - if ( show_progress ) /* 1 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - reset_entries2(); - - if ( show_progress ) /* 2 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - file_ptr = setup_cache2((size_t)(2 * 1024), - (size_t)(1 * 1024)); - cache_ptr = file_ptr->shared->cache2; - - if ( pass2 ) { - - result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 1.\n"; - } - } - - if ( show_progress ) /* 3 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - hl_row_major_scan_forward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ FALSE, - /* do_inserts */ FALSE, - /* dirty_inserts */ dirty_inserts); - - if ( show_progress ) /* 4 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - hl_row_major_scan_backward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ FALSE, - /* do_inserts */ FALSE, - /* dirty_inserts */ dirty_inserts); - - if ( show_progress ) /* 5 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - hl_row_major_scan_forward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ FALSE, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts); - - if ( show_progress ) /* 6 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* flush and destroy all entries in the cache: */ - - flush_cache2(/* file_ptr */ file_ptr, - /* destroy_entries */ TRUE, - /* dump_stats */ FALSE, - /* dump_detailed_stats */ FALSE); - - if ( show_progress ) /* 7 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - hl_col_major_scan_forward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ FALSE, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts, - /* dirty_unprotects */ dirty_unprotects); - - if ( show_progress ) /* 8 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* flush all entries in the cache: */ - - flush_cache2(/* file_ptr */ file_ptr, - /* destroy_entries */ FALSE, - /* dump_stats */ FALSE, - /* dump_detailed_stats */ FALSE); - - if ( show_progress ) /* 9 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - hl_col_major_scan_backward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ FALSE, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts, - /* dirty_unprotects */ dirty_unprotects); - - if ( show_progress ) /* 10 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - takedown_cache2(file_ptr, display_stats, TRUE); - - if ( show_progress ) /* 11 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - verify_clean2(); - verify_unprotected2(); - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - HDfprintf(stdout, "%s(): failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - if ( core_file_driver_failed ) { - - HDfprintf(stdout, - "%s(): Unable to open test file with core file driver.\n", - fcn_name); - } - - return !pass2; - -} /* smoke_check_6() */ - - -/*------------------------------------------------------------------------- - * Function: smoke_check_7() - * - * Purpose: A basic functional test on a cache with automatic cache - * resizing enabled, with inserts in the mix, along with - * repeated protects and unprotects. All entries are marked - * as clean. - * - * Return: void - * - * Programmer: John Mainzer - * 12/2/04 - * - * Modifications: - * - * JRM -- 1/18/05 - * Added code to skip this test if the skip_long_tests2 global - * is true. - * - *------------------------------------------------------------------------- - */ - -static unsigned -smoke_check_7(void) -{ - const char * fcn_name = "smoke_check_7"; - herr_t result; - hbool_t show_progress = FALSE; - hbool_t dirty_inserts = FALSE; - int dirty_unprotects = FALSE; - hbool_t display_stats = FALSE; - int mile_stone = 1; - int32_t max_index = 1024; - H5F_t * file_ptr = NULL; - H5C2_t * cache_ptr = NULL; - H5C2_auto_size_ctl_t auto_size_ctl = - { - /* int32_t version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, -#if 1 - /* H5C2_auto_resize_report_fcn rpt_fcn = */ NULL, -#else - /* H5C2_auto_resize_report_fcn rpt_fcn = */ H5C2_def_auto_resize_rpt_fcn, -#endif - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (2 * 1024 * 1024), - - /* double min_clean_fraction = */ 0.1, - - /* size_t max_size = */ (32 * 1024 * 1025), - /* size_t min_size = */ (512 * 1024), - - /* int64_t epoch_length = */ 100000, - - - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - - /* double lower_hr_threshold = */ 0.75, - - /* double increment = */ 2.0, - - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (8 * 1024 * 1024), - - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - - - /* enum H5C2_cache_decr_mode decr_mode = */ - H5C2_decr__age_out_with_threshold, - - /* double upper_hr_threshold = */ 0.995, - - /* double decrement = */ 0.9, - - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - - /* int32_t epochs_before_eviction = */ 3, - - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1 - }; - - TESTING("smoke check #7 -- all clean, ins, prot, unprot, AR cache 2"); - - core_file_driver_failed = FALSE; - - switch ( express_test2 ) - { - case 0: - max_index = (10 * 1024) - 1; - break; - - case 1: - max_index = (1 * 1024) - 1; - break; - - case 2: - max_index = (512) - 1; - break; - - default: - SKIPPED(); - HDfprintf(stdout, " Long tests disabled.\n"); - return 0; /* <========== note return */ - break; - } - - pass2 = TRUE; - - if ( show_progress ) /* 1 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - reset_entries2(); - - if ( show_progress ) /* 2 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - file_ptr = setup_cache2((size_t)(2 * 1024), - (size_t)(1 * 1024)); - cache_ptr = file_ptr->shared->cache2; - - if ( pass2 ) { - - result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 1.\n"; - } - } - - if ( show_progress ) /* 3 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - hl_row_major_scan_forward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ FALSE, - /* do_inserts */ FALSE, - /* dirty_inserts */ dirty_inserts); - - if ( show_progress ) /* 4 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - hl_row_major_scan_backward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ FALSE, - /* do_inserts */ FALSE, - /* dirty_inserts */ dirty_inserts); - - if ( show_progress ) /* 5 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - hl_row_major_scan_forward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ FALSE, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts); - - if ( show_progress ) /* 6 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* flush and destroy all entries in the cache: */ - - flush_cache2(/* file_ptr */ file_ptr, - /* destroy_entries */ TRUE, - /* dump_stats */ FALSE, - /* dump_detailed_stats */ FALSE); - - if ( show_progress ) /* 7 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - hl_col_major_scan_forward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ FALSE, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts, - /* dirty_unprotects */ dirty_unprotects); - - if ( show_progress ) /* 8 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* flush all entries in the cache: */ - - flush_cache2(/* file_ptr */ file_ptr, - /* destroy_entries */ FALSE, - /* dump_stats */ FALSE, - /* dump_detailed_stats */ FALSE); - - if ( show_progress ) /* 9 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - hl_col_major_scan_backward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ FALSE, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts, - /* dirty_unprotects */ dirty_unprotects); - - if ( show_progress ) /* 10 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - takedown_cache2(file_ptr, display_stats, TRUE); - - if ( show_progress ) /* 11 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - verify_clean2(); - verify_unprotected2(); - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - HDfprintf(stdout, "%s(): failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - if ( core_file_driver_failed ) { - - HDfprintf(stdout, - "%s(): Unable to open test file with core file driver.\n", - fcn_name); - } - - return !pass2; - -} /* smoke_check_7() */ - - -/*------------------------------------------------------------------------- - * Function: smoke_check_8() - * - * Purpose: A basic functional test on a cache with automatic cache - * resizing enabled, with inserts in the mix, along with - * repeated protects and unprotects. About one half of all - * entries are marked as dirty. - * - * Return: void - * - * Programmer: John Mainzer - * 10/25/04 - * - * Modifications: - * - * JRM -- 1/18/05 - * Added code to skip this test if the skip_long_tests2 global - * is true. - * - *------------------------------------------------------------------------- - */ - -static unsigned -smoke_check_8(void) -{ - const char * fcn_name = "smoke_check_8"; - herr_t result; - hbool_t show_progress = FALSE; - hbool_t dirty_inserts = TRUE; - int dirty_unprotects = FALSE; - hbool_t display_stats = FALSE; - int mile_stone = 1; - int32_t max_index = 1024; - H5F_t * file_ptr = NULL; - H5C2_t * cache_ptr = NULL; - H5C2_auto_size_ctl_t auto_size_ctl = - { - /* int32_t version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, -#if 1 - /* H5C2_auto_resize_report_fcn rpt_fcn = */ NULL, -#else - /* H5C2_auto_resize_report_fcn rpt_fcn = */ H5C2_def_auto_resize_rpt_fcn, -#endif - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (2 * 1024 * 1024), - - /* double min_clean_fraction = */ 0.1, - - /* size_t max_size = */ (32 * 1024 * 1025), - /* size_t min_size = */ (512 * 1024), - - /* int64_t epoch_length = */ 100000, - - - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - - /* double lower_hr_threshold = */ 0.75, - - /* double increment = */ 2.0, - - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - - - /* enum H5C2_cache_decr_mode decr_mode = */ - H5C2_decr__age_out_with_threshold, - - /* double upper_hr_threshold = */ 0.995, - - /* double decrement = */ 0.9, - - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - - /* int32_t epochs_before_eviction = */ 3, - - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1 - }; - - TESTING("smoke check #8 -- ~1/2 dirty, ins, prot, unprot, AR cache 2"); - - core_file_driver_failed = FALSE; - - switch ( express_test2 ) - { - case 0: - max_index = (10 * 1024) - 1; - break; - - case 1: - max_index = (1 * 1024) - 1; - break; - - case 2: - max_index = (512) - 1; - break; - - default: - SKIPPED(); - HDfprintf(stdout, " Long tests disabled.\n"); - return 0; /* <========== note return */ - break; - } - - pass2 = TRUE; - - if ( show_progress ) /* 1 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - reset_entries2(); - - if ( show_progress ) /* 2 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - file_ptr = setup_cache2((size_t)(2 * 1024), - (size_t)(1 * 1024)); - cache_ptr = file_ptr->shared->cache2; - - if ( pass2 ) { - - result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 1.\n"; - } - } - - if ( show_progress ) /* 3 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - hl_row_major_scan_forward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ FALSE, - /* do_inserts */ FALSE, - /* dirty_inserts */ dirty_inserts); - - if ( show_progress ) /* 4 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - hl_row_major_scan_backward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ FALSE, - /* do_inserts */ FALSE, - /* dirty_inserts */ dirty_inserts); - - if ( show_progress ) /* 5 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - hl_row_major_scan_forward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ FALSE, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts); - - if ( show_progress ) /* 6 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* flush and destroy all entries in the cache: */ - - flush_cache2(/* file_ptr */ file_ptr, - /* destroy_entries */ TRUE, - /* dump_stats */ FALSE, - /* dump_detailed_stats */ FALSE); - - if ( show_progress ) /* 7 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - hl_col_major_scan_forward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ FALSE, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts, - /* dirty_unprotects */ dirty_unprotects); - - if ( show_progress ) /* 8 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* flush all entries in the cache: */ - - flush_cache2(/* file_ptr */ file_ptr, - /* destroy_entries */ FALSE, - /* dump_stats */ FALSE, - /* dump_detailed_stats */ FALSE); - - if ( show_progress ) /* 9 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - hl_col_major_scan_backward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ FALSE, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts, - /* dirty_unprotects */ dirty_unprotects); - - if ( show_progress ) /* 10 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - takedown_cache2(file_ptr, display_stats, TRUE); - - if ( show_progress ) /* 11 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - verify_clean2(); - verify_unprotected2(); - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - HDfprintf(stdout, "%s(): failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - if ( core_file_driver_failed ) { - - HDfprintf(stdout, - "%s(): Unable to open test file with core file driver.\n", - fcn_name); - } - - return !pass2; - -} /* smoke_check_8() */ - - -/*------------------------------------------------------------------------- - * Function: smoke_check_9() - * - * Purpose: A repeat of smoke check 1, only with the cache corked - * part of the time. - * - * Recall that smoke check 1 is a basic functional test, - * with inserts, destroys, and renames in the mix, along - * with repeated protects and unprotects. All entries are - * marked as clean. - * - * Return: void - * - * Programmer: John Mainzer - * 8/1/07 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -static unsigned -smoke_check_9(void) -{ - const char * fcn_name = "smoke_check_9"; - herr_t result; - hbool_t show_progress = FALSE; - hbool_t dirty_inserts = FALSE; - int dirty_unprotects = FALSE; - int dirty_destroys = FALSE; - hbool_t display_stats = FALSE; - hbool_t display_detailed_stats = FALSE; - int32_t max_index = (10 * 1024) - 1; - int32_t lag = 10; - int mile_stone = 1; - H5F_t * file_ptr = NULL; - H5C2_t * cache_ptr = NULL; - - TESTING("smoke check #9 -- all clean, ins, dest, ren, 4/2 MB, corked"); - - core_file_driver_failed = FALSE; - - switch ( express_test2 ) - { - case 0: - max_index = (10 * 1024) - 1; - break; - - case 1: - max_index = (1 * 1024) - 1; - break; - - case 2: - max_index = (512) - 1; - break; - - default: - SKIPPED(); - HDfprintf(stdout, " Long tests disabled.\n"); - return 0; /* <========== note return */ - break; - } - - pass2 = TRUE; - - if ( show_progress ) /* 1 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - reset_entries2(); - - if ( show_progress ) /* 2 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - file_ptr = setup_cache2((size_t)(4 * 1024 * 1024), - (size_t)(2 * 1024 * 1024)); - cache_ptr = file_ptr->shared->cache2; - - /* disable evictions */ - - if ( show_progress ) /* 3 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - if ( pass2 ) { - - result = H5C2_set_evictions_enabled(cache_ptr, FALSE); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "can't disable evictions 1.\n"; - } - } - - if ( show_progress ) /* 4 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d -- evictions disabled\n", - fcn_name, mile_stone++, (int)pass2); - - row_major_scan_forward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ display_detailed_stats, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts, - /* do_renames */ TRUE, - /* rename_to_main_addr */ FALSE, - /* do_destroys */ TRUE, - /* do_mult_ro_protects */ TRUE, - /* dirty_destroys */ dirty_destroys, - /* dirty_unprotects */ dirty_unprotects); - - /* enable evictions */ - - if ( show_progress ) /* 5 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - if ( pass2 ) { - - result = H5C2_set_evictions_enabled(cache_ptr, TRUE); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "can't enable evictions 1.\n"; - } - } - - if ( show_progress ) /* 6 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d -- evictions enabled \n", - fcn_name, mile_stone++, (int)pass2); - - row_major_scan_backward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ display_detailed_stats, - /* do_inserts */ FALSE, - /* dirty_inserts */ dirty_inserts, - /* do_renames */ TRUE, - /* rename_to_main_addr */ TRUE, - /* do_destroys */ FALSE, - /* do_mult_ro_protects */ TRUE, - /* dirty_destroys */ dirty_destroys, - /* dirty_unprotects */ dirty_unprotects); - - if ( show_progress ) /* 7 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - if ( pass2 ) { - - result = H5C2_set_evictions_enabled(cache_ptr, FALSE); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "can't disable evictions 2.\n"; - } - } - - if ( show_progress ) /* 8 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d -- evictions disabled \n", - fcn_name, mile_stone++, (int)pass2); - - row_major_scan_forward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ display_detailed_stats, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts, - /* do_renames */ TRUE, - /* rename_to_main_addr */ FALSE, - /* do_destroys */ FALSE, - /* do_mult_ro_protects */ TRUE, - /* dirty_destroys */ dirty_destroys, - /* dirty_unprotects */ dirty_unprotects); - - if ( show_progress ) /* 9 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - if ( pass2 ) { - - result = H5C2_set_evictions_enabled(cache_ptr, TRUE); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "can't enable evictions 2.\n"; - } - } - - if ( show_progress ) /* 10 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d -- evictions enabled \n", - fcn_name, mile_stone++, (int)pass2); - - /* flush and destroy all entries in the cache: */ - - flush_cache2(/* file_ptr */ file_ptr, - /* destroy_entries */ TRUE, - /* dump_stats */ FALSE, - /* dump_detailed_stats */ FALSE); - - if ( show_progress ) /* 11 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - if ( pass2 ) { - - result = H5C2_set_evictions_enabled(cache_ptr, FALSE); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "can't disable evictions 3.\n"; - } - } - - if ( show_progress ) /* 12 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d -- evictions disabled\n", - fcn_name, mile_stone++, (int)pass2); - - col_major_scan_forward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ display_detailed_stats, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts, - /* dirty_unprotects */ dirty_unprotects); - - if ( show_progress ) /* 13 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* flush all entries in the cache: */ - - flush_cache2(/* file_ptr */ file_ptr, - /* destroy_entries */ FALSE, - /* dump_stats */ FALSE, - /* dump_detailed_stats */ FALSE); - - if ( show_progress ) /* 14 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - if ( pass2 ) { - - result = H5C2_set_evictions_enabled(cache_ptr, TRUE); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "can't enable evictions 3.\n"; - } - } - - if ( show_progress ) /* 15 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d -- evictions enabled\n", - fcn_name, mile_stone++, (int)pass2); - - col_major_scan_backward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ display_detailed_stats, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts, - /* dirty_unprotects */ dirty_unprotects); - - if ( show_progress ) /* 16 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - if ( pass2 ) { - - result = H5C2_set_evictions_enabled(cache_ptr, FALSE); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "can't disable evictions 4.\n"; - } - } - - - if ( show_progress ) /* 17 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d -- evictions disabled\n", - fcn_name, mile_stone++, (int)pass2); - - takedown_cache2(file_ptr, display_stats, TRUE); - - if ( show_progress ) /* 18 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - verify_clean2(); - verify_unprotected2(); - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - HDfprintf(stdout, "%s(): failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - if ( core_file_driver_failed ) { - - HDfprintf(stdout, - "%s(): Unable to open test file with core file driver.\n", - fcn_name); - } - - return !pass2; - -} /* smoke_check_9() */ - - -/*------------------------------------------------------------------------- - * Function: smoke_check_10() - * - * Purpose: A repeat of smoke check 2, only with the cache corked - * part of the time. - * - * Recall that smoke check 2 is a basic functional test, - * with inserts, destroys, and renames in the mix, along - * with some repeated protects and unprotects. About half - * the entries are marked as dirty. - * - * Return: void - * - * Programmer: John Mainzer - * 8/1/07 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -static unsigned -smoke_check_10(void) -{ - const char * fcn_name = "smoke_check_10"; - herr_t result; - hbool_t show_progress = FALSE; - hbool_t dirty_inserts = TRUE; - int dirty_unprotects = TRUE; - int dirty_destroys = TRUE; - hbool_t display_stats = FALSE; - hbool_t display_detailed_stats = FALSE; - int32_t max_index = (10 * 1024) - 1; - int32_t lag = 10; - int mile_stone = 1; - H5F_t * file_ptr = NULL; - H5C2_t * cache_ptr = NULL; - - TESTING("smoke check #10 -- ~1/2 dirty, ins, dest, ren, 4/2 MB, corked"); - - core_file_driver_failed = FALSE; - - switch ( express_test2 ) - { - case 0: - max_index = (10 * 1024) - 1; - break; - - case 1: - max_index = (1 * 1024) - 1; - break; - - case 2: - max_index = (512) - 1; - break; - - default: - SKIPPED(); - HDfprintf(stdout, " Long tests disabled.\n"); - return 0; /* <========== note return */ - break; - } - - pass2 = TRUE; - - if ( show_progress ) /* 1 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - reset_entries2(); - - if ( show_progress ) /* 2 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - file_ptr = setup_cache2((size_t)(4 * 1024 * 1024), - (size_t)(2 * 1024 * 1024)); - cache_ptr = file_ptr->shared->cache2; - - if ( show_progress ) /* 3 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d -- evictions enabled\n", - fcn_name, mile_stone++, (int)pass2); - - row_major_scan_forward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ display_detailed_stats, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts, - /* do_renames */ TRUE, - /* rename_to_main_addr */ FALSE, - /* do_destroys */ TRUE, - /* do_mult_ro_protects */ TRUE, - /* dirty_destroys */ dirty_destroys, - /* dirty_unprotects */ dirty_unprotects); - - if ( show_progress ) /* 4 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - if ( pass2 ) { - - result = H5C2_set_evictions_enabled(cache_ptr, FALSE); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "can't disable evictions 1.\n"; - } - } - - if ( show_progress ) /* 5 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d -- evictions disabled\n", - fcn_name, mile_stone++, (int)pass2); - - row_major_scan_backward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ display_detailed_stats, - /* do_inserts */ FALSE, - /* dirty_inserts */ dirty_inserts, - /* do_renames */ TRUE, - /* rename_to_main_addr */ TRUE, - /* do_destroys */ FALSE, - /* do_mult_ro_protects */ TRUE, - /* dirty_destroys */ dirty_destroys, - /* dirty_unprotects */ dirty_unprotects); - - if ( show_progress ) /* 6 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - if ( pass2 ) { - - result = H5C2_set_evictions_enabled(cache_ptr, TRUE); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "can't enable evictions 1.\n"; - } - } - - if ( show_progress ) /* 7 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d -- evictions enabled\n", - fcn_name, mile_stone++, (int)pass2); - - row_major_scan_forward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ display_detailed_stats, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts, - /* do_renames */ TRUE, - /* rename_to_main_addr */ FALSE, - /* do_destroys */ FALSE, - /* do_mult_ro_protects */ TRUE, - /* dirty_destroys */ dirty_destroys, - /* dirty_unprotects */ dirty_unprotects); - - if ( show_progress ) /* 8 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - if ( pass2 ) { - - result = H5C2_set_evictions_enabled(cache_ptr, FALSE); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "can't disable evictions 2.\n"; - } - } - - if ( show_progress ) /* 9 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d -- evictions disabled\n", - fcn_name, mile_stone++, (int)pass2); - - /* flush and destroy all entries in the cache: */ - - flush_cache2(/* file_ptr */ file_ptr, - /* destroy_entries */ TRUE, - /* dump_stats */ FALSE, - /* dump_detailed_stats */ FALSE); - - if ( show_progress ) /* 10 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - if ( pass2 ) { - - result = H5C2_set_evictions_enabled(cache_ptr, TRUE); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "can't enable evictions 2.\n"; - } - } - - if ( show_progress ) /* 11 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d -- evictions enabled\n", - fcn_name, mile_stone++, (int)pass2); - - col_major_scan_forward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ display_detailed_stats, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts, - /* dirty_unprotects */ dirty_unprotects); - - if ( show_progress ) /* 12 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - if ( pass2 ) { - - result = H5C2_set_evictions_enabled(cache_ptr, FALSE); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "can't disable evictions 3.\n"; - } - } - - if ( show_progress ) /* 13 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d -- evictions disabled\n", - fcn_name, mile_stone++, (int)pass2); - - /* flush all entries in the cache: */ - - flush_cache2(/* file_ptr */ file_ptr, - /* destroy_entries */ FALSE, - /* dump_stats */ FALSE, - /* dump_detailed_stats */ FALSE); - - if ( show_progress ) /* 14 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - if ( pass2 ) { - - result = H5C2_set_evictions_enabled(cache_ptr, TRUE); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "can't enable evictions 3.\n"; - } - } - - if ( show_progress ) /* 15 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d -- evictions enabled\n", - fcn_name, mile_stone++, (int)pass2); - - col_major_scan_backward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ display_detailed_stats, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts, - /* dirty_unprotects */ dirty_unprotects); - - if ( show_progress ) /* 16 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - if ( pass2 ) { - - result = H5C2_set_evictions_enabled(cache_ptr, FALSE); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "can't disable evictions 4.\n"; - } - } - - if ( show_progress ) /* 17 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d -- evictions disabled\n", - fcn_name, mile_stone++, (int)pass2); - - takedown_cache2(file_ptr, display_stats, TRUE); - - if ( show_progress ) /* 18 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - verify_clean2(); - verify_unprotected2(); - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - HDfprintf(stdout, "%s(): failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - if ( core_file_driver_failed ) { - - HDfprintf(stdout, - "%s(): Unable to open test file with core file driver.\n", - fcn_name); - } - - return !pass2; - -} /* smoke_check_10() */ - - -/*------------------------------------------------------------------------- - * Function: write_permitted_check() - * - * Purpose: A basic test of the write permitted function. In essence, - * we load the cache up with dirty entryies, set - * write_permitted2 to FALSE, and then protect a bunch of - * entries. If there are any writes while write_permitted2 is - * FALSE, the test will fail. - * - * Return: void - * - * Programmer: John Mainzer - * 6/24/04 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -static unsigned -write_permitted_check(void) -{ - -#if H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS - - const char * fcn_name = "write_permitted_check"; - hbool_t show_progress = FALSE; - hbool_t display_stats = FALSE; - int32_t max_index = (10 * 1024) - 1; - int32_t lag = 10; - int mile_stone = 1; - H5F_t * file_ptr = NULL; - -#endif /* H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ - - TESTING("write permitted check -- 1/0 MB cache"); - - core_file_driver_failed = FALSE; - -#if H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS - - switch ( express_test2 ) - { - case 0: - max_index = (10 * 1024) - 1; - break; - - case 1: - max_index = (1 * 1024) - 1; - break; - - case 2: - max_index = (512) - 1; - break; - - default: - SKIPPED(); - HDfprintf(stdout, " Long tests disabled.\n"); - return 0; /* <========== note return */ - break; - } - - pass2 = TRUE; - - if ( show_progress ) /* 1 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - reset_entries2(); - - if ( show_progress ) /* 2 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - file_ptr = setup_cache2((size_t)(1 * 1024 * 1024), - (size_t)(0)); - - if ( show_progress ) /* 3 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - row_major_scan_forward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ TRUE, - /* do_inserts */ TRUE, - /* dirty_inserts */ TRUE, - /* do_renames */ TRUE, - /* rename_to_main_addr */ FALSE, - /* do_destroys */ TRUE, - /* do_mult_ro_protects */ TRUE, - /* dirty_destroys */ TRUE, - /* dirty_unprotects */ TRUE); - - if ( show_progress ) /* 4 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - write_permitted2 = FALSE; - - row_major_scan_backward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ TRUE, - /* do_inserts */ FALSE, - /* dirty_inserts */ FALSE, - /* do_renames */ TRUE, - /* rename_to_main_addr */ TRUE, - /* do_destroys */ FALSE, - /* do_mult_ro_protects */ TRUE, - /* dirty_destroys */ FALSE, - /* dirty_unprotects */ NO_CHANGE); - - if ( show_progress ) /* 5 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - write_permitted2 = TRUE; - - row_major_scan_forward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ TRUE, - /* do_inserts */ TRUE, - /* dirty_inserts */ TRUE, - /* do_renames */ TRUE, - /* rename_to_main_addr */ FALSE, - /* do_destroys */ FALSE, - /* do_mult_ro_protects */ TRUE, - /* dirty_destroys */ TRUE, - /* dirty_unprotects */ TRUE); - - if ( show_progress ) /* 6 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* flush and destroy all entries in the cache: */ - - flush_cache2(/* file_ptr */ file_ptr, - /* destroy_entries */ TRUE, - /* dump_stats */ FALSE, - /* dump_detailed_stats */ FALSE); - - if ( show_progress ) /* 7 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - col_major_scan_forward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ TRUE, - /* do_inserts */ TRUE, - /* dirty_inserts */ TRUE, - /* dirty_unprotects */ TRUE); - - if ( show_progress ) /* 8 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - write_permitted2 = FALSE; - - col_major_scan_backward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ FALSE, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ TRUE, - /* do_inserts */ FALSE, - /* dirty_inserts */ FALSE, - /* dirty_unprotects */ NO_CHANGE); - - write_permitted2 = TRUE; - - if ( show_progress ) /* 9 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - takedown_cache2(file_ptr, display_stats, TRUE); - - if ( show_progress ) /* 10 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - verify_clean2(); - verify_unprotected2(); - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - HDfprintf(stdout, "%s(): failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - if ( core_file_driver_failed ) { - - HDfprintf(stdout, - "%s(): Unable to open test file with core file driver.\n", - fcn_name); - } - -#else /* H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ - - SKIPPED(); - - HDfprintf(stdout, " Clean and dirty LRU lists disabled.\n"); - -#endif /* H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ - - return !pass2; - -} /* write_permitted_check() */ - - -/*------------------------------------------------------------------------- - * Function: check_insert_entry() - * - * Purpose: Verify that H5C2_insert_entry behaves as expected. - * Test the behaviour with different flags. - * - * This test was added primarily to test basic insert - * pinned entry functionallity, but I through in explicit - * tests for other functionallity that is tested implicitly - * elsewhere. - * - * Return: void - * - * Programmer: John Mainzer - * 8/10/06 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -static unsigned -check_insert_entry(void) -{ - const char * fcn_name = "check_insert_entry"; - int entry_type = PICO_ENTRY_TYPE; - int i; - int point = 0; - int subpoint = 0; - herr_t result; - hbool_t in_cache; - hbool_t is_dirty; - hbool_t is_protected; - hbool_t is_pinned; - hbool_t show_progress = FALSE; - size_t entry_size; - H5F_t * file_ptr = NULL; - H5C2_t * cache_ptr = NULL; - test_entry_t * base_addr; - test_entry_t * entry_ptr; - struct H5C2_cache_entry_t * search_ptr; - - - TESTING("H5C2_insert_entry() functionality"); - - core_file_driver_failed = FALSE; - - pass2 = TRUE; - - if ( show_progress ) { - HDfprintf(stdout, "%s: point = %d\n", fcn_name, point++); /* 0 */ - } - - /* Allocate a cache, and insert entries into it using all - * combinations of flags. Verify that the entries are inserted, - * and that the flags have the desired effects. - * - * Note that the dirty parameter in insert_entry is no longer - * used, as we have decided that all inserted entries are - * dirty by definition. (Which sounds very reasonable, but didn't - * used to be the case.) - */ - - if ( pass2 ) { - - reset_entries2(); - - file_ptr = setup_cache2((size_t)(2 * 1024 * 1024), - (size_t)(1 * 1024 * 1024)); - cache_ptr = file_ptr->shared->cache2; - } - - if ( show_progress ) { - HDfprintf(stdout, "%s: point = %d\n", fcn_name, point++); /* 1 */ - } - - if ( pass2 ) { - - insert_entry2(file_ptr, entry_type, 0, TRUE, H5C2__NO_FLAGS_SET); - insert_entry2(file_ptr, entry_type, 1, TRUE, - H5C2__SET_FLUSH_MARKER_FLAG); - insert_entry2(file_ptr, entry_type, 2, TRUE, H5C2__PIN_ENTRY_FLAG); - insert_entry2(file_ptr, entry_type, 3, TRUE, - (H5C2__SET_FLUSH_MARKER_FLAG | H5C2__PIN_ENTRY_FLAG)); - } - - if ( show_progress ) { - HDfprintf(stdout, "%s: point = %d\n", fcn_name, point++); /* 2 */ - } - - /* Verify that the entries are inserted as desired. */ - - i = 0; - base_addr = entries2[0]; - while ( ( pass2 ) && ( i < 4 ) ) - { - subpoint = 0; - - entry_ptr = &(base_addr[i]); - - /* Start by checking everything we can via H5C2_get_entry_status() */ - - if ( show_progress ) { - HDfprintf(stdout, "%s:%d point = %d.%d\n", - fcn_name, i, point, subpoint++); - } - - result = H5C2_get_entry_status(file_ptr, entry_ptr->addr, &entry_size, - &in_cache, &is_dirty, &is_protected, - &is_pinned); - - if ( show_progress ) { - HDfprintf(stdout, "%s:%d point = %d.%d\n", - fcn_name, i, point, subpoint++); - } - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_entry_status() reports failure."; - } - - if ( show_progress ) { - HDfprintf(stdout, "%s:%d point = %d.%d\n", - fcn_name, i, point, subpoint++); - } - - if ( pass2 ) { - - /* check the universals */ - if ( ( ! in_cache ) || ( ! is_dirty ) || ( is_protected ) || - ( entry_size != entry_sizes2[entry_type] ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected insert results 1."; - } - } - - if ( show_progress ) { - HDfprintf(stdout, "%s:%d point = %d.%d\n", - fcn_name, i, point, subpoint++); - } - - if ( pass2 ) { - - /* verify that the pinned flag got set correctly */ - if ( ( i == 2 ) || ( i == 3 ) ) { - - if ( ! is_pinned ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected insert results 2."; - } - } else if ( is_pinned ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected insert results 3."; - - } else if ( is_pinned != ((entry_ptr->header).is_pinned) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected insert results 4."; - } - } - - if ( show_progress ) { - HDfprintf(stdout, "%s:%d point = %d.%d\n", - fcn_name, i, point, subpoint++); - } - - /* Thats all we can get from H5C2_get_entry_status(). - * Now start looking at the cache data structures directly. - */ - - if ( pass2 ) { - - /* Verify that the flush marker got set correctly */ - if ( ( i == 1 ) || ( i == 3 ) ) { - - if ( ! ((entry_ptr->header).flush_marker) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected insert results 5."; - } - } else if ( (entry_ptr->header).flush_marker ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected insert results 6."; - } - } - - if ( show_progress ) { - HDfprintf(stdout, "%s:%d point = %d.%d\n", - fcn_name, i, point, subpoint++); - } - - if ( pass2 ) { - - /* Verify that pinned entries are in the pinned entry list */ - if ( (entry_ptr->header).is_pinned ) { - - search_ptr = cache_ptr->pel_head_ptr; - - while ( ( search_ptr != NULL ) && - ( search_ptr != - (struct H5C2_cache_entry_t *)entry_ptr ) ) - { - search_ptr = search_ptr->next; - } - - if ( search_ptr == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected insert results 7."; - } - } - } - - if ( show_progress ) { - HDfprintf(stdout, "%s:%d point = %d.%d\n", - fcn_name, i, point, subpoint++); - } - - if ( pass2 ) { - - /* Verify that unpinned entries are in the LRU list */ - if ( ! ((entry_ptr->header).is_pinned) ) { - - search_ptr = cache_ptr->LRU_head_ptr; - - while ( ( search_ptr != NULL ) && - ( search_ptr != - (struct H5C2_cache_entry_t *)entry_ptr ) ) - { - search_ptr = search_ptr->next; - } - - if ( search_ptr == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected insert results 8."; - } - } - } - - if ( show_progress ) { - HDfprintf(stdout, "%s:%d point = %d.%d\n", - fcn_name, i, point, subpoint++); - } - -#if H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS - if ( pass2 ) { - - /* Verify that unpinned entries are in the dirty LRU list */ - if ( ! ((entry_ptr->header).is_pinned) ) { - - search_ptr = cache_ptr->dLRU_head_ptr; - - while ( ( search_ptr != NULL ) && - ( search_ptr != - (struct H5C2_cache_entry_t *)entry_ptr ) ) - { - search_ptr = search_ptr->aux_next; - } - - if ( search_ptr == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected insert results 9."; - } - } - } -#endif /* H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ - - if ( show_progress ) { - HDfprintf(stdout, "%s:%d point = %d.%d\n", - fcn_name, i, point, subpoint++); - } - - i++; - - } /* while */ - - if ( show_progress ) { - point++; - HDfprintf(stdout, "%s: point = %d\n", fcn_name, point++); - } - - /* So much for looking at the individual entries. Now verify - * that the various counts and sized in the cache header are - * as expected. - */ - - if ( pass2 ) { - - if ( ( cache_ptr->index_len != 4 ) || - ( cache_ptr->index_size != 4 * entry_sizes2[entry_type] ) || - ( cache_ptr->slist_len != 4 ) || - ( cache_ptr->slist_size != 4 * entry_sizes2[entry_type] ) || - ( cache_ptr->pl_len != 0 ) || - ( cache_ptr->pl_size != (size_t)0 ) || - ( cache_ptr->pel_len != 2 ) || - ( cache_ptr->pel_size != 2 * entry_sizes2[entry_type] ) || - ( cache_ptr->LRU_list_len != 2 ) || - ( cache_ptr->LRU_list_size != 2 * entry_sizes2[entry_type] ) || -#if H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS - ( cache_ptr->dLRU_list_len != 2 ) || - ( cache_ptr->dLRU_list_size != 2 * entry_sizes2[entry_type] ) || -#endif /* H5C2_MAINTAIN_CLEAN_AND_DIRTY_LRU_LISTS */ - ( cache_ptr->cLRU_list_len != 0 ) || - ( cache_ptr->cLRU_list_size != (size_t)0 ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected insert results 10."; - } - } - - if ( show_progress ) { - HDfprintf(stdout, "%s: point = %d\n", fcn_name, point++); - } - - /* Finally, if stats collection is enabled, verify that the expected - * stats are collected. - */ -#if H5C2_COLLECT_CACHE_STATS - if ( pass2 ) { - - if ( ( cache_ptr->insertions[entry_type] != 4 ) || - ( cache_ptr->pinned_insertions[entry_type] != 2 ) || - ( cache_ptr->pins[entry_type] != 2 ) || - ( cache_ptr->unpins[entry_type] != 0 ) || - ( cache_ptr->dirty_pins[entry_type] != 0 ) || - ( cache_ptr->max_index_len != 4 ) || - ( cache_ptr->max_index_size != 4 * entry_sizes2[entry_type] ) || - ( cache_ptr->max_slist_len != 4 ) || - ( cache_ptr->max_slist_size != 4 * entry_sizes2[entry_type] ) || - ( cache_ptr->max_pl_len != 0 ) || - ( cache_ptr->max_pl_size != (size_t)0 ) || - ( cache_ptr->max_pel_len != 2 ) || - ( cache_ptr->max_pel_size != 2 * entry_sizes2[entry_type] ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected insert results 11."; - } - } -#endif /* H5C2_COLLECT_CACHE_STATS */ - - if ( show_progress ) { - HDfprintf(stdout, "%s: point = %d\n", fcn_name, point++); - } - - /* Unpin the pinned entries so we can take down the cache cleanly. */ - - if ( pass2 ) { - - unpin_entry2(file_ptr, entry_type, 2); - unpin_entry2(file_ptr, entry_type, 3); - } - - if ( show_progress ) { - HDfprintf(stdout, "%s: point = %d\n", fcn_name, point++); - } - - if ( pass2 ) { - - takedown_cache2(file_ptr, FALSE, FALSE); - } - - if ( show_progress ) { - HDfprintf(stdout, "%s: point = %d\n", fcn_name, point++); - } - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - HDfprintf(stdout, "%s(): failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - if ( core_file_driver_failed ) { - - HDfprintf(stdout, - "%s(): Unable to open test file with core file driver.\n", - fcn_name); - } - - return !pass2; - -} /* check_insert_entry() */ - - -/*------------------------------------------------------------------------- - * Function: check_flush_cache() - * - * Purpose: Verify that flush_cache behaves as expected. In particular, - * test the behaviour with different flags. - * - * Return: void - * - * Programmer: John Mainzer - * 1/10/05 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -static unsigned -check_flush_cache(void) -{ - const char * fcn_name = "check_flush_cache"; - hbool_t show_progress = FALSE; - int mile_stone = 0; - H5F_t * file_ptr = NULL; - - TESTING("H5C2_flush_cache() functionality"); - - core_file_driver_failed = FALSE; - - pass2 = TRUE; - - if ( show_progress ) { /* 0 */ - HDfprintf(stdout, "\n%s: mile_stone = %d.\n", fcn_name, mile_stone++); - } - - /* allocate a cache, and flush it under various circumstances. - * To the extent possible, verify that the desired actions took - * place. - */ - - if ( pass2 ) { - - reset_entries2(); - - file_ptr = setup_cache2((size_t)(2 * 1024 * 1024), - (size_t)(1 * 1024 * 1024)); - } - - if ( show_progress ) { /* 1 */ - HDfprintf(stdout, "%s: mile_stone = %d.\n", fcn_name, mile_stone++); - } - - /* first test behaviour on an empty cache. Can't do much sanity - * checking in this case, so simply check the return values. - */ - - if ( pass2 ) { - - check_flush_cache__empty_cache(file_ptr); - } - - if ( show_progress ) { /* 2 */ - HDfprintf(stdout, "%s: mile_stone = %d.\n", fcn_name, mile_stone++); - } - - /* now do a series of similar tests with a cache with a single entry. - * Start with a clean entry, with no flags set. - */ - - if ( pass2 ) { - - check_flush_cache__single_entry(file_ptr); - } - - if ( show_progress ) { /* 3 */ - HDfprintf(stdout, "%s: mile_stone = %d.\n", fcn_name, mile_stone++); - } - - if ( pass2 ) { - - check_flush_cache__multi_entry(file_ptr); - } - - if ( show_progress ) { /* 4 */ - HDfprintf(stdout, "%s: mile_stone = %d.\n", fcn_name, mile_stone++); - } - - if ( pass2 ) { - - check_flush_cache__flush_ops(file_ptr); - } - - if ( show_progress ) { /* 5 */ - HDfprintf(stdout, "%s: mile_stone = %d.\n", fcn_name, mile_stone++); - } - - if ( pass2 ) { - - takedown_cache2(file_ptr, FALSE, FALSE); - } - - if ( show_progress ) { /* 6 */ - HDfprintf(stdout, "%s: mile_stone = %d.\n", fcn_name, mile_stone++); - } - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - HDfprintf(stdout, "%s(): failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - if ( core_file_driver_failed ) { - - HDfprintf(stdout, - "%s(): Unable to open test file with core file driver.\n", - fcn_name); - } - - return !pass2; - -} /* check_flush_cache() */ - - -/*------------------------------------------------------------------------- - * Function: check_flush_cache__empty_cache() - * - * Purpose: Verify that flush_cache behaves as expected with an empty - * cache. - * - * Return: void - * - * Programmer: John Mainzer - * 1/12/05 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -static void -check_flush_cache__empty_cache(H5F_t * file_ptr) -{ - /* const char * fcn_name = "check_flush_cache__empty_cache"; */ - H5C2_t * cache_ptr = file_ptr->shared->cache2; - herr_t result; - - if ( cache_ptr == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "cache_ptr NULL on entry to empty cache case."; - } - else if ( ( cache_ptr->index_len != 0 ) || - ( cache_ptr->index_size != 0 ) ) { - - pass2 = FALSE; - failure_mssg2 = "cache not empty at beginning of empty cache case."; - } - - - /* Test behaviour on an empty cache. Can't do much sanity - * checking in this case, so simply check the return values. - */ - - if ( pass2 ) { - - result = H5C2_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, - H5C2__NO_FLAGS_SET); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "flush with flags = 0x00 failed on empty cache.\n"; - } - } - - if ( pass2 ) { - - result = H5C2_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, - H5C2__FLUSH_INVALIDATE_FLAG); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "flush with flags = 0x04 failed on empty cache.\n"; - } - } - - if ( pass2 ) { - - result = H5C2_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, - H5C2__FLUSH_CLEAR_ONLY_FLAG); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "flush with flags = 0x08 failed on empty cache.\n"; - } - } - - - if ( pass2 ) { - - result = H5C2_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, - H5C2__FLUSH_MARKED_ENTRIES_FLAG); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "flush with flags = 0x10 failed on empty cache.\n"; - } - } - -} /* check_flush_cache__empty_cache() */ - - -/*------------------------------------------------------------------------- - * Function: check_flush_cache__multi_entry() - * - * Purpose: Verify that flush_cache behaves as expected when the cache - * contains multiple elements. - * - * Return: void - * - * Programmer: John Mainzer - * 1/14/05 - * - * Modifications: - * - * JRM -- 4/5/06 - * Added pinned entry tests. - * - *------------------------------------------------------------------------- - */ - -static void -check_flush_cache__multi_entry(H5F_t * file_ptr) -{ - /* const char * fcn_name = "check_flush_cache__multi_entry"; */ - H5C2_t * cache_ptr = file_ptr->shared->cache2; - - if ( cache_ptr == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "cache_ptr NULL on entry to multi entry case."; - } - else if ( ( cache_ptr->index_len != 0 ) || - ( cache_ptr->index_size != 0 ) ) { - - pass2 = FALSE; - failure_mssg2 = "cache not empty at beginning of multi entry case."; - } - - if ( pass2 ) - { - int test_num = 1; - unsigned int flush_flags = H5C2__NO_FLAGS_SET; - int spec_size = 8; - struct flush_cache_test_spec spec[8] = - { - { - /* entry_num = */ 0, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 100, - /* insert_flag = */ FALSE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 1, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 75, - /* insert_flag = */ FALSE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 2, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 25, - /* insert_flag = */ TRUE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 3, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 50, - /* insert_flag = */ TRUE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 4, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 10, - /* insert_flag = */ FALSE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 5, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 20, - /* insert_flag = */ FALSE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 6, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 30, - /* insert_flag = */ TRUE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 7, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 40, - /* insert_flag = */ TRUE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ FALSE - } - }; - - check_flush_cache__multi_entry_test(file_ptr, test_num, - flush_flags, spec_size, spec); - } - - - if ( pass2 ) - { - int test_num = 2; - unsigned int flush_flags = H5C2__FLUSH_INVALIDATE_FLAG; - int spec_size = 8; - struct flush_cache_test_spec spec[8] = - { - { - /* entry_num = */ 0, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 100, - /* insert_flag = */ FALSE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 1, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 75, - /* insert_flag = */ FALSE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 2, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 25, - /* insert_flag = */ TRUE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 3, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 50, - /* insert_flag = */ TRUE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 4, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 10, - /* insert_flag = */ FALSE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 5, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 20, - /* insert_flag = */ FALSE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 6, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 30, - /* insert_flag = */ TRUE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 7, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 40, - /* insert_flag = */ TRUE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ TRUE - } - }; - - check_flush_cache__multi_entry_test(file_ptr, test_num, - flush_flags, spec_size, spec); - } - - - if ( pass2 ) - { - int test_num = 3; - unsigned int flush_flags = H5C2__FLUSH_CLEAR_ONLY_FLAG; - int spec_size = 8; - struct flush_cache_test_spec spec[8] = - { - { - /* entry_num = */ 0, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 100, - /* insert_flag = */ FALSE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 1, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 75, - /* insert_flag = */ FALSE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ TRUE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 2, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 25, - /* insert_flag = */ TRUE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ TRUE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 3, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 50, - /* insert_flag = */ TRUE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ TRUE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 4, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 10, - /* insert_flag = */ FALSE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 5, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 20, - /* insert_flag = */ FALSE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ TRUE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 6, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 30, - /* insert_flag = */ TRUE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ TRUE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 7, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 40, - /* insert_flag = */ TRUE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ TRUE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ FALSE - } - }; - - check_flush_cache__multi_entry_test(file_ptr, test_num, - flush_flags, spec_size, spec); - } - - - if ( pass2 ) - { - int test_num = 4; - unsigned int flush_flags = H5C2__FLUSH_MARKED_ENTRIES_FLAG; - int spec_size = 8; - struct flush_cache_test_spec spec[8] = - { - { - /* entry_num = */ 0, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 100, - /* insert_flag = */ FALSE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 1, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 75, - /* insert_flag = */ FALSE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 2, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 25, - /* insert_flag = */ TRUE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 3, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 50, - /* insert_flag = */ TRUE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 4, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 10, - /* insert_flag = */ FALSE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 5, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 20, - /* insert_flag = */ FALSE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 6, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 30, - /* insert_flag = */ TRUE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 7, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 40, - /* insert_flag = */ TRUE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ FALSE - } - }; - - check_flush_cache__multi_entry_test(file_ptr, test_num, - flush_flags, spec_size, spec); - } - - - if ( pass2 ) - { - int test_num = 5; - unsigned int flush_flags = H5C2__FLUSH_INVALIDATE_FLAG | - H5C2__FLUSH_CLEAR_ONLY_FLAG; - int spec_size = 8; - struct flush_cache_test_spec spec[8] = - { - { - /* entry_num = */ 0, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 100, - /* insert_flag = */ FALSE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 1, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 75, - /* insert_flag = */ FALSE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ TRUE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 2, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 25, - /* insert_flag = */ TRUE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ TRUE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 3, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 50, - /* insert_flag = */ TRUE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ TRUE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 4, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 10, - /* insert_flag = */ FALSE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 5, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 20, - /* insert_flag = */ FALSE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ TRUE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 6, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 30, - /* insert_flag = */ TRUE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ TRUE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 7, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 40, - /* insert_flag = */ TRUE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ TRUE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ TRUE - } - }; - - check_flush_cache__multi_entry_test(file_ptr, test_num, - flush_flags, spec_size, spec); - } - - - if ( pass2 ) - { - int test_num = 6; - unsigned int flush_flags = H5C2__FLUSH_INVALIDATE_FLAG | - H5C2__FLUSH_MARKED_ENTRIES_FLAG; - int spec_size = 8; - struct flush_cache_test_spec spec[8] = - { - { - /* entry_num = */ 0, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 100, - /* insert_flag = */ FALSE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 1, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 75, - /* insert_flag = */ FALSE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 2, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 25, - /* insert_flag = */ TRUE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 3, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 50, - /* insert_flag = */ TRUE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 4, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 10, - /* insert_flag = */ FALSE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 5, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 20, - /* insert_flag = */ FALSE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 6, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 30, - /* insert_flag = */ TRUE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 7, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 40, - /* insert_flag = */ TRUE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ TRUE - } - }; - - check_flush_cache__multi_entry_test(file_ptr, test_num, - flush_flags, spec_size, spec); - } - - - if ( pass2 ) - { - int test_num = 7; - unsigned int flush_flags = H5C2__FLUSH_CLEAR_ONLY_FLAG | - H5C2__FLUSH_MARKED_ENTRIES_FLAG; - int spec_size = 8; - struct flush_cache_test_spec spec[8] = - { - { - /* entry_num = */ 0, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 100, - /* insert_flag = */ FALSE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 1, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 75, - /* insert_flag = */ FALSE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 2, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 25, - /* insert_flag = */ TRUE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 3, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 50, - /* insert_flag = */ TRUE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 4, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 10, - /* insert_flag = */ FALSE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 5, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 20, - /* insert_flag = */ FALSE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ TRUE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 6, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 30, - /* insert_flag = */ TRUE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ TRUE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 7, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 40, - /* insert_flag = */ TRUE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ TRUE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ FALSE - } - }; - - check_flush_cache__multi_entry_test(file_ptr, test_num, - flush_flags, spec_size, spec); - } - - - if ( pass2 ) - { - int test_num = 8; - unsigned int flush_flags = H5C2__FLUSH_INVALIDATE_FLAG | - H5C2__FLUSH_CLEAR_ONLY_FLAG | - H5C2__FLUSH_MARKED_ENTRIES_FLAG; - int spec_size = 8; - struct flush_cache_test_spec spec[8] = - { - { - /* entry_num = */ 0, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 100, - /* insert_flag = */ FALSE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 1, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 75, - /* insert_flag = */ FALSE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ TRUE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 2, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 25, - /* insert_flag = */ TRUE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ TRUE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 3, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 50, - /* insert_flag = */ TRUE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ TRUE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 4, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 10, - /* insert_flag = */ FALSE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 5, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 20, - /* insert_flag = */ FALSE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ TRUE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 6, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 30, - /* insert_flag = */ TRUE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ TRUE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 7, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 40, - /* insert_flag = */ TRUE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ TRUE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ TRUE - } - }; - - check_flush_cache__multi_entry_test(file_ptr, test_num, - flush_flags, spec_size, spec); - } - - - /* verify that all other flags are ignored */ - if ( pass2 ) - { - int test_num = 9; - unsigned int flush_flags = (unsigned) - ~(H5C2__FLUSH_INVALIDATE_FLAG | - H5C2__FLUSH_CLEAR_ONLY_FLAG | - H5C2__FLUSH_MARKED_ENTRIES_FLAG); - int spec_size = 8; - struct flush_cache_test_spec spec[8] = - { - { - /* entry_num = */ 0, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 100, - /* insert_flag = */ FALSE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 1, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 75, - /* insert_flag = */ FALSE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 2, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 25, - /* insert_flag = */ TRUE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 3, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 50, - /* insert_flag = */ TRUE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 4, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 10, - /* insert_flag = */ FALSE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 5, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 20, - /* insert_flag = */ FALSE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 6, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 30, - /* insert_flag = */ TRUE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 7, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 40, - /* insert_flag = */ TRUE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ FALSE - } - }; - - check_flush_cache__multi_entry_test(file_ptr, test_num, - flush_flags, spec_size, spec); - } - - /* Now do pinned entry tests: - * - * For the most part, this test is directed at testing the ability - * of the flush routine to unravel collections of pinned entries. - */ - - if ( pass2 ) - { - int test_num = 1; - unsigned int flush_flags = H5C2__NO_FLAGS_SET; - int spec_size = 8; - struct pe_flush_cache_test_spec spec[8] = - { - { - /* entry_num = */ 0, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 100, - /* insert_flag = */ FALSE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* num_pins = */ 0, - /* pin_type[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, - /* pin_idx[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 1, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 75, - /* insert_flag = */ FALSE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* num_pins = */ 1, - /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, - -1, -1, -1, -1, -1, -1, -1}, - /* pin_idx[MAX_PINS] = */ {100, -1, -1, -1, -1, -1, -1, -1}, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 2, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 25, - /* insert_flag = */ TRUE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* num_pins = */ 2, - /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, - PICO_ENTRY_TYPE, - -1, -1, -1, -1, -1, -1}, - /* pin_idx[MAX_PINS] = */ {100, 75, -1, -1, -1, -1, -1, -1}, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 3, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 50, - /* insert_flag = */ TRUE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* num_pins = */ 3, - /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, - PICO_ENTRY_TYPE, - PICO_ENTRY_TYPE, - -1, -1, -1, -1, -1}, - /* pin_idx[MAX_PINS] = */ {100, 75, 25, -1, -1, -1, -1, -1}, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 4, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 10, - /* insert_flag = */ FALSE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* num_pins = */ 4, - /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, - PICO_ENTRY_TYPE, - PICO_ENTRY_TYPE, - PICO_ENTRY_TYPE, - -1, -1, -1, -1}, - /* pin_idx[MAX_PINS] = */ {100, 75, 25, 50, -1, -1, -1, -1}, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 5, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 20, - /* insert_flag = */ FALSE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* num_pins = */ 5, - /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, - PICO_ENTRY_TYPE, - PICO_ENTRY_TYPE, - PICO_ENTRY_TYPE, - MONSTER_ENTRY_TYPE, - -1, -1, -1}, - /* pin_idx[MAX_PINS] = */ {100, 75, 25, 50, 10, -1, -1, -1}, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 6, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 30, - /* insert_flag = */ TRUE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* num_pins = */ 6, - /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, - PICO_ENTRY_TYPE, - PICO_ENTRY_TYPE, - PICO_ENTRY_TYPE, - MONSTER_ENTRY_TYPE, - MONSTER_ENTRY_TYPE, - -1, -1}, - /* pin_idx[MAX_PINS] = */ {100, 75, 25, 50, 10, 20, -1, -1}, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 7, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 40, - /* insert_flag = */ TRUE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* num_pins = */ 7, - /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, - PICO_ENTRY_TYPE, - PICO_ENTRY_TYPE, - PICO_ENTRY_TYPE, - MONSTER_ENTRY_TYPE, - MONSTER_ENTRY_TYPE, - MONSTER_ENTRY_TYPE, - -1}, - /* pin_idx[MAX_PINS] = */ {100, 75, 25, 50, 10, 20, 30, -1}, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ FALSE - } - }; - - check_flush_cache__pe_multi_entry_test(file_ptr, test_num, - flush_flags, spec_size, spec); - } - - - if ( pass2 ) - { - int test_num = 2; - unsigned int flush_flags = H5C2__FLUSH_INVALIDATE_FLAG; - int spec_size = 8; - struct pe_flush_cache_test_spec spec[8] = - { - { - /* entry_num = */ 0, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 100, - /* insert_flag = */ FALSE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* num_pins = */ 0, - /* pin_type[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, - /* pin_idx[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 1, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 75, - /* insert_flag = */ FALSE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* num_pins = */ 1, - /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, - -1, -1, -1, -1, -1, -1, -1}, - /* pin_idx[MAX_PINS] = */ {100, -1, -1, -1, -1, -1, -1, -1}, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 2, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 25, - /* insert_flag = */ TRUE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* num_pins = */ 2, - /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, - PICO_ENTRY_TYPE, - -1, -1, -1, -1, -1, -1}, - /* pin_idx[MAX_PINS] = */ {100, 75, -1, -1, -1, -1, -1, -1}, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 3, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 50, - /* insert_flag = */ TRUE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* num_pins = */ 3, - /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, - PICO_ENTRY_TYPE, - PICO_ENTRY_TYPE, - -1, -1, -1, -1, -1}, - /* pin_idx[MAX_PINS] = */ {100, 75, 25, -1, -1, -1, -1, -1}, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 4, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 10, - /* insert_flag = */ FALSE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* num_pins = */ 0, - /* pin_type[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, - /* pin_idx[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 5, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 20, - /* insert_flag = */ FALSE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* num_pins = */ 1, - /* pin_type[MAX_PINS] = */ {MONSTER_ENTRY_TYPE, - -1, -1, -1, -1 -1, -1, -1}, - /* pin_idx[MAX_PINS] = */ {10, -1, -1, -1 -1, -1, -1, -1}, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 6, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 30, - /* insert_flag = */ TRUE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* num_pins = */ 2, - /* pin_type[MAX_PINS] = */ {MONSTER_ENTRY_TYPE, - MONSTER_ENTRY_TYPE, - -1, -1, -1, -1, -1, -1}, - /* pin_idx[MAX_PINS] = */ {10, 20, -1, -1, -1, -1, -1, -1}, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 7, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 40, - /* insert_flag = */ TRUE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* num_pins = */ 3, - /* pin_type[MAX_PINS] = */ {MONSTER_ENTRY_TYPE, - MONSTER_ENTRY_TYPE, - MONSTER_ENTRY_TYPE, - -1, -1, -1, -1, -1}, - /* pin_idx[MAX_PINS] = */ {10, 20, 30, -1, -1, -1, -1, -1}, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ TRUE - } - }; - - check_flush_cache__pe_multi_entry_test(file_ptr, test_num, - flush_flags, spec_size, spec); - } - - if ( pass2 ) - { - int test_num = 3; - unsigned int flush_flags = H5C2__FLUSH_INVALIDATE_FLAG | - H5C2__FLUSH_CLEAR_ONLY_FLAG; - int spec_size = 8; - struct pe_flush_cache_test_spec spec[8] = - { - { - /* entry_num = */ 0, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 100, - /* insert_flag = */ FALSE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* num_pins = */ 0, - /* pin_type[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, - /* pin_idx[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 1, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 75, - /* insert_flag = */ FALSE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* num_pins = */ 1, - /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, - -1, -1, -1, -1, -1, -1, -1}, - /* pin_idx[MAX_PINS] = */ {100, -1, -1, -1, -1, -1, -1, -1}, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ TRUE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 2, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 25, - /* insert_flag = */ TRUE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* num_pins = */ 1, - /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, - -1, -1, -1, -1, -1, -1, -1}, - /* pin_idx[MAX_PINS] = */ {100, -1, -1, -1, -1, -1, -1, -1}, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ TRUE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 3, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 50, - /* insert_flag = */ TRUE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* num_pins = */ 1, - /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, - -1, -1, -1, -1, -1, -1, -1}, - /* pin_idx[MAX_PINS] = */ {100, -1, -1, -1, -1, -1, -1, -1}, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ TRUE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 4, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 10, - /* insert_flag = */ FALSE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* num_pins = */ 0, - /* pin_type[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, - /* pin_idx[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 5, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 20, - /* insert_flag = */ FALSE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* num_pins = */ 0, - /* pin_type[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, - /* pin_idx[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ TRUE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 6, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 30, - /* insert_flag = */ TRUE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* num_pins = */ 0, - /* pin_type[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, - /* pin_idx[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ TRUE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 7, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 40, - /* insert_flag = */ TRUE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* num_pins = */ 0, - /* pin_type[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, - /* pin_idx[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ TRUE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ TRUE - } - }; - - check_flush_cache__pe_multi_entry_test(file_ptr, test_num, - flush_flags, spec_size, spec); - } - - - if ( pass2 ) - { - int test_num = 4; - unsigned int flush_flags = H5C2__FLUSH_INVALIDATE_FLAG | - H5C2__FLUSH_MARKED_ENTRIES_FLAG; - int spec_size = 8; - struct pe_flush_cache_test_spec spec[8] = - { - { - /* entry_num = */ 0, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 100, - /* insert_flag = */ FALSE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* num_pins = */ 0, - /* pin_type[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, - /* pin_idx[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 1, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 75, - /* insert_flag = */ FALSE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* num_pins = */ 1, - /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, - -1, -1, -1, -1, -1, -1, -1}, - /* pin_idx[MAX_PINS] = */ {100, -1, -1, -1, -1, -1, -1, -1}, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 2, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 25, - /* insert_flag = */ TRUE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* num_pins = */ 1, - /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, - -1, -1, -1, -1, -1, -1, -1}, - /* pin_idx[MAX_PINS] = */ {100, -1, -1, -1, -1, -1, -1, -1}, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 3, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 50, - /* insert_flag = */ TRUE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* num_pins = */ 1, - /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, - -1, -1, -1, -1, -1, -1, -1}, - /* pin_idx[MAX_PINS] = */ {100, -1, -1, -1, -1, -1, -1, -1}, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 4, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 10, - /* insert_flag = */ FALSE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* num_pins = */ 0, - /* pin_type[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, - /* pin_idx[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 5, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 20, - /* insert_flag = */ FALSE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* num_pins = */ 4, - /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, - PICO_ENTRY_TYPE, - PICO_ENTRY_TYPE, - PICO_ENTRY_TYPE, - -1, -1, -1, -1}, - /* pin_idx[MAX_PINS] = */ {100, 75, 25, 50, -1, -1, -1, -1}, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 6, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 30, - /* insert_flag = */ TRUE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* num_pins = */ 4, - /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, - PICO_ENTRY_TYPE, - PICO_ENTRY_TYPE, - PICO_ENTRY_TYPE, - -1, -1, -1, -1}, - /* pin_idx[MAX_PINS] = */ {100, 75, 25, 50, -1, -1, -1, -1}, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 7, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 40, - /* insert_flag = */ TRUE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* num_pins = */ 0, - /* pin_type[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, - /* pin_idx[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ TRUE, - /* expected_destroyed = */ TRUE - } - }; - - check_flush_cache__pe_multi_entry_test(file_ptr, test_num, - flush_flags, spec_size, spec); - } - - - if ( pass2 ) - { - int test_num = 5; - unsigned int flush_flags = H5C2__FLUSH_INVALIDATE_FLAG | - H5C2__FLUSH_CLEAR_ONLY_FLAG | - H5C2__FLUSH_MARKED_ENTRIES_FLAG; - int spec_size = 8; - struct pe_flush_cache_test_spec spec[8] = - { - { - /* entry_num = */ 0, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 100, - /* insert_flag = */ FALSE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* num_pins = */ 0, - /* pin_type[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, - /* pin_idx[MAX_PINS] = */ {-1, -1, -1, -1, -1, -1, -1, -1}, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 1, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 75, - /* insert_flag = */ FALSE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* num_pins = */ 1, - /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, - -1, -1, -1, -1, -1, -1, -1}, - /* pin_idx[MAX_PINS] = */ {100, -1, -1, -1, -1, -1, -1, -1}, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ TRUE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 2, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 25, - /* insert_flag = */ TRUE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* num_pins = */ 1, - /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, - -1, -1, -1, -1, -1, -1, -1}, - /* pin_idx[MAX_PINS] = */ {100, -1, -1, -1, -1, -1, -1, -1}, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ TRUE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 3, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 50, - /* insert_flag = */ TRUE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* num_pins = */ 1, - /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, - -1, -1, -1, -1, -1, -1, -1}, - /* pin_idx[MAX_PINS] = */ {100, -1, -1, -1, -1, -1, -1, -1}, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ TRUE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 4, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 10, - /* insert_flag = */ FALSE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* num_pins = */ 1, - /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, - -1, -1, -1, -1, -1, -1, -1}, - /* pin_idx[MAX_PINS] = */ {100, -1, -1, -1, -1, -1, -1, -1}, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 5, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 20, - /* insert_flag = */ FALSE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* num_pins = */ 1, - /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, - -1, -1, -1, -1, -1, -1, -1}, - /* pin_idx[MAX_PINS] = */ {100, -1, -1, -1, -1, -1, -1, -1}, - /* expected_deserialized = */ TRUE, - /* expected_cleared = */ TRUE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 6, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 30, - /* insert_flag = */ TRUE, - /* dirty_flag = */ FALSE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* num_pins = */ 1, - /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, - -1, -1, -1, -1, -1, -1, -1}, - /* pin_idx[MAX_PINS] = */ {100, -1, -1, -1, -1, -1, -1, -1}, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ TRUE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 7, - /* entry_type = */ MONSTER_ENTRY_TYPE, - /* entry_index = */ 40, - /* insert_flag = */ TRUE, - /* dirty_flag = */ TRUE, - /* flags = */ H5C2__SET_FLUSH_MARKER_FLAG, - /* num_pins = */ 1, - /* pin_type[MAX_PINS] = */ {PICO_ENTRY_TYPE, - -1, -1, -1, -1, -1, -1, -1}, - /* pin_idx[MAX_PINS] = */ {100, -1, -1, -1, -1, -1, -1, -1}, - /* expected_deserialized = */ FALSE, - /* expected_cleared = */ TRUE, - /* expected_serialized = */ FALSE, - /* expected_destroyed = */ TRUE - } - }; - - check_flush_cache__pe_multi_entry_test(file_ptr, test_num, - flush_flags, spec_size, spec); - } - - return; - -} /* check_flush_cache__multi_entry() */ - - -/*------------------------------------------------------------------------- - * Function: check_flush_cache__multi_entry_test() - * - * Purpose: Run a multi entry flush cache test. - * - * Return: void - * - * Programmer: John Mainzer - * 1/13/05 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -static void -check_flush_cache__multi_entry_test(H5F_t * file_ptr, - int test_num, - unsigned int flush_flags, - int spec_size, - struct flush_cache_test_spec spec[]) -{ - /* const char * fcn_name = "check_flush_cache__multi_entry_test"; */ - H5C2_t * cache_ptr = file_ptr->shared->cache2; - static char msg[128]; - herr_t result; - int i; - size_t total_entry_size = 0; - test_entry_t * base_addr; - test_entry_t * entry_ptr; - -#if 0 /* JRM */ - /* This gets used a lot, so lets leave it in. */ - - HDfprintf(stdout, "check_flush_cache__multi_entry_test: test %d\n", - test_num); -#endif /* JRM */ - - if ( cache_ptr == NULL ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "cache_ptr NULL on entry to single entry test #%d.", - test_num); - failure_mssg2 = msg; - } - else if ( ( cache_ptr->index_len != 0 ) || - ( cache_ptr->index_size != 0 ) ) { - - pass2 = FALSE; - - HDsnprintf(msg, (size_t)128, - "cache not empty at beginning of multi entry test #%d.", - test_num); - failure_mssg2 = msg; - } - else if ( ( spec_size < 1 ) || ( spec == NULL ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "missing/bad test spec on entry to multi entry test #%d.", - test_num); - failure_mssg2 = msg; - } - - i = 0; - while ( ( pass2 ) && ( i < spec_size ) ) - { - if ( ( spec[i].entry_num != i ) || - ( spec[i].entry_type < 0 ) || - ( spec[i].entry_type >= NUMBER_OF_ENTRY_TYPES ) || - ( spec[i].entry_index < 0 ) || - ( spec[i].entry_index > max_indices2[spec[i].entry_type] ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "bad data in spec[%d] on entry to multi entry test #%d.", - i, test_num); - failure_mssg2 = msg; - } - i++; - } - - i = 0; - while ( ( pass2 ) && ( i < spec_size ) ) - { - if ( spec[i].insert_flag ) { - - insert_entry2(file_ptr, spec[i].entry_type, spec[i].entry_index, - spec[i].dirty_flag, spec[i].flags); - - } else { - - protect_entry2(file_ptr, spec[i].entry_type, spec[i].entry_index); - - unprotect_entry2(file_ptr, spec[i].entry_type, spec[i].entry_index, - (int)(spec[i].dirty_flag), spec[i].flags); - } - - total_entry_size += entry_sizes2[spec[i].entry_type]; - - i++; - } - - if ( pass2 ) { - - result = H5C2_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, flush_flags); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "flush with flags 0x%x failed in multi entry test #%d.", - flush_flags, test_num); - failure_mssg2 = msg; - } - } - - i = 0; - while ( ( pass2 ) && ( i < spec_size ) ) - { - base_addr = entries2[spec[i].entry_type]; - entry_ptr = &(base_addr[spec[i].entry_index]); - -#ifndef NDEBUG - /* The clear_dirty_bits() callback is only called in debug mode -- - * thus we can only do our full test on the expected entry history - * when debug is enabled. - */ - if ( ( entry_ptr->deserialized != spec[i].expected_deserialized ) || - ( entry_ptr->cleared != spec[i].expected_cleared ) || - ( entry_ptr->serialized != spec[i].expected_serialized ) || - ( entry_ptr->destroyed != spec[i].expected_destroyed ) ) { -#else - /* When in procduction mode, the clear_dirty_bits() callback is - * not called, so entry_ptr->cleared should never be set. - */ - if ( ( entry_ptr->deserialized != spec[i].expected_deserialized ) || - ( entry_ptr->cleared ) || - ( entry_ptr->serialized != spec[i].expected_serialized ) || - ( entry_ptr->destroyed != spec[i].expected_destroyed ) ) { -#endif /* NDEBUG */ - -#if 0 /* This is useful debugging code. Lets keep it around. */ - - HDfprintf(stdout, - "deslzd = %d(%d), clrd = %d(%d), slzd = %d(%d), dest = %d(%d)\n", - (int)(entry_ptr->deserialized), - (int)(spec[i].expected_deserialized), - (int)(entry_ptr->cleared), - (int)(spec[i].expected_cleared), - (int)(entry_ptr->serialized), - (int)(spec[i].expected_serialized), - (int)(entry_ptr->destroyed), - (int)(spec[i].expected_destroyed)); - -#endif - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "Bad status on entry %d after flush in multi entry test #%d.", - i, test_num); - failure_mssg2 = msg; - } - i++; - } - - if ( pass2 ) { - - if ( ( ( (flush_flags & H5C2__FLUSH_INVALIDATE_FLAG) == 0 ) - && - ( ( cache_ptr->index_len != spec_size ) - || - ( cache_ptr->index_size != total_entry_size ) - ) - ) - || - ( ( (flush_flags & H5C2__FLUSH_INVALIDATE_FLAG) != 0 ) - && - ( ( cache_ptr->index_len != 0 ) - || - ( cache_ptr->index_size != 0 ) - ) - ) - ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "Unexpected cache len/size after flush in multi entry test #%d.", - test_num); - failure_mssg2 = msg; - } - } - - /* clean up the cache to prep for the next test */ - if ( pass2 ) { - - result = H5C2_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, - H5C2__FLUSH_INVALIDATE_FLAG); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "Flush failed on cleanup in multi entry test #%d.", - test_num); - failure_mssg2 = msg; - } - else if ( ( cache_ptr->index_len != 0 ) || - ( cache_ptr->index_size != 0 ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "Unexpected cache len/size after cleanup in multi entry test #%d.", - test_num); - failure_mssg2 = msg; - - } - } - - i = 0; - while ( ( pass2 ) && ( i < spec_size ) ) - { - base_addr = entries2[spec[i].entry_type]; - entry_ptr = &(base_addr[spec[i].entry_index]); - - entry_ptr->deserialized = FALSE; - entry_ptr->cleared = FALSE; - entry_ptr->serialized = FALSE; - entry_ptr->destroyed = FALSE; - - i++; - } - - return; - -} /* check_flush_cache__multi_entry_test() */ - - -/*------------------------------------------------------------------------- - * Function: check_flush_cache__pe_multi_entry_test() - * - * Purpose: Run a multi entry flush cache test. - * - * Return: void - * - * Programmer: John Mainzer - * 4/5/06 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -static void -check_flush_cache__pe_multi_entry_test(H5F_t * file_ptr, - int test_num, - unsigned int flush_flags, - int spec_size, - struct pe_flush_cache_test_spec spec[]) -{ - /* const char * fcn_name = "check_flush_cache__pe_multi_entry_test"; */ - H5C2_t * cache_ptr = file_ptr->shared->cache2; - static char msg[128]; - herr_t result; - int i; - int j; - size_t total_entry_size = 0; - test_entry_t * base_addr; - test_entry_t * entry_ptr; - -#if 0 /* JRM */ - /* This is useful debugging code. Leave it in for now. */ - - HDfprintf(stdout, "check_flush_cache__pe_multi_entry_test: test %d\n", - test_num); -#endif /* JRM */ - - if ( cache_ptr == NULL ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "cache_ptr NULL on entry to pe multi entry test #%d.", - test_num); - failure_mssg2 = msg; - } - else if ( ( cache_ptr->index_len != 0 ) || - ( cache_ptr->index_size != 0 ) ) { - - pass2 = FALSE; - - HDsnprintf(msg, (size_t)128, - "cache not empty at beginning of pe multi entry test #%d.", - test_num); - failure_mssg2 = msg; - } - else if ( ( spec_size < 1 ) || ( spec == NULL ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "missing/bad test spec on entry to pe multi entry test #%d.", - test_num); - failure_mssg2 = msg; - } - - i = 0; - while ( ( pass2 ) && ( i < spec_size ) ) - { - if ( ( spec[i].entry_num != i ) || - ( spec[i].entry_type < 0 ) || - ( spec[i].entry_type >= NUMBER_OF_ENTRY_TYPES ) || - ( spec[i].entry_index < 0 ) || - ( spec[i].entry_index > max_indices2[spec[i].entry_type] ) || - ( spec[i].num_pins < 0 ) || - ( spec[i].num_pins > MAX_PINS ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "bad data in spec[%d] on entry to pe multi entry test #%d.", - i, test_num); - failure_mssg2 = msg; - } - i++; - } - - i = 0; - while ( ( pass2 ) && ( i < spec_size ) ) - { - if ( spec[i].insert_flag ) { - - insert_entry2(file_ptr, spec[i].entry_type, spec[i].entry_index, - spec[i].dirty_flag, spec[i].flags); - - } else { - - protect_entry2(file_ptr, spec[i].entry_type, spec[i].entry_index); - - unprotect_entry2(file_ptr, spec[i].entry_type, spec[i].entry_index, - (int)(spec[i].dirty_flag), spec[i].flags); - } - - total_entry_size += entry_sizes2[spec[i].entry_type]; - - for ( j = 0; j < spec[i].num_pins; j++ ) - { - create_pinned_entry_dependency2(file_ptr, - spec[i].entry_type, - spec[i].entry_index, - spec[i].pin_type[j], - spec[i].pin_idx[j]); - } - - i++; - } - - if ( pass2 ) { - - result = H5C2_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, flush_flags); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "flush with flags 0x%x failed in pe multi entry test #%d.", - flush_flags, test_num); - failure_mssg2 = msg; - } - } - - i = 0; - while ( ( pass2 ) && ( i < spec_size ) ) - { - base_addr = entries2[spec[i].entry_type]; - entry_ptr = &(base_addr[spec[i].entry_index]); - -#ifndef NDEBUG - /* The clear_dirty_bits() callback is only called in debug mode -- - * thus we can only do our full test on the expected entry history - * when debug is enabled. - */ - if ( ( entry_ptr->deserialized != spec[i].expected_deserialized ) || - ( entry_ptr->cleared != spec[i].expected_cleared ) || - ( entry_ptr->serialized != spec[i].expected_serialized ) || - ( entry_ptr->destroyed != spec[i].expected_destroyed ) ) { -#else - /* When in procduction mode, the clear_dirty_bits() callback is - * not called, so entry_ptr->cleared should never be set. - */ - if ( ( entry_ptr->deserialized != spec[i].expected_deserialized ) || - ( entry_ptr->cleared ) || - ( entry_ptr->serialized != spec[i].expected_serialized ) || - ( entry_ptr->destroyed != spec[i].expected_destroyed ) ) { -#endif /* NDEBUG */ - -#if 0 /* This is useful debugging code. Lets keep it around. */ - - HDfprintf(stdout, - "desrlzd = %d(%d), clrd = %d(%d), srlzd = %d(%d), dest = %d(%d)\n", - (int)(entry_ptr->deserialized), - (int)(spec[i].expected_deserialized), - (int)(entry_ptr->cleared), - (int)(spec[i].expected_cleared), - (int)(entry_ptr->serialized), - (int)(spec[i].expected_serialized), - (int)(entry_ptr->destroyed), - (int)(spec[i].expected_destroyed)); - -#endif - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "Bad status on entry %d after flush in pe multi entry test #%d.", - i, test_num); - failure_mssg2 = msg; - } - i++; - } - - if ( pass2 ) { - - if ( ( ( (flush_flags & H5C2__FLUSH_INVALIDATE_FLAG) == 0 ) - && - ( ( cache_ptr->index_len != spec_size ) - || - ( cache_ptr->index_size != total_entry_size ) - ) - ) - || - ( ( (flush_flags & H5C2__FLUSH_INVALIDATE_FLAG) != 0 ) - && - ( ( cache_ptr->index_len != 0 ) - || - ( cache_ptr->index_size != 0 ) - ) - ) - ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "Unexpected cache len/size after flush in pe multi entry test #%d.", - test_num); - failure_mssg2 = msg; - } - } - - /* clean up the cache to prep for the next test */ - if ( pass2 ) { - - result = H5C2_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, - H5C2__FLUSH_INVALIDATE_FLAG); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "Flush failed on cleanup in pe multi entry test #%d.", - test_num); - failure_mssg2 = msg; - } - else if ( ( cache_ptr->index_len != 0 ) || - ( cache_ptr->index_size != 0 ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "Unexpected cache len/size after cleanup in pe multi entry test #%d.", - test_num); - failure_mssg2 = msg; - - } - } - - i = 0; - while ( ( pass2 ) && ( i < spec_size ) ) - { - base_addr = entries2[spec[i].entry_type]; - entry_ptr = &(base_addr[spec[i].entry_index]); - - entry_ptr->deserialized = FALSE; - entry_ptr->cleared = FALSE; - entry_ptr->serialized = FALSE; - entry_ptr->destroyed = FALSE; - - i++; - } - - return; - -} /* check_flush_cache__pe_multi_entry_test() */ - - -/*------------------------------------------------------------------------- - * Function: check_flush_cache__flush_ops() - * - * Purpose: Run the flush ops cache tests. - * - * These are tests that test the cache's ability to handle - * the case in which the flush callback dirties, resizes, - * and/or renames entries. - * - * Do nothing if pass2 is FALSE on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 9/3/06 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -static void -check_flush_cache__flush_ops(H5F_t * file_ptr) -{ - /* const char * fcn_name = "check_flush_cache__flush_ops"; */ - H5C2_t * cache_ptr = file_ptr->shared->cache2; - - if ( cache_ptr == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "cache_ptr NULL on entry to flush ops test."; - } - else if ( ( cache_ptr->index_len != 0 ) || - ( cache_ptr->index_size != 0 ) ) { - - pass2 = FALSE; - failure_mssg2 = "cache not empty at beginning of flush ops test."; - } - - if ( pass2 ) /* test #1 */ - { - /* start with a very simple test, in which there are two entries - * resident in cache, and the second entry dirties the first in - * the flush callback. No size changes, and no flush flags. - */ - int test_num = 1; - unsigned int flush_flags = H5C2__NO_FLAGS_SET; - int spec_size = 2; - int init_expected_index_len = 2; - size_t init_expected_index_size = 2 * PICO_ENTRY_SIZE; - int expected_index_len = 2; - size_t expected_index_size = 2 * PICO_ENTRY_SIZE; - struct fo_flush_cache_test_spec spec[2] = - { - { - /* entry_num = */ 0, - /* entry_type = */ 0, - /* entry_index = */ 0, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 0, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 1, - /* entry_type = */ 0, - /* entry_index = */ 1, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__DIRTIED_FLAG, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 1, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__DIRTY, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - } - }; - int check_size = 0; - struct fo_flush_entry_check checks[1] = - { - { - /* entry_num = */ 0, - /* entry_type = */ 0, - /* entry_index = */ 0, - /* expected_size = */ (size_t)0, - /* in_cache = */ FALSE, - /* at_main_addr = */ FALSE, - /* is_dirty = */ FALSE, - /* is_protected = */ FALSE, - /* is_pinned = */ FALSE, - /* expected_loaded = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ FALSE, - /* expected_destroyed = */ FALSE - } - }; - - check_flush_cache__flush_op_test(file_ptr, - test_num, - flush_flags, - spec_size, - spec, - init_expected_index_len, - init_expected_index_size, - expected_index_len, - expected_index_size, - check_size, - checks); - } - - if ( pass2 ) /* test #2 */ - { - /* Same as test 1, only this time set the flush invalidate flag. - * Note that we must repeat all tests with the flush invalidate flag - * as this triggers a different set of code to execute the flush. - * - * Create two entries resident in cache, and have the second entry - * dirty the first in the flush callback. - */ - int test_num = 2; - unsigned int flush_flags = H5C2__FLUSH_INVALIDATE_FLAG; - int spec_size = 2; - int init_expected_index_len = 2; - size_t init_expected_index_size = 2 * PICO_ENTRY_SIZE; - int expected_index_len = 0; - size_t expected_index_size = 0; - struct fo_flush_cache_test_spec spec[2] = - { - { - /* entry_num = */ 0, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 0, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 0, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 1, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 1, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__DIRTIED_FLAG, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 1, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__DIRTY, PICO_ENTRY_TYPE,0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ TRUE - } - }; - int check_size = 0; - struct fo_flush_entry_check checks[1] = - { - { - /* entry_num = */ 0, - /* entry_type = */ 0, - /* entry_index = */ 0, - /* expected_size = */ (size_t)0, - /* in_cache = */ FALSE, - /* at_main_addr = */ FALSE, - /* is_dirty = */ FALSE, - /* is_protected = */ FALSE, - /* is_pinned = */ FALSE, - /* expected_loaded = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ FALSE, - /* expected_destroyed = */ FALSE - } - }; - - check_flush_cache__flush_op_test(file_ptr, - test_num, - flush_flags, - spec_size, - spec, - init_expected_index_len, - init_expected_index_size, - expected_index_len, - expected_index_size, - check_size, - checks); - } - - if ( pass2 ) /* test #3 */ - { - /* Single entry test verifying that the cache can handle the case in - * which the call back function resizes the entry for which it has - * been called. - */ - int test_num = 3; - unsigned int flush_flags = H5C2__NO_FLAGS_SET; - int spec_size = 1; - int init_expected_index_len = 1; - size_t init_expected_index_size = VARIABLE_ENTRY_SIZE / 4; - int expected_index_len = 1; - size_t expected_index_size = VARIABLE_ENTRY_SIZE / 2; - struct fo_flush_cache_test_spec spec[1] = - { - { - /* entry_num = */ 0, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 0, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__SIZE_CHANGED_FLAG, - /* new_size = */ VARIABLE_ENTRY_SIZE / 4, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 1, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 0, FALSE, VARIABLE_ENTRY_SIZE / 2 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - } - }; - int check_size = 0; - struct fo_flush_entry_check checks[1] = - { - { - /* entry_num = */ 0, - /* entry_type = */ 0, - /* entry_index = */ 0, - /* expected_size = */ (size_t)0, - /* in_cache = */ FALSE, - /* at_main_addr = */ FALSE, - /* is_dirty = */ FALSE, - /* is_protected = */ FALSE, - /* is_pinned = */ FALSE, - /* expected_loaded = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ FALSE, - /* expected_destroyed = */ FALSE - } - }; - - check_flush_cache__flush_op_test(file_ptr, - test_num, - flush_flags, - spec_size, - spec, - init_expected_index_len, - init_expected_index_size, - expected_index_len, - expected_index_size, - check_size, - checks); - } - - if ( pass2 ) /* test #4 */ - { - /* Repeat test #4 with the flush invalidate flag. - * - * Single entry test verifying that the cache can handle the case in - * which the call back function resizes the entry for which it has - * been called. - */ - int test_num = 4; - unsigned int flush_flags = H5C2__FLUSH_INVALIDATE_FLAG; - int spec_size = 1; - int init_expected_index_len = 1; - size_t init_expected_index_size = VARIABLE_ENTRY_SIZE / 4; - int expected_index_len = 0; - size_t expected_index_size = 0; - struct fo_flush_cache_test_spec spec[1] = - { - { - /* entry_num = */ 0, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 0, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__SIZE_CHANGED_FLAG, - /* new_size = */ VARIABLE_ENTRY_SIZE / 4, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 1, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 0, FALSE, VARIABLE_ENTRY_SIZE / 2 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ TRUE - } - }; - int check_size = 0; - struct fo_flush_entry_check checks[1] = - { - { - /* entry_num = */ 0, - /* entry_type = */ 0, - /* entry_index = */ 0, - /* expected_size = */ (size_t)0, - /* in_cache = */ FALSE, - /* at_main_addr = */ FALSE, - /* is_dirty = */ FALSE, - /* is_protected = */ FALSE, - /* is_pinned = */ FALSE, - /* expected_loaded = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ FALSE, - /* expected_destroyed = */ FALSE - } - }; - - check_flush_cache__flush_op_test(file_ptr, - test_num, - flush_flags, - spec_size, - spec, - init_expected_index_len, - init_expected_index_size, - expected_index_len, - expected_index_size, - check_size, - checks); - } - - if ( pass2 ) /* test #5 & #6 */ - { - /* Single entry test verifying that the cache can handle the case in - * which the call back function first resizes and then renames the - * entry for which it has been called. - * - * Run this entry twice, as the first run moves the entry to its - * alternate address, and the second moves it back. - * - * 10/8/07 -- JRM - * Added a resize operation to this test to satisfy the new - * requiremnt that any resize of an entry on flush will always - * be accompanied by a resize. Note that as a result, this - * test becomes redundant with later tests. - */ - int test_num = 5; /* and 6 */ - unsigned int flush_flags = H5C2__NO_FLAGS_SET; - int spec_size = 1; - int init_expected_index_len = 1; - size_t init_expected_index_size = VARIABLE_ENTRY_SIZE; - int expected_index_len = 1; - size_t expected_index_size = VARIABLE_ENTRY_SIZE / 2; - struct fo_flush_cache_test_spec spec[1] = - { - { - /* entry_num = */ 0, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 0, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__DIRTIED_FLAG, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 2, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 0, FALSE, VARIABLE_ENTRY_SIZE / 2 }, - { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - } - }; - int check_size = 0; - struct fo_flush_entry_check checks[1] = - { - { - /* entry_num = */ 0, - /* entry_type = */ 0, - /* entry_index = */ 0, - /* expected_size = */ (size_t)0, - /* in_cache = */ FALSE, - /* at_main_addr = */ FALSE, - /* is_dirty = */ FALSE, - /* is_protected = */ FALSE, - /* is_pinned = */ FALSE, - /* expected_loaded = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ FALSE, - /* expected_destroyed = */ FALSE - } - }; - - check_flush_cache__flush_op_test(file_ptr, - test_num, - flush_flags, - spec_size, - spec, - init_expected_index_len, - init_expected_index_size, - expected_index_len, - expected_index_size, - check_size, - checks); - - /* this change forces the rename to move the target entry back to its - * main address. The first test moved it to its alternate address. - * - * Note that these two tests are not the same, as in the first test, - * the renamed entry is moved forward in the slist. In the second - * it is moved backwards. - * - * Since there is only one entry in the cache, this doesn't really - * matter in this case. But we will do similar tests later with - * other entries in the cache. - */ - if ( pass2 ) { - - spec[0].flush_ops[1].flag = TRUE; - test_num = 6; - - check_flush_cache__flush_op_test(file_ptr, - test_num, - flush_flags, - spec_size, - spec, - init_expected_index_len, - init_expected_index_size, - expected_index_len, - expected_index_size, - check_size, - checks); - } - } - - if ( pass2 ) /* test #7 & #8 */ - { - /* Run tests 5 & 6 again, using the flush invalidate flag on the - * second test. - * - * Single entry test verifying that the cache can handle the case in - * which the call back function renames the entry for which it has - * been called. - * - * Run this entry twice, as the first run moves the entry to its - * alternate address, and the second moves it back. - * - * 10/8/07 -- JRM - * Added a resize operation to this test to satisfy the new - * requiremnt that any resize of an entry on flush will always - * be accompanied by a resize. Note that as a result, this - * test becomes redundant with later tests. - */ - int test_num = 7; /* and 8 */ - unsigned int flush_flags = H5C2__NO_FLAGS_SET; - int spec_size = 1; - int init_expected_index_len = 1; - size_t init_expected_index_size = VARIABLE_ENTRY_SIZE; - int expected_index_len = 1; - size_t expected_index_size = VARIABLE_ENTRY_SIZE / 2; - struct fo_flush_cache_test_spec spec[1] = - { - { - /* entry_num = */ 0, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 0, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__DIRTIED_FLAG, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 2, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 0, FALSE, VARIABLE_ENTRY_SIZE / 2 }, - { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - } - }; - int check_size = 0; - struct fo_flush_entry_check checks[1] = - { - { - /* entry_num = */ 0, - /* entry_type = */ 0, - /* entry_index = */ 0, - /* expected_size = */ (size_t)0, - /* in_cache = */ FALSE, - /* at_main_addr = */ FALSE, - /* is_dirty = */ FALSE, - /* is_protected = */ FALSE, - /* is_pinned = */ FALSE, - /* expected_loaded = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ FALSE, - /* expected_destroyed = */ FALSE - } - }; - - check_flush_cache__flush_op_test(file_ptr, - test_num, - flush_flags, - spec_size, - spec, - init_expected_index_len, - init_expected_index_size, - expected_index_len, - expected_index_size, - check_size, - checks); - - /* this change forces the rename to move the target entry back to its - * main address. The first test moved it to its alternate address. - * - * Note that these two tests are not the same, as in the first test, - * the renamed entry is moved forward in the slist. In the second - * it is moved backwards. - * - * Since there is only one entry in the cache, this doesn't really - * matter in this case. But we will do similar tests later with - * other entries in the cache. - */ - - if ( pass2 ) { - - test_num = 8; - flush_flags = H5C2__FLUSH_INVALIDATE_FLAG; - expected_index_len = 0; - expected_index_size = 0; - spec[0].flush_ops[1].flag = TRUE; - spec[0].expected_destroyed = TRUE; - - check_flush_cache__flush_op_test(file_ptr, - test_num, - flush_flags, - spec_size, - spec, - init_expected_index_len, - init_expected_index_size, - expected_index_len, - expected_index_size, - check_size, - checks); - } - } - - if ( pass2 ) /* test #9 & #10 */ - { - /* Single entry test verifying that the cache can handle the case in - * which the call back function both resizes and renames the entry - * for which it has been called. - * - * Again, we run this entry twice, as the first run moves the entry - * to its alternate address, and the second moves it back. - */ - int test_num = 9; /* and 10 */ - unsigned int flush_flags = H5C2__NO_FLAGS_SET; - int spec_size = 1; - int init_expected_index_len = 1; - size_t init_expected_index_size = VARIABLE_ENTRY_SIZE / 2; - int expected_index_len = 1; - size_t expected_index_size = VARIABLE_ENTRY_SIZE / 4; - struct fo_flush_cache_test_spec spec[1] = - { - { - /* entry_num = */ 0, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 0, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__SIZE_CHANGED_FLAG, - /* new_size = */ VARIABLE_ENTRY_SIZE / 2, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 2, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 0, FALSE, VARIABLE_ENTRY_SIZE / 4 }, - { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - } - }; - int check_size = 0; - struct fo_flush_entry_check checks[1] = - { - { - /* entry_num = */ 0, - /* entry_type = */ 0, - /* entry_index = */ 0, - /* expected_size = */ (size_t)0, - /* in_cache = */ FALSE, - /* at_main_addr = */ FALSE, - /* is_dirty = */ FALSE, - /* is_protected = */ FALSE, - /* is_pinned = */ FALSE, - /* expected_loaded = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ FALSE, - /* expected_destroyed = */ FALSE - } - }; - - check_flush_cache__flush_op_test(file_ptr, - test_num, - flush_flags, - spec_size, - spec, - init_expected_index_len, - init_expected_index_size, - expected_index_len, - expected_index_size, - check_size, - checks); - - /* this change forces the rename to move the target entry back to its - * main address. The first test moved it to its alternate address. - * - * Note that these two tests are not the same, as in the first test, - * the renamed entry is moved forward in the slist. In the second - * it is moved backwards. - * - * Since there is only one entry in the cache, this doesn't really - * matter in this case. But we will do similar tests later with - * other entries in the cache. - */ - if ( pass2 ) { - - spec[0].flush_ops[1].flag = TRUE; - test_num = 10; - - check_flush_cache__flush_op_test(file_ptr, - test_num, - flush_flags, - spec_size, - spec, - init_expected_index_len, - init_expected_index_size, - expected_index_len, - expected_index_size, - check_size, - checks); - } - } - - if ( pass2 ) /* test #11 & #12 */ - { - /* Repeat the previous test with the flush invalidate flag on the - * second test. - * - * Single entry test verifying that the cache can handle the case in - * which the call back function both resizes and renames the entry - * for which it has been called. - * - * Again, we run this entry twice, as the first run moves the entry to its - * alternate address, and the second moves it back. - */ - int test_num = 11; /* and 12 */ - unsigned int flush_flags = H5C2__NO_FLAGS_SET; - int spec_size = 1; - int init_expected_index_len = 1; - size_t init_expected_index_size = VARIABLE_ENTRY_SIZE / 2; - int expected_index_len = 1; - size_t expected_index_size = VARIABLE_ENTRY_SIZE / 4; - struct fo_flush_cache_test_spec spec[1] = - { - { - /* entry_num = */ 0, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 0, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__SIZE_CHANGED_FLAG, - /* new_size = */ VARIABLE_ENTRY_SIZE / 2, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 2, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 0, FALSE, VARIABLE_ENTRY_SIZE / 4 }, - { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - } - }; - int check_size = 0; - struct fo_flush_entry_check checks[1] = - { - { - /* entry_num = */ 0, - /* entry_type = */ 0, - /* entry_index = */ 0, - /* expected_size = */ (size_t)0, - /* in_cache = */ FALSE, - /* at_main_addr = */ FALSE, - /* is_dirty = */ FALSE, - /* is_protected = */ FALSE, - /* is_pinned = */ FALSE, - /* expected_loaded = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ FALSE, - /* expected_destroyed = */ FALSE - } - }; - - check_flush_cache__flush_op_test(file_ptr, - test_num, - flush_flags, - spec_size, - spec, - init_expected_index_len, - init_expected_index_size, - expected_index_len, - expected_index_size, - check_size, - checks); - - /* this change forces the rename to move the target entry back to its - * main address. The first test moved it to its alternate address. - * - * Note that these two tests are not the same, as in the first test, - * the renamed entry is moved forward in the slist. In the second - * it is moved backwards. - * - * Since there is only one entry in the cache, this doesn't really - * matter in this case. But we will do similar tests later with - * other entries in the cache. - */ - if ( pass2 ) { - - test_num = 12; - flush_flags = H5C2__FLUSH_INVALIDATE_FLAG; - expected_index_len = 0; - expected_index_size = 0; - spec[0].flush_ops[1].flag = TRUE; - spec[0].expected_destroyed = TRUE; - - - check_flush_cache__flush_op_test(file_ptr, - test_num, - flush_flags, - spec_size, - spec, - init_expected_index_len, - init_expected_index_size, - expected_index_len, - expected_index_size, - check_size, - checks); - } - } - - if ( pass2 ) /* test #13 */ - { - /* Test the ability of the cache to handle the case in which - * the flush function of an entry that is resident in cache - * dirties two entries that are not in cache. No size - * changes. - * - * At present, I am assured that this case will never occur, but - * lets make sure we can handle it regardless. - */ - int test_num = 13; - unsigned int flush_flags = H5C2__NO_FLAGS_SET; - int spec_size = 1; - int init_expected_index_len = 1; - size_t init_expected_index_size = 1 * PICO_ENTRY_SIZE; - int expected_index_len = 3; - size_t expected_index_size = 3 * PICO_ENTRY_SIZE; - struct fo_flush_cache_test_spec spec[1] = - { - { - /* entry_num = */ 0, - /* entry_type = */ 0, - /* entry_index = */ 1, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__DIRTIED_FLAG, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 2, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__DIRTY, 0, 0, FALSE, 0 }, - { FLUSH_OP__DIRTY, 0, 2, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - } - }; - int check_size = 2; - struct fo_flush_entry_check checks[2] = - { - { - /* entry_num = */ 0, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 0, - /* expected_size = */ PICO_ENTRY_SIZE, - /* in_cache = */ TRUE, - /* at_main_addr = */ TRUE, - /* is_dirty = */ FALSE, - /* is_protected = */ FALSE, - /* is_pinned = */ FALSE, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 1, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 2, - /* expected_size = */ PICO_ENTRY_SIZE, - /* in_cache = */ TRUE, - /* at_main_addr = */ TRUE, - /* is_dirty = */ FALSE, - /* is_protected = */ FALSE, - /* is_pinned = */ FALSE, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - } - }; - - check_flush_cache__flush_op_test(file_ptr, - test_num, - flush_flags, - spec_size, - spec, - init_expected_index_len, - init_expected_index_size, - expected_index_len, - expected_index_size, - check_size, - checks); - } - - if ( pass2 ) /* test #14 */ - { - /* Repeat previous test with the flush invalidate flag. - * - * Test the ability of the cache to handle the case in which - * the flush function of an entry that is resident in cache - * dirties two entries that are not in cache. No size - * changes. - * - * At present, I am assured that this case will never occur, but - * lets make sure we can handle it regardless. - */ - int test_num = 14; - unsigned int flush_flags = H5C2__FLUSH_INVALIDATE_FLAG; - int spec_size = 1; - int init_expected_index_len = 1; - size_t init_expected_index_size = 1 * PICO_ENTRY_SIZE; - int expected_index_len = 0; - size_t expected_index_size = (size_t)0; - struct fo_flush_cache_test_spec spec[1] = - { - { - /* entry_num = */ 0, - /* entry_type = */ 0, - /* entry_index = */ 1, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__DIRTIED_FLAG, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 2, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__DIRTY, 0, 0, FALSE, 0 }, - { FLUSH_OP__DIRTY, 0, 2, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ TRUE - } - }; - int check_size = 2; - struct fo_flush_entry_check checks[2] = - { - { - /* entry_num = */ 0, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 0, - /* expected_size = */ PICO_ENTRY_SIZE, - /* in_cache = */ FALSE, - /* at_main_addr = */ TRUE, - /* is_dirty = */ FALSE, - /* is_protected = */ FALSE, - /* is_pinned = */ FALSE, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 1, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 2, - /* expected_size = */ PICO_ENTRY_SIZE, - /* in_cache = */ FALSE, - /* at_main_addr = */ TRUE, - /* is_dirty = */ FALSE, - /* is_protected = */ FALSE, - /* is_pinned = */ FALSE, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ TRUE - } - }; - - check_flush_cache__flush_op_test(file_ptr, - test_num, - flush_flags, - spec_size, - spec, - init_expected_index_len, - init_expected_index_size, - expected_index_len, - expected_index_size, - check_size, - checks); - } - - if ( pass2 ) /* test #15 */ - { - /* Test the ability of the cache to handle the case in which - * the flush function of an entry that is resident in cache - * resizes and dirties two entries that are not in cache. - * - * At present, I am assured that this case will never occur, but - * lets make sure we can handle it regardless. - */ - int test_num = 15; - unsigned int flush_flags = H5C2__NO_FLAGS_SET; - int spec_size = 1; - int init_expected_index_len = 1; - size_t init_expected_index_size = 1 * VARIABLE_ENTRY_SIZE; - int expected_index_len = 3; - size_t expected_index_size = VARIABLE_ENTRY_SIZE + - (VARIABLE_ENTRY_SIZE / 4) + - (VARIABLE_ENTRY_SIZE / 2); - struct fo_flush_cache_test_spec spec[1] = - { - { - /* entry_num = */ 0, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 1, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__DIRTIED_FLAG, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 4, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 0, FALSE, VARIABLE_ENTRY_SIZE / 4 }, - { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 0, FALSE, 0 }, - { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 2, FALSE, 0 }, - { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 2, FALSE, VARIABLE_ENTRY_SIZE / 2 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - } - }; - int check_size = 2; - struct fo_flush_entry_check checks[2] = - { - { - /* entry_num = */ 0, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 0, - /* expected_size = */ VARIABLE_ENTRY_SIZE / 4, - /* in_cache = */ TRUE, - /* at_main_addr = */ TRUE, - /* is_dirty = */ FALSE, - /* is_protected = */ FALSE, - /* is_pinned = */ FALSE, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 1, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 2, - /* expected_size = */ VARIABLE_ENTRY_SIZE / 2, - /* in_cache = */ TRUE, - /* at_main_addr = */ TRUE, - /* is_dirty = */ FALSE, - /* is_protected = */ FALSE, - /* is_pinned = */ FALSE, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - } - }; - - check_flush_cache__flush_op_test(file_ptr, - test_num, - flush_flags, - spec_size, - spec, - init_expected_index_len, - init_expected_index_size, - expected_index_len, - expected_index_size, - check_size, - checks); - } - - if ( pass2 ) /* test #16 */ - { - /* Repeat previous test with the flush invalidate flag. - * - * Test the ability of the cache to handle the case in which - * the flush function of an entry that is resident in cache - * resizes and dirties two entries that are not in cache. - * - * At present, I am assured that this case will never occur, but - * lets make sure we can handle it regardless. - */ - int test_num = 16; - unsigned int flush_flags = H5C2__FLUSH_INVALIDATE_FLAG; - int spec_size = 1; - int init_expected_index_len = 1; - size_t init_expected_index_size = 1 * VARIABLE_ENTRY_SIZE; - int expected_index_len = 0; - size_t expected_index_size = (size_t)0; - struct fo_flush_cache_test_spec spec[1] = - { - { - /* entry_num = */ 0, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 1, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__DIRTIED_FLAG, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 4, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 0, FALSE, VARIABLE_ENTRY_SIZE / 4 }, - { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 0, FALSE, 0 }, - { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 2, FALSE, 0 }, - { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 2, FALSE, VARIABLE_ENTRY_SIZE / 2 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ TRUE - } - }; - int check_size = 2; - struct fo_flush_entry_check checks[2] = - { - { - /* entry_num = */ 0, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 0, - /* expected_size = */ VARIABLE_ENTRY_SIZE / 4, - /* in_cache = */ FALSE, - /* at_main_addr = */ TRUE, - /* is_dirty = */ FALSE, - /* is_protected = */ FALSE, - /* is_pinned = */ FALSE, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 1, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 2, - /* expected_size = */ VARIABLE_ENTRY_SIZE / 2, - /* in_cache = */ FALSE, - /* at_main_addr = */ TRUE, - /* is_dirty = */ FALSE, - /* is_protected = */ FALSE, - /* is_pinned = */ FALSE, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ TRUE - } - }; - - check_flush_cache__flush_op_test(file_ptr, - test_num, - flush_flags, - spec_size, - spec, - init_expected_index_len, - init_expected_index_size, - expected_index_len, - expected_index_size, - check_size, - checks); - } - - if ( pass2 ) /* test #17 & #18 */ - { - /* Test the ability of the cache to handle the case in which - * the flush function of an entry that is resident in cache - * resizes, dirties, and renames two entries that are not in cache. - * - * At present, I am assured that this case will never occur, but - * lets make sure we can handle it regardless. - */ - int test_num = 17; /* and 18 */ - unsigned int flush_flags = H5C2__NO_FLAGS_SET; - int spec_size = 1; - int init_expected_index_len = 1; - size_t init_expected_index_size = 1 * VARIABLE_ENTRY_SIZE; - int expected_index_len = 3; - size_t expected_index_size = VARIABLE_ENTRY_SIZE + - (VARIABLE_ENTRY_SIZE / 4) + - (VARIABLE_ENTRY_SIZE / 2); - struct fo_flush_cache_test_spec spec[1] = - { - { - /* entry_num = */ 0, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 1, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__DIRTIED_FLAG, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 6, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 0, FALSE, VARIABLE_ENTRY_SIZE / 4 }, - { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 0, FALSE, 0 }, - { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 0, FALSE, 0 }, - { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 2, FALSE, 0 }, - { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 2, FALSE, VARIABLE_ENTRY_SIZE / 2 }, - { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 2, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - } - }; - int check_size = 2; - struct fo_flush_entry_check checks[2] = - { - { - /* entry_num = */ 0, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 0, - /* expected_size = */ VARIABLE_ENTRY_SIZE / 4, - /* in_cache = */ TRUE, - /* at_main_addr = */ FALSE, - /* is_dirty = */ FALSE, - /* is_protected = */ FALSE, - /* is_pinned = */ FALSE, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 1, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 2, - /* expected_size = */ VARIABLE_ENTRY_SIZE / 2, - /* in_cache = */ TRUE, - /* at_main_addr = */ FALSE, - /* is_dirty = */ FALSE, - /* is_protected = */ FALSE, - /* is_pinned = */ FALSE, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - } - }; - - check_flush_cache__flush_op_test(file_ptr, - test_num, - flush_flags, - spec_size, - spec, - init_expected_index_len, - init_expected_index_size, - expected_index_len, - expected_index_size, - check_size, - checks); - - /* this change forces the renames to move the target entries back to - * their main address. The first test moved them to their alternate - * address. - * - * Note that these two tests are not the same, as in the first test, - * the renamed entries are moved forward in the slist. In the second - * they are moved backwards. - */ - if ( pass2 ) { - - test_num = 18; - spec[0].flush_ops[2].flag = TRUE; - spec[0].flush_ops[5].flag = TRUE; - checks[0].at_main_addr = TRUE; - checks[1].at_main_addr = TRUE; - - check_flush_cache__flush_op_test(file_ptr, - test_num, - flush_flags, - spec_size, - spec, - init_expected_index_len, - init_expected_index_size, - expected_index_len, - expected_index_size, - check_size, - checks); - } - } - - if ( pass2 ) /* test #19 & #20 */ - { - /* Repeat the above test with the flush invalidate flag on the - * second test. - * - * Test the ability of the cache to handle the case in which - * the flush function of an entry that is resident in cache - * resizes, dirties, and renames two entries that are not in cache. - * - * At present, I am assured that this case will never occur, but - * lets make sure we can handle it regardless. - */ - int test_num = 19; /* and 20 */ - unsigned int flush_flags = H5C2__NO_FLAGS_SET; - int spec_size = 1; - int init_expected_index_len = 1; - size_t init_expected_index_size = 1 * VARIABLE_ENTRY_SIZE; - int expected_index_len = 3; - size_t expected_index_size = VARIABLE_ENTRY_SIZE + - (VARIABLE_ENTRY_SIZE / 4) + - (VARIABLE_ENTRY_SIZE / 2); - struct fo_flush_cache_test_spec spec[1] = - { - { - /* entry_num = */ 0, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 1, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__DIRTIED_FLAG, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 6, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 0, FALSE, VARIABLE_ENTRY_SIZE / 4 }, - { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 0, FALSE, 0 }, - { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 0, FALSE, 0 }, - { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 2, FALSE, 0 }, - { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 2, FALSE, VARIABLE_ENTRY_SIZE / 2 }, - { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 2, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - } - }; - int check_size = 2; - struct fo_flush_entry_check checks[2] = - { - { - /* entry_num = */ 0, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 0, - /* expected_size = */ VARIABLE_ENTRY_SIZE / 4, - /* in_cache = */ TRUE, - /* at_main_addr = */ FALSE, - /* is_dirty = */ FALSE, - /* is_protected = */ FALSE, - /* is_pinned = */ FALSE, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 1, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 2, - /* expected_size = */ VARIABLE_ENTRY_SIZE / 2, - /* in_cache = */ TRUE, - /* at_main_addr = */ FALSE, - /* is_dirty = */ FALSE, - /* is_protected = */ FALSE, - /* is_pinned = */ FALSE, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - } - }; - - check_flush_cache__flush_op_test(file_ptr, - test_num, - flush_flags, - spec_size, - spec, - init_expected_index_len, - init_expected_index_size, - expected_index_len, - expected_index_size, - check_size, - checks); - - /* this change forces the renames to move the target entries back to - * their main address. The first test moved them to their alternate - * address. - * - * Note that these two tests are not the same, as in the first test, - * the renamed entries are moved forward in the slist. In the second - * they are moved backwards. - */ - if ( pass2 ) { - - test_num = 20; - flush_flags = H5C2__FLUSH_INVALIDATE_FLAG; - expected_index_len = 0; - expected_index_size = (size_t)0; - spec[0].expected_destroyed = TRUE; - spec[0].flush_ops[2].flag = TRUE; - spec[0].flush_ops[5].flag = TRUE; - checks[0].at_main_addr = TRUE; - checks[0].in_cache = FALSE; - checks[0].expected_destroyed = TRUE; - checks[1].at_main_addr = TRUE; - checks[1].in_cache = FALSE; - checks[1].expected_destroyed = TRUE; - - check_flush_cache__flush_op_test(file_ptr, - test_num, - flush_flags, - spec_size, - spec, - init_expected_index_len, - init_expected_index_size, - expected_index_len, - expected_index_size, - check_size, - checks); - } - } - - if ( pass2 ) /* test #21 */ - { - /* Now mix things up a bit. - * - * Load several entries, two of which have flush functions that - * resize, dirty, and rename two entries that are not in the - * cache. Mark only one of these entries, and then flush the - * cache with the flush marked entries flag. - * - * This is the only test in which we test the - * H5C2__FLUSH_MARKED_ENTRIES_FLAG. The hope is that since - * we test the two features extensively by themselves, so - * it should be sufficient to verify that they play together - * as expected. - */ - int test_num = 21; - unsigned int flush_flags = H5C2__FLUSH_MARKED_ENTRIES_FLAG; - int spec_size = 4; - int init_expected_index_len = 4; - size_t init_expected_index_size = (2 * VARIABLE_ENTRY_SIZE) + (2 * PICO_ENTRY_SIZE); - int expected_index_len = 6; - size_t expected_index_size = (2 * VARIABLE_ENTRY_SIZE) + - (VARIABLE_ENTRY_SIZE / 4) + - (VARIABLE_ENTRY_SIZE / 2) + - (2 * PICO_ENTRY_SIZE); - struct fo_flush_cache_test_spec spec[4] = - { - { - /* entry_num = */ 0, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 1, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__DIRTIED_FLAG | H5C2__SET_FLUSH_MARKER_FLAG, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 6, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 0, FALSE, VARIABLE_ENTRY_SIZE / 4 }, - { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 0, FALSE, 0 }, - { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 0, FALSE, 0 }, - { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 2, FALSE, 0 }, - { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 2, FALSE, VARIABLE_ENTRY_SIZE / 2 }, - { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 2, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 1, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 11, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__DIRTIED_FLAG, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 6, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 10, FALSE, VARIABLE_ENTRY_SIZE / 4 }, - { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 10, FALSE, 0 }, - { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 10, FALSE, 0 }, - { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 12, FALSE, 0 }, - { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 12, FALSE, VARIABLE_ENTRY_SIZE / 2 }, - { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 12, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ FALSE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 2, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 0, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__DIRTIED_FLAG | H5C2__SET_FLUSH_MARKER_FLAG, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 0, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 3, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 1, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__DIRTIED_FLAG, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 0, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ FALSE, - /* expected_destroyed = */ FALSE - } - }; - int check_size = 4; - struct fo_flush_entry_check checks[4] = - { - { - /* entry_num = */ 0, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 0, - /* expected_size = */ VARIABLE_ENTRY_SIZE / 4, - /* in_cache = */ TRUE, - /* at_main_addr = */ FALSE, - /* is_dirty = */ TRUE, - /* is_protected = */ FALSE, - /* is_pinned = */ FALSE, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ FALSE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 1, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 2, - /* expected_size = */ VARIABLE_ENTRY_SIZE / 2, - /* in_cache = */ TRUE, - /* at_main_addr = */ FALSE, - /* is_dirty = */ TRUE, - /* is_protected = */ FALSE, - /* is_pinned = */ FALSE, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ FALSE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 2, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 10, - /* expected_size = */ VARIABLE_ENTRY_SIZE, - /* in_cache = */ FALSE, - /* at_main_addr = */ TRUE, - /* is_dirty = */ FALSE, - /* is_protected = */ FALSE, - /* is_pinned = */ FALSE, - /* expected_loaded = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ FALSE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 3, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 12, - /* expected_size = */ VARIABLE_ENTRY_SIZE, - /* in_cache = */ FALSE, - /* at_main_addr = */ TRUE, - /* is_dirty = */ FALSE, - /* is_protected = */ FALSE, - /* is_pinned = */ FALSE, - /* expected_loaded = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ FALSE, - /* expected_destroyed = */ FALSE - } - }; - - check_flush_cache__flush_op_test(file_ptr, - test_num, - flush_flags, - spec_size, - spec, - init_expected_index_len, - init_expected_index_size, - expected_index_len, - expected_index_size, - check_size, - checks); - reset_entries2(); - } - - if ( pass2 ) /* test #22 */ - { - /* Mix things up some more. - * - * Load lots of entries, some of which have flush functions that - * resize, dirty, and rename two entries that are not in the - * cache. - * - * Also load entries that have flush ops on entries that are in - * cache. - */ - int test_num = 22; - unsigned int flush_flags = H5C2__NO_FLAGS_SET; - int spec_size = 6; - int init_expected_index_len = 6; - size_t init_expected_index_size = (2 * VARIABLE_ENTRY_SIZE) + (4 * PICO_ENTRY_SIZE); - int expected_index_len = 10; - size_t expected_index_size = (2 * VARIABLE_ENTRY_SIZE) + - (2 * (VARIABLE_ENTRY_SIZE / 4)) + - (2 * (VARIABLE_ENTRY_SIZE / 2)) + - (4 * PICO_ENTRY_SIZE); - struct fo_flush_cache_test_spec spec[6] = - { - { - /* entry_num = */ 0, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 1, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__DIRTIED_FLAG, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 6, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 0, FALSE, VARIABLE_ENTRY_SIZE / 4 }, - { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 0, FALSE, 0 }, - { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 0, FALSE, 0 }, - { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 2, FALSE, 0 }, - { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 2, FALSE, VARIABLE_ENTRY_SIZE / 2 }, - { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 2, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 1, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 11, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__DIRTIED_FLAG, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 6, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 10, FALSE, VARIABLE_ENTRY_SIZE / 4 }, - { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 10, FALSE, 0 }, - { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 10, FALSE, 0 }, - { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 12, FALSE, 0 }, - { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 12, FALSE, VARIABLE_ENTRY_SIZE / 2 }, - { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 12, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 2, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 0, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 0, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 3, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 1, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 0, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ FALSE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 4, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 10, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__DIRTIED_FLAG, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 1, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__DIRTY, PICO_ENTRY_TYPE, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 5, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 20, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__DIRTIED_FLAG, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 1, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__DIRTY, PICO_ENTRY_TYPE, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - } - }; - int check_size = 4; - struct fo_flush_entry_check checks[4] = - { - { - /* entry_num = */ 0, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 0, - /* expected_size = */ VARIABLE_ENTRY_SIZE / 4, - /* in_cache = */ TRUE, - /* at_main_addr = */ FALSE, - /* is_dirty = */ FALSE, - /* is_protected = */ FALSE, - /* is_pinned = */ FALSE, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 1, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 2, - /* expected_size = */ VARIABLE_ENTRY_SIZE / 2, - /* in_cache = */ TRUE, - /* at_main_addr = */ FALSE, - /* is_dirty = */ FALSE, - /* is_protected = */ FALSE, - /* is_pinned = */ FALSE, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 2, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 10, - /* expected_size = */ VARIABLE_ENTRY_SIZE / 4, - /* in_cache = */ TRUE, - /* at_main_addr = */ FALSE, - /* is_dirty = */ FALSE, - /* is_protected = */ FALSE, - /* is_pinned = */ FALSE, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 3, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 12, - /* expected_size = */ VARIABLE_ENTRY_SIZE / 2, - /* in_cache = */ TRUE, - /* at_main_addr = */ FALSE, - /* is_dirty = */ FALSE, - /* is_protected = */ FALSE, - /* is_pinned = */ FALSE, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - } - }; - - check_flush_cache__flush_op_test(file_ptr, - test_num, - flush_flags, - spec_size, - spec, - init_expected_index_len, - init_expected_index_size, - expected_index_len, - expected_index_size, - check_size, - checks); - reset_entries2(); - } - - if ( pass2 ) /* test #23 */ - { - /* Repeat test #23 with the flush invalidate flag set. - * - * Mix things up some more. - * - * Load lots of entries, some of which have flush functions that - * resize, dirty, and rename two entries that are not in the - * cache. - * - * Also load entries that have flush ops on entries that are in - * cache. - */ - int test_num = 23; - unsigned int flush_flags = H5C2__FLUSH_INVALIDATE_FLAG; - int spec_size = 6; - int init_expected_index_len = 6; - size_t init_expected_index_size = (2 * VARIABLE_ENTRY_SIZE) + (4 * PICO_ENTRY_SIZE); - int expected_index_len = 0; - size_t expected_index_size = 0; - struct fo_flush_cache_test_spec spec[6] = - { - { - /* entry_num = */ 0, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 1, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__DIRTIED_FLAG, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 6, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 0, FALSE, VARIABLE_ENTRY_SIZE / 4 }, - { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 0, FALSE, 0 }, - { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 0, FALSE, 0 }, - { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 2, FALSE, 0 }, - { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 2, FALSE, VARIABLE_ENTRY_SIZE / 2 }, - { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 2, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 1, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 11, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__DIRTIED_FLAG, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 6, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 10, FALSE, VARIABLE_ENTRY_SIZE / 4 }, - { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 10, FALSE, 0 }, - { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 10, FALSE, 0 }, - { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 12, FALSE, 0 }, - { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 12, FALSE, VARIABLE_ENTRY_SIZE / 2 }, - { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 12, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 2, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 0, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 0, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 3, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 1, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 0, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ FALSE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 4, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 10, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__DIRTIED_FLAG, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 1, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__DIRTY, PICO_ENTRY_TYPE, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 5, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 20, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__DIRTIED_FLAG, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 1, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__DIRTY, PICO_ENTRY_TYPE, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ TRUE - } - }; - int check_size = 4; - struct fo_flush_entry_check checks[4] = - { - { - /* entry_num = */ 0, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 0, - /* expected_size = */ VARIABLE_ENTRY_SIZE / 4, - /* in_cache = */ FALSE, - /* at_main_addr = */ FALSE, - /* is_dirty = */ FALSE, - /* is_protected = */ FALSE, - /* is_pinned = */ FALSE, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 1, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 2, - /* expected_size = */ VARIABLE_ENTRY_SIZE / 2, - /* in_cache = */ FALSE, - /* at_main_addr = */ FALSE, - /* is_dirty = */ FALSE, - /* is_protected = */ FALSE, - /* is_pinned = */ FALSE, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 2, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 10, - /* expected_size = */ VARIABLE_ENTRY_SIZE / 4, - /* in_cache = */ FALSE, - /* at_main_addr = */ FALSE, - /* is_dirty = */ FALSE, - /* is_protected = */ FALSE, - /* is_pinned = */ FALSE, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 3, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 12, - /* expected_size = */ VARIABLE_ENTRY_SIZE / 2, - /* in_cache = */ FALSE, - /* at_main_addr = */ FALSE, - /* is_dirty = */ FALSE, - /* is_protected = */ FALSE, - /* is_pinned = */ FALSE, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ TRUE - } - }; - - check_flush_cache__flush_op_test(file_ptr, - test_num, - flush_flags, - spec_size, - spec, - init_expected_index_len, - init_expected_index_size, - expected_index_len, - expected_index_size, - check_size, - checks); - reset_entries2(); - } - - /* So much for tests involving only flush operations. - * - * Now create some tests mixing flush ops and pins. - */ - if ( pass2 ) /* test #24 */ - { - /* Pico entries 50 and 150 pin pico entry 100, and also dirty - * pico entry 100 on flush. - */ - int test_num = 24; - unsigned int flush_flags = H5C2__NO_FLAGS_SET; - int spec_size = 3; - int init_expected_index_len = 3; - size_t init_expected_index_size = 3 * PICO_ENTRY_SIZE; - int expected_index_len = 3; - size_t expected_index_size = 3 * PICO_ENTRY_SIZE; - struct fo_flush_cache_test_spec spec[3] = - { - { - /* entry_num = */ 0, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 100, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 0, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 1, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 50, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__DIRTIED_FLAG, - /* new_size = */ 0, - /* num_pins = */ 1, - /* pin_type = */ {PICO_ENTRY_TYPE, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {100, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 1, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__DIRTY, PICO_ENTRY_TYPE, 100, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 2, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 150, - /* insert_flag = */ TRUE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* new_size = */ 0, - /* num_pins = */ 1, - /* pin_type = */ {PICO_ENTRY_TYPE, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {100, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 1, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__DIRTY, PICO_ENTRY_TYPE, 100, FALSE, 0 }, - { FLUSH_OP__DIRTY, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - } - }; - int check_size = 0; - struct fo_flush_entry_check checks[1] = - { - { - /* entry_num = */ 0, - /* entry_type = */ 0, - /* entry_index = */ 0, - /* expected_size = */ (size_t)0, - /* in_cache = */ FALSE, - /* at_main_addr = */ FALSE, - /* is_dirty = */ FALSE, - /* is_protected = */ FALSE, - /* is_pinned = */ FALSE, - /* expected_loaded = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ FALSE, - /* expected_destroyed = */ FALSE - } - }; - - check_flush_cache__flush_op_test(file_ptr, - test_num, - flush_flags, - spec_size, - spec, - init_expected_index_len, - init_expected_index_size, - expected_index_len, - expected_index_size, - check_size, - checks); - } - - if ( pass2 ) /* test #25 */ - { - /* Repeat the previous test with the flush invalidate flag. - * - * Pico entries 50 and 150 pin pico entry 100, and also dirty - * pico entry 100 on flush. - */ - int test_num = 25; - unsigned int flush_flags = H5C2__FLUSH_INVALIDATE_FLAG; - int spec_size = 3; - int init_expected_index_len = 3; - size_t init_expected_index_size = 3 * PICO_ENTRY_SIZE; - int expected_index_len = 0; - size_t expected_index_size = (size_t)0; - struct fo_flush_cache_test_spec spec[3] = - { - { - /* entry_num = */ 0, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 100, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 0, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 1, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 50, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__DIRTIED_FLAG, - /* new_size = */ 0, - /* num_pins = */ 1, - /* pin_type = */ {PICO_ENTRY_TYPE, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {100, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 1, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__DIRTY, PICO_ENTRY_TYPE, 100, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 2, - /* entry_type = */ PICO_ENTRY_TYPE, - /* entry_index = */ 150, - /* insert_flag = */ TRUE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* new_size = */ 0, - /* num_pins = */ 1, - /* pin_type = */ {PICO_ENTRY_TYPE, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {100, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 1, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__DIRTY, PICO_ENTRY_TYPE, 100, FALSE, 0 }, - { FLUSH_OP__DIRTY, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ TRUE - } - }; - int check_size = 0; - struct fo_flush_entry_check checks[1] = - { - { - /* entry_num = */ 0, - /* entry_type = */ 0, - /* entry_index = */ 0, - /* expected_size = */ (size_t)0, - /* in_cache = */ FALSE, - /* at_main_addr = */ FALSE, - /* is_dirty = */ FALSE, - /* is_protected = */ FALSE, - /* is_pinned = */ FALSE, - /* expected_loaded = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ FALSE, - /* expected_destroyed = */ FALSE - } - }; - - check_flush_cache__flush_op_test(file_ptr, - test_num, - flush_flags, - spec_size, - spec, - init_expected_index_len, - init_expected_index_size, - expected_index_len, - expected_index_size, - check_size, - checks); - } - - if ( pass2 ) /* test #26 */ - { - /* This one is complex. - * - * In the following overvies table, VET stands for - * VARIABLE_ENTRY_TYPE. - * - * In trying to follow what happens when we flush the - * set of entries constructed below, recall that each - * flush operation is executed the first time the - * entry is flushed, and then not executed again. - * This may be a weakness in the tests, but that - * is the way it is for now. - * - * After thinking about it for a while, I'm not sure that - * the interaction between pins and flush operations needs - * all that much testing, as the two are essentially - * orthoginal. Thus this is a bit of a smoke check to - * verify that we get the expected results. - * - * (VET, 100) initially not resident in cache - * - * (VET, 200) initially clean and resident in cache - * - * (VET, 300) initially not resident in cache - * - * (VET, 2100) initially clean and resident in cache - * - * (VET, 2200) initially not resident in cache - * - * (VET, 2300) initially clean and resident in cache - * - * (VET, 1000) initially clean, and in cache - * dirties (VET, 100) - * resizes (VET, 200) - * dirty (VET, 300) -- dirty first to bring into cache. - * renames (VET, 300) - * - * (VET, 2000) initially clean, and in cache - * dirties (VET, 2100) - * resizes (VET, 2200) - * renames (VET, 2300) - * - * (VET, 350) initially clean, and in cache - * pins (VET, 1000) - * dirties (VET, 1000) - * resizes (VET, 350) - * pins (VET, 2000) - * dirties (VET, 2000) - * - * (VET, 450) initially dirty, and in cache - * pins (VET, 1000) - * dirties (VET, 1000) - * renames (VET, 450) - * pins (VET, 2000) - * dirties (VET, 2000) - * - * (VET, 650) initially clean, and in cache - * pins (VET, 1000) - * dirties (VET, 1000) - * resizes (VET, 650) - * pins (VET, 2000) - * dirties (VET, 2000) - * - * (VET, 750) initially dirty, and in cache - * pins (VET, 1000) - * dirties (VET, 1000) - * resizes (VET, 750) - * pins (VET, 2000) - * dirties (VET, 2000) - * - * (VET, 500) initially dirty, and in cache - * dirties (VET, 350) - * dirties (VET, 450) - * dirties (VET, 650) - * dirties (VET, 750) - */ - int test_num = 26; - unsigned int flush_flags = H5C2__NO_FLAGS_SET; - int spec_size = 10; - int init_expected_index_len = 10; - size_t init_expected_index_size = 10 * VARIABLE_ENTRY_SIZE; - int expected_index_len = 13; - size_t expected_index_size = 9 * VARIABLE_ENTRY_SIZE; - struct fo_flush_cache_test_spec spec[10] = - { - { - /* entry_num = */ 0, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 200, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 0, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 1, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 2100, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 0, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 2, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 2300, - /* insert_flag = */ TRUE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 0, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 3, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 1000, - /* insert_flag = */ TRUE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 4, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 100, FALSE, 0 }, - { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 200, FALSE, VARIABLE_ENTRY_SIZE / 2 }, - { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 300, FALSE, 0 }, - { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 300, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 4, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 2000, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 3, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 2100, FALSE, 0 }, - { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 2200, FALSE, VARIABLE_ENTRY_SIZE / 2 }, - { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 2300, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 5, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 350, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* new_size = */ 0, - /* num_pins = */ 2, - /* pin_type = */ {VARIABLE_ENTRY_TYPE, VARIABLE_ENTRY_TYPE, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {1000, 2000, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 3, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 1000, FALSE, 0 }, - { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 2000, FALSE, 0 }, - { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 350, FALSE, VARIABLE_ENTRY_SIZE / 4 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 6, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 450, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__DIRTIED_FLAG, - /* new_size = */ 0, - /* num_pins = */ 2, - /* pin_type = */ {VARIABLE_ENTRY_TYPE, VARIABLE_ENTRY_TYPE, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {1000, 2000, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 3, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 1000, FALSE, 0 }, - { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 2000, FALSE, 0 }, - { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 450, FALSE, VARIABLE_ENTRY_SIZE / 4 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 7, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 650, - /* insert_flag = */ TRUE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* new_size = */ 0, - /* num_pins = */ 2, - /* pin_type = */ {VARIABLE_ENTRY_TYPE, VARIABLE_ENTRY_TYPE, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {1000, 2000, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 3, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 1000, FALSE, 0 }, - { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 2000, FALSE, 0 }, - { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 650, FALSE, VARIABLE_ENTRY_SIZE / 4 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 8, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 750, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__DIRTIED_FLAG, - /* new_size = */ 0, - /* num_pins = */ 2, - /* pin_type = */ {VARIABLE_ENTRY_TYPE, VARIABLE_ENTRY_TYPE, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {1000, 2000, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 3, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 1000, FALSE, 0 }, - { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 2000, FALSE, 0 }, - { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 750, FALSE, VARIABLE_ENTRY_SIZE / 4 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 9, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 500, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__DIRTIED_FLAG, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 4, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 350, FALSE, 0 }, - { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 450, FALSE, 0 }, - { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 650, FALSE, 0 }, - { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 750, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - } - }; - int check_size = 3; - struct fo_flush_entry_check checks[3] = - { - { - /* entry_num = */ 0, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 100, - /* expected_size = */ VARIABLE_ENTRY_SIZE, - /* in_cache = */ TRUE, - /* at_main_addr = */ TRUE, - /* is_dirty = */ FALSE, - /* is_protected = */ FALSE, - /* is_pinned = */ FALSE, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 1, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 300, - /* expected_size = */ VARIABLE_ENTRY_SIZE, - /* in_cache = */ TRUE, - /* at_main_addr = */ FALSE, - /* is_dirty = */ FALSE, - /* is_protected = */ FALSE, - /* is_pinned = */ FALSE, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 2, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 2200, - /* expected_size = */ VARIABLE_ENTRY_SIZE / 2, - /* in_cache = */ TRUE, - /* at_main_addr = */ TRUE, - /* is_dirty = */ FALSE, - /* is_protected = */ FALSE, - /* is_pinned = */ FALSE, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - } - - }; - - check_flush_cache__flush_op_test(file_ptr, - test_num, - flush_flags, - spec_size, - spec, - init_expected_index_len, - init_expected_index_size, - expected_index_len, - expected_index_size, - check_size, - checks); - - reset_entries2(); - } - - if ( pass2 ) /* test #27 */ - { - /* Repeat test #26 with the flush invalidate flag. - * - * In the following overview table, VET stands for - * VARIABLE_ENTRY_TYPE. - * - * In trying to follow what happens when we flush the - * set of entries constructed below, recall that each - * flush operation is executed the first time the - * entry is flushed, and then not executed again. - * This may be a weakness in the tests, but that - * is the way it is for now. - * - * After thinking about it for a while, I'm not sure that - * the interaction between pins and flush operations needs - * all that much testing, as the two are essentially - * orthoginal. The big thing is to verify that flushes of - * pinned entries with flush ops result in the expected - * updates of the cache. - * - * Thus this is a bit of a smoke check to * verify that we - * get the expected results. - * - * (VET, 100) initially not resident in cache - * - * (VET, 200) initially clean and resident in cache - * - * (VET, 300) initially not resident in cache - * - * (VET, 2100) initially clean and resident in cache - * - * (VET, 2200) initially not resident in cache - * - * (VET, 2300) initially clean and resident in cache - * - * (VET, 1000) initially clean, and in cache - * dirties (VET, 100) - * resizes (VET, 200) - * dirty (VET, 300) -- dirty first to bring into cache. - * renames (VET, 300) - * - * (VET, 2000) initially clean, and in cache - * dirties (VET, 2100) - * resizes (VET, 2200) - * renames (VET, 2300) - * - * (VET, 350) initially clean, and in cache - * pins (VET, 1000) - * dirties (VET, 1000) - * resizes (VET, 350) - * pins (VET, 2000) - * dirties (VET, 2000) - * - * (VET, 450) initially dirty, and in cache - * pins (VET, 1000) - * dirties (VET, 1000) - * renames (VET, 450) - * pins (VET, 2000) - * dirties (VET, 2000) - * - * (VET, 650) initially clean, and in cache - * pins (VET, 1000) - * dirties (VET, 1000) - * resizes (VET, 650) - * pins (VET, 2000) - * dirties (VET, 2000) - * - * (VET, 750) initially dirty, and in cache - * pins (VET, 1000) - * dirties (VET, 1000) - * resizes (VET, 750) - * pins (VET, 2000) - * dirties (VET, 2000) - * - * (VET, 500) initially dirty, and in cache - * dirties (VET, 350) - * dirties (VET, 450) - * dirties (VET, 650) - * dirties (VET, 750) - */ - int test_num = 27; - unsigned int flush_flags = H5C2__FLUSH_INVALIDATE_FLAG; - int spec_size = 10; - int init_expected_index_len = 10; - size_t init_expected_index_size = 10 * VARIABLE_ENTRY_SIZE; - int expected_index_len = 0; - size_t expected_index_size = (size_t)0; - struct fo_flush_cache_test_spec spec[10] = - { - { - /* entry_num = */ 0, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 200, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 0, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 1, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 2100, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 0, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 2, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 2300, - /* insert_flag = */ TRUE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 0, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 3, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 1000, - /* insert_flag = */ TRUE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 4, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 100, FALSE, 0 }, - { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 200, FALSE, VARIABLE_ENTRY_SIZE / 2 }, - { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 300, FALSE, 0 }, - { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 300, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 4, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 2000, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 3, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 2100, FALSE, 0 }, - { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 2200, FALSE, VARIABLE_ENTRY_SIZE / 2 }, - { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 2300, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 5, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 350, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* new_size = */ 0, - /* num_pins = */ 2, - /* pin_type = */ {VARIABLE_ENTRY_TYPE, VARIABLE_ENTRY_TYPE, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {1000, 2000, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 3, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 1000, FALSE, 0 }, - { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 2000, FALSE, 0 }, - { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 350, FALSE, VARIABLE_ENTRY_SIZE / 4 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 6, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 450, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__DIRTIED_FLAG, - /* new_size = */ 0, - /* num_pins = */ 2, - /* pin_type = */ {VARIABLE_ENTRY_TYPE, VARIABLE_ENTRY_TYPE, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {1000, 2000, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 3, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 1000, FALSE, 0 }, - { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 2000, FALSE, 0 }, - { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 450, FALSE, VARIABLE_ENTRY_SIZE / 4 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 7, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 650, - /* insert_flag = */ TRUE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* new_size = */ 0, - /* num_pins = */ 2, - /* pin_type = */ {VARIABLE_ENTRY_TYPE, VARIABLE_ENTRY_TYPE, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {1000, 2000, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 3, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 1000, FALSE, 0 }, - { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 2000, FALSE, 0 }, - { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 650, FALSE, VARIABLE_ENTRY_SIZE / 4 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 8, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 750, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__DIRTIED_FLAG, - /* new_size = */ 0, - /* num_pins = */ 2, - /* pin_type = */ {VARIABLE_ENTRY_TYPE, VARIABLE_ENTRY_TYPE, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {1000, 2000, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 3, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 1000, FALSE, 0 }, - { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 2000, FALSE, 0 }, - { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 750, FALSE, VARIABLE_ENTRY_SIZE / 4 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 9, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 500, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__DIRTIED_FLAG, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 4, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 350, FALSE, 0 }, - { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 450, FALSE, 0 }, - { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 650, FALSE, 0 }, - { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 750, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ TRUE - } - }; - int check_size = 3; - struct fo_flush_entry_check checks[3] = - { - { - /* entry_num = */ 0, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 100, - /* expected_size = */ VARIABLE_ENTRY_SIZE, - /* in_cache = */ FALSE, - /* at_main_addr = */ TRUE, - /* is_dirty = */ FALSE, - /* is_protected = */ FALSE, - /* is_pinned = */ FALSE, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 1, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 300, - /* expected_size = */ VARIABLE_ENTRY_SIZE, - /* in_cache = */ FALSE, - /* at_main_addr = */ FALSE, - /* is_dirty = */ FALSE, - /* is_protected = */ FALSE, - /* is_pinned = */ FALSE, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 2, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 2200, - /* expected_size = */ VARIABLE_ENTRY_SIZE / 2, - /* in_cache = */ FALSE, - /* at_main_addr = */ TRUE, - /* is_dirty = */ FALSE, - /* is_protected = */ FALSE, - /* is_pinned = */ FALSE, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ TRUE - } - - }; - - check_flush_cache__flush_op_test(file_ptr, - test_num, - flush_flags, - spec_size, - spec, - init_expected_index_len, - init_expected_index_size, - expected_index_len, - expected_index_size, - check_size, - checks); - - reset_entries2(); - } - - if ( pass2 ) /* test #28 */ - { - /* Test the expected fheap case, in which an entry dirties - * and resizes itself, and dirties an entry which it has - * pinned. - */ - int test_num = 28; - unsigned int flush_flags = H5C2__NO_FLAGS_SET; - int spec_size = 5; - int init_expected_index_len = 5; - size_t init_expected_index_size = 3 * VARIABLE_ENTRY_SIZE; - int expected_index_len = 5; - size_t expected_index_size = 4 * VARIABLE_ENTRY_SIZE; - struct fo_flush_cache_test_spec spec[5] = - { - { - /* entry_num = */ 0, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 100, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 0, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 1, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 200, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__DIRTIED_FLAG | H5C2__SIZE_CHANGED_FLAG, - /* new_size = */ VARIABLE_ENTRY_SIZE / 2, - /* num_pins = */ 1, - /* pin_type = */ {VARIABLE_ENTRY_TYPE, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {100, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 3, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 100, FALSE, 0 }, - { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 200, FALSE, VARIABLE_ENTRY_SIZE }, - { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 200, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 2, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 300, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__DIRTIED_FLAG | H5C2__SIZE_CHANGED_FLAG, - /* new_size = */ VARIABLE_ENTRY_SIZE / 4, - /* num_pins = */ 1, - /* pin_type = */ {VARIABLE_ENTRY_TYPE, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {400, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 3, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 400, FALSE, 0 }, - { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 300, FALSE, VARIABLE_ENTRY_SIZE / 2 }, - { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 300, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 3, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 400, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 0, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - }, - { - /* entry_num = */ 4, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 500, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__DIRTIED_FLAG | H5C2__SIZE_CHANGED_FLAG, - /* new_size = */ VARIABLE_ENTRY_SIZE / 4, - /* num_pins = */ 1, - /* pin_type = */ {VARIABLE_ENTRY_TYPE, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {100, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 3, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 100, FALSE, 0 }, - { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 500, FALSE, VARIABLE_ENTRY_SIZE / 2 }, - { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 500, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ FALSE - } - }; - int check_size = 0; - struct fo_flush_entry_check checks[1] = - { - { - /* entry_num = */ 0, - /* entry_type = */ 0, - /* entry_index = */ 0, - /* expected_size = */ 0, - /* in_cache = */ FALSE, - /* at_main_addr = */ FALSE, - /* is_dirty = */ FALSE, - /* is_protected = */ FALSE, - /* is_pinned = */ FALSE, - /* expected_loaded = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ FALSE, - /* expected_destroyed = */ FALSE - } - }; - - check_flush_cache__flush_op_test(file_ptr, - test_num, - flush_flags, - spec_size, - spec, - init_expected_index_len, - init_expected_index_size, - expected_index_len, - expected_index_size, - check_size, - checks); - - reset_entries2(); - } - - if ( pass2 ) /* test #29 */ - { - /* Repeat test #28 with the flush invalidate flag. - * - * Test the expected fheap case, in which an entry dirties - * and resizes itself, and dirties an entry which it has - * pinned. - */ - int test_num = 29; - unsigned int flush_flags = H5C2__FLUSH_INVALIDATE_FLAG; - int spec_size = 5; - int init_expected_index_len = 5; - size_t init_expected_index_size = 3 * VARIABLE_ENTRY_SIZE; - int expected_index_len = 0; - size_t expected_index_size = 0; - struct fo_flush_cache_test_spec spec[5] = - { - { - /* entry_num = */ 0, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 100, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 0, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 1, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 200, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__DIRTIED_FLAG | H5C2__SIZE_CHANGED_FLAG, - /* new_size = */ VARIABLE_ENTRY_SIZE / 2, - /* num_pins = */ 1, - /* pin_type = */ {VARIABLE_ENTRY_TYPE, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {100, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 3, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 100, FALSE, 0 }, - { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 200, FALSE, VARIABLE_ENTRY_SIZE }, - { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 200, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 2, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 300, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__DIRTIED_FLAG | H5C2__SIZE_CHANGED_FLAG, - /* new_size = */ VARIABLE_ENTRY_SIZE / 4, - /* num_pins = */ 1, - /* pin_type = */ {VARIABLE_ENTRY_TYPE, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {400, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 3, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 400, FALSE, 0 }, - { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 300, FALSE, VARIABLE_ENTRY_SIZE / 2 }, - { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 300, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 3, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 400, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__NO_FLAGS_SET, - /* new_size = */ 0, - /* num_pins = */ 0, - /* pin_type = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {0, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 0, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ TRUE - }, - { - /* entry_num = */ 4, - /* entry_type = */ VARIABLE_ENTRY_TYPE, - /* entry_index = */ 500, - /* insert_flag = */ FALSE, - /* flags = */ H5C2__DIRTIED_FLAG | H5C2__SIZE_CHANGED_FLAG, - /* new_size = */ VARIABLE_ENTRY_SIZE / 4, - /* num_pins = */ 1, - /* pin_type = */ {VARIABLE_ENTRY_TYPE, 0, 0, 0, 0, 0, 0, 0}, - /* pin_idx = */ {100, 0, 0, 0, 0, 0, 0, 0}, - /* num_flush_ops = */ 3, - /* flush_ops = */ - /* op_code: type: idx: flag: size: */ - { { FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 100, FALSE, 0 }, - { FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 500, FALSE, VARIABLE_ENTRY_SIZE / 2 }, - { FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 500, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 }, - { FLUSH_OP__NO_OP, 0, 0, FALSE, 0 } }, - /* expected_loaded = */ TRUE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ TRUE, - /* expected_destroyed = */ TRUE - } - }; - int check_size = 0; - struct fo_flush_entry_check checks[1] = - { - { - /* entry_num = */ 0, - /* entry_type = */ 0, - /* entry_index = */ 0, - /* expected_size = */ 0, - /* in_cache = */ FALSE, - /* at_main_addr = */ FALSE, - /* is_dirty = */ FALSE, - /* is_protected = */ FALSE, - /* is_pinned = */ FALSE, - /* expected_loaded = */ FALSE, - /* expected_cleared = */ FALSE, - /* expected_flushed = */ FALSE, - /* expected_destroyed = */ FALSE - } - }; - - check_flush_cache__flush_op_test(file_ptr, - test_num, - flush_flags, - spec_size, - spec, - init_expected_index_len, - init_expected_index_size, - expected_index_len, - expected_index_size, - check_size, - checks); - - reset_entries2(); - } - - /* finally finish up with the flush ops eviction test */ - check_flush_cache__flush_op_eviction_test(file_ptr); - - return; - -} /* check_flush_cache__flush_ops() */ - - -/*------------------------------------------------------------------------- - * Function: check_flush_cache__flush_op_test() - * - * Purpose: Run a flush op flush cache test. Of the nature of - * flush operations, this is a multi-entry test. - * - * Return: void - * - * Programmer: John Mainzer - * 9/3/06 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -static void -check_flush_cache__flush_op_test(H5F_t * file_ptr, - int test_num, - unsigned int flush_flags, - int spec_size, - struct fo_flush_cache_test_spec spec[], - int init_expected_index_len, - size_t init_expected_index_size, - int expected_index_len, - size_t expected_index_size, - int check_size, - struct fo_flush_entry_check check[]) -{ - /* const char * fcn_name = "check_flush_cache__flush_op_test"; */ - H5C2_t * cache_ptr = file_ptr->shared->cache2; - static char msg[128]; - herr_t result; - int i; - int j; - test_entry_t * base_addr; - test_entry_t * entry_ptr; - -#if 0 /* This is useful debugging code -- lets keep it around. */ - HDfprintf(stdout, "check_flush_cache__flush_op_test: test %d\n", - test_num); -#endif - - if ( cache_ptr == NULL ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "cache_ptr NULL on entry to flush op test #%d.", - test_num); - failure_mssg2 = msg; - } - else if ( ( cache_ptr->index_len != 0 ) || - ( cache_ptr->index_size != 0 ) ) { - - pass2 = FALSE; - - HDsnprintf(msg, (size_t)128, - "cache not empty at beginning of flush op test #%d.", - test_num); - failure_mssg2 = msg; - } - else if ( ( spec_size < 1 ) || ( spec == NULL ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "missing/bad test spec on entry to flush op test #%d.", - test_num); - failure_mssg2 = msg; - } - - i = 0; - while ( ( pass2 ) && ( i < spec_size ) ) - { - if ( ( spec[i].entry_num != i ) || - ( spec[i].entry_type < 0 ) || - ( spec[i].entry_type >= NUMBER_OF_ENTRY_TYPES ) || - ( spec[i].entry_index < 0 ) || - ( spec[i].entry_index > max_indices2[spec[i].entry_type] ) || - ( spec[i].num_pins < 0 ) || - ( spec[i].num_pins > MAX_PINS ) || - ( spec[i].num_flush_ops < 0 ) || - ( spec[i].num_flush_ops > MAX_FLUSH_OPS ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "bad data in spec[%d] on entry to flush op test #%d.", - i, test_num); - failure_mssg2 = msg; - } - i++; - } - - i = 0; - while ( ( pass2 ) && ( i < check_size ) ) - { - if ( ( check[i].entry_num != i ) || - ( check[i].entry_type < 0 ) || - ( check[i].entry_type >= NUMBER_OF_ENTRY_TYPES ) || - ( check[i].entry_index < 0 ) || - ( check[i].entry_index > max_indices2[check[i].entry_type] ) || - ( check[i].expected_size <= (size_t)0 ) || - ( ( check[i].in_cache != TRUE ) && - ( check[i].in_cache != FALSE ) ) || - ( ( check[i].at_main_addr != TRUE ) && - ( check[i].at_main_addr != FALSE ) ) || - ( ( check[i].is_dirty != TRUE ) && - ( check[i].is_dirty != FALSE ) ) || - ( ( check[i].is_protected != TRUE ) && - ( check[i].is_protected != FALSE ) ) || - ( ( check[i].is_pinned != TRUE ) && - ( check[i].is_pinned != FALSE ) ) || - ( ( check[i].expected_deserialized != TRUE ) && - ( check[i].expected_deserialized != FALSE ) ) || - ( ( check[i].expected_cleared != TRUE ) && - ( check[i].expected_cleared != FALSE ) ) || - ( ( check[i].expected_serialized != TRUE ) && - ( check[i].expected_serialized != FALSE ) ) || - ( ( check[i].expected_destroyed != TRUE ) && - ( check[i].expected_destroyed != FALSE ) ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "bad data in check[%d] on entry to flush op test #%d.", - i, test_num); - failure_mssg2 = msg; - } - i++; - } - - i = 0; - while ( ( pass2 ) && ( i < spec_size ) ) - { - if ( spec[i].insert_flag ) { - - insert_entry2(file_ptr, spec[i].entry_type, spec[i].entry_index, - TRUE, spec[i].flags); - - } else { - - protect_entry2(file_ptr, spec[i].entry_type, spec[i].entry_index); - - unprotect_entry_with_size_change2(file_ptr, spec[i].entry_type, - spec[i].entry_index, - spec[i].flags, spec[i].new_size); - } - - for ( j = 0; j < spec[i].num_pins; j++ ) - { - create_pinned_entry_dependency2(file_ptr, - spec[i].entry_type, - spec[i].entry_index, - spec[i].pin_type[j], - spec[i].pin_idx[j]); - } - - for ( j = 0; j < spec[i].num_flush_ops; j++ ) - { - add_flush_op2(spec[i].entry_type, - spec[i].entry_index, - spec[i].flush_ops[j].op_code, - spec[i].flush_ops[j].type, - spec[i].flush_ops[j].idx, - spec[i].flush_ops[j].flag, - spec[i].flush_ops[j].size); - } - - i++; - } - - if ( pass2 ) { - - if ( ( cache_ptr->index_len != init_expected_index_len ) || - ( cache_ptr->index_size != init_expected_index_size ) ) { - - pass2 = FALSE; - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "Unexpected cache len/size before flush in flush op test #%d.", - test_num); - failure_mssg2 = msg; - } - } - - if ( pass2 ) { - - result = H5C2_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, flush_flags); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "flush with flags 0x%x failed in flush op test #%d.", - flush_flags, test_num); - failure_mssg2 = msg; - } - } - - - i = 0; - while ( ( pass2 ) && ( i < spec_size ) ) - { - base_addr = entries2[spec[i].entry_type]; - entry_ptr = &(base_addr[spec[i].entry_index]); - -#ifndef NDEBUG - /* The clear_dirty_bits() callback is only called in debug mode -- - * thus we can only do our full test on the expected entry history - * when debug is enabled. - */ - if ( ( entry_ptr->deserialized != spec[i].expected_deserialized ) || - ( entry_ptr->cleared != spec[i].expected_cleared ) || - ( entry_ptr->serialized != spec[i].expected_serialized ) || - ( entry_ptr->destroyed != spec[i].expected_destroyed ) ) { -#else - /* When in procduction mode, the clear_dirty_bits() callback is - * not called, so entry_ptr->cleared should never be set. - */ - if ( ( entry_ptr->deserialized != spec[i].expected_deserialized ) || - ( entry_ptr->cleared ) || - ( entry_ptr->serialized != spec[i].expected_serialized ) || - ( entry_ptr->destroyed != spec[i].expected_destroyed ) ) { -#endif /* NDEBUG */ - -#if 0 /* This is useful debugging code. Lets keep it around. */ - - HDfprintf(stdout, - "desrlzd = %d(%d), clrd = %d(%d), srlzd = %d(%d), dest = %d(%d)\n", - (int)(entry_ptr->deserialized), - (int)(spec[i].expected_deserialized), - (int)(entry_ptr->cleared), - (int)(spec[i].expected_cleared), - (int)(entry_ptr->serialized), - (int)(spec[i].expected_serialized), - (int)(entry_ptr->destroyed), - (int)(spec[i].expected_destroyed)); - - HDfprintf(stdout, "entry_ptr->header.is_dirty = %d\n", - (int)(entry_ptr->header.is_dirty)); -#endif - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "Bad status on entry %d after flush op test #%d.", - i, test_num); - failure_mssg2 = msg; - } - i++; - } - - if ( pass2 ) { - - i = 0; - while ( ( pass2 ) && ( i < check_size ) ) - { - if ( check[i].in_cache != entry_in_cache2(cache_ptr, - check[i].entry_type, - check[i].entry_index) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "Check1 failed on entry %d after flush op test #%d.", - i, test_num); - failure_mssg2 = msg; - } - - base_addr = entries2[check[i].entry_type]; - entry_ptr = &(base_addr[check[i].entry_index]); - -#ifndef NDEBUG - /* The clear_dirty_bits() callback is only called in debug mode -- - * thus we can only do our full test on the expected entry status - * and histry when debug is enabled. - */ - if ( ( entry_ptr->size != check[i].expected_size ) || - ( ( ! entry_ptr->header.destroy_in_progress ) && - ( check[i].in_cache ) && - ( entry_ptr->header.size != check[i].expected_size ) ) || - ( entry_ptr->at_main_addr != check[i].at_main_addr ) || - ( entry_ptr->is_dirty != check[i].is_dirty ) || - ( entry_ptr->header.is_dirty != check[i].is_dirty ) || - ( entry_ptr->is_protected != check[i].is_protected ) || - ( entry_ptr->header.is_protected != check[i].is_protected ) || - ( entry_ptr->is_pinned != check[i].is_pinned ) || - ( entry_ptr->header.is_pinned != check[i].is_pinned ) || - ( entry_ptr->deserialized != - check[i].expected_deserialized ) || - ( entry_ptr->cleared != check[i].expected_cleared ) || - ( entry_ptr->serialized != check[i].expected_serialized ) || - ( entry_ptr->destroyed != check[i].expected_destroyed ) ) { -#else - /* When in procduction mode, the clear_dirty_bits() callback is - * not called, so entry_ptr->cleared should never be set. - */ - if ( ( entry_ptr->size != check[i].expected_size ) || - ( ( ! entry_ptr->header.destroy_in_progress ) && - ( check[i].in_cache ) && - ( entry_ptr->header.size != check[i].expected_size ) ) || - ( entry_ptr->at_main_addr != check[i].at_main_addr ) || - ( entry_ptr->is_dirty != check[i].is_dirty ) || - ( entry_ptr->header.is_dirty != check[i].is_dirty ) || - ( entry_ptr->is_protected != check[i].is_protected ) || - ( entry_ptr->header.is_protected != check[i].is_protected ) || - ( entry_ptr->is_pinned != check[i].is_pinned ) || - ( entry_ptr->header.is_pinned != check[i].is_pinned ) || - ( entry_ptr->deserialized != - check[i].expected_deserialized ) || - ( entry_ptr->cleared ) || - ( entry_ptr->serialized != check[i].expected_serialized ) || - ( entry_ptr->destroyed != check[i].expected_destroyed ) ) { -#endif /* NDEBUG */ - - -#if 0 /* This is useful debugging code. Lets keep it around for a while. */ - - if ( entry_ptr->size != check[i].expected_size ) { - HDfprintf(stdout, "entry_ptr->size (expected) = %d (%d).\n", - (int)(entry_ptr->size), - (int)(check[i].expected_size)); - } - if ( ( ! entry_ptr->header.destroy_in_progress ) && - ( check[i].in_cache ) && - ( entry_ptr->header.size != check[i].expected_size ) ) { - HDfprintf(stdout, - "(!destroy in progress and in cache and size (expected) = %d (%d).\n", - (int)(entry_ptr->header.size), - (int)(check[i].expected_size)); - } - if ( entry_ptr->at_main_addr != check[i].at_main_addr ) { - HDfprintf(stdout, "(%d,%d) at main addr (expected) = %d (%d).\n", - (int)(check[i].entry_type), - (int)(check[i].entry_index), - (int)(entry_ptr->at_main_addr), - (int)(check[i].at_main_addr)); - } - if ( entry_ptr->is_dirty != check[i].is_dirty ) { - HDfprintf(stdout, "entry_ptr->is_dirty (expected) = %d (%d).\n", - (int)(entry_ptr->is_dirty), - (int)(check[i].is_dirty)); - } - if ( entry_ptr->header.is_dirty != check[i].is_dirty ) { - HDfprintf(stdout, "entry_ptr->header.is_dirty (expected) = %d (%d).\n", - (int)(entry_ptr->header.is_dirty), - (int)(check[i].is_dirty)); - } - if ( entry_ptr->is_protected != check[i].is_protected ) { - HDfprintf(stdout, "entry_ptr->is_protected (expected) = %d (%d).\n", - (int)(entry_ptr->is_protected), - (int)(check[i].is_protected)); - } - if ( entry_ptr->header.is_protected != check[i].is_protected ) { - HDfprintf(stdout, "entry_ptr->header.is_protected (expected) = %d (%d).\n", - (int)(entry_ptr->is_protected), - (int)(check[i].is_protected)); - } - if ( entry_ptr->is_pinned != check[i].is_pinned ) { - HDfprintf(stdout, "entry_ptr->is_pinned (expected) = %d (%d).\n", - (int)(entry_ptr->is_pinned), - (int)(check[i].is_pinned)); - } - if ( entry_ptr->header.is_pinned != check[i].is_pinned ) { - HDfprintf(stdout, "entry_ptr->header.is_pinned (expected) = %d (%d).\n", - (int)(entry_ptr->header.is_pinned), - (int)(check[i].is_pinned)); - } - if ( entry_ptr->deserialized != - check[i].expected_deserialized ) { - HDfprintf(stdout, - "entry_ptr->deserialized (expected) = %d (%d).\n", - (int)(entry_ptr->deserialized), - (int)(check[i].expected_deserialized)); - } - if ( entry_ptr->cleared != check[i].expected_cleared ) { - HDfprintf(stdout, "entry_ptr->cleared (expected) = %d (%d).\n", - (int)(entry_ptr->cleared), - (int)(check[i].expected_cleared)); - } - if ( entry_ptr->serialized != check[i].expected_serialized ) { - HDfprintf(stdout, - "entry_ptr->serialized (expected) = %d (%d).\n", - (int)(entry_ptr->serialized), - (int)(check[i].expected_serialized)); - } - if ( entry_ptr->destroyed != check[i].expected_destroyed ) { - HDfprintf(stdout, "entry_ptr->destroyed (expected) = %d (%d).\n", - (int)(entry_ptr->destroyed), - (int)(check[i].expected_destroyed)); - } -#endif - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "Check2 failed on entry %d after flush op test #%d.", - i, test_num); - failure_mssg2 = msg; - } - i++; - } - } - - if ( pass2 ) { - - if ( ( ( (flush_flags & H5C2__FLUSH_INVALIDATE_FLAG) == 0 ) - && - ( ( cache_ptr->index_len != expected_index_len ) - || - ( cache_ptr->index_size != expected_index_size ) - ) - ) - || - ( ( (flush_flags & H5C2__FLUSH_INVALIDATE_FLAG) != 0 ) - && - ( ( cache_ptr->index_len != 0 ) - || - ( cache_ptr->index_size != 0 ) - ) - ) - ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "Unexpected cache len/size after flush in flush op test #%d.", - test_num); - failure_mssg2 = msg; - } - } - - /* clean up the cache to prep for the next test */ - if ( pass2 ) { - - result = H5C2_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, - H5C2__FLUSH_INVALIDATE_FLAG); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "Flush failed on cleanup in flush op test #%d.", - test_num); - failure_mssg2 = msg; - } - else if ( ( cache_ptr->index_len != 0 ) || - ( cache_ptr->index_size != 0 ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "Unexpected cache len/size after cleanup in flush op test #%d.", - test_num); - failure_mssg2 = msg; - - } - } - - i = 0; - while ( ( pass2 ) && ( i < spec_size ) ) - { - base_addr = entries2[spec[i].entry_type]; - entry_ptr = &(base_addr[spec[i].entry_index]); - - entry_ptr->size = entry_sizes2[spec[i].entry_type]; - - entry_ptr->deserialized = FALSE; - entry_ptr->cleared = FALSE; - entry_ptr->serialized = FALSE; - entry_ptr->destroyed = FALSE; - - i++; - } - - i = 0; - while ( ( pass2 ) && ( i < check_size ) ) - { - base_addr = entries2[check[i].entry_type]; - entry_ptr = &(base_addr[check[i].entry_index]); - - entry_ptr->size = entry_sizes2[check[i].entry_type]; - - entry_ptr->deserialized = FALSE; - entry_ptr->cleared = FALSE; - entry_ptr->serialized = FALSE; - entry_ptr->destroyed = FALSE; - - i++; - } - - return; - -} /* check_flush_cache__flush_op_test() */ - - -/*------------------------------------------------------------------------- - * Function: check_flush_cache__flush_op_eviction_test() - * - * Purpose: Verify that flush operations work as expected when an - * entry is evicted. - * - * Do nothing if pass2 is FALSE on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 10/3/06 - * - * Modifications: - * - * JRM -- 10/9/07 - * Modified test to accomodate changes in the cache API. - * In particular, since the cache is now reading and writing - * its own entries, the serialize callback is not called on - * entry eviction unless the entry is dirty. - * - * This fact broke some basic assumptions of the test, and - * necessitated a substantial re-write. - * - *------------------------------------------------------------------------- - */ - -static void -check_flush_cache__flush_op_eviction_test(H5F_t * file_ptr) -{ - /* const char * fcn_name = "check_flush_cache__flush_op_eviction_test"; */ - H5C2_t * cache_ptr = file_ptr->shared->cache2; - int i; - int num_variable_entries = 10; - int num_monster_entries = 31; - int num_large_entries = 0; - herr_t result; - test_entry_t * entry_ptr; - test_entry_t * base_addr; - struct expected_entry_status expected[10 + 31 + 14] = - { - /* the expected array is used to maintain a table of the expected status of every - * entry used in this test. Note that since the function that processes this - * array only processes as much of it as it is told to, we don't have to - * worry about maintaining the status of entries that we haven't used yet. - */ - /* entry entry in at main */ - /* type: index: size: cache: addr: dirty: prot: pinned: dsrlzd: clrd: srlzd: dest: */ - { VARIABLE_ENTRY_TYPE, 0, VARIABLE_ENTRY_SIZE/4, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE }, - { VARIABLE_ENTRY_TYPE, 1, VARIABLE_ENTRY_SIZE/4, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { VARIABLE_ENTRY_TYPE, 2, VARIABLE_ENTRY_SIZE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { VARIABLE_ENTRY_TYPE, 3, VARIABLE_ENTRY_SIZE/4, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { VARIABLE_ENTRY_TYPE, 4, VARIABLE_ENTRY_SIZE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { VARIABLE_ENTRY_TYPE, 5, VARIABLE_ENTRY_SIZE/4, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { VARIABLE_ENTRY_TYPE, 6, VARIABLE_ENTRY_SIZE/2, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { VARIABLE_ENTRY_TYPE, 7, VARIABLE_ENTRY_SIZE/2, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { VARIABLE_ENTRY_TYPE, 8, VARIABLE_ENTRY_SIZE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { VARIABLE_ENTRY_TYPE, 9, VARIABLE_ENTRY_SIZE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE }, - { MONSTER_ENTRY_TYPE, 0, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { MONSTER_ENTRY_TYPE, 1, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { MONSTER_ENTRY_TYPE, 2, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { MONSTER_ENTRY_TYPE, 3, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { MONSTER_ENTRY_TYPE, 4, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { MONSTER_ENTRY_TYPE, 5, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { MONSTER_ENTRY_TYPE, 6, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { MONSTER_ENTRY_TYPE, 7, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { MONSTER_ENTRY_TYPE, 8, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { MONSTER_ENTRY_TYPE, 9, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { MONSTER_ENTRY_TYPE, 10, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { MONSTER_ENTRY_TYPE, 11, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { MONSTER_ENTRY_TYPE, 12, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { MONSTER_ENTRY_TYPE, 13, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { MONSTER_ENTRY_TYPE, 14, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { MONSTER_ENTRY_TYPE, 15, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { MONSTER_ENTRY_TYPE, 16, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { MONSTER_ENTRY_TYPE, 17, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { MONSTER_ENTRY_TYPE, 18, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { MONSTER_ENTRY_TYPE, 19, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { MONSTER_ENTRY_TYPE, 20, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { MONSTER_ENTRY_TYPE, 21, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { MONSTER_ENTRY_TYPE, 22, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { MONSTER_ENTRY_TYPE, 23, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { MONSTER_ENTRY_TYPE, 24, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { MONSTER_ENTRY_TYPE, 25, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { MONSTER_ENTRY_TYPE, 26, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { MONSTER_ENTRY_TYPE, 27, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { MONSTER_ENTRY_TYPE, 28, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { MONSTER_ENTRY_TYPE, 29, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { MONSTER_ENTRY_TYPE, 30, MONSTER_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { LARGE_ENTRY_TYPE, 0, LARGE_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { LARGE_ENTRY_TYPE, 1, LARGE_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { LARGE_ENTRY_TYPE, 2, LARGE_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { LARGE_ENTRY_TYPE, 3, LARGE_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { LARGE_ENTRY_TYPE, 4, LARGE_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { LARGE_ENTRY_TYPE, 5, LARGE_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { LARGE_ENTRY_TYPE, 6, LARGE_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { LARGE_ENTRY_TYPE, 7, LARGE_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { LARGE_ENTRY_TYPE, 8, LARGE_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { LARGE_ENTRY_TYPE, 9, LARGE_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { LARGE_ENTRY_TYPE, 10, LARGE_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { LARGE_ENTRY_TYPE, 11, LARGE_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { LARGE_ENTRY_TYPE, 12, LARGE_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE }, - { LARGE_ENTRY_TYPE, 13, LARGE_ENTRY_SIZE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE } - }; - - if ( cache_ptr == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "cache_ptr NULL on entry to flush ops test."; - } - else if ( ( cache_ptr->index_len != 0 ) || - ( cache_ptr->index_size != 0 ) ) { - - pass2 = FALSE; - failure_mssg2 = "cache not empty at start of flush ops eviction test."; - } - else if ( ( cache_ptr->max_cache_size != (2 * 1024 * 1024 ) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 1024 ) ) ) { - - pass2 = FALSE; - failure_mssg2 = "unexpected cache config at start of flush op eviction test."; - - } else { - - /* set min clean size to zero for this test as it simplifies - * computing the expected cache size after each operation. - */ - - cache_ptr->min_clean_size = 0; - } - - if ( pass2 ) { - - /* the basic idea in this test is to insert a bunch of entries - * with flush operations associated with them, and then load - * other entries into the cache until the cache is full. At - * that point, load yet more entries into the cache, and see - * if the flush operations are performed as expected. - * - * To make things a bit more interesting, we also include a - * couple of pins. - */ - - /* reset the stats before we start. If stats are enabled, we will - * check to see if they are as expected at the end. - */ - H5C2_stats__reset(cache_ptr); - - - /* load a few entries with pin relationships and flush ops. - * Start by just loading the entries. - */ - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 0); - unprotect_entry_with_size_change2(file_ptr, VARIABLE_ENTRY_TYPE, 0, - H5C2__DIRTIED_FLAG | H5C2__SIZE_CHANGED_FLAG, - (VARIABLE_ENTRY_SIZE / 4)); - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 1); - unprotect_entry_with_size_change2(file_ptr, VARIABLE_ENTRY_TYPE, 1, - H5C2__DIRTIED_FLAG | H5C2__SIZE_CHANGED_FLAG, - (VARIABLE_ENTRY_SIZE / 4)); - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 2); - unprotect_entry_with_size_change2(file_ptr, VARIABLE_ENTRY_TYPE, 2, - H5C2__NO_FLAGS_SET, (size_t)0); - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 3); - unprotect_entry_with_size_change2(file_ptr, VARIABLE_ENTRY_TYPE, 3, - H5C2__DIRTIED_FLAG | H5C2__SIZE_CHANGED_FLAG, - (VARIABLE_ENTRY_SIZE / 4)); - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 4); - unprotect_entry_with_size_change2(file_ptr, VARIABLE_ENTRY_TYPE, 4, - H5C2__NO_FLAGS_SET, (size_t)0); - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 5); - unprotect_entry_with_size_change2(file_ptr, VARIABLE_ENTRY_TYPE, 5, - H5C2__DIRTIED_FLAG | H5C2__SIZE_CHANGED_FLAG, - (VARIABLE_ENTRY_SIZE / 4)); - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 6); - unprotect_entry_with_size_change2(file_ptr, VARIABLE_ENTRY_TYPE, 6, - H5C2__DIRTIED_FLAG | H5C2__SIZE_CHANGED_FLAG, - (VARIABLE_ENTRY_SIZE / 2)); - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 7); - unprotect_entry_with_size_change2(file_ptr, VARIABLE_ENTRY_TYPE, 7, - H5C2__DIRTIED_FLAG | H5C2__SIZE_CHANGED_FLAG, - (VARIABLE_ENTRY_SIZE / 2)); - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 8); - unprotect_entry_with_size_change2(file_ptr, VARIABLE_ENTRY_TYPE, 8, - H5C2__NO_FLAGS_SET, (size_t)0); - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 9); - unprotect_entry_with_size_change2(file_ptr, VARIABLE_ENTRY_TYPE, 9, - H5C2__NO_FLAGS_SET, (size_t)0); - - if ( ( cache_ptr->index_len != 10 ) || - ( cache_ptr->index_size != (4 * (VARIABLE_ENTRY_SIZE / 4)) + - (2 * (VARIABLE_ENTRY_SIZE / 2)) + - (4 * VARIABLE_ENTRY_SIZE) ) ) { - - pass2 = FALSE; - failure_mssg2 = "unexpected size/len in flush op eviction test 1."; - } - } - - if ( pass2 ) { - - /* Now set up the pinning relationships: - * - * Briefly, (VET, 0) is pinned by (VET, 1), (VET, 3), and (VET, 5) - * (VET, 9) is pinned by (VET, 5), and (VET, 7) - */ - create_pinned_entry_dependency2(file_ptr, VARIABLE_ENTRY_TYPE, 1, - VARIABLE_ENTRY_TYPE, 0); - create_pinned_entry_dependency2(file_ptr, VARIABLE_ENTRY_TYPE, 3, - VARIABLE_ENTRY_TYPE, 0); - create_pinned_entry_dependency2(file_ptr, VARIABLE_ENTRY_TYPE, 5, - VARIABLE_ENTRY_TYPE, 0); - create_pinned_entry_dependency2(file_ptr, VARIABLE_ENTRY_TYPE, 5, - VARIABLE_ENTRY_TYPE, 9); - create_pinned_entry_dependency2(file_ptr, VARIABLE_ENTRY_TYPE, 7, - VARIABLE_ENTRY_TYPE, 9); - - /* Next, set up the flush operations: - * - * Briefly, (VET, 1) dirties (VET, 0) - * resizes (VET, 0) to 3/4 VARIABLE_ENTRY_SIZE - * - * (VET, 3) dirties (VET, 0) - * resizes (VET, 0) to VARIABLE_ENTRY_SIZE - * renames (VET, 0) to its alternate address - * - * (VET, 5) dirties (VET, 0) - * resizes itself to VARIABLE_ENTRY_SIZE / 2 - * - * (VET, 7) dirties (VET, 9) - * - * (VET, 9) dirties (VET, 8) - */ - - add_flush_op2(VARIABLE_ENTRY_TYPE, 1, FLUSH_OP__DIRTY, - VARIABLE_ENTRY_TYPE, 0, FALSE, (size_t)0); - add_flush_op2(VARIABLE_ENTRY_TYPE, 1, FLUSH_OP__RESIZE, - VARIABLE_ENTRY_TYPE, 0, FALSE, - 3 * VARIABLE_ENTRY_SIZE / 4); - - add_flush_op2(VARIABLE_ENTRY_TYPE, 3, FLUSH_OP__DIRTY, - VARIABLE_ENTRY_TYPE, 0, FALSE, (size_t)0); - add_flush_op2(VARIABLE_ENTRY_TYPE, 3, FLUSH_OP__RESIZE, - VARIABLE_ENTRY_TYPE, 0, FALSE, VARIABLE_ENTRY_SIZE); - add_flush_op2(VARIABLE_ENTRY_TYPE, 3, FLUSH_OP__RENAME, - VARIABLE_ENTRY_TYPE, 0, FALSE, (size_t)0); - - add_flush_op2(VARIABLE_ENTRY_TYPE, 5, FLUSH_OP__DIRTY, - VARIABLE_ENTRY_TYPE, 0, FALSE, (size_t)0); - add_flush_op2(VARIABLE_ENTRY_TYPE, 5, FLUSH_OP__RESIZE, - VARIABLE_ENTRY_TYPE, 5, FALSE, VARIABLE_ENTRY_SIZE / 2); - - add_flush_op2(VARIABLE_ENTRY_TYPE, 7, FLUSH_OP__DIRTY, - VARIABLE_ENTRY_TYPE, 9, FALSE, (size_t)0); - - add_flush_op2(VARIABLE_ENTRY_TYPE, 9, FLUSH_OP__DIRTY, - VARIABLE_ENTRY_TYPE, 8, FALSE, (size_t)0); - } - - if ( pass2 ) { - - /* to summarize, at present the following variable size entries - * are in cache with the following characteristics: - * - * in - * entry: cache? size: dirty? pinned? pins: flush operations: - * - * (VET, 0) Y 2.5 KB Y Y - - - * - * (VET, 1) Y 2.5 KB Y N 0 dirty (VET, 0), - * resize (VET, 0) to 7.5 KB - * - * (VET, 2) Y 10 KB N N - - - * - * - * (VET, 3) Y 2.5 KB N N 0 dirty (VET, 0) - * resize (VET, 0) to 10 KB - * rename (VET, 0) to its alternate address - * - * (VET, 4) Y 10 KB N N - - - * - * - * (VET, 5) Y 2.5 KB Y N 0, 9 dirty (VET, 0) - * resize (VET, 5) to 5 KB - * - * (VET, 6) Y 5 KB Y N - - - * - * (VET, 7) Y 5 KB Y N 9 dirty (VET, 9) - * - * (VET, 8) Y 10 KB N N - - - * - * (VET, 9) Y 10 KB N N - dirty (VET, 8) - * - * Recall that in this test bed, flush operations are excuted the - * first time the associated entry is flushed, and are then - * deleted. - */ - - /* Now fill up the cache with other, unrelated entries */ - for ( i = 0; i < 31; i++ ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i); - unprotect_entry_with_size_change2(file_ptr, MONSTER_ENTRY_TYPE, i, - H5C2__DIRTIED_FLAG, (size_t)0); - } - - for ( i = 0; i < 1; i++ ) - { - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, i); - unprotect_entry_with_size_change2(file_ptr, LARGE_ENTRY_TYPE, i, - H5C2__DIRTIED_FLAG, (size_t)0); - } - - /* The cache should now be exactly full */ - if ( ( cache_ptr->index_len != 42 ) || - ( cache_ptr->index_size != 2 * 1024 * 1024 ) || - ( cache_ptr->index_size != ((4 * VARIABLE_ENTRY_SIZE / 4) + - (2 * VARIABLE_ENTRY_SIZE / 2) + - (4 * VARIABLE_ENTRY_SIZE) + - (31 * MONSTER_ENTRY_SIZE) + - (1 * LARGE_ENTRY_SIZE)) ) ) { - - pass2 = FALSE; - failure_mssg2 = "unexpected size/len in flush op eviction test 2."; - - } else { - - /* verify the expected status of all entries we have loaded to date: */ - num_large_entries = 1; - verify_entry_status2(cache_ptr, - 0, - (num_variable_entries + num_monster_entries + num_large_entries), - expected); - } - } - - - if ( pass2 ) { - - /* Now load a large entry. This should result in the eviction - * of (VET,2), and the increase in the size of (VET, 0) from .25 - * VARIABLE_ENTRY_SIZE to .75 VARIABLE_ENTRY_SIZE. - * - * The following table illustrates the intended state of affairs - * after the eviction: - * - * in - * entry: cache? size: dirty? pinned? pins: flush operations: - * - * (VET, 0) Y 7.5 KB Y Y - - - * - * (VET, 1) Y 2.5 KB N N - - - * - * (VET, 2) N 10 KB N N - - - * - * (VET, 3) Y 2.5 KB Y N 0 dirty (VET, 0) - * resize (VET, 0) to 10 KB - * rename (VET, 0) to its alternate address - * - * (VET, 4) Y 10 KB N N - - - * - * (VET, 5) Y 2.5 KB Y N 0, 9 dirty (VET, 0) - * resize (VET, 5) to 5 KB - * - * (VET, 6) Y 5 KB Y N - - - * - * (VET, 7) Y 5 KB Y N 9 dirty (VET, 9) - * - * (VET, 8) Y 10 KB N N - - - * - * (VET, 9) Y 10 KB N Y - dirty (VET, 8) - * - * Start by updating the expected table for the expected changes in entry status: - */ - expected[0].size = 3 * VARIABLE_ENTRY_SIZE / 4; - expected[1].is_dirty = FALSE; - expected[1].serialized = TRUE; - expected[2].in_cache = FALSE; - expected[2].destroyed = TRUE; - - num_large_entries = 2; - - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, 1); - unprotect_entry_with_size_change2(file_ptr, LARGE_ENTRY_TYPE, 1, - H5C2__DIRTIED_FLAG, (size_t)0); - - if ( ( cache_ptr->index_len != 42 ) || - ( cache_ptr->index_size != (2 * 1024 * 1024) - - (VARIABLE_ENTRY_SIZE) + - (VARIABLE_ENTRY_SIZE / 2) + - (LARGE_ENTRY_SIZE) ) || - ( cache_ptr->index_size != ((1 * (3 * VARIABLE_ENTRY_SIZE / 4)) + - (3 * VARIABLE_ENTRY_SIZE / 4) + - (2 * VARIABLE_ENTRY_SIZE / 2) + - (3 * VARIABLE_ENTRY_SIZE) + - (31 * MONSTER_ENTRY_SIZE) + - (2 * LARGE_ENTRY_SIZE)) ) ) { - pass2 = FALSE; - failure_mssg2 = "unexpected size/len in flush op eviction test 3."; - } - - /* verify entry status */ - verify_entry_status2(cache_ptr, - 1, - (num_variable_entries + num_monster_entries + num_large_entries), - expected); - } - - if ( pass2 ) { - - /* Now load another large entry. This should result in the eviction - * of (VET, 4), the increase in the size of (VET, 0) from .75 - * VARIABLE_ENTRY_SIZE to 1.0 VARIABLE_ENTRY_SIZE, and the renaming - * of (VET, 0) to its alternate address. - * - * The following table shows the expected states of the variable - * size entries after the test. - * - * in - * entry: cache? size: dirty? pinned? pins: flush operations: - * - * (VET, 0) Y 10 KB Y Y - - - * - * (VET, 1) Y 2.5 KB N N - - - * - * (VET, 2) N 10 KB N N - - - * - * (VET, 3) Y 2.5 KB N N - - - * - * (VET, 4) N 10 KB N N - - - * - * (VET, 5) Y 2.5 KB Y N 0, 9 dirty (VET, 0) - * resize (VET, 5) to 5 KB - * - * (VET, 6) Y 5 KB Y N - - - * - * (VET, 7) Y 5 KB Y N 9 dirty (VET, 9) - * - * (VET, 8) Y 10 KB N N - - - * - * (VET, 9) Y 10 KB N Y - dirty (VET, 8) - * - * Start by updating the expected table for the expected changes in entry status: - */ - expected[0].size = VARIABLE_ENTRY_SIZE; - expected[0].at_main_addr = FALSE; - expected[3].is_dirty = FALSE; - expected[3].serialized = TRUE; - expected[4].in_cache = FALSE; - expected[4].destroyed = TRUE; - - num_large_entries = 3; - - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, 2); - unprotect_entry_with_size_change2(file_ptr, LARGE_ENTRY_TYPE, 2, - H5C2__DIRTIED_FLAG, (size_t)0); - - if ( ( cache_ptr->index_len != 42 ) || - ( cache_ptr->index_size != (2 * 1024 * 1024) - - (2 * VARIABLE_ENTRY_SIZE) + - (3 * VARIABLE_ENTRY_SIZE / 4) + - (2 * LARGE_ENTRY_SIZE) ) || - ( cache_ptr->index_size != ((3 * VARIABLE_ENTRY_SIZE / 4) + - (2 * VARIABLE_ENTRY_SIZE / 2) + - (3 * VARIABLE_ENTRY_SIZE) + - (31 * MONSTER_ENTRY_SIZE) + - (3 * LARGE_ENTRY_SIZE)) ) ) { - - pass2 = FALSE; - failure_mssg2 = "unexpected size/len in flush op eviction test 4."; - } - - /* verify entry status */ - verify_entry_status2(cache_ptr, - 2, - (num_variable_entries + num_monster_entries + num_large_entries), - expected); - } - - if ( pass2 ) { - - /* load two more large entries. This should result in (VET, 5) being - * flushed, and increasing its size from 1/4 VARIABLE_ENTRY_SIZE to - * VARIABLE_ENTRY_SIZE. - * - * As a result of this size increase, the cache will have to look - * for another entry to evict. After flushing (VET, 6) and (VET, 7), - * it should evict (VET, 8), yielding the needed memory and dirtying - * (VET, 9). - * - * The following table shows the expected states of the variable - * size entries after the test. - * - * in - * entry: cache? size: dirty? pinned? pins: flush operations: - * - * (VET, 0) Y 10 KB Y Y - - - * - * (VET, 1) Y 2.5 KB N N - - - * - * (VET, 2) N 10 KB N N - - - * - * (VET, 3) Y 2.5 KB N N - - - * - * (VET, 4) N 10 KB N N - - - * - * (VET, 5) Y 5 KB N N 0, 9 - - * - * (VET, 6) Y 5 KB N N - - - * - * (VET, 7) Y 5 KB N N 9 - - * - * (VET, 8) N 10 KB N N - - - * - * (VET, 9) Y 10 KB N Y - dirty (VET, 8) - * - * Start by updating the expected table for the expected changes in entry status: - */ - - expected[5].size = VARIABLE_ENTRY_SIZE / 2; - expected[5].is_dirty = FALSE; - expected[5].serialized = TRUE; - expected[6].is_dirty = FALSE; - expected[6].serialized = TRUE; - expected[7].is_dirty = FALSE; - expected[7].serialized = TRUE; - expected[8].in_cache = FALSE; - expected[8].destroyed = TRUE; - expected[9].is_dirty = TRUE; - - num_large_entries = 5; - - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, 3); - unprotect_entry_with_size_change2(file_ptr, LARGE_ENTRY_TYPE, 3, - H5C2__DIRTIED_FLAG, (size_t)0); - - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, 4); - unprotect_entry_with_size_change2(file_ptr, LARGE_ENTRY_TYPE, 4, - H5C2__DIRTIED_FLAG, (size_t)0); - - /* verify cache size */ - if ( ( cache_ptr->index_len != 43 ) || - ( cache_ptr->index_size != (2 * 1024 * 1024) - - (3 * VARIABLE_ENTRY_SIZE) + - (1 * VARIABLE_ENTRY_SIZE / 4) + - (3 * VARIABLE_ENTRY_SIZE / 4) + - (4 * LARGE_ENTRY_SIZE) ) || - ( cache_ptr->index_size != ((2 * VARIABLE_ENTRY_SIZE / 4) + - (3 * VARIABLE_ENTRY_SIZE / 2) + - (2 * VARIABLE_ENTRY_SIZE) + - (31 * MONSTER_ENTRY_SIZE) + - (5 * LARGE_ENTRY_SIZE)) ) ) { - - pass2 = FALSE; - failure_mssg2 = "unexpected size/len in flush op eviction test 5."; - } - - /* verify entry status */ - verify_entry_status2(cache_ptr, - 3, - (num_variable_entries + num_monster_entries + num_large_entries), - expected); - } - - if ( pass2 ) { - - /* now touch all the non VARIABLE_ENTRY_TYPE entries in the - * cache to bring all the VARIABLE_ENTRY_TYPE entries to the - * end of the LRU list. - * - * Note that we don't have to worry about (VET, 0) and (VET, 9) - * as they are pinned and thus not in the LRU list to begin with. - */ - for ( i = 0; i < 31; i++ ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i); - unprotect_entry_with_size_change2(file_ptr, MONSTER_ENTRY_TYPE, i, - H5C2__DIRTIED_FLAG, (size_t)0); - } - - for ( i = 0; i < 5; i++ ) - { - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, i); - unprotect_entry_with_size_change2(file_ptr, LARGE_ENTRY_TYPE, i, - H5C2__DIRTIED_FLAG, (size_t)0); - } - - /* verify cache size */ - if ( ( cache_ptr->index_len != 43 ) || - ( cache_ptr->index_size != (2 * 1024 * 1024) - - (3 * VARIABLE_ENTRY_SIZE) + - (1 * VARIABLE_ENTRY_SIZE / 4) + - (3 * VARIABLE_ENTRY_SIZE / 4) + - (4 * LARGE_ENTRY_SIZE) ) || - ( cache_ptr->index_size != ((2 * VARIABLE_ENTRY_SIZE / 4) + - (3 * VARIABLE_ENTRY_SIZE / 2) + - (2 * VARIABLE_ENTRY_SIZE) + - (31 * MONSTER_ENTRY_SIZE) + - (5 * LARGE_ENTRY_SIZE)) ) ) { - - pass2 = FALSE; - failure_mssg2 = "unexpected size/len in flush op eviction test 6."; - } - - /* verify entry status */ - verify_entry_status2(cache_ptr, - 4, - (num_variable_entries + num_monster_entries + num_large_entries), - expected); - } - - if ( pass2 ) { - - /* Now load three more large entries. This should result - * in the evictions of (VET, 1), (VET, 3), and (VET, 5), and the - * unpinning of (VET, 0) - * - * The following table shows the expected states of the variable - * size entries after the test. - * - * in - * entry: cache? size: dirty? pinned? pins: flush operations: - * - * (VET, 0) Y 10 KB Y N - - - * - * (VET, 1) N 2.5 KB N N - - - * - * (VET, 2) N 10 KB N N - - - * - * (VET, 3) N 2.5 KB N N - - - * - * (VET, 4) N 10 KB N N - - - * - * (VET, 5) N 5 KB N N - - - * - * (VET, 6) Y 5 KB N N - - - * - * (VET, 7) Y 5 KB N N 9 - - * - * (VET, 8) N 10 KB N N - - - * - * (VET, 9) Y 10 KB N Y - dirty (VET, 8) - * - * Start by updating the expected table for the expected changes in entry status: - */ - - expected[0].is_pinned = FALSE; - expected[1].in_cache = FALSE; - expected[1].destroyed = TRUE; - expected[3].in_cache = FALSE; - expected[3].destroyed = TRUE; - expected[5].in_cache = FALSE; - expected[5].destroyed = TRUE; - - num_large_entries = 8; - - for ( i = 5; i < 8; i++ ) - { - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, i); - unprotect_entry_with_size_change2(file_ptr, LARGE_ENTRY_TYPE, i, - H5C2__DIRTIED_FLAG, (size_t)0); - } - - /* verify cache size */ - if ( ( cache_ptr->index_len != 43 ) || - ( cache_ptr->index_size != (2 * 1024 * 1024) - - (4 * VARIABLE_ENTRY_SIZE) + - (1 * VARIABLE_ENTRY_SIZE / 4) + - (3 * VARIABLE_ENTRY_SIZE / 4) + - (7 * LARGE_ENTRY_SIZE) ) || - ( cache_ptr->index_size != ((2 * VARIABLE_ENTRY_SIZE / 2) + - (2 * VARIABLE_ENTRY_SIZE) + - (31 * MONSTER_ENTRY_SIZE) + - (8 * LARGE_ENTRY_SIZE)) ) ) { - - pass2 = FALSE; - failure_mssg2 = "unexpected size/len in flush op eviction test 7."; - } - - /* verify entry status */ - verify_entry_status2(cache_ptr, - 5, - (num_variable_entries + num_monster_entries + num_large_entries), - expected); - } - - if ( pass2 ) { - - /* load another large entry. (VET, 6) should be evicted. - * - * The following table shows the expected states of the variable - * size entries after the test. - * - * in - * entry: cache? size: dirty? pinned? pins: flush operations: - * - * (VET, 0) Y 10 KB Y N - - - * - * (VET, 1) N 2.5 KB N N - - - * - * (VET, 2) N 10 KB N N - - - * - * (VET, 3) N 2.5 KB N N - - - * - * (VET, 4) N 10 KB N N - - - * - * (VET, 5) N 5 KB N N - - - * - * (VET, 6) N 5 KB N N - - - * - * (VET, 7) Y 5 KB N N 9 - - * - * (VET, 8) N 10 KB N N - - - * - * (VET, 9) Y 10 KB N Y - dirty (VET, 8) - * - * Start by updating the expected table for the expected changes in entry status: - */ - - expected[6].in_cache = FALSE; - expected[6].destroyed = TRUE; - - num_large_entries = 9; - - for ( i = 8; i < 9; i++ ) - { - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, i); - unprotect_entry_with_size_change2(file_ptr, LARGE_ENTRY_TYPE, i, - H5C2__DIRTIED_FLAG, (size_t)0); - } - - /* verify cache size */ - if ( ( cache_ptr->index_len != 43 ) || - ( cache_ptr->index_size != (2 * 1024 * 1024) - - (3 * VARIABLE_ENTRY_SIZE) - - (VARIABLE_ENTRY_SIZE / 2) + - (8 * LARGE_ENTRY_SIZE) ) || - ( cache_ptr->index_size != ((1 * VARIABLE_ENTRY_SIZE / 2) + - (2 * VARIABLE_ENTRY_SIZE) + - (31 * MONSTER_ENTRY_SIZE) + - (9 * LARGE_ENTRY_SIZE)) ) ) { - - pass2 = FALSE; - failure_mssg2 = "unexpected size/len in flush op eviction test 8."; - } - - /* verify entry status */ - verify_entry_status2(cache_ptr, - 6, - (num_variable_entries + num_monster_entries + num_large_entries), - expected); - } - - if ( pass2 ) { - - /* Load another large entry. - * - * (VET, 7) should be evicted, and (VET, 9) should be unpinned. - * - * The following table shows the expected states of the variable - * size entries after the test. - * - * in - * entry: cache? size: dirty? pinned? pins: flush operations: - * - * (VET, 0) Y 10 KB Y N - - - * - * (VET, 1) N 2.5 KB N N - - - * - * (VET, 2) N 10 KB N N - - - * - * (VET, 3) N 2.5 KB N N - - - * - * (VET, 4) N 10 KB N N - - - * - * (VET, 5) N 5 KB N N - - - * - * (VET, 6) N 5 KB N N - - - * - * (VET, 7) N 5 KB N N - - - * - * (VET, 8) N 10 KB N N - - - * - * (VET, 9) Y 10 KB Y N - dirty (VET, 8) - * - * Start by updating the expected table for the expected changes in entry status: - */ - - expected[7].in_cache = FALSE; - expected[7].destroyed = TRUE; - expected[9].is_pinned = FALSE; - - num_large_entries = 10; - - for ( i = 9; i < 10; i++ ) - { - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, i); - unprotect_entry_with_size_change2(file_ptr, LARGE_ENTRY_TYPE, i, - H5C2__DIRTIED_FLAG, (size_t)0); - } - - /* verify cache size */ - if ( ( cache_ptr->index_len != 43 ) || - ( cache_ptr->index_size != (2 * 1024 * 1024) - - (4 * VARIABLE_ENTRY_SIZE) + - (9 * LARGE_ENTRY_SIZE) ) || - ( cache_ptr->index_size != ((2 * VARIABLE_ENTRY_SIZE) + - (31 * MONSTER_ENTRY_SIZE) + - (10 * LARGE_ENTRY_SIZE)) ) ) { - - pass2 = FALSE; - failure_mssg2 = "unexpected size/len in flush op eviction test 9."; - } - - /* verify entry status */ - verify_entry_status2(cache_ptr, - 7, - (num_variable_entries + num_monster_entries + num_large_entries), - expected); - } - - if ( pass2 ) { - - /* Again, touch all the non VARIABLE_ENTRY_TYPE entries in the - * cache to bring all the VARIABLE_ENTRY_TYPE entries to the - * end of the LRU list. - * - * Both (VET, 0) and (VET, 7) have been unpinned, so they are - * now in the LRU list. - */ - for ( i = 0; i < 31; i++ ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i); - unprotect_entry_with_size_change2(file_ptr, MONSTER_ENTRY_TYPE, i, - H5C2__DIRTIED_FLAG, (size_t)0); - } - - for ( i = 0; i < 10; i++ ) - { - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, i); - unprotect_entry_with_size_change2(file_ptr, LARGE_ENTRY_TYPE, i, - H5C2__DIRTIED_FLAG, (size_t)0); - } - - /* verify cache size */ - if ( ( cache_ptr->index_len != 43 ) || - ( cache_ptr->index_size != (2 * 1024 * 1024) - - (4 * VARIABLE_ENTRY_SIZE) + - (9 * LARGE_ENTRY_SIZE) ) || - ( cache_ptr->index_size != ((2 * VARIABLE_ENTRY_SIZE) + - (31 * MONSTER_ENTRY_SIZE) + - (10 * LARGE_ENTRY_SIZE)) ) ) { - - pass2 = FALSE; - failure_mssg2 = "unexpected size/len in flush op eviction test 10."; - } - - /* verify entry status */ - verify_entry_status2(cache_ptr, - 8, - (num_variable_entries + num_monster_entries + num_large_entries), - expected); - } - - if ( pass2 ) { - - /* load two more large entries. Things get a bit complicated here, - * so I'll go through the operation step by step. - * - * Initially, the cache has 4 KB of empty space, so the first entry - * (LET, 10) is loaded via calls to H5C2_protect() H5C2_unprotect() - * without causing any evictions. - * - * However, this is not the case for the call of H5C2_protect() on - * (LET, 11). - * - * Before inserting (LET, 11), H5C2_protect(LET, 11) must try to - * free up at least 4 KB of space. To do this, it starts scanning - * up the LRU list to find entries to evict. - * - * (VET, 0) is at the bottom of the LRU list, and thus is the first - * entry considered. However, it is dirty, so it is moved to the - * top of the LRU list, flushed to disk, and marked clean. - * - * (VET, 9) is the next entry on the bottom of the LRU list. It is - * dirty too, so the cache moves it to the top of the LRU list, - * and calls its serialize callback function to construct an on - * disk image of the entry. - * - * However, this serialize function needs to modify (VET, 8), which - * is currently not in cache. Thus it calls H5C2_protect(VET, 8) - * to gain access to it. H5C2_protect(VET, 8) loads (VET, 8), and - * then attempts to evict entries to make space for it. (VET, 9) - * has already been moved to the head of the LRU list, so the next - * entries on the LRU are (MET, 0) thru (MET, 30) and (LET, 0) thru - * (LET, 10) -- all of which are dirty, and are therefore flushed - * and moved to the head of the LRU list. - * - * The next entry on the bottom of the LRU list is (VET, 0), which - * is clean, and is therefore evicted to make space for (VET, 8). - * This space is sufficient, so H5C2_protect(VET, 8) inserts - * (VET, 8) into the cache's index, marks it as protected, and - * returns to the serialize function for (VET, 9). - * - * When the serialize function for (VET, 9) is done with (VET, 8), it - * calls H5C2_unprotect(VET, 8), which markes (VET, 8) as dirty and - * unprotected, and places it at the head of the LRU. - * - * The serialize function for (VET, 9) then returns, and (VET, 9) is - * is written to disk, and marked clean. - * - * At this point, the cache is still full (since (VET, 8) took the - * space created by the eviction of (VET, 0)). Thus - * H5C2_protect(LET, 11) continues to look for space. While - * (MET, 0) was the next item on the LRU list when it called the - * serialize function for (VET, 9), the function notices that the - * LRU has been modified, and restarts its search for candidates - * for eviction at the bottom of the LRU. - * - * (VET, 0) is now at the bottom of the LRU, and is clean. Thus - * it is evicted. This makes sufficient space for (LET, 11), so - * H5C2_protect(LET, 11) inserts it into the cache, marks it as - * protected, and returns. - * - * H5C2_unprotect(VET, 11) marks (VET, 11) as unprotected, and then - * returns as well. - * - * The following table shows the expected states of the variable - * size entries after the test. - * - * in - * entry: cache? size: dirty? pinned? pins: flush operations: - * - * (VET, 0) N 10 KB N N - - - * - * (VET, 1) N 2.5 KB N N - - - * - * (VET, 2) N 10 KB N N - - - * - * (VET, 3) N 2.5 KB N N - - - * - * (VET, 4) N 10 KB N N - - - * - * (VET, 5) N 5 KB N N - - - * - * (VET, 6) N 5 KB N N - - - * - * (VET, 7) N 5 KB N N - - - * - * (VET, 8) Y 10 KB Y N - - - * - * (VET, 9) N 10 KB N N - - - * - * Start by updating the expected table for the expected changes in - * entry status: - * - * Note that we reset the loaded, cleared, flushed, and destroyed - * fields of (VET,8) so we can track what is happening. - */ - base_addr = entries2[VARIABLE_ENTRY_TYPE]; - entry_ptr = &(base_addr[8]); - entry_ptr->deserialized = FALSE; - entry_ptr->cleared = FALSE; - entry_ptr->deserialized = FALSE; - entry_ptr->destroyed = FALSE; - - expected[0].in_cache = FALSE; - expected[0].is_dirty = FALSE; - expected[0].serialized = TRUE; - expected[0].destroyed = TRUE; - expected[8].in_cache = TRUE; - expected[8].is_dirty = TRUE; - expected[8].deserialized = TRUE; - expected[8].serialized = FALSE; - expected[8].destroyed = FALSE; - expected[9].in_cache = FALSE; - expected[9].is_dirty = FALSE; - expected[9].serialized = TRUE; - expected[9].destroyed = TRUE; - - num_large_entries = 12; - - /* a newly loaded entry is not inserted in the cache until after - * space has been made for it. Thus (LET, 11) will not be flushed. - */ - for ( i = num_variable_entries; - i < num_variable_entries + num_monster_entries + num_large_entries - 1; - i++ ) - { - expected[i].is_dirty = FALSE; - expected[i].serialized = TRUE; - } - - for ( i = 10; i < 12; i++ ) - { - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, i); - unprotect_entry_with_size_change2(file_ptr, LARGE_ENTRY_TYPE, i, - H5C2__DIRTIED_FLAG, (size_t)0); - } - - /* verify cache size */ - if ( ( cache_ptr->index_len != 44 ) || - ( cache_ptr->index_size != (2 * 1024 * 1024) - - (5 * VARIABLE_ENTRY_SIZE) + - (11 * LARGE_ENTRY_SIZE) ) || - ( cache_ptr->index_size != ((1 * VARIABLE_ENTRY_SIZE) + - (31 * MONSTER_ENTRY_SIZE) + - (12 * LARGE_ENTRY_SIZE)) ) ) { - - pass2 = FALSE; - failure_mssg2 = "unexpected size/len in flush op eviction test 11."; - } - - /* verify entry status */ - verify_entry_status2(cache_ptr, - 9, - (num_variable_entries + num_monster_entries + num_large_entries), - expected); - } - - if ( pass2 ) { - - /* Again, touch all the non VARIABLE_ENTRY_TYPE entries in the - * cache to bring the last remaining VARIABLE_ENTRY_TYPE entry to the - * end of the LRU list. - */ - for ( i = 0; i < num_monster_entries; i++ ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i); - unprotect_entry_with_size_change2(file_ptr, MONSTER_ENTRY_TYPE, i, - H5C2__DIRTIED_FLAG, (size_t)0); - } - - for ( i = 0; i < num_large_entries; i++ ) - { - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, i); - unprotect_entry_with_size_change2(file_ptr, LARGE_ENTRY_TYPE, i, - H5C2__DIRTIED_FLAG, (size_t)0); - } - - /* update the expected array to mark all these entries dirty again. */ - for ( i = num_variable_entries; - i < num_variable_entries + num_monster_entries + num_large_entries - 1; - i++ ) - { - expected[i].is_dirty = TRUE; - } - - /* verify cache size */ - if ( ( cache_ptr->index_len != 44 ) || - ( cache_ptr->index_size != (2 * 1024 * 1024) - - (5 * VARIABLE_ENTRY_SIZE) + - (11 * LARGE_ENTRY_SIZE) ) || - ( cache_ptr->index_size != ((1 * VARIABLE_ENTRY_SIZE) + - (31 * MONSTER_ENTRY_SIZE) + - (12 * LARGE_ENTRY_SIZE)) ) ) { - - pass2 = FALSE; - failure_mssg2 = "unexpected size/len in flush op eviction test 12."; - } - - /* verify entry status */ - verify_entry_status2(cache_ptr, - 10, - (num_variable_entries + num_monster_entries + num_large_entries), - expected); - } - - if ( pass2 ) { - - /* Load two more large entries. - * - * Since (VET, 8) is dirty, at first this will just cause (VET, 8) - * to be flushed. - * - * But all other entries in the cache are dirty, so the cache will - * flush them all, and then evict (VET, 8) on the second pass. - * - * The following table shows the expected states of the variable - * size entries after the test. - * - * in - * entry: cache? size: dirty? pinned? pins: flush operations: - * - * (VET, 0) N 10 KB N N - - - * - * (VET, 1) N 2.5 KB N N - - - * - * (VET, 2) N 10 KB N N - - - * - * (VET, 3) N 2.5 KB N N - - - * - * (VET, 4) N 10 KB N N - - - * - * (VET, 5) N 5 KB N N - - - * - * (VET, 6) N 5 KB N N - - - * - * (VET, 7) N 5 KB N N - - - * - * (VET, 8) N 10 KB N N - - - * - * (VET, 9) N 10 KB N N - - - * - * Start by updating the expected table for the expected changes in - * entry status: - */ - - expected[8].in_cache = FALSE; - expected[8].is_dirty = FALSE; - expected[8].serialized = TRUE; - expected[8].destroyed = TRUE; - - num_large_entries = 14; - - /* a newly loaded entry is not inserted in the cache until after - * space has been made for it. Thus (LET, 13) will not be flushed. - */ - for ( i = num_variable_entries; - i < num_variable_entries + num_monster_entries + num_large_entries - 1; - i++ ) - { - expected[i].is_dirty = FALSE; - expected[i].serialized = TRUE; - } - - for ( i = 12; i < 14; i++ ) - { - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, i); - unprotect_entry_with_size_change2(file_ptr, LARGE_ENTRY_TYPE, i, - H5C2__DIRTIED_FLAG, (size_t)0); - } - - /* verify cache size */ - if ( ( cache_ptr->index_len != 45 ) || - ( cache_ptr->index_size != (2 * 1024 * 1024) - - (6 * VARIABLE_ENTRY_SIZE) + - (13 * LARGE_ENTRY_SIZE) ) || - ( cache_ptr->index_size != ((31 * MONSTER_ENTRY_SIZE) + - (14 * LARGE_ENTRY_SIZE)) ) ) { - - pass2 = FALSE; - failure_mssg2 = "unexpected size/len in flush op eviction test 13."; - } - - /* verify entry status */ - verify_entry_status2(cache_ptr, - 11, - (num_variable_entries + num_monster_entries + num_large_entries), - expected); - } - - /* at this point we have cycled all the variable size entries through - * the cache. - * - * flush the cache and end the test. - */ - - if ( pass2 ) { - - result = H5C2_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, - H5C2__FLUSH_INVALIDATE_FLAG); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "Cache flush invalidate failed after flush op eviction test"; - } - else if ( ( cache_ptr->index_len != 0 ) || - ( cache_ptr->index_size != 0 ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache len/size after cleanup of flush op eviction test"; - - } - } - -#if H5C2_COLLECT_CACHE_STATS - /* If we are collecting stats, check to see if we get the expected - * values. - * - * Testing the stats code is fairly new, but given the extent - * to which I find myself depending on the stats, I've decided - * to start testing the stats whenever it is convenient to do - * so. - */ - - if ( pass2 ) { - - if ( ( cache_ptr->insertions[VARIABLE_ENTRY_TYPE] != 0 ) || - ( cache_ptr->pinned_insertions[VARIABLE_ENTRY_TYPE] != 0 ) || - ( cache_ptr->clears[VARIABLE_ENTRY_TYPE] != 0 ) || - ( cache_ptr->flushes[VARIABLE_ENTRY_TYPE] != 19 ) || - ( cache_ptr->evictions[VARIABLE_ENTRY_TYPE] != 11 ) || - ( cache_ptr->renames[VARIABLE_ENTRY_TYPE] != 1 ) || - ( cache_ptr->entry_flush_renames[VARIABLE_ENTRY_TYPE] != 0 ) || - ( cache_ptr->cache_flush_renames[VARIABLE_ENTRY_TYPE] != 0 ) || - ( cache_ptr->pins[VARIABLE_ENTRY_TYPE] != 2 ) || - ( cache_ptr->unpins[VARIABLE_ENTRY_TYPE] != 2 ) || - ( cache_ptr->dirty_pins[VARIABLE_ENTRY_TYPE] != 0 ) || - ( cache_ptr->pinned_flushes[VARIABLE_ENTRY_TYPE] != 0 ) || - ( cache_ptr->pinned_clears[VARIABLE_ENTRY_TYPE] != 0 ) || - ( cache_ptr->size_increases[VARIABLE_ENTRY_TYPE] != 3 ) || - ( cache_ptr->size_decreases[VARIABLE_ENTRY_TYPE] != 6 ) || - ( cache_ptr->entry_flush_size_changes[VARIABLE_ENTRY_TYPE] != 1 ) || - ( cache_ptr->cache_flush_size_changes[VARIABLE_ENTRY_TYPE] != 0 ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected variable size entry stats."; - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->insertions[LARGE_ENTRY_TYPE] != 0 ) || - ( cache_ptr->pinned_insertions[LARGE_ENTRY_TYPE] != 0 ) || - ( cache_ptr->clears[LARGE_ENTRY_TYPE] != 0 ) || - ( cache_ptr->flushes[LARGE_ENTRY_TYPE] != 38 ) || - ( cache_ptr->evictions[LARGE_ENTRY_TYPE] != 14 ) || - ( cache_ptr->renames[LARGE_ENTRY_TYPE] != 0 ) || - ( cache_ptr->entry_flush_renames[LARGE_ENTRY_TYPE] != 0 ) || - ( cache_ptr->cache_flush_renames[LARGE_ENTRY_TYPE] != 0 ) || - ( cache_ptr->pins[LARGE_ENTRY_TYPE] != 0 ) || - ( cache_ptr->unpins[LARGE_ENTRY_TYPE] != 0 ) || - ( cache_ptr->dirty_pins[LARGE_ENTRY_TYPE] != 0 ) || - ( cache_ptr->pinned_flushes[LARGE_ENTRY_TYPE] != 0 ) || - ( cache_ptr->pinned_clears[LARGE_ENTRY_TYPE] != 0 ) || - ( cache_ptr->size_increases[LARGE_ENTRY_TYPE] != 0 ) || - ( cache_ptr->size_decreases[LARGE_ENTRY_TYPE] != 0 ) || - ( cache_ptr->entry_flush_size_changes[LARGE_ENTRY_TYPE] != 0 ) || - ( cache_ptr->cache_flush_size_changes[LARGE_ENTRY_TYPE] != 0 ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected monster entry stats."; - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->insertions[MONSTER_ENTRY_TYPE] != 0 ) || - ( cache_ptr->pinned_insertions[MONSTER_ENTRY_TYPE] != 0 ) || - ( cache_ptr->clears[MONSTER_ENTRY_TYPE] != 0 ) || - ( cache_ptr->flushes[MONSTER_ENTRY_TYPE] != 93 ) || - ( cache_ptr->evictions[MONSTER_ENTRY_TYPE] != 31 ) || - ( cache_ptr->renames[MONSTER_ENTRY_TYPE] != 0 ) || - ( cache_ptr->entry_flush_renames[MONSTER_ENTRY_TYPE] != 0 ) || - ( cache_ptr->cache_flush_renames[MONSTER_ENTRY_TYPE] != 0 ) || - ( cache_ptr->pins[MONSTER_ENTRY_TYPE] != 0 ) || - ( cache_ptr->unpins[MONSTER_ENTRY_TYPE] != 0 ) || - ( cache_ptr->dirty_pins[MONSTER_ENTRY_TYPE] != 0 ) || - ( cache_ptr->pinned_flushes[MONSTER_ENTRY_TYPE] != 0 ) || - ( cache_ptr->pinned_clears[MONSTER_ENTRY_TYPE] != 0 ) || - ( cache_ptr->size_increases[MONSTER_ENTRY_TYPE] != 0 ) || - ( cache_ptr->size_decreases[MONSTER_ENTRY_TYPE] != 0 ) || - ( cache_ptr->entry_flush_size_changes[MONSTER_ENTRY_TYPE] != 0 ) || - ( cache_ptr->cache_flush_size_changes[MONSTER_ENTRY_TYPE] != 0 ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected monster entry stats."; - } - } -#endif /* H5C2_COLLECT_CACHE_STATS */ - - if ( pass2 ) { - - reset_entries2(); - } - - return; - -} /* check_flush_cache__flush_op_eviction_test() */ - - -/*------------------------------------------------------------------------- - * Function: check_flush_cache__single_entry() - * - * Purpose: Verify that flush_cache behaves as expected when the cache - * contains only one element. - * - * Return: void - * - * Programmer: John Mainzer - * 1/12/05 - * - * Modifications: - * - * JRM -- 3/29/06 - * Added tests for pinned entries. - * - * JRM -- 5/17/06 - * Complete reqrite of pinned entry tests to accomodate - * the new H5C2_mark_pinned_or_protected_entry_dirty() - * call. - * - *------------------------------------------------------------------------- - */ - -static void -check_flush_cache__single_entry(H5F_t * file_ptr) -{ - /* const char * fcn_name = "check_flush_cache__single_entry"; */ - H5C2_t * cache_ptr = file_ptr->shared->cache2; - - if ( cache_ptr == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "cache_ptr NULL on entry to single entry case."; - } - else if ( ( cache_ptr->index_len != 0 ) || - ( cache_ptr->index_size != 0 ) ) { - - pass2 = FALSE; - failure_mssg2 = "cache not empty at beginning of single entry case."; - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 1, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ FALSE, - /* dirty_flag */ FALSE, - /* flags */ H5C2__NO_FLAGS_SET, - /* flush_flags */ H5C2__NO_FLAGS_SET, - /* expected_deserialized */ TRUE, - /* expected_cleared */ FALSE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ FALSE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 2, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ FALSE, - /* dirty_flag */ TRUE, - /* flags */ H5C2__NO_FLAGS_SET, - /* flush_flags */ H5C2__NO_FLAGS_SET, - /* expected_deserialized */ TRUE, - /* expected_cleared */ FALSE, - /* expected_serialized */ TRUE, - /* expected_destroyed */ FALSE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 3, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ FALSE, - /* dirty_flag */ FALSE, - /* flags */ H5C2__NO_FLAGS_SET, - /* flush_flags */ H5C2__FLUSH_CLEAR_ONLY_FLAG, - /* expected_deserialized */ TRUE, - /* expected_cleared */ FALSE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ FALSE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 4, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ FALSE, - /* dirty_flag */ TRUE, - /* flags */ H5C2__NO_FLAGS_SET, - /* flush_flags */ H5C2__FLUSH_CLEAR_ONLY_FLAG, - /* expected_deserialized */ TRUE, - /* expected_cleared */ TRUE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ FALSE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 5, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ FALSE, - /* dirty_flag */ FALSE, - /* flags */ H5C2__NO_FLAGS_SET, - /* flush_flags */ H5C2__FLUSH_INVALIDATE_FLAG, - /* expected_deserialized */ TRUE, - /* expected_cleared */ FALSE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ TRUE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 6, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ FALSE, - /* dirty_flag */ TRUE, - /* flags */ H5C2__NO_FLAGS_SET, - /* flush_flags */ H5C2__FLUSH_INVALIDATE_FLAG, - /* expected_deserialized */ TRUE, - /* expected_cleared */ FALSE, - /* expected_serialized */ TRUE, - /* expected_destroyed */ TRUE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 7, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ FALSE, - /* dirty_flag */ FALSE, - /* flags */ H5C2__NO_FLAGS_SET, - /* flush_flags */ H5C2__FLUSH_MARKED_ENTRIES_FLAG, - /* expected_deserialized */ TRUE, - /* expected_cleared */ FALSE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ FALSE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 8, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ FALSE, - /* dirty_flag */ TRUE, - /* flags */ H5C2__NO_FLAGS_SET, - /* flush_flags */ H5C2__FLUSH_MARKED_ENTRIES_FLAG, - /* expected_deserialized */ TRUE, - /* expected_cleared */ FALSE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ FALSE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 9, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ FALSE, - /* dirty_flag */ FALSE, - /* flags */ H5C2__NO_FLAGS_SET, - /* flush_flags */ H5C2__FLUSH_INVALIDATE_FLAG | - H5C2__FLUSH_CLEAR_ONLY_FLAG, - /* expected_deserialized */ TRUE, - /* expected_cleared */ FALSE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ TRUE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 10, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ FALSE, - /* dirty_flag */ TRUE, - /* flags */ H5C2__NO_FLAGS_SET, - /* flush_flags */ H5C2__FLUSH_INVALIDATE_FLAG | - H5C2__FLUSH_CLEAR_ONLY_FLAG, - /* expected_deserialized */ TRUE, - /* expected_cleared */ TRUE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ TRUE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 11, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ FALSE, - /* dirty_flag */ FALSE, - /* flags */ H5C2__NO_FLAGS_SET, - /* flush_flags */ H5C2__FLUSH_MARKED_ENTRIES_FLAG | - H5C2__FLUSH_CLEAR_ONLY_FLAG, - /* expected_deserialized */ TRUE, - /* expected_cleared */ FALSE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ FALSE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 12, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ FALSE, - /* dirty_flag */ TRUE, - /* flags */ H5C2__NO_FLAGS_SET, - /* flush_flags */ H5C2__FLUSH_MARKED_ENTRIES_FLAG | - H5C2__FLUSH_CLEAR_ONLY_FLAG, - /* expected_deserialized */ TRUE, - /* expected_cleared */ FALSE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ FALSE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 13, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ FALSE, - /* dirty_flag */ FALSE, - /* flags */ H5C2__NO_FLAGS_SET, - /* flush_flags */ H5C2__FLUSH_MARKED_ENTRIES_FLAG | - H5C2__FLUSH_INVALIDATE_FLAG, - /* expected_deserialized */ TRUE, - /* expected_cleared */ FALSE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ TRUE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 14, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ FALSE, - /* dirty_flag */ TRUE, - /* flags */ H5C2__NO_FLAGS_SET, - /* flush_flags */ H5C2__FLUSH_MARKED_ENTRIES_FLAG | - H5C2__FLUSH_INVALIDATE_FLAG, - /* expected_deserialized */ TRUE, - /* expected_cleared */ FALSE, - /* expected_serialized */ TRUE, - /* expected_destroyed */ TRUE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 15, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ FALSE, - /* dirty_flag */ FALSE, - /* flags */ H5C2__NO_FLAGS_SET, - /* flush_flags */ H5C2__FLUSH_INVALIDATE_FLAG | - H5C2__FLUSH_CLEAR_ONLY_FLAG | - H5C2__FLUSH_MARKED_ENTRIES_FLAG, - /* expected_deserialized */ TRUE, - /* expected_cleared */ FALSE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ TRUE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 16, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ FALSE, - /* dirty_flag */ TRUE, - /* flags */ H5C2__NO_FLAGS_SET, - /* flush_flags */ H5C2__FLUSH_INVALIDATE_FLAG | - H5C2__FLUSH_CLEAR_ONLY_FLAG | - H5C2__FLUSH_MARKED_ENTRIES_FLAG, - /* expected_deserialized */ TRUE, - /* expected_cleared */ TRUE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ TRUE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 17, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ FALSE, - /* dirty_flag */ FALSE, - /* flags */ H5C2__SET_FLUSH_MARKER_FLAG, - /* flush_flags */ H5C2__NO_FLAGS_SET, - /* expected_deserialized */ TRUE, - /* expected_cleared */ FALSE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ FALSE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 18, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ FALSE, - /* dirty_flag */ TRUE, - /* flags */ H5C2__SET_FLUSH_MARKER_FLAG, - /* flush_flags */ H5C2__NO_FLAGS_SET, - /* expected_deserialized */ TRUE, - /* expected_cleared */ FALSE, - /* expected_serialized */ TRUE, - /* expected_destroyed */ FALSE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 19, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ FALSE, - /* dirty_flag */ FALSE, - /* flags */ H5C2__SET_FLUSH_MARKER_FLAG, - /* flush_flags */ H5C2__FLUSH_CLEAR_ONLY_FLAG, - /* expected_deserialized */ TRUE, - /* expected_cleared */ FALSE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ FALSE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 20, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ FALSE, - /* dirty_flag */ TRUE, - /* flags */ H5C2__SET_FLUSH_MARKER_FLAG, - /* flush_flags */ H5C2__FLUSH_CLEAR_ONLY_FLAG, - /* expected_deserialized */ TRUE, - /* expected_cleared */ TRUE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ FALSE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 21, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ FALSE, - /* dirty_flag */ FALSE, - /* flags */ H5C2__SET_FLUSH_MARKER_FLAG, - /* flush_flags */ H5C2__FLUSH_INVALIDATE_FLAG, - /* expected_deserialized */ TRUE, - /* expected_cleared */ FALSE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ TRUE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 22, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ FALSE, - /* dirty_flag */ TRUE, - /* flags */ H5C2__SET_FLUSH_MARKER_FLAG, - /* flush_flags */ H5C2__FLUSH_INVALIDATE_FLAG, - /* expected_deserialized */ TRUE, - /* expected_cleared */ FALSE, - /* expected_serialized */ TRUE, - /* expected_destroyed */ TRUE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 23, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ FALSE, - /* dirty_flag */ FALSE, - /* flags */ H5C2__SET_FLUSH_MARKER_FLAG, - /* flush_flags */ H5C2__FLUSH_MARKED_ENTRIES_FLAG, - /* expected_deserialized */ TRUE, - /* expected_cleared */ FALSE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ FALSE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 24, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ FALSE, - /* dirty_flag */ TRUE, - /* flags */ H5C2__SET_FLUSH_MARKER_FLAG, - /* flush_flags */ H5C2__FLUSH_MARKED_ENTRIES_FLAG, - /* expected_deserialized */ TRUE, - /* expected_cleared */ FALSE, - /* expected_serialized */ TRUE, - /* expected_destroyed */ FALSE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 25, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ FALSE, - /* dirty_flag */ FALSE, - /* flags */ H5C2__SET_FLUSH_MARKER_FLAG, - /* flush_flags */ H5C2__FLUSH_INVALIDATE_FLAG | - H5C2__FLUSH_CLEAR_ONLY_FLAG, - /* expected_deserialized */ TRUE, - /* expected_cleared */ FALSE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ TRUE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 26, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ FALSE, - /* dirty_flag */ TRUE, - /* flags */ H5C2__SET_FLUSH_MARKER_FLAG, - /* flush_flags */ H5C2__FLUSH_INVALIDATE_FLAG | - H5C2__FLUSH_CLEAR_ONLY_FLAG, - /* expected_deserialized */ TRUE, - /* expected_cleared */ TRUE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ TRUE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 27, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ FALSE, - /* dirty_flag */ FALSE, - /* flags */ H5C2__SET_FLUSH_MARKER_FLAG, - /* flush_flags */ H5C2__FLUSH_MARKED_ENTRIES_FLAG | - H5C2__FLUSH_CLEAR_ONLY_FLAG, - /* expected_deserialized */ TRUE, - /* expected_cleared */ FALSE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ FALSE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 28, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ FALSE, - /* dirty_flag */ TRUE, - /* flags */ H5C2__SET_FLUSH_MARKER_FLAG, - /* flush_flags */ H5C2__FLUSH_MARKED_ENTRIES_FLAG | - H5C2__FLUSH_CLEAR_ONLY_FLAG, - /* expected_deserialized */ TRUE, - /* expected_cleared */ TRUE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ FALSE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 29, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ FALSE, - /* dirty_flag */ FALSE, - /* flags */ H5C2__SET_FLUSH_MARKER_FLAG, - /* flush_flags */ H5C2__FLUSH_MARKED_ENTRIES_FLAG | - H5C2__FLUSH_INVALIDATE_FLAG, - /* expected_deserialized */ TRUE, - /* expected_cleared */ FALSE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ TRUE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 30, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ FALSE, - /* dirty_flag */ TRUE, - /* flags */ H5C2__SET_FLUSH_MARKER_FLAG, - /* flush_flags */ H5C2__FLUSH_MARKED_ENTRIES_FLAG | - H5C2__FLUSH_INVALIDATE_FLAG, - /* expected_deserialized */ TRUE, - /* expected_cleared */ FALSE, - /* expected_serialized */ TRUE, - /* expected_destroyed */ TRUE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 31, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ FALSE, - /* dirty_flag */ FALSE, - /* flags */ H5C2__SET_FLUSH_MARKER_FLAG, - /* flush_flags */ H5C2__FLUSH_INVALIDATE_FLAG | - H5C2__FLUSH_CLEAR_ONLY_FLAG | - H5C2__FLUSH_MARKED_ENTRIES_FLAG, - /* expected_deserialized */ TRUE, - /* expected_cleared */ FALSE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ TRUE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 32, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ FALSE, - /* dirty_flag */ TRUE, - /* flags */ H5C2__SET_FLUSH_MARKER_FLAG, - /* flush_flags */ H5C2__FLUSH_INVALIDATE_FLAG | - H5C2__FLUSH_CLEAR_ONLY_FLAG | - H5C2__FLUSH_MARKED_ENTRIES_FLAG, - /* expected_deserialized */ TRUE, - /* expected_cleared */ TRUE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ TRUE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 33, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ TRUE, - /* dirty_flag */ FALSE, - /* flags */ H5C2__NO_FLAGS_SET, - /* flush_flags */ H5C2__NO_FLAGS_SET, - /* expected_deserialized */ FALSE, - /* expected_cleared */ FALSE, - /* expected_serialized */ TRUE, - /* expected_destroyed */ FALSE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 34, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ TRUE, - /* dirty_flag */ TRUE, - /* flags */ H5C2__NO_FLAGS_SET, - /* flush_flags */ H5C2__NO_FLAGS_SET, - /* expected_deserialized */ FALSE, - /* expected_cleared */ FALSE, - /* expected_serialized */ TRUE, - /* expected_destroyed */ FALSE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 35, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ TRUE, - /* dirty_flag */ FALSE, - /* flags */ H5C2__NO_FLAGS_SET, - /* flush_flags */ H5C2__FLUSH_CLEAR_ONLY_FLAG, - /* expected_deserialized */ FALSE, - /* expected_cleared */ TRUE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ FALSE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 36, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ TRUE, - /* dirty_flag */ TRUE, - /* flags */ H5C2__NO_FLAGS_SET, - /* flush_flags */ H5C2__FLUSH_CLEAR_ONLY_FLAG, - /* expected_deserialized */ FALSE, - /* expected_cleared */ TRUE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ FALSE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 37, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ TRUE, - /* dirty_flag */ FALSE, - /* flags */ H5C2__NO_FLAGS_SET, - /* flush_flags */ H5C2__FLUSH_INVALIDATE_FLAG, - /* expected_deserialized */ FALSE, - /* expected_cleared */ FALSE, - /* expected_serialized */ TRUE, - /* expected_destroyed */ TRUE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 38, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ TRUE, - /* dirty_flag */ TRUE, - /* flags */ H5C2__NO_FLAGS_SET, - /* flush_flags */ H5C2__FLUSH_INVALIDATE_FLAG, - /* expected_deserialized */ FALSE, - /* expected_cleared */ FALSE, - /* expected_serialized */ TRUE, - /* expected_destroyed */ TRUE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 39, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ TRUE, - /* dirty_flag */ FALSE, - /* flags */ H5C2__NO_FLAGS_SET, - /* flush_flags */ H5C2__FLUSH_MARKED_ENTRIES_FLAG, - /* expected_deserialized */ FALSE, - /* expected_cleared */ FALSE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ FALSE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 40, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ TRUE, - /* dirty_flag */ TRUE, - /* flags */ H5C2__NO_FLAGS_SET, - /* flush_flags */ H5C2__FLUSH_MARKED_ENTRIES_FLAG, - /* expected_deserialized */ FALSE, - /* expected_cleared */ FALSE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ FALSE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 41, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ TRUE, - /* dirty_flag */ FALSE, - /* flags */ H5C2__NO_FLAGS_SET, - /* flush_flags */ H5C2__FLUSH_INVALIDATE_FLAG | - H5C2__FLUSH_CLEAR_ONLY_FLAG, - /* expected_deserialized */ FALSE, - /* expected_cleared */ TRUE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ TRUE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 42, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ TRUE, - /* dirty_flag */ TRUE, - /* flags */ H5C2__NO_FLAGS_SET, - /* flush_flags */ H5C2__FLUSH_INVALIDATE_FLAG | - H5C2__FLUSH_CLEAR_ONLY_FLAG, - /* expected_deserialized */ FALSE, - /* expected_cleared */ TRUE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ TRUE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 43, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ TRUE, - /* dirty_flag */ FALSE, - /* flags */ H5C2__NO_FLAGS_SET, - /* flush_flags */ H5C2__FLUSH_MARKED_ENTRIES_FLAG | - H5C2__FLUSH_CLEAR_ONLY_FLAG, - /* expected_deserialized */ FALSE, - /* expected_cleared */ FALSE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ FALSE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 44, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ TRUE, - /* dirty_flag */ TRUE, - /* flags */ H5C2__NO_FLAGS_SET, - /* flush_flags */ H5C2__FLUSH_MARKED_ENTRIES_FLAG | - H5C2__FLUSH_CLEAR_ONLY_FLAG, - /* expected_deserialized */ FALSE, - /* expected_cleared */ FALSE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ FALSE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 45, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ TRUE, - /* dirty_flag */ FALSE, - /* flags */ H5C2__NO_FLAGS_SET, - /* flush_flags */ H5C2__FLUSH_MARKED_ENTRIES_FLAG | - H5C2__FLUSH_INVALIDATE_FLAG, - /* expected_deserialized */ FALSE, - /* expected_cleared */ FALSE, - /* expected_serialized */ TRUE, - /* expected_destroyed */ TRUE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 46, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ TRUE, - /* dirty_flag */ TRUE, - /* flags */ H5C2__NO_FLAGS_SET, - /* flush_flags */ H5C2__FLUSH_MARKED_ENTRIES_FLAG | - H5C2__FLUSH_INVALIDATE_FLAG, - /* expected_deserialized */ FALSE, - /* expected_cleared */ FALSE, - /* expected_serialized */ TRUE, - /* expected_destroyed */ TRUE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 47, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ TRUE, - /* dirty_flag */ FALSE, - /* flags */ H5C2__NO_FLAGS_SET, - /* flush_flags */ H5C2__FLUSH_INVALIDATE_FLAG | - H5C2__FLUSH_CLEAR_ONLY_FLAG | - H5C2__FLUSH_MARKED_ENTRIES_FLAG, - /* expected_deserialized */ FALSE, - /* expected_cleared */ TRUE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ TRUE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 48, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ TRUE, - /* dirty_flag */ TRUE, - /* flags */ H5C2__NO_FLAGS_SET, - /* flush_flags */ H5C2__FLUSH_INVALIDATE_FLAG | - H5C2__FLUSH_CLEAR_ONLY_FLAG | - H5C2__FLUSH_MARKED_ENTRIES_FLAG, - /* expected_deserialized */ FALSE, - /* expected_cleared */ TRUE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ TRUE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 49, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ TRUE, - /* dirty_flag */ FALSE, - /* flags */ H5C2__SET_FLUSH_MARKER_FLAG, - /* flush_flags */ H5C2__NO_FLAGS_SET, - /* expected_deserialized */ FALSE, - /* expected_cleared */ FALSE, - /* expected_serialized */ TRUE, - /* expected_destroyed */ FALSE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 50, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ TRUE, - /* dirty_flag */ TRUE, - /* flags */ H5C2__SET_FLUSH_MARKER_FLAG, - /* flush_flags */ H5C2__NO_FLAGS_SET, - /* expected_deserialized */ FALSE, - /* expected_cleared */ FALSE, - /* expected_serialized */ TRUE, - /* expected_destroyed */ FALSE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 51, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ TRUE, - /* dirty_flag */ FALSE, - /* flags */ H5C2__SET_FLUSH_MARKER_FLAG, - /* flush_flags */ H5C2__FLUSH_CLEAR_ONLY_FLAG, - /* expected_deserialized */ FALSE, - /* expected_cleared */ TRUE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ FALSE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 52, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ TRUE, - /* dirty_flag */ TRUE, - /* flags */ H5C2__SET_FLUSH_MARKER_FLAG, - /* flush_flags */ H5C2__FLUSH_CLEAR_ONLY_FLAG, - /* expected_deserialized */ FALSE, - /* expected_cleared */ TRUE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ FALSE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 53, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ TRUE, - /* dirty_flag */ FALSE, - /* flags */ H5C2__SET_FLUSH_MARKER_FLAG, - /* flush_flags */ H5C2__FLUSH_INVALIDATE_FLAG, - /* expected_deserialized */ FALSE, - /* expected_cleared */ FALSE, - /* expected_serialized */ TRUE, - /* expected_destroyed */ TRUE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 54, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ TRUE, - /* dirty_flag */ TRUE, - /* flags */ H5C2__SET_FLUSH_MARKER_FLAG, - /* flush_flags */ H5C2__FLUSH_INVALIDATE_FLAG, - /* expected_deserialized */ FALSE, - /* expected_cleared */ FALSE, - /* expected_serialized */ TRUE, - /* expected_destroyed */ TRUE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 55, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ TRUE, - /* dirty_flag */ FALSE, - /* flags */ H5C2__SET_FLUSH_MARKER_FLAG, - /* flush_flags */ H5C2__FLUSH_MARKED_ENTRIES_FLAG, - /* expected_deserialized */ FALSE, - /* expected_cleared */ FALSE, - /* expected_serialized */ TRUE, - /* expected_destroyed */ FALSE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 56, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ TRUE, - /* dirty_flag */ TRUE, - /* flags */ H5C2__SET_FLUSH_MARKER_FLAG, - /* flush_flags */ H5C2__FLUSH_MARKED_ENTRIES_FLAG, - /* expected_deserialized */ FALSE, - /* expected_cleared */ FALSE, - /* expected_serialized */ TRUE, - /* expected_destroyed */ FALSE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 57, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ TRUE, - /* dirty_flag */ FALSE, - /* flags */ H5C2__SET_FLUSH_MARKER_FLAG, - /* flush_flags */ H5C2__FLUSH_INVALIDATE_FLAG | - H5C2__FLUSH_CLEAR_ONLY_FLAG, - /* expected_deserialized */ FALSE, - /* expected_cleared */ TRUE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ TRUE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 58, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ TRUE, - /* dirty_flag */ TRUE, - /* flags */ H5C2__SET_FLUSH_MARKER_FLAG, - /* flush_flags */ H5C2__FLUSH_INVALIDATE_FLAG | - H5C2__FLUSH_CLEAR_ONLY_FLAG, - /* expected_deserialized */ FALSE, - /* expected_cleared */ TRUE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ TRUE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 59, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ TRUE, - /* dirty_flag */ FALSE, - /* flags */ H5C2__SET_FLUSH_MARKER_FLAG, - /* flush_flags */ H5C2__FLUSH_MARKED_ENTRIES_FLAG | - H5C2__FLUSH_CLEAR_ONLY_FLAG, - /* expected_deserialized */ FALSE, - /* expected_cleared */ TRUE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ FALSE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 60, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ TRUE, - /* dirty_flag */ TRUE, - /* flags */ H5C2__SET_FLUSH_MARKER_FLAG, - /* flush_flags */ H5C2__FLUSH_MARKED_ENTRIES_FLAG | - H5C2__FLUSH_CLEAR_ONLY_FLAG, - /* expected_deserialized */ FALSE, - /* expected_cleared */ TRUE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ FALSE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 61, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ TRUE, - /* dirty_flag */ FALSE, - /* flags */ H5C2__SET_FLUSH_MARKER_FLAG, - /* flush_flags */ H5C2__FLUSH_MARKED_ENTRIES_FLAG | - H5C2__FLUSH_INVALIDATE_FLAG, - /* expected_deserialized */ FALSE, - /* expected_cleared */ FALSE, - /* expected_serialized */ TRUE, - /* expected_destroyed */ TRUE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 62, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ TRUE, - /* dirty_flag */ TRUE, - /* flags */ H5C2__SET_FLUSH_MARKER_FLAG, - /* flush_flags */ H5C2__FLUSH_MARKED_ENTRIES_FLAG | - H5C2__FLUSH_INVALIDATE_FLAG, - /* expected_deserialized */ FALSE, - /* expected_cleared */ FALSE, - /* expected_serialized */ TRUE, - /* expected_destroyed */ TRUE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 63, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ TRUE, - /* dirty_flag */ FALSE, - /* flags */ H5C2__SET_FLUSH_MARKER_FLAG, - /* flush_flags */ H5C2__FLUSH_INVALIDATE_FLAG | - H5C2__FLUSH_CLEAR_ONLY_FLAG | - H5C2__FLUSH_MARKED_ENTRIES_FLAG, - /* expected_deserialized */ FALSE, - /* expected_cleared */ TRUE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ TRUE - ); - } - - if ( pass2 ) { - - check_flush_cache__single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ 64, - /* entry_type */ PICO_ENTRY_TYPE, - /* entry_idx */ 0, - /* insert_flag */ TRUE, - /* dirty_flag */ TRUE, - /* flags */ H5C2__SET_FLUSH_MARKER_FLAG, - /* flush_flags */ H5C2__FLUSH_INVALIDATE_FLAG | - H5C2__FLUSH_CLEAR_ONLY_FLAG | - H5C2__FLUSH_MARKED_ENTRIES_FLAG, - /* expected_deserialized */ FALSE, - /* expected_cleared */ TRUE, - /* expected_serialized */ FALSE, - /* expected_destroyed */ TRUE - ); - } - - - /* Now run single entry tests for pinned entries. Test all combinations - * of: - * - * 1) Unpin by unprotect vs. unpin by call to H5C2_unpin_entry(). - * - * 2) Marked dirty by unprotect or not. - * - * 3) Marked dirty by call to H5C2_mark_pinned_entry_dirty() or not. - * - * 4) Marked dirty by call to H5C2_mark_pinned_or_protected_entry_dirty() - * while protected or not. - * - * 5) Marked dirty by call to H5C2_mark_pinned_or_protected_entry_dirty() - * while pinned or not. - * - * 6) Entry marked for flush or not. - * - * 7) Call flush with H5C2__FLUSH_MARKED_ENTRIES_FLAG or not. - * - * 8) Call flush with H5C2__FLUSH_CLEAR_ONLY_FLAG or not. - * - * This yields a total of 256 tests. - * - * The tests and their expected results are given in the spec table - * below. The values assigned to the expected_cleared, expected_flushed, - * and expected_destroyed fields are somewhat arcane, so the following - * overview may be useful. - * - * In addition to simply checking to see if the test case runs, - * we also check to see if the desired operations take place on the - * cache entry. Thus expected_cleared is set to TRUE if we expect - * the entry to be flushed, expected_flushed is set to TRUE if we - * we expect the entry to be flushed, and expected_destroyed is set - * to TRUE if we expect the entry to be destroyed. - * - * In this test, we are working with pinned entries which can't be - * evicted, so expected_destroyed is always FALSE. We could pull it - * from the table, but it is a hold over from the code this test - * was adapted from, and it doesn't do any particular harm. - * - * In general, we expect an entry to be flushed if it is dirty, and - * flush in invoked WITHOUT the H5C2__FLUSH_CLEAR_ONLY_FLAG. However, - * there are exceptions: If flush is invoked with the - * H5C2__FLUSH_MARKED_ENTRIES_FLAG, only marked entries will be flushed. - * - * Further, unprotecting an entry with the H5C2__SET_FLUSH_MARKER_FLAG - * will NOT mark the entry unless the entry has either been marked - * dirty either before or durting the unprotect call. This results in - * some counterintuitive entries in the table. It make be useful to - * look in the test code to see the exact order of operations. - * - * Similarly, we expect an entry to be cleared if it is dirty, and - * flush is invoked WITH the H5C2__FLUSH_CLEAR_ONLY_FLAG. Again, there - * are exceptions -- If flush is also invoked with the - * H5C2__FLUSH_MARKED_ENTRIES_FLAG, only the marked entries will be - * cleared. - * - * The above comments about applying unprotect with the - * H5C2__SET_FLUSH_MARKER_FLAG apply here as well. - */ - - if ( pass2 ) { - - int i; - struct pinned_single_entry_test_spec - { - int test_num; - int entry_type; - int entry_idx; - hbool_t dirty_flag; - hbool_t mark_dirty; - hbool_t pop_mark_dirty_prot; - hbool_t pop_mark_dirty_pinned; - hbool_t unprotect_unpin; - unsigned int flags; - unsigned int flush_flags; - hbool_t expected_cleared; - hbool_t expected_serialized; - hbool_t expected_destroyed; - } spec[256] = - /* pop pop - * ent mark mark - * test entry -ry dirty mark dirty dirty unprot flush expect expect expect - * num type idx flag dirty prot pinned unpin flags flags clear srlzd destroy - */ - { { 1, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, FALSE, FALSE, H5C2__NO_FLAGS_SET, H5C2__NO_FLAGS_SET, FALSE, FALSE, FALSE }, - { 2, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, FALSE, TRUE, H5C2__NO_FLAGS_SET, H5C2__NO_FLAGS_SET, FALSE, FALSE, FALSE }, - { 3, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, TRUE, FALSE, H5C2__NO_FLAGS_SET, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 4, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, TRUE, TRUE, H5C2__NO_FLAGS_SET, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 5, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, FALSE, FALSE, H5C2__NO_FLAGS_SET, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 6, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, FALSE, TRUE, H5C2__NO_FLAGS_SET, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 7, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, TRUE, FALSE, H5C2__NO_FLAGS_SET, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 8, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, TRUE, TRUE, H5C2__NO_FLAGS_SET, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 9, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, FALSE, FALSE, H5C2__NO_FLAGS_SET, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 10, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, FALSE, TRUE, H5C2__NO_FLAGS_SET, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 11, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, TRUE, FALSE, H5C2__NO_FLAGS_SET, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 12, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, TRUE, TRUE, H5C2__NO_FLAGS_SET, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 13, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, FALSE, FALSE, H5C2__NO_FLAGS_SET, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 14, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, FALSE, TRUE, H5C2__NO_FLAGS_SET, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 15, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, TRUE, FALSE, H5C2__NO_FLAGS_SET, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 16, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, TRUE, TRUE, H5C2__NO_FLAGS_SET, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 17, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, FALSE, FALSE, H5C2__NO_FLAGS_SET, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 18, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, FALSE, TRUE, H5C2__NO_FLAGS_SET, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 19, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, TRUE, FALSE, H5C2__NO_FLAGS_SET, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 20, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, TRUE, TRUE, H5C2__NO_FLAGS_SET, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 21, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, FALSE, FALSE, H5C2__NO_FLAGS_SET, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 22, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, FALSE, TRUE, H5C2__NO_FLAGS_SET, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 23, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, TRUE, FALSE, H5C2__NO_FLAGS_SET, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 24, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, TRUE, TRUE, H5C2__NO_FLAGS_SET, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 25, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, FALSE, FALSE, H5C2__NO_FLAGS_SET, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 26, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, FALSE, TRUE, H5C2__NO_FLAGS_SET, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 27, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, TRUE, FALSE, H5C2__NO_FLAGS_SET, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 28, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, TRUE, TRUE, H5C2__NO_FLAGS_SET, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 29, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, FALSE, FALSE, H5C2__NO_FLAGS_SET, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 30, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, FALSE, TRUE, H5C2__NO_FLAGS_SET, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 31, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, TRUE, FALSE, H5C2__NO_FLAGS_SET, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 32, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, TRUE, TRUE, H5C2__NO_FLAGS_SET, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 33, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, FALSE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__NO_FLAGS_SET, FALSE, FALSE, FALSE }, - { 34, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, FALSE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__NO_FLAGS_SET, FALSE, FALSE, FALSE }, - { 35, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, TRUE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 36, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, TRUE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 37, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, FALSE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 38, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, FALSE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 39, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, TRUE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 40, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, TRUE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 41, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, FALSE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 42, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, FALSE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 43, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, TRUE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 44, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, TRUE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 45, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, FALSE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 46, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, FALSE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 47, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, TRUE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 48, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, TRUE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 49, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, FALSE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 50, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, FALSE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 51, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, TRUE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 52, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, TRUE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 53, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, FALSE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 54, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, FALSE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 55, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, TRUE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 56, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, TRUE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 57, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, FALSE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 58, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, FALSE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 59, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, TRUE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 60, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, TRUE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 61, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, FALSE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 62, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, FALSE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 63, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, TRUE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 64, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, TRUE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__NO_FLAGS_SET, FALSE, TRUE, FALSE }, - { 65, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, FALSE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, - { 66, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, FALSE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, - { 67, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, TRUE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, - { 68, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, TRUE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, - { 69, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, FALSE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, - { 70, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, FALSE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, - { 71, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, TRUE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, - { 72, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, TRUE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, - { 73, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, FALSE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, - { 74, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, FALSE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, - { 75, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, TRUE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, - { 76, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, TRUE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, - { 77, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, FALSE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, - { 78, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, FALSE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, - { 79, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, TRUE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, - { 80, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, TRUE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, - { 81, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, FALSE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, - { 82, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, FALSE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, - { 83, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, TRUE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, - { 84, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, TRUE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, - { 85, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, FALSE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, - { 86, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, FALSE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, - { 87, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, TRUE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, - { 88, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, TRUE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, - { 89, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, FALSE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, - { 90, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, FALSE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, - { 91, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, TRUE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, - { 92, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, TRUE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, - { 93, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, FALSE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, - { 94, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, FALSE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, - { 95, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, TRUE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, - { 96, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, TRUE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, - { 97, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, FALSE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, - { 98, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, FALSE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, - { 99, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, TRUE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, - { 100, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, TRUE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, - { 101, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, FALSE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, - { 102, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, FALSE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, - { 103, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, TRUE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, - { 104, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, TRUE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, - { 105, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, FALSE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, - { 106, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, FALSE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, - { 107, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, TRUE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, - { 108, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, TRUE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, FALSE, FALSE }, - { 109, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, FALSE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, - { 110, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, FALSE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, - { 111, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, TRUE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, - { 112, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, TRUE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, - { 113, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, FALSE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, - { 114, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, FALSE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, - { 115, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, TRUE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, - { 116, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, TRUE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, - { 117, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, FALSE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, - { 118, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, FALSE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, - { 119, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, TRUE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, - { 120, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, TRUE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, - { 121, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, FALSE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, - { 122, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, FALSE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, - { 123, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, TRUE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, - { 124, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, TRUE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, - { 125, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, FALSE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, - { 126, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, FALSE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, - { 127, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, TRUE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, - { 128, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, TRUE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG, FALSE, TRUE, FALSE }, - { 129, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, FALSE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 130, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, FALSE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 131, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, TRUE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 132, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, TRUE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 133, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, FALSE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 134, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, FALSE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 135, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, TRUE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 136, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, TRUE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 137, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, FALSE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 138, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, FALSE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 139, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, TRUE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 140, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, TRUE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 141, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, FALSE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 142, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, FALSE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 143, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, TRUE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 144, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, TRUE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 145, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, FALSE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 146, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, FALSE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 147, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, TRUE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 148, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, TRUE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 149, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, FALSE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 150, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, FALSE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 151, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, TRUE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 152, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, TRUE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 153, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, FALSE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 154, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, FALSE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 155, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, TRUE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 156, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, TRUE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 157, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, FALSE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 158, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, FALSE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 159, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, TRUE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 160, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, TRUE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 161, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, FALSE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 162, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, FALSE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 163, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, TRUE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 164, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, TRUE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 165, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, FALSE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 166, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, FALSE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 167, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, TRUE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 168, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, TRUE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 169, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, FALSE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 170, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, FALSE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 171, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, TRUE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 172, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, TRUE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 173, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, FALSE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 174, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, FALSE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 175, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, TRUE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 176, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, TRUE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 177, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, FALSE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 178, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, FALSE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 179, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, TRUE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 180, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, TRUE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 181, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, FALSE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 182, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, FALSE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 183, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, TRUE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 184, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, TRUE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 185, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, FALSE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 186, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, FALSE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 187, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, TRUE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 188, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, TRUE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 189, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, FALSE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 190, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, FALSE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 191, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, TRUE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 192, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, TRUE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 193, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, FALSE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 194, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, FALSE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 195, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, TRUE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 196, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, TRUE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 197, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, FALSE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 198, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, FALSE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 199, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, TRUE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 200, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, TRUE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 201, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, FALSE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 202, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, FALSE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 203, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, TRUE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 204, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, TRUE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 205, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, FALSE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 206, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, FALSE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 207, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, TRUE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 208, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, TRUE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 209, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, FALSE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 210, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, FALSE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 211, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, TRUE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 212, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, TRUE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 213, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, FALSE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 214, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, FALSE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 215, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, TRUE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 216, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, TRUE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 217, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, FALSE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 218, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, FALSE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 219, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, TRUE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 220, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, TRUE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 221, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, FALSE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 222, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, FALSE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 223, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, TRUE, FALSE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 224, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, TRUE, TRUE, H5C2__NO_FLAGS_SET, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 225, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, FALSE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 226, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, FALSE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 227, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, TRUE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 228, PICO_ENTRY_TYPE, 0, FALSE, FALSE, FALSE, TRUE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 229, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, FALSE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 230, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, FALSE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 231, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, TRUE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 232, PICO_ENTRY_TYPE, 0, FALSE, FALSE, TRUE, TRUE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 233, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, FALSE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 234, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, FALSE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 235, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, TRUE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 236, PICO_ENTRY_TYPE, 0, FALSE, TRUE, FALSE, TRUE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, FALSE, FALSE, FALSE }, - { 237, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, FALSE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 238, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, FALSE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 239, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, TRUE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 240, PICO_ENTRY_TYPE, 0, FALSE, TRUE, TRUE, TRUE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 241, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, FALSE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 242, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, FALSE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 243, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, TRUE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 244, PICO_ENTRY_TYPE, 0, TRUE, FALSE, FALSE, TRUE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 245, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, FALSE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 246, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, FALSE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 247, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, TRUE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 248, PICO_ENTRY_TYPE, 0, TRUE, FALSE, TRUE, TRUE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 249, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, FALSE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 250, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, FALSE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 251, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, TRUE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 252, PICO_ENTRY_TYPE, 0, TRUE, TRUE, FALSE, TRUE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 253, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, FALSE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 254, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, FALSE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 255, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, TRUE, FALSE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE }, - { 256, PICO_ENTRY_TYPE, 0, TRUE, TRUE, TRUE, TRUE, TRUE, H5C2__SET_FLUSH_MARKER_FLAG, H5C2__FLUSH_MARKED_ENTRIES_FLAG | H5C2__FLUSH_CLEAR_ONLY_FLAG, TRUE, FALSE, FALSE } }; - - i = 0; - while ( ( pass2 ) && ( i < 256 ) ) - { - check_flush_cache__pinned_single_entry_test - ( - /* file_ptr */ file_ptr, - /* test_num */ spec[i].test_num, - /* entry_type */ spec[i].entry_type, - /* entry_idx */ spec[i].entry_idx, - /* dirty_flag */ spec[i].dirty_flag, - /* mark_dirty */ spec[i].mark_dirty, - /* pop_mark_dirty_prot */ spec[i].pop_mark_dirty_prot, - /* pop_mark_dirty_pinned */ spec[i].pop_mark_dirty_pinned, - /* unprotect_unpin */ spec[i].unprotect_unpin, - /* flags */ spec[i].flags, - /* flush_flags */ spec[i].flush_flags, - /* expected_cleared */ spec[i].expected_cleared, - /* expected_serialized */ spec[i].expected_serialized, - /* expected_destroyed */ spec[i].expected_destroyed - ); - i++; - } - } - - return; - -} /* check_flush_cache__single_entry() */ - - -/*------------------------------------------------------------------------- - * Function: check_flush_cache__single_entry_test() - * - * Purpose: Run a single entry flush cache test. - * - * Return: void - * - * Programmer: John Mainzer - * 1/12/05 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -static void -check_flush_cache__single_entry_test(H5F_t * file_ptr, - int test_num, - int entry_type, - int entry_idx, - hbool_t insert_flag, - hbool_t dirty_flag, - unsigned int flags, - unsigned int flush_flags, - hbool_t expected_deserialized, - hbool_t expected_cleared, - hbool_t expected_serialized, - hbool_t expected_destroyed) -{ - /* const char * fcn_name = "check_flush_cache__single_entry_test"; */ - H5C2_t * cache_ptr = file_ptr->shared->cache2; - static char msg[128]; - herr_t result; - test_entry_t * base_addr; - test_entry_t * entry_ptr; - - if ( cache_ptr == NULL ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "cache_ptr NULL on entry to single entry test #%d.", - test_num); - failure_mssg2 = msg; - } - else if ( ( cache_ptr->index_len != 0 ) || - ( cache_ptr->index_size != 0 ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "cache not empty at beginning of single entry test #%d.", - test_num); - failure_mssg2 = msg; - } - else if ( ( entry_type < 0 ) || ( entry_type >= NUMBER_OF_ENTRY_TYPES ) || - ( entry_idx < 0 ) || ( entry_idx > max_indices2[entry_type] ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "Bad parameters on entry to single entry test #%d.", - test_num); - failure_mssg2 = msg; - } - - if ( pass2 ) { - - base_addr = entries2[entry_type]; - entry_ptr = &(base_addr[entry_idx]); - - if ( insert_flag ) { - - insert_entry2(file_ptr, entry_type, entry_idx, dirty_flag, flags); - - } else { - - protect_entry2(file_ptr, entry_type, entry_idx); - - unprotect_entry2(file_ptr, entry_type, entry_idx, - (int)dirty_flag, flags); - } - } - - if ( pass2 ) { - - result = H5C2_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, flush_flags); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "flush with flags 0x%x failed in single entry test #%d.", - flush_flags, test_num); - failure_mssg2 = msg; - } -#ifndef NDEBUG - /* The clear_dirty_bits() callback is only called in debug mode -- - * thus we can only do our full test on the expected entry history - * when debug is enabled. - */ - else if ( ( entry_ptr->deserialized != expected_deserialized ) || - ( entry_ptr->cleared != expected_cleared ) || - ( entry_ptr->serialized != expected_serialized ) || - ( entry_ptr->destroyed != expected_destroyed ) ) { -#else - /* When in procduction mode, the clear_dirty_bits() callback is - * not called, so entry_ptr->cleared should never be set. - */ - else if ( ( entry_ptr->deserialized != expected_deserialized ) || - ( entry_ptr->cleared ) || - ( entry_ptr->serialized != expected_serialized ) || - ( entry_ptr->destroyed != expected_destroyed ) ) { -#endif /* NDEBUG */ -#if 1 /* This is useful debugging code -- lets keep it for a while */ - - HDfprintf(stdout, - "desrlzd = %d(%d), clrd = %d(%d), srlzd = %d(%d), dest = %d(%d)\n", - (int)(entry_ptr->deserialized), - (int)expected_deserialized, - (int)(entry_ptr->cleared), - (int)expected_cleared, - (int)(entry_ptr->serialized), - (int)expected_serialized, - (int)(entry_ptr->destroyed), - (int)expected_destroyed); -#endif - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "Unexpected entry status after flush in single entry test #%d.", - test_num); - failure_mssg2 = msg; - } - else if ( ( ( (flush_flags & H5C2__FLUSH_INVALIDATE_FLAG) == 0 ) - && - ( ( cache_ptr->index_len != 1 ) - || - ( cache_ptr->index_size != entry_sizes2[entry_type] ) - ) - ) - || - ( ( (flush_flags & H5C2__FLUSH_INVALIDATE_FLAG) != 0 ) - && - ( ( cache_ptr->index_len != 0 ) - || - ( cache_ptr->index_size != 0 ) - ) - ) - ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "Unexpected cache len/size after flush in single entry test #%d.", - test_num); - failure_mssg2 = msg; - } - } - - - /* clean up the cache to prep for the next test */ - if ( pass2 ) { - - result = H5C2_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, - H5C2__FLUSH_INVALIDATE_FLAG); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "Flush failed on cleanup in single entry test #%d.", - test_num); - failure_mssg2 = msg; - } - else if ( ( cache_ptr->index_len != 0 ) || - ( cache_ptr->index_size != 0 ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "Unexpected cache len/size after cleanup in single entry test #%d.", - test_num); - failure_mssg2 = msg; - - } else { - - entry_ptr->deserialized = FALSE; - entry_ptr->cleared = FALSE; - entry_ptr->serialized = FALSE; - entry_ptr->destroyed = FALSE; - } - } - - return; - -} /* check_flush_cache__single_entry_test() */ - - -/*------------------------------------------------------------------------- - * Function: check_flush_cache__pinned_single_entry_test() - * - * Purpose: Run a pinned single entry flush cache test. - * - * Return: void - * - * Programmer: John Mainzer - * 3/28/06 - * - * Modifications: - * - * JRM -- 5/17/06 - * Added the pop_mark_dirty_prot and pop_mark_dirty_pinned - * flags and supporting code to allow us to test the - * H5C2_mark_pinned_or_protected_entry_dirty() call. Use the - * call to mark the entry dirty while the entry is protected - * if pop_mark_dirty_prot is TRUE, and to mark the entry - * dirty while it is pinned if pop_mark_dirty_pinned is TRUE. - * - *------------------------------------------------------------------------- - */ - -static void -check_flush_cache__pinned_single_entry_test(H5F_t * file_ptr, - int test_num, - int entry_type, - int entry_idx, - hbool_t dirty_flag, - hbool_t mark_dirty, - hbool_t pop_mark_dirty_prot, - hbool_t pop_mark_dirty_pinned, - hbool_t unprotect_unpin, - unsigned int flags, - unsigned int flush_flags, - hbool_t expected_cleared, - hbool_t expected_serialized, - hbool_t expected_destroyed) -{ - /* const char *fcn_name = "check_flush_cache__pinned_single_entry_test"; */ - H5C2_t * cache_ptr = file_ptr->shared->cache2; - static char msg[128]; - hbool_t expected_deserialized = TRUE; - herr_t result; - test_entry_t * base_addr; - test_entry_t * entry_ptr; - - if ( cache_ptr == NULL ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "cache_ptr NULL on entry to pinned single entry test #%d.", - test_num); - failure_mssg2 = msg; - } - else if ( ( cache_ptr->index_len != 0 ) || - ( cache_ptr->index_size != 0 ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "cache not empty at beginning of pinned single entry test #%d.", - test_num); - failure_mssg2 = msg; - } - else if ( ( entry_type < 0 ) || ( entry_type >= NUMBER_OF_ENTRY_TYPES ) || - ( entry_idx < 0 ) || ( entry_idx > max_indices2[entry_type] ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "Bad parameters on entry to pinned single entry test #%d.", - test_num); - failure_mssg2 = msg; - } - - if ( pass2 ) { - - base_addr = entries2[entry_type]; - entry_ptr = &(base_addr[entry_idx]); - - protect_entry2(file_ptr, entry_type, entry_idx); - - if ( pop_mark_dirty_prot ) { - - mark_pinned_or_protected_entry_dirty2(file_ptr, - entry_type, - entry_idx); - } - - unprotect_entry2(file_ptr, entry_type, entry_idx, - (int)dirty_flag, (flags | H5C2__PIN_ENTRY_FLAG)); - - if ( mark_dirty ) { - - mark_pinned_entry_dirty2(file_ptr, entry_type, entry_idx, - FALSE, (size_t)0); - } - - if ( pop_mark_dirty_pinned ) { - - mark_pinned_or_protected_entry_dirty2(file_ptr, - entry_type, - entry_idx); - } - } - - if ( pass2 ) { - - result = H5C2_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, flush_flags); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "flush with flags 0x%x failed in pinned single entry test #%d.", - flush_flags, test_num); - failure_mssg2 = msg; - } -#ifndef NDEBUG - /* The clear_dirty_bits() callback is only called in debug mode -- - * thus we can only do our full test on the expected entry history - * when debug is enabled. - */ - else if ( ( entry_ptr->deserialized != expected_deserialized ) || - ( entry_ptr->cleared != expected_cleared ) || - ( entry_ptr->serialized != expected_serialized ) || - ( entry_ptr->destroyed != expected_destroyed ) ) { -#else - /* When in procduction mode, the clear_dirty_bits() callback is - * not called, so entry_ptr->cleared should never be set. - */ - else if ( ( entry_ptr->deserialized != expected_deserialized ) || - ( entry_ptr->cleared ) || - ( entry_ptr->serialized != expected_serialized ) || - ( entry_ptr->destroyed != expected_destroyed ) ) { -#endif -#if 0 /* this is useful debugging code -- keep it around */ - HDfprintf(stdout, - "desrlzd = %d(%d), clrd = %d(%d), srlzd = %d(%d), dest = %d(%d)\n", - (int)(entry_ptr->deserialized), - (int)expected_deserialized, - (int)(entry_ptr->cleared), - (int)expected_cleared, - (int)(entry_ptr->serialized), - (int)expected_serialized, - (int)(entry_ptr->destroyed), - (int)expected_destroyed); -#endif - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "Unexpected entry status after flush in pinned single entry test #%d.", - test_num); - failure_mssg2 = msg; - } - else if ( ( ( (flush_flags & H5C2__FLUSH_INVALIDATE_FLAG) == 0 ) - && - ( ( cache_ptr->index_len != 1 ) - || - ( cache_ptr->index_size != entry_sizes2[entry_type] ) - ) - ) - || - ( ( (flush_flags & H5C2__FLUSH_INVALIDATE_FLAG) != 0 ) - && - ( ( cache_ptr->index_len != 0 ) - || - ( cache_ptr->index_size != 0 ) - ) - ) - ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "Unexpected cache len/size after flush in pinned single entry test #%d.", - test_num); - failure_mssg2 = msg; - } - } - - - /* clean up the cache to prep for the next test */ - if ( pass2 ) { - - if ( unprotect_unpin ) { - - protect_entry2(file_ptr, entry_type, entry_idx); - - unprotect_entry2(file_ptr, entry_type, entry_idx, - (int)dirty_flag, H5C2__UNPIN_ENTRY_FLAG); - - } else { - - unpin_entry2(file_ptr, entry_type, entry_idx); - - } - } - - if ( pass2 ) { - - result = H5C2_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, - H5C2__FLUSH_INVALIDATE_FLAG); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "Flush failed on cleanup in pinned single entry test #%d.", - test_num); - failure_mssg2 = msg; - } - else if ( ( cache_ptr->index_len != 0 ) || - ( cache_ptr->index_size != 0 ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "Unexpected cache len/size after cleanup in pinned single entry test #%d.", - test_num); - failure_mssg2 = msg; - - } else { - - entry_ptr->deserialized = FALSE; - entry_ptr->cleared = FALSE; - entry_ptr->serialized = FALSE; - entry_ptr->destroyed = FALSE; - } - } - - return; - -} /* check_flush_cache__pinned_single_entry_test() */ - - -/*------------------------------------------------------------------------- - * Function: check_get_entry_status() - * - * Purpose: Verify that H5C2_get_entry_status() behaves as expected. - * - * Return: void - * - * Programmer: John Mainzer - * 4/28/06 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -static unsigned -check_get_entry_status(void) -{ - const char * fcn_name = "check_get_entry_status"; - static char msg[128]; - herr_t result; - hbool_t in_cache; - hbool_t is_dirty; - hbool_t is_protected; - hbool_t is_pinned; - size_t entry_size; - H5F_t * file_ptr = NULL; - test_entry_t * base_addr; - test_entry_t * entry_ptr; - - TESTING("H5C2_get_entry_status() functionality"); - - core_file_driver_failed = FALSE; - - pass2 = TRUE; - - if ( pass2 ) { - - reset_entries2(); - - file_ptr = setup_cache2((size_t)(2 * 1024 * 1024), - (size_t)(1 * 1024 * 1024)); - - base_addr = entries2[0]; - entry_ptr = &(base_addr[0]); - } - - if ( pass2 ) { - - /* entry not in cache -- only in_cache should be touched by - * the call. Thus, only check that boolean. - */ - - result = H5C2_get_entry_status(file_ptr, entry_ptr->addr, &entry_size, - &in_cache, &is_dirty, &is_protected, &is_pinned); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "H5C2_get_entry_status() reports failure 1."); - failure_mssg2 = msg; - - } else if ( in_cache ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected status 1."); - failure_mssg2 = msg; - } - } - - protect_entry2(file_ptr, 0, 0); - - unprotect_entry2(file_ptr, 0, 0, FALSE, H5C2__NO_FLAGS_SET); - - if ( pass2 ) { - - result = H5C2_get_entry_status(file_ptr, entry_ptr->addr, &entry_size, - &in_cache, &is_dirty, &is_protected, &is_pinned); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "H5C2_get_entry_status() reports failure 2."); - failure_mssg2 = msg; - - } else if ( !in_cache || is_dirty || is_protected || is_pinned ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected status 2."); - failure_mssg2 = msg; - } - } - - protect_entry2(file_ptr, 0, 0); - - if ( pass2 ) { - - result = H5C2_get_entry_status(file_ptr, entry_ptr->addr, &entry_size, - &in_cache, &is_dirty, &is_protected, &is_pinned); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "H5C2_get_entry_status() reports failure 3."); - failure_mssg2 = msg; - - } else if ( !in_cache || is_dirty || !is_protected || is_pinned ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected status 3."); - failure_mssg2 = msg; - } - } - - unprotect_entry2(file_ptr, 0, 0, FALSE, H5C2__PIN_ENTRY_FLAG); - - if ( pass2 ) { - - result = H5C2_get_entry_status(file_ptr, entry_ptr->addr, &entry_size, - &in_cache, &is_dirty, &is_protected, &is_pinned); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "H5C2_get_entry_status() reports failure 4."); - failure_mssg2 = msg; - - } else if ( !in_cache || is_dirty || is_protected || !is_pinned ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected status 4."); - failure_mssg2 = msg; - } - } - - mark_pinned_entry_dirty2(file_ptr, 0, 0, FALSE, (size_t)0); - - if ( pass2 ) { - - result = H5C2_get_entry_status(file_ptr, entry_ptr->addr, &entry_size, - &in_cache, &is_dirty, &is_protected, &is_pinned); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "H5C2_get_entry_status() reports failure 5."); - failure_mssg2 = msg; - - } else if ( !in_cache || !is_dirty || is_protected || !is_pinned ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected status 5."); - failure_mssg2 = msg; - } - } - - unpin_entry2(file_ptr, 0, 0); - - if ( pass2 ) { - - result = H5C2_get_entry_status(file_ptr, entry_ptr->addr, &entry_size, - &in_cache, &is_dirty, &is_protected, &is_pinned); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "H5C2_get_entry_status() reports failure 6."); - failure_mssg2 = msg; - - } else if ( !in_cache || !is_dirty || is_protected || is_pinned ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected status 6."); - failure_mssg2 = msg; - } - } - - if ( pass2 ) { - - takedown_cache2(file_ptr, FALSE, FALSE); - } - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - HDfprintf(stdout, "%s(): failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - if ( core_file_driver_failed ) { - - HDfprintf(stdout, - "%s(): Unable to open test file with core file driver.\n", - fcn_name); - } - - return !pass2; - -} /* check_get_entry_status() */ - - -/*------------------------------------------------------------------------- - * Function: check_expunge_entry() - * - * Purpose: Verify that H5C2_expunge_entry() behaves as expected. - * - * Return: void - * - * Programmer: John Mainzer - * 7/5/06 - * - * Modifications: - * - * JRM -- 10/15/07 - * Minor updates to conform to new cache API. - * - *------------------------------------------------------------------------- - */ - -static unsigned -check_expunge_entry(void) -{ - const char * fcn_name = "check_expunge_entry"; - static char msg[128]; - herr_t result; - hbool_t in_cache; - hbool_t is_dirty; - hbool_t is_protected; - hbool_t is_pinned; - size_t entry_size; - H5F_t * file_ptr = NULL; - test_entry_t * base_addr; - test_entry_t * entry_ptr; - - TESTING("H5C2_expunge_entry() functionality"); - - core_file_driver_failed = FALSE; - - pass2 = TRUE; - - if ( pass2 ) { - - reset_entries2(); - - file_ptr = setup_cache2((size_t)(2 * 1024 * 1024), - (size_t)(1 * 1024 * 1024)); - - base_addr = entries2[0]; - entry_ptr = &(base_addr[0]); - } - - if ( pass2 ) { - - /* entry not in cache -- only in_cache should be touched by - * the status call. Thus, only check that boolean. - */ - - result = H5C2_get_entry_status(file_ptr, entry_ptr->addr, &entry_size, - &in_cache, &is_dirty, &is_protected, - &is_pinned); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "H5C2_get_entry_status() reports failure 1."); - failure_mssg2 = msg; - - } else if ( in_cache ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected status 1."); - failure_mssg2 = msg; - - } else if ( ( entry_ptr->deserialized ) || - ( entry_ptr->cleared ) || - ( entry_ptr->serialized ) || - ( entry_ptr->destroyed ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected entry history 1."); - failure_mssg2 = msg; - - } - } - - /* protect an entry to force the cache to load it, and then unprotect - * it without marking it dirty. - */ - - protect_entry2(file_ptr, 0, 0); - - unprotect_entry2(file_ptr, 0, 0, FALSE, H5C2__NO_FLAGS_SET); - - if ( pass2 ) { - - result = H5C2_get_entry_status(file_ptr, entry_ptr->addr, &entry_size, - &in_cache, &is_dirty, &is_protected, &is_pinned); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "H5C2_get_entry_status() reports failure 2."); - failure_mssg2 = msg; - - } else if ( !in_cache || is_dirty || is_protected || is_pinned ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected status 2."); - failure_mssg2 = msg; - - } else if ( ( ! entry_ptr->deserialized ) || - ( entry_ptr->cleared ) || - ( entry_ptr->serialized ) || - ( entry_ptr->destroyed ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected entry history 2."); - failure_mssg2 = msg; - - } - } - - /* Expunge the entry and then verify that it is no longer in the cache. - * Also verify that the entry was loaded, cleared, and destroyed, but - * not flushed. - * - * JRM -- 10/15/07 - * With the advent of the new cache API, the old clear() callback has - * been replaced with the new clear_dirty_bits() callback. This - * callback is only called if the entry is dirty to begin with. - * Thus, the entry will no longer be marked as cleared. - */ - expunge_entry2(file_ptr, 0, 0); - - if ( pass2 ) { - - /* entry shouldn't be in cache -- only in_cache should be touched - * by the status call. Thus, only check that boolean. - */ - - result = H5C2_get_entry_status(file_ptr, entry_ptr->addr, &entry_size, - &in_cache, &is_dirty, &is_protected, &is_pinned); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "H5C2_get_entry_status() reports failure 3."); - failure_mssg2 = msg; - - } else if ( in_cache ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected status 3."); - failure_mssg2 = msg; - - } else if ( ( ! entry_ptr->deserialized ) || - ( entry_ptr->cleared ) || - ( entry_ptr->serialized ) || - ( ! entry_ptr->destroyed ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected entry history 3."); - failure_mssg2 = msg; - - } - } - - /* now repeat the process with a different entry. On unprotect - * mark the entry as dirty. Verify that it is not flushed. - */ - - base_addr = entries2[0]; - entry_ptr = &(base_addr[1]); - - if ( pass2 ) { - - /* entry not in cache -- only in_cache should be touched by - * the status call. Thus, only check that boolean. - */ - - result = H5C2_get_entry_status(file_ptr, entry_ptr->addr, &entry_size, - &in_cache, &is_dirty, &is_protected, - &is_pinned); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "H5C2_get_entry_status() reports failure 4."); - failure_mssg2 = msg; - - } else if ( in_cache ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected status 4."); - failure_mssg2 = msg; - - } else if ( ( entry_ptr->deserialized ) || - ( entry_ptr->cleared ) || - ( entry_ptr->serialized ) || - ( entry_ptr->destroyed ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected entry history 4."); - failure_mssg2 = msg; - - } - } - - /* protect the entry to force the cache to load it, and then unprotect - * it with the dirty flag set. - */ - - protect_entry2(file_ptr, 0, 1); - - unprotect_entry2(file_ptr, 0, 1, TRUE, H5C2__NO_FLAGS_SET); - - if ( pass2 ) { - - result = H5C2_get_entry_status(file_ptr, entry_ptr->addr, &entry_size, - &in_cache, &is_dirty, &is_protected, - &is_pinned); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "H5C2_get_entry_status() reports failure 5."); - failure_mssg2 = msg; - - } else if ( !in_cache || !is_dirty || is_protected || is_pinned ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected status 5."); - failure_mssg2 = msg; - - } else if ( ( ! entry_ptr->deserialized ) || - ( entry_ptr->cleared ) || - ( entry_ptr->serialized ) || - ( entry_ptr->destroyed ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected entry history 5."); - failure_mssg2 = msg; - - } - } - - /* Expunge the entry and then verify that it is no longer in the cache. - * Also verify that the entry was loaded, cleared and destroyed, but not - * flushed. - */ - expunge_entry2(file_ptr, 0, 1); - - if ( pass2 ) { - - /* entry shouldn't be in cache -- only in_cache should be touched - * by the status call. Thus, only check that boolean. - */ - - result = H5C2_get_entry_status(file_ptr, entry_ptr->addr, &entry_size, - &in_cache, &is_dirty, &is_protected, - &is_pinned); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "H5C2_get_entry_status() reports failure 6."); - failure_mssg2 = msg; - - } else if ( in_cache ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected status 6."); - failure_mssg2 = msg; - -#ifndef NDEBUG - /* The clear_dirty_bits() callback is only called in debug mode -- - * thus we can only do our full test on the expected entry history - * when debug is enabled. - */ - } else if ( ( ! entry_ptr->deserialized ) || - ( ! entry_ptr->cleared ) || - ( entry_ptr->serialized ) || - ( ! entry_ptr->destroyed ) ) { -#else - /* When in procduction mode, the clear_dirty_bits() callback is - * not called, so entry_ptr->cleared should never be set. - */ - } else if ( ( ! entry_ptr->deserialized ) || - ( entry_ptr->cleared ) || - ( entry_ptr->serialized ) || - ( ! entry_ptr->destroyed ) ) { -#endif /* NDEBUG */ - - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected entry history 6."); - failure_mssg2 = msg; - - } - } - - if ( pass2 ) { - - takedown_cache2(file_ptr, FALSE, FALSE); - } - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - HDfprintf(stdout, "%s(): failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - if ( core_file_driver_failed ) { - - HDfprintf(stdout, - "%s(): Unable to open test file with core file driver.\n", - fcn_name); - } - - return !pass2; - -} /* check_expunge_entry() */ - - -/*------------------------------------------------------------------------- - * Function: check_multiple_read_protect() - * - * Purpose: Verify that multiple, simultaneous read protects of a - * single entry perform as expectd. - * - * Return: void - * - * Programmer: John Mainzer - * 4/1/07 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - - -static unsigned -check_multiple_read_protect(void) -{ - const char * fcn_name = "check_multiple_read_protect()"; - H5F_t * file_ptr = NULL; - H5C2_t * cache_ptr = NULL; - test_entry_t * entry_ptr; - - TESTING("multiple read only protects on a single entry"); - - core_file_driver_failed = FALSE; - - pass2 = TRUE; - - /* allocate a cache. Should succeed. - * - * Then to start with, proceed as follows: - * - * Read protect an entry. - * - * Then read protect the entry again. Should succeed. - * - * Read protect yet again. Should succeed. - * - * Unprotect with no changes, and then read protect twice again. - * Should succeed. - * - * Now unprotect three times. Should succeed. - * - * If stats are enabled, verify that correct stats are collected at - * every step. - * - * Also, verify internal state of read protects at every step. - */ - - if ( pass2 ) { - - reset_entries2(); - - file_ptr = setup_cache2((size_t)(2 * 1024), - (size_t)(1 * 1024)); - cache_ptr = file_ptr->shared->cache2; - - entry_ptr = &((entries2[0])[0]); - - if ( ( entry_ptr->header.is_protected ) || - ( entry_ptr->header.is_read_only ) || - ( entry_ptr->header.ro_ref_count != 0 ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected ro protected status 1.\n"; - } - } - -#if H5C2_COLLECT_CACHE_STATS - if ( ( cache_ptr->write_protects[0] != 0 ) || - ( cache_ptr->read_protects[0] != 0 ) || - ( cache_ptr->max_read_protects[0] != 0 ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected protect stats 1.\n"; - } -#endif /* H5C2_COLLECT_CACHE_STATS */ - - if ( pass2 ) - { - protect_entry_ro2(file_ptr, 0, 0); - - if ( ( ! ( entry_ptr->header.is_protected ) ) || - ( ! ( entry_ptr->header.is_read_only ) ) || - ( entry_ptr->header.ro_ref_count != 1 ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected ro protected status 2.\n"; - } - } - -#if H5C2_COLLECT_CACHE_STATS - if ( ( cache_ptr->write_protects[0] != 0 ) || - ( cache_ptr->read_protects[0] != 1 ) || - ( cache_ptr->max_read_protects[0] != 1 ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected protect stats 2.\n"; - } -#endif /* H5C2_COLLECT_CACHE_STATS */ - - if ( pass2 ) - { - protect_entry_ro2(file_ptr, 0, 0); - - if ( ( ! ( entry_ptr->header.is_protected ) ) || - ( ! ( entry_ptr->header.is_read_only ) ) || - ( entry_ptr->header.ro_ref_count != 2 ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected ro protected status 3.\n"; - } - } - -#if H5C2_COLLECT_CACHE_STATS - if ( ( cache_ptr->write_protects[0] != 0 ) || - ( cache_ptr->read_protects[0] != 2 ) || - ( cache_ptr->max_read_protects[0] != 2 ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected protect stats 3.\n"; - } -#endif /* H5C2_COLLECT_CACHE_STATS */ - - if ( pass2 ) - { - unprotect_entry2(file_ptr, 0, 0, FALSE, H5C2__NO_FLAGS_SET); - - if ( ( ! ( entry_ptr->header.is_protected ) ) || - ( ! ( entry_ptr->header.is_read_only ) ) || - ( entry_ptr->header.ro_ref_count != 1 ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected ro protected status 4.\n"; - } - } - -#if H5C2_COLLECT_CACHE_STATS - if ( ( cache_ptr->write_protects[0] != 0 ) || - ( cache_ptr->read_protects[0] != 2 ) || - ( cache_ptr->max_read_protects[0] != 2 ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected protect stats 4.\n"; - } -#endif /* H5C2_COLLECT_CACHE_STATS */ - - if ( pass2 ) - { - protect_entry_ro2(file_ptr, 0, 0); - - if ( ( ! ( entry_ptr->header.is_protected ) ) || - ( ! ( entry_ptr->header.is_read_only ) ) || - ( entry_ptr->header.ro_ref_count != 2 ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected ro protected status 5.\n"; - } - } - -#if H5C2_COLLECT_CACHE_STATS - if ( ( cache_ptr->write_protects[0] != 0 ) || - ( cache_ptr->read_protects[0] != 3 ) || - ( cache_ptr->max_read_protects[0] != 2 ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected protect stats 5.\n"; - } -#endif /* H5C2_COLLECT_CACHE_STATS */ - - if ( pass2 ) - { - protect_entry_ro2(file_ptr, 0, 0); - - if ( ( ! ( entry_ptr->header.is_protected ) ) || - ( ! ( entry_ptr->header.is_read_only ) ) || - ( entry_ptr->header.ro_ref_count != 3 ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected ro protected status 6.\n"; - } - } - -#if H5C2_COLLECT_CACHE_STATS - if ( ( cache_ptr->write_protects[0] != 0 ) || - ( cache_ptr->read_protects[0] != 4 ) || - ( cache_ptr->max_read_protects[0] != 3 ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected protect stats 6.\n"; - } -#endif /* H5C2_COLLECT_CACHE_STATS */ - - if ( pass2 ) - { - unprotect_entry2(file_ptr, 0, 0, FALSE, H5C2__NO_FLAGS_SET); - - if ( ( ! ( entry_ptr->header.is_protected ) ) || - ( ! ( entry_ptr->header.is_read_only ) ) || - ( entry_ptr->header.ro_ref_count != 2 ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected ro protected status 7.\n"; - } - } - -#if H5C2_COLLECT_CACHE_STATS - if ( ( cache_ptr->write_protects[0] != 0 ) || - ( cache_ptr->read_protects[0] != 4 ) || - ( cache_ptr->max_read_protects[0] != 3 ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected protect stats 7.\n"; - } -#endif /* H5C2_COLLECT_CACHE_STATS */ - - if ( pass2 ) - { - unprotect_entry2(file_ptr, 0, 0, FALSE, H5C2__NO_FLAGS_SET); - - if ( ( ! ( entry_ptr->header.is_protected ) ) || - ( ! ( entry_ptr->header.is_read_only ) ) || - ( entry_ptr->header.ro_ref_count != 1 ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected ro protected status 8.\n"; - } - } - -#if H5C2_COLLECT_CACHE_STATS - if ( ( cache_ptr->write_protects[0] != 0 ) || - ( cache_ptr->read_protects[0] != 4 ) || - ( cache_ptr->max_read_protects[0] != 3 ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected protect stats 8.\n"; - } -#endif /* H5C2_COLLECT_CACHE_STATS */ - - if ( pass2 ) - { - unprotect_entry2(file_ptr, 0, 0, FALSE, H5C2__NO_FLAGS_SET); - - if ( ( entry_ptr->header.is_protected ) || - ( entry_ptr->header.is_read_only ) || - ( entry_ptr->header.ro_ref_count != 0 ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected ro protected status 9.\n"; - } - } - -#if H5C2_COLLECT_CACHE_STATS - if ( ( cache_ptr->write_protects[0] != 0 ) || - ( cache_ptr->read_protects[0] != 4 ) || - ( cache_ptr->max_read_protects[0] != 3 ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected protect stats 9.\n"; - } -#endif /* H5C2_COLLECT_CACHE_STATS */ - - - /* If we get this far, do a write protect and unprotect to verify - * that the stats are getting collected properly here as well. - */ - - if ( pass2 ) - { - protect_entry2(file_ptr, 0, 0); - - if ( ( ! ( entry_ptr->header.is_protected ) ) || - ( entry_ptr->header.is_read_only ) || - ( entry_ptr->header.ro_ref_count != 0 ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected ro protected status 10.\n"; - } - } - -#if H5C2_COLLECT_CACHE_STATS - if ( ( cache_ptr->write_protects[0] != 1 ) || - ( cache_ptr->read_protects[0] != 4 ) || - ( cache_ptr->max_read_protects[0] != 3 ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected protect stats 10.\n"; - } -#endif /* H5C2_COLLECT_CACHE_STATS */ - - if ( pass2 ) - { - unprotect_entry2(file_ptr, 0, 0, FALSE, H5C2__NO_FLAGS_SET); - - if ( ( entry_ptr->header.is_protected ) || - ( entry_ptr->header.is_read_only ) || - ( entry_ptr->header.ro_ref_count != 0 ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected ro protected status 11.\n"; - } - } - -#if H5C2_COLLECT_CACHE_STATS - if ( ( cache_ptr->write_protects[0] != 1 ) || - ( cache_ptr->read_protects[0] != 4 ) || - ( cache_ptr->max_read_protects[0] != 3 ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected protect stats 11.\n"; - } -#endif /* H5C2_COLLECT_CACHE_STATS */ - - - /* Finally, mix things up a little, using a mix of reads and - * and writes on different entries. Also include a pin to verify - * that it works as well. - * - * Stats are looking OK, so we will only test them one more time - * at the end to ensure that all is at it should be. - */ - - if ( pass2 ) { - - protect_entry2(file_ptr, 0, 2); /* (0,2) write */ - protect_entry_ro2(file_ptr, 0, 4); /* (0,4) read only (1) */ - protect_entry2(file_ptr, 0, 6); /* (0,6) write */ - - unprotect_entry2(file_ptr, 0, 2, FALSE, /* (0,2) unprotect */ - H5C2__NO_FLAGS_SET); - - protect_entry_ro2(file_ptr, 0, 2); /* (0,2) read only (1) */ - protect_entry2(file_ptr, 0, 1); /* (0,1) write */ - protect_entry_ro2(file_ptr, 0, 4); /* (0,4) read only (2) */ - protect_entry2(file_ptr, 0, 0); /* (0,0) write */ - protect_entry_ro2(file_ptr, 0, 2); /* (0,2) read only (2) */ - - unprotect_entry2(file_ptr, 0, 2, FALSE, /* (0,2) read only (1) pin */ - H5C2__PIN_ENTRY_FLAG); - unprotect_entry2(file_ptr, 0, 6, FALSE, /* (0,6) unprotect */ - H5C2__NO_FLAGS_SET); - - protect_entry_ro2(file_ptr, 0, 4); /* (0,4) read only (3) */ - - unprotect_entry2(file_ptr, 0, 2, FALSE, /* (0,2) unprotect */ - H5C2__NO_FLAGS_SET); - unprotect_entry2(file_ptr, 0, 1, FALSE, /* (0,1) unprotect */ - H5C2__NO_FLAGS_SET); - - if ( pass2 ) { - - entry_ptr = &((entries2[0])[4]); - - if ( H5C2_pin_protected_entry((void *)entry_ptr) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_pin_protected_entry() failed.\n"; - - } else if ( ! (entry_ptr->header.is_pinned) ) { - - pass2 = FALSE; - failure_mssg2 = "entry (0,4) not pinned.\n"; - - } else { - - /* keep test bed sanity checks happy */ - entry_ptr->is_pinned = TRUE; - - } - } - - unprotect_entry2(file_ptr, 0, 4, FALSE, /* (0,4) read only (2) */ - H5C2__NO_FLAGS_SET); - unprotect_entry2(file_ptr, 0, 4, FALSE, /* (0,4) read only (1) */ - H5C2__UNPIN_ENTRY_FLAG); - - if ( ( pass2 ) && ( entry_ptr->header.is_pinned ) ) { - - pass2 = FALSE; - failure_mssg2 = "enty (0,4) still pinned.\n"; - - } - - unprotect_entry2(file_ptr, 0, 4, FALSE, /* (0,4) unprotect */ - H5C2__NO_FLAGS_SET); - unprotect_entry2(file_ptr, 0, 0, FALSE, /* (0,0) unprotect */ - H5C2__NO_FLAGS_SET); - - unpin_entry2(file_ptr, 0, 2); - } - -#if H5C2_COLLECT_CACHE_STATS - if ( ( cache_ptr->write_protects[0] != 5 ) || - ( cache_ptr->read_protects[0] != 9 ) || - ( cache_ptr->max_read_protects[0] != 3 ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected protect stats 11.\n"; - } -#endif /* H5C2_COLLECT_CACHE_STATS */ - - - if ( pass2 ) { - - takedown_cache2(file_ptr, FALSE, FALSE); - } - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - HDfprintf(stdout, "%s: failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - if ( core_file_driver_failed ) { - - HDfprintf(stdout, - "%s(): Unable to open test file with core file driver.\n", - fcn_name); - } - - return !pass2; - -} /* check_multiple_read_protect() */ - - -/*------------------------------------------------------------------------- - * Function: check_rename_entry() - * - * Purpose: Verify that H5C2_rename_entry behaves as expected. In - * particular, verify that it works correctly with pinned - * entries. - * - * Return: void - * - * Programmer: John Mainzer - * 4/26/06 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -static unsigned -check_rename_entry(void) -{ - const char * fcn_name = "check_rename_entry"; - int i; - H5F_t * file_ptr = NULL; - struct rename_entry_test_spec test_specs[4] = - { - { - /* int entry_type = */ PICO_ENTRY_TYPE, - /* int entry_index = */ 10, - /* hbool_t is_dirty = */ FALSE, - /* hbool_t is_pinned = */ FALSE - }, - { - /* int entry_type = */ PICO_ENTRY_TYPE, - /* int entry_index = */ 20, - /* hbool_t is_dirty = */ TRUE, - /* hbool_t is_pinned = */ FALSE - }, - { - /* int entry_type = */ PICO_ENTRY_TYPE, - /* int entry_index = */ 30, - /* hbool_t is_dirty = */ FALSE, - /* hbool_t is_pinned = */ TRUE - }, - { - /* int entry_type = */ PICO_ENTRY_TYPE, - /* int entry_index = */ 40, - /* hbool_t is_dirty = */ TRUE, - /* hbool_t is_pinned = */ TRUE - } - }; - - TESTING("H5C2_rename_entry() functionality"); - - core_file_driver_failed = FALSE; - - pass2 = TRUE; - - /* allocate a cache, load entries into it, and then rename - * them. To the extent possible, verify that the desired - * actions took place. - * - * At present, we should do the following tests: - * - * 1) Rename a clean, unprotected, unpinned entry. - * - * 2) Rename a dirty, unprotected, unpinned entry. - * - * 3) Rename a clean, unprotected, pinned entry. - * - * 4) Rename a dirty, unprotected, pinned entry. - * - * In all cases, the entry should have moved to its - * new location, and have been marked dirty if it wasn't - * already. - * - * Unpinned entries should have been moved to the head - * of the LRU list. - * - * Pinned entries should remain untouched on the pinned entry - * list. - */ - - if ( pass2 ) { - - reset_entries2(); - - file_ptr = setup_cache2((size_t)(2 * 1024 * 1024), - (size_t)(1 * 1024 * 1024)); - } - - i = 0; - while ( ( pass2 ) && ( i < 4 ) ) - { - check_rename_entry__run_test(file_ptr, i, &(test_specs[i])); - i++; - } - - if ( pass2 ) { - - takedown_cache2(file_ptr, FALSE, FALSE); - } - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - HDfprintf(stdout, "%s(): failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - if ( core_file_driver_failed ) { - - HDfprintf(stdout, - "%s(): Unable to open test file with core file driver.\n", - fcn_name); - } - - return !pass2; - -} /* check_rename_entry() */ - - -/*------------------------------------------------------------------------- - * Function: check_rename_entry__run_test() - * - * Purpose: Run a rename entry test. - * - * Do nothing if pass2 is FALSE on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 4/27/06 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -static void -check_rename_entry__run_test(H5F_t * file_ptr, - int test_num, - struct rename_entry_test_spec * spec_ptr) -{ - /* const char * fcn_name = "check_rename_entry__run_test"; */ - H5C2_t * cache_ptr = file_ptr->shared->cache2; - static char msg[128]; - unsigned int flags = H5C2__NO_FLAGS_SET; - test_entry_t * base_addr; - test_entry_t * entry_ptr = NULL; - H5C2_cache_entry_t * test_ptr = NULL; - - if ( cache_ptr == NULL ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "cache_ptr NULL on entry to rename test #%d.", - test_num); - failure_mssg2 = msg; - - } else if ( spec_ptr == NULL ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "spec_ptr NULL on entry to rename test #%d.", - test_num); - failure_mssg2 = msg; - - } - - if ( pass2 ) { - - base_addr = entries2[spec_ptr->entry_type]; - entry_ptr = &(base_addr[spec_ptr->entry_index]); - - if ( ( entry_ptr->self != entry_ptr ) || - ( ( entry_ptr->cache_ptr != cache_ptr ) && - ( entry_ptr->cache_ptr != NULL ) ) || - ( ! ( entry_ptr->at_main_addr ) ) || - ( entry_ptr->addr != entry_ptr->main_addr ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "bad entry_ptr in rename test #%d.", - test_num); - failure_mssg2 = msg; - - } else if ( spec_ptr->is_pinned ) { - - flags |= H5C2__PIN_ENTRY_FLAG; - } - } - - protect_entry2(file_ptr, spec_ptr->entry_type, spec_ptr->entry_index); - - unprotect_entry2(file_ptr, spec_ptr->entry_type, spec_ptr->entry_index, - (int)(spec_ptr->is_dirty), flags); - - rename_entry2(cache_ptr, spec_ptr->entry_type, spec_ptr->entry_index, FALSE); - - if ( pass2 ) { - - /* verify that the rename took place, and that the cache's internal - * structures are as expected. Note that some sanity checking is - * done by rename_entry2(), so we don't have to repeat it here. - */ - - if ( spec_ptr->is_pinned ) { - - if ( ! ( entry_ptr->header.is_pinned ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "Pinned entry not pinned after rename in test #%d.", - test_num); - failure_mssg2 = msg; - } - - if ( pass2 ) { - - test_ptr = cache_ptr->pel_head_ptr; - - while ( ( test_ptr != NULL ) && - ( test_ptr != (H5C2_cache_entry_t *)entry_ptr ) ) - { - test_ptr = test_ptr->next; - } - - if ( test_ptr == NULL ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "Pinned entry not in pel after rename in test #%d.", - test_num); - failure_mssg2 = msg; - } - } - - unpin_entry2(file_ptr, spec_ptr->entry_type, spec_ptr->entry_index); - - } else { - - if ( entry_ptr->header.is_pinned ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "Unpinned entry pinned after rename in test #%d.", - test_num); - failure_mssg2 = msg; - } - - if ( ( entry_ptr->header.prev != NULL ) || - ( cache_ptr->LRU_head_ptr != (H5C2_cache_entry_t *)entry_ptr ) ) - { - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "Entry not at head of LRU after rename in test #%d.", - test_num); - failure_mssg2 = msg; - } - } - } - - /* put the entry back where it started from */ - rename_entry2(cache_ptr, spec_ptr->entry_type, spec_ptr->entry_index, TRUE); - - return; - -} /* check_rename_entry__run_test() */ - - -/*------------------------------------------------------------------------- - * Function: check_pin_protected_entry() - * - * Purpose: Verify that H5C2_pin_protected_entry behaves as expected. - * - * Return: void - * - * Programmer: John Mainzer - * 4/28/06 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -static unsigned -check_pin_protected_entry(void) -{ - const char * fcn_name = "check_pin_protected_entry"; - static char msg[128]; - herr_t result; - H5F_t * file_ptr = NULL; - test_entry_t * base_addr; - test_entry_t * entry_ptr; - - TESTING("H5C2_pin_protected_entry() functionality"); - - core_file_driver_failed = FALSE; - - pass2 = TRUE; - - /* Create a cache, protect an entry, and then use H5C2_pin_protected_entry() - * to pin it. Verify that the entry is in fact pined. Unprotect the entry - * to unpin it, and then destroy the cache. - */ - - if ( pass2 ) { - - reset_entries2(); - - file_ptr = setup_cache2((size_t)(2 * 1024 * 1024), - (size_t)(1 * 1024 * 1024)); - } - - protect_entry2(file_ptr, 0, 0); - - if ( pass2 ) { - - base_addr = entries2[0]; - entry_ptr = &(base_addr[0]); - - result = H5C2_pin_protected_entry((void *)entry_ptr); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "H5C2_pin_protected_entry() reports failure."); - failure_mssg2 = msg; - - } else if ( ! ( entry_ptr->header.is_pinned ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "entry not pinned when it should be."); - failure_mssg2 = msg; - - } else { - - entry_ptr->is_pinned = TRUE; - } - } - - unprotect_entry2(file_ptr, 0, 0, FALSE, H5C2__UNPIN_ENTRY_FLAG); - - if ( pass2 ) { - - takedown_cache2(file_ptr, FALSE, FALSE); - } - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - HDfprintf(stdout, "%s(): failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - if ( core_file_driver_failed ) { - - HDfprintf(stdout, - "%s(): Unable to open test file with core file driver.\n", - fcn_name); - } - - return !pass2; - -} /* check_pin_protected_entry() */ - - -/*------------------------------------------------------------------------- - * Function: check_resize_entry() - * - * Purpose: Verify that H5C2_resize_entry() and H5C2_unprotect() resize - * entries as expected. - * - * Return: void - * - * Programmer: John Mainzer - * 7/7/06 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -static unsigned -check_resize_entry(void) -{ - const char * fcn_name = "check_resize_entry"; - static char msg[128]; - herr_t result; - hbool_t in_cache; - hbool_t is_dirty; - hbool_t is_protected; - hbool_t is_pinned; - size_t entry_size; - size_t reported_entry_size; - H5F_t * file_ptr = NULL; - H5C2_t * cache_ptr = NULL; - test_entry_t * base_addr; - test_entry_t * entry_ptr; - - TESTING("entry resize functionality"); - - core_file_driver_failed = FALSE; - - /* Setup a cache and verify that it is empty. - * - * Then force the load of an entry by protecting it, and verify that - * the entry and cache have the expected sizes. - * - * Then unprotect the entry with the size changed flag and a reduced - * size. Verify that the entry and cache have the expected expected - * sizes. - * - * Use a second protect/unprotect cycle to restore the entry to - * its original size. Verify that the entry and cache have the - * expected sizes. - * - * Protect and unprotect the entry again to pin it. Use - * H5C2_resize_entry to reduce its size. Verify that the entry - * and cache have the expected sizes. - * - * Use H5C2_resize_entry again to restore the entry to its original - * size. Verify that the entry and cache have the expected sizes. - * - * Use a protect / unprotect cycle to unpin and destroy the entry. - * Verify that the entry and cache have the expected sizes. - * - * - * Obesrve that all the above tests have been done with only one - * entry in the cache. Repeat the tests with several entries in - * the cache. - */ - - pass2 = TRUE; - - /* tests with only one entry in the cache: */ - - if ( pass2 ) { - - reset_entries2(); - - file_ptr = setup_cache2((size_t)(2 * 1024 * 1024), - (size_t)(1 * 1024 * 1024)); - cache_ptr = file_ptr->shared->cache2; - - base_addr = entries2[LARGE_ENTRY_TYPE]; - entry_ptr = &(base_addr[0]); - entry_size = LARGE_ENTRY_SIZE; - } - - if ( pass2 ) { - - if ( ( cache_ptr->index_len != 0 ) || - ( cache_ptr->index_size != 0 ) || - ( cache_ptr->slist_len != 0 ) || - ( cache_ptr->slist_size != 0 ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected cache status 1."); - failure_mssg2 = msg; - - } - } - - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, 0); - - if ( pass2 ) { - - if ( ( cache_ptr->index_len != 1 ) || - ( cache_ptr->index_size != LARGE_ENTRY_SIZE ) || - ( cache_ptr->slist_len != 0 ) || - ( cache_ptr->slist_size != 0 ) ) { - - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected cache status 2."); - failure_mssg2 = msg; - - } - } - - if ( pass2 ) { - - result = H5C2_get_entry_status(file_ptr, entry_ptr->addr, - &reported_entry_size, &in_cache, - &is_dirty, &is_protected, &is_pinned); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "H5C2_get_entry_status() reports failure 1."); - failure_mssg2 = msg; - - } else if ( !in_cache || is_dirty || !is_protected || is_pinned ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected status 1."); - failure_mssg2 = msg; - - } else if ( ( ! entry_ptr->deserialized ) || - ( entry_ptr->cleared ) || - ( entry_ptr->serialized ) || - ( entry_ptr->destroyed ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected entry history 1."); - failure_mssg2 = msg; - - } - } - - if ( pass2 ) { - - result = H5C2_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT, - &(types2[LARGE_ENTRY_TYPE]), entry_ptr->addr, - (void *)entry_ptr, - H5C2__SIZE_CHANGED_FLAG | H5C2__DIRTIED_FLAG, - (LARGE_ENTRY_SIZE / 2)); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "H5C2_unprotect() reports failure 1."); - failure_mssg2 = msg; - - } else { - - /* tidy up so we play nice with the standard protect / unprotect - * calls. - */ - entry_ptr->is_protected = FALSE; - entry_ptr->is_dirty = TRUE; - entry_ptr->size = LARGE_ENTRY_SIZE / 2; - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->index_len != 1 ) || - ( cache_ptr->index_size != (LARGE_ENTRY_SIZE / 2) ) || - ( cache_ptr->slist_len != 1 ) || - ( cache_ptr->slist_size != (LARGE_ENTRY_SIZE / 2) ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected cache status 3."); - failure_mssg2 = msg; - - } - } - - if ( pass2 ) { - - result = H5C2_get_entry_status(file_ptr, entry_ptr->addr, - &reported_entry_size, &in_cache, - &is_dirty, &is_protected, &is_pinned); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "H5C2_get_entry_status() reports failure 2."); - failure_mssg2 = msg; - - } else if ( !in_cache || !is_dirty || is_protected || is_pinned || - ( reported_entry_size != (LARGE_ENTRY_SIZE / 2) ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected status 2."); - failure_mssg2 = msg; - - } else if ( ( ! entry_ptr->deserialized ) || - ( entry_ptr->cleared ) || - ( entry_ptr->serialized ) || - ( entry_ptr->destroyed ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected entry history 2."); - failure_mssg2 = msg; - - } - } - - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, 0); - - if ( pass2 ) { - - result = H5C2_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT, - &(types2[LARGE_ENTRY_TYPE]), entry_ptr->addr, - (void *)entry_ptr, - (H5C2__DIRTIED_FLAG | H5C2__SIZE_CHANGED_FLAG), - LARGE_ENTRY_SIZE); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "H5C2_unprotect() reports failure 2."); - failure_mssg2 = msg; - - } else { - - /* tidy up so we play nice with the standard protect / unprotect - * calls. - */ - entry_ptr->is_protected = FALSE; - entry_ptr->is_dirty = TRUE; - entry_ptr->size = LARGE_ENTRY_SIZE; - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->index_len != 1 ) || - ( cache_ptr->index_size != LARGE_ENTRY_SIZE ) || - ( cache_ptr->slist_len != 1 ) || - ( cache_ptr->slist_size != LARGE_ENTRY_SIZE ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected cache status 4."); - failure_mssg2 = msg; - - } - } - - if ( pass2 ) { - - result = H5C2_get_entry_status(file_ptr, entry_ptr->addr, - &reported_entry_size, &in_cache, - &is_dirty, &is_protected, &is_pinned); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "H5C2_get_entry_status() reports failure 3."); - failure_mssg2 = msg; - - } else if ( !in_cache || !is_dirty || is_protected || is_pinned || - ( reported_entry_size != LARGE_ENTRY_SIZE ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected status 3."); - failure_mssg2 = msg; - - } else if ( ( ! entry_ptr->deserialized ) || - ( entry_ptr->cleared ) || - ( entry_ptr->serialized ) || - ( entry_ptr->destroyed ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected entry history 3."); - failure_mssg2 = msg; - - } - } - - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, 0); - - unprotect_entry2(file_ptr, LARGE_ENTRY_TYPE, 0, FALSE, H5C2__PIN_ENTRY_FLAG); - - if ( pass2 ) { - - result = H5C2_resize_pinned_entry((void *)entry_ptr, - (LARGE_ENTRY_SIZE / 4)); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "H5C2_resize_pinned_entry() reports failure 1."); - failure_mssg2 = msg; - - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->index_len != 1 ) || - ( cache_ptr->index_size != (LARGE_ENTRY_SIZE / 4) ) || - ( cache_ptr->slist_len != 1 ) || - ( cache_ptr->slist_size != (LARGE_ENTRY_SIZE / 4) ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected cache status 5."); - failure_mssg2 = msg; - - } - } - - if ( pass2 ) { - - result = H5C2_get_entry_status(file_ptr, entry_ptr->addr, - &reported_entry_size, &in_cache, - &is_dirty, &is_protected, &is_pinned); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "H5C2_get_entry_status() reports failure 4."); - failure_mssg2 = msg; - - } else if ( !in_cache || !is_dirty || is_protected || ! is_pinned || - ( reported_entry_size != (LARGE_ENTRY_SIZE / 4) ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected status 4."); - failure_mssg2 = msg; - - } else if ( ( ! entry_ptr->deserialized ) || - ( entry_ptr->cleared ) || - ( entry_ptr->serialized ) || - ( entry_ptr->destroyed ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected entry history 4."); - failure_mssg2 = msg; - - } - } - - if ( pass2 ) { - - result = H5C2_resize_pinned_entry((void *)entry_ptr, - LARGE_ENTRY_SIZE); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "H5C2_resize_pinned_entry() reports failure 2."); - failure_mssg2 = msg; - - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->index_len != 1 ) || - ( cache_ptr->index_size != LARGE_ENTRY_SIZE ) || - ( cache_ptr->slist_len != 1 ) || - ( cache_ptr->slist_size != LARGE_ENTRY_SIZE ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected cache status 6."); - failure_mssg2 = msg; - - } - } - - if ( pass2 ) { - - result = H5C2_get_entry_status(file_ptr, entry_ptr->addr, - &reported_entry_size, &in_cache, - &is_dirty, &is_protected, &is_pinned); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "H5C2_get_entry_status() reports failure 5."); - failure_mssg2 = msg; - - } else if ( !in_cache || !is_dirty || is_protected || ! is_pinned || - ( reported_entry_size != LARGE_ENTRY_SIZE ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected status 5."); - failure_mssg2 = msg; - - } else if ( ( ! entry_ptr->deserialized ) || - ( entry_ptr->cleared ) || - ( entry_ptr->serialized ) || - ( entry_ptr->destroyed ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected entry history 5."); - failure_mssg2 = msg; - - } - } - - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, 0); - - unprotect_entry2(file_ptr, LARGE_ENTRY_TYPE, 0, FALSE, - H5C2__UNPIN_ENTRY_FLAG | H5C2__DELETED_FLAG); - - if ( pass2 ) { - - result = H5C2_get_entry_status(file_ptr, entry_ptr->addr, &entry_size, - &in_cache, &is_dirty, &is_protected, - &is_pinned); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "H5C2_get_entry_status() reports failure 6."); - failure_mssg2 = msg; - - } else if ( in_cache ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected status 6."); - failure_mssg2 = msg; - -#ifndef NDEBUG - /* The clear_dirty_bits() callback is only called in debug mode -- - * thus we can only do our full test on the expected entry history - * when debug is enabled. - */ - } else if ( ( ! entry_ptr->deserialized ) || - ( ! entry_ptr->cleared ) || - ( entry_ptr->serialized ) || - ( ! entry_ptr->destroyed ) ) { -#else - /* When in procduction mode, the clear_dirty_bits() callback is - * not called, so entry_ptr->cleared should never be set. - */ - } else if ( ( ! entry_ptr->deserialized ) || - ( entry_ptr->cleared ) || - ( entry_ptr->serialized ) || - ( ! entry_ptr->destroyed ) ) { -#endif /* NDEBUG */ - - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected entry history 6."); - failure_mssg2 = msg; - - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->index_len != 0 ) || - ( cache_ptr->index_size != 0 ) || - ( cache_ptr->slist_len != 0 ) || - ( cache_ptr->slist_size != 0 ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected cache status 7."); - failure_mssg2 = msg; - - } - } - - - /* now repreat the above tests with several entries in the cache: */ - - if ( pass2 ) { - - if ( ( cache_ptr->index_len != 0 ) || - ( cache_ptr->index_size != 0 ) || - ( cache_ptr->slist_len != 0 ) || - ( cache_ptr->slist_size != 0 ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected cache status 8."); - failure_mssg2 = msg; - - } - base_addr = entries2[LARGE_ENTRY_TYPE]; - entry_ptr = &(base_addr[3]); - entry_size = LARGE_ENTRY_SIZE; - } - - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, 0); - unprotect_entry2(file_ptr, LARGE_ENTRY_TYPE, 0, FALSE, H5C2__NO_FLAGS_SET); - - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, 1); - unprotect_entry2(file_ptr, LARGE_ENTRY_TYPE, 1, TRUE, H5C2__NO_FLAGS_SET); - - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, 2); - unprotect_entry2(file_ptr, LARGE_ENTRY_TYPE, 2, FALSE, H5C2__NO_FLAGS_SET); - - if ( pass2 ) { - - if ( ( cache_ptr->index_len != 3 ) || - ( cache_ptr->index_size != 3 * LARGE_ENTRY_SIZE ) || - ( cache_ptr->slist_len != 1 ) || - ( cache_ptr->slist_size != LARGE_ENTRY_SIZE ) ) { - - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected cache status 9."); - failure_mssg2 = msg; - - } - } - - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, 3); - - if ( pass2 ) { - - if ( ( cache_ptr->index_len != 4 ) || - ( cache_ptr->index_size != 4 * LARGE_ENTRY_SIZE ) || - ( cache_ptr->slist_len != 1 ) || - ( cache_ptr->slist_size != LARGE_ENTRY_SIZE ) ) { - - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected cache status 10."); - failure_mssg2 = msg; - - } - } - - if ( pass2 ) { - - result = H5C2_get_entry_status(file_ptr, entry_ptr->addr, - &reported_entry_size, &in_cache, - &is_dirty, &is_protected, &is_pinned); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "H5C2_get_entry_status() reports failure 7."); - failure_mssg2 = msg; - - } else if ( !in_cache || is_dirty || !is_protected || is_pinned ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected status 7."); - failure_mssg2 = msg; - - } else if ( ( ! entry_ptr->deserialized ) || - ( entry_ptr->cleared ) || - ( entry_ptr->serialized ) || - ( entry_ptr->destroyed ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected entry history 7."); - failure_mssg2 = msg; - - } - } - - if ( pass2 ) { - - result = H5C2_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT, - &(types2[LARGE_ENTRY_TYPE]), entry_ptr->addr, - (void *)entry_ptr, - H5C2__SIZE_CHANGED_FLAG | H5C2__DIRTIED_FLAG, - (LARGE_ENTRY_SIZE / 2)); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "H5C2_unprotect() reports failure 3."); - failure_mssg2 = msg; - - } else { - - /* tidy up so we play nice with the standard protect / unprotect - * calls. - */ - entry_ptr->is_protected = FALSE; - entry_ptr->is_dirty = TRUE; - entry_ptr->size = LARGE_ENTRY_SIZE / 2; - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->index_len != 4 ) || - ( cache_ptr->index_size != - ((3 * LARGE_ENTRY_SIZE) + (LARGE_ENTRY_SIZE / 2)) ) || - ( cache_ptr->slist_len != 2 ) || - ( cache_ptr->slist_size != - (LARGE_ENTRY_SIZE + (LARGE_ENTRY_SIZE / 2)) ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected cache status 11."); - failure_mssg2 = msg; - - } - } - - if ( pass2 ) { - - result = H5C2_get_entry_status(file_ptr, entry_ptr->addr, - &reported_entry_size, &in_cache, - &is_dirty, &is_protected, &is_pinned); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "H5C2_get_entry_status() reports failure 8."); - failure_mssg2 = msg; - - } else if ( !in_cache || !is_dirty || is_protected || is_pinned || - ( reported_entry_size != (LARGE_ENTRY_SIZE / 2) ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected status 8."); - failure_mssg2 = msg; - - } else if ( ( ! entry_ptr->deserialized ) || - ( entry_ptr->cleared ) || - ( entry_ptr->serialized ) || - ( entry_ptr->destroyed ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected entry history 8."); - failure_mssg2 = msg; - - } - } - - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, 3); - - if ( pass2 ) { - - result = H5C2_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT, - &(types2[LARGE_ENTRY_TYPE]), entry_ptr->addr, - (void *)entry_ptr, - (H5C2__DIRTIED_FLAG | H5C2__SIZE_CHANGED_FLAG), - LARGE_ENTRY_SIZE); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "H5C2_unprotect() reports failure 4."); - failure_mssg2 = msg; - - } else { - - /* tidy up so we play nice with the standard protect / unprotect - * calls. - */ - entry_ptr->is_protected = FALSE; - entry_ptr->is_dirty = TRUE; - entry_ptr->size = LARGE_ENTRY_SIZE; - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->index_len != 4 ) || - ( cache_ptr->index_size != 4 * LARGE_ENTRY_SIZE ) || - ( cache_ptr->slist_len != 2 ) || - ( cache_ptr->slist_size != 2 * LARGE_ENTRY_SIZE ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected cache status 12."); - failure_mssg2 = msg; - - } - } - - if ( pass2 ) { - - result = H5C2_get_entry_status(file_ptr, entry_ptr->addr, - &reported_entry_size, &in_cache, - &is_dirty, &is_protected, &is_pinned); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "H5C2_get_entry_status() reports failure 9."); - failure_mssg2 = msg; - - } else if ( !in_cache || !is_dirty || is_protected || is_pinned || - ( reported_entry_size != LARGE_ENTRY_SIZE ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected status 9."); - failure_mssg2 = msg; - - } else if ( ( ! entry_ptr->deserialized ) || - ( entry_ptr->cleared ) || - ( entry_ptr->serialized ) || - ( entry_ptr->destroyed ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected entry history 9."); - failure_mssg2 = msg; - - } - } - - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, 3); - - unprotect_entry2(file_ptr, LARGE_ENTRY_TYPE, 3, FALSE, H5C2__PIN_ENTRY_FLAG); - - if ( pass2 ) { - - result = H5C2_resize_pinned_entry((void *)entry_ptr, - (LARGE_ENTRY_SIZE / 4)); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "H5C2_resize_pinned_entry() reports failure 3."); - failure_mssg2 = msg; - - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->index_len != 4 ) || - ( cache_ptr->index_size != - ((3 * LARGE_ENTRY_SIZE) + (LARGE_ENTRY_SIZE / 4)) ) || - ( cache_ptr->slist_len != 2 ) || - ( cache_ptr->slist_size != - (LARGE_ENTRY_SIZE + (LARGE_ENTRY_SIZE / 4)) ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected cache status 13."); - failure_mssg2 = msg; - - } - } - - if ( pass2 ) { - - result = H5C2_get_entry_status(file_ptr, entry_ptr->addr, - &reported_entry_size, &in_cache, - &is_dirty, &is_protected, &is_pinned); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "H5C2_get_entry_status() reports failure 10."); - failure_mssg2 = msg; - - } else if ( !in_cache || !is_dirty || is_protected || ! is_pinned || - ( reported_entry_size != (LARGE_ENTRY_SIZE / 4) ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected status 10."); - failure_mssg2 = msg; - - } else if ( ( ! entry_ptr->deserialized ) || - ( entry_ptr->cleared ) || - ( entry_ptr->serialized ) || - ( entry_ptr->destroyed ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected entry history 10."); - failure_mssg2 = msg; - - } - } - - if ( pass2 ) { - - result = H5C2_resize_pinned_entry((void *)entry_ptr, - LARGE_ENTRY_SIZE); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "H5C2_resize_pinned_entry() reports failure 4."); - failure_mssg2 = msg; - - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->index_len != 4 ) || - ( cache_ptr->index_size != (4 * LARGE_ENTRY_SIZE) ) || - ( cache_ptr->slist_len != 2 ) || - ( cache_ptr->slist_size != (2 * LARGE_ENTRY_SIZE) ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected cache status 14."); - failure_mssg2 = msg; - - } - } - - if ( pass2 ) { - - result = H5C2_get_entry_status(file_ptr, entry_ptr->addr, - &reported_entry_size, &in_cache, - &is_dirty, &is_protected, &is_pinned); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "H5C2_get_entry_status() reports failure 11."); - failure_mssg2 = msg; - - } else if ( !in_cache || !is_dirty || is_protected || ! is_pinned || - ( reported_entry_size != LARGE_ENTRY_SIZE ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected status 11."); - failure_mssg2 = msg; - - } else if ( ( ! entry_ptr->deserialized ) || - ( entry_ptr->cleared ) || - ( entry_ptr->serialized ) || - ( entry_ptr->destroyed ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected entry history 11."); - failure_mssg2 = msg; - - } - } - - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, 3); - - unprotect_entry2(file_ptr, LARGE_ENTRY_TYPE, 3, FALSE, - H5C2__UNPIN_ENTRY_FLAG | H5C2__DELETED_FLAG); - - if ( pass2 ) { - - result = H5C2_get_entry_status(file_ptr, entry_ptr->addr, &entry_size, - &in_cache, &is_dirty, &is_protected, - &is_pinned); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "H5C2_get_entry_status() reports failure 12."); - failure_mssg2 = msg; - - } else if ( in_cache ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected status 12."); - failure_mssg2 = msg; - -#ifndef NDEBUG - /* The clear_dirty_bits() callback is only called in debug mode -- - * thus we can only do our full test on the expected entry history - * when debug is enabled. - */ - } else if ( ( ! entry_ptr->deserialized ) || - ( ! entry_ptr->cleared ) || - ( entry_ptr->serialized ) || - ( ! entry_ptr->destroyed ) ) { -#else - /* When in procduction mode, the clear_dirty_bits() callback is - * not called, so entry_ptr->cleared should never be set. - */ - } else if ( ( ! entry_ptr->deserialized ) || - ( entry_ptr->cleared ) || - ( entry_ptr->serialized ) || - ( ! entry_ptr->destroyed ) ) { -#endif /* NDEBUG */ - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected entry history 12."); - failure_mssg2 = msg; - - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->index_len != 3 ) || - ( cache_ptr->index_size != (3 * LARGE_ENTRY_SIZE) ) || - ( cache_ptr->slist_len != 1 ) || - ( cache_ptr->slist_size != LARGE_ENTRY_SIZE ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected cache status 15."); - failure_mssg2 = msg; - - } - } - - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, 2); - unprotect_entry2(file_ptr, LARGE_ENTRY_TYPE, 2, FALSE, H5C2__DELETED_FLAG); - - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, 1); - unprotect_entry2(file_ptr, LARGE_ENTRY_TYPE, 1, FALSE, H5C2__DELETED_FLAG); - - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, 0); - unprotect_entry2(file_ptr, LARGE_ENTRY_TYPE, 0, FALSE, H5C2__DELETED_FLAG); - - - if ( pass2 ) { - - if ( ( cache_ptr->index_len != 0 ) || - ( cache_ptr->index_size != 0 ) || - ( cache_ptr->slist_len != 0 ) || - ( cache_ptr->slist_size != 0 ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected cache status 16."); - failure_mssg2 = msg; - - } - } - - if ( pass2 ) { - - takedown_cache2(file_ptr, FALSE, FALSE); - } - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - HDfprintf(stdout, "%s(): failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - if ( core_file_driver_failed ) { - - HDfprintf(stdout, - "%s(): Unable to open test file with core file driver.\n", - fcn_name); - } - - return !pass2; - -} /* check_resize_entry() */ - - -/*------------------------------------------------------------------------- - * Function: check_evictions_enabled() - * - * Purpose: Verify that H5C2_get_evictions_enabled() and - * H5C2_set_evictions_enabled() functions perform as expected. - * - * Return: void - * - * Programmer: John Mainzer - * 8/2/07 - * - * Modifications: - * - * JRM -- 10/15/07 - * Minor updates to adapt to cache API changes. - * - *------------------------------------------------------------------------- - */ - -static unsigned -check_evictions_enabled(void) -{ - const char * fcn_name = "check_evictions_enabled"; - static char msg[128]; - herr_t result; - hbool_t show_progress = FALSE; - hbool_t evictions_enabled; - hbool_t in_cache; - int i; - int mile_stone = 1; - size_t entry_size; - H5F_t * file_ptr = NULL; - H5C2_t * cache_ptr = NULL; - test_entry_t * base_addr; - test_entry_t * entry_ptr; - - TESTING("evictions enabled/disabled functionality"); - - core_file_driver_failed = FALSE; - - /* Setup a cache and verify that it is empty. - * - * Use H5C2_get_evictions_enabled() to determine if evictions are - * currently enabled -- they should be. - * - * Load entries until the cache is full. Load one more. Verify that - * this caused an entry to be evicted. - * - * Insert an entry. Verify that this cases and entry to be evicted. - * - * Used H5C2_set_evictions_enabled() to disable evictions. Verify - * with a call to H5C2_get_evictions_enabled(). - * - * Load another entry -- verify that this does not cause an entry - * to be evicted. - * - * Insert an entry -- verify that this does not cause an entry to - * be evicted. - * - * Use H5C2_set_evictions_enabled() to re-enable evictions. Verify - * with a call to H5C2_get_evictions_enabled(). - * - * Protect and unprotect some of the entries in the cache. Verify - * that there are no evictions (since we only try to make space - * when we either insert or load a new entry). - * - * Protect an entry not in the cache. Verify that this causes - * two evictions. - * - * Used H5C2_set_evictions_enabled() to disable evictions again. - * Verify with a call to H5C2_get_evictions_enabled(). - * - * Now flush and discard the cache -- should succeed. - */ - - pass2 = TRUE; - - if ( show_progress ) /* 1 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* create the cache */ - if ( pass2 ) { - - reset_entries2(); - - file_ptr = setup_cache2((size_t)(1 * 1024 * 1024), - (size_t)( 512 * 1024)); - cache_ptr = file_ptr->shared->cache2; - - base_addr = entries2[MONSTER_ENTRY_TYPE]; - entry_size = MONSTER_ENTRY_SIZE; - } - - if ( show_progress ) /* 2 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* verify that it is empty */ - if ( pass2 ) { - - if ( ( cache_ptr->index_len != 0 ) || - ( cache_ptr->index_size != 0 ) || - ( cache_ptr->slist_len != 0 ) || - ( cache_ptr->slist_size != 0 ) || - ( cache_ptr->evictions_enabled != TRUE ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected cache status 1."); - failure_mssg2 = msg; - - } - } - - if ( show_progress ) /* 3 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* verify that H5C2_get_evictions_enabled() returns the expected value */ - if ( pass2 ) { - - result = H5C2_get_evictions_enabled(cache_ptr, &evictions_enabled); - - if ( ( result != SUCCEED ) || ( evictions_enabled != TRUE ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected evictions enabled 1."); - failure_mssg2 = msg; - } - } - - if ( show_progress ) /* 4 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* fill the cache */ - for ( i = 0; i < 16 ; i++ ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i); - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i, - FALSE, H5C2__NO_FLAGS_SET); - } - - if ( show_progress ) /* 5 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* verify that the cache is full */ - if ( pass2 ) { - - if ( ( cache_ptr->index_len != 16 ) || - ( cache_ptr->index_size != 16 * MONSTER_ENTRY_SIZE ) || - ( cache_ptr->slist_len != 0 ) || - ( cache_ptr->slist_size != 0 ) || - ( cache_ptr->evictions_enabled != TRUE ) ) { - - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected cache status 2."); - failure_mssg2 = msg; - - } - } - - if ( show_progress ) /* 6 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* protect and unprotect another entry */ - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 16); - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 16, - FALSE, H5C2__NO_FLAGS_SET); - - if ( show_progress ) /* 7 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* verify that an entry has been evicted */ - if ( pass2 ) { - - if ( ( cache_ptr->index_len != 16 ) || - ( cache_ptr->index_size != 16 * MONSTER_ENTRY_SIZE ) || - ( cache_ptr->slist_len != 0 ) || - ( cache_ptr->slist_size != 0 ) || - ( cache_ptr->evictions_enabled != TRUE ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected cache status 3."); - failure_mssg2 = msg; - - } - } - - if ( show_progress ) /* 8 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - if ( pass2 ) { - - entry_ptr = &(base_addr[0]); - - result = H5C2_get_entry_status(file_ptr, entry_ptr->addr, - NULL, &in_cache, NULL, NULL, NULL); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "H5C2_get_entry_status() reports failure 1."); - failure_mssg2 = msg; - - } else if ( in_cache ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected status 1."); - failure_mssg2 = msg; - - } else if ( ( ! entry_ptr->deserialized ) || - ( entry_ptr->cleared ) || - ( entry_ptr->serialized ) || - ( ! entry_ptr->destroyed ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected entry history 1."); - failure_mssg2 = msg; - - } - } - - if ( show_progress ) /* 9 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* insert an entry */ - insert_entry2(file_ptr, MONSTER_ENTRY_TYPE, 17, TRUE, H5C2__NO_FLAGS_SET); - - if ( show_progress ) /* 10 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* verify that another entry has been evicted */ - if ( pass2 ) { - - if ( ( cache_ptr->index_len != 16 ) || - ( cache_ptr->index_size != 16 * MONSTER_ENTRY_SIZE ) || - ( cache_ptr->slist_len != 1 ) || - ( cache_ptr->slist_size != MONSTER_ENTRY_SIZE ) || - ( cache_ptr->evictions_enabled != TRUE ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected cache status 4."); - failure_mssg2 = msg; - - } - } - - if ( show_progress ) /* 11 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - if ( pass2 ) { - - entry_ptr = &(base_addr[1]); - - result = H5C2_get_entry_status(file_ptr, entry_ptr->addr, - NULL, &in_cache, NULL, NULL, NULL); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "H5C2_get_entry_status() reports failure 2."); - failure_mssg2 = msg; - - } else if ( in_cache ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected status 2."); - failure_mssg2 = msg; - - } else if ( ( ! entry_ptr->deserialized ) || - ( entry_ptr->cleared ) || - ( entry_ptr->serialized ) || - ( ! entry_ptr->destroyed ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected entry history 2."); - failure_mssg2 = msg; - - } - } - - if ( show_progress ) /* 12 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* disable evictions */ - if ( pass2 ) { - - result = H5C2_set_evictions_enabled(cache_ptr, FALSE); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "can't disable evictions 1."); - failure_mssg2 = msg; - } - } - - if ( show_progress ) /* 13 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* verify that evictions are disabled */ - if ( pass2 ) { - - if ( ( cache_ptr->index_len != 16 ) || - ( cache_ptr->index_size != 16 * MONSTER_ENTRY_SIZE ) || - ( cache_ptr->slist_len != 1 ) || - ( cache_ptr->slist_size != MONSTER_ENTRY_SIZE ) || - ( cache_ptr->evictions_enabled != FALSE ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected cache status 5."); - failure_mssg2 = msg; - - } - } - - if ( show_progress ) /* 14 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* protect and unprotect another entry */ - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 18); - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 18, - FALSE, H5C2__NO_FLAGS_SET); - - if ( show_progress ) /* 15 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* verify that no entry has been evicted */ - if ( pass2 ) { - - if ( ( cache_ptr->index_len != 17 ) || - ( cache_ptr->index_size != 17 * MONSTER_ENTRY_SIZE ) || - ( cache_ptr->slist_len != 1 ) || - ( cache_ptr->slist_size != MONSTER_ENTRY_SIZE ) || - ( cache_ptr->evictions_enabled != FALSE ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected cache status 6."); - failure_mssg2 = msg; - - } - } - - if ( show_progress ) /* 16 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* insert another entry */ - insert_entry2(file_ptr, MONSTER_ENTRY_TYPE, 19, TRUE, H5C2__NO_FLAGS_SET); - - if ( show_progress ) /* 17 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* verify that no entry has been evicted */ - if ( pass2 ) { - - if ( ( cache_ptr->index_len != 18 ) || - ( cache_ptr->index_size != 18 * MONSTER_ENTRY_SIZE ) || - ( cache_ptr->slist_len != 2 ) || - ( cache_ptr->slist_size != 2 * MONSTER_ENTRY_SIZE ) || - ( cache_ptr->evictions_enabled != FALSE ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected cache status 7."); - failure_mssg2 = msg; - - } - } - - if ( show_progress ) /* 18 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* re-enable evictions */ - if ( pass2 ) { - - result = H5C2_set_evictions_enabled(cache_ptr, TRUE); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "can't enable evictions 1."); - failure_mssg2 = msg; - } - } - - if ( show_progress ) /* 19 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* protect and unprotect an entry that is in the cache */ - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 19); - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 19, - FALSE, H5C2__NO_FLAGS_SET); - - if ( show_progress ) /* 20 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* verify that no entries have been evicted */ - if ( pass2 ) { - - if ( ( cache_ptr->index_len != 18 ) || - ( cache_ptr->index_size != 18 * MONSTER_ENTRY_SIZE ) || - ( cache_ptr->slist_len != 2 ) || - ( cache_ptr->slist_size != 2 * MONSTER_ENTRY_SIZE ) || - ( cache_ptr->evictions_enabled != TRUE ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected cache status 8."); - failure_mssg2 = msg; - - } - } - - if ( show_progress ) /* 21 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* protect and unprotect an entry that isn't in the cache */ - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 20); - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 20, - FALSE, H5C2__NO_FLAGS_SET); - - if ( show_progress ) /* 22 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* verify that the entries have been evicted to bring the - * cache back down to its normal size. - */ - - if ( pass2 ) { - - if ( ( cache_ptr->index_len != 16 ) || - ( cache_ptr->index_size != 16 * MONSTER_ENTRY_SIZE ) || - ( cache_ptr->slist_len != 2 ) || - ( cache_ptr->slist_size != 2 * MONSTER_ENTRY_SIZE ) || - ( cache_ptr->evictions_enabled != TRUE ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected cache status 9."); - failure_mssg2 = msg; - - } - } - - if ( show_progress ) /* 23 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - if ( pass2 ) { - - entry_ptr = &(base_addr[2]); - - result = H5C2_get_entry_status(file_ptr, entry_ptr->addr, - NULL, &in_cache, NULL, NULL, NULL); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "H5C2_get_entry_status() reports failure 3."); - failure_mssg2 = msg; - - } else if ( in_cache ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected status 3."); - failure_mssg2 = msg; - - } else if ( ( ! entry_ptr->deserialized ) || - ( entry_ptr->cleared ) || - ( entry_ptr->serialized ) || - ( ! entry_ptr->destroyed ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected entry history 3."); - failure_mssg2 = msg; - - } - } - - if ( show_progress ) /* 24 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - if ( pass2 ) { - - entry_ptr = &(base_addr[3]); - - result = H5C2_get_entry_status(file_ptr, entry_ptr->addr, - NULL, &in_cache, NULL, NULL, NULL); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "H5C2_get_entry_status() reports failure 4."); - failure_mssg2 = msg; - - } else if ( in_cache ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected status 4."); - failure_mssg2 = msg; - - } else if ( ( ! entry_ptr->deserialized ) || - ( entry_ptr->cleared ) || - ( entry_ptr->serialized ) || - ( ! entry_ptr->destroyed ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected entry history 4."); - failure_mssg2 = msg; - - } - } - - if ( show_progress ) /* 25 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* disable evictions again */ - if ( pass2 ) { - - result = H5C2_set_evictions_enabled(cache_ptr, FALSE); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "can't disable evictions 2."); - failure_mssg2 = msg; - } - } - - if ( show_progress ) /* 26 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* protect and unprotect an entry that isn't in the cache, forcing - * the cache to grow. - */ - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 21); - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 21, - FALSE, H5C2__NO_FLAGS_SET); - - - if ( show_progress ) /* 27 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* verify that the cache has grown */ - if ( pass2 ) { - - if ( ( cache_ptr->index_len != 17 ) || - ( cache_ptr->index_size != 17 * MONSTER_ENTRY_SIZE ) || - ( cache_ptr->slist_len != 2 ) || - ( cache_ptr->slist_size != 2 * MONSTER_ENTRY_SIZE ) || - ( cache_ptr->evictions_enabled != FALSE ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected cache status 10."); - failure_mssg2 = msg; - - } - } - - if ( show_progress ) /* 28 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* re-enable evictions again */ - if ( pass2 ) { - - result = H5C2_set_evictions_enabled(cache_ptr, TRUE); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "can't enable evictions 2."); - failure_mssg2 = msg; - } - } - - if ( show_progress ) /* 29 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* insert an entry */ - insert_entry2(file_ptr, MONSTER_ENTRY_TYPE, 22, TRUE, H5C2__NO_FLAGS_SET); - - if ( show_progress ) /* 30 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* verify that the cache has returned to its maximum size */ - if ( pass2 ) { - - if ( ( cache_ptr->index_len != 16 ) || - ( cache_ptr->index_size != 16 * MONSTER_ENTRY_SIZE ) || - ( cache_ptr->slist_len != 3 ) || - ( cache_ptr->slist_size != 3 * MONSTER_ENTRY_SIZE ) || - ( cache_ptr->evictions_enabled != TRUE ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected cache status 11."); - failure_mssg2 = msg; - - } - } - - if ( show_progress ) /* 31 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - if ( pass2 ) { - - entry_ptr = &(base_addr[4]); - - result = H5C2_get_entry_status(file_ptr, entry_ptr->addr, - NULL, &in_cache, NULL, NULL, NULL); - - if ( result < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "H5C2_get_entry_status() reports failure 5."); - failure_mssg2 = msg; - - } else if ( in_cache ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected status 5."); - failure_mssg2 = msg; - - } else if ( ( ! entry_ptr->deserialized ) || - ( entry_ptr->cleared ) || - ( entry_ptr->serialized ) || - ( ! entry_ptr->destroyed ) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Unexpected entry history 5."); - failure_mssg2 = msg; - - } - } - - if ( show_progress ) /* 32 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* disable evictions one last time before we shut down */ - if ( pass2 ) { - - result = H5C2_set_evictions_enabled(cache_ptr, FALSE); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "can't disable evictions 3."); - failure_mssg2 = msg; - } - } - - if ( show_progress ) /* 33 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - if ( pass2 ) { - - takedown_cache2(file_ptr, FALSE, FALSE); - } - - if ( show_progress ) /* 34 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - HDfprintf(stdout, "%s(): failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - if ( core_file_driver_failed ) { - - HDfprintf(stdout, - "%s(): Unable to open test file with core file driver.\n", - fcn_name); - } - - return !pass2; - -} /* check_evictions_enabled() */ - - -/*------------------------------------------------------------------------- - * Function: check_flush_protected_err() - * - * Purpose: Verify that an attempt to flush the cache when it contains - * a protected entry will generate an error. - * - * Return: void - * - * Programmer: John Mainzer - * 6/24/04 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -static unsigned -check_flush_protected_err(void) -{ - const char * fcn_name = "check_flush_protected_err"; - H5F_t * file_ptr = NULL; - - TESTING("flush cache with protected entry error"); - - core_file_driver_failed = FALSE; - - pass2 = TRUE; - - /* allocate a cache, protect an entry, and try to flush. This - * should fail. Unprotect the entry and flush again -- should - * succeed. - */ - - if ( pass2 ) { - - reset_entries2(); - - file_ptr = setup_cache2((size_t)(2 * 1024), - (size_t)(1 * 1024)); - - protect_entry2(file_ptr, 0, 0); - - if ( H5C2_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5C2__NO_FLAGS_SET) - >= 0 ) { - - pass2 = FALSE; - failure_mssg2 = "flush succeeded on cache with protected entry.\n"; - - } else { - - unprotect_entry2(file_ptr, 0, 0, TRUE, H5C2__NO_FLAGS_SET); - - if ( H5C2_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, H5C2__NO_FLAGS_SET) - < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "flush failed after unprotect.\n"; - - } else { - - takedown_cache2(file_ptr, FALSE, FALSE); - } - } - } - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - HDfprintf(stdout, "%s(): failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - if ( core_file_driver_failed ) { - - HDfprintf(stdout, - "%s(): Unable to open test file with core file driver.\n", - fcn_name); - } - - return !pass2; - -} /* check_flush_protected_err() */ - - -/*------------------------------------------------------------------------- - * Function: check_destroy_pinned_err() - * - * Purpose: Verify that an attempt to destroy the cache when it contains - * a pinned entry that can't be unpined during the flush destroy - * will generate an error. - * - * Return: void - * - * Programmer: John Mainzer - * 4/7/06 - * - * Modifications: - * - * JRM -- 10/15/07 - * Minor updates to accomodate cache API mods. - * - *------------------------------------------------------------------------- - */ - -extern H5C2_t * saved_cache2; - -static unsigned -check_destroy_pinned_err(void) -{ - const char * fcn_name = "check_destroy_pinned_err()"; - H5F_t * file_ptr = NULL; - - TESTING("destroy cache with permanently pinned entry error"); - - core_file_driver_failed = FALSE; - - pass2 = TRUE; - - /* allocate a cache, pin an entry, and try to flush destroy. This - * should fail. Unpin the entry and flush destroy again -- should - * succeed. - */ - - if ( pass2 ) { - - reset_entries2(); - - file_ptr = setup_cache2((size_t)(2 * 1024), - (size_t)(1 * 1024)); - - protect_entry2(file_ptr, 0, 0); - unprotect_entry2(file_ptr, 0, 0, FALSE, H5C2__PIN_ENTRY_FLAG); - - if ( H5C2_dest(file_ptr, H5P_DATASET_XFER_DEFAULT) >= 0 ) { - - pass2 = FALSE; - failure_mssg2 = "destroy succeeded on cache with pinned entry.\n"; - - } else { - - unpin_entry2(file_ptr, 0, 0); - - if ( H5C2_dest(file_ptr, H5P_DATASET_XFER_DEFAULT) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "destroy failed after unpin.\n"; - - } else { - file_ptr->shared->cache2 = NULL; - } - } - - if ( saved_cache2 != NULL ) { - - file_ptr->shared->cache2 = saved_cache2; - saved_cache2 = NULL; - - } - - /* call takedown_cache2() with a NULL file_ptr parameter. - * This causes the function to close and delete the file, - * while skipping the call to H5C2_dest(). - */ - takedown_cache2(NULL, FALSE, FALSE); - - } - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - HDfprintf(stdout, "%s(): failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - if ( core_file_driver_failed ) { - - HDfprintf(stdout, - "%s(): Unable to open test file with core file driver.\n", - fcn_name); - } - - return !pass2; - -} /* check_destroy_pinned_err() */ - - -/*------------------------------------------------------------------------- - * Function: check_destroy_protected_err() - * - * Purpose: Verify that an attempt to destroy the cache when it contains - * a protected entry will generate an error. - * - * Return: void - * - * Programmer: John Mainzer - * 6/24/04 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -static unsigned -check_destroy_protected_err(void) -{ - const char * fcn_name = "check_destroy_protected_err"; - H5F_t * file_ptr = NULL; - - TESTING("destroy cache with protected entry error"); - - core_file_driver_failed = FALSE; - - pass2 = TRUE; - - /* allocate a cache, protect an entry, and try to flush. This - * should fail. Unprotect the entry and flush again -- should - * succeed. - */ - - if ( pass2 ) { - - reset_entries2(); - - file_ptr = setup_cache2((size_t)(2 * 1024), - (size_t)(1 * 1024)); - - protect_entry2(file_ptr, 0, 0); - - if ( H5C2_dest(file_ptr, H5P_DATASET_XFER_DEFAULT) >= 0 ) { - - pass2 = FALSE; - failure_mssg2 = "destroy succeeded on cache with protected entry.\n"; - - } else { - - unprotect_entry2(file_ptr, 0, 0, TRUE, H5C2__NO_FLAGS_SET); - - if ( H5C2_dest(file_ptr, H5P_DATASET_XFER_DEFAULT) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "destroy failed after unprotect.\n"; - - } else { - file_ptr->shared->cache2 = NULL; - } - } - - if ( saved_cache2 != NULL ) { - - file_ptr->shared->cache2 = saved_cache2; - saved_cache2 = NULL; - - } - - /* call takedown_cache2() with a NULL file_ptr parameter. - * This causes the function to close and delete the file, - * while skipping the call to H5C2_dest(). - */ - takedown_cache2(NULL, FALSE, FALSE); - } - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - HDfprintf(stdout, "%s(): failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - if ( core_file_driver_failed ) { - - HDfprintf(stdout, - "%s(): Unable to open test file with core file driver.\n", - fcn_name); - } - - return !pass2; - -} /* check_destroy_protected_err() */ - - -/*------------------------------------------------------------------------- - * Function: check_duplicate_insert_err() - * - * Purpose: Verify that an attempt to insert and entry that is - * alread in the cache will generate an error. - * - * Return: void - * - * Programmer: John Mainzer - * 6/24/04 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -static unsigned -check_duplicate_insert_err(void) -{ - const char * fcn_name = "check_duplicate_insert_err"; - herr_t result; - H5F_t * file_ptr = NULL; - test_entry_t * base_addr; - test_entry_t * entry_ptr; - - TESTING("duplicate entry insertion error"); - - core_file_driver_failed = FALSE; - - pass2 = TRUE; - - /* allocate a cache, protect an entry, and then try to insert - * the entry again. This should fail. Unprotect the entry and - * destroy the cache -- should succeed. - */ - - if ( pass2 ) { - - reset_entries2(); - - file_ptr = setup_cache2((size_t)(2 * 1024), - (size_t)(1 * 1024)); - - protect_entry2(file_ptr, 0, 0); - - if ( pass2 ) { - - base_addr = entries2[0]; - entry_ptr = &(base_addr[0]); - - result = H5C2_insert_entry(file_ptr, H5P_DATASET_XFER_DEFAULT, - &(types2[0]), entry_ptr->addr, - entry_ptr->size, - (void *)entry_ptr, H5C2__NO_FLAGS_SET); - - if ( result >= 0 ) { - - pass2 = FALSE; - failure_mssg2 = "insert of duplicate entry succeeded.\n"; - - } else { - - unprotect_entry2(file_ptr, 0, 0, TRUE, H5C2__NO_FLAGS_SET); - - takedown_cache2(file_ptr, FALSE, FALSE); - } - } - } - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - HDfprintf(stdout, "%s(): failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - if ( core_file_driver_failed ) { - - HDfprintf(stdout, - "%s(): Unable to open test file with core file driver.\n", - fcn_name); - } - - return !pass2; - -} /* check_duplicate_insert_err() */ - - -/*------------------------------------------------------------------------- - * Function: check_rename_err() - * - * Purpose: Verify that an attempt to rename an entry to the address - * of an existing entry will generate an error. - * - * Return: void - * - * Programmer: John Mainzer - * 6/24/04 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -static unsigned -check_rename_err(void) -{ - const char * fcn_name = "check_rename_err()"; - herr_t result; - H5F_t * file_ptr = NULL; - H5C2_t * cache_ptr = NULL; - test_entry_t * entry_0_0_ptr; - test_entry_t * entry_0_1_ptr; - test_entry_t * entry_1_0_ptr; - - TESTING("rename to existing entry errors"); - - core_file_driver_failed = FALSE; - - pass2 = TRUE; - - /* allocate a cache, and insert several entries. Try to rename - * entries to other entries resident in the cache. This should - * fail. Destroy the cache -- should succeed. - */ - - if ( pass2 ) { - - reset_entries2(); - - file_ptr = setup_cache2((size_t)(2 * 1024), - (size_t)(1 * 1024)); - cache_ptr = file_ptr->shared->cache2; - - insert_entry2(file_ptr, 0, 0, TRUE, H5C2__NO_FLAGS_SET); - insert_entry2(file_ptr, 0, 1, TRUE, H5C2__NO_FLAGS_SET); - insert_entry2(file_ptr, 1, 0, TRUE, H5C2__NO_FLAGS_SET); - - entry_0_0_ptr = &((entries2[0])[0]); - entry_0_1_ptr = &((entries2[0])[1]); - entry_1_0_ptr = &((entries2[1])[0]); - } - - if ( pass2 ) { - - result = H5C2_rename_entry(cache_ptr, &(types2[0]), - entry_0_0_ptr->addr, entry_0_1_ptr->addr); - - if ( result >= 0 ) { - - pass2 = FALSE; - failure_mssg2 = "rename to addr of same type succeeded.\n"; - } - } - - if ( pass2 ) { - - result = H5C2_rename_entry(cache_ptr, &(types2[0]), - entry_0_0_ptr->addr, entry_1_0_ptr->addr); - - if ( result >= 0 ) { - - pass2 = FALSE; - failure_mssg2 = "rename to addr of different type succeeded.\n"; - } - } - - if ( pass2 ) { - - takedown_cache2(file_ptr, FALSE, FALSE); - } - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - HDfprintf(stdout, "%s: failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - if ( core_file_driver_failed ) { - - HDfprintf(stdout, - "%s(): Unable to open test file with core file driver.\n", - fcn_name); - } - - return !pass2; - -} /* check_rename_err() */ - - -/*------------------------------------------------------------------------- - * Function: check_double_pin_err() - * - * Purpose: Verify that an attempt to pin an entry that is already - * pinned will generate an error. - * - * Return: void - * - * Programmer: John Mainzer - * 4/24/06 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -static unsigned -check_double_pin_err(void) -{ - const char * fcn_name = "check_double_pin_err()"; - herr_t result; - H5F_t * file_ptr = NULL; - test_entry_t * entry_ptr; - - TESTING("pin a pinned entry error"); - - core_file_driver_failed = FALSE; - - pass2 = TRUE; - - /* allocate a cache, protect an entry, unprotect it with the pin flag, - * protect it again, and then try to unprotect it again with the pin - * flag. This should fail. Unpin the entry and destroy the cache - * -- should succeed. - */ - - if ( pass2 ) { - - reset_entries2(); - - file_ptr = setup_cache2((size_t)(2 * 1024), - (size_t)(1 * 1024)); - - protect_entry2(file_ptr, 0, 0); - - unprotect_entry2(file_ptr, 0, 0, FALSE, H5C2__PIN_ENTRY_FLAG); - - protect_entry2(file_ptr, 0, 0); - - entry_ptr = &((entries2[0])[0]); - } - - if ( pass2 ) { - - result = H5C2_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT, - &(types2[0]), entry_ptr->addr, - (void *)entry_ptr, H5C2__PIN_ENTRY_FLAG, - (size_t)0); - - if ( result > 0 ) { - - pass2 = FALSE; - failure_mssg2 = - "attempt to pin a pinned entry succeeded.\n"; - - } else { - - unprotect_entry2(file_ptr, 0, 0, FALSE, H5C2__UNPIN_ENTRY_FLAG); - } - } - - if ( pass2 ) { - - takedown_cache2(file_ptr, FALSE, FALSE); - } - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - HDfprintf(stdout, "%s: failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - if ( core_file_driver_failed ) { - - HDfprintf(stdout, - "%s(): Unable to open test file with core file driver.\n", - fcn_name); - } - - return !pass2; - -} /* check_double_pin_err() */ - - -/*------------------------------------------------------------------------- - * Function: check_double_unpin_err() - * - * Purpose: Verify that an attempt to unpin an unpinned entry will - * generate an error. - * - * Return: void - * - * Programmer: John Mainzer - * 4/24/06 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -static unsigned -check_double_unpin_err(void) -{ - const char * fcn_name = "check_double_unpin_err()"; - herr_t result; - H5F_t * file_ptr = NULL; - test_entry_t * entry_ptr; - - TESTING("unpin an unpinned entry error"); - - core_file_driver_failed = FALSE; - - pass2 = TRUE; - - /* allocate a cache, protect an entry, unprotect it with the unpin flag. - * -- This should fail. - * - * Try again with H5C2_unpin_entry -- this should also fail. - * - * Destroy the cache -- should succeed. - */ - - if ( pass2 ) { - - reset_entries2(); - - file_ptr = setup_cache2((size_t)(2 * 1024), - (size_t)(1 * 1024)); - - protect_entry2(file_ptr, 0, 0); - - entry_ptr = &((entries2[0])[0]); - } - - if ( pass2 ) { - - result = H5C2_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT, - &(types2[0]), entry_ptr->addr, - (void *)entry_ptr, H5C2__UNPIN_ENTRY_FLAG, - (size_t)0); - - if ( result > 0 ) { - - pass2 = FALSE; - failure_mssg2 = - "attempt to unpin an unpinned entry succeeded 1.\n"; - - } else { - - unprotect_entry2(file_ptr, 0, 0, FALSE, H5C2__NO_FLAGS_SET); - } - } - - if ( pass2 ) { - - result = H5C2_unpin_entry((void *)entry_ptr); - - if ( result > 0 ) { - - pass2 = FALSE; - failure_mssg2 = - "attempt to unpin an unpinned entry succeeded 2.\n"; - - } - } - - if ( pass2 ) { - - takedown_cache2(file_ptr, FALSE, FALSE); - } - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - HDfprintf(stdout, "%s: failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - if ( core_file_driver_failed ) { - - HDfprintf(stdout, - "%s(): Unable to open test file with core file driver.\n", - fcn_name); - } - - return !pass2; - -} /* check_double_unpin_err() */ - - -/*------------------------------------------------------------------------- - * Function: check_pin_entry_errs() - * - * Purpose: Verify that invalid calls to H5C2_pin_protected_entry() - * generate errors as expected. - * - * Return: void - * - * Programmer: John Mainzer - * 4/24/06 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -static unsigned -check_pin_entry_errs(void) -{ - const char * fcn_name = "check_pin_entry_errs()"; - herr_t result; - H5F_t * file_ptr = NULL; - test_entry_t * entry_ptr; - - TESTING("pin entry related errors"); - - core_file_driver_failed = FALSE; - - pass2 = TRUE; - - /* Allocate a cache, protect an entry, unprotect it with no flags, - * and then call H5C2_pin_protected_entry() to pin it -- This should fail. - * - * Protect the entry again, unprotect it with a pin flag, protect it - * again, and then call H5C2_pin_protected_entry() to pin it -- This - * should fail also. - * - * Unprotect the entry with the unpin flag. - * - * Destroy the cache -- should succeed. - */ - - if ( pass2 ) { - - reset_entries2(); - - file_ptr = setup_cache2((size_t)(2 * 1024), - (size_t)(1 * 1024)); - - protect_entry2(file_ptr, 0, 0); - - unprotect_entry2(file_ptr, 0, 0, FALSE, H5C2__NO_FLAGS_SET); - - entry_ptr = &((entries2[0])[0]); - } - - if ( pass2 ) { - - result = H5C2_pin_protected_entry((void *)entry_ptr); - - if ( result > 0 ) { - - pass2 = FALSE; - failure_mssg2 = - "attempt to pin an unprotected entry succeeded.\n"; - - } else { - - protect_entry2(file_ptr, 0, 0); - - unprotect_entry2(file_ptr, 0, 0, FALSE, H5C2__PIN_ENTRY_FLAG); - - protect_entry2(file_ptr, 0, 0); - } - } - - if ( pass2 ) { - - result = H5C2_pin_protected_entry((void *)entry_ptr); - - if ( result > 0 ) { - - pass2 = FALSE; - failure_mssg2 = - "attempt to pin a pinned, protected entry succeeded.\n"; - - } else { - - unprotect_entry2(file_ptr, 0, 0, FALSE, H5C2__UNPIN_ENTRY_FLAG); - - } - } - - if ( pass2 ) { - - takedown_cache2(file_ptr, FALSE, FALSE); - } - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - HDfprintf(stdout, "%s: failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - if ( core_file_driver_failed ) { - - HDfprintf(stdout, - "%s(): Unable to open test file with core file driver.\n", - fcn_name); - } - - return !pass2; - -} /* check_pin_entry_errs() */ - - -/*------------------------------------------------------------------------- - * Function: check_double_protect_err() - * - * Purpose: Verify that an attempt to protect an entry that is already - * protected will generate an error. - * - * Return: void - * - * Programmer: John Mainzer - * 6/24/04 - * - * Modifications: - * - * - Modified call to H5C2_protect() to pass2 H5C2__NO_FLAGS_SET in the - * the new flags parameter. - * - * JRM -- 3/28/07 - * - *------------------------------------------------------------------------- - */ - -static unsigned -check_double_protect_err(void) -{ - const char * fcn_name = "check_double_protect_err()"; - H5F_t * file_ptr = NULL; - test_entry_t * entry_ptr; - H5C2_cache_entry_t * cache_entry_ptr; - - TESTING("protect a protected entry error"); - - core_file_driver_failed = FALSE; - - pass2 = TRUE; - - /* allocate a cache, protect an entry, and then try to protect - * the entry again. This should fail. Unprotect the entry and - * destroy the cache -- should succeed. - */ - - if ( pass2 ) { - - reset_entries2(); - - file_ptr = setup_cache2((size_t)(2 * 1024), - (size_t)(1 * 1024)); - - protect_entry2(file_ptr, 0, 0); - - entry_ptr = &((entries2[0])[0]); - } - - if ( pass2 ) { - - cache_entry_ptr = H5C2_protect(file_ptr, H5P_DATASET_XFER_DEFAULT, - &(types2[0]), entry_ptr->addr, - entry_ptr->size, NULL, - H5C2__NO_FLAGS_SET); - - if ( cache_entry_ptr != NULL ) { - - pass2 = FALSE; - failure_mssg2 = "attempt to protect a protected entry succeeded.\n"; - } - } - - if ( pass2 ) { - - unprotect_entry2(file_ptr, 0, 0, FALSE, H5C2__NO_FLAGS_SET); - } - - if ( pass2 ) { - - takedown_cache2(file_ptr, FALSE, FALSE); - } - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - HDfprintf(stdout, "%s: failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - if ( core_file_driver_failed ) { - - HDfprintf(stdout, - "%s(): Unable to open test file with core file driver.\n", - fcn_name); - } - - return !pass2; - -} /* check_double_protect_err() */ - - -/*------------------------------------------------------------------------- - * Function: check_double_unprotect_err() - * - * Purpose: Verify that an attempt to unprotect an entry that is already - * unprotected will generate an error. - * - * Return: void - * - * Programmer: John Mainzer - * 6/24/04 - * - * Modifications: - * - * JRM -- 6/17/05 - * Modified function to use the new dirtied parameter in - * H5C2_unprotect(). - * - * JRM -- 9/8/05 - * Updated function for the new size change parameter in - * H5C2_unprotect(). We don't use them for now. - * - *------------------------------------------------------------------------- - */ - -static unsigned -check_double_unprotect_err(void) -{ - const char * fcn_name = "check_double_unprotect_err()"; - herr_t result; - H5F_t * file_ptr = NULL; - test_entry_t * entry_ptr; - - TESTING("unprotect an unprotected entry error"); - - core_file_driver_failed = FALSE; - - pass2 = TRUE; - - /* allocate a cache, protect an entry, unprotect it, and then try to - * unprotect the entry again. This should fail. Destroy the cache - * -- should succeed. - */ - - if ( pass2 ) { - - reset_entries2(); - - file_ptr = setup_cache2((size_t)(2 * 1024), - (size_t)(1 * 1024)); - - protect_entry2(file_ptr, 0, 0); - - unprotect_entry2(file_ptr, 0, 0, FALSE, H5C2__NO_FLAGS_SET); - - entry_ptr = &((entries2[0])[0]); - } - - if ( pass2 ) { - - result = H5C2_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT, - &(types2[0]), entry_ptr->addr, - (void *)entry_ptr, H5C2__NO_FLAGS_SET, - (size_t)0); - - if ( result > 0 ) { - - pass2 = FALSE; - failure_mssg2 = - "attempt to unprotect an unprotected entry succeeded 1.\n"; - } - } - - if ( pass2 ) { - - takedown_cache2(file_ptr, FALSE, FALSE); - } - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - HDfprintf(stdout, "%s: failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - if ( core_file_driver_failed ) { - - HDfprintf(stdout, - "%s(): Unable to open test file with core file driver.\n", - fcn_name); - } - - return !pass2; - -} /* check_double_unprotect_err() */ - - -/*------------------------------------------------------------------------- - * Function: check_mark_entry_dirty_errs() - * - * Purpose: Verify that: - * - * 1) a call to H5C2_mark_pinned_entry_dirty with an upinned - * entry as the target will generate an error. - * - * 2) a call to H5C2_mark_pinned_entry_dirty with a protected - * entry as the target will generate an error. - * - * 3) a call to H5C2_mark_pinned_or_protected_entry_dirty with - * and unpinned and unprotected entry will generate an - * error. - * - * Return: void - * - * Programmer: John Mainzer - * 5/17/06 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -static unsigned -check_mark_entry_dirty_errs(void) -{ - const char * fcn_name = "check_mark_entry_dirty_errs()"; - herr_t result; - H5F_t * file_ptr = NULL; - test_entry_t * entry_ptr; - - TESTING("mark entry dirty related errors"); - - core_file_driver_failed = FALSE; - - pass2 = TRUE; - - /* allocate a cache, protect an entry, and then attempt to mark it dirty - * with the H5C2_mark_pinned_entry_dirty() call -- This should fail. - * - * Then unprotect the entry without pinning it, and try to mark it dirty - * again -- this should fail too. - * - * Try it again using H5C2_mark_pinned_or_protected_entry_dirty -- this - * should fail as well. - * - * Destroy the cache -- should succeed. - */ - - if ( pass2 ) { - - reset_entries2(); - - file_ptr = setup_cache2((size_t)(2 * 1024), - (size_t)(1 * 1024)); - - protect_entry2(file_ptr, 0, 0); - - unprotect_entry2(file_ptr, 0, 0, FALSE, H5C2__PIN_ENTRY_FLAG); - - protect_entry2(file_ptr, 0, 0); - - entry_ptr = &((entries2[0])[0]); - } - - if ( pass2 ) { - - result = H5C2_mark_pinned_entry_dirty((void *)entry_ptr, - FALSE, (size_t)0); - - if ( result > 0 ) { - - pass2 = FALSE; - failure_mssg2 = - "attempt dirty a pinned and protected entry succeeded.\n"; - - } else { - - unprotect_entry2(file_ptr, 0, 0, FALSE, H5C2__UNPIN_ENTRY_FLAG); - } - } - - if ( pass2 ) { - - result = H5C2_mark_pinned_entry_dirty((void *)entry_ptr, - FALSE, (size_t)0); - - - if ( result > 0 ) { - - pass2 = FALSE; - failure_mssg2 = - "attempt to dirty a unpinned and unprotected entry succeeded 1.\n"; - } - } - - if ( pass2 ) { - - result = H5C2_mark_pinned_or_protected_entry_dirty((void *)entry_ptr); - - - if ( result > 0 ) { - - pass2 = FALSE; - failure_mssg2 = - "attempt to dirty a unpinned and unprotected entry succeeded 2.\n"; - } - } - - if ( pass2 ) { - - takedown_cache2(file_ptr, FALSE, FALSE); - } - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - HDfprintf(stdout, "%s: failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - if ( core_file_driver_failed ) { - - HDfprintf(stdout, - "%s(): Unable to open test file with core file driver.\n", - fcn_name); - } - - return !pass2; - -} /* check_mark_entry_dirty_errs() */ - - -/*------------------------------------------------------------------------- - * Function: check_expunge_entry_errs() - * - * Purpose: Verify that invalid calls to H5C2_expunge_entry() - * generate errors as expected. - * - * Return: void - * - * Programmer: John Mainzer - * 7/6/06 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -static unsigned -check_expunge_entry_errs(void) -{ - const char * fcn_name = "check_expunge_entry_errs()"; - herr_t result; - H5F_t * file_ptr = NULL; - test_entry_t * entry_ptr; - - TESTING("expunge entry related errors"); - - core_file_driver_failed = FALSE; - - pass2 = TRUE; - - /* Allocate a cache, protect an entry, and then call H5C2_expunge_entry() - * to expunge it -- this should fail - * - * Unprotect the the entry with the pinned flag, and then call - * H5C2_expunge_entry() again. This should fail too. - * - * Finally, unpin the entry and call H5C2_expunge_entry() yet again. - * This should succeed. - * - * Destroy the cache -- should succeed. - */ - - if ( pass2 ) { - - reset_entries2(); - - file_ptr = setup_cache2((size_t)(2 * 1024), - (size_t)(1 * 1024)); - - entry_ptr = &((entries2[0])[0]); - - protect_entry2(file_ptr, 0, 0); - - } - - if ( pass2 ) { - - result = H5C2_expunge_entry(file_ptr, H5P_DATASET_XFER_DEFAULT, - &(types2[0]), entry_ptr->addr); - - if ( result > 0 ) { - - pass2 = FALSE; - failure_mssg2 = - "attempt to expunge a protected entry succeeded.\n"; - - } else { - - unprotect_entry2(file_ptr, 0, 0, FALSE, H5C2__PIN_ENTRY_FLAG); - - } - } - - if ( pass2 ) { - - result = H5C2_expunge_entry(file_ptr, H5P_DATASET_XFER_DEFAULT, - &(types2[0]), entry_ptr->addr); - - if ( result > 0 ) { - - pass2 = FALSE; - failure_mssg2 = - "attempt to expunge a pinned entry succeeded.\n"; - - } else { - - unpin_entry2(file_ptr, 0, 0); - - } - } - - if ( pass2 ) { - - result = H5C2_expunge_entry(file_ptr, H5P_DATASET_XFER_DEFAULT, - &(types2[0]), entry_ptr->addr); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = - "attempt to expunge an unpinned and unprotected entry failed.\n"; - - } - } - - - if ( pass2 ) { - - takedown_cache2(file_ptr, FALSE, FALSE); - } - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - HDfprintf(stdout, "%s: failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - if ( core_file_driver_failed ) { - - HDfprintf(stdout, - "%s(): Unable to open test file with core file driver.\n", - fcn_name); - } - - return !pass2; - -} /* check_expunge_entry_errs() */ - - -/*------------------------------------------------------------------------- - * Function: check_resize_entry_errs() - * - * Purpose: Verify that invalid calls to H5C2_resize_pinned_entry() - * generates errors as expected. - * - * Return: void - * - * Programmer: John Mainzer - * 7/7/06 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -static unsigned -check_resize_entry_errs(void) -{ - const char * fcn_name = "check_resize_entry_errs()"; - herr_t result; - H5F_t * file_ptr = NULL; - test_entry_t * entry_ptr; - - TESTING("resize entry related errors"); - - core_file_driver_failed = FALSE; - - pass2 = TRUE; - - /* Allocate a cache, protect an entry, and then call - * H5C2_resize_pinned_entry() to resize it -- this should fail. - * - * Unprotect the the entry with the pinned flag, and then call - * H5C2_resize_pinned_entry() again with new size of zero. - * This should fail too. - * - * Finally, unpin the entry and destroy the cache. - * This should succeed. - */ - - if ( pass2 ) { - - reset_entries2(); - - file_ptr = setup_cache2((size_t)(2 * 1024), - (size_t)(1 * 1024)); - - entry_ptr = &((entries2[0])[0]); - - protect_entry2(file_ptr, 0, 0); - - } - - if ( pass2 ) { - - result = H5C2_resize_pinned_entry((void *)entry_ptr, (size_t)1); - - if ( result > 0 ) { - - pass2 = FALSE; - failure_mssg2 = - "Call to H5C2_resize_pinned_entry on a protected entry succeeded.\n"; - - } else { - - unprotect_entry2(file_ptr, 0, 0, FALSE, H5C2__PIN_ENTRY_FLAG); - - } - } - - if ( pass2 ) { - - result = H5C2_resize_pinned_entry((void *)entry_ptr, (size_t)0); - - if ( result > 0 ) { - - pass2 = FALSE; - failure_mssg2 = - "Call to H5C2_resize_pinned_entry with 0 new size succeeded.\n"; - - } else { - - unpin_entry2(file_ptr, 0, 0); - - } - } - - if ( pass2 ) { - - takedown_cache2(file_ptr, FALSE, FALSE); - } - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - HDfprintf(stdout, "%s: failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - if ( core_file_driver_failed ) { - - HDfprintf(stdout, - "%s(): Unable to open test file with core file driver.\n", - fcn_name); - } - - return !pass2; - -} /* check_resize_entry_errs() */ - - -/*------------------------------------------------------------------------- - * Function: check_unprotect_ro_dirty_err() - * - * Purpose: If an entry is protected read only, verify that unprotecting - * it dirty will generate an error. - * - * Return: void - * - * Programmer: John Mainzer - * 4/3/07 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -static unsigned -check_unprotect_ro_dirty_err(void) -{ - const char * fcn_name = "check_unprotect_ro_dirty_err()"; - herr_t result; - H5F_t * file_ptr = NULL; - test_entry_t * entry_ptr; - - TESTING("unprotect a read only entry dirty error"); - - core_file_driver_failed = FALSE; - - pass2 = TRUE; - - /* allocate a cache, protect an entry read only, and then unprotect it - * with the dirtied flag set. This should fail. Destroy the cache - * -- should succeed. - */ - - if ( pass2 ) { - - reset_entries2(); - - file_ptr = setup_cache2((size_t)(2 * 1024), - (size_t)(1 * 1024)); - - protect_entry_ro2(file_ptr, 0, 0); - - entry_ptr = &((entries2[0])[0]); - } - - if ( pass2 ) { - - result = H5C2_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT, - &(types2[0]), entry_ptr->addr, - (void *)entry_ptr, H5C2__DIRTIED_FLAG, - (size_t)0); - - if ( result >= 0 ) { - - pass2 = FALSE; - failure_mssg2 = - "attempt to unprotect a ro entry dirty succeeded 1.\n"; - } - } - - if ( pass2 ) { - - unprotect_entry2(file_ptr, 0, 0, FALSE, H5C2__NO_FLAGS_SET); - - } - - if ( pass2 ) { - - takedown_cache2(file_ptr, FALSE, FALSE); - } - - /* allocate a another cache, protect an entry read only twice, and - * then unprotect it with the dirtied flag set. This should fail. - * Unprotect it with no flags set twice and then destroy the cache. - * This should succeed. - */ - - if ( pass2 ) { - - reset_entries2(); - - file_ptr = setup_cache2((size_t)(2 * 1024), - (size_t)(1 * 1024)); - - protect_entry_ro2(file_ptr, 0, 0); - protect_entry_ro2(file_ptr, 0, 0); - - entry_ptr = &((entries2[0])[0]); - } - - if ( pass2 ) { - - result = H5C2_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT, - &(types2[0]), entry_ptr->addr, - (void *)entry_ptr, H5C2__DIRTIED_FLAG, - (size_t)0); - - if ( result > 0 ) { - - pass2 = FALSE; - failure_mssg2 = - "attempt to unprotect a ro entry dirty succeeded 2.\n"; - } - } - - if ( pass2 ) { - - unprotect_entry2(file_ptr, 0, 0, FALSE, H5C2__NO_FLAGS_SET); - unprotect_entry2(file_ptr, 0, 0, FALSE, H5C2__NO_FLAGS_SET); - - } - - if ( pass2 ) { - - takedown_cache2(file_ptr, FALSE, FALSE); - } - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - HDfprintf(stdout, "%s: failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - if ( core_file_driver_failed ) { - - HDfprintf(stdout, - "%s(): Unable to open test file with core file driver.\n", - fcn_name); - } - - return !pass2; - -} /* check_unprotect_ro_dirty_err() */ - - -/*------------------------------------------------------------------------- - * Function: check_protect_ro_rw_err() - * - * Purpose: If an entry is protected read only, verify that protecting - * it rw will generate an error. - * - * Return: void - * - * Programmer: John Mainzer - * 4/9/07 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -static unsigned -check_protect_ro_rw_err(void) -{ - const char * fcn_name = "check_protect_ro_rw_err()"; - H5F_t * file_ptr = NULL; - test_entry_t * entry_ptr; - void * thing_ptr = NULL; - - TESTING("protect a read only entry rw error"); - - core_file_driver_failed = FALSE; - - pass2 = TRUE; - - /* allocate a cache, protect an entry read only, and then try to protect - * it again rw. This should fail. - * - * Unprotect the entry and destroy the cache -- should succeed. - */ - - if ( pass2 ) { - - reset_entries2(); - - file_ptr = setup_cache2((size_t)(2 * 1024), - (size_t)(1 * 1024)); - - protect_entry_ro2(file_ptr, 0, 0); - - entry_ptr = &((entries2[0])[0]); - } - - if ( pass2 ) { - - thing_ptr = H5C2_protect(file_ptr, H5P_DATASET_XFER_DEFAULT, - &(types2[0]), entry_ptr->addr, - entry_ptr->size, NULL, H5C2__NO_FLAGS_SET); - - if ( thing_ptr != NULL ) { - - pass2 = FALSE; - failure_mssg2 = "attempt to protect a ro entry rw succeeded.\n"; - } - } - - if ( pass2 ) { - - unprotect_entry2(file_ptr, 0, 0, FALSE, H5C2__NO_FLAGS_SET); - } - - if ( pass2 ) { - - takedown_cache2(file_ptr, FALSE, FALSE); - } - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - HDfprintf(stdout, "%s: failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - if ( core_file_driver_failed ) { - - HDfprintf(stdout, - "%s(): Unable to open test file with core file driver.\n", - fcn_name); - } - - return !pass2; - -} /* check_protect_ro_rw_err() */ - - -/*------------------------------------------------------------------------- - * Function: check_evictions_enabled_err() - * - * Purpose: Verify that H5C2_get_evictions_enabled() and - * H5C2_set_evictions_enabled() generate errors as expected. - * - * Return: void - * - * Programmer: John Mainzer - * 8/3/07 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -static unsigned -check_check_evictions_enabled_err(void) -{ - const char * fcn_name = "check_evictions_enabled_err()"; - herr_t result; - hbool_t evictions_enabled; - H5F_t * file_ptr = NULL; - H5C2_t * cache_ptr = NULL; - - TESTING("get/set evictions enabled errors"); - - core_file_driver_failed = FALSE; - - pass2 = TRUE; - - /* allocate a cache. - * - * Call H5C2_get_evictions_enabled(), passing it a NULL cache_ptr, - * should fail. - * - * Repeat with a NULL evictions_enabled_ptr, should fail as well. - * - * Configure the cache to use auto cache resize. Call - * H5C2_set_evictions_enabled() to disable evictions. Should fail. - * - * Unprotect the entry and destroy the cache -- should succeed. - */ - - if ( pass2 ) { - - reset_entries2(); - - file_ptr = setup_cache2((size_t)(2 * 1024), - (size_t)(1 * 1024)); - cache_ptr = file_ptr->shared->cache2; - } - - if ( pass2 ) { - - result = H5C2_get_evictions_enabled(NULL, &evictions_enabled); - - if ( result == SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_evictions_enabled succeeded() 1.\n"; - } - } - - if ( pass2 ) { - - result = H5C2_get_evictions_enabled(cache_ptr, NULL); - - if ( result == SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_evictions_enabled succeeded() 2.\n"; - } - } - - if ( pass2 ) { - - result = H5C2_set_evictions_enabled(cache_ptr, TRUE); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_evictions_enabled failed().\n"; - - } - } - - if ( pass2 ) { - - (cache_ptr->resize_ctl).incr_mode = H5C2_incr__threshold; - - result = H5C2_get_evictions_enabled(cache_ptr, FALSE); - - if ( result == SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_evictions_enabled succeeded() 1.\n"; - - } else if ( cache_ptr->evictions_enabled == TRUE ) { - - } - - (cache_ptr->resize_ctl).incr_mode = H5C2_incr__off; - } - - if ( pass2 ) { - - (cache_ptr->resize_ctl).decr_mode = H5C2_decr__threshold; - - result = H5C2_get_evictions_enabled(cache_ptr, FALSE); - - if ( result == SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_evictions_enabled succeeded() 2.\n"; - } - - (cache_ptr->resize_ctl).decr_mode = H5C2_decr__off; - } - - - if ( pass2 ) { - - takedown_cache2(file_ptr, FALSE, FALSE); - } - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - HDfprintf(stdout, "%s: failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - if ( core_file_driver_failed ) { - - HDfprintf(stdout, - "%s(): Unable to open test file with core file driver.\n", - fcn_name); - } - - return !pass2; - -} /* check_evictions_enabled_err() */ - - -/*------------------------------------------------------------------------- - * Function: check_auto_cache_resize() - * - * Purpose: Exercise the automatic cache resizing functionality. - * The objective is to operate the auto-resize code in - * all possible modes. Unfortunately, there are quite - * a few of them. - * - * Return: void - * - * Programmer: John Mainzer - * 10/29/04 - * - * Modifications: - * - * John Mainzer 1/8/08 - * Added a basic set of tests for the flash cache size - * increment code. - * - *------------------------------------------------------------------------- - */ - -hbool_t rpt_fcn_called = FALSE; -enum H5C2_resize_status rpt_status; - -static void test_rpt_fcn(UNUSED H5C2_t * cache_ptr, - UNUSED int32_t version, - UNUSED double hit_rate, - enum H5C2_resize_status status, - UNUSED size_t old_max_cache_size, - UNUSED size_t new_max_cache_size, - UNUSED size_t old_min_clean_size, - UNUSED size_t new_min_clean_size) -{ - rpt_fcn_called = TRUE; - rpt_status = status; -} - -static unsigned -check_auto_cache_resize(void) -{ - const char * fcn_name = "check_auto_cache_resize()"; - hbool_t show_progress = FALSE; - herr_t result; - int32_t i; - int32_t checkpoint = 0; - H5F_t * file_ptr = NULL; - H5C2_t * cache_ptr = NULL; - H5C2_auto_size_ctl_t auto_size_ctl = - { - /* int32_t version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* H5C2_auto_resize_report_fcn rpt_fcn = */ test_rpt_fcn, - - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (512 * 1024), - - /* double min_clean_fraction = */ 0.5, - - /* size_t max_size = */ (14 * 1024 * 1024), - /* size_t min_size = */ (512 * 1024), - - /* int64_t epoch_length = */ 1000, - - - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - - /* double lower_hr_threshold = */ 0.75, - - /* double increment = */ 2.0, - - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - - - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__threshold, - - /* double upper_hr_threshold = */ 0.995, - - /* double decrement = */ 0.1, - - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - - /* int32_t epochs_before_eviction = */ 3, - - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.05 - }; - - TESTING("automatic cache resizing"); - - core_file_driver_failed = FALSE; - - pass2 = TRUE; - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* allocate a cache, enable automatic cache resizing, and then force - * the cache through all its operational modes. Verify that all - * performs as expected. - */ - - if ( pass2 ) { - - reset_entries2(); - - file_ptr = setup_cache2((size_t)(2 * 1024), - (size_t)(1 * 1024)); - cache_ptr = file_ptr->shared->cache2; - } - - if ( pass2 ) { - - result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 1.\n"; - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->max_cache_size != (512 * 1024) ) || - ( cache_ptr->min_clean_size != (256 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "bad cache size after initialization.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force low hit rate with cache not full -- should result in not - * full status. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, PICO_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, PICO_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != not_full ) || - ( cache_ptr->max_cache_size != (512 * 1024) ) || - ( cache_ptr->min_clean_size != (256 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 1.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force low hit rate with cache full -- should result in increase - * of cache size from .5 to 1 meg. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != increase ) || - ( cache_ptr->max_cache_size != (1 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (512 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 2.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force low hit rate with cache not full -- should result in not - * full status. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, PICO_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, PICO_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != not_full ) || - ( cache_ptr->max_cache_size != (1 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (512 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 3.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force low hit rate with cache full again -- should result in increase - * of cache size from 1 to 2 meg. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != increase ) || - ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 4.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force low hit rate with cache full again -- should result in increase - * of cache size from 2 to 4 meg. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != increase ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 5.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force low hit rate with cache full again -- should result in increase - * of cache size from 4 to 8 meg. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != increase ) || - ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 6.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force low hit rate with cache full again -- should result in increase - * of cache size from 8 to 12 meg. Note that max increase reduced the - * size of the increase. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != increase ) || - ( cache_ptr->max_cache_size != (12 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (6 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 7.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force low hit rate with cache full again -- should result in increase - * of cache size from 12 to 14 meg. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != increase ) || - ( cache_ptr->max_cache_size != (14 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (7 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 8.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force low hit rate with cache full and at maximum size -- should - * in no change in size and a result of at_max_size. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != at_max_size ) || - ( cache_ptr->max_cache_size != (14 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (7 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 9.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force high hit rate with cache full and at maximum size -- should - * result in a decrease from 14 to 13 Meg -- note that max decrease - * reduced the size of the reduction - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (13 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (6 * 1024 * 1024 + 512 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 10.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* the current cache configuration is inconvenient for testing cache - * size reduction, so lets change it some something easier to work - * with. - */ - - if ( pass2 ) { - - auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - auto_size_ctl.rpt_fcn = test_rpt_fcn; - - auto_size_ctl.set_initial_size = TRUE; - auto_size_ctl.initial_size = 4 * 1000 * 1000 + 10; - - auto_size_ctl.min_clean_fraction = 0.1; - - auto_size_ctl.max_size = 8 * 1000 * 1000; - auto_size_ctl.min_size = 500 * 1000; - - auto_size_ctl.epoch_length = 1000; - - - auto_size_ctl.incr_mode = H5C2_incr__threshold; - - auto_size_ctl.lower_hr_threshold = 0.75; - - auto_size_ctl.increment = 2.0; - - auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (4 * 1000 * 1000); - - auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - auto_size_ctl.flash_multiple = 2.0; - auto_size_ctl.flash_threshold = 0.5; - - auto_size_ctl.decr_mode = H5C2_decr__threshold; - - auto_size_ctl.upper_hr_threshold = 0.995; - - auto_size_ctl.decrement = 0.5; - - auto_size_ctl.apply_max_decrement = TRUE; - auto_size_ctl.max_decrement = (1 * 1000 * 1000); - - auto_size_ctl.epochs_before_eviction = 3; - - auto_size_ctl.apply_empty_reserve = TRUE; - auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 2.\n"; - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->max_cache_size != (4 * 1000 * 1000 + 10) ) || - ( cache_ptr->min_clean_size != (400 * 1000 + 1) ) ) { - - pass2 = FALSE; - failure_mssg2 = "bad cache size after set resize re-config 1.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force high hit rate -- should result in a decrease from ~4 to ~3 - * M -- note that max decrease reduces the size of the reduction - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (3 * 1000 * 1000 + 10) ) || - ( cache_ptr->min_clean_size != (300 * 1000 + 1) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 11.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force high hit rate again -- should result in a decrease from ~3 - * to ~2 M -- again note that max decrease reduces the size of the - * reduction. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (2 * 1000 * 1000 + 10) ) || - ( cache_ptr->min_clean_size != (200 * 1000 + 1) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 12.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force high hit rate again -- should result in a decrease from ~2 - * to ~1 M -- again note that max decrease reduces the size of the - * reduction, but only by five bites. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (1 * 1000 * 1000 + 10) ) || - ( cache_ptr->min_clean_size != (100 * 1000 + 1) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 13.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force high hit rate again -- should result in a decrease from ~1 - * to ~0.5 M -- max decrease is no longer a factor. New size is five - * bytes above the minimum. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (500 * 1000 + 5) ) || - ( cache_ptr->min_clean_size != (50 * 1000) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 14.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force high hit rate again -- should result in a decrease of five - * bytes to the minimum cache size. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (500 * 1000) ) || - ( cache_ptr->min_clean_size != (50 * 1000) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 15.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force high hit rate again -- Already at minimum size so no change in - * cache size and result should be at_min_size. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != at_min_size ) || - ( cache_ptr->max_cache_size != (500 * 1000) ) || - ( cache_ptr->min_clean_size != (50 * 1000) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 16.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force in range hit rate -- should be no change in cache size, - * and result should be in_spec. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 900 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i + 1000); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i + 1000, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (500 * 1000) ) || - ( cache_ptr->min_clean_size != (50 * 1000) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 17.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force low hit rate with cache full -- should - * increase cache size from .5 to 1 M. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != increase ) || - ( cache_ptr->max_cache_size != (1 * 1000 * 1000) ) || - ( cache_ptr->min_clean_size != (100 * 1000) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 18.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force high hit rate -- should result in a decrease to the - * minimum cache size. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (500 * 1000) ) || - ( cache_ptr->min_clean_size != (50 * 1000) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 19.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /****************************************************************** - * now do some tests with the maximum increase and decrease sizes - * disabled. - ******************************************************************/ - - if ( pass2 ) { - - auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - auto_size_ctl.rpt_fcn = test_rpt_fcn; - - auto_size_ctl.set_initial_size = TRUE; - auto_size_ctl.initial_size = 4 * 1024 * 1024; - - auto_size_ctl.min_clean_fraction = 0.5; - - auto_size_ctl.max_size = 16 * 1024 * 1024; - auto_size_ctl.min_size = 1 * 1024 * 1024; - - auto_size_ctl.epoch_length = 1000; - - - auto_size_ctl.incr_mode = H5C2_incr__threshold; - - auto_size_ctl.lower_hr_threshold = 0.75; - - auto_size_ctl.increment = 4.0; - - auto_size_ctl.apply_max_increment = FALSE; - auto_size_ctl.max_increment = (4 * 1024 * 1024); - - auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - auto_size_ctl.flash_multiple = 2.0; - auto_size_ctl.flash_threshold = 0.5; - - auto_size_ctl.decr_mode = H5C2_decr__threshold; - - auto_size_ctl.upper_hr_threshold = 0.995; - - auto_size_ctl.decrement = 0.25; - - auto_size_ctl.apply_max_decrement = FALSE; - auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - auto_size_ctl.epochs_before_eviction = 3; - - auto_size_ctl.apply_empty_reserve = TRUE; - auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 3.\n"; - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "bad cache size after set resize re-config 2.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force high hit rate -- should result in a decrease to the - * minimum cache size. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (1 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (512 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 20.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force low hit rate with cache full -- should increase cache size - * from 1 to 4 Meg. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != increase ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 21.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force low hit rate again with cache full -- should increase cache - * size from 4 to 16 Meg. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != increase ) || - ( cache_ptr->max_cache_size != (16 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != ( 8 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 22.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force high hit rate -- should result in a decrease cache size from - * 16 to 4 Meg. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 23.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /****************************************************************** - * We have tested the threshold increment and decrement modes. - * must now test the ageout decrement mode. - * - * Reconfigure the cache for this testing. - ******************************************************************/ - - if ( pass2 ) { - - auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - auto_size_ctl.rpt_fcn = test_rpt_fcn; - - auto_size_ctl.set_initial_size = TRUE; - auto_size_ctl.initial_size = 8 * 1024 * 1024; - - auto_size_ctl.min_clean_fraction = 0.5; - - auto_size_ctl.max_size = 8 * 1024 * 1024; - auto_size_ctl.min_size = 512 * 1024; - - auto_size_ctl.epoch_length = 1000; - - - auto_size_ctl.incr_mode = H5C2_incr__threshold; - - auto_size_ctl.lower_hr_threshold = 0.75; - - auto_size_ctl.increment = 2.0; - - auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (4 * 1024 * 1024); - - auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - auto_size_ctl.flash_multiple = 2.0; - auto_size_ctl.flash_threshold = 0.5; - - - auto_size_ctl.decr_mode = H5C2_decr__age_out; - - auto_size_ctl.upper_hr_threshold = 0.995; - - auto_size_ctl.decrement = 0.5; - - auto_size_ctl.apply_max_decrement = FALSE; - auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - auto_size_ctl.epochs_before_eviction = 3; - - auto_size_ctl.apply_empty_reserve = FALSE; - auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 4.\n"; - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "bad cache size after set resize re-config 3.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - - /* fill the cache with 1024 byte entries -- nothing should happen - * for three epochs while the markers are inserted into the cache - * - * Note that hit rate will be zero, so the cache will attempt to - * increase its size. Since we are already at max size, it will - * not be able to. - */ - if ( pass2 ) { /* first epoch */ - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != at_max_size ) || - ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 24.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - if ( pass2 ) { /* second epoch */ - - rpt_fcn_called = FALSE; - i = 1000; - while ( ( pass2 ) && ( i < 2000 ) ) - { - protect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != at_max_size ) || - ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 25.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - if ( pass2 ) { /* third epoch */ - - rpt_fcn_called = FALSE; - i = 2000; - while ( ( pass2 ) && ( i < 3000 ) ) - { - protect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != at_max_size ) || - ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 26.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* fourth epoch -- If the hit rate were above the lower threshold, - * we would see cache size reduction now. However, nothing will - * happen until we get the hit rate above the lower threshold. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 3000; - while ( ( pass2 ) && ( i < 4000 ) ) - { - protect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != at_max_size ) || - ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 27.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* fifth epoch -- force the hit rate to 100%. We should see cache size - * reduction now. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 3000; - while ( ( pass2 ) && ( i < 4000 ) ) - { - protect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (2001 * 1024) ) || - ( cache_ptr->min_clean_size != (int)(2001 * 512) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 28.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* sixth epoch -- force the hit rate to 100% again. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 3000; - while ( ( pass2 ) && ( i < 4000 ) ) - { - protect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (1001 * 1024) ) || - ( cache_ptr->min_clean_size != (int)(1001 * 512) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 29.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* seventh epoch -- force the hit rate to 100% again. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 3000; - while ( ( pass2 ) && ( i < 4000 ) ) - { - protect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (1000 * 1024) ) || - ( cache_ptr->min_clean_size != (int)(1000 * 512) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 30.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* eigth epoch -- force the hit rate to 100% again -- should be steady - * state. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 3000; - while ( ( pass2 ) && ( i < 4000 ) ) - { - protect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (1000 * 1024) ) || - ( cache_ptr->min_clean_size != (int)(1000 * 512) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 31.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* now just bang on one entry -- after three epochs, this should - * get all entries other than the one evicted, and the cache size - * should be decreased to the minimum. - */ - if ( pass2 ) { /* ninth epoch */ - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (1000 * 1024) ) || - ( cache_ptr->min_clean_size != (int)(1000 * 512) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 32.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - if ( pass2 ) { /* tenth epoch */ - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (1000 * 1024) ) || - ( cache_ptr->min_clean_size != (int)(1000 * 512) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 33.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - if ( pass2 ) { /* eleventh epoch -- cache size reduction */ - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (512 * 1024) ) || - ( cache_ptr->min_clean_size != (256 * 1024) ) || - ( cache_ptr->index_len != 2 ) || - ( cache_ptr->index_size != - MONSTER_ENTRY_SIZE + MEDIUM_ENTRY_SIZE ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 34.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - if ( pass2 ) { /* twelth epoch -- at minimum size so no more ageouts */ - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != at_min_size ) || - ( cache_ptr->max_cache_size != (512 * 1024) ) || - ( cache_ptr->min_clean_size != (256 * 1024) ) || - ( cache_ptr->index_len != 2 ) || - ( cache_ptr->index_size != - MONSTER_ENTRY_SIZE + MEDIUM_ENTRY_SIZE ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 35.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - - /* repeat the above test, but with max_decrement enabled to see - * if that features works as it should. Note that this will change - * the structure of the test a bit. - */ - - if ( pass2 ) { - - auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - auto_size_ctl.rpt_fcn = test_rpt_fcn; - - auto_size_ctl.set_initial_size = TRUE; - auto_size_ctl.initial_size = 8 * 1024 * 1024; - - auto_size_ctl.min_clean_fraction = 0.5; - - auto_size_ctl.max_size = 8 * 1024 * 1024; - auto_size_ctl.min_size = 512 * 1024; - - auto_size_ctl.epoch_length = 1000; - - - auto_size_ctl.incr_mode = H5C2_incr__threshold; - - auto_size_ctl.lower_hr_threshold = 0.75; - - auto_size_ctl.increment = 2.0; - - auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (4 * 1024 * 1024); - - auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - auto_size_ctl.flash_multiple = 2.0; - auto_size_ctl.flash_threshold = 0.5; - - - auto_size_ctl.decr_mode = H5C2_decr__age_out; - - auto_size_ctl.upper_hr_threshold = 0.995; - - auto_size_ctl.decrement = 0.5; - - auto_size_ctl.apply_max_decrement = TRUE; - auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - auto_size_ctl.epochs_before_eviction = 3; - - auto_size_ctl.apply_empty_reserve = FALSE; - auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 5.\n"; - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "bad cache size after set resize re-config 4.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - - /* fill the cache with 1024 byte entries -- nothing should happen - * for three epochs while the markers are inserted into the cache - * - * Note that hit rate will be zero, so the cache will attempt to - * increase its size. Since we are already at max size, it will - * not be able to. - */ - if ( pass2 ) { /* first epoch */ - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != at_max_size ) || - ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 36.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - if ( pass2 ) { /* second epoch */ - - rpt_fcn_called = FALSE; - i = 1000; - while ( ( pass2 ) && ( i < 2000 ) ) - { - protect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != at_max_size ) || - ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 37.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - if ( pass2 ) { /* third epoch */ - - rpt_fcn_called = FALSE; - i = 2000; - while ( ( pass2 ) && ( i < 3000 ) ) - { - protect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != at_max_size ) || - ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 38.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* fourth epoch -- If the hit rate were above the lower threshold, - * we would see cache size reduction now. However, nothing will - * happen until we get the hit rate above the lower threshold. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 3000; - while ( ( pass2 ) && ( i < 4000 ) ) - { - protect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != at_max_size ) || - ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 39.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* fifth epoch -- force the hit rate to 100%. We should see cache size - * reduction now. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 3000; - while ( ( pass2 ) && ( i < 4000 ) ) - { - protect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (7 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (7 * 512 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 40.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* sixth epoch -- force the hit rate to 100% again. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 2000; - while ( ( pass2 ) && ( i < 3000 ) ) - { - protect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (6 * 512 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 41.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* seventh epoch -- keep hit rate at 100%, and keep 2K entries active. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 3000; - while ( ( pass2 ) && ( i < 4000 ) ) - { - protect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (5 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (5 * 512 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 42.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* eigth epoch -- still 100% hit rate - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 2000; - while ( ( pass2 ) && ( i < 3000 ) ) - { - protect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 512 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 43.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* ninth epoch --hit rate at 100%. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 3000; - while ( ( pass2 ) && ( i < 4000 ) ) - { - protect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (3 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 512 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 44.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* tenth epoch -- still 100% hit rate - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 2000; - while ( ( pass2 ) && ( i < 3000 ) ) - { - protect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 512 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 45.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* eleventh epoch -- hit rate at 100% -- starting to stableize - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 3000; - while ( ( pass2 ) && ( i < 4000 ) ) - { - protect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (2000 * 1024) ) || - ( cache_ptr->min_clean_size != (int)(2000 * 512) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 46.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* twelth epoch -- force the hit rate to 100% again -- should be steady - * state. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 2000; - while ( ( pass2 ) && ( i < 3000 ) ) - { - protect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (2000 * 1024) ) || - ( cache_ptr->min_clean_size != (int)(2000 * 512) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 47.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* now just bang on one entry -- after three epochs, this should - * get all entries other than the one evicted, and the cache size - * should be decreased to the minimum. - */ - if ( pass2 ) { /* thirteenth epoch */ - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (2000 * 1024) ) || - ( cache_ptr->min_clean_size != (int)(2000 * 512) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 48.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - if ( pass2 ) { /* fourteenth epoch */ - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != - (1001 * 1024 + MONSTER_ENTRY_SIZE) ) || - ( cache_ptr->min_clean_size != - (1001 * 512 + MONSTER_ENTRY_SIZE / 2) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 49.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - if ( pass2 ) { /* fifteenth epoch -- cache size reduction */ - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (512 * 1024) ) || - ( cache_ptr->min_clean_size != (256 * 1024) ) || - ( cache_ptr->index_len != 2 ) || - ( cache_ptr->index_size != - MONSTER_ENTRY_SIZE + MEDIUM_ENTRY_SIZE ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 50.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - if ( pass2 ) { /* sixteenth epoch -- at minimum size so no more ageouts */ - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != at_min_size ) || - ( cache_ptr->max_cache_size != (512 * 1024) ) || - ( cache_ptr->min_clean_size != (256 * 1024) ) || - ( cache_ptr->index_len != 2 ) || - ( cache_ptr->index_size != - MONSTER_ENTRY_SIZE + MEDIUM_ENTRY_SIZE ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 51.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - - /* repeat the test yet again, this time with empty reserve enabled. - * Again, some structural changes in the test are necessary. - */ - - if ( pass2 ) { - - auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - auto_size_ctl.rpt_fcn = test_rpt_fcn; - - auto_size_ctl.set_initial_size = TRUE; - auto_size_ctl.initial_size = 8 * 1024 * 1024; - - auto_size_ctl.min_clean_fraction = 0.5; - - auto_size_ctl.max_size = 8 * 1024 * 1024; - auto_size_ctl.min_size = 512 * 1024; - - auto_size_ctl.epoch_length = 1000; - - - auto_size_ctl.incr_mode = H5C2_incr__threshold; - - auto_size_ctl.lower_hr_threshold = 0.75; - - auto_size_ctl.increment = 2.0; - - auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (4 * 1024 * 1024); - - auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - auto_size_ctl.flash_multiple = 2.0; - auto_size_ctl.flash_threshold = 0.5; - - - auto_size_ctl.decr_mode = H5C2_decr__age_out; - - auto_size_ctl.upper_hr_threshold = 0.995; - - auto_size_ctl.decrement = 0.5; - - auto_size_ctl.apply_max_decrement = FALSE; - auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - auto_size_ctl.epochs_before_eviction = 3; - - auto_size_ctl.apply_empty_reserve = TRUE; - auto_size_ctl.empty_reserve = 0.5; /* for ease of testing */ - - result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 6.\n"; - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "bad cache size after set resize re-config 5.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - - /* fill the cache with 1024 byte entries -- nothing should happen - * for three epochs while the markers are inserted into the cache - * - * Note that hit rate will be zero, so the cache will attempt to - * increase its size. Since we are already at max size, it will - * not be able to. - */ - if ( pass2 ) { /* first epoch */ - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != at_max_size ) || - ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 52.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - if ( pass2 ) { /* second epoch */ - - rpt_fcn_called = FALSE; - i = 1000; - while ( ( pass2 ) && ( i < 2000 ) ) - { - protect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != at_max_size ) || - ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 53.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - if ( pass2 ) { /* third epoch */ - - rpt_fcn_called = FALSE; - i = 2000; - while ( ( pass2 ) && ( i < 3000 ) ) - { - protect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != at_max_size ) || - ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 54.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* fourth epoch -- If the hit rate were above the lower threshold, - * we would see cache size reduction now. However, nothing will - * happen until we get the hit rate above the lower threshold. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 3000; - while ( ( pass2 ) && ( i < 4000 ) ) - { - protect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != at_max_size ) || - ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 55.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* fifth epoch -- force the hit rate to 100%. We should see cache size - * reduction now. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 3000; - while ( ( pass2 ) && ( i < 4000 ) ) - { - protect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (4002 * 1024) ) || - ( cache_ptr->min_clean_size != (int)(4002 * 512) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 56.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* sixth epoch -- force the hit rate to 100% again. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 3000; - while ( ( pass2 ) && ( i < 4000 ) ) - { - protect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (2002 * 1024) ) || - ( cache_ptr->min_clean_size != (int)(2002 * 512) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 57.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* seventh epoch -- force the hit rate to 100% again. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 3000; - while ( ( pass2 ) && ( i < 4000 ) ) - { - protect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (2000 * 1024) ) || - ( cache_ptr->min_clean_size != (int)(2000 * 512) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 58.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* eigth epoch -- force the hit rate to 100% again -- should be steady - * state. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 3000; - while ( ( pass2 ) && ( i < 4000 ) ) - { - protect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (2000 * 1024) ) || - ( cache_ptr->min_clean_size != (int)(2000 * 512) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 59.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* now just bang on one entry -- after three epochs, this should - * get all entries other than the one evicted, and the cache size - * should be decreased to the minimum. - */ - if ( pass2 ) { /* ninth epoch */ - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (2000 * 1024) ) || - ( cache_ptr->min_clean_size != (int)(2000 * 512) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 60.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - if ( pass2 ) { /* tenth epoch */ - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (2000 * 1024) ) || - ( cache_ptr->min_clean_size != (2000 * 512) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 61.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - if ( pass2 ) { /* eleventh epoch -- cache size reduction */ - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (512 * 1024) ) || - ( cache_ptr->min_clean_size != (256 * 1024) ) || - ( cache_ptr->index_len != 2 ) || - ( cache_ptr->index_size != - MONSTER_ENTRY_SIZE + MEDIUM_ENTRY_SIZE ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 62.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - if ( pass2 ) { /* twelth epoch -- at minimum size so no more ageouts */ - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != at_min_size ) || - ( cache_ptr->max_cache_size != (512 * 1024) ) || - ( cache_ptr->min_clean_size != (256 * 1024) ) || - ( cache_ptr->index_len != 2 ) || - ( cache_ptr->index_size != - MONSTER_ENTRY_SIZE + MEDIUM_ENTRY_SIZE ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 63.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - - /* Repeat the test again, this time using the age out with threshold - * mode. To simplify the testing, set epochs to eviction to 1. - * - * Again, there are some minor structural changes in the test. - */ - - if ( pass2 ) { - - auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - auto_size_ctl.rpt_fcn = test_rpt_fcn; - - auto_size_ctl.set_initial_size = TRUE; - auto_size_ctl.initial_size = 8 * 1024 * 1024; - - auto_size_ctl.min_clean_fraction = 0.5; - - auto_size_ctl.max_size = 8 * 1024 * 1024; - auto_size_ctl.min_size = 512 * 1024; - - auto_size_ctl.epoch_length = 1000; - - - auto_size_ctl.incr_mode = H5C2_incr__off; - - auto_size_ctl.lower_hr_threshold = 0.75; - - auto_size_ctl.increment = 2.0; - - auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (4 * 1024 * 1024); - - auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - auto_size_ctl.flash_multiple = 2.0; - auto_size_ctl.flash_threshold = 0.5; - - - auto_size_ctl.decr_mode = H5C2_decr__age_out_with_threshold; - - auto_size_ctl.upper_hr_threshold = 0.999; /* for ease of testing */ - - auto_size_ctl.decrement = 0.5; - - auto_size_ctl.apply_max_decrement = FALSE; - auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - auto_size_ctl.epochs_before_eviction = 1; /* for ease of testing */ - - auto_size_ctl.apply_empty_reserve = FALSE; - auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 7.\n"; - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "bad cache size after set resize re-config 6.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - - /* fill the cache with 4K byte entries -- increment mode is off, - * so cache size reduction should kick in as soon as we get the - * hit rate above .999. - */ - if ( pass2 ) { /* first epoch -- hit rate 0 */ - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, LARGE_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 64.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - if ( pass2 ) { /* second epoch -- hit rate 0 */ - - rpt_fcn_called = FALSE; - i = 1000; - while ( ( pass2 ) && ( i < 2000 ) ) - { - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, LARGE_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 65.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - if ( pass2 ) { /* third epoch -- hit rate 1.0 -- should see decrease */ - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, LARGE_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (1001 * LARGE_ENTRY_SIZE) ) || - ( cache_ptr->min_clean_size != (1001 * LARGE_ENTRY_SIZE / 2) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 66.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* fourth epoch -- load up the cache again -- hit rate 0 */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (1001 * LARGE_ENTRY_SIZE) ) || - ( cache_ptr->min_clean_size != (1001 * LARGE_ENTRY_SIZE / 2) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 67.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* fifth epoch -- still loading up the cache -- hit rate 0 */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 1000; - while ( ( pass2 ) && ( i < 2000 ) ) - { - protect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (1001 * LARGE_ENTRY_SIZE) ) || - ( cache_ptr->min_clean_size != (1001 * LARGE_ENTRY_SIZE / 2) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 68.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* sixth epoch -- force hit rate to .998 -- should be no reduction */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 1002; - while ( ( pass2 ) && ( i < 2002 ) ) - { - protect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (1001 * LARGE_ENTRY_SIZE) ) || - ( cache_ptr->min_clean_size != (1001 * LARGE_ENTRY_SIZE / 2) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 69.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* seventh epoch -- force hit rate to .999 -- should see reduction - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 1003; - while ( ( pass2 ) && ( i < 2003 ) ) - { - protect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (1000 * MEDIUM_ENTRY_SIZE) ) || - ( cache_ptr->min_clean_size != (1000 * MEDIUM_ENTRY_SIZE / 2) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 70.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - - /* We have now tested all the major ageout modes individually. - * Lets try them all together to look for unexpected interactions - * and/or bugs. - */ - - if ( pass2 ) { - - auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - auto_size_ctl.rpt_fcn = test_rpt_fcn; - - auto_size_ctl.set_initial_size = TRUE; - auto_size_ctl.initial_size = 8 * 1000 * 1024; - - auto_size_ctl.min_clean_fraction = 0.5; - - auto_size_ctl.max_size = 8 * 1000 * 1024; - auto_size_ctl.min_size = 512 * 1024; - - auto_size_ctl.epoch_length = 1000; - - - auto_size_ctl.incr_mode = H5C2_incr__threshold; - - auto_size_ctl.lower_hr_threshold = 0.75; - - auto_size_ctl.increment = 2.0; - - auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (4 * 1024 * 1024); - - auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - auto_size_ctl.flash_multiple = 2.0; - auto_size_ctl.flash_threshold = 0.5; - - - auto_size_ctl.decr_mode = H5C2_decr__age_out_with_threshold; - - auto_size_ctl.upper_hr_threshold = 0.999; /* for ease of testing */ - - auto_size_ctl.decrement = 0.5; - - auto_size_ctl.apply_max_decrement = TRUE; - auto_size_ctl.max_decrement = (1 * 1000 * 1024); - - auto_size_ctl.epochs_before_eviction = 1; /* for ease of testing */ - - auto_size_ctl.apply_empty_reserve = TRUE; - auto_size_ctl.empty_reserve = 0.5; /* for ease of testing */ - - result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 8.\n"; - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "bad cache size after set resize re-config 7.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* fill the cache with 4K byte entries -- increment mode is threshold, - * so the decrease code will not be executed until the hit rate exceeds - * .75. - */ - if ( pass2 ) { /* first epoch -- hit rate 0 */ - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, LARGE_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != at_max_size ) || - ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 71.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - if ( pass2 ) { /* second epoch -- hit rate 0 */ - - rpt_fcn_called = FALSE; - i = 1000; - while ( ( pass2 ) && ( i < 2000 ) ) - { - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, LARGE_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != at_max_size ) || - ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 72.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* third epoch -- force the hit rate to 1.0. Should be no change - * in the cache size due to the combination of the empty reserve - * and the max decrease. Max decrease will limit the evictions - * in any one epoch, and the empty reserve will not permit cache - * size reduction unless the specified empty reserve is maintained. - * - * In this epoch, all we should see is a reduction in the index size. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, LARGE_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) || - ( cache_ptr->index_size != (7 * 1000 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 73.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* fourth epoch -- hit rate still 1.0. Index size should decrease, - * but otherwise no change expected. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, LARGE_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) || - ( cache_ptr->index_size != (6 * 1000 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 74.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* fifth epoch -- hit rate still 1.0. Index size should decrease, - * but otherwise no change expected. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, LARGE_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) || - ( cache_ptr->index_size != (5 * 1000 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 75.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* sixth epoch -- hit rate still 1.0. Index size should decrease, - * but otherwise no change expected. Note that the cache size is - * now just on the edge of meeting the clean reserve. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, LARGE_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) || - ( cache_ptr->index_size != (4 * 1000 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 76.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* seventh epoch -- hit rate still 1.0. No change in index size expected. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, LARGE_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) || - ( cache_ptr->index_size != (4 * 1000 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 77.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* eighth epoch -- start loading 1 KB entries. Hit rate 0 so - * decrease code shouldn't be called. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != at_max_size ) || - ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) || - ( cache_ptr->index_size != (5 * 1000 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 78.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* ninth epoch -- access the 1 KB entries again, driving the hit rate - * to 1.0. Decrease code should be triggered, but the max decrease - * should prevent the empty reserve from being met in this epoch. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (8 * 1000 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1000 * 1024) ) || - ( cache_ptr->index_size != (4 * 1000 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 79.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* tenth epoch -- access the 1 KB entries yet again, forcing hit rate - * to 1.0. Decrease code should be triggered, and the empty reserve - * should finally be met. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (7 * 1000 * 1024) ) || - ( cache_ptr->min_clean_size != (7 * 1000 * 1024 / 2) ) || - ( cache_ptr->index_size != (3 * 1000 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 80.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* eleventh epoch -- access the 1 KB entries yet again, forcing hit rate - * to 1.0. Decrease code should be triggered, and the empty reserve - * should be met again. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (6 * 1000 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1000 * 1024) ) || - ( cache_ptr->index_size != (2 * 1000 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 81.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* twelth epoch -- hit rate 1.0 -- decrease as before. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (5 * 1000 * 1024) ) || - ( cache_ptr->min_clean_size != (5 * 1000 * 1024 / 2) ) || - ( cache_ptr->index_size != (1 * 1000 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 82.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* thirteenth epoch -- hit rate 1.0 -- decrease as before. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (4 * 1000 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1000 * 1024) ) || - ( cache_ptr->index_size != (1 * 1000 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 83.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* fourteenth epoch -- hit rate 1.0 -- decrease as before. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (3 * 1000 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1000 * 1024 / 2) ) || - ( cache_ptr->index_size != (1 * 1000 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 84.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* fifteenth epoch -- hit rate 1.0 -- decrease as before. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (2 * 1000 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1000 * 1024) ) || - ( cache_ptr->index_size != (1 * 1000 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 85.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* sixteenth epoch -- hit rate 1.0 -- should be stable now - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (2 * 1000 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1000 * 1024) ) || - ( cache_ptr->index_size != (1 * 1000 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 86.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - - /* now test the flash cache size increment code. At least at present, - * there should be no interaction between the regular auto-resize - * code and the flash cache size increment code other than a reset - * of the counter and stats collection used by the regular auto-resize - * code. Thus we do only limited tests of the two pieces of code - * operating together. - * - * Start with simple test to verify that the flash cache increment - * code increases the cache size when and as expected. - */ - - /* Place the cache in a known state via a flush-destroy on the cache - * to clear out all entries, and then a reset on all the entries. - * Then configure the cache for the flash cache size increase tests, - * and force the flash size increase code through all its operational - * modes. Verify that all perform as expected. - */ - - if ( pass2 ) { - - flush_cache2(file_ptr, TRUE, FALSE, FALSE); - - reset_entries2(); - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - if ( pass2 ) { - - auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - auto_size_ctl.rpt_fcn = test_rpt_fcn; - - auto_size_ctl.set_initial_size = TRUE; - auto_size_ctl.initial_size = 64 * 1024; - - auto_size_ctl.min_clean_fraction = 0.5; - - auto_size_ctl.max_size = 1024 * 1024; - auto_size_ctl.min_size = 5 * 1024; - - auto_size_ctl.epoch_length = 100; - - - auto_size_ctl.incr_mode = H5C2_incr__threshold; - - auto_size_ctl.lower_hr_threshold = 0.75; - - auto_size_ctl.increment = 2.0; - - auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (32 * 1024); - - auto_size_ctl.flash_incr_mode = H5C2_flash_incr__add_space; - auto_size_ctl.flash_multiple = 1.0; - auto_size_ctl.flash_threshold = 0.5; - - - auto_size_ctl.decr_mode = H5C2_decr__age_out_with_threshold; - - auto_size_ctl.upper_hr_threshold = 0.999; /* for ease of testing */ - - auto_size_ctl.decrement = 0.5; - - auto_size_ctl.apply_max_decrement = TRUE; - auto_size_ctl.max_decrement = (1 * 1000 * 1024); - - auto_size_ctl.epochs_before_eviction = 1; /* for ease of testing */ - - auto_size_ctl.apply_empty_reserve = TRUE; - auto_size_ctl.empty_reserve = 0.5; /* for ease of testing */ - - result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 12.\n"; - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->max_cache_size != (64 * 1024) ) || - ( cache_ptr->min_clean_size != (32 * 1024) ) || - ( cache_ptr->index_len != 0 ) || - ( cache_ptr->index_size != 0 ) || - ( cache_ptr->cache_accesses != 0 ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache config (0).\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* Load a huge entry into the cache */ - if ( pass2 ) { - - protect_entry2(file_ptr, HUGE_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, HUGE_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - - if ( ( pass2 ) && - ( ( ( cache_ptr->max_cache_size != (64 * 1024) ) || - ( cache_ptr->min_clean_size != (32 * 1024) ) || - ( cache_ptr->index_len != 1 ) || - ( cache_ptr->index_size != HUGE_ENTRY_SIZE ) || - ( cache_ptr->cache_accesses != 1 ) ) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache config (1).\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* Now load a monster entry. Since a monster entry is larger than - * half the size of the cache, and there is not sufficient space - * for a monster entry in the cache, we will add space to the - * cache to make room for the entry. - */ - if ( pass2 ) { - - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - - if ( ( pass2 ) && - ( ( ( cache_ptr->max_cache_size != (80 * 1024) ) || - ( cache_ptr->min_clean_size != (40 * 1024) ) || - ( cache_ptr->index_len != 2 ) || - ( cache_ptr->index_size != (HUGE_ENTRY_SIZE + - MONSTER_ENTRY_SIZE) ) || - ( cache_ptr->cache_accesses != 1 ) ) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache config (2).\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* Load a second monster entry. Since the monster entry is larger - * than half the size of the cache yet again, and there is not - * sufficient space for the monster entry in the cache, we again - * add space to the cache to make space for the entry. - */ - if ( pass2 ) { - - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 1); - - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 1, - NO_CHANGE, H5C2__NO_FLAGS_SET); - - if ( ( pass2 ) && - ( ( ( cache_ptr->max_cache_size != (144 * 1024) ) || - ( cache_ptr->min_clean_size != ( 72 * 1024) ) || - ( cache_ptr->index_len != 3 ) || - ( cache_ptr->index_size != ((2 * MONSTER_ENTRY_SIZE) + - HUGE_ENTRY_SIZE) ) || - ( cache_ptr->cache_accesses != 1 ) ) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache config (3).\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* Load a third moster entry. Should be no cache size increase this - * time. - */ - if ( pass2 ) { - - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 2); - - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 2, - NO_CHANGE, H5C2__NO_FLAGS_SET); - - if ( ( pass2 ) && - ( ( ( cache_ptr->max_cache_size != (144 * 1024) ) || - ( cache_ptr->min_clean_size != ( 72 * 1024) ) || - ( cache_ptr->index_len != 2 ) || - ( cache_ptr->index_size != (2 * MONSTER_ENTRY_SIZE) ) || - ( cache_ptr->cache_accesses != 2 ) ) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache config (4).\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* delete existing entries to prepare for next test, and reset - * the size of the cache. - */ - if ( pass2 ) { - - expunge_entry2(file_ptr, MONSTER_ENTRY_TYPE, 1); - expunge_entry2(file_ptr, MONSTER_ENTRY_TYPE, 2); - - if ( pass2 ) { - - result = H5C2_set_cache_auto_resize_config(cache_ptr, - &auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 13.\n"; - } - } - - if ( ( pass2 ) && - ( ( ( cache_ptr->max_cache_size != (64 * 1024) ) || - ( cache_ptr->min_clean_size != (32 * 1024) ) || - ( cache_ptr->index_len != 0 ) || - ( cache_ptr->index_size != 0 ) || - ( cache_ptr->cache_accesses != 0 ) ) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache config (5).\n"; - } - } - - /* repeat the above basic test, only this time, use inserts to add - * entries to the cache, not protects. - */ - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* insert a huge entry into the cache */ - if ( pass2 ) { - - insert_entry2(file_ptr, HUGE_ENTRY_TYPE, 1, TRUE, - H5C2__NO_FLAGS_SET); - /* protect and unprotect a couple times to increment cache_accesses */ - protect_entry2(file_ptr, HUGE_ENTRY_TYPE, 1); - unprotect_entry2(file_ptr, HUGE_ENTRY_TYPE, 1, - NO_CHANGE, H5C2__NO_FLAGS_SET); - protect_entry2(file_ptr, HUGE_ENTRY_TYPE, 1); - unprotect_entry2(file_ptr, HUGE_ENTRY_TYPE, 1, - NO_CHANGE, H5C2__NO_FLAGS_SET); - - if ( ( pass2 ) && - ( ( ( cache_ptr->max_cache_size != (64 * 1024) ) || - ( cache_ptr->min_clean_size != (32 * 1024) ) || - ( cache_ptr->index_len != 1 ) || - ( cache_ptr->index_size != HUGE_ENTRY_SIZE ) || - ( cache_ptr->cache_accesses != 2 ) ) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache config (6).\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* Now insert a monster entry. Since a monster entry is larger than - * half the size of the cache, and there is not sufficient space - * for a monster entry in the cache, we will add space to the - * cache to make room for the entry. - */ - if ( pass2 ) { - - insert_entry2(file_ptr, MONSTER_ENTRY_TYPE, 4, TRUE, - H5C2__NO_FLAGS_SET); - - if ( ( pass2 ) && - ( ( ( cache_ptr->max_cache_size != (80 * 1024) ) || - ( cache_ptr->min_clean_size != (40 * 1024) ) || - ( cache_ptr->index_len != 2 ) || - ( cache_ptr->index_size != - HUGE_ENTRY_SIZE + MONSTER_ENTRY_SIZE ) || - ( cache_ptr->cache_accesses != 0 ) ) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache config (7).\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* Insert a second monster entry. Cache size should increase again. - */ - if ( pass2 ) { - - insert_entry2(file_ptr, MONSTER_ENTRY_TYPE, 5, TRUE, - H5C2__NO_FLAGS_SET); - - if ( ( pass2 ) && - ( ( ( cache_ptr->max_cache_size != (144 * 1024) ) || - ( cache_ptr->min_clean_size != ( 72 * 1024) ) || - ( cache_ptr->index_len != 3 ) || - ( cache_ptr->index_size != - 2 * MONSTER_ENTRY_SIZE + HUGE_ENTRY_SIZE ) || - ( cache_ptr->cache_accesses != 0 ) ) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache config (8).\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* Insert a third monster entry. Should be no cache size increase this - * time. - */ - if ( pass2 ) { - - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 6); - - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 6, - NO_CHANGE, H5C2__NO_FLAGS_SET); - - if ( ( pass2 ) && - ( ( ( cache_ptr->max_cache_size != (144 * 1024) ) || - ( cache_ptr->min_clean_size != ( 72 * 1024) ) || - ( cache_ptr->index_len != 2 ) || - ( cache_ptr->index_size != (2 * MONSTER_ENTRY_SIZE) ) || - ( cache_ptr->cache_accesses != 1 ) ) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache config (9).\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* delete existing entries to prepare for next test, and reset - * the size of the cache. We must also change the size of the needed - * variable entries before we run the test, so will protect and - * unprotect them now so as to get the correct initial size. - */ - if ( pass2 ) { - - expunge_entry2(file_ptr, MONSTER_ENTRY_TYPE, 5); - expunge_entry2(file_ptr, MONSTER_ENTRY_TYPE, 6); - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 10); - unprotect_entry_with_size_change2(file_ptr, VARIABLE_ENTRY_TYPE, 10, - H5C2__DIRTIED_FLAG|H5C2__SIZE_CHANGED_FLAG, 1024); - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 11); - unprotect_entry_with_size_change2(file_ptr, VARIABLE_ENTRY_TYPE, 11, - H5C2__DIRTIED_FLAG|H5C2__SIZE_CHANGED_FLAG, 1024); - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 12); - unprotect_entry_with_size_change2(file_ptr, VARIABLE_ENTRY_TYPE, 12, - H5C2__DIRTIED_FLAG|H5C2__SIZE_CHANGED_FLAG, 1024); - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 13); - unprotect_entry_with_size_change2(file_ptr, VARIABLE_ENTRY_TYPE, 13, - H5C2__DIRTIED_FLAG|H5C2__SIZE_CHANGED_FLAG, 1024); - - flush_cache2(file_ptr, TRUE, FALSE, FALSE); - - - if ( pass2 ) { - - auto_size_ctl.initial_size = 6 * 1024; - result = H5C2_set_cache_auto_resize_config(cache_ptr, - &auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 13.\n"; - } - } - - if ( ( pass2 ) && - ( ( ( cache_ptr->max_cache_size != (6 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024) ) || - ( cache_ptr->index_len != 0 ) || - ( cache_ptr->index_size != 0 ) || - ( cache_ptr->cache_accesses != 0 ) ) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache config (10).\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* Now load the variable entries into the cache */ - if ( pass2 ) { - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 10); - unprotect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 10, NO_CHANGE, - H5C2__NO_FLAGS_SET); - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 11); - unprotect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 11, NO_CHANGE, - H5C2__NO_FLAGS_SET); - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 12); - unprotect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 12, NO_CHANGE, - H5C2__NO_FLAGS_SET); - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 13); - unprotect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 13, NO_CHANGE, - H5C2__NO_FLAGS_SET); - - if ( ( pass2 ) && - ( ( ( cache_ptr->max_cache_size != (6 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024) ) || - ( cache_ptr->index_len != 4 ) || - ( cache_ptr->index_size != 4 * 1024 ) || - ( cache_ptr->cache_accesses != 4 ) ) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache config (11).\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* protect a variable entry, and re-size it to 3K. Should be - * no effect on the size of the cache. - */ - if ( pass2 ) { - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 10); - unprotect_entry_with_size_change2(file_ptr, VARIABLE_ENTRY_TYPE, 10, - H5C2__DIRTIED_FLAG|H5C2__SIZE_CHANGED_FLAG, 3 * 1024); - - - if ( ( pass2 ) && - ( ( ( cache_ptr->max_cache_size != (6 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024) ) || - ( cache_ptr->index_len != 4 ) || - ( cache_ptr->index_size != 6 * 1024 ) || - ( cache_ptr->cache_accesses != 5 ) ) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache config (12).\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* protect the variable entry again, and re-size it to 10K. Should - * resize the cache to 13 KB. Note that cache_accesses will be 0 - * in this case, since cache_accesses is incremented on the protect. - */ - if ( pass2 ) { - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 10); - unprotect_entry_with_size_change2(file_ptr, VARIABLE_ENTRY_TYPE, 10, - H5C2__DIRTIED_FLAG|H5C2__SIZE_CHANGED_FLAG, 10 * 1024); - - - if ( ( pass2 ) && - ( ( ( cache_ptr->max_cache_size != (13 * 1024) ) || - ( cache_ptr->min_clean_size != (13 * 512) ) || - ( cache_ptr->index_len != 4 ) || - ( cache_ptr->index_size != 13 * 1024 ) || - ( cache_ptr->cache_accesses != 0 ) ) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache config (13).\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* protect a second variable entry, and re-size it to 10K. Should - * resize to 22 KB. - */ - if ( pass2 ) { - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 11); - unprotect_entry_with_size_change2(file_ptr, VARIABLE_ENTRY_TYPE, 11, - H5C2__DIRTIED_FLAG|H5C2__SIZE_CHANGED_FLAG, 10 * 1024); - - - if ( ( pass2 ) && - ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) || - ( cache_ptr->min_clean_size != (11 * 1024) ) || - ( cache_ptr->index_len != 4 ) || - ( cache_ptr->index_size != 22 * 1024 ) || - ( cache_ptr->cache_accesses != 0 ) ) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache config (14).\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* protect a third variable entry, and re-size it to 10K. Should - * be no change in cache size. - */ - if ( pass2 ) { - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 12); - unprotect_entry_with_size_change2(file_ptr, VARIABLE_ENTRY_TYPE, 12, - H5C2__DIRTIED_FLAG|H5C2__SIZE_CHANGED_FLAG, 10 * 1024); - - - if ( ( pass2 ) && - ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) || - ( cache_ptr->min_clean_size != (11 * 1024) ) || - ( cache_ptr->index_len != 4 ) || - ( cache_ptr->index_size != 31 * 1024 ) || - ( cache_ptr->cache_accesses != 1 ) ) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache config (15).\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* re-size the variable entries back down to their initial size, and - * restore the cache to its initial size as well, in preparation - * for the next test. - */ - if ( pass2 ) { - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 10); - unprotect_entry_with_size_change2(file_ptr, VARIABLE_ENTRY_TYPE, 10, - H5C2__DIRTIED_FLAG|H5C2__SIZE_CHANGED_FLAG, 1 * 1024); - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 11); - unprotect_entry_with_size_change2(file_ptr, VARIABLE_ENTRY_TYPE, 11, - H5C2__DIRTIED_FLAG|H5C2__SIZE_CHANGED_FLAG, 1 * 1024); - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 12); - unprotect_entry_with_size_change2(file_ptr, VARIABLE_ENTRY_TYPE, 12, - H5C2__DIRTIED_FLAG|H5C2__SIZE_CHANGED_FLAG, 1 * 1024); - - if ( pass2 ) { - - auto_size_ctl.initial_size = 6 * 1024; - result = H5C2_set_cache_auto_resize_config(cache_ptr, - &auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 14.\n"; - } - } - - if ( ( pass2 ) && - ( ( ( cache_ptr->max_cache_size != (6 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024) ) || - ( cache_ptr->index_len != 4 ) || - ( cache_ptr->index_size != 4 * 1024 ) || - ( cache_ptr->cache_accesses != 0 ) ) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache config (16).\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* Now test flash cache resizes with pinned entries... - */ - if ( pass2 ) { - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 10); - unprotect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 10, NO_CHANGE, - H5C2__PIN_ENTRY_FLAG); - resize_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 10, 2 * 1024, TRUE); - - if ( ( pass2 ) && - ( ( ( cache_ptr->max_cache_size != (6 * 1024) ) || - ( cache_ptr->min_clean_size != (6 * 512) ) || - ( cache_ptr->index_len != 4 ) || - ( cache_ptr->index_size != 5 * 1024 ) || - ( cache_ptr->cache_accesses != 1 ) ) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache config (17).\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - if ( pass2 ) { - - resize_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 10, 10 * 1024, TRUE); - - if ( ( pass2 ) && - ( ( ( cache_ptr->max_cache_size != (13 * 1024) ) || - ( cache_ptr->min_clean_size != (13 * 512) ) || - ( cache_ptr->index_len != 4 ) || - ( cache_ptr->index_size != 13 * 1024 ) || - ( cache_ptr->cache_accesses != 0 ) ) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache config (18).\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - if ( pass2 ) { - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 11); - unprotect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 11, NO_CHANGE, - H5C2__PIN_ENTRY_FLAG); - resize_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 11, 10 * 1024, TRUE); - - if ( ( pass2 ) && - ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) || - ( cache_ptr->min_clean_size != (11 * 1024) ) || - ( cache_ptr->index_len != 4 ) || - ( cache_ptr->index_size != 22 * 1024 ) || - ( cache_ptr->cache_accesses != 0 ) ) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache config (19).\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - if ( pass2 ) { - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 12); - unprotect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 12, NO_CHANGE, - H5C2__PIN_ENTRY_FLAG); - resize_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 12, 10 * 1024, TRUE); - - if ( ( pass2 ) && - ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) || - ( cache_ptr->min_clean_size != (11 * 1024) ) || - ( cache_ptr->index_len != 4 ) || - ( cache_ptr->index_size != 31 * 1024 ) || - ( cache_ptr->cache_accesses != 1 ) ) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache config (20).\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* Unpin the entries. Note that no entries are evicted as we don't - * load any entries. - */ - if ( pass2 ) { - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 10); - unprotect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 10, NO_CHANGE, - H5C2__UNPIN_ENTRY_FLAG); - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 11); - unprotect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 11, NO_CHANGE, - H5C2__UNPIN_ENTRY_FLAG); - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 12); - unprotect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 12, NO_CHANGE, - H5C2__UNPIN_ENTRY_FLAG); - - if ( ( pass2 ) && - ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) || - ( cache_ptr->min_clean_size != (11 * 1024) ) || - ( cache_ptr->index_len != 4 ) || - ( cache_ptr->index_size != 31 * 1024 ) || - ( cache_ptr->cache_accesses != 4 ) ) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache config (21).\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* re-size the variable entries back down to their initial size, and - * restore the cache to its initial size as well, in preparation - * for the next test. - */ - if ( pass2 ) { - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 10); - unprotect_entry_with_size_change2(file_ptr, VARIABLE_ENTRY_TYPE, 10, - H5C2__DIRTIED_FLAG|H5C2__SIZE_CHANGED_FLAG, 1 * 1024); - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 11); - unprotect_entry_with_size_change2(file_ptr, VARIABLE_ENTRY_TYPE, 11, - H5C2__DIRTIED_FLAG|H5C2__SIZE_CHANGED_FLAG, 1 * 1024); - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 12); - unprotect_entry_with_size_change2(file_ptr, VARIABLE_ENTRY_TYPE, 12, - H5C2__DIRTIED_FLAG|H5C2__SIZE_CHANGED_FLAG, 1 * 1024); - - if ( pass2 ) { - - auto_size_ctl.initial_size = 6 * 1024; - result = H5C2_set_cache_auto_resize_config(cache_ptr, - &auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 15.\n"; - } - } - - if ( ( pass2 ) && - ( ( ( cache_ptr->max_cache_size != (6 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024) ) || - ( cache_ptr->index_len != 4 ) || - ( cache_ptr->index_size != 4 * 1024 ) || - ( cache_ptr->cache_accesses != 0 ) ) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache config (22).\n"; - } - } - - if ( pass2 ) { - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 10); - unprotect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 10, NO_CHANGE, - H5C2__PIN_ENTRY_FLAG); - resize_pinned_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 10, 2 * 1024); - - if ( ( pass2 ) && - ( ( ( cache_ptr->max_cache_size != (6 * 1024) ) || - ( cache_ptr->min_clean_size != (6 * 512) ) || - ( cache_ptr->index_len != 4 ) || - ( cache_ptr->index_size != 5 * 1024 ) || - ( cache_ptr->cache_accesses != 1 ) ) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache config (23).\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - if ( pass2 ) { - - resize_pinned_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 10, 10 * 1024); - - if ( ( pass2 ) && - ( ( ( cache_ptr->max_cache_size != (13 * 1024) ) || - ( cache_ptr->min_clean_size != (13 * 512) ) || - ( cache_ptr->index_len != 4 ) || - ( cache_ptr->index_size != 13 * 1024 ) || - ( cache_ptr->cache_accesses != 0 ) ) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache config (24).\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - if ( pass2 ) { - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 11); - unprotect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 11, NO_CHANGE, - H5C2__PIN_ENTRY_FLAG); - resize_pinned_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 11, 10 * 1024); - - if ( ( pass2 ) && - ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) || - ( cache_ptr->min_clean_size != (11 * 1024) ) || - ( cache_ptr->index_len != 4 ) || - ( cache_ptr->index_size != 22 * 1024 ) || - ( cache_ptr->cache_accesses != 0 ) ) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache config (25).\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - if ( pass2 ) { - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 12); - unprotect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 12, NO_CHANGE, - H5C2__PIN_ENTRY_FLAG); - resize_pinned_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 12, 10 * 1024); - - if ( ( pass2 ) && - ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) || - ( cache_ptr->min_clean_size != (11 * 1024) ) || - ( cache_ptr->index_len != 4 ) || - ( cache_ptr->index_size != 31 * 1024 ) || - ( cache_ptr->cache_accesses != 1 ) ) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache config (26).\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* Unpin the entries. Note that no entries are evicted as we don't - * load any entries. - */ - if ( pass2 ) { - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 10); - unprotect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 10, NO_CHANGE, - H5C2__UNPIN_ENTRY_FLAG); - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 11); - unprotect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 11, NO_CHANGE, - H5C2__UNPIN_ENTRY_FLAG); - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 12); - unprotect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 12, NO_CHANGE, - H5C2__UNPIN_ENTRY_FLAG); - - if ( ( pass2 ) && - ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) || - ( cache_ptr->min_clean_size != (11 * 1024) ) || - ( cache_ptr->index_len != 4 ) || - ( cache_ptr->index_size != 31 * 1024 ) || - ( cache_ptr->cache_accesses != 4 ) ) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache config (27).\n"; - } - } - - /* We have finished a basic check of the flash cache size increment - * code. Tidy up for a more extensive test... - */ - if ( pass2 ) { - - expunge_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 10); - expunge_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 11); - expunge_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 12); - expunge_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 13); - - if ( ( pass2 ) && - ( ( ( cache_ptr->max_cache_size != (22 * 1024) ) || - ( cache_ptr->min_clean_size != (11 * 1024) ) || - ( cache_ptr->index_len != 0 ) || - ( cache_ptr->index_size != 0 ) || - ( cache_ptr->cache_accesses != 4 ) ) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache config (28).\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* ...and then reconfigure. Note that we change the flash_multiple - * and flash_threshold just to make sure that such changed perform - * as expected. - */ - if ( pass2 ) { - - auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - auto_size_ctl.rpt_fcn = test_rpt_fcn; - - auto_size_ctl.set_initial_size = TRUE; - auto_size_ctl.initial_size = 4 * 1024; - - auto_size_ctl.min_clean_fraction = 0.5; - - auto_size_ctl.max_size = 20 * 1024; - auto_size_ctl.min_size = 4 * 1024; - - auto_size_ctl.epoch_length = 100; - - - auto_size_ctl.incr_mode = H5C2_incr__threshold; - - auto_size_ctl.lower_hr_threshold = 0.75; - - auto_size_ctl.increment = 2.0; - - auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (4 * 1024); - - auto_size_ctl.flash_incr_mode = H5C2_flash_incr__add_space; - auto_size_ctl.flash_multiple = 2.0; - auto_size_ctl.flash_threshold = 0.4; - - - auto_size_ctl.decr_mode = H5C2_decr__age_out_with_threshold; - - auto_size_ctl.upper_hr_threshold = 0.999; /* for ease of testing */ - - auto_size_ctl.decrement = 0.5; - - auto_size_ctl.apply_max_decrement = TRUE; - auto_size_ctl.max_decrement = (2 * 1024); - - auto_size_ctl.epochs_before_eviction = 1; /* for ease of testing */ - - auto_size_ctl.apply_empty_reserve = TRUE; - auto_size_ctl.empty_reserve = 0.5; /* for ease of testing */ - - result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 15.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - if ( pass2 ) { - - if ( ( cache_ptr->max_cache_size != (4 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 512) ) || - ( cache_ptr->index_len != 0 ) || - ( cache_ptr->index_size != 0 ) || - ( cache_ptr->cache_accesses != 0 ) ) { - - pass2 = FALSE; - failure_mssg2 = "bad cache after initialization 15.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* protect and unprotect a large entry -- no change in cache size since - * a large entry will just fill the available space in the cache. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, 0); - unprotect_entry2(file_ptr, LARGE_ENTRY_TYPE, 0, NO_CHANGE, - H5C2__NO_FLAGS_SET); - - if ( ( pass2 ) && - ( ( ( cache_ptr->max_cache_size != (4 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 512) ) || - ( cache_ptr->index_len != 1 ) || - ( cache_ptr->index_size != LARGE_ENTRY_SIZE ) || - ( cache_ptr->cache_accesses != 1 ) || - ( rpt_fcn_called == TRUE ) ) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache config (29).\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* protect and unprotect another a large entry -- should trigger a - * flash cache size increase to 12 KB (remember that flash_multiple is - * set to 2.0). - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, 1); - unprotect_entry2(file_ptr, LARGE_ENTRY_TYPE, 1, NO_CHANGE, - H5C2__NO_FLAGS_SET); - - if ( ( pass2 ) && - ( ( ( cache_ptr->max_cache_size != (12 * 1024) ) || - ( cache_ptr->min_clean_size != (12 * 512) ) || - ( cache_ptr->index_len != 2 ) || - ( cache_ptr->index_size != 2 * LARGE_ENTRY_SIZE ) || - ( cache_ptr->cache_accesses != 1 ) || - ( rpt_fcn_called != TRUE ) ) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache config (30).\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* protect and unprotect two more large entries -- shouldnt trigger a - * flash cache size increase. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, 2); - unprotect_entry2(file_ptr, LARGE_ENTRY_TYPE, 2, NO_CHANGE, - H5C2__NO_FLAGS_SET); - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, 3); - unprotect_entry2(file_ptr, LARGE_ENTRY_TYPE, 3, NO_CHANGE, - H5C2__NO_FLAGS_SET); - - if ( ( pass2 ) && - ( ( ( cache_ptr->max_cache_size != (12 * 1024) ) || - ( cache_ptr->min_clean_size != (12 * 512) ) || - ( cache_ptr->index_len != 3 ) || - ( cache_ptr->index_size != 3 * LARGE_ENTRY_SIZE ) || - ( cache_ptr->cache_accesses != 3 ) || - ( rpt_fcn_called != FALSE ) ) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache config (31).\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* do many accesses of a single entry to talk the cache into reducing - * its size to the minimum. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, TINY_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, TINY_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->max_cache_size != (4 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024) ) || - ( cache_ptr->index_size != (1 * TINY_ENTRY_SIZE) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache config (32).\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* Force another flash increase */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, 0); - unprotect_entry2(file_ptr, LARGE_ENTRY_TYPE, 0, NO_CHANGE, - H5C2__NO_FLAGS_SET); - - if ( ( pass2 ) && - ( ( ( cache_ptr->max_cache_size != (4 * 1024 + 128) ) || - ( cache_ptr->min_clean_size != (2 * 1024 + 64) ) || - ( cache_ptr->index_len != 2 ) || - ( cache_ptr->index_size != - LARGE_ENTRY_SIZE + TINY_ENTRY_SIZE ) || - ( cache_ptr->cache_accesses != 1 ) || - ( rpt_fcn_called == FALSE ) || - ( rpt_status != flash_increase ) ) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache config (33).\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force regular size increase up to maximum */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 500 ) ) - { - protect_entry2(file_ptr, TINY_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, TINY_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( cache_ptr->max_cache_size != (20 * 1024) ) || - ( cache_ptr->min_clean_size != (10 * 1024) ) || - ( rpt_fcn_called == FALSE ) || - ( rpt_status != at_max_size ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache config (34).\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - - if ( pass2 ) { - - takedown_cache2(file_ptr, FALSE, FALSE); - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - HDfprintf(stdout, "%s: failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - if ( core_file_driver_failed ) { - - HDfprintf(stdout, - "%s(): Unable to open test file with core file driver.\n", - fcn_name); - } - - return !pass2; - -} /* check_auto_cache_resize() */ - - -/*------------------------------------------------------------------------- - * Function: check_auto_cache_resize_disable() - * - * Purpose: Test the various ways in which the resize code can - * be disabled. Unfortunately, there are quite a few of them. - * - * Return: void - * - * Programmer: John Mainzer - * 12/16/04 - * - * Modifications: - * - * Added code to include the flash cache size increment - * code in this test. - * JRM -- 1/10/08 - * - *------------------------------------------------------------------------- - */ - -static unsigned -check_auto_cache_resize_disable(void) -{ - const char * fcn_name = "check_auto_cache_resize_disable()"; - hbool_t show_progress = FALSE; - herr_t result; - int32_t i; - int32_t checkpoint = 0; - H5F_t * file_ptr = NULL; - H5C2_t * cache_ptr = NULL; - H5C2_auto_size_ctl_t auto_size_ctl = - { - /* int32_t version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* H5C2_auto_resize_report_fcn rpt_fcn = */ test_rpt_fcn, - - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (512 * 1024), - - /* double min_clean_fraction = */ 0.5, - - /* size_t max_size = */ (14 * 1024 * 1024), - /* size_t min_size = */ (512 * 1024), - - /* int64_t epoch_length = */ 1000, - - - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - - /* double lower_hr_threshold = */ 0.75, - - /* double increment = */ 2.0, - - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - - - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__threshold, - - /* double upper_hr_threshold = */ 0.995, - - /* double decrement = */ 0.1, - - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - - /* int32_t epochs_before_eviction = */ 3, - - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.05 - }; - - TESTING("automatic cache resize disable"); - - core_file_driver_failed = FALSE; - - pass2 = TRUE; - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* allocate a cache, enable automatic cache resizing, and then force - * the cache through all its operational modes. Verify that all - * performs as expected. - */ - - if ( pass2 ) { - - reset_entries2(); - - file_ptr = setup_cache2((size_t)(2 * 1024), - (size_t)(1 * 1024)); - cache_ptr = file_ptr->shared->cache2; - } - - if ( pass2 ) { - - result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 1.\n"; - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->max_cache_size != (512 * 1024) ) || - ( cache_ptr->min_clean_size != (256 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "bad cache size after initialization.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - - /****************************************************************** - * So far, we have forced the auto cache resize through all modes - * other than increase_disabled and decrease_disabled. Force these - * modes now. Note that there are several ways we can reach these - * modes. - ******************************************************************/ - - if ( pass2 ) { - - auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - auto_size_ctl.rpt_fcn = test_rpt_fcn; - - auto_size_ctl.set_initial_size = TRUE; - auto_size_ctl.initial_size = 4 * 1024 * 1024; - - auto_size_ctl.min_clean_fraction = 0.5; - - auto_size_ctl.max_size = 16 * 1024 * 1024; - auto_size_ctl.min_size = 1 * 1024 * 1024; - - auto_size_ctl.epoch_length = 1000; - - - auto_size_ctl.incr_mode = H5C2_incr__threshold; - - auto_size_ctl.lower_hr_threshold = 0.75; - - auto_size_ctl.increment = 1.0; /* disable size increases */ - - auto_size_ctl.apply_max_increment = FALSE; - auto_size_ctl.max_increment = (4 * 1024 * 1024); - - auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - auto_size_ctl.flash_multiple = 2.0; - auto_size_ctl.flash_threshold = 0.5; - - - auto_size_ctl.decr_mode = H5C2_decr__threshold; - - auto_size_ctl.upper_hr_threshold = 0.995; - - auto_size_ctl.decrement = 0.5; - - auto_size_ctl.apply_max_decrement = FALSE; - auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - auto_size_ctl.epochs_before_eviction = 3; - - auto_size_ctl.apply_empty_reserve = TRUE; - auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 2.\n"; - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "bad cache size after set resize re-config 1.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force low hit rate with cache full -- increase disabled so should - * be no change in cache size, and result should be increase_disabled. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_increase_possible ) || - ( rpt_status != increase_disabled ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 1.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force high hit rate -- make sure that we haven't disabled decreases. - * should result in a decrease cache size from 4 to 2 Meg. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 2.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force low hit rate again -- increase disabled so should - * be no change in cache size, and result should be increase_disabled. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_increase_possible ) || - ( rpt_status != increase_disabled ) || - ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 3.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* Repeat the above tests, disabling increase through the lower - * threshold instead of the increment. - */ - - if ( pass2 ) { - - auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - auto_size_ctl.rpt_fcn = test_rpt_fcn; - - auto_size_ctl.set_initial_size = TRUE; - auto_size_ctl.initial_size = 4 * 1024 * 1024; - - auto_size_ctl.min_clean_fraction = 0.5; - - auto_size_ctl.max_size = 16 * 1024 * 1024; - auto_size_ctl.min_size = 1 * 1024 * 1024; - - auto_size_ctl.epoch_length = 1000; - - - auto_size_ctl.incr_mode = H5C2_incr__threshold; - - auto_size_ctl.lower_hr_threshold = 0.0; /* disable size increases */ - - auto_size_ctl.increment = 2.0; - - auto_size_ctl.apply_max_increment = FALSE; - auto_size_ctl.max_increment = (4 * 1024 * 1024); - - auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - auto_size_ctl.flash_multiple = 2.0; - auto_size_ctl.flash_threshold = 0.5; - - - auto_size_ctl.decr_mode = H5C2_decr__threshold; - - auto_size_ctl.upper_hr_threshold = 0.995; - auto_size_ctl.decrement = 0.5; - - auto_size_ctl.apply_max_decrement = FALSE; - auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - auto_size_ctl.epochs_before_eviction = 3; - - auto_size_ctl.apply_empty_reserve = TRUE; - auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 3.\n"; - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "bad cache size after set resize re-config 2.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force low hit rate with cache full -- increase disabled so should - * be no change in cache size, and result should be in_spec. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_increase_possible ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 4.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force high hit rate -- make sure that we haven't disabled decreases. - * should result in a decrease cache size from 4 to 2 Meg. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 5.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force low hit rate again -- increase disabled so should - * be no change in cache size, and result should be increase_disabled. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_increase_possible ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 6.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* Repeat the above tests yet again, disabling increase through the - * incr_mode. - */ - - if ( pass2 ) { - - auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - auto_size_ctl.rpt_fcn = test_rpt_fcn; - - auto_size_ctl.set_initial_size = TRUE; - auto_size_ctl.initial_size = 4 * 1024 * 1024; - - auto_size_ctl.min_clean_fraction = 0.5; - - auto_size_ctl.max_size = 16 * 1024 * 1024; - auto_size_ctl.min_size = 1 * 1024 * 1024; - - auto_size_ctl.epoch_length = 1000; - - - auto_size_ctl.incr_mode = H5C2_incr__off; - - auto_size_ctl.lower_hr_threshold = 0.75; - - auto_size_ctl.increment = 2.0; - - auto_size_ctl.apply_max_increment = FALSE; - auto_size_ctl.max_increment = (4 * 1024 * 1024); - - auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - auto_size_ctl.flash_multiple = 2.0; - auto_size_ctl.flash_threshold = 0.5; - - - auto_size_ctl.decr_mode = H5C2_decr__threshold; - - auto_size_ctl.upper_hr_threshold = 0.995; - - auto_size_ctl.decrement = 0.5; - - auto_size_ctl.apply_max_decrement = FALSE; - auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - auto_size_ctl.epochs_before_eviction = 3; - - auto_size_ctl.apply_empty_reserve = TRUE; - auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 4.\n"; - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "bad cache size after set resize re-config 3.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force low hit rate with cache full -- increase disabled so should - * be no change in cache size, and result should be in_spec. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_increase_possible ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 7.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force high hit rate -- make sure that we haven't disabled decreases. - * should result in a decrease cache size from 4 to 2 Meg. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 8.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force low hit rate again -- increase disabled so should - * be no change in cache size, and result should be increase_disabled. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_increase_possible ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 9.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* Now, disable size decreases, and repeat the above tests. - */ - - if ( pass2 ) { - - auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - auto_size_ctl.rpt_fcn = test_rpt_fcn; - - auto_size_ctl.set_initial_size = TRUE; - auto_size_ctl.initial_size = 4 * 1024 * 1024; - - auto_size_ctl.min_clean_fraction = 0.5; - - auto_size_ctl.max_size = 16 * 1024 * 1024; - auto_size_ctl.min_size = 1 * 1024 * 1024; - - auto_size_ctl.epoch_length = 1000; - - - auto_size_ctl.incr_mode = H5C2_incr__threshold; - - auto_size_ctl.lower_hr_threshold = 0.75; - - auto_size_ctl.increment = 2.0; - - auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (2 * 1024 * 1024); - - auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - auto_size_ctl.flash_multiple = 2.0; - auto_size_ctl.flash_threshold = 0.5; - - - auto_size_ctl.decr_mode = H5C2_decr__threshold; - - auto_size_ctl.upper_hr_threshold = 0.995; - - auto_size_ctl.decrement = 1.0; /* disable size decreases */ - - auto_size_ctl.apply_max_decrement = TRUE; - auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - auto_size_ctl.epochs_before_eviction = 3; - - auto_size_ctl.apply_empty_reserve = TRUE; - auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 5.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - if ( pass2 ) { - - if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "bad cache size after set resize re-config 4.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force high hit rate -- should be no change in cache size, - * and result should be decrease_disabled. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease_disabled ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 10.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force low hit rate -- cache size should increase from 4 to 6 Meg. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != increase ) || - ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 11.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force high hit rate again -- should be no change in cache size, - * and result should be decrease_disabled. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease_disabled ) || - ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 12.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* Repeat the above tests, disabling decrease through the upper - * threshold instead of the decrement. - */ - - if ( pass2 ) { - - auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - auto_size_ctl.rpt_fcn = test_rpt_fcn; - - auto_size_ctl.set_initial_size = TRUE; - auto_size_ctl.initial_size = 4 * 1024 * 1024; - - auto_size_ctl.min_clean_fraction = 0.5; - - auto_size_ctl.max_size = 16 * 1024 * 1024; - auto_size_ctl.min_size = 1 * 1024 * 1024; - - auto_size_ctl.epoch_length = 1000; - - - auto_size_ctl.incr_mode = H5C2_incr__threshold; - - auto_size_ctl.lower_hr_threshold = 0.75; - - auto_size_ctl.increment = 2.0; - - auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (2 * 1024 * 1024); - - auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - auto_size_ctl.flash_multiple = 2.0; - auto_size_ctl.flash_threshold = 0.5; - - - auto_size_ctl.decr_mode = H5C2_decr__threshold; - - auto_size_ctl.upper_hr_threshold = 1.0; /* disable size decreases */ - - auto_size_ctl.decrement = 0.5; - - auto_size_ctl.apply_max_decrement = TRUE; - auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - auto_size_ctl.epochs_before_eviction = 3; - - auto_size_ctl.apply_empty_reserve = TRUE; - auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 6.\n"; - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "bad cache size after set resize re-config 5.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force high hit rate -- should be no change in cache size, - * and result should be in_spec. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 13.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force low hit rate -- cache size should increase from 4 to 6 Meg. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != increase ) || - ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 14.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force high hit rate again -- should be no change in cache size, - * and result should be in_spec. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 15.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* Repeat the above tests, disabling decrease through the decr_mode. - */ - - if ( pass2 ) { - - auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - auto_size_ctl.rpt_fcn = test_rpt_fcn; - - auto_size_ctl.set_initial_size = TRUE; - auto_size_ctl.initial_size = 4 * 1024 * 1024; - - auto_size_ctl.min_clean_fraction = 0.5; - - auto_size_ctl.max_size = 16 * 1024 * 1024; - auto_size_ctl.min_size = 1 * 1024 * 1024; - - auto_size_ctl.epoch_length = 1000; - - - auto_size_ctl.incr_mode = H5C2_incr__threshold; - - auto_size_ctl.lower_hr_threshold = 0.75; - - auto_size_ctl.increment = 2.0; - - auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (2 * 1024 * 1024); - - auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - auto_size_ctl.flash_multiple = 2.0; - auto_size_ctl.flash_threshold = 0.5; - - - auto_size_ctl.decr_mode = H5C2_decr__off; - - auto_size_ctl.upper_hr_threshold = 0.995; - - auto_size_ctl.decrement = 0.5; - - auto_size_ctl.apply_max_decrement = TRUE; - auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - auto_size_ctl.epochs_before_eviction = 3; - - auto_size_ctl.apply_empty_reserve = TRUE; - auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 7.\n"; - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "bad cache size after set resize re-config 6.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force high hit rate -- should be no change in cache size, - * and result should be in_spec. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 16.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force low hit rate -- cache size should increase from 4 to 6 Meg. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != increase ) || - ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 17.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force high hit rate again -- should be no change in cache size, - * and result should be in_spec. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 18.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* Now do tests disabling size decrement in age out mode. - * - * Start by disabling size decrement by setting max_decrement to zero. - */ - - if ( pass2 ) { - - auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - auto_size_ctl.rpt_fcn = test_rpt_fcn; - - auto_size_ctl.set_initial_size = TRUE; - auto_size_ctl.initial_size = 4 * 1024 * 1024; - - auto_size_ctl.min_clean_fraction = 0.5; - - auto_size_ctl.max_size = 16 * 1024 * 1024; - auto_size_ctl.min_size = 1 * 1024 * 1024; - - auto_size_ctl.epoch_length = 1000; - - - auto_size_ctl.incr_mode = H5C2_incr__threshold; - - auto_size_ctl.lower_hr_threshold = 0.75; - - auto_size_ctl.increment = 2.0; - - auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (2 * 1024 * 1024); - - auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - auto_size_ctl.flash_multiple = 2.0; - auto_size_ctl.flash_threshold = 0.5; - - - auto_size_ctl.decr_mode = H5C2_decr__age_out; - - auto_size_ctl.upper_hr_threshold = 0.995; - - auto_size_ctl.decrement = 0.5; - - auto_size_ctl.apply_max_decrement = TRUE; - auto_size_ctl.max_decrement = 0; /* disable decrement */ - - auto_size_ctl.epochs_before_eviction = 1; - - auto_size_ctl.apply_empty_reserve = TRUE; - auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 8.\n"; - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "bad cache size after set resize re-config 7.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* flush the cache and destroy all entries so we start from a known point */ - flush_cache2(file_ptr, TRUE, FALSE, FALSE); - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* load up the cache with small entries. Note that it will take an - * epoch for the ageout code to initialize itself if it is enabled. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, SMALL_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, SMALL_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != not_full ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 19.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* Load up some more small entries. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 1000; - while ( ( pass2 ) && ( i < 2000 ) ) - { - protect_entry2(file_ptr, SMALL_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, SMALL_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != not_full ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 20.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* Now force a high hit rate so that the size increase code is - * is satisfied. We would see a decrease here if decrease were - * possible. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, SMALL_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, SMALL_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != decrease_disabled ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 21.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force low hit rate -- cache size should increase from 4 to 6 Meg. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != increase ) || - ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 22.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* just bang on a single entry. This will see to it that there are - * many entries that could be aged out were decreases enabled. - * Should be no change in cache size, and result should be - * decrease_disabled. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != decrease_disabled ) || - ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 23.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* Now disable size decrement in age out mode via the empty reserve. - */ - - if ( pass2 ) { - - auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - auto_size_ctl.rpt_fcn = test_rpt_fcn; - - auto_size_ctl.set_initial_size = TRUE; - auto_size_ctl.initial_size = 4 * 1024 * 1024; - - auto_size_ctl.min_clean_fraction = 0.5; - - auto_size_ctl.max_size = 16 * 1024 * 1024; - auto_size_ctl.min_size = 1 * 1024 * 1024; - - auto_size_ctl.epoch_length = 1000; - - - auto_size_ctl.incr_mode = H5C2_incr__threshold; - - auto_size_ctl.lower_hr_threshold = 0.75; - - auto_size_ctl.increment = 2.0; - - auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (2 * 1024 * 1024); - - auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - auto_size_ctl.flash_multiple = 2.0; - auto_size_ctl.flash_threshold = 0.5; - - - auto_size_ctl.decr_mode = H5C2_decr__age_out; - - auto_size_ctl.upper_hr_threshold = 0.995; - - auto_size_ctl.decrement = 0.5; - - auto_size_ctl.apply_max_decrement = TRUE; - auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - auto_size_ctl.epochs_before_eviction = 1; - - auto_size_ctl.apply_empty_reserve = TRUE; - auto_size_ctl.empty_reserve = 1.0; /* disable decrement */ - - result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 9.\n"; - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "bad cache size after set resize re-config 8.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* flush the cache and destroy all entries so we start from a known point */ - flush_cache2(file_ptr, TRUE, FALSE, FALSE); - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* load up the cache with small entries. Note that it will take an - * epoch for the ageout code to initialize itself if it is enabled. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, SMALL_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, SMALL_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != not_full ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 24.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* Load up some more small entries. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 1000; - while ( ( pass2 ) && ( i < 2000 ) ) - { - protect_entry2(file_ptr, SMALL_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, SMALL_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != not_full ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 25.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* Now force a high hit rate so that the size increase code is - * is satisfied. We would see a decrease here if decrease were - * possible. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, SMALL_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, SMALL_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != decrease_disabled ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 26.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force low hit rate -- cache size should increase from 4 to 6 Meg. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != increase ) || - ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 27.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* just bang on a single entry. This will see to it that there are - * many entries that could be aged out were decreases enabled. - * Should be no change in cache size, and result should be - * decrease_disabled. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != decrease_disabled ) || - ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 28.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* Now work with age out with threshold. One can argue that we should - * repeat the above age out tests with age out with threshold, but the - * same code is executed in both cases so I don't see the point. If - * that ever changes, this test should be updated. - * - * There is only one way of disabling decrements that is peculiar - * to age out with threshold, which is to set the upper threshold - * to 1.0. Test this now. - */ - - if ( pass2 ) { - - auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - auto_size_ctl.rpt_fcn = test_rpt_fcn; - - auto_size_ctl.set_initial_size = TRUE; - auto_size_ctl.initial_size = 4 * 1024 * 1024; - - auto_size_ctl.min_clean_fraction = 0.5; - - auto_size_ctl.max_size = 16 * 1024 * 1024; - auto_size_ctl.min_size = 1 * 1024 * 1024; - - auto_size_ctl.epoch_length = 1000; - - - auto_size_ctl.incr_mode = H5C2_incr__threshold; - - auto_size_ctl.lower_hr_threshold = 0.75; - - auto_size_ctl.increment = 2.0; - - auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (2 * 1024 * 1024); - - auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - auto_size_ctl.flash_multiple = 2.0; - auto_size_ctl.flash_threshold = 0.5; - - - auto_size_ctl.decr_mode = H5C2_decr__age_out_with_threshold; - - auto_size_ctl.upper_hr_threshold = 1.0; - - auto_size_ctl.decrement = 0.5; - - auto_size_ctl.apply_max_decrement = TRUE; - auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - auto_size_ctl.epochs_before_eviction = 1; - - auto_size_ctl.apply_empty_reserve = TRUE; - auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 10.\n"; - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "bad cache size after set resize re-config 9.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* flush the cache and destroy all entries so we start from a known point */ - flush_cache2(file_ptr, TRUE, FALSE, FALSE); - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* load up the cache with small entries. Note that it will take an - * epoch for the ageout code to initialize itself if it is enabled. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, SMALL_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, SMALL_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != not_full ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 29.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* Load up some more small entries. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 1000; - while ( ( pass2 ) && ( i < 2000 ) ) - { - protect_entry2(file_ptr, SMALL_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, SMALL_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != not_full ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 30.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* Now force a high hit rate so that the size increase code is - * is satisfied. We would see a decrease here if decrease were - * possible, but the upper threshold cannot be met, so no decrease. - * - * rpt_status should be decrease_disabled. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, SMALL_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, SMALL_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != decrease_disabled ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) || - ( cache_ptr->index_len != 2000 ) || - ( cache_ptr->index_size != 2000 * SMALL_ENTRY_SIZE ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 31.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force low hit rate -- cache size should increase from 4 to 6 Meg. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != increase ) || - ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 32.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* just bang on a single entry. This keeps the hit rate high, and sees - * to it that there are many entries that could be aged out were - * decreases enabled. - * - * Should be no change in cache size, and result should be - * decrease_disabled. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 999); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 999, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( cache_ptr->size_decrease_possible ) || - ( rpt_status != decrease_disabled ) || - ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 33.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - - /********************************************************************* - * Finally, use the auto cache resize code to set the size of the - * cache and keep it there. Again, due to the complexity of the - * interface, there are lots of ways of doing this. We have to - * check them all. - *********************************************************************/ - - if ( pass2 ) { - - auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - auto_size_ctl.rpt_fcn = test_rpt_fcn; - - auto_size_ctl.set_initial_size = TRUE; - auto_size_ctl.initial_size = 2 * 1024 * 1024; - - auto_size_ctl.min_clean_fraction = 0.5; - - auto_size_ctl.max_size = 16 * 1024 * 1024; - auto_size_ctl.min_size = 1 * 1024 * 1024; - - auto_size_ctl.epoch_length = 1000; - - - auto_size_ctl.incr_mode = H5C2_incr__threshold; - - auto_size_ctl.lower_hr_threshold = 0.0; /* disable size increases */ - - auto_size_ctl.increment = 2.0; - - auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (2 * 1024 * 1024); - - auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - auto_size_ctl.flash_multiple = 2.0; - auto_size_ctl.flash_threshold = 0.5; - - - auto_size_ctl.decr_mode = H5C2_decr__threshold; - - auto_size_ctl.upper_hr_threshold = 1.0; /* disable size decreases */ - - auto_size_ctl.decrement = 0.5; - - auto_size_ctl.apply_max_decrement = TRUE; - auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - auto_size_ctl.epochs_before_eviction = 3; - - auto_size_ctl.apply_empty_reserve = TRUE; - auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 11.\n"; - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "bad cache size after set resize re-config 10.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force low hit rate -- should be no response as the auto-resize - * code should be disabled. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( rpt_fcn_called ) || - ( cache_ptr->resize_enabled ) || - ( cache_ptr->size_increase_possible ) || - ( cache_ptr->size_decrease_possible ) || - ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 34.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force high hit rate -- should be no response as the auto-resize - * code should be disabled. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( rpt_fcn_called ) || - ( cache_ptr->resize_enabled ) || - ( cache_ptr->size_increase_possible ) || - ( cache_ptr->size_decrease_possible ) || - ( cache_ptr->max_cache_size != (2 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 35.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - if ( pass2 ) { - - auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - auto_size_ctl.rpt_fcn = test_rpt_fcn; - - auto_size_ctl.set_initial_size = TRUE; - auto_size_ctl.initial_size = 4 * 1024 * 1024; - - auto_size_ctl.min_clean_fraction = 0.25; - - auto_size_ctl.max_size = 16 * 1024 * 1024; - auto_size_ctl.min_size = 1 * 1024 * 1024; - - auto_size_ctl.epoch_length = 1000; - - - auto_size_ctl.incr_mode = H5C2_incr__threshold; - - auto_size_ctl.lower_hr_threshold = 0.75; - - auto_size_ctl.increment = 1.0; /* disable size increment */ - - auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (2 * 1024 * 1024); - - auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - auto_size_ctl.flash_multiple = 2.0; - auto_size_ctl.flash_threshold = 0.5; - - - auto_size_ctl.decr_mode = H5C2_decr__threshold; - - auto_size_ctl.upper_hr_threshold = 0.995; - - auto_size_ctl.decrement = 1.0; /* disable size decrement */ - - auto_size_ctl.apply_max_decrement = TRUE; - auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - auto_size_ctl.epochs_before_eviction = 3; - - auto_size_ctl.apply_empty_reserve = TRUE; - auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 12.\n"; - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "bad cache size after set resize re-config 11.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force low hit rate -- should be no response as the auto-resize - * code should be disabled. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( rpt_fcn_called ) || - ( cache_ptr->resize_enabled ) || - ( cache_ptr->size_increase_possible ) || - ( cache_ptr->size_decrease_possible ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 36.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force high hit rate -- should be no response as the auto-resize - * code should be disabled. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( rpt_fcn_called ) || - ( cache_ptr->resize_enabled ) || - ( cache_ptr->size_increase_possible ) || - ( cache_ptr->size_decrease_possible ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 37.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - if ( pass2 ) { - - auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - auto_size_ctl.rpt_fcn = test_rpt_fcn; - - auto_size_ctl.set_initial_size = FALSE; - auto_size_ctl.initial_size = 2 * 1024 * 1024; - - auto_size_ctl.min_clean_fraction = 0.5; - - auto_size_ctl.max_size = 6 * 1024 * 1024; /* no resize */ - auto_size_ctl.min_size = 6 * 1024 * 1024; /* no resize */ - - auto_size_ctl.epoch_length = 1000; - - - auto_size_ctl.incr_mode = H5C2_incr__threshold; - - auto_size_ctl.lower_hr_threshold = 0.75; - - auto_size_ctl.increment = 2.0; - - auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (2 * 1024 * 1024); - - auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - auto_size_ctl.flash_multiple = 2.0; - auto_size_ctl.flash_threshold = 0.5; - - - auto_size_ctl.decr_mode = H5C2_decr__threshold; - - auto_size_ctl.upper_hr_threshold = 0.995; - - auto_size_ctl.decrement = 0.5; - - auto_size_ctl.apply_max_decrement = TRUE; - auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - auto_size_ctl.epochs_before_eviction = 3; - - auto_size_ctl.apply_empty_reserve = TRUE; - auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 13.\n"; - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "bad cache size after set resize re-config 12.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force low hit rate -- should be no response as the auto-resize - * code should be disabled. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( rpt_fcn_called ) || - ( cache_ptr->resize_enabled ) || - ( cache_ptr->size_increase_possible ) || - ( cache_ptr->size_decrease_possible ) || - ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 38.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force high hit rate -- should be no response as the auto-resize - * code should be disabled. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( rpt_fcn_called ) || - ( cache_ptr->resize_enabled ) || - ( cache_ptr->size_increase_possible ) || - ( cache_ptr->size_decrease_possible ) || - ( cache_ptr->max_cache_size != (6 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (3 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 39.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - if ( pass2 ) { - - auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - auto_size_ctl.rpt_fcn = test_rpt_fcn; - - auto_size_ctl.set_initial_size = TRUE; - auto_size_ctl.initial_size = 4 * 1024 * 1024; - - auto_size_ctl.min_clean_fraction = 0.25; - - auto_size_ctl.max_size = 16 * 1024 * 1024; - auto_size_ctl.min_size = 1 * 1024 * 1024; - - auto_size_ctl.epoch_length = 1000; - - - auto_size_ctl.incr_mode = H5C2_incr__threshold; - - auto_size_ctl.lower_hr_threshold = 0.75; - - auto_size_ctl.increment = 1.0; /* disable size increment */ - - auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (2 * 1024 * 1024); - - auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - auto_size_ctl.flash_multiple = 2.0; - auto_size_ctl.flash_threshold = 0.5; - - - auto_size_ctl.decr_mode = H5C2_decr__threshold; - - auto_size_ctl.upper_hr_threshold = 1.0; /* disable size decrement */ - - auto_size_ctl.decrement = 0.5; - - auto_size_ctl.apply_max_decrement = TRUE; - auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - auto_size_ctl.epochs_before_eviction = 3; - - auto_size_ctl.apply_empty_reserve = TRUE; - auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 14.\n"; - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "bad cache size after set resize re-config 13.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force low hit rate -- should be no response as the auto-resize - * code should be disabled. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( rpt_fcn_called ) || - ( cache_ptr->resize_enabled ) || - ( cache_ptr->size_increase_possible ) || - ( cache_ptr->size_decrease_possible ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 40.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force high hit rate -- should be no response as the auto-resize - * code should be disabled. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( rpt_fcn_called ) || - ( cache_ptr->resize_enabled ) || - ( cache_ptr->size_increase_possible ) || - ( cache_ptr->size_decrease_possible ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (1 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 41.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - if ( pass2 ) { - - auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - auto_size_ctl.rpt_fcn = test_rpt_fcn; - - auto_size_ctl.set_initial_size = TRUE; - auto_size_ctl.initial_size = 4 * 1024 * 1024; - - auto_size_ctl.min_clean_fraction = 0.5; - - auto_size_ctl.max_size = 16 * 1024 * 1024; - auto_size_ctl.min_size = 1 * 1024 * 1024; - - auto_size_ctl.epoch_length = 1000; - - - auto_size_ctl.incr_mode = H5C2_incr__threshold; - - auto_size_ctl.lower_hr_threshold = 0.0; /* disable size increment */ - - auto_size_ctl.increment = 2.0; - - auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (2 * 1024 * 1024); - - auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - auto_size_ctl.flash_multiple = 2.0; - auto_size_ctl.flash_threshold = 0.5; - - - auto_size_ctl.decr_mode = H5C2_decr__threshold; - - auto_size_ctl.upper_hr_threshold = 0.995; - - auto_size_ctl.decrement = 1.0; /* disable size decrement */ - - auto_size_ctl.apply_max_decrement = TRUE; - auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - auto_size_ctl.epochs_before_eviction = 3; - - auto_size_ctl.apply_empty_reserve = TRUE; - auto_size_ctl.empty_reserve = 0.05; - - - result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 15.\n"; - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "bad cache size after set resize re-config 14.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force low hit rate -- should be no response as the auto-resize - * code should be disabled. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( rpt_fcn_called ) || - ( cache_ptr->resize_enabled ) || - ( cache_ptr->size_increase_possible ) || - ( cache_ptr->size_decrease_possible ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 42.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force high hit rate -- should be no response as the auto-resize - * code should be disabled. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( rpt_fcn_called ) || - ( cache_ptr->resize_enabled ) || - ( cache_ptr->size_increase_possible ) || - ( cache_ptr->size_decrease_possible ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 43.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - if ( pass2 ) { - - auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - auto_size_ctl.rpt_fcn = test_rpt_fcn; - - auto_size_ctl.set_initial_size = TRUE; - auto_size_ctl.initial_size = 4 * 1024 * 1024; - - auto_size_ctl.min_clean_fraction = 0.5; - - auto_size_ctl.max_size = 16 * 1024 * 1024; - auto_size_ctl.min_size = 1 * 1024 * 1024; - - auto_size_ctl.epoch_length = 1000; - - - auto_size_ctl.incr_mode = H5C2_incr__off; - - auto_size_ctl.lower_hr_threshold = 0.75; - - auto_size_ctl.increment = 2.0; - - auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (2 * 1024 * 1024); - - auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - auto_size_ctl.flash_multiple = 2.0; - auto_size_ctl.flash_threshold = 0.5; - - - auto_size_ctl.decr_mode = H5C2_decr__off; - - auto_size_ctl.upper_hr_threshold = 0.995; - - auto_size_ctl.decrement = 0.5; - - auto_size_ctl.apply_max_decrement = TRUE; - auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - auto_size_ctl.epochs_before_eviction = 3; - - auto_size_ctl.apply_empty_reserve = TRUE; - auto_size_ctl.empty_reserve = 0.05; - - - result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 16.\n"; - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "bad cache size after set resize re-config 15.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force low hit rate -- should be no response as the auto-resize - * code should be disabled. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( rpt_fcn_called ) || - ( cache_ptr->resize_enabled ) || - ( cache_ptr->size_increase_possible ) || - ( cache_ptr->size_decrease_possible ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 44.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* force high hit rate -- should be no response as the auto-resize - * code should be disabled. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( rpt_fcn_called ) || - ( cache_ptr->resize_enabled ) || - ( cache_ptr->size_increase_possible ) || - ( cache_ptr->size_decrease_possible ) || - ( cache_ptr->max_cache_size != (4 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (2 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 45.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - - /* Now test the flash cache size increment code to verify that it - * is disabled when it should be. - * - * Since the flash size increase code doesn't look at hit rate, or - * use epochs (other than to start a new epoch if a flash cache size - * increase is triggered), we go about these tests somewhat differently - * than the rest of the tests in this function. - * - * As of this writing, there is only one flash cache size increment - * mode (add space), which is triggered whenever the size of a newly - * loaded or inserted entry, or the delta between old and new entry - * sizes exceeds some fraction of the current maximum cache size, and - * the cache doesn't have enough free space to accomodate the new/ - * resize entry without performing evictions. The range of permissible - * values for the flash_threshold (0.1 to 1.0 as of this writing), and - * for the flash_multiple (0.1 to 10.0) do not permit the facility to - * be turned off by configuration. Thus, flash cache size increases - * can be disabled only via the flash_incr_mode, and by setting the - * current max_cache_size equal to max_size. - * - * We have already tested the latter in check_auto_cache_resize(), so - * we need only thest the former here. Do this by disabling flash - * cache size increments via the flash_incr_mode, and then creating - * situations that would trigger flash cache size increases were that - * code enabled. - */ - - if ( pass2 ) { - - auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - auto_size_ctl.rpt_fcn = test_rpt_fcn; - - auto_size_ctl.set_initial_size = TRUE; - auto_size_ctl.initial_size = 64 * 1024; - - auto_size_ctl.min_clean_fraction = 0.5; - - auto_size_ctl.max_size = 256 * 1024; - auto_size_ctl.min_size = 32 * 1024; - - auto_size_ctl.epoch_length = 1000; - - - auto_size_ctl.incr_mode = H5C2_incr__threshold; - - auto_size_ctl.lower_hr_threshold = 0.75; - - auto_size_ctl.increment = 2.0; - - auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (2 * 1024); - - auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - auto_size_ctl.flash_multiple = 1.0; - auto_size_ctl.flash_threshold = 0.25; - - - auto_size_ctl.decr_mode = H5C2_decr__age_out_with_threshold; - - auto_size_ctl.upper_hr_threshold = 0.995; - - auto_size_ctl.decrement = 0.5; - - auto_size_ctl.apply_max_decrement = TRUE; - auto_size_ctl.max_decrement = (1 * 1024); - - auto_size_ctl.epochs_before_eviction = 3; - - auto_size_ctl.apply_empty_reserve = TRUE; - auto_size_ctl.empty_reserve = 0.05; - - - result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 17.\n"; - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->max_cache_size != (64 * 1024) ) || - ( cache_ptr->min_clean_size != (32 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "bad cache size after set resize re-config 16.\n"; - } - } - - /* We have reduced the max cache size to well below the current index - * size. Protect and unprotect an entry to allow the cache to evict - * entries and get within bounds - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - - protect_entry2(file_ptr, LARGE_ENTRY_TYPE, 0); - unprotect_entry2(file_ptr, LARGE_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - - if ( ( pass2 ) && - ( ( ( cache_ptr->max_cache_size != (64 * 1024) ) || - ( cache_ptr->min_clean_size != (32 * 1024) ) || - ( cache_ptr->index_len != 1 ) || - ( cache_ptr->index_size != LARGE_ENTRY_SIZE ) || - ( rpt_fcn_called != FALSE ) ) ) ) { - - HDfprintf(stdout, "\nmax_cache_size = %ld.\n", - (long)(cache_ptr->max_cache_size)); - HDfprintf(stdout, "min_clean_size = %ld.\n", - (long)(cache_ptr->min_clean_size)); - HDfprintf(stdout, "index_len = %ld.\n", - (long)(cache_ptr->index_len)); - HDfprintf(stdout, "index_size = %ld.\n", - (long)(cache_ptr->index_size)); - HDfprintf(stdout, "rpt_fcn_called = %ld.\n", - (long)(rpt_fcn_called)); - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 46.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* Now protect and unprotect a monster entry. If the flash cache - * size increment code was active, this would trigger an increase. - * Verify that it doesn't. - * - * This finishes the additional tests needed for the flash cache - * size increase code. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - - if ( ( pass2 ) && - ( ( ( cache_ptr->max_cache_size != (64 * 1024) ) || - ( cache_ptr->min_clean_size != (32 * 1024) ) || - ( cache_ptr->index_len != 1 ) || - ( cache_ptr->index_size != MONSTER_ENTRY_SIZE ) || - ( rpt_fcn_called != FALSE ) ) ) ) { - - HDfprintf(stdout, "\nmax_cache_size = %ld.\n", - (long)(cache_ptr->max_cache_size)); - HDfprintf(stdout, "min_clean_size = %ld.\n", - (long)(cache_ptr->min_clean_size)); - HDfprintf(stdout, "index_len = %ld.\n", - (long)(cache_ptr->index_len)); - HDfprintf(stdout, "index_size = %ld.\n", - (long)(cache_ptr->index_size)); - HDfprintf(stdout, "rpt_fcn_called = %ld.\n", - (long)(rpt_fcn_called)); - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 47.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - if ( pass2 ) { - - takedown_cache2(file_ptr, FALSE, FALSE); - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - HDfprintf(stdout, "%s: failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - if ( core_file_driver_failed ) { - - HDfprintf(stdout, - "%s(): Unable to open test file with core file driver.\n", - fcn_name); - } - - return !pass2; - -} /* check_auto_cache_resize_disable() */ - - -/*------------------------------------------------------------------------- - * Function: check_auto_cache_resize_epoch_markers() - * - * Purpose: Verify that the auto-resize code manages epoch markers - * correctly. - * - * Return: void - * - * Programmer: John Mainzer - * 12/16/04 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -static unsigned -check_auto_cache_resize_epoch_markers(void) -{ - const char * fcn_name = "check_auto_cache_resize_epoch_markers()"; - hbool_t show_progress = FALSE; - herr_t result; - int32_t i; - int32_t j; - int32_t checkpoint = 0; - H5F_t * file_ptr = NULL; - H5C2_t * cache_ptr = NULL; - H5C2_auto_size_ctl_t auto_size_ctl = - { - /* int32_t version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* H5C2_auto_resize_report_fcn rpt_fcn = */ test_rpt_fcn, - - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (512 * 1024), - - /* double min_clean_fraction = */ 0.5, - - /* size_t max_size = */ (14 * 1024 * 1024), - /* size_t min_size = */ (512 * 1024), - - /* int64_t epoch_length = */ 1000, - - - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - - /* double lower_hr_threshold = */ 0.75, - - /* double increment = */ 2.0, - - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - - - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__threshold, - - /* double upper_hr_threshold = */ 0.995, - - /* double decrement = */ 0.1, - - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - - /* int32_t epochs_before_eviction = */ 3, - - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.05 - }; - - TESTING("automatic cache resize epoch marker management"); - - core_file_driver_failed = FALSE; - - pass2 = TRUE; - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - if ( pass2 ) { - - reset_entries2(); - - file_ptr = setup_cache2((size_t)(2 * 1024), - (size_t)(1 * 1024)); - cache_ptr = file_ptr->shared->cache2; - } - - if ( pass2 ) { - - result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 1.\n"; - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->max_cache_size != (512 * 1024) ) || - ( cache_ptr->min_clean_size != (256 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "bad cache size after initialization.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - - /* Now make sure that we are managing the epoch markers correctly. - */ - - if ( pass2 ) { - - auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - auto_size_ctl.rpt_fcn = test_rpt_fcn; - - auto_size_ctl.set_initial_size = TRUE; - auto_size_ctl.initial_size = 8 * 1024 * 1024; - - auto_size_ctl.min_clean_fraction = 0.5; - - auto_size_ctl.max_size = 8 * 1024 * 1024; - auto_size_ctl.min_size = 512 * 1024; - - auto_size_ctl.epoch_length = 1000; - - - auto_size_ctl.incr_mode = H5C2_incr__off; - - auto_size_ctl.lower_hr_threshold = 0.75; - - auto_size_ctl.increment = 2.0; - - auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (4 * 1024 * 1024); - - auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - auto_size_ctl.flash_multiple = 2.0; - auto_size_ctl.flash_threshold = 0.5; - - - auto_size_ctl.decr_mode = H5C2_decr__age_out; - - auto_size_ctl.upper_hr_threshold = 0.995; - - auto_size_ctl.decrement = 0.5; - - auto_size_ctl.apply_max_decrement = FALSE; - auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - auto_size_ctl.epochs_before_eviction = 10; - - auto_size_ctl.apply_empty_reserve = FALSE; - auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 2.\n"; - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "bad cache size after set resize re-config 1.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* Since we just created the cache, there should be no epoch markers - * active. Verify that this is true. - */ - - if ( pass2 ) { - - if ( cache_ptr->epoch_markers_active != 0 ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected # of epoch markers 1.\n"; - } - } - - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, MEDIUM_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != in_spec ) || - ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) || - ( cache_ptr->index_size != (1 * 1000 * MEDIUM_ENTRY_SIZE) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 0.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - - if ( pass2 ) { - - j = 2; - while ( ( pass2 ) && ( j <= 10 ) ) - { - - rpt_fcn_called = FALSE; - i = (j - 2) * 1000; - while ( ( pass2 ) && ( i < (j - 1) * 1000 ) ) - { - protect_entry2(file_ptr, SMALL_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, SMALL_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != in_spec ) || - ( cache_ptr->epoch_markers_active != j ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected # of epoch markers 2.\n"; - } - - j++; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* we now have a full complement of epoch markers -- see if - * we get the expected reduction. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 9000; - while ( ( pass2 ) && ( i < 10000 ) ) - { - protect_entry2(file_ptr, SMALL_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, SMALL_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != - (10 * 1000 * SMALL_ENTRY_SIZE + MEDIUM_ENTRY_SIZE) ) || - ( cache_ptr->min_clean_size != - ((10 * 1000 * SMALL_ENTRY_SIZE + MEDIUM_ENTRY_SIZE) / 2) ) || - ( cache_ptr->index_size != - (10 * 1000 * SMALL_ENTRY_SIZE + MEDIUM_ENTRY_SIZE) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 1.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* now reduce the epochs before eviction, and see if the cache - * deletes the extra markers - */ - if ( pass2 ) { - - auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - auto_size_ctl.rpt_fcn = test_rpt_fcn; - - auto_size_ctl.set_initial_size = TRUE; - auto_size_ctl.initial_size = 8 * 1024 * 1024; - - auto_size_ctl.min_clean_fraction = 0.5; - - auto_size_ctl.max_size = 8 * 1024 * 1024; - auto_size_ctl.min_size = 512 * 1024; - - auto_size_ctl.epoch_length = 1000; - - - auto_size_ctl.incr_mode = H5C2_incr__off; - - auto_size_ctl.lower_hr_threshold = 0.75; - - auto_size_ctl.increment = 2.0; - - auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (4 * 1024 * 1024); - - auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - auto_size_ctl.flash_multiple = 2.0; - auto_size_ctl.flash_threshold = 0.5; - - - auto_size_ctl.decr_mode = H5C2_decr__age_out; - - auto_size_ctl.upper_hr_threshold = 0.995; - - auto_size_ctl.decrement = 0.5; - - auto_size_ctl.apply_max_decrement = FALSE; - auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - auto_size_ctl.epochs_before_eviction = 1; - - auto_size_ctl.apply_empty_reserve = FALSE; - auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 3.\n"; - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "bad cache size after set resize re-config 2.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* There should be exactly one active epoch marker at present. - */ - if ( pass2 ) { - - if ( cache_ptr->epoch_markers_active != 1 ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected # of epoch markers 3.\n"; - } - } - - /* Now do an epochs worth of accesses, and verify that everything - * not accessed in this epoch gets evicted, and the cache size - * is reduced. - */ - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 9000; - while ( ( pass2 ) && ( i < 10000 ) ) - { - protect_entry2(file_ptr, SMALL_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, SMALL_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != decrease ) || - ( cache_ptr->max_cache_size != (512 * 1024) ) || - ( cache_ptr->min_clean_size != (256 * 1024) ) || - ( cache_ptr->index_size != (1 * 1000 * SMALL_ENTRY_SIZE) ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 2.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* There should be exactly one active epoch marker at present... - */ - if ( pass2 ) { - - if ( cache_ptr->epoch_markers_active != 1 ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected # of epoch markers 4.\n"; - } - } - - /* shift the decrement mode to threshold, and verify that we remove - * all epoch markers. - */ - if ( pass2 ) { - - auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - auto_size_ctl.rpt_fcn = test_rpt_fcn; - - auto_size_ctl.set_initial_size = TRUE; - auto_size_ctl.initial_size = 8 * 1024 * 1024; - - auto_size_ctl.min_clean_fraction = 0.5; - - auto_size_ctl.max_size = 8 * 1024 * 1024; - auto_size_ctl.min_size = 512 * 1024; - - auto_size_ctl.epoch_length = 1000; - - - auto_size_ctl.incr_mode = H5C2_incr__off; - - auto_size_ctl.lower_hr_threshold = 0.75; - - auto_size_ctl.increment = 2.0; - - auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (4 * 1024 * 1024); - - auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - auto_size_ctl.flash_multiple = 2.0; - auto_size_ctl.flash_threshold = 0.5; - - - auto_size_ctl.decr_mode = H5C2_decr__threshold; - - auto_size_ctl.upper_hr_threshold = 0.995; - - auto_size_ctl.decrement = 0.5; - - auto_size_ctl.apply_max_decrement = FALSE; - auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - auto_size_ctl.epochs_before_eviction = 1; - - auto_size_ctl.apply_empty_reserve = FALSE; - auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 4.\n"; - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1024 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "bad cache size after set resize re-config 3.\n"; - } - } - - /* ... and now there should be none. - */ - if ( pass2 ) { - - if ( cache_ptr->epoch_markers_active != 0 ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected # of epoch markers 5.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* shift the decrement mode to age out with threshold. Set epochs - * before eviction to 10 again. - */ - if ( pass2 ) { - - auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - auto_size_ctl.rpt_fcn = test_rpt_fcn; - - auto_size_ctl.set_initial_size = TRUE; - auto_size_ctl.initial_size = 8 * 1024 * 1024; - - auto_size_ctl.min_clean_fraction = 0.5; - - auto_size_ctl.max_size = 8 * 1024 * 1024; - auto_size_ctl.min_size = 512 * 1024; - - auto_size_ctl.epoch_length = 1000; - - - auto_size_ctl.incr_mode = H5C2_incr__off; - - auto_size_ctl.lower_hr_threshold = 0.75; - - auto_size_ctl.increment = 2.0; - - auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (4 * 1024 * 1024); - - auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - auto_size_ctl.flash_multiple = 2.0; - auto_size_ctl.flash_threshold = 0.5; - - - auto_size_ctl.decr_mode = H5C2_decr__age_out_with_threshold; - - auto_size_ctl.upper_hr_threshold = 0.995; - - auto_size_ctl.decrement = 0.5; - - auto_size_ctl.apply_max_decrement = FALSE; - auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - auto_size_ctl.epochs_before_eviction = 10; - - auto_size_ctl.apply_empty_reserve = FALSE; - auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 5.\n"; - } - } - - /* Verify that there are no active epoch markers. - */ - if ( pass2 ) { - - if ( cache_ptr->epoch_markers_active != 0 ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected # of epoch markers 6.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* build up a full set of epoch markers. */ - if ( pass2 ) { - - j = 1; - while ( ( pass2 ) && ( j <= 10 ) ) - { - - rpt_fcn_called = FALSE; - i = (j - 1) * 1000; - while ( ( pass2 ) && ( i < j * 1000 ) ) - { - protect_entry2(file_ptr, SMALL_ENTRY_TYPE, i); - - if ( pass2 ) { - unprotect_entry2(file_ptr, SMALL_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - - if ( ( ! rpt_fcn_called ) || - ( rpt_status != in_spec ) || - ( cache_ptr->epoch_markers_active != j ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected # of epoch markers 7.\n"; - } - - j++; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* Verify that there are now 10 active epoch markers. - */ - if ( pass2 ) { - - if ( cache_ptr->epoch_markers_active != 10 ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected # of epoch markers 8.\n"; - } - } - - /* shift the decrement mode to off. This should cause all epoch - * markers to be removed. - */ - if ( pass2 ) { - - auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - auto_size_ctl.rpt_fcn = test_rpt_fcn; - - auto_size_ctl.set_initial_size = TRUE; - auto_size_ctl.initial_size = 8 * 1024 * 1024; - - auto_size_ctl.min_clean_fraction = 0.5; - - auto_size_ctl.max_size = 8 * 1024 * 1024; - auto_size_ctl.min_size = 512 * 1024; - - auto_size_ctl.epoch_length = 1000; - - - auto_size_ctl.incr_mode = H5C2_incr__off; - - auto_size_ctl.lower_hr_threshold = 0.75; - - auto_size_ctl.increment = 2.0; - - auto_size_ctl.apply_max_increment = TRUE; - auto_size_ctl.max_increment = (4 * 1024 * 1024); - - auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - auto_size_ctl.flash_multiple = 2.0; - auto_size_ctl.flash_threshold = 0.5; - - - auto_size_ctl.decr_mode = H5C2_decr__off; - - auto_size_ctl.upper_hr_threshold = 0.995; - - auto_size_ctl.decrement = 0.5; - - auto_size_ctl.apply_max_decrement = FALSE; - auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - auto_size_ctl.epochs_before_eviction = 10; - - auto_size_ctl.apply_empty_reserve = FALSE; - auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, &auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 6.\n"; - } - } - - /* Verify that there are now no active epoch markers. - */ - if ( pass2 ) { - - if ( cache_ptr->epoch_markers_active != 0 ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected # of epoch markers 9.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - /* verify that we still have the expected number of entries in the cache, - * and that the cache is of the expected size. - */ - if ( pass2 ) { - - if ( ( cache_ptr->max_cache_size != (8 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (4 * 1024 * 1024) )|| - ( cache_ptr->index_size != (10 * 1000 * SMALL_ENTRY_SIZE) ) || - ( cache_ptr->index_len != 10000 ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache size change results 3.\n"; - } - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - if ( pass2 ) { - - takedown_cache2(file_ptr, FALSE, FALSE); - } - - if ( show_progress ) HDfprintf(stderr, "check point %d\n", checkpoint++); - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - HDfprintf(stdout, "%s: failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - if ( core_file_driver_failed ) { - - HDfprintf(stdout, - "%s(): Unable to open test file with core file driver.\n", - fcn_name); - } - - return !pass2; - -} /* check_auto_cache_resize_epoch_markers() */ - - -/*------------------------------------------------------------------------- - * Function: check_auto_cache_resize_input_errs() - * - * Purpose: Verify that H5C2_set_cache_auto_resize_config() detects - * and rejects invalid input. - * - * Return: void - * - * Programmer: John Mainzer - * 10/29/04 - * - * Modifications: - * - * Added code to verify that errors in the flash cache size - * increment related fields are caught as well. - * - * JRM -- 1/17/08 - * - *------------------------------------------------------------------------- - */ - -#define RESIZE_CONFIGS_ARE_EQUAL(a, b, compare_init) \ -( ( (a).version == (b).version ) && \ - ( (a).rpt_fcn == (b).rpt_fcn ) && \ - ( ( ! compare_init ) || \ - ( (a).set_initial_size == (b).set_initial_size ) ) && \ - ( ( ! compare_init ) || \ - ( (a).initial_size == (b).initial_size ) ) && \ - ( DBL_REL_EQUAL((a).min_clean_fraction, (b).min_clean_fraction, 0.00001 ) ) && \ - ( (a).max_size == (b).max_size ) && \ - ( (a).min_size == (b).min_size ) && \ - ( (a).epoch_length == (b).epoch_length ) && \ - ( (a).incr_mode == (b).incr_mode ) && \ - ( DBL_REL_EQUAL((a).lower_hr_threshold, (b).lower_hr_threshold, 0.00001 ) ) && \ - ( DBL_REL_EQUAL((a).increment, (b).increment, 0.00001 ) ) && \ - ( (a).apply_max_increment == (b).apply_max_increment ) && \ - ( (a).max_increment == (b).max_increment ) && \ - ( (a).flash_incr_mode == (b).flash_incr_mode ) && \ - ( DBL_REL_EQUAL((a).flash_multiple, (b).flash_multiple, 0.00001 ) ) && \ - ( DBL_REL_EQUAL((a).flash_threshold, (b).flash_threshold, 0.00001 ) ) && \ - ( (a).decr_mode == (b).decr_mode ) && \ - ( DBL_REL_EQUAL((a).upper_hr_threshold, (b).upper_hr_threshold, 0.00001 ) ) && \ - ( DBL_REL_EQUAL((a).decrement, (b).decrement, 0.00001 ) ) && \ - ( (a).apply_max_decrement == (b).apply_max_decrement ) && \ - ( (a).max_decrement == (b).max_decrement ) && \ - ( (a).epochs_before_eviction == (b).epochs_before_eviction ) && \ - ( (a).apply_empty_reserve == (b).apply_empty_reserve ) && \ - ( DBL_REL_EQUAL((a).empty_reserve, (b).empty_reserve, 0.00001 ) ) ) - -static unsigned -check_auto_cache_resize_input_errs(void) -{ - const char * fcn_name = "check_auto_cache_resize_input_errs()"; - herr_t result; - H5F_t * file_ptr = NULL; - H5C2_t * cache_ptr = NULL; - H5C2_auto_size_ctl_t ref_auto_size_ctl = - { - /* int32_t version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* H5C2_auto_resize_report_fcn rpt_fcn = */ test_rpt_fcn, - - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (512 * 1024), - - /* double min_clean_fraction = */ 0.5, - - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ (512 * 1024), - - /* int64_t epoch_length = */ 1000, - - - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - - /* double lower_hr_threshold = */ 0.75, - - /* double increment = */ 2.0, - - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - - - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__threshold, - - /* double upper_hr_threshold = */ 0.995, - - /* double decrement = */ 0.1, - - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - - /* int32_t epochs_before_eviction = */ 3, - - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.05 - }; - - H5C2_auto_size_ctl_t invalid_auto_size_ctl; - H5C2_auto_size_ctl_t test_auto_size_ctl; - - TESTING("automatic cache resize input errors"); - - core_file_driver_failed = FALSE; - - pass2 = TRUE; - - /* allocate a cache, and set a reference automatic cache control - * configuration. Then feed H5C2_set_cache_auto_resize_config() - * invalid input, and verify that the correct error is returned, - * and that the configuration is not modified. - */ - - if ( pass2 ) { - - reset_entries2(); - - file_ptr = setup_cache2((size_t)(2 * 1024), - (size_t)(1 * 1024)); - cache_ptr = file_ptr->shared->cache2; - } - - if ( pass2 ) { - - result = H5C2_set_cache_auto_resize_config(cache_ptr, - &ref_auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 1.\n"; - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->max_cache_size != (512 * 1024) ) || - ( cache_ptr->min_clean_size != (256 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "bad cache size after initialization.\n"; - } - } - - if ( pass2 ) { - - result = H5C2_get_cache_auto_resize_config(cache_ptr, - &test_auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 1."; - - } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ - ref_auto_size_ctl, FALSE) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 1."; - } - } - - if ( pass2 ) { - - invalid_auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - invalid_auto_size_ctl.rpt_fcn = NULL; - - invalid_auto_size_ctl.set_initial_size = TRUE; - invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; - - invalid_auto_size_ctl.min_clean_fraction = 0.5; - - invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; - invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; - - invalid_auto_size_ctl.epoch_length = 5000; - - - invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold; - - invalid_auto_size_ctl.lower_hr_threshold = 0.7; - - invalid_auto_size_ctl.increment = 2.0; - - invalid_auto_size_ctl.apply_max_increment = TRUE; - invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); - - invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - invalid_auto_size_ctl.flash_multiple = 2.0; - invalid_auto_size_ctl.flash_threshold = 0.5; - - - invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold; - - invalid_auto_size_ctl.upper_hr_threshold = 0.999; - - invalid_auto_size_ctl.decrement = 0.5; - - invalid_auto_size_ctl.apply_max_decrement = TRUE; - invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - invalid_auto_size_ctl.epochs_before_eviction = 3; - - invalid_auto_size_ctl.apply_empty_reserve = TRUE; - invalid_auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(NULL, - &invalid_auto_size_ctl); - - if ( result != FAIL ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_set_cache_auto_resize_config accepted NULL cache_ptr.\n"; - } - } - - if ( pass2 ) { - - result = H5C2_get_cache_auto_resize_config(cache_ptr, - &test_auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 2."; - - } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ - ref_auto_size_ctl, FALSE) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 2."; - } - } - - - /* check bad version rejection. */ - - if ( pass2 ) { - - invalid_auto_size_ctl.version = -1; /* INVALID */ - invalid_auto_size_ctl.rpt_fcn = NULL; - - invalid_auto_size_ctl.set_initial_size = TRUE; - invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; - - invalid_auto_size_ctl.min_clean_fraction = 0.5; - - invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; - invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; - - invalid_auto_size_ctl.epoch_length = 5000; - - - invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold; - - invalid_auto_size_ctl.lower_hr_threshold = 0.7; - - invalid_auto_size_ctl.increment = 2.0; - - invalid_auto_size_ctl.apply_max_increment = TRUE; - invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); - - invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - invalid_auto_size_ctl.flash_multiple = 2.0; - invalid_auto_size_ctl.flash_threshold = 0.5; - - - invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold; - - invalid_auto_size_ctl.upper_hr_threshold = 0.999; - - invalid_auto_size_ctl.decrement = 0.5; - - invalid_auto_size_ctl.apply_max_decrement = TRUE; - invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - invalid_auto_size_ctl.epochs_before_eviction = 3; - - invalid_auto_size_ctl.apply_empty_reserve = TRUE; - invalid_auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, - &invalid_auto_size_ctl); - - if ( result != FAIL ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_set_cache_auto_resize_config accepted bad version.\n"; - } - } - - if ( pass2 ) { - - result = H5C2_get_cache_auto_resize_config(cache_ptr, - &test_auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 3."; - - } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ - ref_auto_size_ctl, FALSE) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 3."; - } - } - - - /* check bad initial size rejection */ - - if ( pass2 ) { - - invalid_auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - invalid_auto_size_ctl.rpt_fcn = NULL; - - invalid_auto_size_ctl.set_initial_size = TRUE; - invalid_auto_size_ctl.initial_size = 16 * 1024 * 1024 + 1; - /* INVALID */ - - invalid_auto_size_ctl.min_clean_fraction = 0.5; - - invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; - invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; - - invalid_auto_size_ctl.epoch_length = 5000; - - - invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold; - - invalid_auto_size_ctl.lower_hr_threshold = 0.75; - - invalid_auto_size_ctl.increment = 2.0; - - invalid_auto_size_ctl.apply_max_increment = TRUE; - invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); - - invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - invalid_auto_size_ctl.flash_multiple = 2.0; - invalid_auto_size_ctl.flash_threshold = 0.5; - - - invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold; - - invalid_auto_size_ctl.upper_hr_threshold = 0.999; - - invalid_auto_size_ctl.decrement = 0.5; - - invalid_auto_size_ctl.apply_max_decrement = TRUE; - invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - invalid_auto_size_ctl.epochs_before_eviction = 3; - - invalid_auto_size_ctl.apply_empty_reserve = TRUE; - invalid_auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, - &invalid_auto_size_ctl); - - if ( result != FAIL ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_set_cache_auto_resize_config accepted bad init size 1.\n"; - } - } - - if ( pass2 ) { - - result = H5C2_get_cache_auto_resize_config(cache_ptr, - &test_auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 4."; - - } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ - ref_auto_size_ctl, FALSE) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 4."; - } - } - - if ( pass2 ) { - - invalid_auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - invalid_auto_size_ctl.rpt_fcn = NULL; - - invalid_auto_size_ctl.set_initial_size = TRUE; - invalid_auto_size_ctl.initial_size = 1 * 1024 * 1024 - 1; - /* INVALID */ - - invalid_auto_size_ctl.min_clean_fraction = 0.5; - - invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; - invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; - - invalid_auto_size_ctl.epoch_length = 5000; - - - invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold; - - invalid_auto_size_ctl.lower_hr_threshold = 0.75; - - invalid_auto_size_ctl.increment = 2.0; - - invalid_auto_size_ctl.apply_max_increment = TRUE; - invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); - - invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - invalid_auto_size_ctl.flash_multiple = 2.0; - invalid_auto_size_ctl.flash_threshold = 0.5; - - - invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold; - - invalid_auto_size_ctl.upper_hr_threshold = 0.999; - - invalid_auto_size_ctl.decrement = 0.5; - - invalid_auto_size_ctl.apply_max_decrement = TRUE; - invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - invalid_auto_size_ctl.epochs_before_eviction = 3; - - invalid_auto_size_ctl.apply_empty_reserve = TRUE; - invalid_auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, - &invalid_auto_size_ctl); - - if ( result != FAIL ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_set_cache_auto_resize_config accepted bad init size 2.\n"; - } - } - - if ( pass2 ) { - - result = H5C2_get_cache_auto_resize_config(cache_ptr, - &test_auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 5."; - - } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ - ref_auto_size_ctl, FALSE) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 5."; - } - } - - - /* test for invalid min clean fraction rejection. */ - - if ( pass2 ) { - - invalid_auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - invalid_auto_size_ctl.rpt_fcn = NULL; - - invalid_auto_size_ctl.set_initial_size = TRUE; - invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; - - invalid_auto_size_ctl.min_clean_fraction = 1.00001; /* INVALID */ - - invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; - invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; - - invalid_auto_size_ctl.epoch_length = 5000; - - - invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold; - - invalid_auto_size_ctl.lower_hr_threshold = 0.75; - - invalid_auto_size_ctl.increment = 2.0; - - invalid_auto_size_ctl.apply_max_increment = TRUE; - invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); - - invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - invalid_auto_size_ctl.flash_multiple = 2.0; - invalid_auto_size_ctl.flash_threshold = 0.5; - - - invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold; - - invalid_auto_size_ctl.upper_hr_threshold = 0.999; - - invalid_auto_size_ctl.decrement = 0.5; - - invalid_auto_size_ctl.apply_max_decrement = TRUE; - invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - invalid_auto_size_ctl.epochs_before_eviction = 3; - - invalid_auto_size_ctl.apply_empty_reserve = TRUE; - invalid_auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, - &invalid_auto_size_ctl); - - if ( result != FAIL ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_set_cache_auto_resize_config accepted bad min clean frac 1.\n"; - } - } - - if ( pass2 ) { - - result = H5C2_get_cache_auto_resize_config(cache_ptr, - &test_auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 6."; - - } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ - ref_auto_size_ctl, FALSE) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 6."; - } - } - - if ( pass2 ) { - - invalid_auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - invalid_auto_size_ctl.rpt_fcn = NULL; - - invalid_auto_size_ctl.set_initial_size = TRUE; - invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; - - invalid_auto_size_ctl.min_clean_fraction = -0.00001; /* INVALID */ - - invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; - invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; - - invalid_auto_size_ctl.epoch_length = 5000; - - - invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold; - - invalid_auto_size_ctl.lower_hr_threshold = 0.75; - - invalid_auto_size_ctl.increment = 2.0; - - invalid_auto_size_ctl.apply_max_increment = TRUE; - invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); - - invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - invalid_auto_size_ctl.flash_multiple = 2.0; - invalid_auto_size_ctl.flash_threshold = 0.5; - - - invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold; - - invalid_auto_size_ctl.upper_hr_threshold = 0.999; - - invalid_auto_size_ctl.decrement = 0.5; - - invalid_auto_size_ctl.apply_max_decrement = TRUE; - invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - invalid_auto_size_ctl.epochs_before_eviction = 3; - - invalid_auto_size_ctl.apply_empty_reserve = TRUE; - invalid_auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, - &invalid_auto_size_ctl); - - if ( result != FAIL ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_set_cache_auto_resize_config accepted bad min clean frac 2.\n"; - } - } - - if ( pass2 ) { - - result = H5C2_get_cache_auto_resize_config(cache_ptr, - &test_auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 7."; - - } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ - ref_auto_size_ctl, FALSE) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 7."; - } - } - - - /* test for invalid max_size and/or min_size rejection */ - - if ( pass2 ) { - - invalid_auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - invalid_auto_size_ctl.rpt_fcn = NULL; - - invalid_auto_size_ctl.set_initial_size = TRUE; - invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; - - invalid_auto_size_ctl.min_clean_fraction = 0.5; - - invalid_auto_size_ctl.max_size = H5C2__MAX_MAX_CACHE_SIZE + 1; - /* INVALID */ - invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; - - invalid_auto_size_ctl.epoch_length = 5000; - - - invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold; - - invalid_auto_size_ctl.lower_hr_threshold = 0.75; - - invalid_auto_size_ctl.increment = 2.0; - - invalid_auto_size_ctl.apply_max_increment = TRUE; - invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); - - invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - invalid_auto_size_ctl.flash_multiple = 2.0; - invalid_auto_size_ctl.flash_threshold = 0.5; - - - invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold; - - invalid_auto_size_ctl.upper_hr_threshold = 0.999; - - invalid_auto_size_ctl.decrement = 0.5; - - invalid_auto_size_ctl.apply_max_decrement = TRUE; - invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - invalid_auto_size_ctl.epochs_before_eviction = 3; - - invalid_auto_size_ctl.apply_empty_reserve = TRUE; - invalid_auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, - &invalid_auto_size_ctl); - - if ( result != FAIL ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_set_cache_auto_resize_config accepted bad max_size.\n"; - } - } - - if ( pass2 ) { - - result = H5C2_get_cache_auto_resize_config(cache_ptr, - &test_auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 8."; - - } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ - ref_auto_size_ctl, FALSE) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 8."; - } - } - - if ( pass2 ) { - - invalid_auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - invalid_auto_size_ctl.rpt_fcn = NULL; - - invalid_auto_size_ctl.set_initial_size = TRUE; - invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; - - invalid_auto_size_ctl.min_clean_fraction = 0.5; - - invalid_auto_size_ctl.max_size = 1 * 1024 * 1024;/* INVALID */ - invalid_auto_size_ctl.min_size = 1 * 1024 * 1024 + 1;/*PAIR */ - - invalid_auto_size_ctl.epoch_length = 5000; - - - invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold; - - invalid_auto_size_ctl.lower_hr_threshold = 0.75; - - invalid_auto_size_ctl.increment = 2.0; - - invalid_auto_size_ctl.apply_max_increment = TRUE; - invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); - - invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - invalid_auto_size_ctl.flash_multiple = 2.0; - invalid_auto_size_ctl.flash_threshold = 0.5; - - - invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold; - - invalid_auto_size_ctl.upper_hr_threshold = 0.999; - - invalid_auto_size_ctl.decrement = 0.5; - - invalid_auto_size_ctl.apply_max_decrement = TRUE; - invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - invalid_auto_size_ctl.epochs_before_eviction = 3; - - invalid_auto_size_ctl.apply_empty_reserve = TRUE; - invalid_auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, - &invalid_auto_size_ctl); - - if ( result != FAIL ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_set_cache_auto_resize_config accepted bad size pair.\n"; - } - } - - if ( pass2 ) { - - result = H5C2_get_cache_auto_resize_config(cache_ptr, - &test_auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 9."; - - } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ - ref_auto_size_ctl, FALSE) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 9."; - } - } - - if ( pass2 ) { - - invalid_auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - invalid_auto_size_ctl.rpt_fcn = NULL; - - invalid_auto_size_ctl.set_initial_size = TRUE; - invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; - - invalid_auto_size_ctl.min_clean_fraction = 0.5; - - invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; - invalid_auto_size_ctl.min_size = H5C2__MIN_MAX_CACHE_SIZE - 1; - /* INVALID */ - invalid_auto_size_ctl.epoch_length = 5000; - - - invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold; - - invalid_auto_size_ctl.lower_hr_threshold = 0.75; - - invalid_auto_size_ctl.increment = 2.0; - - invalid_auto_size_ctl.apply_max_increment = TRUE; - invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); - - invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - invalid_auto_size_ctl.flash_multiple = 2.0; - invalid_auto_size_ctl.flash_threshold = 0.5; - - - invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold; - - invalid_auto_size_ctl.upper_hr_threshold = 0.999; - - invalid_auto_size_ctl.decrement = 0.5; - - invalid_auto_size_ctl.apply_max_decrement = TRUE; - invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - invalid_auto_size_ctl.epochs_before_eviction = 3; - - invalid_auto_size_ctl.apply_empty_reserve = TRUE; - invalid_auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, - &invalid_auto_size_ctl); - - if ( result != FAIL ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_set_cache_auto_resize_config accepted bad min_size.\n"; - } - } - - if ( pass2 ) { - - result = H5C2_get_cache_auto_resize_config(cache_ptr, - &test_auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 10."; - - } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ - ref_auto_size_ctl, FALSE) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 10."; - } - } - - - /* test for invalid epoch_length rejection */ - - if ( pass2 ) { - - invalid_auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - invalid_auto_size_ctl.rpt_fcn = NULL; - - invalid_auto_size_ctl.set_initial_size = TRUE; - invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; - - invalid_auto_size_ctl.min_clean_fraction = 0.1; - - invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; - invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; - - invalid_auto_size_ctl.epoch_length = H5C2__MAX_AR_EPOCH_LENGTH + 1; - /* INVALID */ - - invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold; - - invalid_auto_size_ctl.lower_hr_threshold = 0.75; - - invalid_auto_size_ctl.increment = 2.0; - - invalid_auto_size_ctl.apply_max_increment = TRUE; - invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); - - invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - invalid_auto_size_ctl.flash_multiple = 2.0; - invalid_auto_size_ctl.flash_threshold = 0.5; - - - invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold; - - invalid_auto_size_ctl.upper_hr_threshold = 0.999; - - invalid_auto_size_ctl.decrement = 0.9; - - invalid_auto_size_ctl.apply_max_decrement = TRUE; - invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - invalid_auto_size_ctl.epochs_before_eviction = 3; - - invalid_auto_size_ctl.apply_empty_reserve = TRUE; - invalid_auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, - &invalid_auto_size_ctl); - - if ( result != FAIL ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_set_cache_auto_resize_config accepted bad epoch len 1.\n"; - } - } - - if ( pass2 ) { - - result = H5C2_get_cache_auto_resize_config(cache_ptr, - &test_auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 11."; - - } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ - ref_auto_size_ctl, FALSE) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 11."; - } - } - - if ( pass2 ) { - - invalid_auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - invalid_auto_size_ctl.rpt_fcn = NULL; - - invalid_auto_size_ctl.set_initial_size = TRUE; - invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; - - invalid_auto_size_ctl.min_clean_fraction = 0.1; - - invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; - invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; - - invalid_auto_size_ctl.epoch_length = H5C2__MIN_AR_EPOCH_LENGTH - 1; - /* INVALID */ - - invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold; - - invalid_auto_size_ctl.lower_hr_threshold = 0.75; - - invalid_auto_size_ctl.increment = 2.0; - - invalid_auto_size_ctl.apply_max_increment = TRUE; - invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); - - invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - invalid_auto_size_ctl.flash_multiple = 2.0; - invalid_auto_size_ctl.flash_threshold = 0.5; - - - invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold; - - invalid_auto_size_ctl.upper_hr_threshold = 0.999; - - invalid_auto_size_ctl.decrement = 0.9; - - invalid_auto_size_ctl.apply_max_decrement = TRUE; - invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - invalid_auto_size_ctl.epochs_before_eviction = 3; - - invalid_auto_size_ctl.apply_empty_reserve = TRUE; - invalid_auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, - &invalid_auto_size_ctl); - - if ( result != FAIL ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_set_cache_auto_resize_config accepted bad epoch len 2.\n"; - } - } - - if ( pass2 ) { - - result = H5C2_get_cache_auto_resize_config(cache_ptr, - &test_auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 12."; - - } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ - ref_auto_size_ctl, FALSE) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 12."; - } - } - - - /* test for bad incr_mode rejection */ - - if ( pass2 ) { - - invalid_auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - invalid_auto_size_ctl.rpt_fcn = NULL; - - invalid_auto_size_ctl.set_initial_size = TRUE; - invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; - - invalid_auto_size_ctl.min_clean_fraction = 0.1; - - invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; - invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; - - invalid_auto_size_ctl.epoch_length = 5000; - - - invalid_auto_size_ctl.incr_mode = - (enum H5C2_cache_incr_mode) -1; /* INVALID */ - - invalid_auto_size_ctl.lower_hr_threshold = 0.75; - - invalid_auto_size_ctl.increment = 2.0; - - invalid_auto_size_ctl.apply_max_increment = TRUE; - invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); - - invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - invalid_auto_size_ctl.flash_multiple = 2.0; - invalid_auto_size_ctl.flash_threshold = 0.5; - - - invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold; - - invalid_auto_size_ctl.upper_hr_threshold = 0.999; - - invalid_auto_size_ctl.decrement = 0.9; - - invalid_auto_size_ctl.apply_max_decrement = TRUE; - invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - invalid_auto_size_ctl.epochs_before_eviction = 3; - - invalid_auto_size_ctl.apply_empty_reserve = TRUE; - invalid_auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, - &invalid_auto_size_ctl); - - if ( result != FAIL ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_set_cache_auto_resize_config accepted bad incr_mode 1.\n"; - } - } - - if ( pass2 ) { - - result = H5C2_get_cache_auto_resize_config(cache_ptr, - &test_auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 13."; - - } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ - ref_auto_size_ctl, FALSE) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 13."; - } - } - - if ( pass2 ) { - - invalid_auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - invalid_auto_size_ctl.rpt_fcn = NULL; - - invalid_auto_size_ctl.set_initial_size = TRUE; - invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; - - invalid_auto_size_ctl.min_clean_fraction = 0.1; - - invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; - invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; - - invalid_auto_size_ctl.epoch_length = 5000; - - - invalid_auto_size_ctl.incr_mode = - (enum H5C2_cache_incr_mode) 2; /* INVALID */ - - invalid_auto_size_ctl.lower_hr_threshold = 0.75; - - invalid_auto_size_ctl.increment = 2.0; - - invalid_auto_size_ctl.apply_max_increment = TRUE; - invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); - - invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - invalid_auto_size_ctl.flash_multiple = 2.0; - invalid_auto_size_ctl.flash_threshold = 0.5; - - - invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold; - - invalid_auto_size_ctl.upper_hr_threshold = 0.999; - - invalid_auto_size_ctl.decrement = 0.9; - - invalid_auto_size_ctl.apply_max_decrement = TRUE; - invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - invalid_auto_size_ctl.epochs_before_eviction = 3; - - invalid_auto_size_ctl.apply_empty_reserve = TRUE; - invalid_auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, - &invalid_auto_size_ctl); - - if ( result != FAIL ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_set_cache_auto_resize_config accepted bad incr_mode 2.\n"; - } - } - - if ( pass2 ) { - - result = H5C2_get_cache_auto_resize_config(cache_ptr, - &test_auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 14."; - - } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ - ref_auto_size_ctl, FALSE) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 14."; - } - } - - - /* check for bad upper and/or lower threshold rejection */ - - if ( pass2 ) { - - invalid_auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - invalid_auto_size_ctl.rpt_fcn = NULL; - - invalid_auto_size_ctl.set_initial_size = TRUE; - invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; - - invalid_auto_size_ctl.min_clean_fraction = 0.5; - - invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; - invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; - - invalid_auto_size_ctl.epoch_length = 5000; - - - invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold; - - invalid_auto_size_ctl.lower_hr_threshold = 0.7; - - invalid_auto_size_ctl.increment = 2.0; - - invalid_auto_size_ctl.apply_max_increment = TRUE; - invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); - - invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - invalid_auto_size_ctl.flash_multiple = 2.0; - invalid_auto_size_ctl.flash_threshold = 0.5; - - - invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold; - - invalid_auto_size_ctl.upper_hr_threshold = 1.01; /* INVALID */ - - invalid_auto_size_ctl.decrement = 0.5; - - invalid_auto_size_ctl.apply_max_decrement = TRUE; - invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - invalid_auto_size_ctl.epochs_before_eviction = 3; - - invalid_auto_size_ctl.apply_empty_reserve = TRUE; - invalid_auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, - &invalid_auto_size_ctl); - - if ( result != FAIL ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_set_cache_auto_resize_config accepted bad upper threshold.\n"; - } - } - - if ( pass2 ) { - - result = H5C2_get_cache_auto_resize_config(cache_ptr, - &test_auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 15."; - - } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ - ref_auto_size_ctl, FALSE) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 15."; - } - } - - if ( pass2 ) { - - invalid_auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - invalid_auto_size_ctl.rpt_fcn = NULL; - - invalid_auto_size_ctl.set_initial_size = TRUE; - invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; - - invalid_auto_size_ctl.min_clean_fraction = 0.5; - - invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; - invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; - - invalid_auto_size_ctl.epoch_length = 5000; - - - invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold; - - invalid_auto_size_ctl.lower_hr_threshold = 0.8; /* INVALID */ - - invalid_auto_size_ctl.increment = 2.0; - - invalid_auto_size_ctl.apply_max_increment = TRUE; - invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); - - invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - invalid_auto_size_ctl.flash_multiple = 2.0; - invalid_auto_size_ctl.flash_threshold = 0.5; - - - invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold; - - invalid_auto_size_ctl.upper_hr_threshold = 0.7; /* INVALID */ - - invalid_auto_size_ctl.decrement = 0.5; - - invalid_auto_size_ctl.apply_max_decrement = TRUE; - invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - invalid_auto_size_ctl.epochs_before_eviction = 3; - - invalid_auto_size_ctl.apply_empty_reserve = TRUE; - invalid_auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, - &invalid_auto_size_ctl); - - if ( result != FAIL ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_set_cache_auto_resize_config accepted bad threshold pair.\n"; - } - } - - if ( pass2 ) { - - result = H5C2_get_cache_auto_resize_config(cache_ptr, - &test_auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 16."; - - } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ - ref_auto_size_ctl, FALSE) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 16."; - } - } - - if ( pass2 ) { - - invalid_auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - invalid_auto_size_ctl.rpt_fcn = NULL; - - invalid_auto_size_ctl.set_initial_size = TRUE; - invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; - - invalid_auto_size_ctl.min_clean_fraction = 0.5; - - invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; - invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; - - invalid_auto_size_ctl.epoch_length = 5000; - - - invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold; - - invalid_auto_size_ctl.lower_hr_threshold = -0.0001; /* INVALID */ - - invalid_auto_size_ctl.increment = 2.0; - - invalid_auto_size_ctl.apply_max_increment = TRUE; - invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); - - invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - invalid_auto_size_ctl.flash_multiple = 2.0; - invalid_auto_size_ctl.flash_threshold = 0.5; - - - invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold; - - invalid_auto_size_ctl.upper_hr_threshold = 0.999; - - invalid_auto_size_ctl.decrement = 0.5; - - invalid_auto_size_ctl.apply_max_decrement = TRUE; - invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - invalid_auto_size_ctl.epochs_before_eviction = 3; - - invalid_auto_size_ctl.apply_empty_reserve = TRUE; - invalid_auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, - &invalid_auto_size_ctl); - - if ( result != FAIL ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_set_cache_auto_resize_config accepted bad lower threshold.\n"; - } - } - - if ( pass2 ) { - - result = H5C2_get_cache_auto_resize_config(cache_ptr, - &test_auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 17."; - - } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ - ref_auto_size_ctl, FALSE) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 17."; - } - } - - - /* test for bad increment rejection */ - - if ( pass2 ) { - - invalid_auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - invalid_auto_size_ctl.rpt_fcn = NULL; - - invalid_auto_size_ctl.set_initial_size = TRUE; - invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; - - invalid_auto_size_ctl.min_clean_fraction = 0.1; - - invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; - invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; - - invalid_auto_size_ctl.epoch_length = 5000; - - - invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold; - - invalid_auto_size_ctl.lower_hr_threshold = 0.75; - - invalid_auto_size_ctl.increment = 0.99999; /* INVALID */ - - invalid_auto_size_ctl.apply_max_increment = TRUE; - invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); - - invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - invalid_auto_size_ctl.flash_multiple = 2.0; - invalid_auto_size_ctl.flash_threshold = 0.5; - - - invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold; - - invalid_auto_size_ctl.upper_hr_threshold = 0.999; - - invalid_auto_size_ctl.decrement = 0.5; - - invalid_auto_size_ctl.apply_max_decrement = TRUE; - invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - invalid_auto_size_ctl.epochs_before_eviction = 3; - - invalid_auto_size_ctl.apply_empty_reserve = TRUE; - invalid_auto_size_ctl.empty_reserve = 0.05; - - - result = H5C2_set_cache_auto_resize_config(cache_ptr, - &invalid_auto_size_ctl); - - if ( result != FAIL ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_set_cache_auto_resize_config accepted bad increment.\n"; - } - } - - if ( pass2 ) { - - result = H5C2_get_cache_auto_resize_config(cache_ptr, - &test_auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 18."; - - } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ - ref_auto_size_ctl, FALSE) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 18."; - } - } - - /* test for bad flash_incr_mode rejection */ - - if ( pass2 ) { - - invalid_auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - invalid_auto_size_ctl.rpt_fcn = NULL; - - invalid_auto_size_ctl.set_initial_size = TRUE; - invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; - - invalid_auto_size_ctl.min_clean_fraction = 0.1; - - invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; - invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; - - invalid_auto_size_ctl.epoch_length = 5000; - - - invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold; - - invalid_auto_size_ctl.lower_hr_threshold = 0.75; - - invalid_auto_size_ctl.increment = 2.0; - - invalid_auto_size_ctl.apply_max_increment = TRUE; - invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); - - invalid_auto_size_ctl.flash_incr_mode = - (enum H5C2_cache_flash_incr_mode) -1; /* INVALID */ - invalid_auto_size_ctl.flash_multiple = 2.0; - invalid_auto_size_ctl.flash_threshold = 0.5; - - - invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold; - - invalid_auto_size_ctl.upper_hr_threshold = 0.999; - - invalid_auto_size_ctl.decrement = 0.9; - - invalid_auto_size_ctl.apply_max_decrement = TRUE; - invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - invalid_auto_size_ctl.epochs_before_eviction = 3; - - invalid_auto_size_ctl.apply_empty_reserve = TRUE; - invalid_auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, - &invalid_auto_size_ctl); - - if ( result != FAIL ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_set_cache_auto_resize_config accepted bad flash_incr_mode.\n"; - } - } - - if ( pass2 ) { - - result = H5C2_get_cache_auto_resize_config(cache_ptr, - &test_auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 19."; - - } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ - ref_auto_size_ctl, FALSE) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 19."; - } - } - - /* test for bad flash_multiple rejection */ - - if ( pass2 ) { - - invalid_auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - invalid_auto_size_ctl.rpt_fcn = NULL; - - invalid_auto_size_ctl.set_initial_size = TRUE; - invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; - - invalid_auto_size_ctl.min_clean_fraction = 0.1; - - invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; - invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; - - invalid_auto_size_ctl.epoch_length = 5000; - - - invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold; - - invalid_auto_size_ctl.lower_hr_threshold = 0.75; - - invalid_auto_size_ctl.increment = 2.0; - - invalid_auto_size_ctl.apply_max_increment = TRUE; - invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); - - invalid_auto_size_ctl.flash_incr_mode = - H5C2_flash_incr__add_space; - invalid_auto_size_ctl.flash_multiple = 0.09; /* INVALID */ - invalid_auto_size_ctl.flash_threshold = 0.5; - - - invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold; - - invalid_auto_size_ctl.upper_hr_threshold = 0.999; - - invalid_auto_size_ctl.decrement = 0.9; - - invalid_auto_size_ctl.apply_max_decrement = TRUE; - invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - invalid_auto_size_ctl.epochs_before_eviction = 3; - - invalid_auto_size_ctl.apply_empty_reserve = TRUE; - invalid_auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, - &invalid_auto_size_ctl); - - if ( result != FAIL ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_set_cache_auto_resize_config accepted bad flash_multiple(1).\n"; - } - } - - if ( pass2 ) { - - result = H5C2_get_cache_auto_resize_config(cache_ptr, - &test_auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 20."; - - } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ - ref_auto_size_ctl, FALSE) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 20."; - } - } - - if ( pass2 ) { - - invalid_auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - invalid_auto_size_ctl.rpt_fcn = NULL; - - invalid_auto_size_ctl.set_initial_size = TRUE; - invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; - - invalid_auto_size_ctl.min_clean_fraction = 0.1; - - invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; - invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; - - invalid_auto_size_ctl.epoch_length = 5000; - - - invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold; - - invalid_auto_size_ctl.lower_hr_threshold = 0.75; - - invalid_auto_size_ctl.increment = 2.0; - - invalid_auto_size_ctl.apply_max_increment = TRUE; - invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); - - invalid_auto_size_ctl.flash_incr_mode = - H5C2_flash_incr__add_space; - invalid_auto_size_ctl.flash_multiple = 10.01; /* INVALID */ - invalid_auto_size_ctl.flash_threshold = 0.5; - - - invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold; - - invalid_auto_size_ctl.upper_hr_threshold = 0.999; - - invalid_auto_size_ctl.decrement = 0.9; - - invalid_auto_size_ctl.apply_max_decrement = TRUE; - invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - invalid_auto_size_ctl.epochs_before_eviction = 3; - - invalid_auto_size_ctl.apply_empty_reserve = TRUE; - invalid_auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, - &invalid_auto_size_ctl); - - if ( result != FAIL ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_set_cache_auto_resize_config accepted bad flash_multiple(2).\n"; - } - } - - if ( pass2 ) { - - result = H5C2_get_cache_auto_resize_config(cache_ptr, - &test_auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 21."; - - } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ - ref_auto_size_ctl, FALSE) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 21."; - } - } - - /* test for bad flash_threshold rejection */ - - if ( pass2 ) { - - invalid_auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - invalid_auto_size_ctl.rpt_fcn = NULL; - - invalid_auto_size_ctl.set_initial_size = TRUE; - invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; - - invalid_auto_size_ctl.min_clean_fraction = 0.1; - - invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; - invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; - - invalid_auto_size_ctl.epoch_length = 5000; - - - invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold; - - invalid_auto_size_ctl.lower_hr_threshold = 0.75; - - invalid_auto_size_ctl.increment = 2.0; - - invalid_auto_size_ctl.apply_max_increment = TRUE; - invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); - - invalid_auto_size_ctl.flash_incr_mode = - H5C2_flash_incr__add_space; - invalid_auto_size_ctl.flash_multiple = 1.0; - invalid_auto_size_ctl.flash_threshold = 0.09; /* INVALID */ - - - invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold; - - invalid_auto_size_ctl.upper_hr_threshold = 0.999; - - invalid_auto_size_ctl.decrement = 0.9; - - invalid_auto_size_ctl.apply_max_decrement = TRUE; - invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - invalid_auto_size_ctl.epochs_before_eviction = 3; - - invalid_auto_size_ctl.apply_empty_reserve = TRUE; - invalid_auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, - &invalid_auto_size_ctl); - - if ( result != FAIL ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_set_cache_auto_resize_config accepted bad flash_threshold(1).\n"; - } - } - - if ( pass2 ) { - - result = H5C2_get_cache_auto_resize_config(cache_ptr, - &test_auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 22."; - - } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ - ref_auto_size_ctl, FALSE) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 22."; - } - } - - if ( pass2 ) { - - invalid_auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - invalid_auto_size_ctl.rpt_fcn = NULL; - - invalid_auto_size_ctl.set_initial_size = TRUE; - invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; - - invalid_auto_size_ctl.min_clean_fraction = 0.1; - - invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; - invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; - - invalid_auto_size_ctl.epoch_length = 5000; - - - invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold; - - invalid_auto_size_ctl.lower_hr_threshold = 0.75; - - invalid_auto_size_ctl.increment = 2.0; - - invalid_auto_size_ctl.apply_max_increment = TRUE; - invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); - - invalid_auto_size_ctl.flash_incr_mode = - H5C2_flash_incr__add_space; - invalid_auto_size_ctl.flash_multiple = 1.0; - invalid_auto_size_ctl.flash_threshold = 1.001; /* INVALID */ - - - invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold; - - invalid_auto_size_ctl.upper_hr_threshold = 0.999; - - invalid_auto_size_ctl.decrement = 0.9; - - invalid_auto_size_ctl.apply_max_decrement = TRUE; - invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - invalid_auto_size_ctl.epochs_before_eviction = 3; - - invalid_auto_size_ctl.apply_empty_reserve = TRUE; - invalid_auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, - &invalid_auto_size_ctl); - - if ( result != FAIL ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_set_cache_auto_resize_config accepted bad flash_threshold(2).\n"; - } - } - - if ( pass2 ) { - - result = H5C2_get_cache_auto_resize_config(cache_ptr, - &test_auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 23."; - - } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ - ref_auto_size_ctl, FALSE) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 23."; - } - } - - - /* test for bad decr_mode rejection */ - - if ( pass2 ) { - - invalid_auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - invalid_auto_size_ctl.rpt_fcn = NULL; - - invalid_auto_size_ctl.set_initial_size = TRUE; - invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; - - invalid_auto_size_ctl.min_clean_fraction = 0.1; - - invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; - invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; - - invalid_auto_size_ctl.epoch_length = 5000; - - - invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold; - - invalid_auto_size_ctl.lower_hr_threshold = 0.75; - - invalid_auto_size_ctl.increment = 2.0; - - invalid_auto_size_ctl.apply_max_increment = TRUE; - invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); - - invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - invalid_auto_size_ctl.flash_multiple = 2.0; - invalid_auto_size_ctl.flash_threshold = 0.5; - - - invalid_auto_size_ctl.decr_mode = - (enum H5C2_cache_decr_mode) -1; /* INVALID */ - - invalid_auto_size_ctl.upper_hr_threshold = 0.999; - - invalid_auto_size_ctl.decrement = 0.9; - - invalid_auto_size_ctl.apply_max_decrement = TRUE; - invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - invalid_auto_size_ctl.epochs_before_eviction = 3; - - invalid_auto_size_ctl.apply_empty_reserve = TRUE; - invalid_auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, - &invalid_auto_size_ctl); - - if ( result != FAIL ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_set_cache_auto_resize_config accepted bad decr_mode 1.\n"; - } - } - - if ( pass2 ) { - - result = H5C2_get_cache_auto_resize_config(cache_ptr, - &test_auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 24."; - - } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ - ref_auto_size_ctl, FALSE) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 24."; - } - } - - if ( pass2 ) { - - invalid_auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - invalid_auto_size_ctl.rpt_fcn = NULL; - - invalid_auto_size_ctl.set_initial_size = TRUE; - invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; - - invalid_auto_size_ctl.min_clean_fraction = 0.1; - - invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; - invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; - - invalid_auto_size_ctl.epoch_length = 5000; - - - invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold; - - invalid_auto_size_ctl.lower_hr_threshold = 0.75; - - invalid_auto_size_ctl.increment = 2.0; - - invalid_auto_size_ctl.apply_max_increment = TRUE; - invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); - - invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - invalid_auto_size_ctl.flash_multiple = 2.0; - invalid_auto_size_ctl.flash_threshold = 0.5; - - - invalid_auto_size_ctl.decr_mode = - (enum H5C2_cache_decr_mode) 4; /* INVALID */ - - invalid_auto_size_ctl.upper_hr_threshold = 0.999; - - invalid_auto_size_ctl.decrement = 0.9; - - invalid_auto_size_ctl.apply_max_decrement = TRUE; - invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - invalid_auto_size_ctl.epochs_before_eviction = 3; - - invalid_auto_size_ctl.apply_empty_reserve = TRUE; - invalid_auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, - &invalid_auto_size_ctl); - - if ( result != FAIL ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_set_cache_auto_resize_config accepted bad decr_mode 2.\n"; - } - } - - if ( pass2 ) { - - result = H5C2_get_cache_auto_resize_config(cache_ptr, - &test_auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 25."; - - } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ - ref_auto_size_ctl, FALSE) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 25."; - } - } - - - /* check for bad decrement rejection */ - - if ( pass2 ) { - - invalid_auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - invalid_auto_size_ctl.rpt_fcn = NULL; - - invalid_auto_size_ctl.set_initial_size = TRUE; - invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; - - invalid_auto_size_ctl.min_clean_fraction = 0.1; - - invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; - invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; - - invalid_auto_size_ctl.epoch_length = 5000; - - - invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold; - - invalid_auto_size_ctl.lower_hr_threshold = 0.75; - - invalid_auto_size_ctl.increment = 2.0; - - invalid_auto_size_ctl.apply_max_increment = TRUE; - invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); - - invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - invalid_auto_size_ctl.flash_multiple = 2.0; - invalid_auto_size_ctl.flash_threshold = 0.5; - - - invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold; - - invalid_auto_size_ctl.upper_hr_threshold = 0.999; - - invalid_auto_size_ctl.decrement = 1.000001; /* INVALID */ - - invalid_auto_size_ctl.apply_max_decrement = TRUE; - invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - invalid_auto_size_ctl.epochs_before_eviction = 3; - - invalid_auto_size_ctl.apply_empty_reserve = TRUE; - invalid_auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, - &invalid_auto_size_ctl); - - if ( result != FAIL ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_set_cache_auto_resize_config accepted bad decrement 1.\n"; - } - } - - if ( pass2 ) { - - result = H5C2_get_cache_auto_resize_config(cache_ptr, - &test_auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 26."; - - } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ - ref_auto_size_ctl, FALSE) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 26."; - } - } - - if ( pass2 ) { - - invalid_auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - invalid_auto_size_ctl.rpt_fcn = NULL; - - invalid_auto_size_ctl.set_initial_size = TRUE; - invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; - - invalid_auto_size_ctl.min_clean_fraction = 0.1; - - invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; - invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; - - invalid_auto_size_ctl.epoch_length = 5000; - - - invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold; - - invalid_auto_size_ctl.lower_hr_threshold = 0.75; - - invalid_auto_size_ctl.increment = 2.0; - - invalid_auto_size_ctl.apply_max_increment = TRUE; - invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); - - invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - invalid_auto_size_ctl.flash_multiple = 2.0; - invalid_auto_size_ctl.flash_threshold = 0.5; - - - invalid_auto_size_ctl.decr_mode = H5C2_decr__threshold; - - invalid_auto_size_ctl.upper_hr_threshold = 0.999; - - invalid_auto_size_ctl.decrement = -0.000001; /* INVALID */ - - invalid_auto_size_ctl.apply_max_decrement = TRUE; - invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - invalid_auto_size_ctl.epochs_before_eviction = 3; - - invalid_auto_size_ctl.apply_empty_reserve = TRUE; - invalid_auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, - &invalid_auto_size_ctl); - - if ( result != FAIL ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_set_cache_auto_resize_config accepted bad decrement 2.\n"; - } - } - - if ( pass2 ) { - - result = H5C2_get_cache_auto_resize_config(cache_ptr, - &test_auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 27."; - - } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ - ref_auto_size_ctl, FALSE) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 27."; - } - } - - - /* check for rejection of bad epochs_before_eviction */ - - if ( pass2 ) { - - invalid_auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - invalid_auto_size_ctl.rpt_fcn = NULL; - - invalid_auto_size_ctl.set_initial_size = TRUE; - invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; - - invalid_auto_size_ctl.min_clean_fraction = 0.1; - - invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; - invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; - - invalid_auto_size_ctl.epoch_length = 5000; - - - invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold; - - invalid_auto_size_ctl.lower_hr_threshold = 0.75; - - invalid_auto_size_ctl.increment = 2.0; - - invalid_auto_size_ctl.apply_max_increment = TRUE; - invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); - - invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - invalid_auto_size_ctl.flash_multiple = 2.0; - invalid_auto_size_ctl.flash_threshold = 0.5; - - - invalid_auto_size_ctl.decr_mode = H5C2_decr__age_out; - - invalid_auto_size_ctl.upper_hr_threshold = 0.999; - - invalid_auto_size_ctl.decrement = 0.9; - - invalid_auto_size_ctl.apply_max_decrement = TRUE; - invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - invalid_auto_size_ctl.epochs_before_eviction = 0; /* INVALID */ - - invalid_auto_size_ctl.apply_empty_reserve = TRUE; - invalid_auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, - &invalid_auto_size_ctl); - - if ( result != FAIL ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config accepted bad epochs_before_eviction 1.\n"; - } - } - - if ( pass2 ) { - - result = H5C2_get_cache_auto_resize_config(cache_ptr, - &test_auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 28."; - - } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ - ref_auto_size_ctl, FALSE) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 28."; - } - } - - if ( pass2 ) { - - invalid_auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - invalid_auto_size_ctl.rpt_fcn = NULL; - - invalid_auto_size_ctl.set_initial_size = TRUE; - invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; - - invalid_auto_size_ctl.min_clean_fraction = 0.1; - - invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; - invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; - - invalid_auto_size_ctl.epoch_length = 5000; - - - invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold; - - invalid_auto_size_ctl.lower_hr_threshold = 0.75; - - invalid_auto_size_ctl.increment = 2.0; - - invalid_auto_size_ctl.apply_max_increment = TRUE; - invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); - - invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - invalid_auto_size_ctl.flash_multiple = 2.0; - invalid_auto_size_ctl.flash_threshold = 0.5; - - - invalid_auto_size_ctl.decr_mode = H5C2_decr__age_out_with_threshold; - - invalid_auto_size_ctl.upper_hr_threshold = 0.999; - - invalid_auto_size_ctl.decrement = 0.9; - - invalid_auto_size_ctl.apply_max_decrement = TRUE; - invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - invalid_auto_size_ctl.epochs_before_eviction = - H5C2__MAX_EPOCH_MARKERS + 1; /* INVALID */ - - invalid_auto_size_ctl.apply_empty_reserve = TRUE; - invalid_auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, - &invalid_auto_size_ctl); - - if ( result != FAIL ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config accepted bad epochs_before_eviction 2.\n"; - } - } - - if ( pass2 ) { - - result = H5C2_get_cache_auto_resize_config(cache_ptr, - &test_auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 29."; - - } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ - ref_auto_size_ctl, FALSE) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 29."; - } - } - - - /* Check for bad apply_empty_reserve rejection */ - - if ( pass2 ) { - - invalid_auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - invalid_auto_size_ctl.rpt_fcn = NULL; - - invalid_auto_size_ctl.set_initial_size = TRUE; - invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; - - invalid_auto_size_ctl.min_clean_fraction = 0.1; - - invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; - invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; - - invalid_auto_size_ctl.epoch_length = 5000; - - - invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold; - - invalid_auto_size_ctl.lower_hr_threshold = 0.75; - - invalid_auto_size_ctl.increment = 2.0; - - invalid_auto_size_ctl.apply_max_increment = TRUE; - invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); - - invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - invalid_auto_size_ctl.flash_multiple = 2.0; - invalid_auto_size_ctl.flash_threshold = 0.5; - - - invalid_auto_size_ctl.decr_mode = H5C2_decr__age_out; - - invalid_auto_size_ctl.upper_hr_threshold = 0.999; - - invalid_auto_size_ctl.decrement = 0.9; - - invalid_auto_size_ctl.apply_max_decrement = TRUE; - invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - invalid_auto_size_ctl.epochs_before_eviction = 3; - - invalid_auto_size_ctl.apply_empty_reserve = TRUE; - invalid_auto_size_ctl.empty_reserve = -0.0000001; /* INVALID */ - - result = H5C2_set_cache_auto_resize_config(cache_ptr, - &invalid_auto_size_ctl); - - if ( result != FAIL ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config accepted bad empty_reserve 1.\n"; - } - } - - if ( pass2 ) { - - result = H5C2_get_cache_auto_resize_config(cache_ptr, - &test_auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 30."; - - } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ - ref_auto_size_ctl, FALSE) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 30."; - } - } - - if ( pass2 ) { - - invalid_auto_size_ctl.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - invalid_auto_size_ctl.rpt_fcn = NULL; - - invalid_auto_size_ctl.set_initial_size = TRUE; - invalid_auto_size_ctl.initial_size = 4 * 1024 * 1024; - - invalid_auto_size_ctl.min_clean_fraction = 0.1; - - invalid_auto_size_ctl.max_size = 16 * 1024 * 1024; - invalid_auto_size_ctl.min_size = 1 * 1024 * 1024; - - invalid_auto_size_ctl.epoch_length = 5000; - - - invalid_auto_size_ctl.incr_mode = H5C2_incr__threshold; - - invalid_auto_size_ctl.lower_hr_threshold = 0.75; - - invalid_auto_size_ctl.increment = 2.0; - - invalid_auto_size_ctl.apply_max_increment = TRUE; - invalid_auto_size_ctl.max_increment = (2 * 1024 * 1024); - - invalid_auto_size_ctl.flash_incr_mode = H5C2_flash_incr__off; - invalid_auto_size_ctl.flash_multiple = 2.0; - invalid_auto_size_ctl.flash_threshold = 0.5; - - - invalid_auto_size_ctl.decr_mode = H5C2_decr__age_out_with_threshold; - - invalid_auto_size_ctl.upper_hr_threshold = 0.999; - - invalid_auto_size_ctl.decrement = 0.9; - - invalid_auto_size_ctl.apply_max_decrement = TRUE; - invalid_auto_size_ctl.max_decrement = (1 * 1024 * 1024); - - invalid_auto_size_ctl.epochs_before_eviction = - H5C2__MAX_EPOCH_MARKERS + 1; /* INVALID */ - - invalid_auto_size_ctl.apply_empty_reserve = TRUE; - invalid_auto_size_ctl.empty_reserve = 0.05; - - result = H5C2_set_cache_auto_resize_config(cache_ptr, - &invalid_auto_size_ctl); - - if ( result != FAIL ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config accepted bad empty_reserve 2.\n"; - } - } - - if ( pass2 ) { - - result = H5C2_get_cache_auto_resize_config(cache_ptr, - &test_auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_auto_resize_config failed 31."; - - } else if ( ! RESIZE_CONFIGS_ARE_EQUAL(test_auto_size_ctl, \ - ref_auto_size_ctl, FALSE) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected auto resize config 31."; - } - } - - - /* finally, before we finish, try feeding - * H5C2_get_cache_auto_resize_config invalid data. - */ - - if ( pass2 ) { - - result = H5C2_get_cache_auto_resize_config(NULL, &test_auto_size_ctl); - - if ( result != FAIL ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_get_cache_auto_resize_config accepted NULL cache_ptr.\n"; - } - } - - if ( pass2 ) { - - result = H5C2_get_cache_auto_resize_config((const H5C2_t *)&test_auto_size_ctl, - &test_auto_size_ctl); - - if ( result != FAIL ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_get_cache_auto_resize_config accepted bad cache_ptr.\n"; - } - } - - if ( pass2 ) { - - result = H5C2_get_cache_auto_resize_config(cache_ptr, NULL); - - if ( result != FAIL ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_get_cache_auto_resize_config accepted NULL config ptr.\n"; - } - } - - if ( pass2 ) { - - takedown_cache2(file_ptr, FALSE, FALSE); - } - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - HDfprintf(stdout, "%s: failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - if ( core_file_driver_failed ) { - - HDfprintf(stdout, - "%s(): Unable to open test file with core file driver.\n", - fcn_name); - } - - return !pass2; - -} /* check_auto_cache_resize_input_errs() */ - - -/*------------------------------------------------------------------------- - * Function: check_auto_cache_resize_aux_fcns() - * - * Purpose: Verify that the auxilary functions associated with - * the automatic cache resize capability are operating - * correctly. These functions are: - * - * H5C2_get_cache_size() - * H5C2_get_cache_hit_rate() - * H5C2_reset_cache_hit_rate_stats() - * - * Return: void - * - * Programmer: John Mainzer - * 11/4/04 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -static unsigned -check_auto_cache_resize_aux_fcns(void) -{ - const char * fcn_name = "check_auto_cache_resize_aux_fcns()"; - herr_t result; - int32_t i; - H5F_t * file_ptr = NULL; - H5C2_t * cache_ptr = NULL; - double hit_rate; - size_t max_size; - size_t min_clean_size; - size_t cur_size; - int32_t cur_num_entries; - H5C2_auto_size_ctl_t auto_size_ctl = - { - /* int32_t version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, -#if 1 - /* H5C2_auto_resize_report_fcn rpt_fcn = */ NULL, -#else - /* H5C2_auto_resize_report_fcn rpt_fcn = */ H5C2_def_auto_resize_rpt_fcn, -#endif - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024), - - /* double min_clean_fraction = */ 0.5, - - /* size_t max_size = */ (16 * 1024 * 1025), - /* size_t min_size = */ (512 * 1024), - - /* int64_t epoch_length = */ 50000, - - - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__off, - - /* double lower_hr_threshold = */ 0.75, - - /* double increment = */ 2.0, - - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - - - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__off, - - /* double upper_hr_threshold = */ 0.995, - - /* double decrement = */ 0.9, - - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - - /* int32_t epochs_before_eviction = */ 3, - - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.5 - }; - - - TESTING("automatic cache resize auxilary functions"); - - core_file_driver_failed = FALSE; - - pass2 = TRUE; - - /* allocate a cache, and then test the various auxilary functions. - */ - - if ( pass2 ) { - - reset_entries2(); - - file_ptr = setup_cache2((size_t)(2 * 1024), - (size_t)(1 * 1024)); - cache_ptr = file_ptr->shared->cache2; - } - - if ( pass2 ) { - - result = H5C2_set_cache_auto_resize_config(cache_ptr, - &auto_size_ctl); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_set_cache_auto_resize_config failed 1.\n"; - } - } - - if ( pass2 ) { - - if ( ( cache_ptr->max_cache_size != (1 * 1024 * 1024) ) || - ( cache_ptr->min_clean_size != (512 * 1024) ) ) { - - pass2 = FALSE; - failure_mssg2 = "bad cache size after initialization.\n"; - } - } - - /* lets start with the H5C2_get_cache_hit_rate(), - * H5C2_reset_cache_hit_rate_stats() pair. - */ - - if ( pass2 ) { - - if ( ( H5C2_get_cache_hit_rate(NULL, &hit_rate) != FAIL ) || - ( H5C2_get_cache_hit_rate(cache_ptr, NULL) != FAIL ) ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_hit_rate accepts bad params.\n"; - } - } - - if ( pass2 ) { - - result = H5C2_get_cache_hit_rate(cache_ptr, &hit_rate); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_hit_rate failed.\n"; - - } else if ( hit_rate != 0.0 ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_get_cache_hit_rate returned unexpected hit rate 1.\n"; - } - } - - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, PICO_ENTRY_TYPE, i); - - if ( pass2 ) { - - unprotect_entry2(file_ptr, PICO_ENTRY_TYPE, i, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - } - - if ( pass2 ) { - - result = H5C2_get_cache_hit_rate(cache_ptr, &hit_rate); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_hit_rate failed.\n"; - - } else if ( hit_rate != 0.0 ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_get_cache_hit_rate returned unexpected hit rate 2.\n"; - - } else if ( ( cache_ptr->cache_accesses != 1000 ) || - ( cache_ptr->cache_hits != 0 ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache hit rate stats.\n"; - - } else if ( rpt_fcn_called ) { - - pass2 = FALSE; - failure_mssg2 = "Report function called?.\n"; - - } - } - - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, PICO_ENTRY_TYPE, 0); - - if ( pass2 ) { - - unprotect_entry2(file_ptr, PICO_ENTRY_TYPE, 0, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - } - - if ( pass2 ) { - - result = H5C2_get_cache_hit_rate(cache_ptr, &hit_rate); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_hit_rate failed.\n"; - - } else if ( ! DBL_REL_EQUAL(hit_rate, 0.5, 0.00001) ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_get_cache_hit_rate returned unexpected hit rate 3.\n"; - - } else if ( ( cache_ptr->cache_accesses != 2000 ) || - ( cache_ptr->cache_hits != 1000 ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache hit rate stats.\n"; - - } else if ( rpt_fcn_called ) { - - pass2 = FALSE; - failure_mssg2 = "Report function called?.\n"; - - } - } - - if ( pass2 ) { - - result = H5C2_reset_cache_hit_rate_stats(NULL); - - if ( result != FAIL ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_reset_cache_hit_rate_stats accepted NULL cache_ptr.\n"; - - } else if ( ( cache_ptr->cache_accesses != 2000 ) || - ( cache_ptr->cache_hits != 1000 ) ) { - - pass2 = FALSE; - failure_mssg2 = - "Failed call to H5C2_reset_cache_hit_rate_stats altered stats?\n"; - } - } - - if ( pass2 ) { - - result = H5C2_reset_cache_hit_rate_stats(cache_ptr); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_reset_cache_hit_rate_stats failed.\n"; - - } else if ( ( cache_ptr->cache_accesses != 0 ) || - ( cache_ptr->cache_hits != 0 ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache hit rate stats.\n"; - - } - } - - if ( pass2 ) { - - rpt_fcn_called = FALSE; - i = 0; - while ( ( pass2 ) && ( i < 1000 ) ) - { - protect_entry2(file_ptr, PICO_ENTRY_TYPE, i + 500); - - if ( pass2 ) { - - unprotect_entry2(file_ptr, PICO_ENTRY_TYPE, i + 500, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } - i++; - } - } - - - if ( pass2 ) { - - result = H5C2_get_cache_hit_rate(cache_ptr, &hit_rate); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_hit_rate failed.\n"; - - } else if ( ! DBL_REL_EQUAL(hit_rate, 0.5, 0.00001) ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_get_cache_hit_rate returned unexpected hit rate 4.\n"; - - } else if ( ( cache_ptr->cache_accesses != 1000 ) || - ( cache_ptr->cache_hits != 500 ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpected cache hit rate stats.\n"; - - } else if ( rpt_fcn_called ) { - - pass2 = FALSE; - failure_mssg2 = "Report function called?.\n"; - - } - } - - /*************************************************** - * So much for testing H5C2_get_cache_hit_rate() and - * H5C2_reset_cache_hit_rate_stats(). Now on to - * H5C2_get_cache_size(). - ***************************************************/ - - if ( pass2 ) { - - result = H5C2_get_cache_size(NULL, &max_size, &min_clean_size, - &cur_size, &cur_num_entries); - - if ( result != FAIL ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_size accepted NULL cache_ptr.\n"; - } - } - - if ( pass2 ) { - - max_size = 0; - min_clean_size = 0; - cur_size = 0; - cur_num_entries = 0; - - result = H5C2_get_cache_size(cache_ptr, &max_size, &min_clean_size, - &cur_size, &cur_num_entries); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_size failed 1.\n"; - - } else if ( max_size != (1 * 1024 * 1024) ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_get_cache_size reports unexpected max_size 1.\n"; - - } else if ( min_clean_size != (512 * 1024) ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_get_cache_size reports unexpected min_clean_size 1.\n"; - - } else if ( cur_size != (1500 * PICO_ENTRY_SIZE) ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_get_cache_size reports unexpected cur_size 1.\n"; - - } else if ( cur_num_entries != 1500 ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_get_cache_size reports unexpected cur_num_entries 1.\n"; - } - } - - /* read a larger entry so that cur_size and cur_num_entries will be - * different. - */ - if ( pass2 ) { - - protect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0); - } - - if ( pass2 ) { - unprotect_entry2(file_ptr, MONSTER_ENTRY_TYPE, 0, NO_CHANGE, - H5C2__NO_FLAGS_SET); - } - - if ( pass2 ) { - - max_size = 0; - min_clean_size = 0; - cur_size = 0; - cur_num_entries = 0; - - result = H5C2_get_cache_size(cache_ptr, &max_size, &min_clean_size, - &cur_size, &cur_num_entries); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_size failed 2.\n"; - - } else if ( max_size != (1 * 1024 * 1024) ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_get_cache_size reports unexpected max_size 2.\n"; - - } else if ( min_clean_size != (512 * 1024) ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_get_cache_size reports unexpected min_clean_size 2.\n"; - - } else if ( cur_size != - ((1500 * PICO_ENTRY_SIZE) + MONSTER_ENTRY_SIZE) ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_get_cache_size reports unexpected cur_size 2.\n"; - - } else if ( cur_num_entries != 1501 ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_get_cache_size reports unexpected cur_num_entries 2.\n"; - } - } - - if ( pass2 ) { - - max_size = 0; - min_clean_size = 0; - cur_size = 0; - cur_num_entries = 0; - - result = H5C2_get_cache_size(cache_ptr, &max_size, NULL, NULL, NULL); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_size failed 3.\n"; - - } else if ( max_size != (1 * 1024 * 1024) ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_get_cache_size reports unexpected max_size 3.\n"; - - } else if ( ( min_clean_size != 0 ) || - ( cur_size != 0 ) || - ( cur_num_entries != 0 ) ) { - - pass2 = FALSE; - failure_mssg2 = "Phantom returns from H5C2_get_cache_size?\n"; - - } - } - - if ( pass2 ) { - - max_size = 0; - min_clean_size = 0; - cur_size = 0; - cur_num_entries = 0; - - result = H5C2_get_cache_size(cache_ptr, NULL, &min_clean_size, - NULL, NULL); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_size failed 4.\n"; - - } else if ( min_clean_size != (512 * 1024) ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_get_cache_size reports unexpected min_clean_size 4.\n"; - - } else if ( ( max_size != 0 ) || - ( cur_size != 0 ) || - ( cur_num_entries != 0 ) ) { - - pass2 = FALSE; - failure_mssg2 = "Phantom returns from H5C2_get_cache_size?\n"; - - } - } - - if ( pass2 ) { - - max_size = 0; - min_clean_size = 0; - cur_size = 0; - cur_num_entries = 0; - - result = H5C2_get_cache_size(cache_ptr, NULL, NULL, &cur_size, NULL); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_size failed 5.\n"; - - } else if ( cur_size != - ((1500 * PICO_ENTRY_SIZE) + MONSTER_ENTRY_SIZE) ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_get_cache_size reports unexpected cur_size 5.\n"; - - } else if ( ( max_size != 0 ) || - ( min_clean_size != 0 ) || - ( cur_num_entries != 0 ) ) { - - pass2 = FALSE; - failure_mssg2 = "Phantom returns from H5C2_get_cache_size?\n"; - - } - } - - if ( pass2 ) { - - max_size = 0; - min_clean_size = 0; - cur_size = 0; - cur_num_entries = 0; - - result = H5C2_get_cache_size(cache_ptr, NULL, NULL, NULL, - &cur_num_entries); - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_get_cache_size failed 6.\n"; - - } else if ( cur_num_entries != 1501 ) { - - pass2 = FALSE; - failure_mssg2 = - "H5C2_get_cache_size reports unexpected cur_num_entries 2.\n"; - - } else if ( ( max_size != 0 ) || - ( min_clean_size != 0 ) || - ( cur_size != 0 ) ) { - - pass2 = FALSE; - failure_mssg2 = "Phantom returns from H5C2_get_cache_size?\n"; - - } - } - - if ( pass2 ) { - - takedown_cache2(file_ptr, FALSE, FALSE); - } - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - HDfprintf(stdout, "%s: failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - if ( core_file_driver_failed ) { - - HDfprintf(stdout, - "%s(): Unable to open test file with core file driver.\n", - fcn_name); - } - - return !pass2; - -} /* check_auto_cache_resize_aux_fcns() */ - - -/*------------------------------------------------------------------------- - * Function: main - * - * Purpose: Run tests on the cache code contained in H5C.c - * - * Return: Success: - * - * Failure: - * - * Programmer: John Mainzer - * 6/24/04 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -int -main(void) -{ - hbool_t core_file_forced = FALSE; - hbool_t regular_file_forced = FALSE; - hbool_t core_file_driver_recommended = FALSE; - const char *envval = NULL; - unsigned nerrs = 0; - - core_file_driver_recommended = recommend_core_file_driver(); - - try_core_file_driver = core_file_driver_recommended; - - H5open(); - - express_test2 = GetTestExpress(); - - if ( express_test2 >= 3 ) { - - skip_long_tests2 = TRUE; - - } else { - - skip_long_tests2 = FALSE; - } - - envval = HDgetenv("HDF5_DRIVER"); - - if ( envval != NULL ) { - - if ( HDstrcmp(envval, "core") == 0 ) { - - core_file_forced = TRUE; - try_core_file_driver = TRUE; - - } else { - - regular_file_forced = TRUE; - try_core_file_driver = FALSE; - - } - } - - printf("=========================================\n"); - printf("Internal cache tests\n"); - printf(" express_test = %d\n", express_test2); - printf(" skip_long_tests = %d\n", (int)skip_long_tests2); - printf(" regular_file_forced = %d\n", (int)regular_file_forced); - printf(" core_file_forced = %d\n", (int)core_file_forced); - printf(" core_file_driver_recommended = %d\n", - (int)core_file_driver_recommended); - printf(" try_core_file_driver = %d\n", (int)try_core_file_driver); - printf("=========================================\n"); - - if ( try_core_file_driver ) { - - printf("\n"); - printf("All the longer cache tests will attempt to use the core file\n"); - printf("driver in an attempt to avoid disk I/O and thereby run the\n"); - printf("tests faster. If a test is unable to to do so, it will\n"); - printf("attempt to run the test using a regular file, and will note\n"); - printf("this fact at test completion.\n"); - printf("\n"); - printf("Shorter tests never attempt to use the core file driver\n"); - printf("as the overhead exceeds the gain\n"); - printf("\n"); - printf("In general, running the longer cache tests with the core\n"); - printf("file driver should speed up the tests significantly.\n"); - printf("However, if the available physical ram is less than 2 GB,\n"); - printf("it may slow the tests down instead.\n"); - printf("\n"); - } - -#if 1 - nerrs += smoke_check_1(); - nerrs += smoke_check_2(); - nerrs += smoke_check_3(); - nerrs += smoke_check_4(); - nerrs += smoke_check_5(); - nerrs += smoke_check_6(); - nerrs += smoke_check_7(); - nerrs += smoke_check_8(); - nerrs += smoke_check_9(); - nerrs += smoke_check_10(); -#endif -#if 1 - nerrs += write_permitted_check(); -#endif - /* for shorter tests, the overhead of using the core file driver doesn't - * seem to allow us to realize any significant time saveings. Thus - * set try_core_file_driver to FALSE for the remaining tests. - */ - try_core_file_driver = FALSE; - - nerrs += check_insert_entry(); - nerrs += check_flush_cache(); - nerrs += check_get_entry_status(); - nerrs += check_expunge_entry(); - nerrs += check_multiple_read_protect(); - nerrs += check_rename_entry(); - nerrs += check_pin_protected_entry(); - nerrs += check_resize_entry(); - nerrs += check_evictions_enabled(); - nerrs += check_flush_protected_err(); - nerrs += check_destroy_pinned_err(); - nerrs += check_destroy_protected_err(); - nerrs += check_duplicate_insert_err(); - nerrs += check_rename_err(); - nerrs += check_double_pin_err(); - nerrs += check_double_unpin_err(); - nerrs += check_pin_entry_errs(); - nerrs += check_double_protect_err(); - nerrs += check_double_unprotect_err(); - nerrs += check_mark_entry_dirty_errs(); - nerrs += check_expunge_entry_errs(); - nerrs += check_resize_entry_errs(); - nerrs += check_unprotect_ro_dirty_err(); - nerrs += check_protect_ro_rw_err(); - nerrs += check_check_evictions_enabled_err(); - nerrs += check_auto_cache_resize(); - nerrs += check_auto_cache_resize_disable(); - nerrs += check_auto_cache_resize_epoch_markers(); - nerrs += check_auto_cache_resize_input_errs(); - nerrs += check_auto_cache_resize_aux_fcns(); - - return( nerrs > 0 ); - -} /* main() */ diff --git a/test/cache2_api.c b/test/cache2_api.c deleted file mode 100644 index 013c186..0000000 --- a/test/cache2_api.c +++ /dev/null @@ -1,3633 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * Copyright by the Board of Trustees of the University of Illinois. * - * All rights reserved. * - * * - * This file is part of HDF5. The full HDF5 copyright notice, including * - * terms governing use, modification, and redistribution, is contained in * - * the files COPYING and Copyright.html. COPYING can be found at the root * - * of the source code distribution tree; Copyright.html can be found at the * - * root level of an installed copy of the electronic HDF5 document set and * - * is linked from the top-level documents page. It can also be found at * - * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * - * access to either file, you may request a copy from help@hdfgroup.org. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* Programmer: John Mainzer - * 11/10/05 - * - * This file contains tests for the API calls associated - * with the cache implemented in H5C2.c - */ - -#include -#include "h5test.h" -#include "H5Iprivate.h" -#include "H5AC2private.h" -#include "cache2_common.h" - - -/* global variable declarations: */ - -extern const char *FILENAME[]; - -/* macro definitions */ - -/* private function declarations: */ - -static unsigned check_fapl_mdc_api_calls(void); - -static unsigned check_file_mdc_api_calls(void); - -static unsigned mdc_api_call_smoke_check(void); - -static unsigned check_fapl_mdc_api_errs(void); - -static unsigned check_file_mdc_api_errs(void); - - -/**************************************************************************/ -/**************************************************************************/ -/********************************* tests: *********************************/ -/**************************************************************************/ -/**************************************************************************/ - -/*------------------------------------------------------------------------- - * Function: check_fapl_mdc_api_calls() - * - * Purpose: Verify that the file access property list related - * metadata cache related API calls are functioning - * correctly. - * - * Since we have tested the H5C2 code elsewhere, it should - * be sufficient to verify that the desired configuration - * data is getting to the cache. - * - * Return: void - * - * Programmer: John Mainzer - * 4/12/04 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -static unsigned -check_fapl_mdc_api_calls(void) -{ - const char * fcn_name = "check_fapl_mdc_api_calls()"; - char filename[512]; - hbool_t show_progress = FALSE; - int cp = 0; - herr_t result; - hid_t fapl_id = -1; - hid_t test_fapl_id = -1; - hid_t file_id = -1; - H5F_t * file_ptr = NULL; - H5C2_t * cache_ptr = NULL; - H5AC2_cache_config_t default_config = H5AC2__DEFAULT_CACHE_CONFIG; - H5AC2_cache_config_t mod_config = - { - /* int version = */ H5AC2__CURR_CACHE_CONFIG_VERSION, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024 + 1), - /* double min_clean_fraction = */ 0.2, - /* size_t max_size = */ (16 * 1024 * 1024 + 1), - /* size_t min_size = */ ( 1 * 1024 * 1024 + 1), - /* long int epoch_length = */ 50001, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.91, - /* double increment = */ 2.1, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024 + 1), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out, - /* double upper_hr_threshold = */ 0.998, - /* double decrement = */ 0.91, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024 - 1), - /* int epochs_before_eviction = */ 4, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.05, - /* int dirty_bytes_threshold = */ (256 * 1024) - }; - H5AC2_cache_config_t scratch; - H5C2_auto_size_ctl_t default_auto_size_ctl; - H5C2_auto_size_ctl_t mod_auto_size_ctl; - - TESTING("MDC/FAPL related API calls"); - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - pass2 = TRUE; - - XLATE_EXT_TO_INT_MDC_CONFIG(default_auto_size_ctl, default_config) - XLATE_EXT_TO_INT_MDC_CONFIG(mod_auto_size_ctl, mod_config) - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* Create a FAPL and verify that it contains the default - * initial mdc configuration - */ - - if ( pass2 ) { - - fapl_id = H5Pcreate(H5P_FILE_ACCESS); - - if ( fapl_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pcreate(H5P_FILE_ACCESS) failed.\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - if ( pass2 ) { - - scratch.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - - result = H5Pget_mdc_config(fapl_id, (H5AC1_cache_config_t *)&scratch); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pget_mdc_config() failed.\n"; - - } else if (!CACHE_CONFIGS_EQUAL(default_config, scratch, TRUE, TRUE)) { - - pass2 = FALSE; - failure_mssg2 = "retrieved config doesn't match default."; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - - /* Modify the initial mdc configuration in a FAPL, and verify that - * the changes can be read back - */ - - if ( pass2 ) { - - result = H5Pset_mdc_config(fapl_id, (H5AC1_cache_config_t *)&mod_config); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pset_mdc_config() failed.\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - if ( pass2 ) { - - scratch.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - - result = H5Pget_mdc_config(fapl_id, (H5AC1_cache_config_t *)&scratch); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pget_mdc_config() failed.\n"; - - } else if ( ! CACHE_CONFIGS_EQUAL(mod_config, scratch, TRUE, TRUE) ) { - - pass2 = FALSE; - failure_mssg2 = "retrieved config doesn't match mod config."; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - if ( pass2 ) { - - if ( H5Pclose(fapl_id) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pclose() failed.\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* Open a file using the default FAPL. Verify that the resulting - * metadata cache uses the default configuration as well. Get a - * copy of the FAPL from the file, and verify that it contains the - * default initial meta data cache configuration. Close and delete - * the file. - */ - - /* setup the file name */ - if ( pass2 ) { - - if ( h5_fixname(FILENAME[1], H5P_DEFAULT, filename, sizeof(filename)) - == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed.\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* create the file using the default FAPL */ - if ( pass2 ) { - - file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - - if ( file_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fcreate() failed.\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* get a pointer to the files internal data structure */ - if ( pass2 ) { - - file_ptr = (H5F_t *)H5I_object_verify(file_id, H5I_FILE); - - if ( file_ptr == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "Can't get file_ptr.\n"; - - } else { - - cache_ptr = file_ptr->shared->cache2; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* verify that we can access the internal version of the cache config */ - if ( pass2 ) { - - if ( ( cache_ptr == NULL ) || - ( cache_ptr->magic != H5C2__H5C2_T_MAGIC ) || - ( cache_ptr->resize_ctl.version != H5C2__CURR_AUTO_SIZE_CTL_VER ) ){ - - pass2 = FALSE; - failure_mssg2 = "Can't access cache resize_ctl.\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* conpare the cache's internal configuration with the expected value */ - if ( pass2 ) { - - if ( ! RESIZE_CONFIGS_ARE_EQUAL(default_auto_size_ctl, \ - cache_ptr->resize_ctl, TRUE) ) { - - - pass2 = FALSE; - failure_mssg2 = "Unexpected value(s) in cache resize_ctl 1.\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* get a copy of the files FAPL */ - if ( pass2 ) { - - fapl_id = H5Fget_access_plist(file_id); - - if ( fapl_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fget_access_plist() failed.\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* compare the initial cache config from the copy of the file's FAPL - * to the expected value. If all goes well, close the copy of the FAPL. - */ - if ( pass2 ) { - - scratch.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - - result = H5Pget_mdc_config(fapl_id, (H5AC1_cache_config_t *)&scratch); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pget_mdc_config() failed.\n"; - - } else if (!CACHE_CONFIGS_EQUAL(default_config, scratch, TRUE, TRUE)) { - - pass2 = FALSE; - failure_mssg2 = "config retrieved from file doesn't match default."; - - } else if ( H5Pclose(fapl_id) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pclose() failed.\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* close the file and delete it */ - if ( pass2 ) { - - if ( H5Fclose(file_id) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fclose() failed.\n"; - - } else if ( HDremove(filename) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "HDremove() failed.\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - - /* Open a file using a FAPL with a modified initial metadata cache - * configuration. Verify that the resulting metadata cache uses the - * modified configuration as well. Get a copy of the FAPL from the - * file, and verify that it contains the modified initial meta data - * cache configuration. Close and delete the file. - */ - - /* Create a FAPL */ - if ( pass2 ) { - - fapl_id = H5Pcreate(H5P_FILE_ACCESS); - - if ( fapl_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pcreate(H5P_FILE_ACCESS) failed.\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* Modify the initial mdc configuration in the FAPL. */ - - if ( pass2 ) { - - result = H5Pset_mdc_config(fapl_id, (H5AC1_cache_config_t *)&mod_config); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pset_mdc_config() failed.\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* setup the file name */ - if ( pass2 ) { - - if ( h5_fixname(FILENAME[1], H5P_DEFAULT, filename, sizeof(filename)) - == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed.\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* create the file using the modified FAPL */ - if ( pass2 ) { - - file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id); - - if ( file_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fcreate() failed.\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* get a pointer to the files internal data structure */ - if ( pass2 ) { - - file_ptr = (H5F_t *)H5I_object_verify(file_id, H5I_FILE); - - if ( file_ptr == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "Can't get file_ptr.\n"; - - } else { - - cache_ptr = file_ptr->shared->cache2; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* verify that we can access the internal version of the cache config */ - if ( pass2 ) { - - if ( ( cache_ptr == NULL ) || - ( cache_ptr->magic != H5C2__H5C2_T_MAGIC ) || - ( cache_ptr->resize_ctl.version != H5C2__CURR_AUTO_SIZE_CTL_VER ) ){ - - pass2 = FALSE; - failure_mssg2 = "Can't access cache resize_ctl.\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* conpare the cache's internal configuration with the expected value */ - if ( pass2 ) { - - if ( ! RESIZE_CONFIGS_ARE_EQUAL(mod_auto_size_ctl, \ - cache_ptr->resize_ctl, TRUE) ) { - - - pass2 = FALSE; - failure_mssg2 = "Unexpected value(s) in cache resize_ctl 2.\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* get a copy of the files FAPL */ - if ( pass2 ) { - - test_fapl_id = H5Fget_access_plist(file_id); - - if ( test_fapl_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fget_access_plist() failed.\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* compare the initial cache config from the copy of the file's FAPL - * to the expected value. If all goes well, close the copy of the FAPL. - */ - if ( pass2 ) { - - scratch.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - - result = H5Pget_mdc_config(test_fapl_id, (H5AC1_cache_config_t *)&scratch); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pget_mdc_config() failed.\n"; - - } else if ( ! CACHE_CONFIGS_EQUAL(mod_config, scratch, TRUE, TRUE) ) { - - pass2 = FALSE; - failure_mssg2 = "config retrieved from file doesn't match."; - - } else if ( H5Pclose(test_fapl_id) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pclose() failed.\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* close the fapl used to create the file */ - if ( pass2 ) { - - if ( H5Pclose(fapl_id) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pclose() failed.\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* close the file and delete it */ - if ( pass2 ) { - - if ( H5Fclose(file_id) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fclose() failed.\n"; - - } else if ( HDremove(filename) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "HDremove() failed.\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) - HDfprintf(stdout, "%s: failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - - return !pass2; - -} /* check_fapl_mdc_api_calls() */ - - -/*------------------------------------------------------------------------- - * Function: check_file_mdc_api_calls() - * - * Purpose: Verify that the file related metadata cache API calls are - * functioning correctly. - * - * Since we have tested the H5C2 code elsewhere, it should - * be sufficient to verify that the desired configuration - * data is getting in and out of the cache. Similarly, - * we need only verify that the cache monitoring calls - * return the data that the cache thinks they should return. - * We shouldn't need to verify data correctness beyond that - * point. - * - * Return: void - * - * Programmer: John Mainzer - * 4/14/04 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -static unsigned -check_file_mdc_api_calls(void) -{ - const char * fcn_name = "check_file_mdc_api_calls()"; - char filename[512]; - hid_t file_id = -1; - size_t max_size; - size_t min_clean_size; - size_t cur_size; - int cur_num_entries; - double hit_rate; - H5AC2_cache_config_t default_config = H5AC2__DEFAULT_CACHE_CONFIG; - H5AC2_cache_config_t mod_config_1 = - { - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024 + 1), - /* double min_clean_fraction = */ 0.2, - /* size_t max_size = */ (16 * 1024 * 1024 + 1), - /* size_t min_size = */ ( 1 * 1024 * 1024 + 1), - /* long int epoch_length = */ 50001, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.91, - /* double increment = */ 2.1, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024 + 1), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out, - /* double upper_hr_threshold = */ 0.998, - /* double decrement = */ 0.91, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024 - 1), - /* int epochs_before_eviction = */ 4, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.05, - /* int dirty_bytes_threshold = */ (256 * 1024) - }; - H5AC2_cache_config_t mod_config_2 = - { - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ TRUE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (512 * 1024), - /* double min_clean_fraction = */ 0.1, - /* size_t max_size = */ ( 8 * 1024 * 1024), - /* size_t min_size = */ ( 512 * 1024), - /* long int epoch_length = */ 25000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (2 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__threshold, - /* double upper_hr_threshold = */ 0.9995, - /* double decrement = */ 0.95, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (512 * 1024), - /* int epochs_before_eviction = */ 4, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.05, - /* int dirty_bytes_threshold = */ (256 * 1024) - }; - H5AC2_cache_config_t mod_config_3 = - { - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024), - /* double min_clean_fraction = */ 0.2, - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ ( 1 * 1024 * 1024), - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__off, - /* double lower_hr_threshold = */ 0.90, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__off, - /* double upper_hr_threshold = */ 0.999, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ FALSE, - /* size_t max_decrement = */ (1 * 1024 * 1024 - 1), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ FALSE, - /* double empty_reserve = */ 0.05, - /* int dirty_bytes_threshold = */ (256 * 1024) - }; - H5AC2_cache_config_t mod_config_4 = - { - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024), - /* double min_clean_fraction = */ 0.15, - /* size_t max_size = */ (20 * 1024 * 1024), - /* size_t min_size = */ ( 1 * 1024 * 1024), - /* long int epoch_length = */ 75000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (2 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ - H5C2_decr__age_out_with_threshold, - /* double upper_hr_threshold = */ 0.999, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1, - /* int dirty_bytes_threshold = */ (256 * 1024) - }; - - TESTING("MDC/FILE related API calls"); - - pass2 = TRUE; - - /* Open a file with the default FAPL. Verify that the cache is - * configured as per the default both by looking at its internal - * configuration, and via the H5Fget_mdc_config() call. - * - * Then set serveral different configurations, and verify that - * they took as per above. - */ - - /* setup the file name */ - if ( pass2 ) { - - if ( h5_fixname(FILENAME[1], H5P_DEFAULT, filename, sizeof(filename)) - == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed.\n"; - } - } - - /* create the file using the default FAPL */ - if ( pass2 ) { - - file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - - if ( file_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fcreate() failed.\n"; - } - } - - /* verify that the cache is set to the default config */ - validate_mdc_config(file_id, &default_config, TRUE, 1); - - /* set alternate config 1 */ - if ( pass2 ) { - - if ( H5Fset_mdc_config(file_id, (H5AC1_cache_config_t *)&mod_config_1) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fset_mdc_config() failed 1.\n"; - } - } - - /* verify that the cache is now set to the alternate config */ - validate_mdc_config(file_id, &mod_config_1, TRUE, 2); - - /* set alternate config 2 */ - if ( pass2 ) { - - if ( H5Fset_mdc_config(file_id, (H5AC1_cache_config_t *)&mod_config_2) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fset_mdc_config() failed 2.\n"; - } - } - - /* verify that the cache is now set to the alternate config */ - validate_mdc_config(file_id, &mod_config_2, TRUE, 3); - - /* set alternate config 3 */ - if ( pass2 ) { - - if ( H5Fset_mdc_config(file_id, (H5AC1_cache_config_t *)&mod_config_3) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fset_mdc_config() failed 3.\n"; - } - } - - /* verify that the cache is now set to the alternate config */ - validate_mdc_config(file_id, &mod_config_3, TRUE, 4); - - /* set alternate config 4 */ - if ( pass2 ) { - - if ( H5Fset_mdc_config(file_id, (H5AC1_cache_config_t *)&mod_config_4) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fset_mdc_config() failed 4.\n"; - } - } - - /* verify that the cache is now set to the alternate config */ - validate_mdc_config(file_id, &mod_config_4, TRUE, 5); - - - /* Run some quick smoke checks on the cache status monitoring - * calls -- no interesting data as the cache hasn't had a - * chance to do much yet. - */ - - if ( pass2 ) { - - if ( H5Fget_mdc_hit_rate(file_id, &hit_rate) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fget_mdc_hit_rate() failed 1.\n"; - - } else if ( hit_rate != 0.0 ) { - - pass2 = FALSE; - failure_mssg2 = - "H5Fget_mdc_hit_rate() returned unexpected hit rate.\n"; - - } -#if 0 /* this may be useful now and then -- keep it around */ - else { - - HDfprintf(stdout, - "H5Fget_mdc_hit_rate() reports hit_rate = %lf:\n", - hit_rate); - } -#endif - } - - if ( pass2 ) { - - if ( H5Fget_mdc_size(file_id, &max_size, &min_clean_size, - &cur_size, &cur_num_entries) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fget_mdc_size() failed 1.\n"; - - } else if ( ( mod_config_4.initial_size != max_size ) || - ( min_clean_size != (size_t) - ((double)max_size * mod_config_4.min_clean_fraction) ) ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fget_mdc_size() returned unexpected value(s).\n"; - - } -#if 0 /* this may be useful now and then -- keep it around */ - else { - - HDfprintf(stdout, "H5Fget_mdc_size() reports:\n"); - HDfprintf(stdout, " max_size: %ld, min_clean_size: %ld\n", - (long)max_size, (long)min_clean_size); - HDfprintf(stdout, " cur_size: %ld, cur_num_entries: %d\n", - (long)cur_size, cur_num_entries); - } -#endif - } - - /* close the file and delete it */ - if ( pass2 ) { - - if ( H5Fclose(file_id) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fclose() failed.\n"; - - } else if ( HDremove(filename) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "HDremove() failed.\n"; - } - } - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) - HDfprintf(stdout, "%s: failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - - return !pass2; - -} /* check_file_mdc_api_calls() */ - - -/*------------------------------------------------------------------------- - * Function: mdc_api_call_smoke_check() - * - * Purpose: - * - * Return: void - * - * Programmer: John Mainzer - * 4/14/04 - * - * Modifications: - * - * JRM -- 7/12/06 - * Added progress reporting code. - * - *------------------------------------------------------------------------- - */ - -#define CHUNK_SIZE 2 -#define DSET_SIZE (200 * CHUNK_SIZE) -#define NUM_DSETS 6 -#define NUM_RANDOM_ACCESSES 200000 - -static unsigned -mdc_api_call_smoke_check(void) -{ - const char * fcn_name = "mdc_api_call_smoke_check()"; - char filename[512]; - hbool_t valid_chunk; - hbool_t report_progress = FALSE; - hbool_t dump_hit_rate = FALSE; - int64_t min_accesses = 1000; - double min_hit_rate = 0.90; - hbool_t dump_cache_size = FALSE; - hid_t file_id = -1; - hid_t dataspace_id = -1; - hid_t filespace_ids[NUM_DSETS]; - hid_t memspace_id = -1; - hid_t dataset_ids[NUM_DSETS]; - hid_t properties; - char dset_name[64]; - int i, j, k, l, m, n; - int progress_counter; - herr_t status; - hsize_t dims[2]; - hsize_t a_size[2]; - hsize_t offset[2]; - hsize_t chunk_size[2]; - int data_chunk[CHUNK_SIZE][CHUNK_SIZE]; - H5AC2_cache_config_t default_config = H5AC2__DEFAULT_CACHE_CONFIG; - H5AC2_cache_config_t mod_config_1 = - { - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ 500000, - /* double min_clean_fraction = */ 0.1, - /* size_t max_size = */ 16000000, - /* size_t min_size = */ 250000, - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__off, - /* double lower_hr_threshold = */ 0.95, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ FALSE, - /* size_t max_increment = */ 4000000, - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__off, - /* double upper_hr_threshold = */ 0.999, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ FALSE, - /* size_t max_decrement = */ 1000000, - /* int epochs_before_eviction = */ 2, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.05, - /* int dirty_bytes_threshold = */ (256 * 1024) - }; - H5AC2_cache_config_t mod_config_2 = - { - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ 12000000, - /* double min_clean_fraction = */ 0.1, - /* size_t max_size = */ 16000000, - /* size_t min_size = */ 250000, - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__off, - /* double lower_hr_threshold = */ 0.95, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ FALSE, - /* size_t max_increment = */ 4000000, - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__off, - /* double upper_hr_threshold = */ 0.999, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ FALSE, - /* size_t max_decrement = */ 1000000, - /* int epochs_before_eviction = */ 2, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.05, - /* int dirty_bytes_threshold = */ (256 * 1024) - }; - H5AC2_cache_config_t mod_config_3 = - { - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ 2000000, - /* double min_clean_fraction = */ 0.1, - /* size_t max_size = */ 16000000, - /* size_t min_size = */ 250000, - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__off, - /* double lower_hr_threshold = */ 0.95, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ FALSE, - /* size_t max_increment = */ 4000000, - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__off, - /* double upper_hr_threshold = */ 0.999, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ FALSE, - /* size_t max_decrement = */ 1000000, - /* int epochs_before_eviction = */ 2, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.05, - /* int dirty_bytes_threshold = */ (256 * 1024) - }; - - TESTING("MDC API smoke check"); - - if ( skip_long_tests2 > 0 ) { - - SKIPPED(); - - HDfprintf(stdout, " Long tests disabled.\n"); - - return 0; - } - - pass2 = TRUE; - - /* Open a file with the default FAPL. Verify that the cache is - * configured as per the default both by looking at its internal - * configuration, and via the H5Fget_mdc_config() call. - * - * Then set the cache to mod_config_1, which fixes cache size at - * 500000 bytes, and turns off automatic cache resize. - */ - - /* setup the file name */ - - if ( ( pass2 ) && ( report_progress ) ) { - - HDfprintf(stdout,"\nSetting up file ... "); - HDfflush(stdout); - } - - if ( pass2 ) { - - if ( h5_fixname(FILENAME[1], H5P_DEFAULT, filename, sizeof(filename)) - == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed.\n"; - } - } - - /* create the file using the default FAPL */ - if ( pass2 ) { - - file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - - if ( file_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fcreate() failed.\n"; - } - } - - /* verify that the cache is set to the default config */ - validate_mdc_config(file_id, &default_config, TRUE, 1); - - /* set alternate config 1 */ - if ( pass2 ) { - - if ( H5Fset_mdc_config(file_id, (H5AC1_cache_config_t *)&mod_config_1) - < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fset_mdc_config() failed 1.\n"; - } - } - - /* verify that the cache is now set to the alternate config */ - validate_mdc_config(file_id, &mod_config_1, TRUE, 2); - - if ( ( pass2 ) && ( report_progress ) ) { - - HDfprintf(stdout,"Done.\n"); /* setting up file */ - HDfflush(stdout); - } - - - /* create the datasets */ - - if ( ( pass2 ) && ( report_progress ) ) { - - HDfprintf(stdout,"Creating datasets ... "); - HDfflush(stdout); - } - - if ( pass2 ) { - - i = 0; - - while ( ( pass2 ) && ( i < NUM_DSETS ) ) - { - /* create a dataspace for the chunked dataset */ - dims[0] = DSET_SIZE; - dims[1] = DSET_SIZE; - dataspace_id = H5Screate_simple(2, dims, NULL); - - if ( dataspace_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Screate_simple() failed."; - } - - /* set the dataset creation plist to specify that the raw data is - * to be partioned into 10X10 element chunks. - */ - - if ( pass2 ) { - - chunk_size[0] = CHUNK_SIZE; - chunk_size[1] = CHUNK_SIZE; - properties = H5Pcreate(H5P_DATASET_CREATE); - - if ( properties < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pcreate() failed."; - } - } - - if ( pass2 ) { - - if ( H5Pset_chunk(properties, 2, chunk_size) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pset_chunk() failed."; - } - } - - /* create the dataset */ - if ( pass2 ) { - - sprintf(dset_name, "/dset%03d", i); - dataset_ids[i] = H5Dcreate2(file_id, dset_name, H5T_STD_I32BE, - dataspace_id, H5P_DEFAULT, - properties, H5P_DEFAULT); - - if ( dataset_ids[i] < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Dcreate() failed."; - } - } - - /* get the file space ID */ - if ( pass2 ) { - - filespace_ids[i] = H5Dget_space(dataset_ids[i]); - - if ( filespace_ids[i] < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Dget_space() failed."; - } - } - - i++; - } - } - - /* create the mem space to be used to read and write chunks */ - if ( pass2 ) { - - dims[0] = CHUNK_SIZE; - dims[1] = CHUNK_SIZE; - memspace_id = H5Screate_simple(2, dims, NULL); - - if ( memspace_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Screate_simple() failed."; - } - } - - /* select in memory hyperslab */ - if ( pass2 ) { - - offset[0] = 0; /*offset of hyperslab in memory*/ - offset[1] = 0; - a_size[0] = CHUNK_SIZE; /*size of hyperslab*/ - a_size[1] = CHUNK_SIZE; - status = H5Sselect_hyperslab(memspace_id, H5S_SELECT_SET, offset, NULL, - a_size, NULL); - - if ( status < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Sselect_hyperslab() failed."; - } - } - - if ( ( pass2 ) && ( report_progress ) ) { - - HDfprintf(stdout,"Done.\n"); - HDfflush(stdout); - } - - /* initialize all datasets on a round robin basis */ - i = 0; - progress_counter = 0; - - if ( ( pass2 ) && ( report_progress ) ) { - - HDfprintf(stdout, "Initializing datasets "); - HDfflush(stdout); - } - - while ( ( pass2 ) && ( i < DSET_SIZE ) ) - { - j = 0; - while ( ( pass2 ) && ( j < DSET_SIZE ) ) - { - m = 0; - while ( ( pass2 ) && ( m < NUM_DSETS ) ) - { - /* initialize the slab */ - for ( k = 0; k < CHUNK_SIZE; k++ ) - { - for ( l = 0; l < CHUNK_SIZE; l++ ) - { - data_chunk[k][l] = (DSET_SIZE * DSET_SIZE * m) + - (DSET_SIZE * (i + k)) + j + l; - } - } - - /* select on disk hyperslab */ - offset[0] = i; /*offset of hyperslab in file*/ - offset[1] = j; - a_size[0] = CHUNK_SIZE; /*size of hyperslab*/ - a_size[1] = CHUNK_SIZE; - status = H5Sselect_hyperslab(filespace_ids[m], H5S_SELECT_SET, - offset, NULL, a_size, NULL); - - if ( status < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "disk H5Sselect_hyperslab() failed."; - } - - /* write the chunk to file */ - status = H5Dwrite(dataset_ids[m], H5T_NATIVE_INT, memspace_id, - filespace_ids[m], H5P_DEFAULT, data_chunk); - - if ( status < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Dwrite() failed."; - } - m++; - } - j += CHUNK_SIZE; - } - - /* check the cache hit rate, and reset the counters. - * Hit rate should be just about unity here, so we will just - * get the data and (possibly) print it without checking it - * beyond ensuring that it agrees with the cache internal - * data structures. - * - * similarly, check cache size. - */ - - if ( ( pass2 ) && ( i % (DSET_SIZE / 4) == 0 ) ) { - - check_and_validate_cache_hit_rate(file_id, NULL, dump_hit_rate, - min_accesses, min_hit_rate); - - check_and_validate_cache_size(file_id, NULL, NULL, NULL, NULL, - dump_cache_size); - } - - i += CHUNK_SIZE; - - if ( ( pass2 ) && ( report_progress ) ) { - - progress_counter += CHUNK_SIZE; - - if ( progress_counter >= DSET_SIZE / 20 ) { - - progress_counter = 0; - HDfprintf(stdout, "."); - HDfflush(stdout); - } - } - } - - if ( ( pass2 ) && ( report_progress ) ) { - - HDfprintf(stdout," Done.\n"); /* initializing data sets */ - HDfflush(stdout); - } - - /* set alternate config 2 */ - if ( pass2 ) { - - if ( H5Fset_mdc_config(file_id, (H5AC1_cache_config_t *)&mod_config_2) - < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fset_mdc_config() failed 2.\n"; - } - } - - /* verify that the cache is now set to the alternate config */ - validate_mdc_config(file_id, &mod_config_2, TRUE, 3); - - /* do random reads on all datasets */ - - if ( ( pass2 ) && ( report_progress ) ) { - - HDfprintf(stdout, "Doing random reads on all datasets "); - HDfflush(stdout); - } - - n = 0; - progress_counter = 0; - while ( ( pass2 ) && ( n < NUM_RANDOM_ACCESSES ) ) - { - m = rand() % NUM_DSETS; - i = (rand() % (DSET_SIZE / CHUNK_SIZE)) * CHUNK_SIZE; - j = (rand() % (DSET_SIZE / CHUNK_SIZE)) * CHUNK_SIZE; - - /* select on disk hyperslab */ - offset[0] = i; /*offset of hyperslab in file*/ - offset[1] = j; - a_size[0] = CHUNK_SIZE; /*size of hyperslab*/ - a_size[1] = CHUNK_SIZE; - status = H5Sselect_hyperslab(filespace_ids[m], H5S_SELECT_SET, - offset, NULL, a_size, NULL); - - if ( status < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "disk hyperslab create failed."; - } - - /* read the chunk from file */ - if ( pass2 ) { - - status = H5Dread(dataset_ids[m], H5T_NATIVE_INT, memspace_id, - filespace_ids[m], H5P_DEFAULT, data_chunk); - - if ( status < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "disk hyperslab create failed."; - } - } - - /* validate the slab */ - if ( pass2 ) { - - valid_chunk = TRUE; - for ( k = 0; k < CHUNK_SIZE; k++ ) - { - for ( l = 0; l < CHUNK_SIZE; l++ ) - { - if ( data_chunk[k][l] - != - ((DSET_SIZE * DSET_SIZE * m) + - (DSET_SIZE * (i + k)) + j + l) ) { - - valid_chunk = FALSE; -#if 0 /* this will be useful from time to time -- lets keep it*/ - HDfprintf(stdout, - "data_chunk[%0d][%0d] = %0d, expect %0d.\n", - k, l, data_chunk[k][l], - ((DSET_SIZE * DSET_SIZE * m) + - (DSET_SIZE * (i + k)) + j + l)); - HDfprintf(stdout, - "m = %d, i = %d, j = %d, k = %d, l = %d\n", - m, i, j, k, l); -#endif - } - } - } - - if ( ! valid_chunk ) { -#if 1 - pass2 = FALSE; - failure_mssg2 = "slab validation failed."; -#else /* as above */ - fprintf(stdout, "Chunk (%0d, %0d) in /dset%03d is invalid.\n", - i, j, m); -#endif - } - } - - if ( ( pass2 ) && ( n % (NUM_RANDOM_ACCESSES / 4) == 0 ) ) { - - check_and_validate_cache_hit_rate(file_id, NULL, dump_hit_rate, - min_accesses, min_hit_rate); - - check_and_validate_cache_size(file_id, NULL, NULL, NULL, NULL, - dump_cache_size); - } - - n++; - - if ( ( pass2 ) && ( report_progress ) ) { - - progress_counter++; - - if ( progress_counter >= NUM_RANDOM_ACCESSES / 20 ) { - - progress_counter = 0; - HDfprintf(stdout, "."); - HDfflush(stdout); - } - } - } - - if ( ( pass2 ) && ( report_progress ) ) { - - HDfprintf(stdout, " Done.\n"); /* random reads on all data sets */ - HDfflush(stdout); - } - - - /* close the file spaces we are done with */ - i = 1; - while ( ( pass2 ) && ( i < NUM_DSETS ) ) - { - if ( H5Sclose(filespace_ids[i]) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Sclose() failed."; - } - i++; - } - - - /* close the datasets we are done with */ - i = 1; - while ( ( pass2 ) && ( i < NUM_DSETS ) ) - { - if ( H5Dclose(dataset_ids[i]) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Dclose() failed."; - } - i++; - } - - /* set alternate config 3 */ - if ( pass2 ) { - - if ( H5Fset_mdc_config(file_id, (H5AC1_cache_config_t *)&mod_config_3) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fset_mdc_config() failed 3.\n"; - } - } - - /* verify that the cache is now set to the alternate config */ - validate_mdc_config(file_id, &mod_config_3, TRUE, 4); - - /* do random reads on data set 0 only */ - - if ( ( pass2 ) && ( report_progress ) ) { - - HDfprintf(stdout, "Doing random reads on dataset 0 "); - HDfflush(stdout); - } - - m = 0; - n = 0; - progress_counter = 0; - while ( ( pass2 ) && ( n < NUM_RANDOM_ACCESSES ) ) - { - i = (rand() % (DSET_SIZE / CHUNK_SIZE)) * CHUNK_SIZE; - j = (rand() % (DSET_SIZE / CHUNK_SIZE)) * CHUNK_SIZE; - - /* select on disk hyperslab */ - offset[0] = i; /*offset of hyperslab in file*/ - offset[1] = j; - a_size[0] = CHUNK_SIZE; /*size of hyperslab*/ - a_size[1] = CHUNK_SIZE; - status = H5Sselect_hyperslab(filespace_ids[m], H5S_SELECT_SET, - offset, NULL, a_size, NULL); - - if ( status < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "disk hyperslab create failed."; - } - - /* read the chunk from file */ - if ( pass2 ) { - - status = H5Dread(dataset_ids[m], H5T_NATIVE_INT, memspace_id, - filespace_ids[m], H5P_DEFAULT, data_chunk); - - if ( status < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "disk hyperslab create failed."; - } - } - - /* validate the slab */ - if ( pass2 ) { - - valid_chunk = TRUE; - for ( k = 0; k < CHUNK_SIZE; k++ ) - { - for ( l = 0; l < CHUNK_SIZE; l++ ) - { - if ( data_chunk[k][l] - != - ((DSET_SIZE * DSET_SIZE * m) + - (DSET_SIZE * (i + k)) + j + l) ) { - - valid_chunk = FALSE; - } -#if 0 /* this will be useful from time to time -- lets keep it */ - HDfprintf(stdout, "data_chunk[%0d][%0d] = %0d, expect %0d.\n", - k, l, data_chunk[k][l], - ((DSET_SIZE * DSET_SIZE * m) + - (DSET_SIZE * (i + k)) + j + l)); -#endif - } - } - - if ( ! valid_chunk ) { - - pass2 = FALSE; - failure_mssg2 = "slab validation failed."; -#if 0 /* as above */ - fprintf(stdout, "Chunk (%0d, %0d) in /dset%03d is invalid.\n", - i, j, m); -#endif - } - } - - if ( ( pass2 ) && ( n % (NUM_RANDOM_ACCESSES / 4) == 0 ) ) { - - check_and_validate_cache_hit_rate(file_id, NULL, dump_hit_rate, - min_accesses, min_hit_rate); - - check_and_validate_cache_size(file_id, NULL, NULL, NULL, NULL, - dump_cache_size); - } - - n++; - - if ( ( pass2 ) && ( report_progress ) ) { - - progress_counter++; - - if ( progress_counter >= NUM_RANDOM_ACCESSES / 20 ) { - - progress_counter = 0; - HDfprintf(stdout, "."); - HDfflush(stdout); - } - } - } - - if ( ( pass2 ) && ( report_progress ) ) { - - HDfprintf(stdout, " Done.\n"); /* random reads data set 0 */ - HDfflush(stdout); - } - - - if ( ( pass2 ) && ( report_progress ) ) { - - HDfprintf(stdout,"Shutting down ... "); - HDfflush(stdout); - } - - - /* close file space 0 */ - if ( pass2 ) { - - if ( H5Sclose(filespace_ids[0]) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Sclose(filespace_ids[0]) failed."; - } - } - - /* close the data space */ - if ( pass2 ) { - - if ( H5Sclose(dataspace_id) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Sclose(dataspace) failed."; - } - } - - /* close the mem space */ - if ( pass2 ) { - - if ( H5Sclose(memspace_id) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Sclose(memspace_id) failed."; - } - } - - /* close dataset 0 */ - if ( pass2 ) { - - if ( H5Dclose(dataset_ids[0]) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Dclose(dataset_ids[0]) failed."; - } - } - - /* close the file and delete it */ - if ( pass2 ) { - - if ( H5Fclose(file_id) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fclose() failed.\n"; - - } - else if ( HDremove(filename) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "HDremove() failed.\n"; - } - } - - if ( ( pass2 ) && ( report_progress ) ) { - - HDfprintf(stdout,"Done.\n"); /* shutting down */ - HDfflush(stdout); - } - - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) - HDfprintf(stdout, "%s: failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - - return !pass2; - -} /* mdc_api_call_smoke_check() */ - - - -/* The following array of invalid external MDC cache configurations is - * used to test error rejection in the MDC related API calls. - */ - -#define NUM_INVALID_CONFIGS 41 - -H5AC2_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] = -{ - { - /* 0 -- bad version */ - /* int version = */ -1, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024), - /* double min_clean_fraction = */ 0.25, - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ ( 1 * 1024 * 1024), - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold, - /* double upper_hr_threshold = */ 0.999, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1, - /* int dirty_bytes_threshold = */ (256 * 1024) - }, - { - /* 1 -- bad rpt_fcn_enabled */ - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ (hbool_t)-1, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024), - /* double min_clean_fraction = */ 0.25, - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ ( 1 * 1024 * 1024), - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold, - /* double upper_hr_threshold = */ 0.999, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1, - /* int dirty_bytes_threshold = */ (256 * 1024) - }, - { - /* 2 -- bad open_trace_file */ - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ (hbool_t)-1, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024), - /* double min_clean_fraction = */ 0.25, - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ ( 1 * 1024 * 1024), - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold, - /* double upper_hr_threshold = */ 0.999, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1, - /* int dirty_bytes_threshold = */ (256 * 1024) - }, - { - /* 3 -- bad close_trace_file */ - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ (hbool_t)-1, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024), - /* double min_clean_fraction = */ 0.25, - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ ( 1 * 1024 * 1024), - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold, - /* double upper_hr_threshold = */ 0.999, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1, - /* int dirty_bytes_threshold = */ (256 * 1024) - }, - { - /* 4 -- open_trace_file == TRUE and empty trace_file_name */ - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ TRUE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024), - /* double min_clean_fraction = */ 0.25, - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ ( 1 * 1024 * 1024), - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold, - /* double upper_hr_threshold = */ 0.999, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1, - /* int dirty_bytes_threshold = */ (256 * 1024) - }, - { - /* 5 -- bad set_initial_size */ - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ 2, - /* size_t initial_size = */ (1 * 1024 * 1024), - /* double min_clean_fraction = */ 0.25, - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ ( 1 * 1024 * 1024), - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold, - /* double upper_hr_threshold = */ 0.999, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1, - /* int dirty_bytes_threshold = */ (256 * 1024) - }, - { - /* 6 -- max_size too big */ - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024), - /* double min_clean_fraction = */ 0.25, - /* size_t max_size = */ H5C2__MAX_MAX_CACHE_SIZE + 1, - /* size_t min_size = */ ( 1 * 1024 * 1024), - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold, - /* double upper_hr_threshold = */ 0.999, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1, - /* int dirty_bytes_threshold = */ (256 * 1024) - }, - { - /* 7 -- min_size too small */ - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024), - /* double min_clean_fraction = */ 0.25, - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ H5C2__MIN_MAX_CACHE_SIZE - 1, - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold, - /* double upper_hr_threshold = */ 0.999, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1, - /* int dirty_bytes_threshold = */ (256 * 1024) - }, - { - /* 8 -- min_size > max_size */ - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ FALSE, - /* size_t initial_size = */ (1 * 1024 * 1024), - /* double min_clean_fraction = */ 0.25, - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ (16 * 1024 * 1024 + 1), - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold, - /* double upper_hr_threshold = */ 0.999, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1, - /* int dirty_bytes_threshold = */ (256 * 1024) - }, - { - /* 9 -- initial size out of range (too big) */ - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (16 * 1024 * 1024 + 1), - /* double min_clean_fraction = */ 0.25, - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ ( 1 * 1024 * 1024), - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold, - /* double upper_hr_threshold = */ 0.999, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1, - /* int dirty_bytes_threshold = */ (256 * 1024) - }, - { - /* 10 -- initial_size out of range (too small) */ - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024 - 1), - /* double min_clean_fraction = */ 0.25, - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ ( 1 * 1024 * 1024), - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold, - /* double upper_hr_threshold = */ 0.999, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1, - /* int dirty_bytes_threshold = */ (256 * 1024) - }, - { - /* 11 -- min_clean_fraction too big */ - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024), - /* double min_clean_fraction = */ 1.000001, - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ ( 1 * 1024 * 1024), - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold, - /* double upper_hr_threshold = */ 0.999, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1, - /* int dirty_bytes_threshold = */ (256 * 1024) - }, - { - /* 12 -- min_clean_fraction too small */ - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024), - /* double min_clean_fraction = */ -0.00000001, - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ ( 1 * 1024 * 1024), - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold, - /* double upper_hr_threshold = */ 0.999, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1, - /* int dirty_bytes_threshold = */ (256 * 1024) - }, - { - /* 13 -- epoch_length too small */ - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024), - /* double min_clean_fraction = */ 0.25, - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ ( 1 * 1024 * 1024), - /* long int epoch_length = */ H5C2__MIN_AR_EPOCH_LENGTH - 1, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold, - /* double upper_hr_threshold = */ 0.999, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1, - /* int dirty_bytes_threshold = */ (256 * 1024) - }, - { - /* 14 -- epoch_length too big */ - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024), - /* double min_clean_fraction = */ 0.25, - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ ( 1 * 1024 * 1024), - /* long int epoch_length = */ H5C2__MAX_AR_EPOCH_LENGTH + 1, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold, - /* double upper_hr_threshold = */ 0.999, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1, - /* int dirty_bytes_threshold = */ (256 * 1024) - }, - { - /* 15 -- invalid incr_mode */ - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024), - /* double min_clean_fraction = */ 0.25, - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ ( 1 * 1024 * 1024), - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ -1, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold, - /* double upper_hr_threshold = */ 0.999, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1, - /* int dirty_bytes_threshold = */ (256 * 1024) - }, - { - /* 16 -- lower_hr_threshold too small */ - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024), - /* double min_clean_fraction = */ 0.25, - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ ( 1 * 1024 * 1024), - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ -0.000001, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold, - /* double upper_hr_threshold = */ 0.999, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1, - /* int dirty_bytes_threshold = */ (256 * 1024) - }, - { - /* 17 -- lower_hr_threshold too big */ - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024), - /* double min_clean_fraction = */ 0.25, - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ ( 1 * 1024 * 1024), - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 1.00000001, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold, - /* double upper_hr_threshold = */ 0.999, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1, - /* int dirty_bytes_threshold = */ (256 * 1024) - }, - { - /* 18 -- increment too small */ - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024), - /* double min_clean_fraction = */ 0.25, - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ ( 1 * 1024 * 1024), - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 0.999999999999, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold, - /* double upper_hr_threshold = */ 0.999, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1, - /* int dirty_bytes_threshold = */ (256 * 1024) - }, - { - /* 19 -- bad apply_max_increment */ - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024), - /* double min_clean_fraction = */ 0.25, - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ ( 1 * 1024 * 1024), - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ (hbool_t)-1, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold, - /* double upper_hr_threshold = */ 0.999, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1, - /* int dirty_bytes_threshold = */ (256 * 1024) - }, - { - /* 20 -- invalid flash_incr_mode */ - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024), - /* double min_clean_fraction = */ 0.25, - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ ( 1 * 1024 * 1024), - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ -1, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold, - /* double upper_hr_threshold = */ 0.999, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1, - /* int dirty_bytes_threshold = */ (256 * 1024) - }, - { - /* 21 -- flash_multiple too small */ - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024), - /* double min_clean_fraction = */ 0.25, - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ ( 1 * 1024 * 1024), - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__add_space, - /* double flash_multiple = */ 0.09, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold, - /* double upper_hr_threshold = */ 0.999, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1, - /* int dirty_bytes_threshold = */ (256 * 1024) - }, - { - /* 22 -- flash_multiple too big */ - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024), - /* double min_clean_fraction = */ 0.25, - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ ( 1 * 1024 * 1024), - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__add_space, - /* double flash_multiple = */ 10.001, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold, - /* double upper_hr_threshold = */ 0.999, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1, - /* int dirty_bytes_threshold = */ (256 * 1024) - }, - { - /* 23 -- flash_threshold too small */ - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024), - /* double min_clean_fraction = */ 0.25, - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ ( 1 * 1024 * 1024), - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__add_space, - /* double flash_multiple = */ 1.0, - /* double flash_threshold = */ 0.099, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold, - /* double upper_hr_threshold = */ 0.999, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1, - /* int dirty_bytes_threshold = */ (256 * 1024) - }, - { - /* 24 -- flash_threshold too big */ - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024), - /* double min_clean_fraction = */ 0.25, - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ ( 1 * 1024 * 1024), - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__add_space, - /* double flash_multiple = */ 1.0, - /* double flash_threshold = */ 1.001, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold, - /* double upper_hr_threshold = */ 0.999, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1, - /* int dirty_bytes_threshold = */ (256 * 1024) - }, - { - /* 25 -- bad decr_mode */ - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024), - /* double min_clean_fraction = */ 0.25, - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ ( 1 * 1024 * 1024), - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ -1, - /* double upper_hr_threshold = */ 0.999, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1, - /* int dirty_bytes_threshold = */ (256 * 1024) - }, - { - /* 26 -- upper_hr_threshold too big */ - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024), - /* double min_clean_fraction = */ 0.25, - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ ( 1 * 1024 * 1024), - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__threshold, - /* double upper_hr_threshold = */ 1.00001, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1, - /* int dirty_bytes_threshold = */ (256 * 1024) - }, - { - /* 27 -- decrement too small */ - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024), - /* double min_clean_fraction = */ 0.25, - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ ( 1 * 1024 * 1024), - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__threshold, - /* double upper_hr_threshold = */ 0.999, - /* double decrement = */ -0.0000000001, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1, - /* int dirty_bytes_threshold = */ (256 * 1024) - }, - { - /* 28 -- decrement too big */ - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024), - /* double min_clean_fraction = */ 0.25, - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ ( 1 * 1024 * 1024), - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__threshold, - /* double upper_hr_threshold = */ 0.999, - /* double decrement = */ 1.0000000001, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1, - /* int dirty_bytes_threshold = */ (256 * 1024) - }, - { - /* 29 -- epochs_before_eviction too small */ - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024), - /* double min_clean_fraction = */ 0.25, - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ ( 1 * 1024 * 1024), - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out, - /* double upper_hr_threshold = */ 0.999, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 0, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1, - /* int dirty_bytes_threshold = */ (256 * 1024) - }, - { - /* 30 -- epochs_before_eviction too big */ - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024), - /* double min_clean_fraction = */ 0.25, - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ ( 1 * 1024 * 1024), - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out, - /* double upper_hr_threshold = */ 0.999, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ H5C2__MAX_EPOCH_MARKERS + 1, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1, - /* int dirty_bytes_threshold = */ (256 * 1024) - }, - { - /* 31 -- invalid apply_empty_reserve */ - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024), - /* double min_clean_fraction = */ 0.25, - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ ( 1 * 1024 * 1024), - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold, - /* double upper_hr_threshold = */ 0.999, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ 2, - /* double empty_reserve = */ 0.1, - /* int dirty_bytes_threshold = */ (256 * 1024) - }, - { - /* 32 -- empty_reserve too small */ - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024), - /* double min_clean_fraction = */ 0.25, - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ ( 1 * 1024 * 1024), - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold, - /* double upper_hr_threshold = */ 0.999, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ -0.0000000001, - /* int dirty_bytes_threshold = */ (256 * 1024) - }, - { - /* 33 -- empty_reserve too big */ - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024), - /* double min_clean_fraction = */ 0.25, - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ ( 1 * 1024 * 1024), - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold, - /* double upper_hr_threshold = */ 0.999, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 1.00000000001, - /* int dirty_bytes_threshold = */ (256 * 1024) - }, - { - /* 34 -- upper_hr_threshold too small */ - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024), - /* double min_clean_fraction = */ 0.25, - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ ( 1 * 1024 * 1024), - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold, - /* double upper_hr_threshold = */ -0.000000001, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1, - /* int dirty_bytes_threshold = */ (256 * 1024) - }, - { - /* 35 -- upper_hr_threshold too big */ - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024), - /* double min_clean_fraction = */ 0.25, - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ ( 1 * 1024 * 1024), - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold, - /* double upper_hr_threshold = */ 1.00000001, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1, - /* int dirty_bytes_threshold = */ (256 * 1024) - }, - { - /* 36 -- upper_hr_threshold <= lower_hr_threshold */ - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024), - /* double min_clean_fraction = */ 0.25, - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ ( 1 * 1024 * 1024), - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold, - /* double upper_hr_threshold = */ 0.9, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1, - /* int dirty_bytes_threshold = */ (256 * 1024) - }, - { - /* 37 -- dirty_bytes_threshold too small */ - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024), - /* double min_clean_fraction = */ 0.25, - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ ( 1 * 1024 * 1024), - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold, - /* double upper_hr_threshold = */ 0.999, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1, - /* int dirty_bytes_threshold = */ (H5C2__MIN_MAX_CACHE_SIZE / 2) - 1 - }, - { - /* 38 -- dirty_bytes_threshold too big */ - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024), - /* double min_clean_fraction = */ 0.25, - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ ( 1 * 1024 * 1024), - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out_with_threshold, - /* double upper_hr_threshold = */ 0.9, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1, - /* int dirty_bytes_threshold = */ (H5C2__MAX_MAX_CACHE_SIZE / 4) + 1 - }, - { - /* 39 -- attempt to disable evictions when auto incr enabled */ - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ FALSE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024), - /* double min_clean_fraction = */ 0.25, - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ ( 1 * 1024 * 1024), - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__off, - /* double upper_hr_threshold = */ 0.9, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1, - /* int dirty_bytes_threshold = */ (256 * 1024) - }, - { - /* 40 -- attempt to disable evictions when auto decr enabled */ - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ FALSE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ (1 * 1024 * 1024), - /* double min_clean_fraction = */ 0.25, - /* size_t max_size = */ (16 * 1024 * 1024), - /* size_t min_size = */ ( 1 * 1024 * 1024), - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__threshold, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 2.0, - /* double flash_threshold = */ 0.5, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__age_out, - /* double upper_hr_threshold = */ 0.9, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1, - /* int dirty_bytes_threshold = */ (256 * 1024) - } -}; - - -/*------------------------------------------------------------------------- - * Function: check_fapl_mdc_api_errs() - * - * Purpose: Verify that the FAPL related MDC API calls reject input - * errors gracefully. - * - * Return: void - * - * Programmer: John Mainzer - * 4/19/04 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -static unsigned -check_fapl_mdc_api_errs(void) -{ - const char * fcn_name = "check_fapl_mdc_api_errs()"; - static char msg[128]; - int i; - herr_t result; - hid_t fapl_id = -1; - H5AC2_cache_config_t default_config = H5AC2__DEFAULT_CACHE_CONFIG; - H5AC2_cache_config_t scratch; - - TESTING("MDC/FAPL related API input errors"); - - pass2 = TRUE; - - - /* first test H5Pget_mdc_config(). - */ - - scratch.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - if ( pass2 ) { - - H5E_BEGIN_TRY { - result = H5Pget_mdc_config(-1, (H5AC1_cache_config_t *)&scratch); - } H5E_END_TRY; - - if ( result >= 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pget_mdc_config() accepted invalid plist_id."; - } - } - - /* Create a FAPL for test purposes, and verify that it contains the - * default MDC configuration. - */ - - if ( pass2 ) { - - fapl_id = H5Pcreate(H5P_FILE_ACCESS); - - if ( fapl_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pcreate(H5P_FILE_ACCESS) failed.\n"; - } - } - - scratch.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - if ( ( pass2 ) && - ( ( H5Pget_mdc_config(fapl_id, (H5AC1_cache_config_t *)&scratch) < 0) || - ( !CACHE_CONFIGS_EQUAL(default_config, scratch, TRUE, TRUE) ) ) ) { - - pass2 = FALSE; - failure_mssg2 = "New FAPL has unexpected metadata cache config?!?!?.\n"; - } - - if ( pass2 ) { - - H5E_BEGIN_TRY { - result = H5Pget_mdc_config(fapl_id, NULL); - } H5E_END_TRY; - - if ( result >= 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pget_mdc_config() accepted NULL config_ptr."; - } - } - - /* one last test for H5Pget_mdc_config() */ - - scratch.version = -1; /* a convenient, invalid value */ - if ( pass2 ) { - - H5E_BEGIN_TRY { - result = H5Pget_mdc_config(fapl_id, (H5AC1_cache_config_t *)&scratch); - } H5E_END_TRY; - - if ( result >= 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pget_mdc_config() accepted bad config version."; - } - } - - - /* now test H5Pset_mdc_config() - */ - - scratch.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - if ( pass2 ) { - - H5E_BEGIN_TRY { - result = H5Pset_mdc_config(-1, (H5AC1_cache_config_t *)&default_config); - } H5E_END_TRY; - - if ( result >= 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pset_mdc_config() accepted bad invalid plist_id."; - } - } - - if ( pass2 ) { - - H5E_BEGIN_TRY { - result = H5Pset_mdc_config(fapl_id, NULL); - } H5E_END_TRY; - - if ( result >= 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pset_mdc_config() accepted NULL config_ptr."; - } - } - - i = 0; - while ( ( pass2 ) && ( i < NUM_INVALID_CONFIGS ) ) - { - H5E_BEGIN_TRY { - result = H5Pset_mdc_config(fapl_id, (H5AC1_cache_config_t *)&(invalid_configs[i])); - } H5E_END_TRY; - - if ( result >= 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "H5Pset_mdc_config() accepted invalid_configs[%d].", i); - failure_mssg2 = msg; - } - i++; - } - - /* verify that none of the above calls to H5Pset_mdc_config() changed - * the configuration in the FAPL. - */ - scratch.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - if ( ( pass2 ) && - ( ( H5Pget_mdc_config(fapl_id, (H5AC1_cache_config_t *)&scratch) < 0 ) || - ( !CACHE_CONFIGS_EQUAL(default_config, scratch, TRUE, TRUE) ) ) ) { - - pass2 = FALSE; - failure_mssg2 = "FAPL metadata cache config changed???.\n"; - } - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) - HDfprintf(stdout, "%s: failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - - return !pass2; - -} /* check_fapl_mdc_api_errs() */ - - -/*------------------------------------------------------------------------- - * Function: check_file_mdc_api_errs() - * - * Purpose: Verify that the file related MDC API calls reject input - * errors gracefully. - * - * Return: void - * - * Programmer: John Mainzer - * 4/19/04 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -static unsigned -check_file_mdc_api_errs(void) -{ - const char * fcn_name = "check_file_mdc_api_errs()"; - char filename[512]; - static char msg[128]; - hbool_t show_progress = FALSE; - int i; - herr_t result; - hid_t file_id = -1; - size_t max_size; - size_t min_clean_size; - size_t cur_size; - int cur_num_entries; - double hit_rate; - - H5AC2_cache_config_t default_config = H5AC2__DEFAULT_CACHE_CONFIG; - H5AC2_cache_config_t scratch; - - TESTING("MDC/FILE related API input errors"); - - pass2 = TRUE; - - /* Create a file for test purposes, and veify that its metadata cache - * set to the default MDC configuration. - */ - - /* setup the file name */ - if ( pass2 ) { - - if ( show_progress ) { - - HDfprintf(stdout, "%s: calling h5_fixname().\n", fcn_name); - } - - if ( h5_fixname(FILENAME[1], H5P_DEFAULT, filename, sizeof(filename)) - == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed.\n"; - } - } - - if ( pass2 ) { - - if ( show_progress ) { - - HDfprintf(stdout, "%s: calling H5Fcreate().\n", fcn_name); - } - - file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - - if ( file_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fcreate() failed.\n"; - } - } - - validate_mdc_config(file_id, &default_config, TRUE, 1); - - - /* test H5Fget_mdc_config(). */ - - scratch.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - if ( pass2 ) { - - if ( show_progress ) { - - HDfprintf(stdout, "%s: testing H5Fget_mdc_config() 1.\n", fcn_name); - } - - H5E_BEGIN_TRY { - result = H5Fget_mdc_config(-1, (H5AC1_cache_config_t *)&scratch); - } H5E_END_TRY; - - if ( result >= 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fget_mdc_config() accepted invalid file_id."; - } - } - - if ( pass2 ) { - - if ( show_progress ) { - - HDfprintf(stdout, "%s: testing H5Fget_mdc_config() 2.\n", fcn_name); - } - - H5E_BEGIN_TRY { - result = H5Fget_mdc_config(file_id, NULL); - } H5E_END_TRY; - - if ( result >= 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fget_mdc_config() accepted NULL config_ptr."; - } - } - - scratch.version = -1; /* a convenient, invalid value */ - if ( pass2 ) { - - if ( show_progress ) { - - HDfprintf(stdout, "%s: testing H5Fget_mdc_config() 3.\n", fcn_name); - } - - H5E_BEGIN_TRY { - result = H5Fget_mdc_config(file_id, (H5AC1_cache_config_t *)&scratch); - } H5E_END_TRY; - - if ( result >= 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fget_mdc_config() accepted bad config version."; - } - } - - - /* test H5Fset_mdc_config() */ - - scratch.version = H5C2__CURR_AUTO_SIZE_CTL_VER; - if ( pass2 ) { - - if ( show_progress ) { - - HDfprintf(stdout, "%s: testing H5Fset_mdc_config() 1.\n", fcn_name); - } - - H5E_BEGIN_TRY { - result = H5Fset_mdc_config(-1, (H5AC1_cache_config_t *)&default_config); - } H5E_END_TRY; - - if ( result >= 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fset_mdc_config() accepted bad invalid file_id."; - } - } - - if ( pass2 ) { - - if ( show_progress ) { - - HDfprintf(stdout, "%s: testing H5Fset_mdc_config() 2.\n", fcn_name); - } - - H5E_BEGIN_TRY { - result = H5Fset_mdc_config(file_id, NULL); - } H5E_END_TRY; - - if ( result >= 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fset_mdc_config() accepted NULL config_ptr."; - } - } - - i = 0; - while ( ( pass2 ) && ( i < NUM_INVALID_CONFIGS ) ) - { - if ( show_progress ) { - - HDfprintf(stdout, - "%s: testing H5Fset_mdc_config() with invalid config %d.\n", - fcn_name, i); - } - - H5E_BEGIN_TRY { - result = - H5Fset_mdc_config(file_id, (H5AC1_cache_config_t *)&(invalid_configs[i])); - } H5E_END_TRY; - - if ( result >= 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "H5Fset_mdc_config() accepted invalid_configs[%d].", i); - failure_mssg2 = msg; - } - i++; - } - - /* verify that none of the above calls to H5Fset_mdc_config() changed - * the configuration in the FAPL. - */ - validate_mdc_config(file_id, &default_config, TRUE, 2); - - - /* test H5Fget_mdc_hit_rate() */ - if ( pass2 ) { - - if ( show_progress ) { - - HDfprintf(stdout, "%s: testing H5Fget_mdc_hit_rate() 1.\n", - fcn_name); - } - - H5E_BEGIN_TRY { - result = H5Fget_mdc_hit_rate(-1, &hit_rate); - } H5E_END_TRY; - - if ( result >= 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fget_mdc_hit_rate() accepted bad file_id."; - } - } - - if ( pass2 ) { - - if ( show_progress ) { - - HDfprintf(stdout, "%s: testing H5Fget_mdc_hit_rate() 2.\n", - fcn_name); - } - - H5E_BEGIN_TRY { - result = H5Fget_mdc_hit_rate(file_id, NULL); - } H5E_END_TRY; - - if ( result >= 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fget_mdc_hit_rate() accepted NULL hit_rate_ptr."; - } - } - - - /* test H5Freset_mdc_hit_rate_stats() */ - if ( pass2 ) { - - if ( show_progress ) { - - HDfprintf(stdout, "%s: testing H5Freset_mdc_hit_rate_stats().\n", - fcn_name); - } - - H5E_BEGIN_TRY { - result = H5Freset_mdc_hit_rate_stats(-1); - } H5E_END_TRY; - - if ( result >= 0 ) { - - pass2 = FALSE; - failure_mssg2 = - "H5Freset_mdc_hit_rate_stats() accepted bad file_id."; - } - } - - - /* test H5Fget_mdc_size() */ - if ( pass2 ) { - - if ( show_progress ) { - - HDfprintf(stdout, "%s: testing H5Fget_mdc_size() 1.\n", fcn_name); - } - - H5E_BEGIN_TRY { - result = H5Fget_mdc_size(-1, &max_size, &min_clean_size, - &cur_size, &cur_num_entries); - } H5E_END_TRY; - - if ( result >= 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fget_mdc_size() accepted bad file_id."; - } - } - - if ( pass2 ) { - - if ( show_progress ) { - - HDfprintf(stdout, "%s: testing H5Fget_mdc_size() 2.\n", fcn_name); - } - - if ( ( H5Fget_mdc_size(file_id, &max_size, NULL, NULL, NULL) < 0 ) || - ( H5Fget_mdc_size(file_id, NULL, &min_clean_size, - NULL, NULL) < 0 ) || - ( H5Fget_mdc_size(file_id, NULL, NULL, &cur_size, NULL) < 0 ) || - ( H5Fget_mdc_size(file_id, NULL, NULL, NULL, - &cur_num_entries) < 0 ) || - ( H5Fget_mdc_size(file_id, NULL, NULL, NULL, NULL) < 0 ) ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fget_mdc_size() failed to handle NULL params."; - } - } - - - /* close the file and delete it */ - if ( pass2 ) { - - if ( show_progress ) { - - HDfprintf(stdout, "%s: cleaning up from tests.\n", fcn_name); - } - - if ( H5Fclose(file_id) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fclose() failed.\n"; - - } else if ( HDremove(filename) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "HDremove() failed.\n"; - } - } - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) - HDfprintf(stdout, "%s: failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - - return !pass2; - -} /* check_file_mdc_api_errs() */ - - -/*------------------------------------------------------------------------- - * Function: main - * - * Purpose: Run tests on the cache code contained in H5C2.c - * - * Return: Success: - * - * Failure: - * - * Programmer: John Mainzer - * 6/24/04 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -int -main(void) -{ - unsigned nerrs = 0; - - H5open(); - - express_test2 = GetTestExpress(); - - if ( express_test2 >= 3 ) { - - skip_long_tests2 = TRUE; - - } else { - - skip_long_tests2 = FALSE; - } - - printf("===================================\n"); - printf("Cache API tests\n"); - printf(" express_test = %d\n", express_test2); - printf(" skip_long_tests = %d\n", (int)skip_long_tests2); - printf(" use_core_driver = %d\n", USE_CORE_DRIVER); - printf("===================================\n"); - - -#if 1 - nerrs += check_fapl_mdc_api_calls(); -#endif -#if 1 - nerrs += check_file_mdc_api_calls(); -#endif -#if 1 - nerrs += mdc_api_call_smoke_check(); -#endif -#if 1 - nerrs += check_fapl_mdc_api_errs(); -#endif -#if 1 - nerrs += check_file_mdc_api_errs(); -#endif - - return( nerrs > 0 ); - -} /* main() */ diff --git a/test/cache2_common.c b/test/cache2_common.c deleted file mode 100644 index 9ac2f56..0000000 --- a/test/cache2_common.c +++ /dev/null @@ -1,5876 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * Copyright by the Board of Trustees of the University of Illinois. * - * All rights reserved. * - * * - * This file is part of HDF5. The full HDF5 copyright notice, including * - * terms governing use, modification, and redistribution, is contained in * - * the files COPYING and Copyright.html. COPYING can be found at the root * - * of the source code distribution tree; Copyright.html can be found at the * - * root level of an installed copy of the electronic HDF5 document set and * - * is linked from the top-level documents page. It can also be found at * - * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * - * access to either file, you may request a copy from help@hdfgroup.org. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* Programmer: John Mainzer - * 9/13/07 - * - * This file contains common code for tests of the cache - * implemented in H5C2.c - */ - -#include - -#include "H5private.h" - -#include "h5test.h" -#include "H5Iprivate.h" -#include "H5AC2private.h" -#include "H5MFprivate.h" -#include "H5MMprivate.h" -#include "cache2_common.h" - - -/* global variable declarations: */ - -const char *FILENAME[] = { - "cache2_test", - "cache2_api_test", - NULL -}; - -hid_t saved_fapl_id = H5P_DEFAULT; /* store the fapl id here between - * cache setup and takedown. Note - * that if saved_fapl_id == H5P_DEFAULT, - * we assume that there is no fapl to - * close. - */ - -hid_t saved_fid = -1; /* store the file id here between cache setup - * and takedown. - */ - -H5C2_t * saved_cache2 = NULL; /* store the pointer to the instance of - * of H5C2_t created by H5Fcreate() - * here between test cache setup and - * shutdown. - */ - -haddr_t saved_actual_base_addr = HADDR_UNDEF; /* Store the address of the - space allocated for cache items in the file between - cache setup & takedown */ - -hbool_t write_permitted2 = TRUE; -hbool_t pass2 = TRUE; /* set to false on error */ -hbool_t skip_long_tests2 = TRUE; -hbool_t run_full_test2 = TRUE; -hbool_t try_core_file_driver = TRUE; -hbool_t core_file_driver_failed = FALSE; -const char *failure_mssg2 = NULL; -int failures2 = 0; -int express_test2 = 0; - -test_entry_t pico_entries2[NUM_PICO_ENTRIES]; -test_entry_t nano_entries2[NUM_NANO_ENTRIES]; -test_entry_t micro_entries2[NUM_MICRO_ENTRIES]; -test_entry_t tiny_entries2[NUM_TINY_ENTRIES]; -test_entry_t small_entries2[NUM_SMALL_ENTRIES]; -test_entry_t medium_entries2[NUM_MEDIUM_ENTRIES]; -test_entry_t large_entries2[NUM_LARGE_ENTRIES]; -test_entry_t huge_entries2[NUM_HUGE_ENTRIES]; -test_entry_t monster_entries2[NUM_MONSTER_ENTRIES]; -test_entry_t variable_entries2[NUM_VARIABLE_ENTRIES]; - -test_entry_t * entries2[NUMBER_OF_ENTRY_TYPES] = -{ - pico_entries2, - nano_entries2, - micro_entries2, - tiny_entries2, - small_entries2, - medium_entries2, - large_entries2, - huge_entries2, - monster_entries2, - variable_entries2 -}; - -const int32_t max_indices2[NUMBER_OF_ENTRY_TYPES] = -{ - NUM_PICO_ENTRIES - 1, - NUM_NANO_ENTRIES - 1, - NUM_MICRO_ENTRIES - 1, - NUM_TINY_ENTRIES - 1, - NUM_SMALL_ENTRIES - 1, - NUM_MEDIUM_ENTRIES - 1, - NUM_LARGE_ENTRIES - 1, - NUM_HUGE_ENTRIES - 1, - NUM_MONSTER_ENTRIES - 1, - NUM_VARIABLE_ENTRIES - 1 -}; - -const size_t entry_sizes2[NUMBER_OF_ENTRY_TYPES] = -{ - PICO_ENTRY_SIZE, - NANO_ENTRY_SIZE, - MICRO_ENTRY_SIZE, - TINY_ENTRY_SIZE, - SMALL_ENTRY_SIZE, - MEDIUM_ENTRY_SIZE, - LARGE_ENTRY_SIZE, - HUGE_ENTRY_SIZE, - MONSTER_ENTRY_SIZE, - VARIABLE_ENTRY_SIZE -}; - -const haddr_t base_addrs2[NUMBER_OF_ENTRY_TYPES] = -{ - PICO_BASE_ADDR, - NANO_BASE_ADDR, - MICRO_BASE_ADDR, - TINY_BASE_ADDR, - SMALL_BASE_ADDR, - MEDIUM_BASE_ADDR, - LARGE_BASE_ADDR, - HUGE_BASE_ADDR, - MONSTER_BASE_ADDR, - VARIABLE_BASE_ADDR -}; - -const haddr_t alt_base_addrs2[NUMBER_OF_ENTRY_TYPES] = -{ - PICO_ALT_BASE_ADDR, - NANO_ALT_BASE_ADDR, - MICRO_ALT_BASE_ADDR, - TINY_ALT_BASE_ADDR, - SMALL_ALT_BASE_ADDR, - MEDIUM_ALT_BASE_ADDR, - LARGE_ALT_BASE_ADDR, - HUGE_ALT_BASE_ADDR, - MONSTER_ALT_BASE_ADDR, - VARIABLE_ALT_BASE_ADDR -}; - -const char * entry_type_names2[NUMBER_OF_ENTRY_TYPES] = -{ - "pico entries -- 1 B", - "nano entries -- 4 B", - "micro entries -- 16 B", - "tiny entries -- 64 B", - "small entries -- 256 B", - "medium entries -- 1 KB", - "large entries -- 4 KB", - "huge entries -- 16 KB", - "monster entries -- 64 KB", - "variable entries -- 1B - 10KB" -}; - - -/* callback table declaration */ - -const H5C2_class_t types2[NUMBER_OF_ENTRY_TYPES] = -{ - { - PICO_ENTRY_TYPE, - "pico_entry", - H5FD_MEM_DEFAULT, - (H5C2_deserialize_func_t)pico_deserialize, - (H5C2_image_len_func_t)pico_image_len, - (H5C2_serialize_func_t)pico_serialize, - (H5C2_free_icr_func_t)pico_free_icr, - (H5C2_clear_dirty_bits_func_t)pico_clear_dirty_bits - }, - { - NANO_ENTRY_TYPE, - "nano_entry", - H5FD_MEM_DEFAULT, - (H5C2_deserialize_func_t)nano_deserialize, - (H5C2_image_len_func_t)nano_image_len, - (H5C2_serialize_func_t)nano_serialize, - (H5C2_free_icr_func_t)nano_free_icr, - (H5C2_clear_dirty_bits_func_t)nano_clear_dirty_bits - }, - { - MICRO_ENTRY_TYPE, - "micro_entry", - H5FD_MEM_DEFAULT, - (H5C2_deserialize_func_t)micro_deserialize, - (H5C2_image_len_func_t)micro_image_len, - (H5C2_serialize_func_t)micro_serialize, - (H5C2_free_icr_func_t)micro_free_icr, - (H5C2_clear_dirty_bits_func_t)micro_clear_dirty_bits - }, - { - TINY_ENTRY_TYPE, - "tiny_entry", - H5FD_MEM_DEFAULT, - (H5C2_deserialize_func_t)tiny_deserialize, - (H5C2_image_len_func_t)tiny_image_len, - (H5C2_serialize_func_t)tiny_serialize, - (H5C2_free_icr_func_t)tiny_free_icr, - (H5C2_clear_dirty_bits_func_t)tiny_clear_dirty_bits - }, - { - SMALL_ENTRY_TYPE, - "small_entry", - H5FD_MEM_DEFAULT, - (H5C2_deserialize_func_t)small_deserialize, - (H5C2_image_len_func_t)small_image_len, - (H5C2_serialize_func_t)small_serialize, - (H5C2_free_icr_func_t)small_free_icr, - (H5C2_clear_dirty_bits_func_t)small_clear_dirty_bits - }, - { - MEDIUM_ENTRY_TYPE, - "medium_entry", - H5FD_MEM_DEFAULT, - (H5C2_deserialize_func_t)medium_deserialize, - (H5C2_image_len_func_t)medium_image_len, - (H5C2_serialize_func_t)medium_serialize, - (H5C2_free_icr_func_t)medium_free_icr, - (H5C2_clear_dirty_bits_func_t)medium_clear_dirty_bits - }, - { - LARGE_ENTRY_TYPE, - "large_entry", - H5FD_MEM_DEFAULT, - (H5C2_deserialize_func_t)large_deserialize, - (H5C2_image_len_func_t)large_image_len, - (H5C2_serialize_func_t)large_serialize, - (H5C2_free_icr_func_t)large_free_icr, - (H5C2_clear_dirty_bits_func_t)large_clear_dirty_bits - }, - { - HUGE_ENTRY_TYPE, - "huge_entry", - H5FD_MEM_DEFAULT, - (H5C2_deserialize_func_t)huge_deserialize, - (H5C2_image_len_func_t)huge_image_len, - (H5C2_serialize_func_t)huge_serialize, - (H5C2_free_icr_func_t)huge_free_icr, - (H5C2_clear_dirty_bits_func_t)huge_clear_dirty_bits - }, - { - MONSTER_ENTRY_TYPE, - "monster_entry", - H5FD_MEM_DEFAULT, - (H5C2_deserialize_func_t)monster_deserialize, - (H5C2_image_len_func_t)monster_image_len, - (H5C2_serialize_func_t)monster_serialize, - (H5C2_free_icr_func_t)monster_free_icr, - (H5C2_clear_dirty_bits_func_t)monster_clear_dirty_bits - }, - { - VARIABLE_ENTRY_TYPE, - "variable_entry", - H5FD_MEM_DEFAULT, - (H5C2_deserialize_func_t)variable_deserialize, - (H5C2_image_len_func_t)variable_image_len, - (H5C2_serialize_func_t)variable_serialize, - (H5C2_free_icr_func_t)variable_free_icr, - (H5C2_clear_dirty_bits_func_t)variable_clear_dirty_bits - } -}; - -static void * deserialize(haddr_t addr, - size_t len, - const void * image_ptr, - hbool_t * dirty_ptr); - -static herr_t image_len(void *thing, - size_t *image_len_ptr); - -static herr_t serialize(haddr_t addr, - size_t len, - void * image_ptr, - void * thing, - unsigned * flags_ptr, - haddr_t * new_addr_ptr, - size_t * new_len_ptr, - void ** new_image_ptr_ptr); - -static herr_t free_icr(test_entry_t *entry_ptr); - -static herr_t clear_dirty_bits(test_entry_t *entry_ptr); - -/* address translation funtions: */ - - -/*------------------------------------------------------------------------- - * Function: addr_to_type_and_index2 - * - * Purpose: Given an address, compute the type and index of the - * associated entry. - * - * Return: void - * - * Programmer: John Mainzer - * 6/10/04 - * - *------------------------------------------------------------------------- - */ -void -addr_to_type_and_index2(haddr_t addr, - int32_t * type_ptr, - int32_t * index_ptr) -{ - int i; - int32_t type; - int32_t idx; - - HDassert( type_ptr ); - HDassert( index_ptr ); - - /* we only have a small number of entry types, so just do a - * linear search. If NUMBER_OF_ENTRY_TYPES grows, we may want - * to do a binary search instead. - */ - i = 1; - if ( addr >= PICO_ALT_BASE_ADDR ) { - - while ( ( i < NUMBER_OF_ENTRY_TYPES ) && - ( addr >= alt_base_addrs2[i] ) ) - { - i++; - } - - } else { - - while ( ( i < NUMBER_OF_ENTRY_TYPES ) && - ( addr >= base_addrs2[i] ) ) - { - i++; - } - } - - type = i - 1; - - HDassert( ( type >= 0 ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); - - if ( addr >= PICO_ALT_BASE_ADDR ) { - - idx = (int32_t)((addr - alt_base_addrs2[type]) / entry_sizes2[type]); - HDassert( ( idx >= 0 ) && ( idx <= max_indices2[type] ) ); - HDassert( !((entries2[type])[idx].at_main_addr) ); - HDassert( addr == (entries2[type])[idx].alt_addr ); - - } else { - - idx = (int32_t)((addr - base_addrs2[type]) / entry_sizes2[type]); - HDassert( ( idx >= 0 ) && ( idx <= max_indices2[type] ) ); - HDassert( (entries2[type])[idx].at_main_addr ); - HDassert( addr == (entries2[type])[idx].main_addr ); - } - - HDassert( addr == (entries2[type])[idx].addr ); - - *type_ptr = type; - *index_ptr = idx; - - return; - -} /* addr_to_type_and_index2() */ - -/* Call back functions: */ - - -/*------------------------------------------------------------------------- - * - * Function: check_if_write_permitted2 - * - * Purpose: Determine if a write is permitted under the current - * circumstances, and set *write_permitted_ptr accordingly. - * As a general rule it is, but when we are running in parallel - * mode with collective I/O, we must ensure that a read cannot - * cause a write. - * - * In the event of failure, the value of *write_permitted_ptr - * is undefined. - * - * Return: Non-negative on success/Negative on failure. - * - * Programmer: John Mainzer, 5/15/04 - * - *------------------------------------------------------------------------- - */ - -herr_t -check_write_permitted2(const H5F_t UNUSED * f, - hid_t UNUSED dxpl_id, - hbool_t * write_permitted_ptr) -{ - - HDassert( write_permitted_ptr ); - *write_permitted_ptr = write_permitted2; - - return(SUCCEED); - -} /* check_write_permitted2() */ - - -/*------------------------------------------------------------------------- - * Function: deserialize & friends - * - * Purpose: deserialize the entry. The helper functions verify that the - * correct version of deserialize is being called, and then call - * deserialize proper. - * - * Return: void * (pointer to the in core representation of the entry) - * - * Programmer: John Mainzer - * 9/20/07 - * - *------------------------------------------------------------------------- - */ - -static void * -deserialize(haddr_t addr, size_t len, const void * image_ptr, hbool_t * dirty_ptr) -{ - int32_t type; - int32_t idx; - test_entry_t * entry_ptr; - test_entry_t * base_addr; - - addr_to_type_and_index2(addr, &type, &idx); - - base_addr = entries2[type]; - entry_ptr = &(base_addr[idx]); - - HDassert( entry_ptr->type >= 0 ); - HDassert( entry_ptr->type < NUMBER_OF_ENTRY_TYPES ); - HDassert( entry_ptr->index == idx ); - HDassert( entry_ptr->index >= 0 ); - HDassert( entry_ptr->index <= max_indices2[type] ); - HDassert( entry_ptr == entry_ptr->self ); - HDassert( entry_ptr->addr == addr ); - HDassert( entry_ptr->size == len ); - HDassert( ( entry_ptr->type == VARIABLE_ENTRY_TYPE ) || - ( entry_ptr->size == entry_sizes2[type] ) ); - HDassert( dirty_ptr != NULL ); - - /* for now *dirty_ptr will always be FALSE */ - *dirty_ptr = FALSE; - - - /* verify that the image contains the expected data. */ - HDassert( image_ptr != NULL ); - if ( ( ( entry_ptr->at_main_addr ) - && - ( entry_ptr->written_to_main_addr ) - ) - || - ( ( ! ( entry_ptr->at_main_addr ) ) - && - ( entry_ptr->written_to_alt_addr ) - ) - ) { - - if ( ( type == PICO_ENTRY_TYPE ) || ( type == VARIABLE_ENTRY_TYPE ) ) { - - if ( (*((const char *)image_ptr)) != (char)(idx & 0xFF) ) { - - HDfprintf(stdout, "type = %d, idx = %d, addr = 0x%lx.\n", - type, idx, (long)addr); - HDfprintf(stdout, "*image_ptr = 0x%x\n", - (int)(*((const char *)image_ptr))); - HDfprintf(stdout, "expected *image_ptr = 0x%x\n", - (int)(idx & 0xFF)); - } - HDassert( (*((const char *)image_ptr)) == (char)(idx & 0xFF) ); - - } else { - - if ( (*(((const char *)image_ptr) + 2)) != (char)(idx & 0xFF) ) { - - HDfprintf(stdout, "type = %d, idx = %d, addr = 0x%lx.\n", - type, idx, (long)addr); - HDfprintf(stdout, "*image_ptr = 0x%x 0x%x 0x%x\n", - (int)(*((const char *)image_ptr)), - (int)(*(((const char *)image_ptr) + 1)), - (int)(*(((const char *)image_ptr) + 2))); - HDfprintf(stdout, "expected *image_ptr = 0x%x\n", - (int)(idx & 0xFF), - (int)((idx & 0xFF00)>>8)); - } - HDassert( (*((const char *)image_ptr)) == (char)(type & 0xFF) ); - HDassert( (*(((const char *)image_ptr) + 1)) == - (char)((idx & 0xFF00)>>8) ); - HDassert( (*(((const char *)image_ptr) + 2)) == - (char)(idx & 0xFF) ); - - } - } - - entry_ptr->deserialized = TRUE; - - entry_ptr->header.is_dirty = FALSE; - entry_ptr->is_dirty = FALSE; - - (entry_ptr->deserializes)++; - - return((void *)entry_ptr); - -} /* deserialize() */ - -void * -pico_deserialize(haddr_t addr, size_t len, const void * image_ptr, - const UNUSED void * udata_ptr, hbool_t * dirty_ptr) -{ - return deserialize(addr, len, image_ptr, dirty_ptr); -} - -void * -nano_deserialize(haddr_t addr, size_t len, const void * image_ptr, - const UNUSED void * udata_ptr, hbool_t * dirty_ptr) -{ - return deserialize(addr, len, image_ptr, dirty_ptr); -} - -void * -micro_deserialize(haddr_t addr, size_t len, const void * image_ptr, - const UNUSED void * udata_ptr, hbool_t * dirty_ptr) -{ - return deserialize(addr, len, image_ptr, dirty_ptr); -} - -void * -tiny_deserialize(haddr_t addr, size_t len, const void * image_ptr, - const UNUSED void * udata_ptr, hbool_t * dirty_ptr) -{ - return deserialize(addr, len, image_ptr, dirty_ptr); -} - -void * -small_deserialize(haddr_t addr, size_t len, const void * image_ptr, - const UNUSED void * udata_ptr, hbool_t * dirty_ptr) -{ - return deserialize(addr, len, image_ptr, dirty_ptr); -} - -void * -medium_deserialize(haddr_t addr, size_t len, const void * image_ptr, - const UNUSED void * udata_ptr, hbool_t * dirty_ptr) -{ - return deserialize(addr, len, image_ptr, dirty_ptr); -} - -void * -large_deserialize(haddr_t addr, size_t len, const void * image_ptr, - const UNUSED void * udata_ptr, hbool_t * dirty_ptr) -{ - return deserialize(addr, len, image_ptr, dirty_ptr); -} - -void * -huge_deserialize(haddr_t addr, size_t len, const void * image_ptr, - const UNUSED void * udata_ptr, hbool_t * dirty_ptr) -{ - return deserialize(addr, len, image_ptr, dirty_ptr); -} - -void * -monster_deserialize(haddr_t addr, size_t len, const void * image_ptr, - const UNUSED void * udata_ptr, hbool_t * dirty_ptr) -{ - return deserialize(addr, len, image_ptr, dirty_ptr); -} - -void * -variable_deserialize(haddr_t addr, size_t len, const void * image_ptr, - const UNUSED void * udata_ptr, hbool_t * dirty_ptr) -{ - return deserialize(addr, len, image_ptr, dirty_ptr); -} - - -/*------------------------------------------------------------------------- - * Function: image_len & friends - * - * Purpose: Return the real (and possibly reduced) length of the image. - * The helper functions verify that the correct version of - * deserialize is being called, and then call deserialize - * proper. - * - * Return: SUCCEED - * - * Programmer: John Mainzer - * 9/19/07 - * - *------------------------------------------------------------------------- - */ - -herr_t -image_len(void *thing, size_t *image_len_ptr) -{ - int32_t type; - int32_t idx; - test_entry_t * entry_ptr; - test_entry_t * base_addr; - - HDassert( thing ); - HDassert( image_len_ptr ); - - entry_ptr = (test_entry_t *)thing; - - HDassert( entry_ptr->self == entry_ptr ); - - type = entry_ptr->type; - idx = entry_ptr->index; - - HDassert( ( type >= 0 ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); - HDassert( ( idx >= 0 ) && ( idx <= max_indices2[type] ) ); - - base_addr = entries2[type]; - HDassert( entry_ptr == &(base_addr[idx]) ); - - if ( type != VARIABLE_ENTRY_TYPE ) { - - HDassert( entry_ptr->size == entry_sizes2[type] ); - - } else { - - HDassert( entry_ptr->size <= entry_sizes2[type] ); - HDassert( entry_ptr->size > 0 ); - } - - *image_len_ptr = entry_ptr->size; - - return(SUCCEED); - -} /* image_len() */ - - -herr_t -pico_image_len(void *thing, size_t *image_len_ptr) -{ - HDassert( ((test_entry_t *)thing)->type == PICO_ENTRY_TYPE ); - return(image_len(thing, image_len_ptr)); -} - -herr_t -nano_image_len(void *thing, size_t *image_len_ptr) -{ - HDassert( ((test_entry_t *)thing)->type == NANO_ENTRY_TYPE ); - return(image_len(thing, image_len_ptr)); -} - -herr_t -micro_image_len(void *thing, size_t *image_len_ptr) -{ - HDassert( ((test_entry_t *)thing)->type == MICRO_ENTRY_TYPE ); - return(image_len(thing, image_len_ptr)); -} - -herr_t -tiny_image_len(void *thing, size_t *image_len_ptr) -{ - HDassert( ((test_entry_t *)thing)->type == TINY_ENTRY_TYPE ); - return(image_len(thing, image_len_ptr)); -} - - -herr_t -small_image_len(void *thing, size_t *image_len_ptr) -{ - HDassert( ((test_entry_t *)thing)->type == SMALL_ENTRY_TYPE ); - return(image_len(thing, image_len_ptr)); -} - -herr_t -medium_image_len(void *thing, size_t *image_len_ptr) -{ - HDassert( ((test_entry_t *)thing)->type == MEDIUM_ENTRY_TYPE ); - return(image_len(thing, image_len_ptr)); -} - -herr_t -large_image_len(void *thing, size_t *image_len_ptr) -{ - HDassert( ((test_entry_t *)thing)->type == LARGE_ENTRY_TYPE ); - return(image_len(thing, image_len_ptr)); -} - -herr_t -huge_image_len(void *thing, size_t *image_len_ptr) -{ - HDassert( ((test_entry_t *)thing)->type == HUGE_ENTRY_TYPE ); - return(image_len(thing, image_len_ptr)); -} - -herr_t -monster_image_len(void *thing, size_t *image_len_ptr) -{ - HDassert( ((test_entry_t *)thing)->type == MONSTER_ENTRY_TYPE ); - return(image_len(thing, image_len_ptr)); -} - -herr_t -variable_image_len(void *thing, size_t *image_len_ptr) -{ - HDassert( ((test_entry_t *)thing)->type == VARIABLE_ENTRY_TYPE ); - return(image_len(thing, image_len_ptr)); -} - - -/*------------------------------------------------------------------------- - * Function: serialize & friends - * - * Purpose: Serialize the supplied entry. For now this consistes of - * loading the type and index of the entry into the first - * three bytes of the image (if it is long enough -- if not - * just load the low order byte of the index into the first - * byte of the image). - * - * The helper functions verify that the correct version of - * serialize is being called, and then call serialize - * proper. - * - * Return: SUCCEED if successful, FAIL otherwise. - * - * Programmer: John Mainzer - * 9/19/07 - * - *------------------------------------------------------------------------- - */ - -herr_t -serialize(haddr_t addr, size_t len, void * image_ptr, void * thing, - unsigned * flags_ptr, haddr_t * new_addr_ptr, size_t * new_len_ptr, - void ** new_image_ptr_ptr) -{ - const char * fcn_name = "serialize()"; - char * char_ptr; - hbool_t verbose = FALSE; - herr_t ret_val = SUCCEED; - int32_t i; - int32_t type; - int32_t idx; - test_entry_t * entry_ptr; - test_entry_t * base_addr; - - if ( verbose ) { - - HDfprintf(stdout, "%s: addr = 0x%lx, len = %ld.\n", fcn_name, - (long)addr, (long)len); - } - - HDassert( image_ptr ); - HDassert( thing ); - HDassert( flags_ptr ); - - *flags_ptr = 0; - - HDassert( new_addr_ptr ); - HDassert( new_len_ptr ); - HDassert( new_image_ptr_ptr ); - - entry_ptr = (test_entry_t *)thing; - - HDassert( entry_ptr->self == entry_ptr ); - HDassert( entry_ptr->addr == addr ); - HDassert( entry_ptr->size == len ); - - /* shouldn't serialize the entry unless it is dirty */ - HDassert( entry_ptr->is_dirty ); - - type = entry_ptr->type; - idx = entry_ptr->index; - - HDassert( ( type >= 0 ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); - HDassert( ( idx >= 0 ) && ( idx <= max_indices2[type] ) ); - - base_addr = entries2[type]; - - HDassert( entry_ptr == &(base_addr[idx]) ); - - HDassert( entry_ptr->num_flush_ops >= 0 ); - HDassert( entry_ptr->num_flush_ops < MAX_FLUSH_OPS ); - - if ( entry_ptr->num_flush_ops > 0 ) { - - for ( i = 0; i < entry_ptr->num_flush_ops; i++ ) - { - HDassert( entry_ptr->file_ptr ); - - execute_flush_op2(entry_ptr->file_ptr, - entry_ptr, - &((entry_ptr->flush_ops)[i]), - flags_ptr); - } - entry_ptr->num_flush_ops = 0; - entry_ptr->flush_op_self_resize_in_progress = FALSE; - - /* This looks wrong, but it isn't -- *flags_ptr will be modified - * by execute_flush_op2() only if the target is this entry -- - * and the flags set will accumulate over the set of calls in - * the for loop. - */ - - if ( ( pass2 ) && - ( ((*flags_ptr) & H5C2__SERIALIZE_RESIZED_FLAG) != 0 ) ) { - - /* re-allocate *image_ptr, and place the new pointer in - * *new_image_ptr_ptr. - */ - image_ptr = H5MM_xfree(image_ptr); - - if ( image_ptr != NULL ) { - - ret_val = FAIL; - pass2 = FALSE; - failure_mssg2 = "couldn't free image_ptr."; - } - - if ( pass2 ) { - - HDassert( entry_ptr->type == VARIABLE_ENTRY_TYPE ); - HDassert( entry_ptr->size > 0 ); - HDassert( entry_ptr->size <= VARIABLE_ENTRY_SIZE ); - - image_ptr = H5MM_malloc((size_t)(entry_ptr->size)); - - if ( image_ptr == NULL ) { - - ret_val = FAIL; - pass2 = FALSE; - failure_mssg2 = "couldn't allocate new image."; - - } else { - - *new_image_ptr_ptr = image_ptr; - *new_len_ptr = entry_ptr->size; - len = entry_ptr->size; - - } - } - } - - if ( ((*flags_ptr) & H5C2__SERIALIZE_RENAMED_FLAG) != 0 ) { - - HDassert( ((*flags_ptr) | H5C2__SERIALIZE_RESIZED_FLAG) != 0 ); - - /* place the new address in *new_addr_ptr */ - - *new_addr_ptr = entry_ptr->addr; - } - } - - /* null out the image to avoid spurious failures */ - HDmemset(image_ptr, 0, len); - - if ( ( type == PICO_ENTRY_TYPE ) || ( type == VARIABLE_ENTRY_TYPE ) ) { - - HDassert( entry_ptr->size >= PICO_ENTRY_SIZE ); - *((char *)image_ptr) = (char)((entry_ptr->index) & 0xFF); - - } else { - - HDassert(entry_ptr->size >= NANO_ENTRY_SIZE ); - *((char *)image_ptr) = (char)((entry_ptr->type) & 0xFF); - *(((char *)image_ptr) + 1) = - (char)(((entry_ptr->index) & 0xFF00) >> 8); - *(((char *)image_ptr) + 2) = (char)((entry_ptr->index) & 0xFF); - - } - - /* We no longer do the actual write through an callback -- this is - * as close to that callback as we will get. Hence mark the entry - * clean here. If all goes well, it will be flushed shortly. - */ - - entry_ptr->is_dirty = FALSE; - - /* since the entry is about to be written to disk, we can mark it - * as initialized. - */ - if ( entry_ptr->at_main_addr ) { - entry_ptr->written_to_main_addr = TRUE; - } else { - entry_ptr->written_to_alt_addr = TRUE; - } - - /* do book keeping */ - (entry_ptr->serializes)++; - entry_ptr->serialized = TRUE; - - return(SUCCEED); - -} /* serialize() */ - -herr_t -pico_serialize(const H5F_t UNUSED *f, hid_t UNUSED dxpl_id, haddr_t addr, - size_t len, void * image_ptr, void * thing, unsigned * flags_ptr, - haddr_t * new_addr_ptr, size_t * new_len_ptr, void ** new_image_ptr_ptr) -{ - HDassert( ((test_entry_t *)thing)->type == PICO_ENTRY_TYPE ); - return(serialize(addr, len, image_ptr, thing, flags_ptr, - new_addr_ptr, new_len_ptr, new_image_ptr_ptr)); -} - -herr_t -nano_serialize(const H5F_t UNUSED *f, hid_t UNUSED dxpl_id, haddr_t addr, - size_t len, void * image_ptr, void * thing, unsigned * flags_ptr, - haddr_t * new_addr_ptr, size_t * new_len_ptr, void ** new_image_ptr_ptr) -{ - HDassert( ((test_entry_t *)thing)->type == NANO_ENTRY_TYPE ); - return(serialize(addr, len, image_ptr, thing, flags_ptr, - new_addr_ptr, new_len_ptr, new_image_ptr_ptr)); -} - -herr_t -micro_serialize(const H5F_t UNUSED *f, hid_t UNUSED dxpl_id, haddr_t addr, - size_t len, void * image_ptr, void * thing, unsigned * flags_ptr, - haddr_t * new_addr_ptr, size_t * new_len_ptr, void ** new_image_ptr_ptr) -{ - HDassert( ((test_entry_t *)thing)->type == MICRO_ENTRY_TYPE ); - return(serialize(addr, len, image_ptr, thing, flags_ptr, - new_addr_ptr, new_len_ptr, new_image_ptr_ptr)); -} - -herr_t -tiny_serialize(const H5F_t UNUSED *f, hid_t UNUSED dxpl_id, haddr_t addr, - size_t len, void * image_ptr, void * thing, unsigned * flags_ptr, - haddr_t * new_addr_ptr, size_t * new_len_ptr, void ** new_image_ptr_ptr) -{ - HDassert( ((test_entry_t *)thing)->type == TINY_ENTRY_TYPE ); - return(serialize(addr, len, image_ptr, thing, flags_ptr, - new_addr_ptr, new_len_ptr, new_image_ptr_ptr)); -} - -herr_t -small_serialize(const H5F_t UNUSED *f, hid_t UNUSED dxpl_id, haddr_t addr, - size_t len, void * image_ptr, void * thing, unsigned * flags_ptr, - haddr_t * new_addr_ptr, size_t * new_len_ptr, void ** new_image_ptr_ptr) -{ - HDassert( ((test_entry_t *)thing)->type == SMALL_ENTRY_TYPE ); - return(serialize(addr, len, image_ptr, thing, flags_ptr, - new_addr_ptr, new_len_ptr, new_image_ptr_ptr)); -} - -herr_t -medium_serialize(const H5F_t UNUSED *f, hid_t UNUSED dxpl_id, haddr_t addr, - size_t len, void * image_ptr, void * thing, unsigned * flags_ptr, - haddr_t * new_addr_ptr, size_t * new_len_ptr, void ** new_image_ptr_ptr) -{ - HDassert( ((test_entry_t *)thing)->type == MEDIUM_ENTRY_TYPE ); - return(serialize(addr, len, image_ptr, thing, flags_ptr, - new_addr_ptr, new_len_ptr, new_image_ptr_ptr)); -} - -herr_t -large_serialize(const H5F_t UNUSED *f, hid_t UNUSED dxpl_id, haddr_t addr, - size_t len, void * image_ptr, void * thing, unsigned * flags_ptr, - haddr_t * new_addr_ptr, size_t * new_len_ptr, void ** new_image_ptr_ptr) -{ - HDassert( ((test_entry_t *)thing)->type == LARGE_ENTRY_TYPE ); - return(serialize(addr, len, image_ptr, thing, flags_ptr, - new_addr_ptr, new_len_ptr, new_image_ptr_ptr)); -} - -herr_t -huge_serialize(const H5F_t UNUSED *f, hid_t UNUSED dxpl_id, haddr_t addr, - size_t len, void * image_ptr, void * thing, unsigned * flags_ptr, - haddr_t * new_addr_ptr, size_t * new_len_ptr, void ** new_image_ptr_ptr) -{ - HDassert( ((test_entry_t *)thing)->type == HUGE_ENTRY_TYPE ); - return(serialize(addr, len, image_ptr, thing, flags_ptr, - new_addr_ptr, new_len_ptr, new_image_ptr_ptr)); -} - -herr_t -monster_serialize(const H5F_t UNUSED *f, hid_t UNUSED dxpl_id, haddr_t addr, - size_t len, void * image_ptr, void * thing, unsigned * flags_ptr, - haddr_t * new_addr_ptr, size_t * new_len_ptr, void ** new_image_ptr_ptr) -{ - HDassert( ((test_entry_t *)thing)->type == MONSTER_ENTRY_TYPE ); - return(serialize(addr, len, image_ptr, thing, flags_ptr, - new_addr_ptr, new_len_ptr, new_image_ptr_ptr)); -} - -herr_t -variable_serialize(const H5F_t UNUSED *f, hid_t UNUSED dxpl_id, haddr_t addr, - size_t len, void * image_ptr, void * thing, unsigned * flags_ptr, - haddr_t * new_addr_ptr, size_t * new_len_ptr, void ** new_image_ptr_ptr) -{ - HDassert( ((test_entry_t *)thing)->type == VARIABLE_ENTRY_TYPE ); - return(serialize(addr, len, image_ptr, thing, flags_ptr, - new_addr_ptr, new_len_ptr, new_image_ptr_ptr)); -} - - -/*------------------------------------------------------------------------- - * Function: free_icr & friends - * - * Purpose: Nominally, this callback is supposed to free the - * in core representation of the entry. - * - * In the context of this test bed, we use it to do - * do all the processing we used to do on a destroy. - * In particular, we use it to release all the pins - * that this entry may have on other entries. - * - * The helper functions verify that the correct version of - * serialize is being called, and then call free_icr - * proper. - * - * Return: SUCCEED - * - * Programmer: John Mainzer - * 9/19/07 - * - *------------------------------------------------------------------------- - */ - -herr_t -free_icr(test_entry_t *entry_ptr) -{ - test_entry_t * base_addr; - - HDassert( entry_ptr ); - - base_addr = entries2[entry_ptr->type]; - - HDassert( entry_ptr->index >= 0 ); - HDassert( entry_ptr->index <= max_indices2[entry_ptr->type] ); - HDassert( entry_ptr == &(base_addr[entry_ptr->index]) ); - HDassert( entry_ptr == entry_ptr->self ); - HDassert( entry_ptr->cache_ptr != NULL ); - HDassert( entry_ptr->cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - HDassert( ( entry_ptr->header.destroy_in_progress ) || - ( entry_ptr->header.addr == entry_ptr->addr ) ); - HDassert( entry_ptr->header.size == entry_ptr->size ); - HDassert( ( entry_ptr->type == VARIABLE_ENTRY_TYPE ) || - ( entry_ptr->size == entry_sizes2[entry_ptr->type] ) ); - HDassert( !(entry_ptr->is_dirty) ); - HDassert( !(entry_ptr->header.is_dirty) ); - - if ( entry_ptr->num_pins > 0 ) { - int i; - - for ( i = 0; i < entry_ptr->num_pins; i++ ) { - test_entry_t * pinned_entry_ptr; - test_entry_t * pinned_base_addr; - - pinned_base_addr = entries2[entry_ptr->pin_type[i]]; - pinned_entry_ptr = &(pinned_base_addr[entry_ptr->pin_idx[i]]); - - HDassert( 0 <= pinned_entry_ptr->type ); - HDassert( pinned_entry_ptr->type < NUMBER_OF_ENTRY_TYPES ); - HDassert( pinned_entry_ptr->type == entry_ptr->pin_type[i] ); - HDassert( pinned_entry_ptr->index >= 0 ); - HDassert( pinned_entry_ptr->index <= - max_indices2[pinned_entry_ptr->type] ); - HDassert( pinned_entry_ptr->index == entry_ptr->pin_idx[i] ); - HDassert( pinned_entry_ptr == pinned_entry_ptr->self ); - HDassert( pinned_entry_ptr->header.is_pinned ); - HDassert( pinned_entry_ptr->is_pinned ); - HDassert( pinned_entry_ptr->pinning_ref_count > 0 ); - - pinned_entry_ptr->pinning_ref_count--; - - if ( pinned_entry_ptr->pinning_ref_count <= 0 ) { - - HDassert( pinned_entry_ptr->file_ptr ); - - unpin_entry2(pinned_entry_ptr->file_ptr, - pinned_entry_ptr->type, - pinned_entry_ptr->index); - } - - entry_ptr->pin_type[i] = -1; - entry_ptr->pin_idx[i] = -1; - } - entry_ptr->num_pins = 0; - } - - entry_ptr->destroyed = TRUE; - entry_ptr->cache_ptr = NULL; - - return(SUCCEED); - -} /* free_icr() */ - -herr_t -pico_free_icr(haddr_t addr, size_t len, void * thing) -{ - test_entry_t * entry_ptr = (test_entry_t *)thing; - - HDassert( entry_ptr->addr == addr ); - HDassert( entry_ptr->size == len ); - HDassert( entry_ptr->type == PICO_ENTRY_TYPE ); - - return(free_icr(entry_ptr)); -} - -herr_t -nano_free_icr(haddr_t addr, size_t len, void * thing) -{ - test_entry_t * entry_ptr = (test_entry_t *)thing; - - HDassert( entry_ptr->addr == addr ); - HDassert( entry_ptr->size == len ); - HDassert( entry_ptr->type == NANO_ENTRY_TYPE ); - - return(free_icr(entry_ptr)); -} - -herr_t -micro_free_icr(haddr_t addr, size_t len, void * thing) -{ - test_entry_t * entry_ptr = (test_entry_t *)thing; - - HDassert( entry_ptr->addr == addr ); - HDassert( entry_ptr->size == len ); - HDassert( entry_ptr->type == MICRO_ENTRY_TYPE ); - - return(free_icr(entry_ptr)); -} - -herr_t -tiny_free_icr(haddr_t addr, size_t len, void * thing) -{ - test_entry_t * entry_ptr = (test_entry_t *)thing; - - HDassert( entry_ptr->addr == addr ); - HDassert( entry_ptr->size == len ); - HDassert( entry_ptr->type == TINY_ENTRY_TYPE ); - - return(free_icr(entry_ptr)); -} - -herr_t -small_free_icr(haddr_t addr, size_t len, void * thing) -{ - test_entry_t * entry_ptr = (test_entry_t *)thing; - - HDassert( entry_ptr->addr == addr ); - HDassert( entry_ptr->size == len ); - HDassert( entry_ptr->type == SMALL_ENTRY_TYPE ); - - return(free_icr(entry_ptr)); -} - -herr_t -medium_free_icr(haddr_t addr, size_t len, void * thing) -{ - test_entry_t * entry_ptr = (test_entry_t *)thing; - - HDassert( entry_ptr->addr == addr ); - HDassert( entry_ptr->size == len ); - HDassert( entry_ptr->type == MEDIUM_ENTRY_TYPE ); - - return(free_icr(entry_ptr)); -} - -herr_t -large_free_icr(haddr_t addr, size_t len, void * thing) -{ - test_entry_t * entry_ptr = (test_entry_t *)thing; - - HDassert( entry_ptr->addr == addr ); - HDassert( entry_ptr->size == len ); - HDassert( entry_ptr->type == LARGE_ENTRY_TYPE ); - - return(free_icr(entry_ptr)); -} - -herr_t -huge_free_icr(haddr_t addr, size_t len, void * thing) -{ - test_entry_t * entry_ptr = (test_entry_t *)thing; - - HDassert( entry_ptr->addr == addr ); - HDassert( entry_ptr->size == len ); - HDassert( entry_ptr->type == HUGE_ENTRY_TYPE ); - - return(free_icr(entry_ptr)); -} - -herr_t -monster_free_icr(haddr_t addr, size_t len, void * thing) -{ - test_entry_t * entry_ptr = (test_entry_t *)thing; - - HDassert( entry_ptr->addr == addr ); - HDassert( entry_ptr->size == len ); - HDassert( entry_ptr->type == MONSTER_ENTRY_TYPE ); - - return(free_icr(entry_ptr)); -} - -herr_t -variable_free_icr(haddr_t addr, size_t len, void * thing) -{ - test_entry_t * entry_ptr = (test_entry_t *)thing; - - HDassert( entry_ptr->addr == addr ); - HDassert( entry_ptr->size == len ); - HDassert( entry_ptr->type == VARIABLE_ENTRY_TYPE ); - - return(free_icr(entry_ptr)); -} - - -/*------------------------------------------------------------------------- - * Function: clear_dirty_bits & friends - * - * Purpose: Clear the dirty bits. The helper functions verify that the - * correct version of clear_dirty_gits is being called, and - * then call clear_dirty_bits() proper. - * - * Return: SUCCEED - * - * Programmer: John Mainzer - * 9/20/07 - * - *------------------------------------------------------------------------- - */ - -herr_t -clear_dirty_bits(test_entry_t * entry_ptr) -{ - test_entry_t * base_addr; - - HDassert( entry_ptr ); - - base_addr = entries2[entry_ptr->type]; - - HDassert( entry_ptr->index >= 0 ); - HDassert( entry_ptr->index <= max_indices2[entry_ptr->type] ); - HDassert( entry_ptr == &(base_addr[entry_ptr->index]) ); - HDassert( entry_ptr == entry_ptr->self ); - HDassert( entry_ptr->header.addr == entry_ptr->addr ); - HDassert( entry_ptr->header.size == entry_ptr->size ); - HDassert( ( entry_ptr->type == VARIABLE_ENTRY_TYPE ) || - ( entry_ptr->size == entry_sizes2[entry_ptr->type] ) ); - - entry_ptr->is_dirty = FALSE; - - entry_ptr->cleared = TRUE; - - return(SUCCEED); - -} /* clear_dirty_bits() */ - -herr_t -pico_clear_dirty_bits(haddr_t addr, size_t len, void * thing) -{ - test_entry_t * entry_ptr = (test_entry_t *)thing; - - HDassert( entry_ptr->addr == addr ); - HDassert( entry_ptr->size == len ); - HDassert( entry_ptr->type == PICO_ENTRY_TYPE ); - - return(clear_dirty_bits(entry_ptr)); -} - -herr_t -nano_clear_dirty_bits(haddr_t addr, size_t len, void * thing) -{ - test_entry_t * entry_ptr = (test_entry_t *)thing; - - HDassert( entry_ptr->addr == addr ); - HDassert( entry_ptr->size == len ); - HDassert( entry_ptr->type == NANO_ENTRY_TYPE ); - - return(clear_dirty_bits(entry_ptr)); -} - -herr_t -micro_clear_dirty_bits(haddr_t addr, size_t len, void * thing) -{ - test_entry_t * entry_ptr = (test_entry_t *)thing; - - HDassert( entry_ptr->addr == addr ); - HDassert( entry_ptr->size == len ); - HDassert( entry_ptr->type == MICRO_ENTRY_TYPE ); - - return(clear_dirty_bits(entry_ptr)); -} - -herr_t -tiny_clear_dirty_bits(haddr_t addr, size_t len, void * thing) -{ - test_entry_t * entry_ptr = (test_entry_t *)thing; - - HDassert( entry_ptr->addr == addr ); - HDassert( entry_ptr->size == len ); - HDassert( entry_ptr->type == TINY_ENTRY_TYPE ); - - return(clear_dirty_bits(entry_ptr)); -} - -herr_t -small_clear_dirty_bits(haddr_t addr, size_t len, void * thing) -{ - test_entry_t * entry_ptr = (test_entry_t *)thing; - - HDassert( entry_ptr->addr == addr ); - HDassert( entry_ptr->size == len ); - HDassert( entry_ptr->type == SMALL_ENTRY_TYPE ); - - return(clear_dirty_bits(entry_ptr)); -} - -herr_t -medium_clear_dirty_bits(haddr_t addr, size_t len, void * thing) -{ - test_entry_t * entry_ptr = (test_entry_t *)thing; - - HDassert( entry_ptr->addr == addr ); - HDassert( entry_ptr->size == len ); - HDassert( entry_ptr->type == MEDIUM_ENTRY_TYPE ); - - return(clear_dirty_bits(entry_ptr)); -} - -herr_t -large_clear_dirty_bits(haddr_t addr, size_t len, void * thing) -{ - test_entry_t * entry_ptr = (test_entry_t *)thing; - - HDassert( entry_ptr->addr == addr ); - HDassert( entry_ptr->size == len ); - HDassert( entry_ptr->type == LARGE_ENTRY_TYPE ); - - return(clear_dirty_bits(entry_ptr)); -} - -herr_t -huge_clear_dirty_bits(haddr_t addr, size_t len, void * thing) -{ - test_entry_t * entry_ptr = (test_entry_t *)thing; - - HDassert( entry_ptr->addr == addr ); - HDassert( entry_ptr->size == len ); - HDassert( entry_ptr->type == HUGE_ENTRY_TYPE ); - - return(clear_dirty_bits(entry_ptr)); -} - -herr_t -monster_clear_dirty_bits(haddr_t addr, size_t len, void * thing) -{ - test_entry_t * entry_ptr = (test_entry_t *)thing; - - HDassert( entry_ptr->addr == addr ); - HDassert( entry_ptr->size == len ); - HDassert( entry_ptr->type == MONSTER_ENTRY_TYPE ); - - return(clear_dirty_bits(entry_ptr)); -} - -herr_t -variable_clear_dirty_bits(haddr_t addr, size_t len, void * thing) -{ - test_entry_t * entry_ptr = (test_entry_t *)thing; - - HDassert( entry_ptr->addr == addr ); - HDassert( entry_ptr->size == len ); - HDassert( entry_ptr->type == VARIABLE_ENTRY_TYPE ); - - return(clear_dirty_bits(entry_ptr)); -} - - -/**************************************************************************/ -/**************************************************************************/ -/************************** test utility functions: ***********************/ -/**************************************************************************/ -/**************************************************************************/ - -/*------------------------------------------------------------------------- - * Function: add_flush_op2 - * - * Purpose: Do nothing if pass2 is FALSE on entry. - * - * Otherwise, add the specified flush operation to the - * target instance of test_entry_t. - * - * Return: void - * - * Programmer: John Mainzer - * 9/1/06 - * - *------------------------------------------------------------------------- - */ - -void -add_flush_op2(int target_type, - int target_idx, - int op_code, - int type, - int idx, - hbool_t flag, - size_t new_size) -{ - int i; - test_entry_t * target_base_addr; - test_entry_t * target_entry_ptr; - - HDassert( ( 0 <= target_type ) && ( target_type < NUMBER_OF_ENTRY_TYPES ) ); - HDassert( ( 0 <= target_idx ) && - ( target_idx <= max_indices2[target_type] ) ); - HDassert( ( 0 <= op_code ) && ( op_code <= FLUSH_OP__MAX_OP ) ); - HDassert( ( op_code != FLUSH_OP__RESIZE ) || - ( type == VARIABLE_ENTRY_TYPE ) ); - HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); - HDassert( ( 0 <= idx ) && ( idx <= max_indices2[type] ) ); - HDassert( ( flag == TRUE ) || ( flag == FALSE ) ); - HDassert( new_size <= VARIABLE_ENTRY_SIZE ); - - if ( pass2 ) { - - target_base_addr = entries2[target_type]; - target_entry_ptr = &(target_base_addr[target_idx]); - - HDassert( target_entry_ptr->index == target_idx ); - HDassert( target_entry_ptr->type == target_type ); - HDassert( target_entry_ptr == target_entry_ptr->self ); - HDassert( target_entry_ptr->num_flush_ops < MAX_FLUSH_OPS ); - - i = (target_entry_ptr->num_flush_ops)++; - (target_entry_ptr->flush_ops)[i].op_code = op_code; - (target_entry_ptr->flush_ops)[i].type = type; - (target_entry_ptr->flush_ops)[i].idx = idx; - (target_entry_ptr->flush_ops)[i].flag = flag; - (target_entry_ptr->flush_ops)[i].size = new_size; - - } - - return; - -} /* add_flush_op2() */ - - -/*------------------------------------------------------------------------- - * Function: create_pinned_entry_dependency2 - * - * Purpose: Do nothing if pass2 is FALSE on entry. - * - * Otherwise, set up a pinned entry dependency so we can - * test the pinned entry modifications to the flush routine. - * - * Given the types and indicies of the pinned and pinning - * entries, add the pinned entry to the list of pinned - * entries in the pinning entry, increment the - * pinning reference count of the pinned entry, and - * if that count was zero initially, pin the entry. - * - * Return: void - * - * Programmer: John Mainzer - * 6/10/04 - * - *------------------------------------------------------------------------- - */ - -void -create_pinned_entry_dependency2(H5F_t * file_ptr, - int pinning_type, - int pinning_idx, - int pinned_type, - int pinned_idx) -{ - test_entry_t * pinning_base_addr; - test_entry_t * pinning_entry_ptr; - test_entry_t * pinned_base_addr; - test_entry_t * pinned_entry_ptr; - - if ( pass2 ) { - - HDassert( ( 0 <= pinning_type ) && - ( pinning_type < NUMBER_OF_ENTRY_TYPES ) ); - HDassert( ( 0 <= pinning_idx ) && - ( pinning_idx <= max_indices2[pinning_type] ) ); - HDassert( ( 0 <= pinned_type ) && - ( pinned_type < NUMBER_OF_ENTRY_TYPES ) ); - HDassert( ( 0 <= pinned_idx ) && - ( pinned_idx <= max_indices2[pinned_type] ) ); - - pinning_base_addr = entries2[pinning_type]; - pinning_entry_ptr = &(pinning_base_addr[pinning_idx]); - - pinned_base_addr = entries2[pinned_type]; - pinned_entry_ptr = &(pinned_base_addr[pinned_idx]); - - HDassert( pinning_entry_ptr->index == pinning_idx ); - HDassert( pinning_entry_ptr->type == pinning_type ); - HDassert( pinning_entry_ptr == pinning_entry_ptr->self ); - HDassert( pinning_entry_ptr->num_pins < MAX_PINS ); - - HDassert( pinning_entry_ptr->index == pinning_idx ); - HDassert( pinning_entry_ptr->type == pinning_type ); - HDassert( pinning_entry_ptr == pinning_entry_ptr->self ); - HDassert( ! ( pinning_entry_ptr->is_protected ) ); - - pinning_entry_ptr->pin_type[pinning_entry_ptr->num_pins] = pinned_type; - pinning_entry_ptr->pin_idx[pinning_entry_ptr->num_pins] = pinned_idx; - (pinning_entry_ptr->num_pins)++; - - if ( pinned_entry_ptr->pinning_ref_count == 0 ) { - - protect_entry2(file_ptr, pinned_type, pinned_idx); - unprotect_entry2(file_ptr, pinned_type, pinned_idx, FALSE, - H5C2__PIN_ENTRY_FLAG); - } - - (pinned_entry_ptr->pinning_ref_count)++; - } - - return; - -} /* create_pinned_entry_dependency2() */ - - -/*------------------------------------------------------------------------- - * Function: dirty_entry2 - * - * Purpose: Given a pointer to a cache, an entry type, and an index, - * dirty the target entry. - * - * If the dirty_pin parameter is true, verify that the - * target entry is in the cache and is pinned. If it - * isn't, scream and die. If it is, use the - * H5C2_mark_pinned_entry_dirty() call to dirty it. - * - * Do nothing if pass2 is false on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 6/10/04 - * - *------------------------------------------------------------------------- - */ - -void -dirty_entry2(H5F_t * file_ptr, - int32_t type, - int32_t idx, - hbool_t dirty_pin) -{ - H5C2_t * cache_ptr; - test_entry_t * base_addr; - test_entry_t * entry_ptr; - - if ( pass2 ) { - - cache_ptr = file_ptr->shared->cache2; - - HDassert( cache_ptr ); - HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); - HDassert( ( 0 <= idx ) && ( idx <= max_indices2[type] ) ); - - if ( dirty_pin ) { - - if ( ! entry_in_cache2(cache_ptr, type, idx) ) { - - pass2 = FALSE; - failure_mssg2 = "entry to be dirty pinned is not in cache."; - - } else { - - base_addr = entries2[type]; - entry_ptr = &(base_addr[idx]); - - HDassert( entry_ptr->index == idx ); - HDassert( entry_ptr->type == type ); - HDassert( entry_ptr == entry_ptr->self ); - - if ( ! ( (entry_ptr->header).is_pinned ) ) { - - pass2 = FALSE; - failure_mssg2 = "entry to be dirty pinned is not pinned."; - - } else { - - mark_pinned_entry_dirty2(file_ptr, type, idx, - FALSE, (size_t)0); - - } - } - } else { - - protect_entry2(file_ptr, type, idx); - unprotect_entry2(file_ptr, type, idx, TRUE, H5C2__NO_FLAGS_SET); - } - } - - return; - -} /* dirty_entry2() */ - - -/*------------------------------------------------------------------------- - * Function: execute_flush_op2 - * - * Purpose: Given a pointer to an instance of struct flush_op, execute - * it. - * - * Do nothing if pass2 is false on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 9/1/06 - * - *------------------------------------------------------------------------- - */ - -void -execute_flush_op2(H5F_t * file_ptr, - struct test_entry_t * entry_ptr, - struct flush_op * op_ptr, - unsigned * flags_ptr) -{ - /* const char * fcn_name = "execute_flush_op2()"; */ - H5C2_t * cache_ptr; - - if ( pass2 ) { - - cache_ptr = file_ptr->shared->cache2; - HDassert( cache_ptr != NULL ); - HDassert( cache_ptr->magic == H5C2__H5C2_T_MAGIC ); - HDassert( entry_ptr != NULL ); - HDassert( entry_ptr = entry_ptr->self ); - HDassert( entry_ptr->header.addr == entry_ptr->addr ); - HDassert( ( entry_ptr->flush_op_self_resize_in_progress ) || - ( entry_ptr->header.size == entry_ptr->size ) ); - HDassert( op_ptr != NULL ); - HDassert( ( 0 <= entry_ptr->type ) && - ( entry_ptr->type < NUMBER_OF_ENTRY_TYPES ) ); - HDassert( ( 0 <= entry_ptr->index ) && - ( entry_ptr->index <= max_indices2[entry_ptr->type] ) ); - HDassert( ( 0 <= op_ptr->type ) && - ( op_ptr->type < NUMBER_OF_ENTRY_TYPES ) ); - HDassert( ( 0 <= op_ptr->idx ) && - ( op_ptr->idx <= max_indices2[op_ptr->type] ) ); - HDassert( ( op_ptr->flag == FALSE ) || ( op_ptr->flag == TRUE ) ); - HDassert( flags_ptr != NULL ); - - switch ( op_ptr->op_code ) - { - case FLUSH_OP__NO_OP: - break; - - case FLUSH_OP__DIRTY: - HDassert( ( entry_ptr->type != op_ptr->type ) || - ( entry_ptr->index != op_ptr->idx ) ); - - dirty_entry2(file_ptr, op_ptr->type, op_ptr->idx, - op_ptr->flag); - break; - - case FLUSH_OP__RESIZE: - if ( ( entry_ptr->type == op_ptr->type ) && - ( entry_ptr->index == op_ptr->idx ) ) { - - /* the flush operation is acting on the entry to - * which it is attached. Handle this here: - */ - HDassert( entry_ptr->type == VARIABLE_ENTRY_TYPE ); - HDassert( op_ptr->size > 0 ); - HDassert( op_ptr->size <= VARIABLE_ENTRY_SIZE ); - - entry_ptr->size = op_ptr->size; - - (*flags_ptr) |= H5C2__SERIALIZE_RESIZED_FLAG; - - entry_ptr->flush_op_self_resize_in_progress = TRUE; - - } else { - - /* change the size of some other entry */ - - resize_entry2(file_ptr, op_ptr->type, op_ptr->idx, - op_ptr->size, op_ptr->flag); - } - break; - - case FLUSH_OP__RENAME: - if ( ( entry_ptr->type == op_ptr->type ) && - ( entry_ptr->index == op_ptr->idx ) ) { - - /* the flush operation is acting on the entry to - * which it is attached. Handle this here: - */ - - HDassert( ((*flags_ptr) & H5C2__SERIALIZE_RESIZED_FLAG) - != 0 ); - - (*flags_ptr) |= H5C2__SERIALIZE_RENAMED_FLAG; - - if ( op_ptr->flag ) { - - HDassert( entry_ptr->addr == entry_ptr->alt_addr ); - entry_ptr->addr = entry_ptr->main_addr; - entry_ptr->at_main_addr = TRUE; - - } else { - - HDassert( entry_ptr->addr == entry_ptr->main_addr ); - entry_ptr->addr = entry_ptr->alt_addr; - entry_ptr->at_main_addr = FALSE; - - } - - } else { - - rename_entry2(cache_ptr, op_ptr->type, op_ptr->idx, - op_ptr->flag); - } - break; - - default: - pass2 = FALSE; - failure_mssg2 = "Undefined flush op code."; - break; - } - } - - return; - -} /* execute_flush_op2() */ - - -/*------------------------------------------------------------------------- - * Function: entry_in_cache2 - * - * Purpose: Given a pointer to a cache, an entry type, and an index, - * determine if the entry is currently in the cache. - * - * Return: TRUE if the entry is in the cache, and FALSE otherwise. - * - * Programmer: John Mainzer - * 6/10/04 - * - *------------------------------------------------------------------------- - */ - -hbool_t -entry_in_cache2(H5C2_t * cache_ptr, - int32_t type, - int32_t idx) -{ - hbool_t in_cache = FALSE; /* will set to TRUE if necessary */ - test_entry_t * base_addr; - test_entry_t * entry_ptr; - H5C2_cache_entry_t * test_ptr = NULL; - - HDassert( cache_ptr ); - HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); - HDassert( ( 0 <= idx ) && ( idx <= max_indices2[type] ) ); - - base_addr = entries2[type]; - entry_ptr = &(base_addr[idx]); - - HDassert( entry_ptr->index == idx ); - HDassert( entry_ptr->type == type ); - HDassert( entry_ptr == entry_ptr->self ); - - H5C2_TEST__SEARCH_INDEX(cache_ptr, entry_ptr->addr, test_ptr) - - if ( test_ptr != NULL ) { - - in_cache = TRUE; - HDassert( test_ptr == (H5C2_cache_entry_t *)entry_ptr ); - HDassert( entry_ptr->addr == entry_ptr->header.addr ); - } - - return(in_cache); - -} /* entry_in_cache2() */ - - -/*------------------------------------------------------------------------- - * Function: recommend_core_file_driver - * - * Purpose: Using the core file driver for test files allows us to avoid - * disk I/O, and thust offers the potential of speeding up - * tests. However, if the target system has insufficient - * physical memory to accomodate the test file, using the - * core file driver will actually slow the test down, as the - * target system will page fault continuously. - * - * The purpose of this function is to determine whether it - * makes sense to use the core file driver on this particular - * system. - * - * To do this, we need to determine a number of facts about - * the host system -- most particularly how much physical - * RAM it has. This information is not always available. - * If it is not, we assume the worst and report that using - * the core file driver would be ill advised. - * - * Return: TRUE If use of the core file driver seems a good idea. - * - * FALSE If available data on the host system suggests that - * user of the core file driver is ill advised, or - * if no information is available upon which to base - * a suggestion. - * - * Programmer: John Mainzer - * 1/13/09 - * - *------------------------------------------------------------------------- - */ - -hbool_t -recommend_core_file_driver(void) -{ - const char * fcn_name = "recommend_core_file_driver()"; - hbool_t core_file_driver_recomended = FALSE; - hbool_t verbose = FALSE; - unsigned long long free_ram = 0; - unsigned long long free_swap = 0; - unsigned long long physical_ram = 0; - - free_ram = H5_get_free_ram(); - free_swap = H5_get_free_swap(); - physical_ram = H5_get_physical_ram(); - - if ( ( physical_ram > ((((unsigned long long)MAX_ADDR) / 5) * 9) ) || - ( ( physical_ram > ((((unsigned long long)MAX_ADDR) / 2) * 3) ) && - ( ( ((unsigned long long)MAX_ADDR) < free_ram ) || - ( ((unsigned long long)MAX_ADDR) < free_swap ) ) ) ) { - - core_file_driver_recomended = TRUE; - } - - if ( verbose ) { - - HDfprintf(stdout, "%s: physical_ram = %lld\n", - fcn_name, (long long)physical_ram); - HDfprintf(stdout, "%s: free_ram = %lld\n", - fcn_name, (long long)free_ram); - HDfprintf(stdout, "%s: free_swap = %lld\n", - fcn_name, (long long)free_swap); - HDfprintf(stdout, "%s: MAX_ADDR = %lld\n", - fcn_name, (long long)MAX_ADDR); - HDfprintf(stdout, "%s: core_file_driver_recomended = %d\n", - fcn_name, (int)core_file_driver_recomended); - } - - return(core_file_driver_recomended); - -} /* recommend_core_file_driver() */ - - -/*------------------------------------------------------------------------- - * Function: reset_entries2 - * - * Purpose: reset the contents of the entries arrays to know values. - * - * Return: void - * - * Programmer: John Mainzer - * 6/10/04 - * - *------------------------------------------------------------------------- - */ - -void -reset_entries2(void) - -{ - int i; - int j; - int k; - int32_t max_index; - haddr_t addr = PICO_BASE_ADDR; - haddr_t alt_addr = PICO_ALT_BASE_ADDR; - size_t entry_size; - test_entry_t * base_addr; - - for ( i = 0; i < NUMBER_OF_ENTRY_TYPES; i++ ) - { - entry_size = entry_sizes2[i]; - max_index = max_indices2[i]; - base_addr = entries2[i]; - - HDassert( base_addr ); - - for ( j = 0; j <= max_index; j++ ) - { - /* one can argue that we should fill the header with garbage. - * If this is desired, we can simply comment out the header - * initialization - the headers will be full of garbage soon - * enough. - */ - - base_addr[j].header.addr = (haddr_t)0; - base_addr[j].header.size = (size_t)0; - base_addr[j].header.type = NULL; - base_addr[j].header.is_dirty = FALSE; - base_addr[j].header.is_protected = FALSE; - base_addr[j].header.is_read_only = FALSE; - base_addr[j].header.ro_ref_count = FALSE; - base_addr[j].header.next = NULL; - base_addr[j].header.prev = NULL; - base_addr[j].header.aux_next = NULL; - base_addr[j].header.aux_prev = NULL; - - base_addr[j].self = &(base_addr[j]); - base_addr[j].cache_ptr = NULL; - base_addr[j].written_to_main_addr = FALSE; - base_addr[j].written_to_alt_addr = FALSE; - base_addr[j].addr = addr; - base_addr[j].at_main_addr = TRUE; - base_addr[j].main_addr = addr; - base_addr[j].alt_addr = alt_addr; - base_addr[j].size = entry_size; - base_addr[j].type = i; - base_addr[j].index = j; - base_addr[j].serializes = 0; - base_addr[j].deserializes = 0; - base_addr[j].is_dirty = FALSE; - base_addr[j].is_protected = FALSE; - base_addr[j].is_read_only = FALSE; - base_addr[j].ro_ref_count = FALSE; - - base_addr[j].is_pinned = FALSE; - base_addr[j].pinning_ref_count = 0; - base_addr[j].num_pins = 0; - for ( k = 0; k < MAX_PINS; k++ ) - { - base_addr[j].pin_type[k] = -1; - base_addr[j].pin_idx[k] = -1; - } - - base_addr[j].num_flush_ops = 0; - for ( k = 0; k < MAX_FLUSH_OPS; k++ ) - { - base_addr[j].flush_ops[k].op_code = FLUSH_OP__NO_OP; - base_addr[j].flush_ops[k].type = -1; - base_addr[j].flush_ops[k].idx = -1; - base_addr[j].flush_ops[k].flag = FALSE; - base_addr[j].flush_ops[k].size = 0; - } - base_addr[j].flush_op_self_resize_in_progress = FALSE; - - base_addr[j].deserialized = FALSE; - base_addr[j].cleared = FALSE; - base_addr[j].serialized = FALSE; - base_addr[j].destroyed = FALSE; - - addr += (haddr_t)entry_size; - alt_addr += (haddr_t)entry_size; - } - } - - return; - -} /* reset_entries2() */ - - -/*------------------------------------------------------------------------- - * Function: resize_entry2 - * - * Purpose: Given a pointer to a cache, an entry type, an index, and - * a size, set the size of the target entry to the size. Note - * that at present, the type of the entry must be - * VARIABLE_ENTRY_TYPE. - * - * If the resize_pin parameter is true, verify that the - * target entry is in the cache and is pinned. If it - * isn't, scream and die. If it is, use the - * H5C2_mark_pinned_entry_dirty() call to resize it. - * - * Do nothing if pass2 is false on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 6/10/04 - * - *------------------------------------------------------------------------- - */ - -void -resize_entry2(H5F_t * file_ptr, - int32_t type, - int32_t idx, - size_t new_size, - hbool_t resize_pin) -{ - H5C2_t * cache_ptr; - test_entry_t * base_addr; - test_entry_t * entry_ptr; - - if ( pass2 ) { - - cache_ptr = file_ptr->shared->cache2; - - HDassert( cache_ptr ); - HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); - HDassert( type == VARIABLE_ENTRY_TYPE ); - HDassert( ( 0 <= idx ) && ( idx <= max_indices2[type] ) ); - HDassert( ( 0 < new_size ) && ( new_size <= entry_sizes2[type] ) ); - - base_addr = entries2[type]; - entry_ptr = &(base_addr[idx]); - - HDassert( entry_ptr->index == idx ); - HDassert( entry_ptr->type == type ); - HDassert( entry_ptr == entry_ptr->self ); - - if ( resize_pin ) { - - if ( ! entry_in_cache2(cache_ptr, type, idx) ) { - - pass2 = FALSE; - failure_mssg2 = "entry to be resized pinned is not in cache."; - - } else { - - if ( ! ( (entry_ptr->header).is_pinned ) ) { - - pass2 = FALSE; - failure_mssg2 = "entry to be resized pinned is not pinned."; - - } else { - - mark_pinned_entry_dirty2(file_ptr, type, idx, - TRUE, new_size); - } - } - } else { - - protect_entry2(file_ptr, type, idx); - unprotect_entry_with_size_change2(file_ptr, type, idx, - H5C2__SIZE_CHANGED_FLAG, new_size); - } - } - - return; - -} /* resize_entry2() */ - - -/*------------------------------------------------------------------------- - * Function: resize_pinned_entry2 - * - * Purpose: Given a pointer to a cache, an entry type, an index, and - * a new size, change the size of the target pinned entry - * to match the supplied new size. - * - * Do nothing if pass is false on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 1/11/08 - * - *------------------------------------------------------------------------- - */ - -void -resize_pinned_entry2(H5F_t * file_ptr, - int32_t type, - int32_t idx, - size_t new_size) -{ - H5C2_t * cache_ptr; - herr_t result; - test_entry_t * base_addr; - test_entry_t * entry_ptr; - - if ( pass2 ) { - - cache_ptr = file_ptr->shared->cache2; - HDassert( cache_ptr ); - HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); - HDassert( ( 0 <= idx ) && ( idx <= max_indices2[type] ) ); - HDassert( type == VARIABLE_ENTRY_TYPE ) ; - HDassert( ( 0 < new_size ) && ( new_size <= entry_sizes2[type] ) ); - - if ( ! entry_in_cache2(cache_ptr, type, idx) ) { - - pass2 = FALSE; - failure_mssg2 = "entry not in cache."; - - } else { - - base_addr = entries2[type]; - entry_ptr = &(base_addr[idx]); - - HDassert( entry_ptr->index == idx ); - HDassert( entry_ptr->type == type ); - HDassert( entry_ptr->cache_ptr == cache_ptr ); - HDassert( entry_ptr == entry_ptr->self ); - - if ( ! ( (entry_ptr->header).is_pinned ) ) { - - pass2 = FALSE; - failure_mssg2 = "entry to be resized is not pinned."; - - } else { - - entry_ptr->size = new_size; - - result = H5C2_resize_pinned_entry((void *)entry_ptr, - new_size); - entry_ptr->is_dirty = TRUE; - - if ( result != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "error(s) in H5C2_resize_pinned_entry()."; - - } else { - - HDassert( entry_ptr->size = (entry_ptr->header).size ); - - } - } - } - } - - return; - -} /* resize_pinned_entry() */ - - -/*------------------------------------------------------------------------- - * Function: verify_clean2 - * - * Purpose: Verify that all cache entries are marked as clean. If any - * are not, set pass2 to FALSE. - * - * Do nothing if pass2 is FALSE on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 6/10/04 - * - *------------------------------------------------------------------------- - */ - -void -verify_clean2(void) - -{ - int i; - int j; - int dirty_count = 0; - int32_t max_index; - test_entry_t * base_addr; - - if ( pass2 ) { - - for ( i = 0; i < NUMBER_OF_ENTRY_TYPES; i++ ) - { - max_index = max_indices2[i]; - base_addr = entries2[i]; - - HDassert( base_addr ); - - for ( j = 0; j <= max_index; j++ ) - { - if ( ( base_addr[j].header.is_dirty ) || - ( base_addr[j].is_dirty ) ) { - - dirty_count++; - } - } - } - - if ( dirty_count > 0 ) { - - pass2 = FALSE; - failure_mssg2 = "verify_clean2() found dirty entry(s)."; - } - } - - return; - -} /* verify_clean2() */ - - -/*------------------------------------------------------------------------- - * Function: verify_entry_status2 - * - * Purpose: Verify that a list of entries have the expected status. - * If any discrepencies are found, set the failure message - * and set pass2 to FALSE. - * - * Do nothing if pass2 is FALSE on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 10/8/04 - * - *------------------------------------------------------------------------- - */ - -void -verify_entry_status2(H5C2_t * cache_ptr, - int tag, - int num_entries, - struct expected_entry_status expected[]) -{ - static char msg[128]; - hbool_t in_cache = FALSE; /* will set to TRUE if necessary */ - int i; - test_entry_t * entry_ptr; - test_entry_t * base_addr; - - i = 0; - while ( ( pass2 ) && ( i < num_entries ) ) - { - base_addr = entries2[expected[i].entry_type]; - entry_ptr = &(base_addr[expected[i].entry_index]); - - if ( ( ! expected[i].in_cache ) && - ( ( expected[i].is_dirty ) || - ( expected[i].is_protected ) || - ( expected[i].is_pinned ) ) ) { - - pass2 = FALSE; - sprintf(msg, "%d: Contradictory data in expected[%d].\n", tag, i); - failure_mssg2 = msg; - } - - if ( pass2 ) { - - in_cache = entry_in_cache2(cache_ptr, expected[i].entry_type, - expected[i].entry_index); - - if ( in_cache != expected[i].in_cache ) { - - pass2 = FALSE; - sprintf(msg, - "%d entry (%d, %d) in cache actual/expected = %d/%d.\n", - tag, - (int)expected[i].entry_type, - (int)expected[i].entry_index, - (int)in_cache, - (int)expected[i].in_cache); - failure_mssg2 = msg; - } - } - - if ( pass2 ) { - - if ( entry_ptr->size != expected[i].size ) { - - pass2 = FALSE; - sprintf(msg, - "%d entry (%d, %d) size actualexpected = %ld/%ld.\n", - tag, - (int)expected[i].entry_type, - (int)expected[i].entry_index, - (long)(entry_ptr->size), - (long)expected[i].size); - failure_mssg2 = msg; - } - } - - if ( ( pass2 ) && ( in_cache ) ) { - - if ( entry_ptr->header.size != expected[i].size ) { - - pass2 = FALSE; - sprintf(msg, - "%d entry (%d, %d) header size actual/expected = %ld/%ld.\n", - tag, - (int)expected[i].entry_type, - (int)expected[i].entry_index, - (long)(entry_ptr->header.size), - (long)expected[i].size); - failure_mssg2 = msg; - } - } - - if ( pass2 ) { - - if ( entry_ptr->at_main_addr != expected[i].at_main_addr ) { - - pass2 = FALSE; - sprintf(msg, - "%d entry (%d, %d) at main addr actual/expected = %d/%d.\n", - tag, - (int)expected[i].entry_type, - (int)expected[i].entry_index, - (int)(entry_ptr->at_main_addr), - (int)expected[i].at_main_addr); - failure_mssg2 = msg; - } - } - - if ( pass2 ) { - - if ( entry_ptr->is_dirty != expected[i].is_dirty ) { - - pass2 = FALSE; - sprintf(msg, - "%d entry (%d, %d) is_dirty actual/expected = %d/%d.\n", - tag, - (int)expected[i].entry_type, - (int)expected[i].entry_index, - (int)(entry_ptr->is_dirty), - (int)expected[i].is_dirty); - failure_mssg2 = msg; - } - } - - if ( ( pass2 ) && ( in_cache ) ) { - - if ( entry_ptr->header.is_dirty != expected[i].is_dirty ) { - - pass2 = FALSE; - sprintf(msg, - "%d entry (%d, %d) header is_dirty actual/expected = %d/%d.\n", - tag, - (int)expected[i].entry_type, - (int)expected[i].entry_index, - (int)(entry_ptr->header.is_dirty), - (int)expected[i].is_dirty); - failure_mssg2 = msg; - } - } - - if ( pass2 ) { - - if ( entry_ptr->is_protected != expected[i].is_protected ) { - - pass2 = FALSE; - sprintf(msg, - "%d entry (%d, %d) is_protected actual/expected = %d/%d.\n", - tag, - (int)expected[i].entry_type, - (int)expected[i].entry_index, - (int)(entry_ptr->is_protected), - (int)expected[i].is_protected); - failure_mssg2 = msg; - } - } - - if ( ( pass2 ) && ( in_cache ) ) { - - if ( entry_ptr->header.is_protected != expected[i].is_protected ) { - - pass2 = FALSE; - sprintf(msg, - "%d entry (%d, %d) header is_protected actual/expected = %d/%d.\n", - tag, - (int)expected[i].entry_type, - (int)expected[i].entry_index, - (int)(entry_ptr->header.is_protected), - (int)expected[i].is_protected); - failure_mssg2 = msg; - } - } - - if ( pass2 ) { - - if ( entry_ptr->is_pinned != expected[i].is_pinned ) { - - pass2 = FALSE; - sprintf(msg, - "%d entry (%d, %d) is_pinned actual/expected = %d/%d.\n", - tag, - (int)expected[i].entry_type, - (int)expected[i].entry_index, - (int)(entry_ptr->is_pinned), - (int)expected[i].is_pinned); - failure_mssg2 = msg; - } - } - - if ( ( pass2 ) && ( in_cache ) ) { - - if ( entry_ptr->header.is_pinned != expected[i].is_pinned ) { - - pass2 = FALSE; - sprintf(msg, - "%d entry (%d, %d) header is_pinned actual/expected = %d/%d.\n", - tag, - (int)expected[i].entry_type, - (int)expected[i].entry_index, - (int)(entry_ptr->header.is_pinned), - (int)expected[i].is_pinned); - failure_mssg2 = msg; - } - } - - if ( pass2 ) { - - if ( ( entry_ptr->deserialized != expected[i].deserialized ) || - ( entry_ptr->cleared != expected[i].cleared ) || - ( entry_ptr->serialized != expected[i].serialized ) || - ( entry_ptr->destroyed != expected[i].destroyed ) ) { - - pass2 = FALSE; - sprintf(msg, - "%d entry (%d,%d) deserialized = %d(%d), clrd = %d(%d), serialized = %d(%d), dest = %d(%d)\n", - tag, - (int)expected[i].entry_type, - (int)expected[i].entry_index, - (int)(entry_ptr->deserialized), - (int)(expected[i].deserialized), - (int)(entry_ptr->cleared), - (int)(expected[i].cleared), - (int)(entry_ptr->serialized), - (int)(expected[i].serialized), - (int)(entry_ptr->destroyed), - (int)(expected[i].destroyed)); - failure_mssg2 = msg; - } - } - i++; - } /* while */ - - return; - -} /* verify_entry_status2() */ - - -/*------------------------------------------------------------------------- - * Function: verify_unprotected2 - * - * Purpose: Verify that no cache entries are marked as protected. If - * any are, set pass2 to FALSE. - * - * Do nothing if pass2 is FALSE on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 6/10/04 - * - *------------------------------------------------------------------------- - */ - -void -verify_unprotected2(void) - -{ - int i; - int j; - int protected_count = 0; - int32_t max_index; - test_entry_t * base_addr; - - if ( pass2 ) { - - for ( i = 0; i < NUMBER_OF_ENTRY_TYPES; i++ ) - { - max_index = max_indices2[i]; - base_addr = entries2[i]; - - HDassert( base_addr ); - - for ( j = 0; j <= max_index; j++ ) - { - HDassert( base_addr[j].header.is_protected == - base_addr[j].is_protected ); - - if ( ( base_addr[j].header.is_protected ) || - ( base_addr[j].is_protected ) ) { - - protected_count++; - } - } - } - - if ( protected_count > 0 ) { - - pass2 = FALSE; - failure_mssg2 = "verify_unprotected2() found protected entry(s)."; - } - } - - return; - -} /* verify_unprotected2() */ - - -/***************************************************************************** - * - * Function: setup_cache2() - * - * Purpose: Open an HDF file. This will allocate an instance and - * initialize an associated instance of H5C2_t. However, - * we want to test an instance of H5C2_t, so allocate and - * initialize one with the file ID returned by the call to - * H5Fcreate(). Return a pointer to this instance of H5C2_t. - * - * Observe that we open a HDF file because the cache now - * writes directly to file, and we need the file I/O facilities - * associated with the file. - * - * To avoid tripping on error check code, must allocate enough - * space in the file to hold all the test entries and their - * alternates. This is a little sticky, as the addresses of - * all the test entries are determined at compile time. - * - * Deal with this by choosing BASE_ADDR large enough that - * the base address of the allocate space will be less than - * or equal to BASE_ADDR, and then requesting an extra BASE_ADDR - * bytes, so we don't have to wory about exceeding the allocation. - * - * Return: Success: Ptr to H5C2_t - * - * Failure: NULL - * - * Programmer: JRM -- 9/13/07 - * - *****************************************************************************/ - -H5F_t * -setup_cache2(size_t max_cache_size, - size_t min_clean_size) -{ - const char * fcn_name = "setup_cache2()"; - char filename[512]; - hbool_t show_progress = FALSE; - hbool_t verbose = TRUE; - int mile_stone = 1; - hid_t fid = -1; - H5F_t * file_ptr = NULL; - H5C2_t * cache_ptr = NULL; - H5F_t * ret_val = NULL; - haddr_t actual_base_addr; - hid_t fapl_id = H5P_DEFAULT; - - if ( show_progress ) /* 1 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - saved_fid = -1; - -#if 0 /* This debugging code is useful from time to time -- keep it for now */ - HDfprintf(stdout, "PICO_BASE_ADDR = 0x%lx, PICO_ALT_BASE_ADDR = 0x%lx.\n", - (long)PICO_BASE_ADDR, (long)PICO_ALT_BASE_ADDR); - HDfprintf(stdout, "NANO_BASE_ADDR = 0x%lx, NANO_ALT_BASE_ADDR = 0x%lx.\n", - (long)NANO_BASE_ADDR, (long)NANO_ALT_BASE_ADDR); - HDfprintf(stdout, - "MICRO_BASE_ADDR = 0x%lx, MICRO_ALT_BASE_ADDR = 0x%lx.\n", - (long)MICRO_BASE_ADDR, (long)MICRO_ALT_BASE_ADDR); - HDfprintf(stdout, "TINY_BASE_ADDR = 0x%lx, TINY_ALT_BASE_ADDR = 0x%lx.\n", - (long)TINY_BASE_ADDR, (long)TINY_ALT_BASE_ADDR); - HDfprintf(stdout, - "SMALL_BASE_ADDR = 0x%lx, SMALL_ALT_BASE_ADDR = 0x%lx.\n", - (long)SMALL_BASE_ADDR, (long)SMALL_ALT_BASE_ADDR); - HDfprintf(stdout, - "MEDIUM_BASE_ADDR = 0x%lx, MEDIUM_ALT_BASE_ADDR = 0x%lx.\n", - (long)MEDIUM_BASE_ADDR, (long)MEDIUM_ALT_BASE_ADDR); - HDfprintf(stdout, - "LARGE_BASE_ADDR = 0x%lx, LARGE_ALT_BASE_ADDR = 0x%lx.\n", - (long)LARGE_BASE_ADDR, (long)LARGE_ALT_BASE_ADDR); - HDfprintf(stdout, "HUGE_BASE_ADDR = 0x%lx, HUGE_ALT_BASE_ADDR = 0x%lx.\n", - (long)HUGE_BASE_ADDR, (long)HUGE_ALT_BASE_ADDR); - HDfprintf(stdout, - "MONSTER_BASE_ADDR = 0x%lx, MONSTER_ALT_BASE_ADDR = 0x%lx.\n", - (long)MONSTER_BASE_ADDR, (long)MONSTER_ALT_BASE_ADDR); - HDfprintf(stdout, - "VARIABLE_BASE_ADDR = 0x%lx, VARIABLE_ALT_BASE_ADDR = 0x%lx.\n", - (long)VARIABLE_BASE_ADDR, (long)VARIABLE_ALT_BASE_ADDR); -#endif /* JRM */ - - /* setup the file name */ - if ( pass2 ) { - - if ( h5_fixname(FILENAME[0], H5P_DEFAULT, filename, sizeof(filename)) - == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed.\n"; - } - } - - if ( show_progress ) /* 2 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - if ( ( pass2 ) && ( try_core_file_driver ) ) { - - if ( (fapl_id = H5Pcreate(H5P_FILE_ACCESS)) == FAIL ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pcreate(H5P_FILE_ACCESS) failed.\n"; - } - else if ( H5Pset_fapl_core(fapl_id, MAX_ADDR, FALSE) < 0 ) { - - H5Pclose(fapl_id); - fapl_id = H5P_DEFAULT; - pass2 = FALSE; - failure_mssg2 = "H5P_set_fapl_core() failed.\n"; - } - else if ( (fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id)) - < 0 ) { - - core_file_driver_failed = TRUE; - - if ( verbose ) { - HDfprintf(stdout, "%s: H5Fcreate() with CFD failed.\n", fcn_name); - } - - } else { - - saved_fapl_id = fapl_id; - } - } - - if ( show_progress ) /* 3 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - /* if we either aren't using the core file driver, or a create - * with the core file driver failed, try again with a regular file. - * If this fails, we are cooked. - */ - if ( ( pass2 ) && ( fid < 0 ) ) { - - fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id); - - saved_fid = fid; - - if ( fid < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fcreate() failed."; - - if ( verbose ) { - HDfprintf(stdout, "%s: H5Fcreate() failed.\n", fcn_name); - } - } - } - - if ( show_progress ) /* 4 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - if ( pass2 ) { - - HDassert( fid >= 0 ); - - saved_fid = fid; - - if ( H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fflush() failed."; - - if ( verbose ) { - HDfprintf(stdout, "%s: H5Fflush() failed.\n", fcn_name); - } - - } else { - - file_ptr = H5I_object_verify(fid, H5I_FILE); - - if ( file_ptr == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "Can't get file_ptr."; - - if ( verbose ) { - HDfprintf(stdout, "%s: H5Fflush() failed.\n", fcn_name); - } - } - } - } - - if ( show_progress ) /* 5 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - if ( pass2 ) { - - /* A bit of fancy footwork here: - * - * The call to H5Fcreate() allocates an instance of H5C2_t, - * initializes it, and stores its address in f->shared->cache2. - * - * We don't want to use this cache, as it has a bunch of extra - * initialization that may change over time, and in any case - * it will not in general be configured the way we want it. - * - * We used to deal with this problem by storing the file pointer - * in another instance of H5C2_t, and then ignoring the original - * version. However, this strategy doesn't work any more, as - * we can't store the file pointer in the instance of H5C2_t, - * and we have modified many cache2 routines to use a file - * pointer to look up the target cache. - * - * Thus we now make note of the address of the instance of - * H5C2_t created by the call to H5Fcreate(), set - * file_ptr->shared->cache2 to NULL, call H5C2_create() - * to allocate a new instance of H5C2_t for test purposes, - * and store than new instance's address in - * file_ptr->shared->cache2. - * - * On shut down, we call H5C2_dest on our instance of H5C2_t, - * set file_ptr->shared->cache2 to point to the original - * instance, and then close the file normally. - */ - - HDassert( saved_cache2 == NULL ); - - saved_cache2 = file_ptr->shared->cache2; - - file_ptr->shared->cache2 = NULL; - - cache_ptr = H5C2_create(max_cache_size, - min_clean_size, - (NUMBER_OF_ENTRY_TYPES - 1), - (const char **)entry_type_names2, - check_write_permitted2, - TRUE, - NULL, - NULL); - - file_ptr->shared->cache2 = cache_ptr; - } - - if ( show_progress ) /* 6 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - if ( pass2 ) { - - if ( cache_ptr == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_create() failed."; - - if ( verbose ) { - HDfprintf(stdout, "%s: H5C2_create() failed.\n", fcn_name); - } - - } else if ( cache_ptr->magic != H5C2__H5C2_T_MAGIC ) { - - pass2 = FALSE; - failure_mssg2 = "Bad cache_ptr magic."; - - if ( verbose ) { - HDfprintf(stdout, "%s: Bad cache_ptr magic.\n", fcn_name); - } - } - } - - if ( show_progress ) /* 7 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - if ( pass2 ) { /* allocate space for test entries */ - - actual_base_addr = H5MF_alloc(file_ptr, H5FD_MEM_DEFAULT, H5P_DEFAULT, - (hsize_t)(ADDR_SPACE_SIZE + BASE_ADDR)); - - if ( actual_base_addr == HADDR_UNDEF ) { - - pass2 = FALSE; - failure_mssg2 = "H5MF_alloc() failed."; - - if ( verbose ) { - HDfprintf(stdout, "%s: H5MF_alloc() failed.\n", fcn_name); - } - - } else if ( actual_base_addr > BASE_ADDR ) { - - /* If this happens, must increase BASE_ADDR so that the - * actual_base_addr is <= BASE_ADDR. This should only happen - * if the size of the superblock is increase. - */ - pass2 = FALSE; - failure_mssg2 = "actual_base_addr > BASE_ADDR"; - - if ( verbose ) { - HDfprintf(stdout, "%s: actual_base_addr > BASE_ADDR.\n", - fcn_name); - } - } - - saved_actual_base_addr = actual_base_addr; - } - - if ( show_progress ) /* 8 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - if ( pass2 ) { - - H5C2_stats__reset(cache_ptr); - ret_val = file_ptr; - } - - if ( show_progress ) /* 9 */ - HDfprintf(stdout, "%s() - %0d -- pass2 = %d\n", - fcn_name, mile_stone++, (int)pass2); - - return(ret_val); - -} /* setup_cache2() */ - - -/*------------------------------------------------------------------------- - * Function: takedown_cache2() - * - * Purpose: Flush the specified cache and destroy it. If requested, - * dump stats first. Then close and delete the associate - * file. - * - * If pass2 is FALSE, do nothing. - * - * Return: void - * - * Programmer: John Mainzer - * 9/14/07 - * - *------------------------------------------------------------------------- - */ - -void -takedown_cache2(H5F_t * file_ptr, - hbool_t dump_stats, - hbool_t dump_detailed_stats) -{ - char filename[512]; - - if ( file_ptr != NULL ) { - H5C2_t * cache_ptr = file_ptr->shared->cache2; - - if ( dump_stats ) { - - H5C2_stats(cache_ptr, "test cache", dump_detailed_stats); - } - - flush_cache2(file_ptr, TRUE, FALSE, FALSE); - - H5C2_dest(file_ptr, H5P_DATASET_XFER_DEFAULT); - - if ( saved_cache2 != NULL ) { - - file_ptr->shared->cache2 = saved_cache2; - saved_cache2 = NULL; - } - - if ( H5F_addr_defined(saved_actual_base_addr) ) { - - H5MF_xfree(file_ptr, H5FD_MEM_DEFAULT, H5P_DEFAULT, saved_actual_base_addr, - (hsize_t)(ADDR_SPACE_SIZE + BASE_ADDR)); - saved_actual_base_addr = HADDR_UNDEF; - } - } - - if ( saved_fapl_id != H5P_DEFAULT ) { - - H5Pclose(saved_fapl_id); - saved_fapl_id = H5P_DEFAULT; - } - - if ( saved_fid != -1 ) { - - if ( H5Fclose(saved_fid) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "couldn't close test file."; - - } else { - - saved_fid = -1; - - } - - if ( ( ! try_core_file_driver ) || ( core_file_driver_failed ) ) { - - if ( h5_fixname(FILENAME[0], H5P_DEFAULT, filename, sizeof(filename)) - == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed.\n"; - } - - if ( HDremove(filename) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "couldn't delete test file."; - - } - } - } - - return; - -} /* takedown_cache2() */ - - -/*------------------------------------------------------------------------- - * Function: expunge_entry2() - * - * Purpose: Expunge the entry indicated by the type and index. - * - * - * Return: void - * - * Programmer: John Mainzer - * 7/6/06 - * - *------------------------------------------------------------------------- - */ - -void -expunge_entry2(H5F_t * file_ptr, - int32_t type, - int32_t idx) -{ - /* const char * fcn_name = "expunge_entry2()"; */ - herr_t result; - test_entry_t * base_addr; - test_entry_t * entry_ptr; - - if ( pass2 ) { -#ifndef NDEBUG - H5C2_t * cache_ptr = file_ptr->shared->cache2; - - HDassert( cache_ptr ); -#endif /* NDEBUG */ - - HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); - HDassert( ( 0 <= idx ) && ( idx <= max_indices2[type] ) ); - - base_addr = entries2[type]; - entry_ptr = &(base_addr[idx]); - - HDassert( entry_ptr->index == idx ); - HDassert( entry_ptr->type == type ); - HDassert( entry_ptr == entry_ptr->self ); - HDassert( entry_ptr->cache_ptr == cache_ptr ); - HDassert( ! ( entry_ptr->header.is_protected ) ); - HDassert( ! ( entry_ptr->is_protected ) ); - HDassert( ! ( entry_ptr->header.is_pinned ) ); - HDassert( ! ( entry_ptr->is_pinned ) ); - - result = H5C2_expunge_entry(file_ptr, H5P_DATASET_XFER_DEFAULT, - &(types2[type]), - entry_ptr->addr); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "error in H5C2_expunge_entry()."; - - } - } - - return; - -} /* expunge_entry2() */ - - -/*------------------------------------------------------------------------- - * Function: flush_cache2() - * - * Purpose: Flush the specified cache, destroying all entries if - requested. If requested, dump stats first. - * - * Return: void - * - * Programmer: John Mainzer - * 6/23/04 - * - *------------------------------------------------------------------------- - */ - -void -flush_cache2(H5F_t * file_ptr, - hbool_t destroy_entries, - hbool_t dump_stats, - hbool_t dump_detailed_stats) -{ - const char * fcn_name = "flush_cache2()"; - H5C2_t * cache_ptr; - hbool_t show_progress = FALSE; - herr_t result = 0; - int mile_post = 0; - - if ( show_progress ) { - HDfprintf(stdout, "%s: mile_post = %d.\n", - fcn_name, mile_post++); /* 0 */ - } - - verify_unprotected2(); - - if ( show_progress ) { - HDfprintf(stdout, "%s: mile_post = %d - %d.\n", - fcn_name, mile_post++, (int)pass2); /* 1 */ - } - - if ( pass2 ) { - - HDassert(file_ptr); - - cache_ptr = file_ptr->shared->cache2; - - if ( destroy_entries ) { - - result = H5C2_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, - H5C2__FLUSH_INVALIDATE_FLAG); - - } else { - - result = H5C2_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, - H5C2__NO_FLAGS_SET); - } - } - - if ( show_progress ) { - HDfprintf(stdout, "%s: mile_post = %d - %d.\n", - fcn_name, mile_post++, (int)pass2); /* 2 */ - } - - if ( dump_stats ) { - - H5C2_stats(cache_ptr, "test cache", dump_detailed_stats); - } - - if ( show_progress ) { - HDfprintf(stdout, "%s: *mile_post = %d - %d.\n", - fcn_name, mile_post++, (int)pass2); /* 3 */ - } - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "error in H5C2_flush_cache()."; - } - - if ( show_progress ) { - HDfprintf(stdout, "%s: mile_post = %d - %d.\n", - fcn_name, mile_post++, (int)pass2); /* 4 */ - } - - return; - -} /* flush_cache2() */ - - -/*------------------------------------------------------------------------- - * Function: insert_entry2() - * - * Purpose: Insert the entry indicated by the type and index. Mark - * it clean or dirty as indicated. - * - * Note that I don't see much practical use for inserting - * a clean entry, but the interface permits it so we should - * test it. - * - * Do nothing if pass2 is false. - * - * Return: void - * - * Programmer: John Mainzer - * 6/16/04 - * - *------------------------------------------------------------------------- - */ - -void -insert_entry2(H5F_t * file_ptr, - int32_t type, - int32_t idx, - hbool_t UNUSED dirty, - unsigned int flags) -{ - H5C2_t * cache_ptr; - herr_t result; - hbool_t insert_pinned; - test_entry_t * base_addr; - test_entry_t * entry_ptr; - - if ( pass2 ) { - - cache_ptr = file_ptr->shared->cache2; - - HDassert( cache_ptr ); - HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); - HDassert( ( 0 <= idx ) && ( idx <= max_indices2[type] ) ); - - base_addr = entries2[type]; - entry_ptr = &(base_addr[idx]); - - HDassert( entry_ptr->index == idx ); - HDassert( entry_ptr->type == type ); - HDassert( entry_ptr == entry_ptr->self ); - HDassert( !(entry_ptr->is_protected) ); - - insert_pinned = ((flags & H5C2__PIN_ENTRY_FLAG) != 0 ); - - entry_ptr->is_dirty = TRUE; - - result = H5C2_insert_entry(file_ptr, H5P_DATASET_XFER_DEFAULT, - &(types2[type]), entry_ptr->addr, - entry_ptr->size, (void *)entry_ptr, flags); - - if ( ( result < 0 ) || - ( entry_ptr->header.is_protected ) || - ( entry_ptr->header.type != &(types2[type]) ) || - ( entry_ptr->size != entry_ptr->header.size ) || - ( entry_ptr->addr != entry_ptr->header.addr ) ) { - - pass2 = FALSE; - failure_mssg2 = "error in H5C2_insert()."; - -#if 0 /* This is useful debugging code. Lets keep it around. */ - - HDfprintf(stdout, "result = %d\n", (int)result); - HDfprintf(stdout, "entry_ptr->header.is_protected = %d\n", - (int)(entry_ptr->header.is_protected)); - HDfprintf(stdout, - "entry_ptr->header.type != &(types2[type]) = %d\n", - (int)(entry_ptr->header.type != &(types2[type]))); - HDfprintf(stdout, - "entry_ptr->size != entry_ptr->header.size = %d\n", - (int)(entry_ptr->size != entry_ptr->header.size)); - HDfprintf(stdout, - "entry_ptr->addr != entry_ptr->header.addr = %d\n", - (int)(entry_ptr->addr != entry_ptr->header.addr)); -#endif - } - HDassert( entry_ptr->cache_ptr == NULL ); - - entry_ptr->file_ptr = file_ptr; - entry_ptr->cache_ptr = cache_ptr; - - if ( insert_pinned ) { - - HDassert( entry_ptr->header.is_pinned ); - entry_ptr->is_pinned = TRUE; - - } else { - - HDassert( ! ( entry_ptr->header.is_pinned ) ); - entry_ptr->is_pinned = FALSE; - - } - HDassert( entry_ptr->header.is_dirty ); - HDassert( ((entry_ptr->header).type)->id == type ); - } - - return; - -} /* insert_entry2() */ - - -/*------------------------------------------------------------------------- - * Function: mark_pinned_entry_dirty2() - * - * Purpose: Mark the specified entry as dirty. - * - * Do nothing if pass2 is FALSE on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 3/28/06 - * - *------------------------------------------------------------------------- - */ - -void -mark_pinned_entry_dirty2(H5F_t * file_ptr, - int32_t type, - int32_t idx, - hbool_t size_changed, - size_t new_size) -{ -#ifndef NDEBUG - H5C2_t * cache_ptr; -#endif /* NDEBUG */ - herr_t result; - test_entry_t * base_addr; - test_entry_t * entry_ptr; - - if ( pass2 ) { - -#ifndef NDEBUG - cache_ptr = file_ptr->shared->cache2; -#endif /* NDEBUG */ - - HDassert( cache_ptr ); - HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); - HDassert( ( 0 <= idx ) && ( idx <= max_indices2[type] ) ); - - base_addr = entries2[type]; - entry_ptr = &(base_addr[idx]); - - HDassert( entry_ptr->index == idx ); - HDassert( entry_ptr->type == type ); - HDassert( entry_ptr == entry_ptr->self ); - HDassert( entry_ptr->cache_ptr == cache_ptr ); - HDassert( ! (entry_ptr->header.is_protected) ); - HDassert( entry_ptr->header.is_pinned ); - HDassert( entry_ptr->is_pinned ); - - entry_ptr->is_dirty = TRUE; - - if ( size_changed ) { - - /* update entry size now to keep the sanity checks happy */ - entry_ptr->size = new_size; - } - - result = H5C2_mark_pinned_entry_dirty((void *)entry_ptr, - size_changed, - new_size); - - if ( ( result < 0 ) || - ( ! (entry_ptr->header.is_dirty) ) || - ( ! (entry_ptr->header.is_pinned) ) || - ( entry_ptr->header.type != &(types2[type]) ) || - ( entry_ptr->size != entry_ptr->header.size ) || - ( entry_ptr->addr != entry_ptr->header.addr ) ) { - -#if 0 /* This is useful debugging code -- keep it around */ - HDfprintf(stdout, "result = %ld.\n", (long)result); - HDfprintf(stdout, "entry_ptr->header.is_dirty = %d.\n", - (int)(entry_ptr->header.is_dirty)); - HDfprintf(stdout, "entry_ptr->header.is_pinned = %d.\n", - (int)(entry_ptr->header.is_pinned)); - HDfprintf(stdout, - "(entry_ptr->header.type != &(types[type])) = %d.\n", - (int)(entry_ptr->header.type != &(types[type]))); - HDfprintf(stdout, - "entry_ptr->size = %ld, entry_ptr->header.size = %ld.\n", - (long)(entry_ptr->size), (long)(entry_ptr->header.size)); - HDfprintf(stdout, - "entry_ptr->addr = %ld, entry_ptr->header.addr = %ld.\n", - (long)(entry_ptr->addr), (long)(entry_ptr->header.addr)); -#endif - pass2 = FALSE; - failure_mssg2 = "error in H5C2_mark_pinned_entry_dirty()."; - - } - - HDassert( ((entry_ptr->header).type)->id == type ); - - } - - return; - -} /* mark_pinned_entry_dirty2() */ - - -/*------------------------------------------------------------------------- - * Function: mark_pinned_or_protected_entry_dirty2() - * - * Purpose: Mark the specified entry as dirty. - * - * Do nothing if pass2 is FALSE on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 5/17/06 - * - *------------------------------------------------------------------------- - */ - -void -mark_pinned_or_protected_entry_dirty2(H5F_t * file_ptr, - int32_t type, - int32_t idx) -{ -#ifndef NDEBUG - H5C2_t * cache_ptr; -#endif /* NDEBUG */ - herr_t result; - test_entry_t * base_addr; - test_entry_t * entry_ptr; - - if ( pass2 ) { - -#ifndef NDEBUG - cache_ptr = file_ptr->shared->cache2; -#endif /* NDEBUG */ - - HDassert( cache_ptr ); - HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); - HDassert( ( 0 <= idx ) && ( idx <= max_indices2[type] ) ); - - base_addr = entries2[type]; - entry_ptr = &(base_addr[idx]); - - HDassert( entry_ptr->index == idx ); - HDassert( entry_ptr->type == type ); - HDassert( entry_ptr == entry_ptr->self ); - HDassert( entry_ptr->cache_ptr == cache_ptr ); - HDassert( entry_ptr->header.is_protected || - entry_ptr->header.is_pinned ); - - entry_ptr->is_dirty = TRUE; - - result = H5C2_mark_pinned_or_protected_entry_dirty((void *)entry_ptr); - - if ( ( result < 0 ) - || - ( ( ! (entry_ptr->header.is_protected) ) - && - ( ! (entry_ptr->header.is_pinned) ) - ) - || - ( ( entry_ptr->header.is_protected ) - && - ( ! ( entry_ptr->header.dirtied ) ) - ) - || - ( ( ! ( entry_ptr->header.is_protected ) ) - && - ( ! ( entry_ptr->header.is_dirty ) ) - ) - || - ( entry_ptr->header.type != &(types2[type]) ) - || - ( entry_ptr->size != entry_ptr->header.size ) - || - ( entry_ptr->addr != entry_ptr->header.addr ) ) { - - pass2 = FALSE; - failure_mssg2 = - "error in H5C2_mark_pinned_or_protected_entry_dirty()."; - - } - - HDassert( ((entry_ptr->header).type)->id == type ); - - } - - return; - -} /* mark_pinned_or_protected_entry_dirty2() */ - - -/*------------------------------------------------------------------------- - * Function: rename_entry2() - * - * Purpose: Rename the entry indicated by the type and index to its - * main or alternate address as indicated. If the entry is - * already at the desired entry, do nothing. - * - * Return: void - * - * Programmer: John Mainzer - * 6/21/04 - * - *------------------------------------------------------------------------- - */ - -void -rename_entry2(H5C2_t * cache_ptr, - int32_t type, - int32_t idx, - hbool_t main_addr) -{ - herr_t result; - hbool_t done = TRUE; /* will set to FALSE if we have work to do */ - haddr_t old_addr = HADDR_UNDEF; - haddr_t new_addr = HADDR_UNDEF; - test_entry_t * base_addr; - test_entry_t * entry_ptr; - - if ( pass2 ) { - - HDassert( cache_ptr ); - HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); - HDassert( ( 0 <= idx ) && ( idx <= max_indices2[type] ) ); - - base_addr = entries2[type]; - entry_ptr = &(base_addr[idx]); - - HDassert( entry_ptr->index == idx ); - HDassert( entry_ptr->type == type ); - HDassert( entry_ptr == entry_ptr->self ); - HDassert( entry_ptr->cache_ptr == cache_ptr ); - HDassert( !(entry_ptr->is_protected) ); - HDassert( !(entry_ptr->header.is_protected) ); - - - if ( entry_ptr->at_main_addr && !main_addr ) { - - /* rename to alt addr */ - - HDassert( entry_ptr->addr == entry_ptr->main_addr ); - - done = FALSE; - old_addr = entry_ptr->addr; - new_addr = entry_ptr->alt_addr; - - } else if ( !(entry_ptr->at_main_addr) && main_addr ) { - - /* rename to main addr */ - - HDassert( entry_ptr->addr == entry_ptr->alt_addr ); - - done = FALSE; - old_addr = entry_ptr->addr; - new_addr = entry_ptr->main_addr; - } - - if ( ! done ) { - - entry_ptr->is_dirty = TRUE; - - result = H5C2_rename_entry(cache_ptr, &(types2[type]), - old_addr, new_addr); - } - - if ( ! done ) { - - if ( ( result < 0 ) || - ( ( ! ( entry_ptr->header.destroy_in_progress ) ) && - ( entry_ptr->header.addr != new_addr ) ) ) { - - pass2 = FALSE; - failure_mssg2 = "error in H5C2_rename_entry()."; - - } else { - - entry_ptr->addr = new_addr; - entry_ptr->at_main_addr = main_addr; - } - } - - HDassert( ((entry_ptr->header).type)->id == type ); - - HDassert( entry_ptr->header.is_dirty ); - HDassert( entry_ptr->is_dirty ); - } - - return; - -} /* rename_entry2() */ - - -/*------------------------------------------------------------------------- - * Function: pin_protected_entry2() - * - * Purpose: Pin the specified protected entry. - * - * Do nothing if pass2 is FALSE on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 5/17/06 - * - *------------------------------------------------------------------------- - */ - -void -pin_protected_entry2(H5F_t * file_ptr, - int32_t type, - int32_t idx) -{ - /* const char * fcn_name = "pin_protected_entry2()"; */ - herr_t result; - test_entry_t * base_addr; - test_entry_t * entry_ptr; - - if ( pass2 ) { -#ifndef NDEBUG - H5C2_t * cache_ptr = file_ptr->shared->cache2; -#endif /* NDEBUG */ - - HDassert( cache_ptr ); - HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); - HDassert( ( 0 <= idx ) && ( idx <= max_indices2[type] ) ); - - base_addr = entries2[type]; - entry_ptr = &(base_addr[idx]); - - HDassert( entry_ptr->index == idx ); - HDassert( entry_ptr->type == type ); - HDassert( entry_ptr == entry_ptr->self ); - HDassert( entry_ptr->cache_ptr == cache_ptr ); - HDassert( entry_ptr->header.is_protected ); - HDassert( ! entry_ptr->header.is_pinned ); - - result = H5C2_pin_protected_entry((void *)entry_ptr); - - if ( ( result < 0 ) - || - ( ! (entry_ptr->header.is_protected) ) - || - ( ! (entry_ptr->header.is_pinned) ) - || - ( entry_ptr->header.type != &(types2[type]) ) - || - ( entry_ptr->size != entry_ptr->header.size ) - || - ( entry_ptr->addr != entry_ptr->header.addr ) ) { - - pass2 = FALSE; - failure_mssg2 = - "error in H5C2_pin_protected_entry()."; - - } - - entry_ptr->is_pinned = TRUE; - - HDassert( ((entry_ptr->header).type)->id == type ); - - } - - return; - -} /* pinned_protected_entry2() */ - - -/*------------------------------------------------------------------------- - * Function: protect_entry2() - * - * Purpose: Protect the entry indicated by the type and index. - * - * Do nothing if pass2 is FALSE on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 6/11/04 - * - *------------------------------------------------------------------------- - */ - -void -protect_entry2(H5F_t * file_ptr, - int32_t type, - int32_t idx) -{ - const char * fcn_name = "protect_entry2()"; - H5C2_t * cache_ptr; - hbool_t verbose = FALSE; - test_entry_t * base_addr; - test_entry_t * entry_ptr; - H5C2_cache_entry_t * cache_entry_ptr; - - if ( verbose ) { - HDfprintf(stdout, "\n%s: entering. type = %d, idx = %d.\n", - fcn_name, type, idx); - } - - if ( pass2 ) { - - cache_ptr = file_ptr->shared->cache2; - - HDassert( cache_ptr ); - HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); - HDassert( ( 0 <= idx ) && ( idx <= max_indices2[type] ) ); - - base_addr = entries2[type]; - entry_ptr = &(base_addr[idx]); - - HDassert( entry_ptr->index == idx ); - HDassert( entry_ptr->type == type ); - HDassert( entry_ptr == entry_ptr->self ); - HDassert( !(entry_ptr->is_protected) ); - - if ( verbose ) { - HDfprintf(stdout, - "%s: calling H5C2_protect(). addr = 0x%lx, len = %ld.\n", - fcn_name, (long)(entry_ptr->addr), - (long)(entry_ptr->size)); - } - - cache_entry_ptr = H5C2_protect(file_ptr, H5P_DATASET_XFER_DEFAULT, - &(types2[type]), entry_ptr->addr, - entry_ptr->size, NULL, - H5C2__NO_FLAGS_SET); - - if ( verbose ) { - HDfprintf(stdout, - "%s: H5C2_protect() returns. addr = 0x%lx, len = %ld.\n", - fcn_name, (long)(entry_ptr->addr), - (long)(entry_ptr->size)); - } - - if ( ( cache_entry_ptr != (void *)entry_ptr ) || - ( !(entry_ptr->header.is_protected) ) || - ( entry_ptr->header.type != &(types2[type]) ) || - ( entry_ptr->size != entry_ptr->header.size ) || - ( entry_ptr->addr != entry_ptr->header.addr ) ) { - -#if 0 - /* I've written the following debugging code several times - * now. Lets keep it around so I don't have to write it - * again. - * - JRM - */ - HDfprintf(stdout, "( cache_entry_ptr != (void *)entry_ptr ) = %d\n", - (int)( cache_entry_ptr != (void *)entry_ptr )); - HDfprintf(stdout, "cache_entry_ptr = 0x%lx, entry_ptr = 0x%lx\n", - (long)cache_entry_ptr, (long)entry_ptr); - HDfprintf(stdout, "entry_ptr->header.is_protected = %d\n", - (int)(entry_ptr->header.is_protected)); - HDfprintf(stdout, - "( entry_ptr->header.type != &(types2[type]) ) = %d\n", - (int)( entry_ptr->header.type != &(types2[type]) )); - HDfprintf(stdout, - "entry_ptr->size = %d, entry_ptr->header.size = %d\n", - (int)(entry_ptr->size), (int)(entry_ptr->header.size)); - HDfprintf(stdout, - "entry_ptr->addr = %d, entry_ptr->header.addr = %d\n", - (int)(entry_ptr->addr), (int)(entry_ptr->header.addr)); -#endif - pass2 = FALSE; - failure_mssg2 = "error in H5C2_protect()."; - - } else { - - HDassert( ( entry_ptr->cache_ptr == NULL ) || - ( entry_ptr->cache_ptr == cache_ptr ) ); - - entry_ptr->cache_ptr = cache_ptr; - entry_ptr->file_ptr = file_ptr; - entry_ptr->is_protected = TRUE; - - } - - HDassert( ((entry_ptr->header).type)->id == type ); - } - - if ( verbose ) { - HDfprintf(stdout, "%s: exiting.\n", fcn_name); - } - - return; - -} /* protect_entry2() */ - - -/*------------------------------------------------------------------------- - * Function: protect_entry_ro2() - * - * Purpose: Do a read only protect the entry indicated by the type - * and index. - * - * Do nothing if pass2 is FALSE on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 4/1/07 - * - *------------------------------------------------------------------------- - */ - -void -protect_entry_ro2(H5F_t * file_ptr, - int32_t type, - int32_t idx) -{ - H5C2_t * cache_ptr; - test_entry_t * base_addr; - test_entry_t * entry_ptr; - H5C2_cache_entry_t * cache_entry_ptr; - - if ( pass2 ) { - - cache_ptr = file_ptr->shared->cache2; - - HDassert( cache_ptr ); - HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); - HDassert( ( 0 <= idx ) && ( idx <= max_indices2[type] ) ); - - base_addr = entries2[type]; - entry_ptr = &(base_addr[idx]); - - HDassert( entry_ptr->index == idx ); - HDassert( entry_ptr->type == type ); - HDassert( entry_ptr == entry_ptr->self ); - HDassert( ( ! ( entry_ptr->is_protected ) ) || - ( ( entry_ptr->is_read_only ) && - ( entry_ptr->ro_ref_count > 0 ) ) ); - - cache_entry_ptr = H5C2_protect(file_ptr, H5P_DATASET_XFER_DEFAULT, - &(types2[type]), entry_ptr->addr, - entry_ptr->size, NULL, - H5C2__READ_ONLY_FLAG); - - if ( ( cache_entry_ptr != (void *)entry_ptr ) || - ( !(entry_ptr->header.is_protected) ) || - ( !(entry_ptr->header.is_read_only) ) || - ( entry_ptr->header.ro_ref_count <= 0 ) || - ( entry_ptr->header.type != &(types2[type]) ) || - ( entry_ptr->size != entry_ptr->header.size ) || - ( entry_ptr->addr != entry_ptr->header.addr ) ) { - - pass2 = FALSE; - failure_mssg2 = "error in read only H5C2_protect()."; - - } else { - - HDassert( ( entry_ptr->cache_ptr == NULL ) || - ( entry_ptr->cache_ptr == cache_ptr ) ); - - entry_ptr->cache_ptr = cache_ptr; - entry_ptr->file_ptr = file_ptr; - entry_ptr->is_protected = TRUE; - entry_ptr->is_read_only = TRUE; - entry_ptr->ro_ref_count++; - } - - HDassert( ((entry_ptr->header).type)->id == type ); - } - - return; - -} /* protect_entry_ro2() */ - - -/*------------------------------------------------------------------------- - * Function: unpin_entry2() - * - * Purpose: Unpin the entry indicated by the type and index. - * - * Do nothing if pass2 is FALSE on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 3/28/06 - * - *------------------------------------------------------------------------- - */ - -void -unpin_entry2(H5F_t * file_ptr, - int32_t type, - int32_t idx) -{ - herr_t result; - test_entry_t * base_addr; - test_entry_t * entry_ptr; - - if ( pass2 ) { -#ifndef NDEBUG - H5C2_t * cache_ptr; - - cache_ptr = file_ptr->shared->cache2; - - HDassert( cache_ptr ); -#endif /* NDEBUG */ - HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); - HDassert( ( 0 <= idx ) && ( idx <= max_indices2[type] ) ); - - base_addr = entries2[type]; - entry_ptr = &(base_addr[idx]); - - HDassert( entry_ptr->index == idx ); - HDassert( entry_ptr->type == type ); - HDassert( entry_ptr == entry_ptr->self ); - HDassert( entry_ptr->cache_ptr == cache_ptr ); - HDassert( ! (entry_ptr->header.is_protected) ); - HDassert( entry_ptr->header.is_pinned ); - HDassert( entry_ptr->is_pinned ); - - result = H5C2_unpin_entry(entry_ptr); - - if ( ( result < 0 ) || - ( entry_ptr->header.is_pinned ) || - ( entry_ptr->header.type != &(types2[type]) ) || - ( entry_ptr->size != entry_ptr->header.size ) || - ( entry_ptr->addr != entry_ptr->header.addr ) ) { - - pass2 = FALSE; - failure_mssg2 = "error in H5C2_unpin()."; - - } - - entry_ptr->is_pinned = FALSE; - - HDassert( ((entry_ptr->header).type)->id == type ); - - } - - return; - -} /* unpin_entry2() */ - - -/*------------------------------------------------------------------------- - * Function: unprotect_entry2() - * - * Purpose: Unprotect the entry indicated by the type and index. - * - * Do nothing if pass2 is FALSE on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 6/12/04 - * - *------------------------------------------------------------------------- - */ - -void -unprotect_entry2(H5F_t * file_ptr, - int32_t type, - int32_t idx, - int dirty, - unsigned int flags) -{ - const char * fcn_name = "unprotect_entry2()"; - herr_t result; - hbool_t verbose = FALSE; - hbool_t pin_flag_set; - hbool_t unpin_flag_set; - test_entry_t * base_addr; - test_entry_t * entry_ptr; - - if ( verbose ) { - HDfprintf(stdout, - "\n%s: entering. type = %d, idx = %d, dirty = %d, flags = %0x.\n", - fcn_name, type, idx, (int)dirty, (int)flags); - } - - if ( pass2 ) { -#ifndef NDEBUG - H5C2_t * cache_ptr; - - cache_ptr = file_ptr->shared->cache2; - - HDassert( cache_ptr ); -#endif /* NDEBUG */ - HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); - HDassert( ( 0 <= idx ) && ( idx <= max_indices2[type] ) ); - - base_addr = entries2[type]; - entry_ptr = &(base_addr[idx]); - - HDassert( entry_ptr->index == idx ); - HDassert( entry_ptr->type == type ); - HDassert( entry_ptr == entry_ptr->self ); - HDassert( entry_ptr->cache_ptr == cache_ptr ); - HDassert( entry_ptr->header.is_protected ); - HDassert( entry_ptr->is_protected ); - - pin_flag_set = ((flags & H5C2__PIN_ENTRY_FLAG) != 0 ); - unpin_flag_set = ((flags & H5C2__UNPIN_ENTRY_FLAG) != 0 ); - - HDassert ( ! ( pin_flag_set && unpin_flag_set ) ); - HDassert ( ( ! pin_flag_set ) || ( ! (entry_ptr->is_pinned) ) ); - HDassert ( ( ! unpin_flag_set ) || ( entry_ptr->is_pinned ) ); - - if ( ( dirty == TRUE ) || ( dirty == FALSE ) ) { - - flags |= (dirty ? H5C2__DIRTIED_FLAG : H5C2__NO_FLAGS_SET); - entry_ptr->is_dirty = (entry_ptr->is_dirty || dirty); - } - - if ( verbose ) { - HDfprintf(stdout, "%s: calling H5C2_unprotect(). addr = 0X%lx.\n", - fcn_name, (long)(entry_ptr->addr)); - } - - result = H5C2_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT, - &(types2[type]), entry_ptr->addr, - (void *)entry_ptr, flags, (size_t)0); - - if ( verbose ) { - HDfprintf(stdout, "%s: H5C2_unprotect() returns. addr = 0X%lx.\n", - fcn_name, (long)(entry_ptr->addr)); - } - - - if ( ( result < 0 ) || - ( ( entry_ptr->header.is_protected ) && - ( ( ! ( entry_ptr->is_read_only ) ) || - ( entry_ptr->ro_ref_count <= 0 ) ) ) || - ( entry_ptr->header.type != &(types2[type]) ) || - ( entry_ptr->size != entry_ptr->header.size ) || - ( entry_ptr->addr != entry_ptr->header.addr ) ) { - - pass2 = FALSE; - failure_mssg2 = "error in H5C2_unprotect()."; - - if ( verbose ) { - HDfprintf(stdout, "%s: error in H5C2_unprotect():\n", fcn_name); - - if ( result < 0 ) - HDfprintf(stdout, " result = %d.\n", (int)result); - - if ( ( entry_ptr->header.is_protected ) && - ( ( ! ( entry_ptr->is_read_only ) ) || - ( entry_ptr->ro_ref_count <= 0 ) ) ) - HDfprintf(stdout, " R/O sanity check failed.\n"); - - if ( entry_ptr->header.type != &(types2[type]) ) - HDfprintf(stdout, " Type mismatch.\n"); - - if ( entry_ptr->size != entry_ptr->header.size ) - HDfprintf(stdout, " size mismatch.\n"); - - if ( entry_ptr->addr != entry_ptr->header.addr ) - HDfprintf(stdout, " addr mismatch.\n"); - } - } - else - { - if ( entry_ptr->ro_ref_count > 1 ) { - - entry_ptr->ro_ref_count--; - - if ( verbose ) - HDfprintf(stdout, "%s: decremented ro ref count to %d.\n", - fcn_name, entry_ptr->ro_ref_count); - - } else if ( entry_ptr->ro_ref_count == 1 ) { - - entry_ptr->is_protected = FALSE; - entry_ptr->is_read_only = FALSE; - entry_ptr->ro_ref_count = 0; - - if ( verbose ) - HDfprintf(stdout, "%s: r/o unprotected.\n", fcn_name); - - } else { - - entry_ptr->is_protected = FALSE; - - if ( verbose ) - HDfprintf(stdout, "%s: r/w unprotected.\n", fcn_name); - - } - - if ( pin_flag_set ) { - - HDassert ( entry_ptr->header.is_pinned ); - entry_ptr->is_pinned = TRUE; - - } else if ( unpin_flag_set ) { - - HDassert ( ! ( entry_ptr->header.is_pinned ) ); - entry_ptr->is_pinned = FALSE; - - } - } - - HDassert( ((entry_ptr->header).type)->id == type ); - - if ( ( flags & H5C2__DIRTIED_FLAG ) != 0 - && ( (flags & H5C2__DELETED_FLAG) == 0 ) ) { - - HDassert( entry_ptr->header.is_dirty ); - HDassert( entry_ptr->is_dirty ); - } - - HDassert( entry_ptr->header.is_protected == entry_ptr->is_protected ); - HDassert( entry_ptr->header.is_read_only == entry_ptr->is_read_only ); - HDassert( entry_ptr->header.ro_ref_count == entry_ptr->ro_ref_count ); - } - - if ( verbose ) { - HDfprintf(stdout, "\n%s: exiting.\n", fcn_name); - } - - return; - -} /* unprotect_entry2() */ - - -/*------------------------------------------------------------------------- - * Function: unprotect_entry_with_size_change2() - * - * Purpose: Version of unprotect_entry() that allow access to the new - * size change parameters in H5C2_unprotect_entry() - * - * At present, only the sizes of VARIABLE_ENTRY_TYPE entries - * can be changed. Thus this function will scream and die - * if the H5C2__SIZE_CHANGED_FLAG is set and the type is not - * VARIABLE_ENTRY_TYPE. - * - * Do nothing if pass2 is FALSE on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 8/31/06 - * - *------------------------------------------------------------------------- - */ - -void -unprotect_entry_with_size_change2(H5F_t * file_ptr, - int32_t type, - int32_t idx, - unsigned int flags, - size_t new_size) -{ - /* const char * fcn_name = "unprotect_entry_with_size_change2()"; */ - herr_t result; - hbool_t dirty_flag_set; - hbool_t pin_flag_set; - hbool_t unpin_flag_set; - hbool_t size_changed_flag_set; - test_entry_t * base_addr; - test_entry_t * entry_ptr; - - if ( pass2 ) { -#ifndef NDEBUG - H5C2_t * cache_ptr; - - cache_ptr = file_ptr->shared->cache2; - - HDassert( cache_ptr ); -#endif /* NDEBUG */ - HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); - HDassert( ( 0 <= idx ) && ( idx <= max_indices2[type] ) ); - HDassert( new_size <= entry_sizes2[type] ); - - base_addr = entries2[type]; - entry_ptr = &(base_addr[idx]); - - HDassert( entry_ptr->index == idx ); - HDassert( entry_ptr->type == type ); - HDassert( entry_ptr == entry_ptr->self ); - HDassert( entry_ptr->cache_ptr == cache_ptr ); - HDassert( entry_ptr->header.is_protected ); - HDassert( entry_ptr->is_protected ); - - dirty_flag_set = ((flags & H5C2__DIRTIED_FLAG) != 0 ); - pin_flag_set = ((flags & H5C2__PIN_ENTRY_FLAG) != 0 ); - unpin_flag_set = ((flags & H5C2__UNPIN_ENTRY_FLAG) != 0 ); - size_changed_flag_set = ((flags & H5C2__SIZE_CHANGED_FLAG) != 0 ); - - HDassert ( ! ( pin_flag_set && unpin_flag_set ) ); - HDassert ( ( ! pin_flag_set ) || ( ! (entry_ptr->is_pinned) ) ); - HDassert ( ( ! unpin_flag_set ) || ( entry_ptr->is_pinned ) ); - HDassert ( ( ! size_changed_flag_set ) || ( new_size > 0 ) ); - HDassert ( ( ! size_changed_flag_set ) || - ( type == VARIABLE_ENTRY_TYPE ) ); - - entry_ptr->is_dirty = (entry_ptr->is_dirty || dirty_flag_set); - - if ( size_changed_flag_set ) { - - entry_ptr->is_dirty = TRUE; - entry_ptr->size = new_size; - } - - result = H5C2_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT, - &(types2[type]), entry_ptr->addr, - (void *)entry_ptr, flags, new_size); - - if ( ( result < 0 ) || - ( entry_ptr->header.is_protected ) || - ( entry_ptr->header.type != &(types2[type]) ) || - ( entry_ptr->size != entry_ptr->header.size ) || - ( entry_ptr->addr != entry_ptr->header.addr ) ) { - - pass2 = FALSE; - failure_mssg2 = "error in H5C2_unprotect()."; - - } - else - { - entry_ptr->is_protected = FALSE; - - if ( pin_flag_set ) { - - HDassert ( entry_ptr->header.is_pinned ); - entry_ptr->is_pinned = TRUE; - - } else if ( unpin_flag_set ) { - - HDassert ( ! ( entry_ptr->header.is_pinned ) ); - entry_ptr->is_pinned = FALSE; - - } - } - - HDassert( ((entry_ptr->header).type)->id == type ); - - if ( ( flags & H5C2__DIRTIED_FLAG ) != 0 - && ( (flags & H5C2__DELETED_FLAG) == 0 ) ) { - - HDassert( entry_ptr->header.is_dirty ); - HDassert( entry_ptr->is_dirty ); - } - } - - return; - -} /* unprotect_entry_with_size_change2() */ - - -/*------------------------------------------------------------------------- - * Function: row_major_scan_forward2() - * - * Purpose: Do a sequence of inserts, protects, unprotects, renames, - * destroys while scanning through the set of entries. If - * pass2 is false on entry, do nothing. - * - * Return: void - * - * Programmer: John Mainzer - * 6/12/04 - * - *------------------------------------------------------------------------- - */ - -void -row_major_scan_forward2(H5F_t * file_ptr, - int32_t max_index, - int32_t lag, - hbool_t verbose, - hbool_t reset_stats, - hbool_t display_stats, - hbool_t display_detailed_stats, - hbool_t do_inserts, - hbool_t dirty_inserts, - hbool_t do_renames, - hbool_t rename_to_main_addr, - hbool_t do_destroys, - hbool_t do_mult_ro_protects, - int dirty_destroys, - int dirty_unprotects) -{ - const char * fcn_name = "row_major_scan_forward2"; - H5C2_t * cache_ptr; - int32_t type = 0; - int32_t idx; - int32_t local_max_index; - - if ( verbose ) - HDfprintf(stdout, "%s(): entering.\n", fcn_name); - - if ( pass2 ) { - - cache_ptr = file_ptr->shared->cache2; - - HDassert( cache_ptr != NULL ); - - HDassert( lag >= 10 ); - - if ( reset_stats ) { - - H5C2_stats__reset(cache_ptr); - } - } - - while ( ( pass2 ) && ( type < NUMBER_OF_ENTRY_TYPES ) ) - { - idx = -lag; - - local_max_index = MIN(max_index, max_indices2[type]); - - while ( ( pass2 ) && ( idx <= (local_max_index + lag) ) ) - { - if ( verbose ) { - - HDfprintf(stdout, "%d:%d: ", type, idx); - } - - if ( ( pass2 ) && ( do_inserts ) && ( (idx + lag) >= 0 ) && - ( (idx + lag) <= local_max_index ) && - ( ((idx + lag) % 2) == 0 ) && - ( ! entry_in_cache2(cache_ptr, type, (idx + lag)) ) ) { - - if ( verbose ) - HDfprintf(stdout, "1(i, %d, %d) ", type, (idx + lag)); - - insert_entry2(file_ptr, type, (idx + lag), dirty_inserts, - H5C2__NO_FLAGS_SET); - } - - - if ( ( pass2 ) && ( (idx + lag - 1) >= 0 ) && - ( (idx + lag - 1) <= local_max_index ) && - ( ( (idx + lag - 1) % 3 ) == 0 ) ) { - - if ( verbose ) - HDfprintf(stdout, "2(p, %d, %d) ", type, (idx + lag - 1)); - - protect_entry2(file_ptr, type, (idx + lag - 1)); - } - - if ( ( pass2 ) && ( (idx + lag - 2) >= 0 ) && - ( (idx + lag - 2) <= local_max_index ) && - ( ( (idx + lag - 2) % 3 ) == 0 ) ) { - - if ( verbose ) - HDfprintf(stdout, "3(u, %d, %d) ", type, (idx + lag - 2)); - - unprotect_entry2(file_ptr, type, idx+lag-2, NO_CHANGE, - H5C2__NO_FLAGS_SET); - } - - - if ( ( pass2 ) && ( do_renames ) && ( (idx + lag - 2) >= 0 ) && - ( (idx + lag - 2) <= local_max_index ) && - ( ( (idx + lag - 2) % 3 ) == 0 ) ) { - - if ( verbose ) - HDfprintf(stdout, "4(r, %d, %d, %d) ", - type, (idx + lag - 2), (int)rename_to_main_addr); - - rename_entry2(cache_ptr, type, (idx + lag - 2), - rename_to_main_addr); - } - - - if ( ( pass2 ) && ( (idx + lag - 3) >= 0 ) && - ( (idx + lag - 3) <= local_max_index ) && - ( ( (idx + lag - 3) % 5 ) == 0 ) ) { - - if ( verbose ) - HDfprintf(stdout, "5(p, %d, %d) ", type, (idx + lag - 3)); - - protect_entry2(file_ptr, type, (idx + lag - 3)); - } - - if ( ( pass2 ) && ( (idx + lag - 5) >= 0 ) && - ( (idx + lag - 5) <= local_max_index ) && - ( ( (idx + lag - 5) % 5 ) == 0 ) ) { - - if ( verbose ) - HDfprintf(stdout, "6(u, %d, %d) ", type, (idx + lag - 5)); - - unprotect_entry2(file_ptr, type, idx+lag-5, NO_CHANGE, - H5C2__NO_FLAGS_SET); - } - - if ( do_mult_ro_protects ) - { - if ( ( pass2 ) && ( (idx + lag - 5) >= 0 ) && - ( (idx + lag - 5) < local_max_index ) && - ( (idx + lag - 5) % 9 == 0 ) ) { - - if ( verbose ) - HDfprintf(stdout, "7(p-ro, %d, %d) ", type, - (idx + lag - 5)); - - protect_entry_ro2(file_ptr, type, (idx + lag - 5)); - } - - if ( ( pass2 ) && ( (idx + lag - 6) >= 0 ) && - ( (idx + lag - 6) < local_max_index ) && - ( (idx + lag - 6) % 11 == 0 ) ) { - - if ( verbose ) - HDfprintf(stdout, "8(p-ro, %d, %d) ", type, - (idx + lag - 6)); - - protect_entry_ro2(file_ptr, type, (idx + lag - 6)); - } - - if ( ( pass2 ) && ( (idx + lag - 7) >= 0 ) && - ( (idx + lag - 7) < local_max_index ) && - ( (idx + lag - 7) % 13 == 0 ) ) { - - if ( verbose ) - HDfprintf(stdout, "9(p-ro, %d, %d) ", type, - (idx + lag - 7)); - - protect_entry_ro2(file_ptr, type, (idx + lag - 7)); - } - - if ( ( pass2 ) && ( (idx + lag - 7) >= 0 ) && - ( (idx + lag - 7) < local_max_index ) && - ( (idx + lag - 7) % 9 == 0 ) ) { - - if ( verbose ) - HDfprintf(stdout, "10(u-ro, %d, %d) ", type, - (idx + lag - 7)); - - unprotect_entry2(file_ptr, type, (idx + lag - 7), - FALSE, H5C2__NO_FLAGS_SET); - } - - if ( ( pass2 ) && ( (idx + lag - 8) >= 0 ) && - ( (idx + lag - 8) < local_max_index ) && - ( (idx + lag - 8) % 11 == 0 ) ) { - - if ( verbose ) - HDfprintf(stdout, "11(u-ro, %d, %d) ", type, - (idx + lag - 8)); - - unprotect_entry2(file_ptr, type, (idx + lag - 8), - FALSE, H5C2__NO_FLAGS_SET); - } - - if ( ( pass2 ) && ( (idx + lag - 9) >= 0 ) && - ( (idx + lag - 9) < local_max_index ) && - ( (idx + lag - 9) % 13 == 0 ) ) { - - if ( verbose ) - HDfprintf(stdout, "12(u-ro, %d, %d) ", type, - (idx + lag - 9)); - - unprotect_entry2(file_ptr, type, (idx + lag - 9), - FALSE, H5C2__NO_FLAGS_SET); - } - } /* if ( do_mult_ro_protects ) */ - - if ( ( pass2 ) && ( idx >= 0 ) && ( idx <= local_max_index ) ) { - - if ( verbose ) - HDfprintf(stdout, "13(p, %d, %d) ", type, idx); - - protect_entry2(file_ptr, type, idx); - } - - if ( ( pass2 ) && ( (idx - lag + 2) >= 0 ) && - ( (idx - lag + 2) <= local_max_index ) && - ( ( (idx - lag + 2) % 7 ) == 0 ) ) { - - if ( verbose ) - HDfprintf(stdout, "14(u, %d, %d) ", type, (idx - lag + 2)); - - unprotect_entry2(file_ptr, type, idx-lag+2, NO_CHANGE, - H5C2__NO_FLAGS_SET); - } - - if ( ( pass2 ) && ( (idx - lag + 1) >= 0 ) && - ( (idx - lag + 1) <= local_max_index ) && - ( ( (idx - lag + 1) % 7 ) == 0 ) ) { - - if ( verbose ) - HDfprintf(stdout, "15(p, %d, %d) ", type, (idx - lag + 1)); - - protect_entry2(file_ptr, type, (idx - lag + 1)); - } - - - if ( do_destroys ) { - - if ( ( pass2 ) && ( (idx - lag) >= 0 ) && - ( ( idx - lag) <= local_max_index ) ) { - - switch ( (idx - lag) %4 ) { - - case 0: /* we just did an insert */ - - if ( verbose ) - HDfprintf(stdout, - "16(u, %d, %d) ", type, (idx - lag)); - - unprotect_entry2(file_ptr, type, idx - lag, - NO_CHANGE, H5C2__NO_FLAGS_SET); - break; - - case 1: - if ( (entries2[type])[idx-lag].is_dirty ) { - - if ( verbose ) - HDfprintf(stdout, - "17(u, %d, %d) ", type, (idx - lag)); - - unprotect_entry2(file_ptr, type, idx - lag, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } else { - - if ( verbose ) - HDfprintf(stdout, - "18(u, %d, %d) ", type, (idx - lag)); - - unprotect_entry2(file_ptr, type, idx - lag, - dirty_unprotects, - H5C2__NO_FLAGS_SET); - } - break; - - case 2: /* we just did an insrt */ - - if ( verbose ) - HDfprintf(stdout, - "19(u-del, %d, %d) ", type, (idx - lag)); - - unprotect_entry2(file_ptr, type, idx - lag, - NO_CHANGE, H5C2__DELETED_FLAG); - break; - - case 3: - if ( (entries2[type])[idx-lag].is_dirty ) { - - if ( verbose ) - HDfprintf(stdout, - "20(u-del, %d, %d) ", - type, (idx - lag)); - - unprotect_entry2(file_ptr, type, idx - lag, - NO_CHANGE, H5C2__DELETED_FLAG); - } else { - - if ( verbose ) - HDfprintf(stdout, - "21(u-del, %d, %d) ", - type, (idx - lag)); - - unprotect_entry2(file_ptr, type, idx - lag, - dirty_destroys, - H5C2__DELETED_FLAG); - } - break; - - default: - HDassert(0); /* this can't happen... */ - break; - } - } - - } else { - - if ( ( pass2 ) && ( (idx - lag) >= 0 ) && - ( ( idx - lag) <= local_max_index ) ) { - - if ( verbose ) - HDfprintf(stdout, "22(u, %d, %d) ", type, (idx - lag)); - - unprotect_entry2(file_ptr, type, idx - lag, - dirty_unprotects, H5C2__NO_FLAGS_SET); - } - } - - if ( verbose ) - HDfprintf(stdout, "\n"); - - idx++; - } - type++; - } - - if ( ( pass2 ) && ( display_stats ) ) { - - H5C2_stats(cache_ptr, "test cache", display_detailed_stats); - } - - return; - -} /* row_major_scan_forward2() */ - - -/*------------------------------------------------------------------------- - * Function: hl_row_major_scan_forward2() - * - * Purpose: Do a high locality sequence of inserts, protects, and - * unprotects while scanning through the set of entries. - * If pass2 is false on entry, do nothing. - * - * Return: void - * - * Programmer: John Mainzer - * 10/21/04 - * - *------------------------------------------------------------------------- - */ - -void -hl_row_major_scan_forward2(H5F_t * file_ptr, - int32_t max_index, - hbool_t verbose, - hbool_t reset_stats, - hbool_t display_stats, - hbool_t display_detailed_stats, - hbool_t do_inserts, - hbool_t dirty_inserts) -{ - const char * fcn_name = "hl_row_major_scan_forward2"; - H5C2_t * cache_ptr; - int32_t type = 0; - int32_t idx; - int32_t i; - int32_t lag = 100; - int32_t local_max_index; - - if ( verbose ) - HDfprintf(stdout, "%s(): entering.\n", fcn_name); - - if ( pass2 ) { - - cache_ptr = file_ptr->shared->cache2; - - HDassert( cache_ptr != NULL ); - HDassert( lag > 5 ); - HDassert( max_index >= 200 ); - HDassert( max_index <= MAX_ENTRIES ); - - if ( reset_stats ) { - - H5C2_stats__reset(cache_ptr); - } - } - - while ( ( pass2 ) && ( type < NUMBER_OF_ENTRY_TYPES ) ) - { - idx = -lag; - - local_max_index = MIN(max_index, max_indices2[type]); - - while ( ( pass2 ) && ( idx <= (local_max_index + lag) ) ) - { - if ( ( pass2 ) && ( do_inserts ) && ( (idx + lag) >= 0 ) && - ( (idx + lag) <= max_indices2[type] ) && - ( ((idx + lag) % 2) == 0 ) && - ( ! entry_in_cache2(cache_ptr, type, (idx + lag)) ) ) { - - if ( verbose ) - HDfprintf(stdout, "(i, %d, %d) ", type, (idx + lag)); - - insert_entry2(file_ptr, type, (idx + lag), dirty_inserts, - H5C2__NO_FLAGS_SET); - } - - i = idx; - - while ( ( pass2 ) && ( i >= idx - lag ) && ( i >= 0 ) ) - { - if ( ( pass2 ) && ( i >= 0 ) && ( i <= local_max_index ) ) { - - if ( verbose ) - HDfprintf(stdout, "(p, %d, %d) ", type, i); - - protect_entry2(file_ptr, type, i); - - if ( verbose ) - HDfprintf(stdout, "(u, %d, %d) ", type, i); - - unprotect_entry2(file_ptr, type, i, NO_CHANGE, - H5C2__NO_FLAGS_SET); - } - i--; - } - - if ( verbose ) - HDfprintf(stdout, "\n"); - - idx++; - } - type++; - } - - if ( ( pass2 ) && ( display_stats ) ) { - - H5C2_stats(cache_ptr, "test cache", display_detailed_stats); - } - - return; - -} /* hl_row_major_scan_forward2() */ - - -/*------------------------------------------------------------------------- - * Function: row_major_scan_backward2() - * - * Purpose: Do a sequence of inserts, protects, unprotects, renames, - * destroys while scanning backwards through the set of - * entries. If pass2 is false on entry, do nothing. - * - * Return: void - * - * Programmer: John Mainzer - * 6/12/04 - * - *------------------------------------------------------------------------- - */ - -void -row_major_scan_backward2(H5F_t * file_ptr, - int32_t max_index, - int32_t lag, - hbool_t verbose, - hbool_t reset_stats, - hbool_t display_stats, - hbool_t display_detailed_stats, - hbool_t do_inserts, - hbool_t dirty_inserts, - hbool_t do_renames, - hbool_t rename_to_main_addr, - hbool_t do_destroys, - hbool_t do_mult_ro_protects, - int dirty_destroys, - int dirty_unprotects) -{ - const char * fcn_name = "row_major_scan_backward2"; - H5C2_t * cache_ptr; - int32_t type = NUMBER_OF_ENTRY_TYPES - 1; - int32_t idx; - int32_t local_max_index; - - if ( verbose ) - HDfprintf(stdout, "%s(): Entering.\n", fcn_name); - - if ( pass2 ) { - - cache_ptr = file_ptr->shared->cache2; - - HDassert( cache_ptr != NULL ); - HDassert( lag >= 10 ); - - if ( reset_stats ) { - - H5C2_stats__reset(cache_ptr); - } - } - - while ( ( pass2 ) && ( type >= 0 ) ) - { - local_max_index = MIN(max_index, max_indices2[type]); - - /*idx = max_indices2[type] + lag; */ - idx = local_max_index + lag; - - while ( ( pass2 ) && ( idx >= -lag ) ) - { - if ( ( pass2 ) && ( do_inserts ) && ( (idx - lag) >= 0 ) && - /*( (idx - lag) <= max_indices2[type] ) && */ - ( (idx - lag) <= local_max_index ) && - ( ((idx - lag) % 2) == 1 ) && - ( ! entry_in_cache2(cache_ptr, type, (idx - lag)) ) ) { - - if ( verbose ) - HDfprintf(stdout, "(i, %d, %d) ", type, (idx - lag)); - - insert_entry2(file_ptr, type, (idx - lag), dirty_inserts, - H5C2__NO_FLAGS_SET); - } - - - if ( ( pass2 ) && ( (idx - lag + 1) >= 0 ) && - /*( (idx - lag + 1) <= max_indices2[type] ) && */ - ( (idx - lag + 1) <= local_max_index ) && - ( ( (idx - lag + 1) % 3 ) == 0 ) ) { - - if ( verbose ) - HDfprintf(stdout, "(p, %d, %d) ", type, (idx - lag + 1)); - - protect_entry2(file_ptr, type, (idx - lag + 1)); - } - - if ( ( pass2 ) && ( (idx - lag + 2) >= 0 ) && - /*( (idx - lag + 2) <= max_indices2[type] ) && */ - ( (idx - lag + 2) <= local_max_index ) && - ( ( (idx - lag + 2) % 3 ) == 0 ) ) { - - if ( verbose ) - 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 ) && ( do_renames ) && ( (idx - lag + 2) >= 0 ) && - /*( (idx - lag + 2) <= max_indices2[type] ) && */ - ( (idx - lag + 2) <= local_max_index ) && - ( ( (idx - lag + 2) % 3 ) == 0 ) ) { - - if ( verbose ) - HDfprintf(stdout, "(r, %d, %d, %d) ", - type, (idx + lag + 2), (int)rename_to_main_addr); - - rename_entry2(cache_ptr, type, (idx - lag + 2), - rename_to_main_addr); - } - - - if ( ( pass2 ) && ( (idx - lag + 3) >= 0 ) && - /*( (idx - lag + 3) <= max_indices2[type] ) && */ - ( (idx - lag + 3) <= local_max_index ) && - ( ( (idx - lag + 3) % 5 ) == 0 ) ) { - - if ( verbose ) - HDfprintf(stdout, "(p, %d, %d) ", type, (idx - lag + 3)); - - protect_entry2(file_ptr, type, (idx - lag + 3)); - } - - if ( ( pass2 ) && ( (idx - lag + 5) >= 0 ) && - /*( (idx - lag + 5) <= max_indices2[type] ) && */ - ( (idx - lag + 5) <= local_max_index ) && - ( ( (idx - lag + 5) % 5 ) == 0 ) ) { - - if ( verbose ) - HDfprintf(stdout, "(u, %d, %d) ", type, (idx - lag + 5)); - - unprotect_entry2(file_ptr, type, idx-lag+5, NO_CHANGE, - H5C2__NO_FLAGS_SET); - } - - if ( do_mult_ro_protects ) - { - if ( ( pass2 ) && ( (idx - lag + 5) >= 0 ) && - /*( (idx - lag + 5) < max_indices2[type] ) && */ - ( (idx - lag + 5) < local_max_index ) && - ( (idx - lag + 5) % 9 == 0 ) ) { - - if ( verbose ) - HDfprintf(stdout, "(p-ro, %d, %d) ", type, - (idx - lag + 5)); - - protect_entry_ro2(file_ptr, type, (idx - lag + 5)); - } - - if ( ( pass2 ) && ( (idx - lag + 6) >= 0 ) && - /*( (idx - lag + 6) < max_indices2[type] ) && */ - ( (idx - lag + 6) < local_max_index ) && - ( (idx - lag + 6) % 11 == 0 ) ) { - - if ( verbose ) - HDfprintf(stdout, "(p-ro, %d, %d) ", type, - (idx - lag + 6)); - - protect_entry_ro2(file_ptr, type, (idx - lag + 6)); - } - - if ( ( pass2 ) && ( (idx - lag + 7) >= 0 ) && - /* ( (idx - lag + 7) < max_indices2[type] ) && */ - ( (idx - lag + 7) < local_max_index ) && - ( (idx - lag + 7) % 13 == 0 ) ) { - - if ( verbose ) - HDfprintf(stdout, "(p-ro, %d, %d) ", type, - (idx - lag + 7)); - - protect_entry_ro2(file_ptr, type, (idx - lag + 7)); - } - - if ( ( pass2 ) && ( (idx - lag + 7) >= 0 ) && - /*( (idx - lag + 7) < max_indices2[type] ) && */ - ( (idx - lag + 7) < local_max_index ) && - ( (idx - lag + 7) % 9 == 0 ) ) { - - if ( verbose ) - 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 ) && ( (idx - lag + 8) >= 0 ) && - /*( (idx - lag + 8) < max_indices2[type] ) && */ - ( (idx - lag + 8) < local_max_index ) && - ( (idx - lag + 8) % 11 == 0 ) ) { - - if ( verbose ) - 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 ) && ( (idx - lag + 9) >= 0 ) && - /*( (idx - lag + 9) < max_indices2[type] ) && */ - ( (idx - lag + 9) < local_max_index ) && - ( (idx - lag + 9) % 13 == 0 ) ) { - - if ( verbose ) - HDfprintf(stdout, "(u-ro, %d, %d) ", type, - (idx - lag + 9)); - - unprotect_entry2(file_ptr, type, (idx - lag + 9), - FALSE, H5C2__NO_FLAGS_SET); - } - } /* if ( do_mult_ro_protects ) */ - - /*if ( ( pass2 ) && ( idx >= 0 ) && ( idx <= max_indices2[type] ) ) { */ - if ( ( pass2 ) && ( idx >= 0 ) && ( idx <= local_max_index ) ) { - - if ( verbose ) - HDfprintf(stdout, "(p, %d, %d) ", type, idx); - - protect_entry2(file_ptr, type, idx); - } - - - if ( ( pass2 ) && ( (idx + lag - 2) >= 0 ) && - /*( (idx + lag - 2) <= max_indices2[type] ) && */ - ( (idx + lag - 2) <= local_max_index ) && - ( ( (idx + lag - 2) % 7 ) == 0 ) ) { - - if ( verbose ) - 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 ) && ( (idx + lag - 1) >= 0 ) && - /*( (idx + lag - 1) <= max_indices2[type] ) && */ - ( (idx + lag - 1) <= local_max_index ) && - ( ( (idx + lag - 1) % 7 ) == 0 ) ) { - - if ( verbose ) - HDfprintf(stdout, "(p, %d, %d) ", type, (idx + lag - 1)); - - protect_entry2(file_ptr, type, (idx + lag - 1)); - } - - - if ( do_destroys ) { - - if ( ( pass2 ) && ( (idx + lag) >= 0 ) && - /*( ( idx + lag) <= max_indices2[type] ) ) { */ - ( ( idx + lag) <= local_max_index ) ) { - - switch ( (idx + lag) %4 ) { - - case 0: - if ( (entries2[type])[idx+lag].is_dirty ) { - - unprotect_entry2(file_ptr, type, idx + lag, - NO_CHANGE, H5C2__NO_FLAGS_SET); - } else { - - unprotect_entry2(file_ptr, type, idx + lag, - dirty_unprotects, - H5C2__NO_FLAGS_SET); - } - break; - - case 1: /* we just did an insert */ - unprotect_entry2(file_ptr, type, idx + lag, - NO_CHANGE, H5C2__NO_FLAGS_SET); - break; - - case 2: - if ( (entries2[type])[idx + lag].is_dirty ) { - - unprotect_entry2(file_ptr, type, idx + lag, - NO_CHANGE, H5C2__DELETED_FLAG); - } else { - - unprotect_entry2(file_ptr, type, idx + lag, - dirty_destroys, - H5C2__DELETED_FLAG); - } - break; - - case 3: /* we just did an insrt */ - unprotect_entry2(file_ptr, type, idx + lag, - NO_CHANGE, H5C2__DELETED_FLAG); - break; - - default: - HDassert(0); /* this can't happen... */ - break; - } - } - } else { - - if ( ( pass2 ) && ( (idx + lag) >= 0 ) && - /*( ( idx + lag) <= max_indices2[type] ) ) { */ - ( ( idx + lag) <= local_max_index ) ) { - - if ( verbose ) - HDfprintf(stdout, "(u, %d, %d) ", type, (idx + lag)); - - unprotect_entry2(file_ptr, type, idx + lag, - dirty_unprotects, H5C2__NO_FLAGS_SET); - } - } - - if ( verbose ) - HDfprintf(stdout, "\n"); - - idx--; - } - type--; - } - - if ( ( pass2 ) && ( display_stats ) ) { - - H5C2_stats(cache_ptr, "test cache", display_detailed_stats); - } - - return; - -} /* row_major_scan_backward2() */ - - -/*------------------------------------------------------------------------- - * Function: hl_row_major_scan_backward2() - * - * Purpose: Do a high locality sequence of inserts, protects, and - * unprotects while scanning through the set of entries. - * If pass2 is false on entry, do nothing. - * - * Return: void - * - * Programmer: John Mainzer - * 10/21/04 - * - *------------------------------------------------------------------------- - */ - -void -hl_row_major_scan_backward2(H5F_t * file_ptr, - int32_t max_index, - hbool_t verbose, - hbool_t reset_stats, - hbool_t display_stats, - hbool_t display_detailed_stats, - hbool_t do_inserts, - hbool_t dirty_inserts) -{ - const char * fcn_name = "hl_row_major_scan_backward2"; - H5C2_t * cache_ptr; - int32_t type = NUMBER_OF_ENTRY_TYPES - 1; - int32_t idx; - int32_t i; - int32_t lag = 100; - int32_t local_max_index; - - if ( verbose ) - HDfprintf(stdout, "%s(): entering.\n", fcn_name); - - if ( pass2 ) { - - cache_ptr = file_ptr->shared->cache2; - - HDassert( cache_ptr != NULL ); - HDassert( lag > 5 ); - HDassert( max_index >= 200 ); - HDassert( max_index <= MAX_ENTRIES ); - - if ( reset_stats ) { - - H5C2_stats__reset(cache_ptr); - } - } - - while ( ( pass2 ) && ( type >= 0 ) ) - { - idx = max_indices2[type] + lag; - - local_max_index = MIN(max_index, max_indices2[type]); - - while ( ( pass2 ) && ( idx >= -lag ) ) - { - if ( ( pass2 ) && ( do_inserts ) && ( (idx + lag) >= 0 ) && - ( (idx + lag) <= local_max_index ) && - ( ((idx + lag) % 2) == 0 ) && - ( ! entry_in_cache2(cache_ptr, type, (idx + lag)) ) ) { - - if ( verbose ) - HDfprintf(stdout, "(i, %d, %d) ", type, (idx + lag)); - - insert_entry2(file_ptr, type, (idx + lag), dirty_inserts, - H5C2__NO_FLAGS_SET); - } - - i = idx; - - while ( ( pass2 ) && ( i >= idx - lag ) && ( i >= 0 ) ) - { - if ( ( pass2 ) && ( i >= 0 ) && ( i <= local_max_index ) ) { - - if ( verbose ) - HDfprintf(stdout, "(p, %d, %d) ", type, i); - - protect_entry2(file_ptr, type, i); - - if ( verbose ) - HDfprintf(stdout, "(u, %d, %d) ", type, i); - - unprotect_entry2(file_ptr, type, i, NO_CHANGE, - H5C2__NO_FLAGS_SET); - } - i--; - } - - if ( verbose ) - HDfprintf(stdout, "\n"); - - idx--; - } - type--; - } - - if ( ( pass2 ) && ( display_stats ) ) { - - H5C2_stats(cache_ptr, "test cache", display_detailed_stats); - } - - return; - -} /* hl_row_major_scan_backward2() */ - - -/*------------------------------------------------------------------------- - * Function: col_major_scan_forward2() - * - * Purpose: Do a sequence of inserts, protects, and unprotects - * while scanning through the set of entries. If - * pass2 is false on entry, do nothing. - * - * Return: void - * - * Programmer: John Mainzer - * 6/23/04 - * - *------------------------------------------------------------------------- - */ - -void -col_major_scan_forward2(H5F_t * file_ptr, - int32_t max_index, - int32_t lag, - hbool_t verbose, - hbool_t reset_stats, - hbool_t display_stats, - hbool_t display_detailed_stats, - hbool_t do_inserts, - hbool_t dirty_inserts, - int dirty_unprotects) -{ - const char * fcn_name = "col_major_scan_forward2()"; - H5C2_t * cache_ptr; - int i; - int32_t type = 0; - int32_t idx; - int32_t local_max_index[NUMBER_OF_ENTRY_TYPES]; - - if ( verbose ) - HDfprintf(stdout, "%s: entering.\n", fcn_name); - - if ( pass2 ) { - - cache_ptr = file_ptr->shared->cache2; - - for ( i = 0; i < NUMBER_OF_ENTRY_TYPES; i++ ) - { - local_max_index[i] = MIN(max_index, max_indices2[i]); - } - - HDassert( lag > 5 ); - - if ( reset_stats ) { - - H5C2_stats__reset(cache_ptr); - } - } - - idx = -lag; - - while ( ( pass2 ) && ( (idx - lag) <= MAX_ENTRIES ) ) - { - type = 0; - - while ( ( pass2 ) && ( type < NUMBER_OF_ENTRY_TYPES ) ) - { - if ( ( pass2 ) && ( do_inserts ) && ( (idx + lag) >= 0 ) && - /*( (idx + lag) <= max_indices2[type] ) && */ - ( (idx + lag) <= local_max_index[type] ) && - ( ((idx + lag) % 3) == 0 ) && - ( ! entry_in_cache2(cache_ptr, type, (idx + lag)) ) ) { - - if ( verbose ) - HDfprintf(stdout, "(i, %d, %d) ", type, (idx + lag)); - - insert_entry2(file_ptr, type, (idx + lag), dirty_inserts, - H5C2__NO_FLAGS_SET); - } - - /*if ( ( pass2 ) && ( idx >= 0 ) && ( idx <= max_indices2[type] ) ) { */ - if ( ( pass2 ) && - ( idx >= 0 ) && - ( idx <= local_max_index[type] ) ) { - - if ( verbose ) - HDfprintf(stdout, "(p, %d, %d) ", type, idx); - - protect_entry2(file_ptr, type, idx); - } - - if ( ( pass2 ) && ( (idx - lag) >= 0 ) && - /*( (idx - lag) <= max_indices2[type] ) ) { */ - ( (idx - lag) <= local_max_index[type] ) ) { - - if ( verbose ) - HDfprintf(stdout, "(u, %d, %d) ", type, (idx - lag)); - - unprotect_entry2(file_ptr, type, idx - lag, - dirty_unprotects, H5C2__NO_FLAGS_SET); - } - - if ( verbose ) - HDfprintf(stdout, "\n"); - - type++; - } - - idx++; - } - - if ( ( pass2 ) && ( display_stats ) ) { - - H5C2_stats(cache_ptr, "test cache", display_detailed_stats); - } - - return; - -} /* col_major_scan_forward2() */ - - -/*------------------------------------------------------------------------- - * Function: hl_col_major_scan_forward2() - * - * Purpose: Do a high locality sequence of inserts, protects, and - * unprotects while scanning through the set of entries. If - * pass2 is false on entry, do nothing. - * - * Return: void - * - * Programmer: John Mainzer - * 19/25/04 - * - *------------------------------------------------------------------------- - */ - -void -hl_col_major_scan_forward2(H5F_t * file_ptr, - int32_t max_index, - hbool_t verbose, - hbool_t reset_stats, - hbool_t display_stats, - hbool_t display_detailed_stats, - hbool_t do_inserts, - hbool_t dirty_inserts, - int dirty_unprotects) -{ - const char * fcn_name = "hl_col_major_scan_forward2()"; - H5C2_t * cache_ptr; - int32_t type = 0; - int32_t idx; - int32_t lag = 200; - int32_t i; - int32_t local_max_index; - - if ( verbose ) - HDfprintf(stdout, "%s: entering.\n", fcn_name); - - if ( pass2 ) { - - cache_ptr = file_ptr->shared->cache2; - - HDassert( cache_ptr != NULL ); - HDassert( lag > 5 ); - HDassert( max_index >= 500 ); - HDassert( max_index <= MAX_ENTRIES ); - - if ( reset_stats ) { - - H5C2_stats__reset(cache_ptr); - } - } - - idx = 0; - - local_max_index = MIN(max_index, MAX_ENTRIES); - - while ( ( pass2 ) && ( idx <= local_max_index ) ) - { - - i = idx; - - while ( ( pass2 ) && ( i >= 0 ) && ( i >= (idx - lag) ) ) { - - type = 0; - - while ( ( pass2 ) && ( type < NUMBER_OF_ENTRY_TYPES ) ) - { - if ( ( pass2 ) && ( do_inserts ) && ( i == idx ) && - ( i <= local_max_index ) && - ( (i % 3) == 0 ) && - ( ! entry_in_cache2(cache_ptr, type, i) ) ) { - - if ( verbose ) - HDfprintf(stdout, "(i, %d, %d) ", type, i); - - insert_entry2(file_ptr, type, i, dirty_inserts, - H5C2__NO_FLAGS_SET); - } - - if ( ( pass2 ) && ( i >= 0 ) && ( i <= local_max_index ) ) { - - if ( verbose ) - HDfprintf(stdout, "(p, %d, %d) ", type, i); - - protect_entry2(file_ptr, type, i); - } - - if ( ( pass2 ) && ( i >= 0 ) && - /*( i <= max_indices2[type] ) ) { */ - ( i <= local_max_index ) ) { - - if ( verbose ) - HDfprintf(stdout, "(u, %d, %d) ", type, i); - - unprotect_entry2(file_ptr, type, i, - dirty_unprotects, H5C2__NO_FLAGS_SET); - } - - if ( verbose ) - HDfprintf(stdout, "\n"); - - type++; - } - - i--; - } - - idx++; - } - - if ( ( pass2 ) && ( display_stats ) ) { - - H5C2_stats(cache_ptr, "test cache", display_detailed_stats); - } - - return; - -} /* hl_col_major_scan_forward2() */ - - -/*------------------------------------------------------------------------- - * Function: col_major_scan_backward2() - * - * Purpose: Do a sequence of inserts, protects, and unprotects - * while scanning backwards through the set of - * entries. If pass2 is false on entry, do nothing. - * - * Return: void - * - * Programmer: John Mainzer - * 6/23/04 - * - *------------------------------------------------------------------------- - */ - -void -col_major_scan_backward2(H5F_t * file_ptr, - int32_t max_index, - int32_t lag, - hbool_t verbose, - hbool_t reset_stats, - hbool_t display_stats, - hbool_t display_detailed_stats, - hbool_t do_inserts, - hbool_t dirty_inserts, - int dirty_unprotects) -{ - const char * fcn_name = "col_major_scan_backward2()"; - H5C2_t * cache_ptr; - int i; - int mile_stone = 1; - int32_t type; - int32_t idx; - int32_t local_max_index[NUMBER_OF_ENTRY_TYPES]; - - if ( verbose ) - HDfprintf(stdout, "%s: entering.\n", fcn_name); - - if ( pass2 ) { - - cache_ptr = file_ptr->shared->cache2; - - HDassert( cache_ptr != NULL ); - - for ( i = 0; i < NUMBER_OF_ENTRY_TYPES; i++ ) - { - local_max_index[i] = MIN(max_index, max_indices2[i]); - } - - HDassert( lag > 5 ); - - if ( reset_stats ) { - - H5C2_stats__reset(cache_ptr); - } - } - - /* idx = MAX_ENTRIES + lag; */ - idx = local_max_index[NUMBER_OF_ENTRY_TYPES - 1] + lag; - - if ( verbose ) /* 1 */ - HDfprintf(stdout, "%s: point %d.\n", fcn_name, mile_stone++); - - - while ( ( pass2 ) && ( (idx + lag) >= 0 ) ) - { - type = NUMBER_OF_ENTRY_TYPES - 1; - - while ( ( pass2 ) && ( type >= 0 ) ) - { - if ( ( pass2 ) && ( do_inserts) && ( (idx - lag) >= 0 ) && - /*( (idx - lag) <= max_indices2[type] ) && */ - ( (idx - lag) <= local_max_index[type] ) && - ( ((idx - lag) % 3) == 0 ) && - ( ! entry_in_cache2(cache_ptr, type, (idx - lag)) ) ) { - - if ( verbose ) - HDfprintf(stdout, "(i, %d, %d) ", type, (idx - lag)); - - insert_entry2(file_ptr, type, (idx - lag), dirty_inserts, - H5C2__NO_FLAGS_SET); - } - - /*if ( ( pass2 ) && ( idx >= 0 ) && ( idx <= max_indices2[type] ) ) { */ - if ( ( pass2 ) && - ( idx >= 0 ) && - ( idx <= local_max_index[type] ) ) { - - if ( verbose ) - HDfprintf(stdout, "(p, %d, %d) ", type, idx); - - protect_entry2(file_ptr, type, idx); - } - - if ( ( pass2 ) && ( (idx + lag) >= 0 ) && - /*( (idx + lag) <= max_indices2[type] ) ) { */ - ( (idx + lag) <= local_max_index[type] ) ) { - - if ( verbose ) - HDfprintf(stdout, "(u, %d, %d) ", type, (idx + lag)); - - unprotect_entry2(file_ptr, type, idx + lag, - dirty_unprotects, H5C2__NO_FLAGS_SET); - } - - if ( verbose ) - HDfprintf(stdout, "\n"); - - type--; - } - - idx--; - } - - if ( verbose ) /* 2 */ - HDfprintf(stdout, "%s: point %d.\n", fcn_name, mile_stone++); - - if ( ( pass2 ) && ( display_stats ) ) { - - H5C2_stats(cache_ptr, "test cache", display_detailed_stats); - } - - if ( verbose ) - HDfprintf(stdout, "%s: exiting.\n", fcn_name); - - return; - -} /* col_major_scan_backward2() */ - - -/*------------------------------------------------------------------------- - * Function: hl_col_major_scan_backward2() - * - * Purpose: Do a high locality sequence of inserts, protects, and - * unprotects while scanning backwards through the set of - * entries. If pass2 is false on entry, do nothing. - * - * Return: void - * - * Programmer: John Mainzer - * 10/25/04 - * - *------------------------------------------------------------------------- - */ - -void -hl_col_major_scan_backward2(H5F_t * file_ptr, - int32_t max_index, - hbool_t verbose, - hbool_t reset_stats, - hbool_t display_stats, - hbool_t display_detailed_stats, - hbool_t do_inserts, - hbool_t dirty_inserts, - int dirty_unprotects) -{ - const char * fcn_name = "hl_col_major_scan_backward2()"; - H5C2_t * cache_ptr; - int32_t type = 0; - int32_t idx; - int32_t lag = 50; - int32_t i; - int32_t local_max_index; - - if ( verbose ) - HDfprintf(stdout, "%s: entering.\n", fcn_name); - - if ( pass2 ) { - - cache_ptr = file_ptr->shared->cache2; - - HDassert( cache_ptr != NULL ); - HDassert( lag > 5 ); - HDassert( max_index >= 500 ); - HDassert( max_index <= MAX_ENTRIES ); - - local_max_index = MIN(max_index, MAX_ENTRIES); - - if ( reset_stats ) { - - H5C2_stats__reset(cache_ptr); - } - - idx = local_max_index; - } - - while ( ( pass2 ) && ( idx >= 0 ) ) - { - - i = idx; - - while ( ( pass2 ) && ( i <= local_max_index ) && ( i <= (idx + lag) ) ) { - - type = 0; - - while ( ( pass2 ) && ( type < NUMBER_OF_ENTRY_TYPES ) ) - { - if ( ( pass2 ) && ( do_inserts ) && ( i == idx ) && - ( i <= local_max_index ) && - ( ! entry_in_cache2(cache_ptr, type, i) ) ) { - - if ( verbose ) - HDfprintf(stdout, "(i, %d, %d) ", type, i); - - insert_entry2(file_ptr, type, i, dirty_inserts, - H5C2__NO_FLAGS_SET); - } - - if ( ( pass2 ) && ( i >= 0 ) && ( i <= local_max_index ) ) { - - if ( verbose ) - HDfprintf(stdout, "(p, %d, %d) ", type, i); - - protect_entry2(file_ptr, type, i); - } - - if ( ( pass2 ) && ( i >= 0 ) && - ( i <= local_max_index ) ) { - - if ( verbose ) - HDfprintf(stdout, "(u, %d, %d) ", type, i); - - unprotect_entry2(file_ptr, type, i, - dirty_unprotects, H5C2__NO_FLAGS_SET); - } - - if ( verbose ) - HDfprintf(stdout, "\n"); - - type++; - } - - i++; - } - - idx--; - } - - if ( ( pass2 ) && ( display_stats ) ) { - - H5C2_stats(cache_ptr, "test cache", display_detailed_stats); - } - - return; - -} /* hl_col_major_scan_backward2() */ - - -/*** H5AC2 level utility functions ***/ - -/*------------------------------------------------------------------------- - * Function: check_and_validate_cache_hit_rate() - * - * Purpose: Use the API functions to get and reset the cache hit rate. - * Verify that the value returned by the API call agrees with - * the cache internal data structures. - * - * If the number of cache accesses exceeds the value provided - * in the min_accesses parameter, and the hit rate is less than - * min_hit_rate, set pass2 to FALSE, and set failure_mssg2 to - * a string indicating that hit rate was unexpectedly low. - * - * Return hit rate in *hit_rate_ptr, and print the data to - * stdout if requested. - * - * If an error is detected, set pass2 to FALSE, and set - * failure_mssg2 to an appropriate value. - * - * Return: void - * - * Programmer: John Mainzer - * 4/18/04 - * - *------------------------------------------------------------------------- - */ - -void -check_and_validate_cache_hit_rate(hid_t file_id, - double * hit_rate_ptr, - hbool_t dump_data, - int64_t min_accesses, - double min_hit_rate) -{ - /* const char * fcn_name = "check_and_validate_cache_hit_rate()"; */ - herr_t result; - int64_t cache_hits = 0; - int64_t cache_accesses = 0; - double expected_hit_rate; - double hit_rate; - H5F_t * file_ptr = NULL; - H5C2_t * cache_ptr = NULL; - - /* get a pointer to the files internal data structure */ - if ( pass2 ) { - - file_ptr = (H5F_t *)H5I_object_verify(file_id, H5I_FILE); - - if ( file_ptr == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "Can't get file_ptr."; - - } else { - - cache_ptr = file_ptr->shared->cache2; - } - } - - /* verify that we can access the cache data structure */ - if ( pass2 ) { - - if ( ( cache_ptr == NULL ) || - ( cache_ptr->magic != H5C2__H5C2_T_MAGIC ) ) { - - pass2 = FALSE; - failure_mssg2 = "Can't access cache resize_ctl."; - } - } - - /* compare the cache's internal configuration with the expected value */ - if ( pass2 ) { - - cache_hits = cache_ptr->cache_hits; - cache_accesses = cache_ptr->cache_accesses; - - if ( cache_accesses > 0 ) { - - expected_hit_rate = ((double)cache_hits) / ((double)cache_accesses); - - } else { - - expected_hit_rate = 0.0; - } - - result = H5Fget_mdc_hit_rate(file_id, &hit_rate); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fget_mdc_hit_rate() failed."; - - } else if ( ! DBL_REL_EQUAL(hit_rate, expected_hit_rate, 0.00001) ) { - - pass2 = FALSE; - failure_mssg2 = "unexpected hit rate (1)."; - - } - } - - if ( pass2 ) { /* reset the hit rate */ - - result = H5Freset_mdc_hit_rate_stats(file_id); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Freset_mdc_hit_rate_stats() failed."; - } - } - - /* set *hit_rate_ptr if appropriate */ - if ( ( pass2 ) && ( hit_rate_ptr != NULL ) ) { - - *hit_rate_ptr = hit_rate; - } - - /* dump data to stdout if requested */ - if ( ( pass2 ) && ( dump_data ) ) { - - HDfprintf(stdout, - "cache_hits: %ld, cache_accesses: %ld, hit_rate: %lf\n", - (long)cache_hits, (long)cache_accesses, hit_rate); - } - - if ( ( pass2 ) && - ( cache_accesses > min_accesses ) && - ( hit_rate < min_hit_rate ) ) { - - pass2 = FALSE; - failure_mssg2 = "Unexpectedly low hit rate."; - } - - return; - -} /* check_and_validate_cache_hit_rate() */ - - -/*------------------------------------------------------------------------- - * Function: check_and_validate_cache_size() - * - * Purpose: Use the API function to get the cache size data. Verify - * that the values returned by the API call agree with - * the cache internal data structures. - * - * Return size data in the locations specified by the pointer - * parameters if these parameters are not NULL. Print the - * data to stdout if requested. - * - * If an error is detected, set pass2 to FALSE, and set - * failure_mssg2 to an appropriate value. - * - * Return: void - * - * Programmer: John Mainzer - * 4/18/04 - * - *------------------------------------------------------------------------- - */ - -void -check_and_validate_cache_size(hid_t file_id, - size_t * max_size_ptr, - size_t * min_clean_size_ptr, - size_t * cur_size_ptr, - int32_t * cur_num_entries_ptr, - hbool_t dump_data) -{ - /* const char * fcn_name = "check_and_validate_cache_size()"; */ - herr_t result; - size_t expected_max_size; - size_t max_size; - size_t expected_min_clean_size; - size_t min_clean_size; - size_t expected_cur_size; - size_t cur_size; - int32_t expected_cur_num_entries; - int cur_num_entries; - H5F_t * file_ptr = NULL; - H5C2_t * cache_ptr = NULL; - - /* get a pointer to the files internal data structure */ - if ( pass2 ) { - - file_ptr = (H5F_t *)H5I_object_verify(file_id, H5I_FILE); - - if ( file_ptr == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "Can't get file_ptr."; - - } else { - - cache_ptr = file_ptr->shared->cache2; - } - } - - /* verify that we can access the cache data structure */ - if ( pass2 ) { - - if ( ( cache_ptr == NULL ) || - ( cache_ptr->magic != H5C2__H5C2_T_MAGIC ) ) { - - pass2 = FALSE; - failure_mssg2 = "Can't access cache data structure."; - } - } - - /* compare the cache's internal configuration with the expected value */ - if ( pass2 ) { - - expected_max_size = cache_ptr->max_cache_size; - expected_min_clean_size = cache_ptr->min_clean_size; - expected_cur_size = cache_ptr->index_size; - expected_cur_num_entries = cache_ptr->index_len; - - result = H5Fget_mdc_size(file_id, - &max_size, - &min_clean_size, - &cur_size, - &cur_num_entries); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fget_mdc_size() failed."; - - } else if ( ( max_size != expected_max_size ) || - ( min_clean_size != expected_min_clean_size ) || - ( cur_size != expected_cur_size ) || - ( cur_num_entries != (int)expected_cur_num_entries ) ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fget_mdc_size() returned unexpected value(s)."; - - } - } - - /* return size values if requested */ - if ( ( pass2 ) && ( max_size_ptr != NULL ) ) { - - *max_size_ptr = max_size; - } - - if ( ( pass2 ) && ( min_clean_size_ptr != NULL ) ) { - - *min_clean_size_ptr = min_clean_size; - } - - if ( ( pass2 ) && ( cur_size_ptr != NULL ) ) { - - *cur_size_ptr = cur_size; - } - - if ( ( pass2 ) && ( cur_num_entries_ptr != NULL ) ) { - - *cur_num_entries_ptr = cur_num_entries; - } - - - /* dump data to stdout if requested */ - if ( ( pass2 ) && ( dump_data ) ) { - - HDfprintf(stdout, - "max_sz: %ld, min_clean_sz: %ld, cur_sz: %ld, cur_ent: %ld\n", - (long)max_size, (long)min_clean_size, (long)cur_size, - (long)cur_num_entries); - } - - return; - -} /* check_and_validate_cache_size() */ - - -/*------------------------------------------------------------------------- - * Function: validate_mdc_config() - * - * Purpose: Verify that the file indicated by the file_id parameter - * has both internal and external configuration matching - * *config_ptr. - * - * Do nothin on success. On failure, set pass2 to FALSE, and - * load an error message into failue_mssg. Note that - * failure_msg is assumed to be at least 128 bytes in length. - * - * Return: void - * - * Programmer: John Mainzer - * 4/14/04 - * - *------------------------------------------------------------------------- - */ - -void -validate_mdc_config(hid_t file_id, - H5AC2_cache_config_t * ext_config_ptr, - hbool_t compare_init, - int test_num) -{ - /* const char * fcn_name = "validate_mdc_config()"; */ - static char msg[256]; - H5F_t * file_ptr = NULL; - H5C2_t * cache_ptr = NULL; - H5AC2_cache_config_t scratch; - H5C2_auto_size_ctl_t int_config; - - XLATE_EXT_TO_INT_MDC_CONFIG(int_config, (*ext_config_ptr)) - - /* get a pointer to the files internal data structure */ - if ( pass2 ) { - - file_ptr = (H5F_t *)H5I_object_verify(file_id, H5I_FILE); - - if ( file_ptr == NULL ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, "Can't get file_ptr #%d.", test_num); - failure_mssg2 = msg; - - } else { - - cache_ptr = file_ptr->shared->cache2; - } - } - - /* verify that we can access the internal version of the cache config */ - if ( pass2 ) { - - if ( ( cache_ptr == NULL ) || - ( cache_ptr->magic != H5C2__H5C2_T_MAGIC ) || - ( cache_ptr->resize_ctl.version != H5C2__CURR_AUTO_SIZE_CTL_VER ) ){ - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "Can't access cache resize_ctl #%d.", test_num); - failure_mssg2 = msg; - } - } - - /* compare the cache's internal configuration with the expected value */ - if ( pass2 ) { - - if ( ! RESIZE_CONFIGS_ARE_EQUAL(int_config, cache_ptr->resize_ctl, - compare_init) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "Unexpected internal config #%d.", test_num); - failure_mssg2 = msg; - } - } - - /* obtain external cache config */ - if ( pass2 ) { - - scratch.version = H5AC2__CURR_CACHE_CONFIG_VERSION; - - if ( H5Fget_mdc_config(file_id, (H5AC1_cache_config_t *)&scratch) < 0 ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "H5Fget_mdc_config() failed #%d.", test_num); - failure_mssg2 = msg; - } - } - - if ( pass2 ) { - - /* Recall that in any configuration supplied by the cache - * at run time, the set_initial_size field will always - * be FALSE, regardless of the value pass2ed in. Thus we - * always presume that this field need not match that of - * the supplied external configuration. - * - * The cache also sets the initial_size field to the current - * cache max size instead of the value initialy supplied. - * Depending on circumstances, this may or may not match - * the original. Hence the compare_init parameter. - */ - if ( ! CACHE_CONFIGS_EQUAL((*ext_config_ptr), scratch, \ - FALSE, compare_init) ) { - - pass2 = FALSE; - HDsnprintf(msg, (size_t)128, - "Unexpected external config #%d.", test_num); - failure_mssg2 = msg; - } - } - - return; - -} /* validate_mdc_config() */ - diff --git a/test/cache2_common.h b/test/cache2_common.h deleted file mode 100644 index 892c767..0000000 --- a/test/cache2_common.h +++ /dev/null @@ -1,978 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * Copyright by the Board of Trustees of the University of Illinois. * - * All rights reserved. * - * * - * This file is part of HDF5. The full HDF5 copyright notice, including * - * terms governing use, modification, and redistribution, is contained in * - * the files COPYING and Copyright.html. COPYING can be found at the root * - * of the source code distribution tree; Copyright.html can be found at the * - * root level of an installed copy of the electronic HDF5 document set and * - * is linked from the top-level documents page. It can also be found at * - * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * - * access to either file, you may request a copy from help@hdfgroup.org. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* Programmer: John Mainzer - * 10/27/05 - * - * This file contains common #defines, type definitions, and - * externs for tests of the cache implemented in H5C2.c - */ -#include "h5test.h" -#include "H5Iprivate.h" -#include "H5AC2private.h" - -#define H5C2_PACKAGE /*suppress error about including H5Cpkg */ - -#include "H5C2pkg.h" - -#define H5F_PACKAGE /*suppress error about including H5Fpkg */ - -#include "H5Fpkg.h" - -#define NO_CHANGE -1 - -#define USE_CORE_DRIVER TRUE - -/* with apologies for the abuse of terminology... */ - -#define PICO_ENTRY_TYPE 0 -#define NANO_ENTRY_TYPE 1 -#define MICRO_ENTRY_TYPE 2 -#define TINY_ENTRY_TYPE 3 -#define SMALL_ENTRY_TYPE 4 -#define MEDIUM_ENTRY_TYPE 5 -#define LARGE_ENTRY_TYPE 6 -#define HUGE_ENTRY_TYPE 7 -#define MONSTER_ENTRY_TYPE 8 -#define VARIABLE_ENTRY_TYPE 9 - -#define NUMBER_OF_ENTRY_TYPES 10 - -#define PICO_ENTRY_SIZE (size_t)1 -#define NANO_ENTRY_SIZE (size_t)4 -#define MICRO_ENTRY_SIZE (size_t)16 -#define TINY_ENTRY_SIZE (size_t)64 -#define SMALL_ENTRY_SIZE (size_t)256 -#define MEDIUM_ENTRY_SIZE (size_t)1024 -#define LARGE_ENTRY_SIZE (size_t)(4 * 1024) -#define HUGE_ENTRY_SIZE (size_t)(16 * 1024) -#define MONSTER_ENTRY_SIZE (size_t)(64 * 1024) -#define VARIABLE_ENTRY_SIZE (size_t)(10 * 1024) - -#define NUM_PICO_ENTRIES (10 * 1024) -#define NUM_NANO_ENTRIES (10 * 1024) -#define NUM_MICRO_ENTRIES (10 * 1024) -#define NUM_TINY_ENTRIES (10 * 1024) -#define NUM_SMALL_ENTRIES (10 * 1024) -#define NUM_MEDIUM_ENTRIES (10 * 1024) -#define NUM_LARGE_ENTRIES (10 * 1024) -#define NUM_HUGE_ENTRIES (10 * 1024) -#define NUM_MONSTER_ENTRIES (10 * 1024) -#define NUM_VARIABLE_ENTRIES (10 * 1024) - -#define MAX_ENTRIES (10 * 1024) - - -/* The choice of the BASE_ADDR below is arbitrary -- it just has to be - * larger than the superblock. - */ -#define BASE_ADDR (haddr_t)1024 -#define PICO_BASE_ADDR BASE_ADDR -#define NANO_BASE_ADDR (haddr_t)(PICO_BASE_ADDR + \ - (PICO_ENTRY_SIZE * NUM_PICO_ENTRIES)) -#define MICRO_BASE_ADDR (haddr_t)(NANO_BASE_ADDR + \ - (NANO_ENTRY_SIZE * NUM_NANO_ENTRIES)) -#define TINY_BASE_ADDR (haddr_t)(MICRO_BASE_ADDR + \ - (MICRO_ENTRY_SIZE * NUM_MICRO_ENTRIES)) -#define SMALL_BASE_ADDR (haddr_t)(TINY_BASE_ADDR + \ - (TINY_ENTRY_SIZE * NUM_TINY_ENTRIES)) -#define MEDIUM_BASE_ADDR (haddr_t)(SMALL_BASE_ADDR + \ - (SMALL_ENTRY_SIZE * NUM_SMALL_ENTRIES)) -#define LARGE_BASE_ADDR (haddr_t)(MEDIUM_BASE_ADDR + \ - (MEDIUM_ENTRY_SIZE * NUM_MEDIUM_ENTRIES)) -#define HUGE_BASE_ADDR (haddr_t)(LARGE_BASE_ADDR + \ - (LARGE_ENTRY_SIZE * NUM_LARGE_ENTRIES)) -#define MONSTER_BASE_ADDR (haddr_t)(HUGE_BASE_ADDR + \ - (HUGE_ENTRY_SIZE * NUM_HUGE_ENTRIES)) -#define VARIABLE_BASE_ADDR (haddr_t)(MONSTER_BASE_ADDR + \ - (MONSTER_ENTRY_SIZE * NUM_MONSTER_ENTRIES)) - -#define PICO_ALT_BASE_ADDR (haddr_t)(VARIABLE_BASE_ADDR + \ - (VARIABLE_ENTRY_SIZE * NUM_VARIABLE_ENTRIES)) -#define NANO_ALT_BASE_ADDR (haddr_t)(PICO_ALT_BASE_ADDR + \ - (PICO_ENTRY_SIZE * NUM_PICO_ENTRIES)) -#define MICRO_ALT_BASE_ADDR (haddr_t)(NANO_ALT_BASE_ADDR + \ - (NANO_ENTRY_SIZE * NUM_NANO_ENTRIES)) -#define TINY_ALT_BASE_ADDR (haddr_t)(MICRO_ALT_BASE_ADDR + \ - (MICRO_ENTRY_SIZE * NUM_MICRO_ENTRIES)) -#define SMALL_ALT_BASE_ADDR (haddr_t)(TINY_ALT_BASE_ADDR + \ - (TINY_ENTRY_SIZE * NUM_TINY_ENTRIES)) -#define MEDIUM_ALT_BASE_ADDR (haddr_t)(SMALL_ALT_BASE_ADDR + \ - (SMALL_ENTRY_SIZE * NUM_SMALL_ENTRIES)) -#define LARGE_ALT_BASE_ADDR (haddr_t)(MEDIUM_ALT_BASE_ADDR + \ - (MEDIUM_ENTRY_SIZE * NUM_MEDIUM_ENTRIES)) -#define HUGE_ALT_BASE_ADDR (haddr_t)(LARGE_ALT_BASE_ADDR + \ - (LARGE_ENTRY_SIZE * NUM_LARGE_ENTRIES)) -#define MONSTER_ALT_BASE_ADDR (haddr_t)(HUGE_ALT_BASE_ADDR + \ - (HUGE_ENTRY_SIZE * NUM_HUGE_ENTRIES)) -#define VARIABLE_ALT_BASE_ADDR (haddr_t)(MONSTER_ALT_BASE_ADDR + \ - (MONSTER_ENTRY_SIZE * NUM_MONSTER_ENTRIES)) -#define MAX_ADDR (haddr_t)(VARIABLE_ALT_BASE_ADDR + \ - (VARIABLE_ENTRY_SIZE * NUM_VARIABLE_ENTRIES)) -#define ADDR_SPACE_SIZE (haddr_t)(MAX_ADDR - BASE_ADDR) - -#define MAX_PINS 8 /* Maximum number of entries that can be - * directly pinned by a single entry. - */ - -#define FLUSH_OP__NO_OP 0 -#define FLUSH_OP__DIRTY 1 -#define FLUSH_OP__RESIZE 2 -#define FLUSH_OP__RENAME 3 -#define FLUSH_OP__MAX_OP 3 - -#define MAX_FLUSH_OPS 10 /* Maximum number of flush operations - * that can be associated with a - * cache entry. - */ - -typedef struct flush_op -{ - int op_code; /* integer op code indicating the - * operation to be performed. At - * present it must be one of: - * - * FLUSH_OP__NO_OP - * FLUSH_OP__DIRTY - * FLUSH_OP__RESIZE - * FLUSH_OP__RENAME - */ - int type; /* type code of the cache entry that - * is the target of the operation. - * This value is passed into the - * function implementing the flush - * operation. - */ - int idx; /* index of the cache entry that - * is the target of the operation. - * This value is passed into the - * function implementing the flush - * operation. - */ - hbool_t flag; /* boolean flag passed into the - * function implementing the flush - * operation. The meaning of the - * flag is dependant upon the flush - * operation: - * - * FLUSH_OP__DIRTY: TRUE iff the - * target is pinned, and is to - * be dirtied via the - * H5C2_mark_pinned_entry_dirty() - * call. - * - * FLUSH_OP__RESIZE: TRUE iff the - * target is pinned, and is to - * be resized via the - * H5C2_mark_pinned_entry_dirty() - * call. - * - * FLUSH_OP__RENAME: TRUE iff the - * target is to be renamed to - * its main address. - */ - size_t size; /* New target size in the - * FLUSH_OP__RENAME operation. - * Unused elsewhere. - */ -} flush_op; - -typedef struct test_entry_t -{ - H5C2_cache_entry_t header; /* entry data used by the cache - * -- must be first - */ - struct test_entry_t * self; /* pointer to this entry -- used for - * sanity checking. - */ - H5F_t * file_ptr; /* pointer to the file in which the - * entry resides, or NULL if the entry - * is not in a file. - */ - H5C2_t * cache_ptr; /* pointer to the cache in which - * the entry resides, or NULL if the - * entry is not in cache. - */ - hbool_t written_to_main_addr; - /* Flag indicating whether an image - * of the entry has been written to - * its main address. Since we no - * longer have a flush callback, we - * set this field to true whenever the - * entry is serialized while at its - * main address. - */ - hbool_t written_to_alt_addr; - /* Flag indicating whether an image - * of the entry has been written to - * its alternate address. Since we no - * longer have a flush callback, we - * set this field to true whenever the - * entry is serialized while at its - * alternate address. - */ - haddr_t addr; /* where the cache thinks this entry - * is located - */ - hbool_t at_main_addr; /* boolean flag indicating whether - * the entry is supposed to be at - * either its main or alternate - * address. - */ - haddr_t main_addr; /* initial location of the entry - */ - haddr_t alt_addr; /* location to which the entry - * can be relocated or "renamed" - */ - size_t size; /* how big the cache thinks this - * entry is - */ - int32_t type; /* indicates which entry array this - * entry is in - */ - int32_t index; /* index in its entry array - */ - int32_t serializes; /* number of times this entry has - * been serialized. - */ - int32_t deserializes; /* number of times this entry has - * been deserialized - */ - hbool_t is_dirty; /* entry has been modified since - * last write - */ - hbool_t is_protected; /* entry should currently be on - * the cache's protected list. - */ - hbool_t is_read_only; /* TRUE iff the entry should be - * protected read only. - */ - int ro_ref_count; /* Number of outstanding read only - * protects on the entry. - */ - hbool_t is_pinned; /* entry is currently pinned in - * the cache. - */ - int pinning_ref_count; /* Number of entries that - * pin this entry in the cache. - * When this count drops to zero, - * this entry should be unpinned. - */ - int num_pins; /* Number of entries that this - * entry pins in the cache. This - * value must be in the range - * [0, MAX_PINS]. - */ - int pin_type[MAX_PINS]; /* array of the types of entries - * pinned by this entry. - */ - int pin_idx[MAX_PINS]; /* array of the indicies of - * entries pinned by this entry. - */ - int num_flush_ops; /* integer field containing the - * number of flush operations to - * be executed when the entry is - * flushed. This value must lie in - * the closed interval - * [0, MAX_FLUSH_OPS]. - */ - struct flush_op flush_ops[MAX_FLUSH_OPS]; /* Array of instances - * of struct flush_op detailing the - * flush operations (if any) that - * are to be executed when the entry - * is flushed from the cache. - * - * num_flush_ops contains the number - * of valid entries in this array. - */ - hbool_t flush_op_self_resize_in_progress; /* Boolean flag - * that is set to TRUE iff this - * entry is being flushed, it has - * been resized by a resize flush - * op, and the flush function has - * not yet returned, This field is - * used to turn off overactive santity - * checking code that would otherwise - * cause a false test failure. - */ - hbool_t deserialized; /* entry has been deserialized since - * the last time it was reset. - */ - hbool_t cleared; /* entry has been cleared since the - * last time it was reset. - */ - hbool_t serialized; /* entry has been serialized since the - * last time it was reset. - */ - hbool_t destroyed; /* entry has been destroyed since the - * last time it was reset. - */ -} test_entry_t; - -/* The following are cut down test versions of the hash table manipulation - * macros from H5C2pkg.c, which have been further modified to avoid references - * to the error reporting macros. Needless to say, these macros must be - * updated as necessary. - */ - -#define H5C2__HASH_MASK ((size_t)(H5C2__HASH_TABLE_LEN - 1) << 3) -#define H5C2__HASH_FCN(x) (int)(((x) & H5C2__HASH_MASK) >> 3) - -#define H5C2_TEST__PRE_HT_SEARCH_SC(cache_ptr, 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 ) ) { \ - HDfprintf(stdout, "Pre HT search SC failed.\n"); \ -} - -#define H5C2_TEST__POST_SUC_HT_SEARCH_SC(cache_ptr, entry_ptr, Addr, k) \ -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) ) ) ) { \ - HDfprintf(stdout, "Post successful HT search SC failed.\n"); \ -} - - -#define H5C2_TEST__SEARCH_INDEX(cache_ptr, Addr, entry_ptr) \ -{ \ - int k; \ - int depth = 0; \ - H5C2_TEST__PRE_HT_SEARCH_SC(cache_ptr, Addr) \ - 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 ) \ - { \ - H5C2_TEST__POST_SUC_HT_SEARCH_SC(cache_ptr, entry_ptr, Addr, k) \ - 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); \ - } \ - } \ -} - - -/* Macros used in H5AC2 level tests */ - -#define CACHE_CONFIGS_EQUAL(a, b, cmp_set_init, cmp_init_size) \ -( ( (a).version == (b).version ) && \ - ( (a).rpt_fcn_enabled == (b).rpt_fcn_enabled ) && \ - ( (a).open_trace_file == (b).open_trace_file ) && \ - ( (a).close_trace_file == (b).close_trace_file ) && \ - ( ( (a).open_trace_file == FALSE ) || \ - ( strcmp((a).trace_file_name, (b).trace_file_name) == 0 ) ) && \ - ( (a).evictions_enabled == (b).evictions_enabled ) && \ - ( ( ! cmp_set_init ) || \ - ( (a).set_initial_size == (b).set_initial_size ) ) && \ - ( ( ! cmp_init_size ) || \ - ( (a).initial_size == (b).initial_size ) ) && \ - ( DBL_REL_EQUAL((a).min_clean_fraction, (b).min_clean_fraction, 0.00001 ) ) && \ - ( (a).max_size == (b).max_size ) && \ - ( (a).min_size == (b).min_size ) && \ - ( (a).epoch_length == (b).epoch_length ) && \ - ( (a).incr_mode == (b).incr_mode ) && \ - ( DBL_REL_EQUAL((a).lower_hr_threshold, (b).lower_hr_threshold, 0.00001 ) ) && \ - ( DBL_REL_EQUAL((a).increment, (b).increment, 0.00001 ) ) && \ - ( (a).apply_max_increment == (b).apply_max_increment ) && \ - ( (a).max_increment == (b).max_increment ) && \ - ( (a).flash_incr_mode == (b).flash_incr_mode ) && \ - ( DBL_REL_EQUAL((a).flash_multiple, (b).flash_multiple, 0.00001 ) ) && \ - ( DBL_REL_EQUAL((a).flash_threshold, (b).flash_threshold, 0.00001 ) ) && \ - ( (a).decr_mode == (b).decr_mode ) && \ - ( DBL_REL_EQUAL((a).upper_hr_threshold, (b).upper_hr_threshold, 0.00001 ) ) && \ - ( DBL_REL_EQUAL((a).decrement, (b).decrement, 0.00001 ) ) && \ - ( (a).apply_max_decrement == (b).apply_max_decrement ) && \ - ( (a).max_decrement == (b).max_decrement ) && \ - ( (a).epochs_before_eviction == (b).epochs_before_eviction ) && \ - ( (a).apply_empty_reserve == (b).apply_empty_reserve ) && \ - ( DBL_REL_EQUAL((a).empty_reserve, (b).empty_reserve, 0.00001 ) ) ) - - -#define RESIZE_CONFIGS_ARE_EQUAL(a, b, compare_init) \ -( ( (a).version == (b).version ) && \ - ( (a).rpt_fcn == (b).rpt_fcn ) && \ - ( ( ! compare_init ) || \ - ( (a).set_initial_size == (b).set_initial_size ) ) && \ - ( ( ! compare_init ) || \ - ( (a).initial_size == (b).initial_size ) ) && \ - ( DBL_REL_EQUAL((a).min_clean_fraction, (b).min_clean_fraction, 0.00001 ) ) && \ - ( (a).max_size == (b).max_size ) && \ - ( (a).min_size == (b).min_size ) && \ - ( (a).epoch_length == (b).epoch_length ) && \ - ( (a).incr_mode == (b).incr_mode ) && \ - ( DBL_REL_EQUAL((a).lower_hr_threshold, (b).lower_hr_threshold, 0.00001 ) ) && \ - ( DBL_REL_EQUAL((a).increment, (b).increment, 0.00001 ) ) && \ - ( (a).apply_max_increment == (b).apply_max_increment ) && \ - ( (a).max_increment == (b).max_increment ) && \ - ( (a).flash_incr_mode == (b).flash_incr_mode ) && \ - ( DBL_REL_EQUAL((a).flash_multiple, (b).flash_multiple, 0.00001 ) ) && \ - ( DBL_REL_EQUAL((a).flash_threshold, (b).flash_threshold, 0.00001 ) ) && \ - ( (a).decr_mode == (b).decr_mode ) && \ - ( DBL_REL_EQUAL((a).upper_hr_threshold, (b).upper_hr_threshold, 0.00001 ) ) && \ - ( DBL_REL_EQUAL((a).decrement, (b).decrement, 0.00001 ) ) && \ - ( (a).apply_max_decrement == (b).apply_max_decrement ) && \ - ( (a).max_decrement == (b).max_decrement ) && \ - ( (a).epochs_before_eviction == (b).epochs_before_eviction ) && \ - ( (a).apply_empty_reserve == (b).apply_empty_reserve ) && \ - ( DBL_REL_EQUAL((a).empty_reserve, (b).empty_reserve, 0.00001 ) ) ) - - -#define XLATE_EXT_TO_INT_MDC_CONFIG(i, e) \ -{ \ - (i).version = H5C2__CURR_AUTO_SIZE_CTL_VER; \ - if ( (e).rpt_fcn_enabled ) \ - (i).rpt_fcn = H5C2_def_auto_resize_rpt_fcn; \ - else \ - (i).rpt_fcn = NULL; \ - (i).set_initial_size = (e).set_initial_size; \ - (i).initial_size = (e).initial_size; \ - (i).min_clean_fraction = (e).min_clean_fraction; \ - (i).max_size = (e).max_size; \ - (i).min_size = (e).min_size; \ - (i).epoch_length = (long int)((e).epoch_length); \ - (i).incr_mode = (e).incr_mode; \ - (i).lower_hr_threshold = (e).lower_hr_threshold; \ - (i).increment = (e).increment; \ - (i).apply_max_increment = (e).apply_max_increment; \ - (i).max_increment = (e).max_increment; \ - (i).flash_incr_mode = (e).flash_incr_mode; \ - (i).flash_multiple = (e).flash_multiple; \ - (i).flash_threshold = (e).flash_threshold; \ - (i).decr_mode = (e).decr_mode; \ - (i).upper_hr_threshold = (e).upper_hr_threshold; \ - (i).decrement = (e).decrement; \ - (i).apply_max_decrement = (e).apply_max_decrement; \ - (i).max_decrement = (e).max_decrement; \ - (i).epochs_before_eviction = (int)((e).epochs_before_eviction); \ - (i).apply_empty_reserve = (e).apply_empty_reserve; \ - (i).empty_reserve = (e).empty_reserve; \ -} - - - -/* misc type definitions */ - -struct flush_cache_test_spec -{ - int entry_num; - int entry_type; - int entry_index; - hbool_t insert_flag; - hbool_t dirty_flag; - unsigned int flags; - hbool_t expected_deserialized; - hbool_t expected_cleared; - hbool_t expected_serialized; - hbool_t expected_destroyed; -}; - -struct pe_flush_cache_test_spec -{ - int entry_num; - int entry_type; - int entry_index; - hbool_t insert_flag; - hbool_t dirty_flag; - unsigned int flags; - int num_pins; - int pin_type[MAX_PINS]; - int pin_idx[MAX_PINS]; - hbool_t expected_deserialized; - hbool_t expected_cleared; - hbool_t expected_serialized; - hbool_t expected_destroyed; -}; - -struct fo_flush_entry_check -{ - int entry_num; - int entry_type; - int entry_index; - size_t expected_size; - hbool_t in_cache; - hbool_t at_main_addr; - hbool_t is_dirty; - hbool_t is_protected; - hbool_t is_pinned; - hbool_t expected_deserialized; - hbool_t expected_cleared; - hbool_t expected_serialized; - hbool_t expected_destroyed; -}; - -struct fo_flush_cache_test_spec -{ - int entry_num; - int entry_type; - int entry_index; - hbool_t insert_flag; - unsigned int flags; - size_t new_size; - int num_pins; - int pin_type[MAX_PINS]; - int pin_idx[MAX_PINS]; - int num_flush_ops; - struct flush_op flush_ops[MAX_FLUSH_OPS]; - hbool_t expected_deserialized; - hbool_t expected_cleared; - hbool_t expected_serialized; - hbool_t expected_destroyed; -}; - -struct rename_entry_test_spec -{ - int entry_type; - int entry_index; - hbool_t is_dirty; - hbool_t is_pinned; -}; - -struct expected_entry_status -{ - int entry_type; - int entry_index; - size_t size; - hbool_t in_cache; - hbool_t at_main_addr; - hbool_t is_dirty; - hbool_t is_protected; - hbool_t is_pinned; - hbool_t deserialized; - hbool_t cleared; - hbool_t serialized; - hbool_t destroyed; -}; - - - - -/* global variable externs: */ - -extern haddr_t saved_actual_base_addr; -extern hbool_t write_permitted2; -extern hbool_t pass2; /* set to false on error */ -extern hbool_t skip_long_tests2; -extern hbool_t run_full_test2; -extern hbool_t try_core_file_driver; -extern hbool_t core_file_driver_failed; -extern const char *failure_mssg2; -extern int express_test2; -extern int failures2; - -extern test_entry_t pico_entries2[NUM_PICO_ENTRIES]; -extern test_entry_t nano_entries2[NUM_NANO_ENTRIES]; -extern test_entry_t micro_entries2[NUM_MICRO_ENTRIES]; -extern test_entry_t tiny_entries2[NUM_TINY_ENTRIES]; -extern test_entry_t small_entries2[NUM_SMALL_ENTRIES]; -extern test_entry_t medium_entries2[NUM_MEDIUM_ENTRIES]; -extern test_entry_t large_entries2[NUM_LARGE_ENTRIES]; -extern test_entry_t huge_entries2[NUM_HUGE_ENTRIES]; -extern test_entry_t monster_entries2[NUM_MONSTER_ENTRIES]; - -extern test_entry_t * entries2[NUMBER_OF_ENTRY_TYPES]; -extern const int32_t max_indices2[NUMBER_OF_ENTRY_TYPES]; -extern const size_t entry_sizes2[NUMBER_OF_ENTRY_TYPES]; -extern const haddr_t base_addrs2[NUMBER_OF_ENTRY_TYPES]; -extern const haddr_t alt_base_addrs2[NUMBER_OF_ENTRY_TYPES]; -extern const char * entry_type_names2[NUMBER_OF_ENTRY_TYPES]; - - -/* call back function declarations: */ - -herr_t check_write_permitted2(const H5F_t UNUSED * f, - hid_t UNUSED dxpl_id, - hbool_t * write_permitted_ptr); - -herr_t pico_clear_dirty_bits(haddr_t addr, size_t len, void * thing); -herr_t nano_clear_dirty_bits(haddr_t addr, size_t len, void * thing); -herr_t micro_clear_dirty_bits(haddr_t addr, size_t len, void * thing); -herr_t tiny_clear_dirty_bits(haddr_t addr, size_t len, void * thing); -herr_t small_clear_dirty_bits(haddr_t addr, size_t len, void * thing); -herr_t medium_clear_dirty_bits(haddr_t addr, size_t len, void * thing); -herr_t large_clear_dirty_bits(haddr_t addr, size_t len, void * thing); -herr_t huge_clear_dirty_bits(haddr_t addr, size_t len, void * thing); -herr_t monster_clear_dirty_bits(haddr_t addr, size_t len, void * thing); -herr_t variable_clear_dirty_bits(haddr_t addr, size_t len, void * thing); - - -void * pico_deserialize(haddr_t addr, size_t len, const void * image_ptr, - const void * udata_ptr, hbool_t * dirty_ptr); -void * nano_deserialize(haddr_t addr, size_t len, const void * image_ptr, - const void * udata_ptr, hbool_t * dirty_ptr); -void * micro_deserialize(haddr_t addr, size_t len, const void * image_ptr, - const void * udata_ptr, hbool_t * dirty_ptr); -void * tiny_deserialize(haddr_t addr, size_t len, const void * image_ptr, - const void * udata_ptr, hbool_t * dirty_ptr); -void * small_deserialize(haddr_t addr, size_t len, const void * image_ptr, - const void * udata_ptr, hbool_t * dirty_ptr); -void * medium_deserialize(haddr_t addr, size_t len, const void * image_ptr, - const void * udata_ptr, hbool_t * dirty_ptr); -void * large_deserialize(haddr_t addr, size_t len, const void * image_ptr, - const void * udata_ptr, hbool_t * dirty_ptr); -void * huge_deserialize(haddr_t addr, size_t len, const void * image_ptr, - const void * udata_ptr, hbool_t * dirty_ptr); -void * monster_deserialize(haddr_t addr, size_t len, const void * image_ptr, - const void * udata_ptr, hbool_t * dirty_ptr); -void * variable_deserialize(haddr_t addr, size_t len, const void * image_ptr, - const void * udata_ptr, hbool_t * dirty_ptr); - -herr_t pico_image_len(void *thing, size_t *image_len_ptr); -herr_t nano_image_len(void *thing, size_t *image_len_ptr); -herr_t micro_image_len(void *thing, size_t *image_len_ptr); -herr_t tiny_image_len(void *thing, size_t *image_len_ptr); -herr_t small_image_len(void *thing, size_t *image_len_ptr); -herr_t medium_image_len(void *thing, size_t *image_len_ptr); -herr_t large_image_len(void *thing, size_t *image_len_ptr); -herr_t huge_image_len(void *thing, size_t *image_len_ptr); -herr_t monster_image_len(void *thing, size_t *image_len_ptr); -herr_t variable_image_len(void *thing, size_t *image_len_ptr); - -herr_t pico_serialize(const H5F_t *f, hid_t dxpl_id, haddr_t addr, - size_t len, void * image_ptr, - void * thing, unsigned * flags_ptr, - haddr_t * new_addr_ptr, size_t * new_len_ptr, - void ** new_image_ptr_ptr); -herr_t nano_serialize(const H5F_t *f, hid_t dxpl_id, haddr_t addr, - size_t len, void * image_ptr, - void * thing, unsigned * flags_ptr, - haddr_t * new_addr_ptr, size_t * new_len_ptr, - void ** new_image_ptr_ptr); -herr_t micro_serialize(const H5F_t *f, hid_t dxpl_id, haddr_t addr, - size_t len, void * image_ptr, - void * thing, unsigned * flags_ptr, - haddr_t * new_addr_ptr, size_t * new_len_ptr, - void ** new_image_ptr_ptr); -herr_t tiny_serialize(const H5F_t *f, hid_t dxpl_id, haddr_t addr, - size_t len, void * image_ptr, - void * thing, unsigned * flags_ptr, - haddr_t * new_addr_ptr, size_t * new_len_ptr, - void ** new_image_ptr_ptr); -herr_t small_serialize(const H5F_t *f, hid_t dxpl_id, haddr_t addr, - size_t len, void * image_ptr, - void * thing, unsigned * flags_ptr, - haddr_t * new_addr_ptr, size_t * new_len_ptr, - void ** new_image_ptr_ptr); -herr_t medium_serialize(const H5F_t *f, hid_t dxpl_id, haddr_t addr, - size_t len, void * image_ptr, - void * thing, unsigned * flags_ptr, - haddr_t * new_addr_ptr, size_t * new_len_ptr, - void ** new_image_ptr_ptr); -herr_t large_serialize(const H5F_t *f, hid_t dxpl_id, haddr_t addr, - size_t len, void * image_ptr, - void * thing, unsigned * flags_ptr, - haddr_t * new_addr_ptr, size_t * new_len_ptr, - void ** new_image_ptr_ptr); -herr_t huge_serialize(const H5F_t *f, hid_t dxpl_id, haddr_t addr, - size_t len, void * image_ptr, - void * thing, unsigned * flags_ptr, - haddr_t * new_addr_ptr, size_t * new_len_ptr, - void ** new_image_ptr_ptr); -herr_t monster_serialize(const H5F_t *f, hid_t dxpl_id, haddr_t addr, - size_t len, void * image_ptr, - void * thing, unsigned * flags_ptr, - haddr_t * new_addr_ptr, size_t * new_len_ptr, - void ** new_image_ptr_ptr); -herr_t variable_serialize(const H5F_t *f, hid_t dxpl_id, haddr_t addr, - size_t len, void * image_ptr, - void * thing, unsigned * flags_ptr, - haddr_t * new_addr_ptr, size_t * new_len_ptr, - void ** new_image_ptr_ptr); - -herr_t pico_free_icr(haddr_t addr, size_t len, void * thing); -herr_t nano_free_icr(haddr_t addr, size_t len, void * thing); -herr_t micro_free_icr(haddr_t addr, size_t len, void * thing); -herr_t tiny_free_icr(haddr_t addr, size_t len, void * thing); -herr_t small_free_icr(haddr_t addr, size_t len, void * thing); -herr_t medium_free_icr(haddr_t addr, size_t len, void * thing); -herr_t large_free_icr(haddr_t addr, size_t len, void * thing); -herr_t huge_free_icr(haddr_t addr, size_t len, void * thing); -herr_t monster_free_icr(haddr_t addr, size_t len, void * thing); -herr_t variable_free_icr(haddr_t addr, size_t len, void * thing); - - -/* callback table extern */ - -extern const H5C2_class_t types2[NUMBER_OF_ENTRY_TYPES]; - - -/* function declarations: */ - -void add_flush_op2(int target_type, - int target_idx, - int op_code, - int type, - int idx, - hbool_t flag, - size_t size); - - -void addr_to_type_and_index2(haddr_t addr, - int32_t * type_ptr, - int32_t * index_ptr); - -#if 0 /* keep this for a while -- it may be useful */ -haddr_t type_and_index_to_addr2(int32_t type, - int32_t idx); -#endif - -void dirty_entry2(H5F_t * file_ptr, - int32_t type, - int32_t idx, - hbool_t dirty_pin); - -void expunge_entry2(H5F_t * file_ptr, - int32_t type, - int32_t idx); - -void insert_entry2(H5F_t * file_ptr, - int32_t type, - int32_t idx, - hbool_t dirty, - unsigned int flags); - -void mark_pinned_entry_dirty2(H5F_t * file_ptr, - int32_t type, - int32_t idx, - hbool_t size_changed, - size_t new_size); - -void mark_pinned_or_protected_entry_dirty2(H5F_t * file_ptr, - int32_t type, - int32_t idx); - -void rename_entry2(H5C2_t * cache_ptr, - int32_t type, - int32_t idx, - hbool_t main_addr); - -void pin_protected_entry2(H5F_t * file_ptr, - int32_t type, - int32_t idx); - -void protect_entry2(H5F_t * file_ptr, - int32_t type, - int32_t idx); - -void protect_entry_ro2(H5F_t * file_ptr, - int32_t type, - int32_t idx); - -hbool_t entry_in_cache2(H5C2_t * cache_ptr, - int32_t type, - int32_t idx); - -void create_pinned_entry_dependency2(H5F_t * file_ptr, - int pinning_type, - int pinning_idx, - int pinned_type, - int pinned_idx); - -void execute_flush_op2(H5F_t * file_ptr, - struct test_entry_t * entry_ptr, - struct flush_op * op_ptr, - unsigned * flags_ptr); - -hbool_t recommend_core_file_driver(void); - -void reset_entries2(void); - -void resize_entry2(H5F_t * file_ptr, - int32_t type, - int32_t idx, - size_t new_size, - hbool_t resize_pin); - -void resize_pinned_entry2(H5F_t * file_ptr, - int32_t type, - int32_t idx, - size_t new_size); - -H5F_t * setup_cache2(size_t max_cache_size, size_t min_clean_size); - -void row_major_scan_forward2(H5F_t * file_ptr, - int32_t max_index, - int32_t lag, - hbool_t verbose, - hbool_t reset_stats, - hbool_t display_stats, - hbool_t display_detailed_stats, - hbool_t do_inserts, - hbool_t dirty_inserts, - hbool_t do_renames, - hbool_t rename_to_main_addr, - hbool_t do_destroys, - hbool_t do_mult_ro_protects, - int dirty_destroys, - int dirty_unprotects); - -void hl_row_major_scan_forward2(H5F_t * file_ptr, - int32_t max_index, - hbool_t verbose, - hbool_t reset_stats, - hbool_t display_stats, - hbool_t display_detailed_stats, - hbool_t do_inserts, - hbool_t dirty_inserts); - -void row_major_scan_backward2(H5F_t * file_ptr, - int32_t max_index, - int32_t lag, - hbool_t verbose, - hbool_t reset_stats, - hbool_t display_stats, - hbool_t display_detailed_stats, - hbool_t do_inserts, - hbool_t dirty_inserts, - hbool_t do_renames, - hbool_t rename_to_main_addr, - hbool_t do_destroys, - hbool_t do_mult_ro_protects, - int dirty_destroys, - int dirty_unprotects); - -void hl_row_major_scan_backward2(H5F_t * file_ptr, - int32_t max_index, - hbool_t verbose, - hbool_t reset_stats, - hbool_t display_stats, - hbool_t display_detailed_stats, - hbool_t do_inserts, - hbool_t dirty_inserts); - -void col_major_scan_forward2(H5F_t * file_ptr, - int32_t max_index, - int32_t lag, - hbool_t verbose, - hbool_t reset_stats, - hbool_t display_stats, - hbool_t display_detailed_stats, - hbool_t do_inserts, - hbool_t dirty_inserts, - int dirty_unprotects); - -void hl_col_major_scan_forward2(H5F_t * file_ptr, - int32_t max_index, - hbool_t verbose, - hbool_t reset_stats, - hbool_t display_stats, - hbool_t display_detailed_stats, - hbool_t do_inserts, - hbool_t dirty_inserts, - int dirty_unprotects); - -void col_major_scan_backward2(H5F_t * file_ptr, - int32_t max_index, - int32_t lag, - hbool_t verbose, - hbool_t reset_stats, - hbool_t display_stats, - hbool_t display_detailed_stats, - hbool_t do_inserts, - hbool_t dirty_inserts, - int dirty_unprotects); - -void hl_col_major_scan_backward2(H5F_t * file_ptr, - int32_t max_index, - hbool_t verbose, - hbool_t reset_stats, - hbool_t display_stats, - hbool_t display_detailed_stats, - hbool_t do_inserts, - hbool_t dirty_inserts, - int dirty_unprotects); - -void takedown_cache2(H5F_t * file_ptr, - hbool_t dump_stats, - hbool_t dump_detailed_stats); - -void flush_cache2(H5F_t * file_ptr, - hbool_t destroy_entries, - hbool_t dump_stats, - hbool_t dump_detailed_stats); - -void unpin_entry2(H5F_t * file_ptr, - int32_t type, - int32_t idx); - -void unprotect_entry2(H5F_t * file_ptr, - int32_t type, - int32_t idx, - int dirty, - unsigned int flags); - -void unprotect_entry_with_size_change2(H5F_t * file_ptr, - int32_t type, - int32_t idx, - unsigned int flags, - size_t new_size); - -void verify_clean2(void); - -void verify_entry_status2(H5C2_t * cache_ptr, - int tag, - int num_entries, - struct expected_entry_status expected[]); - -void verify_unprotected2(void); - - -/*** H5AC2 level utility functions ***/ - -void check_and_validate_cache_hit_rate(hid_t file_id, - double * hit_rate_ptr, - hbool_t dump_data, - int64_t min_accesses, - double min_hit_rate); - -void check_and_validate_cache_size(hid_t file_id, - size_t * max_size_ptr, - size_t * min_clean_size_ptr, - size_t * cur_size_ptr, - int32_t * cur_num_entries_ptr, - hbool_t dump_data); - -void validate_mdc_config(hid_t file_id, - H5AC2_cache_config_t * ext_config_ptr, - hbool_t compare_init, - int test_num); - diff --git a/test/cache2_jnl_file_marking.c b/test/cache2_jnl_file_marking.c deleted file mode 100644 index ff46d2e..0000000 --- a/test/cache2_jnl_file_marking.c +++ /dev/null @@ -1,3605 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * Copyright by the Board of Trustees of the University of Illinois. * - * All rights reserved. * - * * - * This file is part of HDF5. The full HDF5 copyright notice, including * - * terms governing use, modification, and redistribution, is contained in * - * the files COPYING and Copyright.html. COPYING can be found at the root * - * of the source code distribution tree; Copyright.html can be found at the * - * root level of an installed copy of the electronic HDF5 document set and * - * is linked from the top-level documents page. It can also be found at * - * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * - * access to either file, you may request a copy from help@hdfgroup.org. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* Programmer: John Mainzer - * 3/08 - * - * This file contains tests for the metadata journaling - * features implemented in H5C2.c and friends. - */ - -#include - -#define H5F_PACKAGE /*suppress error about including H5Fpkg */ - -#include "h5test.h" -#include "H5Eprivate.h" -#include "H5Iprivate.h" -#include "H5MMprivate.h" /* Memory management */ -#include "H5MFprivate.h" -#include "H5AC2private.h" -#include "cache2_common.h" -#include "H5Fpkg.h" - -#define HDF5_FILE_NAME "HDF5.file" - -/* global variable declarations: */ - -const char *FILENAMES[] = { - "cache_test", - "cache_journal_test", - "cache_sb_test", - "journal_file", - "test_in_progress", - NULL -}; - - -/* private function declarations: */ - -/* utility functions */ - -static void check_test_in_progress(const char * str); - -static hbool_t file_exists(const char * file_path_ptr); - -static void mark_test_in_progress(const char * str); - -static void setup_cache_for_journaling(const char * hdf_file_name, - const char * journal_file_name, - hid_t * file_id_ptr, - H5F_t ** file_ptr_ptr, - H5C2_t ** cache_ptr_ptr, - hbool_t use_core_driver_if_avail); - -static void usage(void); - -/* test functions */ - -static void setup_mdj_file_marking_after_open_test(hbool_t verbose); -static void check_mdj_file_marking_after_open_test(hbool_t verbose); - -static void setup_mdj_file_marking_on_create_test(hbool_t verbose); -static void check_mdj_file_marking_on_create_test(hbool_t verbose); - -static void setup_mdj_file_marking_on_open_test(hbool_t verbose); -static void check_mdj_file_marking_on_open_test(hbool_t verbose); - -static void setup_mdj_file_unmarking_on_file_close_test(hbool_t verbose); -static void check_mdj_file_unmarking_on_file_close_test(hbool_t verbose); - -static void setup_mdj_file_unmarking_on_journaling_shutdown_test(hbool_t verbose); -static void check_mdj_file_unmarking_on_journaling_shutdown_test(hbool_t verbose); - -static void setup_mdj_file_unmarking_on_recovery_test(hbool_t verbose); -static void check_mdj_file_unmarking_on_recovery_test(hbool_t verbose); - - -/**************************************************************************/ -/**************************************************************************/ -/********************************* tests: *********************************/ -/**************************************************************************/ -/**************************************************************************/ - -/*** metadata journaling test utility functions ***/ - -/*------------------------------------------------------------------------- - * Function: check_test_in_progress() - * - * Purpose: If pass2 is true on entry, test to see if the test in - * progress file exists. If it does not, set pass2 to FALSE - * and set a failure message. - * - * If the test in progress file does exist, check to see if - * its contents matches the supplied string. It it does not, - * set pass2 to FALSE and set the appropriate failure message. - * - * Do nothing if pass2 is FALSE on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 10/9/08 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -static void -check_test_in_progress(const char * str) - -{ - const char * fcn_name = "check_test_in_progress()"; - char buffer[512]; - char filename[512]; - hbool_t show_progress = FALSE; - hbool_t verbose = FALSE; - size_t input_len; - int cp = 0; - herr_t result; - int fd = -1; - h5_stat_t buf; - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass2, cp++); - HDfflush(stdout); - } - - if ( pass2 ) { - - if ( ( str == NULL ) || - ( strlen(str) <= 0 ) || - ( strlen(str) >= 512 ) ) { - - pass2 = FALSE; - failure_mssg2 = "bad str on entry to check_test_in_progress()."; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass2, cp++); - HDfflush(stdout); - } - - /* setup the journal file name */ - if ( pass2 ) { - - if ( h5_fixname(FILENAMES[4], H5P_DEFAULT, filename, - sizeof(filename)) == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed.\n"; - } - else if ( strlen(filename) >= 512 ) { - - pass2 = FALSE; - failure_mssg2 = "test in progress file name too long.\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass2, cp++); - HDfflush(stdout); - } - - if ( verbose ) { - HDfprintf(stdout, "%s filename = \"%s\".\n", fcn_name, filename); - HDfflush(stdout); - } - - if ( ( pass2 ) && ( ! file_exists(filename) ) ) { - - pass2 = FALSE; - failure_mssg2 = "test not in progress?!?"; - } - - - /* get the length of the test in progress file */ - if ( pass2 ) { - - if ( HDstat(filename, &buf) != 0 ) { - - if ( verbose ) { - - HDfprintf(stdout, "%s: HDstat() failed with errno = %d.\n", - fcn_name, errno); - } - failure_mssg2 = "stat() failed on test in progress file."; - pass2 = FALSE; - - } else { - - if ( (buf.st_size) == 0 ) { - - failure_mssg2 = "test in progress file empty?!?"; - pass2 = FALSE; - - } else if ( (buf.st_size) >= 512 ) { - - failure_mssg2 = "test in progress file too big?!?"; - pass2 = FALSE; - - } else { - - input_len = (size_t)(buf.st_size); - - if ( verbose ) { - - HDfprintf(stdout, "%s: input_len = %d.\n", - fcn_name, (int)input_len); - } - } - } - } - - /* open the test in progress file */ - if ( pass2 ) { - - if ( (fd = HDopen(filename, O_RDONLY, 0777)) == -1 ) { - - if ( verbose ) { - - HDfprintf(stdout, "%s: HDopen(i) failed with errno = %d.\n", - fcn_name, errno); - } - failure_mssg2 = "Can't open test in progress file."; - pass2 = FALSE; - } - } - - /* read the contents of the test in progress file */ - if ( pass2 ) - { - result = HDread(fd, buffer, input_len); - - if ( result != (int)input_len ) { - - if ( verbose ) { - - HDfprintf(stdout, - "%s: HDread() failed. result = %d, errno = %d.\n", - fcn_name, (int)result, errno); - } - failure_mssg2 = "error reading test in progress file."; - pass2 = FALSE; - } - - buffer[input_len] = '\0'; - } - - if ( fd != -1 ) { - - if ( HDclose(fd) != 0 ) { - - if ( verbose ) { - - HDfprintf(stdout, "%s: HDclose() failed with errno = %d.\n", - fcn_name, errno); - } - - if ( pass2 ) { - - failure_mssg2 = "Can't close test in progress file."; - pass2 = FALSE; - } - } - } - - HDremove(filename); - - if ( pass2 ) { - - if ( strcmp(str, buffer) != 0 ) { - - if ( verbose ) { - - HDfprintf(stdout, - "%s: expected/actual test in progress = %s/%s\n", - fcn_name, str, buffer); - } - - pass2 = FALSE; - failure_mssg2 = "Unexpected test in progress?!?"; - } - } - - return; - -} /* check_test_in_progress() */ - - -/*------------------------------------------------------------------------- - * Function: file_exists() - * - * 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 - * error message. - * - * Do nothing and return FALSE if pass2 is FALSE on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 5//08 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -static hbool_t -file_exists(const char * file_path_ptr) -{ - const char * fcn_name = "file_exists()"; - hbool_t ret_val = FALSE; /* will set to TRUE if necessary */ - hbool_t verbose = FALSE; - h5_stat_t buf; - - if ( pass2 ) { - - if ( file_path_ptr == NULL ) { - - failure_mssg2 = "file_path_ptr NULL on entry?!?", - pass2 = FALSE; - } - } - - if ( pass2 ) { - - if ( HDstat(file_path_ptr, &buf) == 0 ) { - - if ( verbose ) { - - HDfprintf(stdout, "%s: HDstat(%s) succeeded.\n", fcn_name, - file_path_ptr); - } - - ret_val = TRUE; - - } else if ( errno == ENOENT ) { - - if ( verbose ) { - - HDfprintf(stdout, "%s: HDstat(%s) failed with ENOENT\n", - fcn_name, file_path_ptr); - } - - } else { - - if ( verbose ) { - - HDfprintf(stdout, - "%s: HDstat() failed with unexpected errno = %d.\n", - fcn_name, errno); - } - - failure_mssg2 = "HDstat() returned unexpected value."; - pass2 = FALSE; - - } - } - - return(ret_val); - -} /* file_exists() */ - - -/*------------------------------------------------------------------------- - * Function: mark_test_in_progress() - * - * Purpose: If pass2 is true on entry, test to see if the test in - * progress file exists. If it does, set pass2 to FALSE - * and set a failure message. - * - * If the test in progress file doesn't exist, create it, - * open it, write the supplied string to it, and then close - * it. If any errors are detected, set pass2 to FALSE, and - * set the appropriate failure message. - * - * Do nothing if pass2 is FALSE on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 10/9/08 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -static void -mark_test_in_progress(const char * str) - -{ - const char * fcn_name = "mark_test_in_progress()"; - char filename[512]; - hbool_t show_progress = FALSE; - hbool_t verbose = FALSE; - int cp = 0; - herr_t result; - int fd = -1; - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass2, cp++); - HDfflush(stdout); - } - - if ( pass2 ) { - - if ( ( str == NULL ) || - ( strlen(str) >= 512 ) ) { - - pass2 = FALSE; - failure_mssg2 = "bad str on entry to mark_test_in_progress()."; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass2, cp++); - HDfflush(stdout); - } - - /* setup the journal file name */ - if ( pass2 ) { - - if ( h5_fixname(FILENAMES[4], H5P_DEFAULT, filename, - sizeof(filename)) == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed.\n"; - } - else if ( strlen(filename) >= 512 ) { - - pass2 = FALSE; - failure_mssg2 = "test in progress file name too long.\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass2, cp++); - HDfflush(stdout); - } - - if ( verbose ) { - HDfprintf(stdout, "%s filename = \"%s\".\n", fcn_name, filename); - HDfflush(stdout); - } - - if ( ( pass2 ) && ( file_exists(filename) ) ) { - - pass2 = FALSE; - failure_mssg2 = "test already in progress?!?"; - } - - /* open the test in progress file */ - if ( pass2 ) { - - if ( (fd = HDopen(filename, O_WRONLY|O_CREAT|O_TRUNC, 0777)) - == -1 ) { - - if ( verbose ) { - - HDfprintf(stdout, "%s: HDopen(i) failed with errno = %d.\n", - fcn_name, errno); - } - failure_mssg2 = "Can't open test in progress file."; - pass2 = FALSE; - } - } - - if ( pass2 ) { - - result = HDwrite(fd, str, strlen(str)); - - if ( result != (int)strlen(str) ) { - - if ( verbose ) { - - HDfprintf(stdout, - "%s: HDwrite() failed. result = %d, errno = %d.\n", - fcn_name, (int)result, errno); - } - failure_mssg2 = "error writing test in progress file."; - pass2 = FALSE; - } - } - - if ( fd != -1 ) { - - if ( HDclose(fd) != 0 ) { - - if ( verbose ) { - - HDfprintf(stdout, "%s: HDclose() failed with errno = %d.\n", - fcn_name, errno); - } - - if ( pass2 ) { - - failure_mssg2 = "Can't close test in progress file."; - pass2 = FALSE; - } - } - } - - return; - -} /* mark_test_in_progress() */ - - -/*------------------------------------------------------------------------- - * 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 - * structures. and verify that it contains the expected data. - * - * 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. - * - * Return: void - * - * Programmer: John Mainzer - * 5/13/08 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -static void -setup_cache_for_journaling(const char * hdf_file_name, - const char * journal_file_name, - hid_t * file_id_ptr, - H5F_t ** file_ptr_ptr, - H5C2_t ** cache_ptr_ptr, -#if USE_CORE_DRIVER - hbool_t use_core_driver_if_avail) -#else /* USE_CORE_DRIVER */ - hbool_t UNUSED use_core_driver_if_avail) -#endif /* USE_CORE_DRIVER */ -{ - const char * fcn_name = "setup_cache_for_journaling()"; - hbool_t show_progress = FALSE; - hbool_t verbose = FALSE; - int cp = 0; - herr_t result; - H5AC2_cache_config_t mdj_config = - { - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ ( 64 * 1024 ), - /* double min_clean_fraction = */ 0.5, - /* size_t max_size = */ (16 * 1024 * 1024 ), - /* size_t min_size = */ ( 8 * 1024 ), - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__off, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 1.0, - /* double flash_threshold = */ 0.25, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__off, - /* double upper_hr_threshold = */ 0.999, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1, - /* int dirty_bytes_threshold = */ (8 * 1024) - }; - H5AC2_jnl_config_t jnl_config = - { - /* int version = */ H5AC2__CURR_JNL_CONFIG_VER, - /* hbool_t enable_journaling = */ TRUE, - /* char journal_file_path[] = */ "", - /* hbool_t journal_recovered = */ FALSE, - /* size_t jbrb_buf_size = */ (8 * 1024), - /* int jbrb_num_bufs = */ 2, - /* hbool_t jbrb_use_aio = */ FALSE, - /* hbool_t jbrb_human_readable = */ TRUE - }; - hid_t fapl_id = -1; - hid_t file_id = -1; - haddr_t actual_base_addr; - H5F_t * file_ptr = NULL; - H5C2_t * cache_ptr = NULL; - - if ( pass2 ) - { - if ( ( hdf_file_name == NULL ) || - ( journal_file_name == NULL ) || - ( file_id_ptr == NULL ) || - ( file_ptr_ptr == NULL ) || - ( cache_ptr_ptr == NULL ) ) { - - failure_mssg2 = - "Bad param(s) on entry to setup_cache_for_journaling().\n"; - pass2 = FALSE; - } - else if ( strlen(journal_file_name) > H5AC2__MAX_JOURNAL_FILE_NAME_LEN ) - { - failure_mssg2 = "journal file name too long.\n"; - pass2 = FALSE; - - } else { - - strcpy(jnl_config.journal_file_path, journal_file_name); - - if ( verbose ) { - - HDfprintf(stdout, "%s: HDF file name = \"%s\".\n", - fcn_name, hdf_file_name); - HDfprintf(stdout, "%s: journal file name = \"%s\".\n", - fcn_name, journal_file_name); - } - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* create a file access propertly list. */ - if ( pass2 ) { - - fapl_id = H5Pcreate(H5P_FILE_ACCESS); - - if ( fapl_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pcreate() failed.\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* call H5Pset_libver_bounds() on the fapl_id */ - if ( pass2 ) { - - if ( H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, - H5F_LIBVER_LATEST) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pset_libver_bounds() failed.\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - if ( pass2 ) { - - result = H5Pset_mdc_config(fapl_id, (H5AC1_cache_config_t *)&mdj_config); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pset_mdc_config() failed.\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - if ( pass2 ) { - - result = H5Pset_jnl_config(fapl_id, &jnl_config); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pset_mdc_config() failed.\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - -#if USE_CORE_DRIVER - if ( ( pass2 ) && ( use_core_driver_if_avail ) ) { - - if ( H5Pset_fapl_core(fapl_id, 64 * 1024 * 1024, FALSE) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5P_set_fapl_core() failed.\n"; - } - } -#endif /* USE_CORE_DRIVER */ - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - - /**************************************/ - /* Create a file with the fapl above. */ - /**************************************/ - - /* create the file using fapl_id */ - if ( pass2 ) { - - file_id = H5Fcreate(hdf_file_name, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id); - - if ( file_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fcreate() failed.\n"; - - } else { - - file_ptr = (H5F_t *)H5I_object_verify(file_id, H5I_FILE); - - if ( file_ptr == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "Can't get file_ptr."; - - if ( verbose ) { - HDfprintf(stdout, "%s: Can't get file_ptr.\n", fcn_name); - } - } - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - if ( pass2 ) { /* allocate space for test entries */ - - actual_base_addr = H5MF_alloc(file_ptr, H5FD_MEM_DEFAULT, H5P_DEFAULT, - (hsize_t)(ADDR_SPACE_SIZE + BASE_ADDR)); - - if ( actual_base_addr == HADDR_UNDEF ) { - - pass2 = FALSE; - failure_mssg2 = "H5MF_alloc() failed."; - - if ( verbose ) { - HDfprintf(stdout, "%s: H5MF_alloc() failed.\n", fcn_name); - } - - } else if ( actual_base_addr > BASE_ADDR ) { - - /* If this happens, must increase BASE_ADDR so that the - * actual_base_addr is <= BASE_ADDR. This should only happen - * if the size of the superblock is increase. - */ - pass2 = FALSE; - failure_mssg2 = "actual_base_addr > BASE_ADDR"; - - if ( verbose ) { - HDfprintf(stdout, "%s: actual_base_addr > BASE_ADDR.\n", - fcn_name); - } - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* 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"; - - } else { - - cache_ptr = file_ptr->shared->cache2; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - reset_entries2(); - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* close the fapl */ - if ( pass2 ) { - - if ( H5Pclose(fapl_id) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "error closing fapl.\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - if ( pass2 ) { - - *file_id_ptr = file_id; - *file_ptr_ptr = file_ptr; - *cache_ptr_ptr = cache_ptr; - } - - if ( show_progress ) - HDfprintf(stdout, "%s: cp = %d -- exiting.\n", fcn_name, cp++); - - return; - -} /* setup_cache_for_journaling() */ - - -/*************************************************************************** - * Function: setup_mdj_file_marking_on_create_test - * - * Purpose: Setup test to verify that HDF5 file is marked as having - * journaling in progress when journaling is enabled at file - * creation time. - * - * Do this by creating a test file with metadata journaling - * enabled, and then exiting without closing the file. - * - * Return: void - * - * Programmer: John Mainzer - * 10/8/08 - * - **************************************************************************/ - -static void -setup_mdj_file_marking_on_create_test(hbool_t verbose) -{ - const char * fcn_name = "setup_mdj_file_marking_on_create_test():"; - char filename[512]; - char journal_filename[H5AC2__MAX_JOURNAL_FILE_NAME_LEN + 1]; - hbool_t show_progress = FALSE; - int cp = 0; - uint64_t trans_num; - hid_t file_id = -1; - H5F_t * file_ptr = NULL; - H5C2_t * cache_ptr = NULL; - - /* setup the file name */ - if ( pass2 ) { - - if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, - sizeof(filename)) == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed (1).\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass2, cp++); - HDfflush(stdout); - } - - if ( verbose ) { - HDfprintf(stdout, "%s filename = \"%s\".\n", fcn_name, filename); - HDfflush(stdout); - } - - /* setup the journal file name */ - if ( pass2 ) { - - if ( h5_fixname(FILENAMES[3], H5P_DEFAULT, journal_filename, - sizeof(journal_filename)) == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed (2).\n"; - } - else if ( strlen(journal_filename) >= - H5AC2__MAX_JOURNAL_FILE_NAME_LEN ) { - - pass2 = FALSE; - failure_mssg2 = "journal file name too long.\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", - fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( verbose ) { - HDfprintf(stdout, "%s journal filename = \"%s\".\n", - fcn_name, journal_filename); - HDfflush(stdout); - } - - if ( pass2 ) { - - /* clean out any existing journal file */ - HDremove(journal_filename); - setup_cache_for_journaling(filename, journal_filename, &file_id, - &file_ptr, &cache_ptr, FALSE); - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - /* run a dummy transaction to fource metadata journaling - * initialization. - */ - H5C2_begin_transaction(cache_ptr, &trans_num, "dummy"); - H5C2_end_transaction(file_ptr, H5AC2_dxpl_id, cache_ptr, - trans_num, "dummy"); - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( ( verbose ) && ( ! pass2 ) ) { - HDfprintf(stdout, "%s%d failure_mssg = \"%s\".\n", - fcn_name, pass2, failure_mssg2); - HDfflush(stdout); - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d child exiting.\n", - fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - mark_test_in_progress("mdj_file_marking_on_create_test"); - - abort(); - - } - - return; - -} /* setup_mdj_file_marking_on_create_test() */ - - -/*************************************************************************** - * Function: check_mdj_file_marking_on_create_test - * - * Purpose: Check to see if a test to verify that a HDF5 file is marked - * as having journaling in progress when journaling is enabled - * at file creation time passes. - * - * Do this by trying to open the test file created by the - * associated setup function. Open should fail, as the file - * should be marked as journaling in progress. - * - * On either success or failure, clean up the test file and - * the associated journal file. - * - * Return: void - * - * Programmer: John Mainzer - * 10/8/08 - * - **************************************************************************/ - -static void -check_mdj_file_marking_on_create_test(hbool_t verbose) -{ - const char * fcn_name = "check_mdj_file_marking_on_create_test():"; - char filename[512]; - char journal_filename[H5AC2__MAX_JOURNAL_FILE_NAME_LEN + 1]; - hbool_t show_progress = FALSE; - int cp = 0; - hid_t file_id = -1; - hid_t fapl_id = -1; - - check_test_in_progress("mdj_file_marking_on_create_test"); - - /* setup the file name */ - if ( pass2 ) { - - if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, - sizeof(filename)) == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed (1).\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass2, cp++); - HDfflush(stdout); - } - - if ( verbose ) { - HDfprintf(stdout, "%s filename = \"%s\".\n", fcn_name, filename); - HDfflush(stdout); - } - - /* setup the journal file name */ - if ( pass2 ) { - - if ( h5_fixname(FILENAMES[3], H5P_DEFAULT, journal_filename, - sizeof(journal_filename)) == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed (2).\n"; - } - else if ( strlen(journal_filename) >= - H5AC2__MAX_JOURNAL_FILE_NAME_LEN ) { - - pass2 = FALSE; - failure_mssg2 = "journal file name too long.\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( verbose ) { - HDfprintf(stdout, "%s journal filename = \"%s\".\n", - fcn_name, journal_filename); - HDfflush(stdout); - } - - if ( pass2 ) { - - if ( show_progress ) { - - HDfprintf(stdout, "%s:%d: cp = %d child exited as expected.\n", - fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - /* create a file access propertly list. */ - if ( pass2 ) { - - fapl_id = H5Pcreate(H5P_FILE_ACCESS); - - if ( fapl_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pcreate() failed.\n"; - } - } - - if ( show_progress ) { - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - /* call H5Pset_libver_bounds() on the fapl_id */ - if ( pass2 ) { - - if ( H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, - H5F_LIBVER_LATEST) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pset_libver_bounds() failed.\n"; - } - } - - if ( show_progress ) { - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - /* attempt to open the file -- should fail as the child - * exited without closing the file properly, and thus - * the file should still be marked as having journaling - * in progress. - */ - - if ( pass2 ) { - - H5E_BEGIN_TRY { - - file_id = H5Fopen(filename, H5F_ACC_RDWR, fapl_id); - - } H5E_END_TRY; - - if ( file_id >= 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fopen() succeeded - 1."; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - /* delete the HDF5 file and journal file */ -#if 1 - HDremove(filename); - HDremove(journal_filename); -#endif - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d parent done.\n", - fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - } - - return; - -} /* check_mdj_file_marking_on_create_test() */ - - -/*************************************************************************** - * Function: setup_mdj_file_marking_after_open_test - * - * Purpose: Setup a test to verify that a HDF5 file is marked as having - * journaling in progress when journaling is enabled on an - * open file. - * - * Do this by: - * - * 1) creating a test file, - * - * 2) writing some data to it, - * - * 3) enable journaling on the open file via a call to - * H5Fset_mdc_config() - * - * 4) exiting without closing the file. - * - * set pass2 to FALSE and set a failure message if errors - * are detected. - * - * Return: void - * - * Programmer: John Mainzer - * 10/8/08 - * - **************************************************************************/ - -static void -setup_mdj_file_marking_after_open_test(hbool_t verbose) -{ - const char * fcn_name = "setup_mdj_file_marking_after_open_test():"; - char filename[512]; - char journal_filename[H5AC2__MAX_JOURNAL_FILE_NAME_LEN + 1]; - hbool_t show_progress = FALSE; - herr_t result; - int cp = 0; - hid_t file_id = -1; - hid_t fapl_id = -1; - hid_t dataset_id = -1; - hid_t dataspace_id = -1; - hsize_t dims[2]; - H5AC2_jnl_config_t jnl_config; - - /* setup the file name */ - if ( pass2 ) { - - if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, - sizeof(filename)) == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed (1).\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass2, cp++); - HDfflush(stdout); - } - - if ( verbose ) { - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass2, cp++); - HDfflush(stdout); - } - - /* setup the journal file name */ - if ( pass2 ) { - - if ( h5_fixname(FILENAMES[3], H5P_DEFAULT, journal_filename, - sizeof(journal_filename)) == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed (2).\n"; - } - else if ( strlen(journal_filename) >= - H5AC2__MAX_JOURNAL_FILE_NAME_LEN ) { - - pass2 = FALSE; - failure_mssg2 = "journal file name too long.\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( verbose ) { - HDfprintf(stdout, "%s journal filename = \"%s\".\n", - fcn_name, journal_filename); - HDfflush(stdout); - } - - if ( pass2 ) { - - /* create a file access propertly list. */ - if ( pass2 ) { - - fapl_id = H5Pcreate(H5P_FILE_ACCESS); - - if ( fapl_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pcreate() failed.\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass2, cp++); - HDfflush(stdout); - } - - /* call H5Pset_libver_bounds() on the fapl_id */ - if ( pass2 ) { - - if ( H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, - H5F_LIBVER_LATEST) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pset_libver_bounds() failed.\n"; - } - } - - /* open the file with a fapl indicating latest version of - * the file format. - */ - if ( pass2 ) { - - file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id); - - if ( file_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fcreate() failed.\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( pass2 ) { - - dims[0] = 4; - dims[1] = 6; - dataspace_id = H5Screate_simple(2, dims, NULL); - - if ( dataspace_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Screate_simple() failed."; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( pass2 ) { - - /* Create the dataset. */ - dataset_id = H5Dcreate2(file_id, "/dset", H5T_STD_I32BE, - dataspace_id, H5P_DEFAULT, - H5P_DEFAULT, H5P_DEFAULT); - - if ( dataspace_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Dcreate2() failed."; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - /* now enable journaling */ - if ( pass2 ) { - - jnl_config.version = H5AC2__CURR_JNL_CONFIG_VER; - - result = H5Fget_jnl_config(file_id, &jnl_config); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fget_jnl_config() failed.\n"; - } - - /* set journaling config fields to taste */ - jnl_config.enable_journaling = TRUE; - - strcpy(jnl_config.journal_file_path, journal_filename); - - 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_human_readable = TRUE; - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( pass2 ) { - - result = H5Fset_jnl_config(file_id, &jnl_config); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fset_jnl_config() failed.\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( ( verbose ) && ( ! pass2 ) ) { - HDfprintf(stdout, "%s%d failure_mssg = \"%s\".\n", - fcn_name, pass2, failure_mssg2); - HDfflush(stdout); - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d exiting.\n", - fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - mark_test_in_progress("mdj_file_marking_after_open_test"); - - abort(); - - } - - return; - -} /* setup_mdj_file_marking_after_open_test() */ - - -/*************************************************************************** - * Function: check_mdj_file_marking_after_open_test - * - * Purpose: Check to see if the test to rvVerify that a HDF5 file is - * marked as having journaling in progress when journaling is - * enabled on an open file passed. - * - * Try to open the test file created by the associated setup - * function. Open should fail, as the file should be marked - * as journaling in progress. - * - * On either success or failure, clean up the test file and - * the associated journal file. - * - * Return: void - * - * Programmer: John Mainzer - * 10/8/08 - * - **************************************************************************/ - -static void -check_mdj_file_marking_after_open_test(hbool_t verbose) -{ - const char * fcn_name = "check_mdj_file_marking_after_open_test():"; - char filename[512]; - char journal_filename[H5AC2__MAX_JOURNAL_FILE_NAME_LEN + 1]; - hbool_t show_progress = FALSE; - int cp = 0; - hid_t file_id = -1; - hid_t fapl_id = -1; - - check_test_in_progress("mdj_file_marking_after_open_test"); - - /* setup the file name */ - if ( pass2 ) { - - if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, - sizeof(filename)) == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed (1).\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass2, cp++); - HDfflush(stdout); - } - - if ( verbose ) { - HDfprintf(stdout, "%s filename = \"%s\".\n", fcn_name, filename); - HDfflush(stdout); - } - - /* setup the journal file name */ - if ( pass2 ) { - - if ( h5_fixname(FILENAMES[3], H5P_DEFAULT, journal_filename, - sizeof(journal_filename)) == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed (2).\n"; - } - else if ( strlen(journal_filename) >= - H5AC2__MAX_JOURNAL_FILE_NAME_LEN ) { - - pass2 = FALSE; - failure_mssg2 = "journal file name too long.\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", - fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( verbose ) { - HDfprintf(stdout, "%s journal filename = \"%s\".\n", - fcn_name, journal_filename); - HDfflush(stdout); - } - - if ( pass2 ) { - - /* create a file access propertly list. */ - if ( pass2 ) { - - fapl_id = H5Pcreate(H5P_FILE_ACCESS); - - if ( fapl_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pcreate() failed.\n"; - } - } - - if ( show_progress ) { - HDfprintf(stdout, "%s:%d cp = %d.\n", - fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - /* call H5Pset_libver_bounds() on the fapl_id */ - if ( pass2 ) { - - if ( H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, - H5F_LIBVER_LATEST) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pset_libver_bounds() failed.\n"; - } - } - - if ( show_progress ) { - HDfprintf(stdout, "%s%d cp = %d.\n", - fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - /* attempt to open the file -- should fail as the setup program - * exited without closing the file properly, and thus - * the file should still be marked as having journaling - * in progress. - */ - - if ( pass2 ) { - - H5E_BEGIN_TRY { - - file_id = H5Fopen(filename, H5F_ACC_RDWR, fapl_id); - - } H5E_END_TRY; - - if ( file_id >= 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fopen() succeeded - 2."; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", - fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - /* delete the HDF5 file and journal file */ -#if 1 - HDremove(filename); - HDremove(journal_filename); -#endif - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d parent done.\n", - fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - } - - return; - -} /* check_mdj_file_marking_after_open_test() */ - - -/*************************************************************************** - * Function: setup_mdj_file_marking_on_open_test - * - * Purpose: Setup test to verify that a HDF5 file is marked as having - * journaling in progress when journaling is enabled at file - * open time. - * - * Do this by: - * - * 1) creating a test file in the child, - * - * 2) writing some data to it, - * - * 3) closing the test file. - * - * 4) re-openting the test file with metadata journaling - * enabled, and then - * - * 5) exiting from the child without closing the file. - * - * Return: void - * - * Programmer: John Mainzer - * 10/8/08 - * - **************************************************************************/ - -static void -setup_mdj_file_marking_on_open_test(hbool_t verbose) -{ - const char * fcn_name = "setup_mdj_file_marking_on_open_test():"; - char filename[512]; - char journal_filename[H5AC2__MAX_JOURNAL_FILE_NAME_LEN + 1]; - hbool_t show_progress = FALSE; - herr_t result; - int cp = 0; - hid_t file_id = -1; - hid_t fapl_id = -1; - hid_t dataset_id = -1; - hid_t dataspace_id = -1; - hsize_t dims[2]; - H5F_t * file_ptr = NULL; - H5AC2_jnl_config_t jnl_config; - - /* setup the file name */ - if ( pass2 ) { - - if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, - sizeof(filename)) == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed (1).\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass2, cp++); - HDfflush(stdout); - } - - if ( verbose ) { - HDfprintf(stdout, "%s filename = \"%s\".\n", fcn_name, filename); - HDfflush(stdout); - } - - /* setup the journal file name */ - if ( pass2 ) { - - if ( h5_fixname(FILENAMES[3], H5P_DEFAULT, journal_filename, - sizeof(journal_filename)) == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed (2).\n"; - } - else if ( strlen(journal_filename) >= - H5AC2__MAX_JOURNAL_FILE_NAME_LEN ) { - - pass2 = FALSE; - failure_mssg2 = "journal file name too long.\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", - fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( verbose ) { - HDfprintf(stdout, "%s journal filename = \"%s\".\n", - fcn_name, journal_filename); - HDfflush(stdout); - } - - if ( pass2 ) { - -#if 0 /* JRM */ - /* Quincey: - * - * It looks like we may have a bug here -- - * - * In the original version of this test, I: - * - * 1) created a file using the default FAPL, - * - * 2) added a data set to the file - * - * 3) closed it, - * - * 4) tried to re-open it using a FAPL that set the - * latest format, and enabled journaling. - * - * I hit an assertion failure on step 4. - * - * I then modified the above to select the latest file - * format on file create, and the problem went away. - * - * Is this as it should be, or do we have a bug here? - * - * JRM -- 7/9/08 - */ - - if ( pass2 ) { - - file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, - H5P_DEFAULT); - - if ( file_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fcreate() failed.\n"; - } - } -#else /* JRM */ - - /* create a file access propertly list. */ - if ( pass2 ) { - - fapl_id = H5Pcreate(H5P_FILE_ACCESS); - - if ( fapl_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pcreate() failed.\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - /* call H5Pset_libver_bounds() on the fapl_id */ - if ( pass2 ) { - - if ( H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, - H5F_LIBVER_LATEST) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pset_libver_bounds() failed.\n"; - } - } - - /* open the file with a fapl indicating latest version of - * the file format. - */ - if ( pass2 ) { - - file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id); - - if ( file_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fcreate() failed.\n"; - } - } -#endif /* JRM */ - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( pass2 ) { - - dims[0] = 4; - dims[1] = 6; - dataspace_id = H5Screate_simple(2, dims, NULL); - - if ( dataspace_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Screate_simple() failed."; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( pass2 ) { - - /* Create the dataset. */ - dataset_id = H5Dcreate2(file_id, "/dset", H5T_STD_I32BE, - dataspace_id, H5P_DEFAULT, - H5P_DEFAULT, H5P_DEFAULT); - - if ( dataspace_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Dcreate2() failed."; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( pass2 ) { - - /* close the data set, the data space, and the file */ - if ( ( H5Dclose(dataset_id) < 0 ) || - ( H5Sclose(dataspace_id) < 0 ) || - ( H5Pclose(fapl_id) < 0 ) || - ( H5Fclose(file_id) < 0 ) ) { - - pass2 = FALSE; - failure_mssg2 = "data set, data space, or file close failed."; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - /* create a file access propertly list. */ - if ( pass2 ) { - - fapl_id = H5Pcreate(H5P_FILE_ACCESS); - - if ( fapl_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pcreate() failed.\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - /* call H5Pset_libver_bounds() on the fapl_id */ - if ( pass2 ) { - - if ( H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, - H5F_LIBVER_LATEST) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pset_libver_bounds() failed.\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( pass2 ) { - - jnl_config.version = H5AC2__CURR_JNL_CONFIG_VER; - - result = H5Pget_jnl_config(fapl_id, &jnl_config); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pget_jnl_config() failed.\n"; - } - - /* set journaling config fields to taste */ - jnl_config.enable_journaling = TRUE; - - strcpy(jnl_config.journal_file_path, journal_filename); - - 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_human_readable = TRUE; - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( pass2 ) { - - result = H5Pset_jnl_config(fapl_id, &jnl_config); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pset_jnl_config() failed.\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - /* open the file using fapl_id */ - if ( pass2 ) { - - file_id = H5Fopen(filename, H5F_ACC_RDWR, fapl_id); - - if ( file_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fopen() failed (9).\n"; - - } else { - - file_ptr = (H5F_t *)H5I_object_verify(file_id, H5I_FILE); - - if ( file_ptr == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "Can't get file_ptr."; - - if ( verbose ) { - - HDfprintf(stdout, "%s: Can't get file_ptr.\n",fcn_name); - } - } - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( ( verbose ) && ( ! pass2 ) ) { - - HDfprintf(stdout, "%s%d failure_mssg = \"%s\".\n", - fcn_name, pass2, failure_mssg2); - HDfflush(stdout); - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d exiting.\n", - fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - mark_test_in_progress("mdj_file_marking_on_open_test"); - - abort(); - } - - return; - -} /* setup_mdj_file_marking_on_open_test() */ - - -/*************************************************************************** - * Function: check_mdj_file_marking_on_open_test - * - * Purpose: Check to verify that a HDF5 file is marked as having - * journaling in progress when journaling is enabled at - * file open time. - * - * Do this by trying to open the test file created by the - * associated setup function. - * - * Open should fail, as the file should be marked as journaling - * in progress. - * - * On either success or failure, clean up the test file and - * the associated journal file. - * - * Return: void - * - * Programmer: John Mainzer - * 10/8/08 - * - **************************************************************************/ - -static void -check_mdj_file_marking_on_open_test(hbool_t verbose) -{ - const char * fcn_name = "check_mdj_file_marking_on_open_test():"; - char filename[512]; - char journal_filename[H5AC2__MAX_JOURNAL_FILE_NAME_LEN + 1]; - hbool_t show_progress = FALSE; - int cp = 0; - hid_t file_id = -1; - hid_t fapl_id = -1; - - check_test_in_progress("mdj_file_marking_on_open_test"); - - /* setup the file name */ - if ( pass2 ) { - - if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, - sizeof(filename)) == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed (1).\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass2, cp++); - HDfflush(stdout); - } - - if ( verbose ) { - HDfprintf(stdout, "%s filename = \"%s\".\n", fcn_name, filename); - HDfflush(stdout); - } - - /* setup the journal file name */ - if ( pass2 ) { - - if ( h5_fixname(FILENAMES[3], H5P_DEFAULT, journal_filename, - sizeof(journal_filename)) == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed (2).\n"; - } - else if ( strlen(journal_filename) >= - H5AC2__MAX_JOURNAL_FILE_NAME_LEN ) { - - pass2 = FALSE; - failure_mssg2 = "journal file name too long.\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( verbose ) { - HDfprintf(stdout, "%s journal filename = \"%s\".\n", - fcn_name, journal_filename); - HDfflush(stdout); - } - - if ( pass2 ) { - - /* create a file access propertly list. */ - if ( pass2 ) { - - fapl_id = H5Pcreate(H5P_FILE_ACCESS); - - if ( fapl_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pcreate() failed.\n"; - } - } - - if ( show_progress ) { - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - /* call H5Pset_libver_bounds() on the fapl_id */ - if ( pass2 ) { - - if ( H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, - H5F_LIBVER_LATEST) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pset_libver_bounds() failed.\n"; - } - } - - if ( show_progress ) { - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - /* attempt to open the file -- should fail as the child - * exited without closing the file properly, and thus - * the file should still be marked as having journaling - * in progress. - */ - - if ( pass2 ) { - - H5E_BEGIN_TRY { - - file_id = H5Fopen(filename, H5F_ACC_RDWR, fapl_id); - - } H5E_END_TRY; - - if ( file_id >= 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fopen() succeeded - 3."; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - /* delete the HDF5 file and journal file */ -#if 1 - HDremove(filename); - HDremove(journal_filename); -#endif - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d done.\n", - fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - } - - return; - -} /* check_mdj_file_marking_on_open_test() */ - - -/*************************************************************************** - * Function: setup_mdj_file_unmarking_on_file_close_test - * - * Purpose: Setup test to verify that a HDF5 file on which journaling - * is enabled is marked as having not having journaling in - * progress when the file is closed. - * - * Do this as follows: - * - * 1) create a test file with metadata journaling - * enabled, - * - * 2) perform some operation(s) that dirty metadata - * and result in journal activity. - * - * 3) close the file. - * - * Return: void - * - * Programmer: John Mainzer - * 10/8/08 - * - **************************************************************************/ - -static void -setup_mdj_file_unmarking_on_file_close_test(hbool_t verbose) -{ - const char * fcn_name = "setup_mdj_file_unmarking_on_file_close_test():"; - char filename[512]; - char journal_filename[H5AC2__MAX_JOURNAL_FILE_NAME_LEN + 1]; - hbool_t show_progress = FALSE; - int cp = 0; - hid_t file_id = -1; - hid_t dataset_id = -1; - hid_t dataspace_id = -1; - hsize_t dims[2]; - H5F_t * file_ptr = NULL; - H5C2_t * cache_ptr = NULL; - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d -- entering.\n", fcn_name, pass2, cp++); - HDfflush(stdout); - } - - /* setup the file name */ - if ( pass2 ) { - - if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, - sizeof(filename)) == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed (1).\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass2, cp++); - HDfflush(stdout); - } - - if ( verbose ) { - HDfprintf(stdout, "%s filename = \"%s\".\n", fcn_name, filename); - HDfflush(stdout); - } - - /* setup the journal file name */ - if ( pass2 ) { - - if ( h5_fixname(FILENAMES[3], H5P_DEFAULT, journal_filename, - sizeof(journal_filename)) == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed (2).\n"; - } - else if ( strlen(journal_filename) >= - H5AC2__MAX_JOURNAL_FILE_NAME_LEN ) { - - pass2 = FALSE; - failure_mssg2 = "journal file name too long.\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( verbose ) { - HDfprintf(stdout, "%s journal filename = \"%s\".\n", - fcn_name, journal_filename); - HDfflush(stdout); - } - - if ( pass2 ) { - - /* clean out any existing journal file */ - setup_cache_for_journaling(filename, journal_filename, &file_id, - &file_ptr, &cache_ptr, FALSE); - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - /* create a data set so as to force a bit of journaling */ - if ( pass2 ) { - - dims[0] = 4; - dims[1] = 6; - dataspace_id = H5Screate_simple(2, dims, NULL); - - if ( dataspace_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Screate_simple() failed."; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( pass2 ) { - - /* Create the dataset. */ - dataset_id = H5Dcreate2(file_id, "/dset", H5T_STD_I32BE, - dataspace_id, H5P_DEFAULT, - H5P_DEFAULT, H5P_DEFAULT); - - if ( dataspace_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Dcreate2() failed."; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - /* now close the file... */ - - if ( pass2 ) { - - if ( ( H5Dclose(dataset_id) < 0 ) || - ( H5Sclose(dataspace_id) < 0 ) || - ( H5Fclose(file_id) < 0 ) ) { - - pass2 = FALSE; - failure_mssg2 = "dataset, dataspace, or file close failed."; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - mark_test_in_progress("mdj_file_unmarking_on_file_close_test"); - - return; - -} /* setup_mdj_file_unmarking_on_file_close_test() */ - - -/*************************************************************************** - * Function: check_mdj_file_unmarking_on_file_close_test - * - * Purpose: Check to verify that a HDF5 file on which journaling is - * enabled is marked as having not having journaling in - * progress when the file is closed. - * - * To do this, attempt to re-open the file created by the - * associated setup function. This should succeed. - * - * On either success or failure, clean up the test file and - * the associated journal file. - * - * Return: void - * - * Programmer: John Mainzer - * 10/8/08 - * - **************************************************************************/ - -static void -check_mdj_file_unmarking_on_file_close_test(hbool_t verbose) -{ - const char * fcn_name = "check_mdj_file_unmarking_on_file_close_test():"; - char filename[512]; - char journal_filename[H5AC2__MAX_JOURNAL_FILE_NAME_LEN + 1]; - hbool_t show_progress = FALSE; - int cp = 0; - hid_t fapl_id = -1; - hid_t file_id = -1; - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d -- entering.\n", fcn_name, pass2, cp++); - HDfflush(stdout); - } - - check_test_in_progress("mdj_file_unmarking_on_file_close_test"); - - /* setup the file name */ - if ( pass2 ) { - - if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, - sizeof(filename)) == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed (1).\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass2, cp++); - HDfflush(stdout); - } - - if ( verbose ) { - HDfprintf(stdout, "%s filename = \"%s\".\n", fcn_name, filename); - HDfflush(stdout); - } - - /* setup the journal file name */ - if ( pass2 ) { - - if ( h5_fixname(FILENAMES[3], H5P_DEFAULT, journal_filename, - sizeof(journal_filename)) == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed (2).\n"; - } - else if ( strlen(journal_filename) >= - H5AC2__MAX_JOURNAL_FILE_NAME_LEN ) { - - pass2 = FALSE; - failure_mssg2 = "journal file name too long.\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( verbose ) { - HDfprintf(stdout, "%s journal filename = \"%s\".\n", - fcn_name, journal_filename); - HDfflush(stdout); - } - - /* attempt to re-open file created by setup. Should succeed */ - - /* create a file access propertly list. */ - if ( pass2 ) { - - fapl_id = H5Pcreate(H5P_FILE_ACCESS); - - if ( fapl_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pcreate() failed.\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - /* call H5Pset_libver_bounds() on the fapl_id */ - if ( pass2 ) { - - if ( H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, - H5F_LIBVER_LATEST) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pset_libver_bounds() failed.\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - /* attempt to open the file -- should succeed as the close should - * shutdown journaling. - */ - - if ( pass2 ) { - - file_id = H5Fopen(filename, H5F_ACC_RDWR, fapl_id); - - if ( file_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fopen() failed (10)."; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - /* close the file and fapl */ - - if ( pass2 ) { - - if ( ( H5Pclose(fapl_id) < 0 ) || - ( H5Fclose(file_id) < 0 ) ) { - - pass2 = FALSE; - failure_mssg2 = "fapl or file close failed."; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - /* delete the HDF5 file and journal file */ -#if 1 - HDremove(filename); - HDremove(journal_filename); -#endif - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - return; - -} /* verify_mdj_file_unmarking_on_file_close() */ - - -/*************************************************************************** - * Function: setup_mdj_file_unmarking_on_journaling_shutdown_test - * - * Purpose: Setup test to verify that a HDF5 file on which journaling - * is enabled is marked as having not having journaling in - * progress when journaling is disabled via the - * H5Fset_mdc_config() API call. - * - * Do this by: - * - * 1) creating a test file in the child with metadata - * journaling enabled, - * - * 2) performing some operation(s) that dirty metadata - * and result in journal activity. - * - * 3) using the H5Fset_mdc_config() to disable journaling. - * - * 4) exiting from the child without closing the file. - * - * Return: void - * - * Programmer: John Mainzer - * 7/9/08 - * - **************************************************************************/ - -static void -setup_mdj_file_unmarking_on_journaling_shutdown_test(hbool_t verbose) -{ - const char * fcn_name = - "setup_mdj_file_unmarking_on_journaling_shutdown_test():"; - char filename[512]; - char journal_filename[H5AC2__MAX_JOURNAL_FILE_NAME_LEN + 1]; - hbool_t show_progress = FALSE; - herr_t result; - int cp = 0; - hid_t file_id = -1; - hid_t dataset_id = -1; - hid_t dataspace_id = -1; - hsize_t dims[2]; - H5F_t * file_ptr = NULL; - H5C2_t * cache_ptr = NULL; - H5AC2_jnl_config_t jnl_config; - - /* setup the file name */ - if ( pass2 ) { - - if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, - sizeof(filename)) == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed (1).\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass2, cp++); - HDfflush(stdout); - } - - if ( verbose ) { - HDfprintf(stdout, "%s filename = \"%s\".\n", fcn_name, filename); - HDfflush(stdout); - } - - /* setup the journal file name */ - if ( pass2 ) { - - if ( h5_fixname(FILENAMES[3], H5P_DEFAULT, journal_filename, - sizeof(journal_filename)) == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed (2).\n"; - } - else if ( strlen(journal_filename) >= - H5AC2__MAX_JOURNAL_FILE_NAME_LEN ) { - - pass2 = FALSE; - failure_mssg2 = "journal file name too long.\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( verbose ) { - HDfprintf(stdout, "%s journal filename = \"%s\".\n", - fcn_name, journal_filename); - HDfflush(stdout); - } - - if ( pass2 ) { - - /* clean out any existing journal file */ - setup_cache_for_journaling(filename, journal_filename, &file_id, - &file_ptr, &cache_ptr, FALSE); - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - /* create a data set so as to force a bit of journaling */ - if ( pass2 ) { - - dims[0] = 4; - dims[1] = 6; - dataspace_id = H5Screate_simple(2, dims, NULL); - - if ( dataspace_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Screate_simple() failed."; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( pass2 ) { - - /* Create the dataset. */ - dataset_id = H5Dcreate2(file_id, "/dset", H5T_STD_I32BE, - dataspace_id, H5P_DEFAULT, - H5P_DEFAULT, H5P_DEFAULT); - - if ( dataspace_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Dcreate2() failed."; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - /* now dis-able journaling */ - if ( pass2 ) { - - jnl_config.version = H5AC2__CURR_JNL_CONFIG_VER; - - result = H5Fget_jnl_config(file_id, &jnl_config); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fget_jnl_config() failed.\n"; - } - - jnl_config.enable_journaling = FALSE; - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( pass2 ) { - - result = H5Fset_jnl_config(file_id, &jnl_config); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fset_jnl_config() failed.\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( ( verbose ) && ( ! pass2 ) ) { - HDfprintf(stdout, "%s%d failure_mssg = \"%s\".\n", - fcn_name, pass2, failure_mssg2); - HDfflush(stdout); - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d exiting.\n", - fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - mark_test_in_progress("mdj_file_unmarking_on_journaling_shutdown_test"); - - abort(); - } - - return; - -} /* setup_mdj_file_unmarking_on_journaling_shutdown_test() */ - - -/*************************************************************************** - * Function: check_mdj_file_unmarking_on_journaling_shutdown_test - * - * Purpose: Check to verify that a HDF5 file on which journaling is - * enabled is marked as having not having journaling in - * progress when journaling is disabled via the - * H5Fset_mdc_config() API call. - * - * Do this by trying to open the test file created by the - * associated setup function. - * - * Open should succeed, as the file should be marked as - * journaling not in progress. - * - * Note that the file will be synced out as part of the - * journaling shutdown process, so the metadata should be - * in a consistant state. Strictly speaking, this is not - * necessary for this test, for as long as the the file is - * not marked as having journaling in progress, we should - * pass. However, testing this without using the HDF5 - * library to open the file would be inconvenient -- hence - * we make use of the sync on journal shutdown to make the - * test easier to implement. - * - * On either success or failure, clean up the test file and - * the associated journal file. - * - * Return: void - * - * Programmer: John Mainzer - * 10/8/08 - * - **************************************************************************/ - -static void -check_mdj_file_unmarking_on_journaling_shutdown_test(hbool_t verbose) -{ - const char * fcn_name = - "check_mdj_file_unmarking_on_journaling_shutdown_test():"; - char filename[512]; - char journal_filename[H5AC2__MAX_JOURNAL_FILE_NAME_LEN + 1]; - hbool_t show_progress = FALSE; - int cp = 0; - hid_t file_id = -1; - hid_t fapl_id = -1; - - check_test_in_progress("mdj_file_unmarking_on_journaling_shutdown_test"); - - /* setup the file name */ - if ( pass2 ) { - - if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, - sizeof(filename)) == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed (1).\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass2, cp++); - HDfflush(stdout); - } - - if ( verbose ) { - HDfprintf(stdout, "%s filename = \"%s\".\n", fcn_name, filename); - HDfflush(stdout); - } - - /* setup the journal file name */ - if ( pass2 ) { - - if ( h5_fixname(FILENAMES[3], H5P_DEFAULT, journal_filename, - sizeof(journal_filename)) == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed (2).\n"; - } - else if ( strlen(journal_filename) >= - H5AC2__MAX_JOURNAL_FILE_NAME_LEN ) { - - pass2 = FALSE; - failure_mssg2 = "journal file name too long.\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( verbose ) { - HDfprintf(stdout, "%s journal filename = \"%s\".\n", - fcn_name, journal_filename); - HDfflush(stdout); - } - - if ( pass2 ) { - - /* create a file access propertly list. */ - if ( pass2 ) { - - fapl_id = H5Pcreate(H5P_FILE_ACCESS); - - if ( fapl_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pcreate() failed.\n"; - } - } - - if ( show_progress ) { - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - /* call H5Pset_libver_bounds() on the fapl_id */ - if ( pass2 ) { - - if ( H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, - H5F_LIBVER_LATEST) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pset_libver_bounds() failed.\n"; - } - } - - if ( show_progress ) { - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - /* attempt to open the file -- should succeed as the setup function - * disabled journaling just before exiting, which should have - * had the dual effect of marking the file as not having - * journaling in progress, and syncing the file out to disk. - */ - - file_id = H5Fopen(filename, H5F_ACC_RDWR, fapl_id); - - if ( file_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fopen() failed (11)."; - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - /* close the file and fapl */ - - if ( pass2 ) { - - if ( ( H5Pclose(fapl_id) < 0 ) || - ( H5Fclose(file_id) < 0 ) ) { - - pass2 = FALSE; - failure_mssg2 = "fapl or file close failed."; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - /* delete the HDF5 file and journal file */ -#if 1 - HDremove(filename); - HDremove(journal_filename); -#endif - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d done.\n", - fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - } - - return; - -} /* check_mdj_file_unmarking_on_journaling_shutdown_test() */ - - -/*************************************************************************** - * Function: setup_mdj_file_unmarking_on_recovery_test - * - * Purpose: Setup test to verify that HDF5 file that is marked as as - * having journaling in progress is unmarked when the file - * is opened with the journal_recovered flag set in the - * cache configuration structure in the file access - * property list. - * - * Do this by creating a test file metadata journaling enabled, - * and then exiting without closing the file. Note that - * we must flush the file before exiting, as we want the file - * to be readable, but be marked as journaling in progress. - * - * Return: void - * - * Programmer: John Mainzer - * 7/14/08 - * - **************************************************************************/ - -static void -setup_mdj_file_unmarking_on_recovery_test(hbool_t verbose) -{ - const char * fcn_name = "setup_mdj_file_unmarking_on_recovery_test():"; - char filename[512]; - char journal_filename[H5AC2__MAX_JOURNAL_FILE_NAME_LEN + 1]; - hbool_t show_progress = FALSE; - int cp = 0; - uint64_t trans_num; - hid_t file_id = -1; - H5F_t * file_ptr = NULL; - H5C2_t * cache_ptr = NULL; - - /* setup the file name */ - if ( pass2 ) { - - if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, - sizeof(filename)) == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed (1).\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass2, cp++); - HDfflush(stdout); - } - - if ( verbose ) { - HDfprintf(stdout, "%s filename = \"%s\".\n", fcn_name, filename); - HDfflush(stdout); - } - - /* setup the journal file name */ - if ( pass2 ) { - - if ( h5_fixname(FILENAMES[3], H5P_DEFAULT, journal_filename, - sizeof(journal_filename)) == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed (2).\n"; - } - else if ( strlen(journal_filename) >= - H5AC2__MAX_JOURNAL_FILE_NAME_LEN ) { - - pass2 = FALSE; - failure_mssg2 = "journal file name too long.\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( verbose ) { - HDfprintf(stdout, "%s journal filename = \"%s\".\n", - fcn_name, journal_filename); - HDfflush(stdout); - } - - if ( pass2 ) { - - /* clean out any existing journal file */ - HDremove(journal_filename); - setup_cache_for_journaling(filename, journal_filename, &file_id, - &file_ptr, &cache_ptr, FALSE); - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - /* run a dummy transaction to fource metadata journaling - * initialization. - */ - H5C2_begin_transaction(cache_ptr, &trans_num, "dummy"); - H5C2_end_transaction(file_ptr, H5AC2_dxpl_id, cache_ptr, - trans_num, "dummy"); - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - /* flush the file to ensure that it is in a readable state */ - if ( pass2 ) { - - if ( H5Fflush(file_id, H5F_SCOPE_GLOBAL) < 0 ) { - - if ( verbose ) { - - HDfprintf(stdout, "%s: H5Fflush() failed.\n", fcn_name); - HDfflush(stdout); - } - pass2 = FALSE; - failure_mssg2 = "H5Fflush() failed."; - } - } - - if ( ( verbose ) && ( ! pass2 ) ) { - HDfprintf(stdout, "%s%d failure_mssg = \"%s\".\n", - fcn_name, pass2, failure_mssg2); - HDfflush(stdout); - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d exiting.\n", - fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - mark_test_in_progress("mdj_file_unmarking_on_recovery_test"); - - abort(); - } - - return; - -} /* setup_mdj_file_unmarking_on_recovery_test() */ - - -/*************************************************************************** - * Function: check_mdj_file_unmarking_on_recovery_test - * - * Purpose: Check to verify that a HDF5 file that is marked as as - * having journaling in progress is unmarked when the file - * is opened with the journal_recovered flag set in the - * cache configuration structure in the file access property - * list. - * - * Do this by trying to open the test file created by the - * assocated setup function. - * - * Open should fail, as the file should be marked as journaling - * in progress. - * - * Try to open again with the journal_recovered flag set. This - * should succeed. - * - * Close and open again without the journal recovered flag - * set to verify that the file is no longer marked as - * having journaling in progress. - * - * On either success or failure, clean up the test file and - * the associated journal file. - * - * Return: void - * - * Programmer: John Mainzer - * 10/8/08 - * - **************************************************************************/ - -static void -check_mdj_file_unmarking_on_recovery_test(hbool_t verbose) -{ - const char * fcn_name = "check_mdj_file_unmarking_on_recovery_test():"; - char filename[512]; - char journal_filename[H5AC2__MAX_JOURNAL_FILE_NAME_LEN + 1]; - hbool_t show_progress = FALSE; - herr_t result; - int cp = 0; - hid_t file_id = -1; - hid_t fapl_id = -1; - H5AC2_jnl_config_t jnl_config; - - check_test_in_progress("mdj_file_unmarking_on_recovery_test"); - - /* setup the file name */ - if ( pass2 ) { - - if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, - sizeof(filename)) == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed (1).\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass2, cp++); - HDfflush(stdout); - } - - if ( verbose ) { - HDfprintf(stdout, "%s filename = \"%s\".\n", fcn_name, filename); - HDfflush(stdout); - } - - /* setup the journal file name */ - if ( pass2 ) { - - if ( h5_fixname(FILENAMES[3], H5P_DEFAULT, journal_filename, - sizeof(journal_filename)) == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed (2).\n"; - } - else if ( strlen(journal_filename) >= - H5AC2__MAX_JOURNAL_FILE_NAME_LEN ) { - - pass2 = FALSE; - failure_mssg2 = "journal file name too long.\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( verbose ) { - HDfprintf(stdout, "%s journal filename = \"%s\".\n", - fcn_name, journal_filename); - HDfflush(stdout); - } - - if ( pass2 ) { - - /* create a file access propertly list. */ - if ( pass2 ) { - - fapl_id = H5Pcreate(H5P_FILE_ACCESS); - - if ( fapl_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pcreate() failed.\n"; - } - } - - if ( show_progress ) { - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - /* call H5Pset_libver_bounds() on the fapl_id */ - if ( pass2 ) { - - if ( H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, - H5F_LIBVER_LATEST) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pset_libver_bounds() failed.\n"; - } - } - - if ( show_progress ) { - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - /* attempt to open the file -- should fail as the setup fcn - * exited without closing the file properly, and thus - * the file should still be marked as having journaling - * in progress. - */ - - if ( pass2 ) { - - H5E_BEGIN_TRY { - - file_id = H5Fopen(filename, H5F_ACC_RDWR, fapl_id); - - } H5E_END_TRY; - - if ( file_id >= 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fopen() succeeded - 4."; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - - /* now set the file recovered flag in the journal config - * structure in the fapl, and try to open again. Should - * succeed, and the file should not be marked as having - * journaling in progress. - */ - if ( pass2 ) { - - jnl_config.version = H5AC2__CURR_JNL_CONFIG_VER; - - result = H5Pget_jnl_config(fapl_id, &jnl_config); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pget_jnl_config() failed.\n"; - } - - jnl_config.journal_recovered = TRUE; - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( pass2 ) { - - result = H5Pset_jnl_config(fapl_id, &jnl_config); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pset_jnl_config() failed(1).\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( pass2 ) { - - file_id = H5Fopen(filename, H5F_ACC_RDWR, fapl_id); - - if ( file_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fopen() failed (12)."; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( pass2 ) { - - if ( H5Fclose(file_id) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fclose() failed(1)."; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - /* now, turn off the journal recovered flag, and try to - * open the file again. Should succeed. - */ - - if ( pass2 ) { - - jnl_config.journal_recovered = FALSE; - - result = H5Pset_jnl_config(fapl_id, &jnl_config); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pset_jnl_config() failed(2).\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( pass2 ) { - - file_id = H5Fopen(filename, H5F_ACC_RDWR, fapl_id); - - if ( file_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fopen() failed (13)."; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( pass2 ) { - - if ( ( H5Fclose(file_id) < 0 ) || - ( H5Pclose(fapl_id) < 0 ) ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fclose() or H5Pclose() failed(2)."; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - /* delete the HDF5 file and journal file */ -#if 1 - HDremove(filename); - HDremove(journal_filename); -#endif - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d done.\n", - fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - } - - return; - -} /* check_mdj_file_unmarking_on_recovery_test() */ - - -/*------------------------------------------------------------------------- - * Function: usage - * - * Purpose: Display a brief message describing the purpose and use - * of the program. - * - * Return: void - * - * Programmer: John Mainzer - * 10/8/08 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -void -usage(void) - -{ - const char * s[] = - { - "\n", - "cache2_jnl_file_marking:\n", - "\n", - "Setup or check the results of the specified test.\n", - "\n", - "usage: cache2_jnl_file_marking [verbose]\n", - "\n", - "where:\n", - "\n", - " ::= ( file_marking_after_open |\n", - " file_marking_on_create |\n", - " file_marking_on_open |\n", - " file_unmarking_on_file_close |\n", - " file_unmarking_on_journaling_shutdown |\n", - " file_unmarking_on_recovery )\n", - "\n", - " :: ( setup | check )\n", - "\n", - "Returns 0 on success, 1 on failure.\n", - "\n", - NULL, - }; - int i = 0; - - while ( s[i] != NULL ) { - - HDfprintf(stdout, "%s", s[i]); - i++; - } - - return; - -} /* usage() */ - - -/*------------------------------------------------------------------------- - * Function: main - * - * Purpose: Run the specified setup or check of metadata journaling - * HDF5 file marking or unmarking. - * - * Return: Success: 0 - * - * Failure: A positive integer. - * - * Programmer: John Mainzer - * 10/8/08 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -int -main(int argc, - char * argv[]) -{ - int express_test; - int result = 0; - hbool_t setup = FALSE; - hbool_t check = FALSE; - hbool_t verbose = FALSE; - - express_test = GetTestExpress(); - - pass2 = TRUE; - - if ( argc == 4 ) { - - if ( strcmp("verbose", argv[3]) == 0 ) { - - verbose = TRUE; - - } else { - - pass2 = FALSE; - usage(); - - } - - } else if ( argc != 3 ) { - - pass2 = FALSE; - usage(); - } - - if ( verbose ) { - - HDfprintf(stdout, "%s %s %s %s:\n", argv[0], argv[1], argv[2], argv[3]); - } - - if ( pass2 ) { - - if ( strcmp("setup", argv[2]) == 0 ) { - - setup = TRUE; - - } else if ( strcmp("check", argv[2]) == 0 ) { - - check = TRUE; - - } else { - - pass2 = FALSE; - usage(); - } - } - - if ( pass2 ) { - - H5open(); - - if ( strcmp("file_marking_after_open", argv[1]) == 0 ) { - - if ( setup ) { - - setup_mdj_file_marking_after_open_test(verbose); - - } else if ( check ) { - - check_mdj_file_marking_after_open_test(verbose); - - } else { - - pass2 = FALSE; - failure_mssg2 = "setup and check both FALSE?"; - } - - } else if ( strcmp("file_marking_on_create", argv[1]) == 0 ) { - - if ( setup ) { - - setup_mdj_file_marking_on_create_test(verbose); - - } else if ( check ) { - - check_mdj_file_marking_on_create_test(verbose); - - } else { - - pass2 = FALSE; - failure_mssg2 = "setup and check both FALSE?"; - } - - } else if ( strcmp("file_marking_on_open", argv[1]) == 0 ) { - - if ( setup ) { - - setup_mdj_file_marking_on_open_test(verbose); - - } else if ( check ) { - - check_mdj_file_marking_on_open_test(verbose); - - } else { - - pass2 = FALSE; - failure_mssg2 = "setup and check both FALSE?"; - } - - } else if ( strcmp("file_unmarking_on_file_close", argv[1]) == 0 ) { - - if ( setup ) { - - setup_mdj_file_unmarking_on_file_close_test(verbose); - - } else if ( check ) { - - check_mdj_file_unmarking_on_file_close_test(verbose); - - } else { - - pass2 = FALSE; - failure_mssg2 = "setup and check both FALSE?"; - } - - } else if ( strcmp("file_unmarking_on_journaling_shutdown", argv[1]) - == 0 ) { - - if ( setup ) { - - setup_mdj_file_unmarking_on_journaling_shutdown_test(verbose); - - } else if ( check ) { - - check_mdj_file_unmarking_on_journaling_shutdown_test(verbose); - - } else { - - pass2 = FALSE; - failure_mssg2 = "setup and check both FALSE?"; - } - - } else if ( strcmp("file_unmarking_on_recovery", argv[1]) == 0 ) { - - if ( setup ) { - - setup_mdj_file_unmarking_on_recovery_test(verbose); - - } else if ( check ) { - - check_mdj_file_unmarking_on_recovery_test(verbose); - - } else { - - pass2 = FALSE; - failure_mssg2 = "setup and check both FALSE?"; - } - - } else { - - pass2 = FALSE; - failure_mssg2 = "unknown test requested."; - usage(); - } - } - - if ( verbose ) { - - if ( pass2 ) { - - if ( setup ) { - - HDfprintf(stdout, "test setup succeeded.\n"); - - } else if ( check ) { - - HDfprintf(stdout, "test passed.\n"); - - } - } else { - - HDfprintf(stdout, "FAILED. Failure mssg = \"%s\"\n", - failure_mssg2); - } - } - - if ( ! pass2 ) { - - result = 1; - } - - if ( result != 0 ) { - - HDfprintf(stderr, "fail\n"); - } - - return(result); - -} /* main() */ - diff --git a/test/cache2_journal.c b/test/cache2_journal.c deleted file mode 100644 index dc400f8..0000000 --- a/test/cache2_journal.c +++ /dev/null @@ -1,14066 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * Copyright by the Board of Trustees of the University of Illinois. * - * All rights reserved. * - * * - * This file is part of HDF5. The full HDF5 copyright notice, including * - * terms governing use, modification, and redistribution, is contained in * - * the files COPYING and Copyright.html. COPYING can be found at the root * - * of the source code distribution tree; Copyright.html can be found at the * - * root level of an installed copy of the electronic HDF5 document set and * - * is linked from the top-level documents page. It can also be found at * - * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * - * access to either file, you may request a copy from help@hdfgroup.org. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* Programmer: John Mainzer - * 3/08 - * - * This file contains tests for the metadata journaling - * features implemented in H5C2.c and friends. - */ - -#include - -#define H5F_PACKAGE /*suppress error about including H5Fpkg */ - -#include "h5test.h" -#include "H5Eprivate.h" -#include "H5Iprivate.h" -#include "H5MMprivate.h" /* Memory management */ -#include "H5MFprivate.h" -#include "H5AC2private.h" -#include "H5C2private.h" -#include "cache2_common.h" -#include "H5Fpkg.h" - -#define HDF5_FILE_NAME "HDF5.file" - -/* global variable declarations: */ - -const char *FILENAMES[] = { - "cache_test", - "cache_journal_test", - "cache_sb_test", - "journal_file", - NULL -}; - -/* private function declarations: */ - -/* utility functions */ - -static void begin_trans(H5C2_t * cache_ptr, - hbool_t verbose, - uint64_t expected_trans_num, - const char * trans_name); - -static void copy_file(const char * input_file, - const char * output_file); - -static void end_trans(H5F_t * file_ptr, - H5C2_t * cache_ptr, - hbool_t verbose, - uint64_t trans_num, - const char * trans_name); - -static hbool_t file_exists(const char * file_path_ptr); - -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, - hbool_t verbose, - hbool_t reset_stats, - hbool_t display_stats, - hbool_t display_detailed_stats, - hbool_t do_inserts, - hbool_t dirty_inserts, - int dirty_unprotects, - uint64_t trans_num); - -static void jrnl_col_major_scan_forward2(H5F_t * file_ptr, - int32_t max_index, - int32_t lag, - hbool_t verbose, - hbool_t reset_stats, - hbool_t display_stats, - hbool_t display_detailed_stats, - hbool_t do_inserts, - hbool_t dirty_inserts, - int dirty_unprotects, - uint64_t trans_num); - -static void jrnl_row_major_scan_backward2(H5F_t * file_ptr, - int32_t max_index, - int32_t lag, - hbool_t verbose, - hbool_t reset_stats, - hbool_t display_stats, - hbool_t display_detailed_stats, - hbool_t do_inserts, - hbool_t dirty_inserts, - hbool_t do_renames, - hbool_t rename_to_main_addr, - hbool_t do_destroys, - hbool_t do_mult_ro_protects, - int dirty_destroys, - int dirty_unprotects, - uint64_t trans_num); - -static void jrnl_row_major_scan_forward2(H5F_t * file_ptr, - int32_t max_index, - int32_t lag, - hbool_t verbose, - hbool_t reset_stats, - hbool_t display_stats, - hbool_t display_detailed_stats, - hbool_t do_inserts, - hbool_t dirty_inserts, - hbool_t do_renames, - hbool_t rename_to_main_addr, - hbool_t do_destroys, - hbool_t do_mult_ro_protects, - int dirty_destroys, - int dirty_unprotects, - uint64_t trans_num); - -static void open_existing_file_for_journaling(const char * hdf_file_name, - const char * journal_file_name, - hid_t * file_id_ptr, - H5F_t ** file_ptr_ptr, - H5C2_t ** cache_ptr_ptr, - 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, - H5F_t ** file_ptr_ptr, - H5C2_t ** cache_ptr_ptr); - -static void setup_cache_for_journaling(const char * hdf_file_name, - const char * journal_file_name, - hid_t * file_id_ptr, - 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, - const char * filename, - const char * journal_filename, - hbool_t use_core_driver_if_avail); - -static void verify_journal_contents(const char * journal_file_path_ptr, - const char * expected_file_path_ptr, - hbool_t human_readable); - -static void verify_journal_deleted(const char * journal_file_path_ptr); - -static void verify_journal_empty(const char * journal_file_path_ptr); - -/* test functions */ - -static void check_buffer_writes(hbool_t use_aio); - -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, - int repeats); - -static void check_superblock_extensions(void); - -static void check_mdjsc_callbacks(void); - -static herr_t test_mdjsc_callback(const H5C2_mdj_config_t * config_ptr, - hid_t dxpl_id, - void * data_ptr); - -static void deregister_mdjsc_callback(H5F_t * file_ptr, - H5C2_t * cache_ptr, - int32_t idx); - -static void register_mdjsc_callback(H5F_t * file_ptr, - H5C2_t * cache_ptr, - H5C2_mdj_status_change_func_t fcn_ptr, - void * data_ptr, - int32_t * idx_ptr); - -static void verify_mdjsc_table_config(H5C2_t * cache_ptr, - int32_t table_len, - int32_t num_entries, - int32_t max_idx_in_use, - hbool_t * free_entries); - -static void verify_mdjsc_callback_deregistered(H5C2_t * cache_ptr, - int32_t idx); - -static void verify_mdjsc_callback_registered(H5C2_t * cache_ptr, - H5C2_mdj_status_change_func_t fcn_ptr, - void * data_ptr, - int32_t idx); - -static void verify_mdjsc_callback_error_rejection(void); - -static void verify_mdjsc_callback_execution(void); - -static void verify_mdjsc_callback_registration_deregistration(void); - -static void check_binary_message_format(void); - -static void verify_journal_msg(int fd, - uint8_t expected_msg[], - int expected_msg_len, - hbool_t last_msg, - const char * mismatch_failure_msg, - const char * read_failure_msg, - const char * eof_failure_msg, - const char * not_last_msg_msg); - -static void check_message_format(void); - -static void check_legal_calls(void); - -static void check_transaction_tracking(hbool_t use_aio); - -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, - hbool_t use_aio); - -static void mdj_smoke_check_01(hbool_t human_readable, - hbool_t use_aio); - -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, - uint64_t min_verify_val, - uint64_t verify_val); - - -/**************************************************************************/ -/**************************************************************************/ -/********************************* tests: *********************************/ -/**************************************************************************/ -/**************************************************************************/ - -/*** metadata journaling test utility functions ***/ - -/*------------------------------------------------------------------------- - * Function: begin_trans() - * - * 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 - * to point to an appropriate failure message. - * - * Do nothing if pass2 is FALSE on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 5/15/08 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -static void -begin_trans(H5C2_t * cache_ptr, - hbool_t verbose, - uint64_t expected_trans_num, - const char * trans_name) -{ - const char * fcn_name = "begin_trans()"; - herr_t result; - uint64_t trans_num = 0; - - if ( pass2 ) { - - result = H5C2_begin_transaction(cache_ptr, &trans_num, trans_name); - - if ( result < 0 ) { - - if ( verbose ) { - - HDfprintf(stdout, "%s: H5C2_begin_transaction(%s) failed.\n", - fcn_name, trans_name); - } - pass2 = FALSE; - failure_mssg2 = "H5C2_begin_transaction() failed.\n"; - - } else if ( trans_num != expected_trans_num ) { - - if ( verbose ) { - - HDfprintf(stdout, "%s: actual/expected trans num = %lld/%lld.\n", - fcn_name, (long long)trans_num, - (long long)expected_trans_num); - } - pass2 = FALSE; - failure_mssg2 = "begin_trans() issued unexpected trans_num.\n"; - } - } - - return; - -} /* begin_trans() */ - - -/*------------------------------------------------------------------------- - * 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 - * appropriate error message on failure. - * - * Do nothing if pass2 is false on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 5/15/08 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -static void -copy_file(const char * input_file, - const char * output_file) -{ - const char * fcn_name = "copy_file()"; - char buffer[(8 * 1024) + 1]; - hbool_t verbose = FALSE; - size_t cur_buf_len; - const size_t max_buf_len = (8 * 1024); - size_t input_len; - size_t input_remainder = 0; - ssize_t result; - int input_file_fd = -1; - int output_file_fd = -1; - h5_stat_t buf; - - if ( pass2 ) { - - if ( input_file == NULL ) { - - failure_mssg2 = "input_file NULL on entry?!?", - pass2 = FALSE; - - } else if ( output_file == NULL ) { - - failure_mssg2 = "output_file NULL on entry?!?", - pass2 = FALSE; - - } - } - - /* get the length of the input file */ - if ( pass2 ) { - - if ( HDstat(input_file, &buf) != 0 ) { - - if ( verbose ) { - - HDfprintf(stdout, "%s: HDstat() failed with errno = %d.\n", - fcn_name, errno); - } - failure_mssg2 = "stat() failed on journal file."; - pass2 = FALSE; - - } else { - - if ( (buf.st_size) == 0 ) { - - failure_mssg2 = "input file empty?!?"; - pass2 = FALSE; - - } else { - - input_len = (size_t)(buf.st_size); - input_remainder = input_len; - - if ( verbose ) { - - HDfprintf(stdout, "%s: input_len = %d.\n", - fcn_name, (int)input_len); - } - } - } - } - - /* open the input file */ - if ( pass2 ) { - - if ( (input_file_fd = HDopen(input_file, O_RDONLY, 0777)) == -1 ) { - - if ( verbose ) { - - HDfprintf(stdout, "%s: HDopen(i) failed with errno = %d.\n", - fcn_name, errno); - } - failure_mssg2 = "Can't open input file."; - pass2 = FALSE; - } - } - - /* open the output file */ - if ( pass2 ) { - - if ( (output_file_fd = HDopen(output_file, O_WRONLY|O_CREAT|O_TRUNC, 0777)) - == -1 ) { - - if ( verbose ) { - - HDfprintf(stdout, "%s: HDopen(i) failed with errno = %d.\n", - fcn_name, errno); - } - failure_mssg2 = "Can't open output file."; - pass2 = FALSE; - } - } - - while ( ( pass2 ) && - ( input_remainder > 0 ) ) - { - if ( input_remainder > max_buf_len ) { - - cur_buf_len = max_buf_len; - input_remainder -= max_buf_len; - - } else { - - cur_buf_len = input_remainder; - input_remainder = 0; - } - - result = HDread(input_file_fd, buffer, cur_buf_len); - - if ( result != (int)cur_buf_len ) { - - if ( verbose ) { - - HDfprintf(stdout, - "%s: HDread() failed. result = %d, errno = %d.\n", - fcn_name, (int)result, errno); - } - failure_mssg2 = "error reading input file."; - pass2 = FALSE; - } - - buffer[cur_buf_len] = '\0'; - - if ( pass2 ) { - - result = HDwrite(output_file_fd, buffer, cur_buf_len); - - if ( result != (int)cur_buf_len ) { - - if ( verbose ) { - - HDfprintf(stdout, - "%s: HDwrite() failed. result = %d, errno = %d.\n", - fcn_name, (int)result, errno); - } - failure_mssg2 = "error writing output file."; - pass2 = FALSE; - } - } - } - - if ( input_file_fd != -1 ) { - - if ( HDclose(input_file_fd) != 0 ) { - - if ( verbose ) { - - HDfprintf(stdout, "%s: HDclose(i) failed with errno = %d.\n", - fcn_name, errno); - } - - if ( pass2 ) { - - failure_mssg2 = "Can't close input file."; - pass2 = FALSE; - } - } - } - - if ( output_file_fd != -1 ) { - - if ( HDclose(output_file_fd) != 0 ) { - - if ( verbose ) { - - HDfprintf(stdout, "%s: HDclose(o) failed with errno = %d.\n", - fcn_name, errno); - } - - if ( pass2 ) { - - failure_mssg2 = "Can't close output file."; - pass2 = FALSE; - } - } - } - - return; - -} /* copy_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 - * message. - * - * Do nothing if pass2 is FALSE on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 5/15/08 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -static void -end_trans(H5F_t * file_ptr, - H5C2_t * cache_ptr, - hbool_t verbose, - uint64_t trans_num, - const char * trans_name) -{ - const char * fcn_name = "end_trans()"; - herr_t result; - - if ( pass2 ) { - - result = H5C2_end_transaction(file_ptr, H5AC2_dxpl_id, cache_ptr, - trans_num, trans_name); - - if ( result < 0 ) { - - if ( verbose ) { - HDfprintf(stdout, - "%s: H5C2_end_transaction(%lld, \"%s\") failed.\n", - fcn_name, (long long)trans_num, trans_name); - } - pass2 = FALSE; - failure_mssg2 = "H5C2_end_transaction() failed.\n"; - } - } - - return; - -} /* end_trans() */ - - -/*------------------------------------------------------------------------- - * Function: file_exists() - * - * 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 - * error message. - * - * Do nothing and return FALSE if pass2 is FALSE on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 5//08 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -static hbool_t -file_exists(const char * file_path_ptr) -{ - const char * fcn_name = "file_exists()"; - hbool_t ret_val = FALSE; /* will set to TRUE if necessary */ - hbool_t verbose = FALSE; - h5_stat_t buf; - - if ( pass2 ) { - - if ( file_path_ptr == NULL ) { - - failure_mssg2 = "file_path_ptr NULL on entry?!?", - pass2 = FALSE; - } - } - - if ( pass2 ) { - - if ( HDstat(file_path_ptr, &buf) == 0 ) { - - if ( verbose ) { - - HDfprintf(stdout, "%s: HDstat(%s) succeeded.\n", fcn_name, - file_path_ptr); - } - - ret_val = TRUE; - - } else if ( errno == ENOENT ) { - - if ( verbose ) { - - HDfprintf(stdout, "%s: HDstat(%s) failed with ENOENT\n", - fcn_name, file_path_ptr); - } - - } else { - - if ( verbose ) { - - HDfprintf(stdout, - "%s: HDstat() failed with unexpected errno = %d.\n", - fcn_name, errno); - } - - failure_mssg2 = "HDstat() returned unexpected value."; - pass2 = FALSE; - - } - } - - return(ret_val); - -} /* file_exists() */ - - -/*------------------------------------------------------------------------- - * 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 - * failure_mssg2 to point to an appropriate failure message. - * - * Do nothing if pass2 is FALSE on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 5/15/08 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -static void -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."; - } - } - - return; - -} /* flush_journal() */ - - -/*------------------------------------------------------------------------- - * 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. - * - * If pass2 is false on entry, do nothing. - * - * Note tht this function is an adaption of - * col_major_scan_backward2() - * - * Return: void - * - * Programmer: John Mainzer - * 5/20/08 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -void -jrnl_col_major_scan_backward2(H5F_t * file_ptr, - int32_t max_index, - int32_t lag, - hbool_t verbose, - hbool_t reset_stats, - hbool_t display_stats, - hbool_t display_detailed_stats, - hbool_t do_inserts, - hbool_t dirty_inserts, - int dirty_unprotects, - uint64_t trans_num) -{ - const char * fcn_name = "jrnl_col_major_scan_backward2()"; - H5C2_t * cache_ptr; - int i; - int mile_stone = 1; - int32_t type; - int32_t idx; - int32_t local_max_index[NUMBER_OF_ENTRY_TYPES]; - - if ( verbose ) - HDfprintf(stdout, "%s: entering.\n", fcn_name); - - if ( pass2 ) { - - cache_ptr = file_ptr->shared->cache2; - - HDassert( cache_ptr != NULL ); - - for ( i = 0; i < NUMBER_OF_ENTRY_TYPES; i++ ) - { - local_max_index[i] = MIN(max_index, max_indices2[i]); - } - - HDassert( lag > 5 ); - - if ( reset_stats ) { - - H5C2_stats__reset(cache_ptr); - } - - idx = local_max_index[NUMBER_OF_ENTRY_TYPES - 1] + lag; - } - - if ( verbose ) /* 1 */ - HDfprintf(stdout, "%s: point %d.\n", fcn_name, mile_stone++); - - - while ( ( pass2 ) && ( (idx + lag) >= 0 ) ) - { - type = NUMBER_OF_ENTRY_TYPES - 1; - - 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); - } - - while ( ( pass2 ) && ( type >= 0 ) ) - { - if ( verbose ) { - - HDfprintf(stdout, "%d:%d: ", type, idx); - } - - if ( ( pass2 ) && ( do_inserts) && ( (idx - lag) >= 0 ) && - ( (idx - lag) <= local_max_index[type] ) && - ( ((idx - lag) % 3) == 0 ) && - ( ! entry_in_cache2(cache_ptr, type, (idx - lag)) ) ) { - - if ( verbose ) - HDfprintf(stdout, "(i, %d, %d) ", type, (idx - lag)); - - insert_entry2(file_ptr, type, (idx - lag), dirty_inserts, - H5C2__NO_FLAGS_SET); - } - - if ( ( pass2 ) && - ( idx >= 0 ) && - ( idx <= local_max_index[type] ) ) { - - if ( verbose ) - HDfprintf(stdout, "(p, %d, %d) ", type, idx); - - protect_entry2(file_ptr, type, idx); - } - - if ( ( pass2 ) && ( (idx + lag) >= 0 ) && - ( (idx + lag) <= local_max_index[type] ) ) { - - if ( verbose ) - HDfprintf(stdout, "(u, %d, %d) ", type, (idx + lag)); - - unprotect_entry2(file_ptr, type, idx + lag, - dirty_unprotects, H5C2__NO_FLAGS_SET); - } - - if ( verbose ) - HDfprintf(stdout, "\n"); - - type--; - } - - end_trans(file_ptr, cache_ptr, verbose, trans_num, - "jrnl_col_major_scan_backward outer loop"); - - if ( verbose ) { - - HDfprintf(stdout, "end trans %lld, idx = %d.\n", trans_num, idx); - } - - if ( ( verbose ) && ( ! pass2 ) ) { - - HDfprintf(stdout, "pass2 == FALSE, failure mssg = \"%s\".\n", - failure_mssg2); - } - - idx--; - } - - if ( verbose ) /* 2 */ - HDfprintf(stdout, "%s: point %d.\n", fcn_name, mile_stone++); - - if ( ( pass2 ) && ( display_stats ) ) { - - H5C2_stats(cache_ptr, "test cache", display_detailed_stats); - } - - if ( verbose ) - HDfprintf(stdout, "%s: exiting.\n", fcn_name); - - return; - -} /* jrnl_col_major_scan_backward2() */ - - -/*------------------------------------------------------------------------- - * 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. - * - * Note that this function is an adaption of - * col_major_scan_forward2(). - * - * If pass2 is false on entry, do nothing. - * - * Return: void - * - * Programmer: John Mainzer - * 5/20/08 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -void -jrnl_col_major_scan_forward2(H5F_t * file_ptr, - int32_t max_index, - int32_t lag, - hbool_t verbose, - hbool_t reset_stats, - hbool_t display_stats, - hbool_t display_detailed_stats, - hbool_t do_inserts, - hbool_t dirty_inserts, - int dirty_unprotects, - uint64_t trans_num) -{ - const char * fcn_name = "jrnl_col_major_scan_forward2()"; - H5C2_t * cache_ptr; - int i; - int32_t type; - int32_t idx; - int32_t local_max_index[NUMBER_OF_ENTRY_TYPES]; - - if ( verbose ) - HDfprintf(stdout, "%s: entering.\n", fcn_name); - - if ( pass2 ) { - - cache_ptr = file_ptr->shared->cache2; - - HDassert( cache_ptr != NULL ); - - for ( i = 0; i < NUMBER_OF_ENTRY_TYPES; i++ ) - { - local_max_index[i] = MIN(max_index, max_indices2[i]); - } - - HDassert( lag > 5 ); - - type = 0; - - if ( reset_stats ) { - - H5C2_stats__reset(cache_ptr); - } - - idx = -lag; - } - - while ( ( pass2 ) && ( (idx - lag) <= MAX_ENTRIES ) ) - { - type = 0; - - 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); - } - - while ( ( pass2 ) && ( type < NUMBER_OF_ENTRY_TYPES ) ) - { - if ( verbose ) { - - HDfprintf(stdout, "%d:%d: ", type, idx); - } - - if ( ( pass2 ) && ( do_inserts ) && ( (idx + lag) >= 0 ) && - ( (idx + lag) <= local_max_index[type] ) && - ( ((idx + lag) % 3) == 0 ) && - ( ! entry_in_cache2(cache_ptr, type, (idx + lag)) ) ) { - - if ( verbose ) - HDfprintf(stdout, "(i, %d, %d) ", type, (idx + lag)); - - insert_entry2(file_ptr, type, (idx + lag), dirty_inserts, - H5C2__NO_FLAGS_SET); - } - - if ( ( pass2 ) && - ( idx >= 0 ) && - ( idx <= local_max_index[type] ) ) { - - if ( verbose ) - HDfprintf(stdout, "(p, %d, %d) ", type, idx); - - protect_entry2(file_ptr, type, idx); - } - - if ( ( pass2 ) && ( (idx - lag) >= 0 ) && - ( (idx - lag) <= local_max_index[type] ) ) { - - if ( verbose ) - HDfprintf(stdout, "(u, %d, %d) ", type, (idx - lag)); - - unprotect_entry2(file_ptr, type, idx - lag, - dirty_unprotects, H5C2__NO_FLAGS_SET); - } - - if ( verbose ) - HDfprintf(stdout, "\n"); - - type++; - } - - end_trans(file_ptr, cache_ptr, verbose, trans_num, - "jrnl_col_major_scan_forward outer loop"); - - if ( verbose ) { - - HDfprintf(stdout, "end trans %lld, idx = %d.\n", trans_num, idx); - } - - if ( ( verbose ) && ( ! pass2 ) ) { - - HDfprintf(stdout, "pass2 == FALSE, failure mssg = \"%s\".\n", - failure_mssg2); - } - - idx++; - } - - if ( ( pass2 ) && ( display_stats ) ) { - - H5C2_stats(cache_ptr, "test cache", display_detailed_stats); - } - - return; - -} /* jrnl_col_major_scan_forward2() */ - - -/*------------------------------------------------------------------------- - * 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. - * - * If pass2 is false on entry, do nothing. - * - * Note that this function is an adaption of - * row_major_scan_backward2() - * - * Return: void - * - * Programmer: John Mainzer - * 5/20/08 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -void -jrnl_row_major_scan_backward2(H5F_t * file_ptr, - int32_t max_index, - int32_t lag, - hbool_t verbose, - hbool_t reset_stats, - hbool_t display_stats, - hbool_t display_detailed_stats, - hbool_t do_inserts, - hbool_t dirty_inserts, - hbool_t do_renames, - hbool_t rename_to_main_addr, - hbool_t do_destroys, - hbool_t do_mult_ro_protects, - int dirty_destroys, - int dirty_unprotects, - uint64_t trans_num) -{ - const char * fcn_name = "jrnl_row_major_scan_backward2"; - H5C2_t * cache_ptr; - int32_t type; - int32_t idx; - int32_t local_max_index; - int32_t lower_bound; - int32_t upper_bound; - - if ( verbose ) - HDfprintf(stdout, "%s(): Entering.\n", fcn_name); - - if ( pass2 ) { - - cache_ptr = file_ptr->shared->cache2; - - HDassert( cache_ptr != NULL ); - HDassert( lag >= 10 ); - - if ( reset_stats ) { - - H5C2_stats__reset(cache_ptr); - } - } - - type = NUMBER_OF_ENTRY_TYPES - 1; - - while ( ( pass2 ) && ( type >= 0 ) ) - { - local_max_index = MIN(max_index, max_indices2[type]); - - idx = local_max_index + lag; - - upper_bound = local_max_index; - lower_bound = upper_bound - 8; - - while ( ( pass2 ) && ( idx >= -lag ) ) - { - if ( idx == ( upper_bound + lag ) ) { - - trans_num++; - - begin_trans(cache_ptr, verbose, trans_num, - "jrnl_row_major_scan_backward inner loop"); - - if ( verbose ) - 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 ) ) - { - if ( verbose ) { - - HDfprintf(stdout, "%lld:%d:%d: ", trans_num, type, idx); - } - - if ( ( pass2 ) && ( do_inserts ) && - ( (idx - lag) >= 0 ) && - ( (idx - lag) >= lower_bound ) && - ( (idx - lag) <= local_max_index ) && - ( (idx - lag) <= upper_bound ) && - ( ((idx - lag) % 2) == 1 ) && - ( ! entry_in_cache2(cache_ptr, type, (idx - lag)) ) ) { - - if ( verbose ) - HDfprintf(stdout, "(i, %d, %d) ", type, (idx - lag)); - - insert_entry2(file_ptr, type, (idx - lag), dirty_inserts, - H5C2__NO_FLAGS_SET); - } - - - if ( ( pass2 ) && - ( (idx - lag + 1) >= 0 ) && - ( (idx - lag + 1) >= lower_bound ) && - ( (idx - lag + 1) <= local_max_index ) && - ( (idx - lag + 1) <= upper_bound ) && - ( ( (idx - lag + 1) % 3 ) == 0 ) ) { - - if ( verbose ) - HDfprintf(stdout, "(p, %d, %d) ", - type, (idx - lag + 1)); - - protect_entry2(file_ptr, type, (idx - lag + 1)); - } - - if ( ( pass2 ) && - ( (idx - lag + 2) >= 0 ) && - ( (idx - lag + 2) >= lower_bound ) && - ( (idx - lag + 2) <= local_max_index ) && - ( (idx - lag + 2) <= upper_bound ) && - ( ( (idx - lag + 2) % 3 ) == 0 ) ) { - - if ( verbose ) - 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 ) && ( do_renames ) && - ( (idx - lag + 2) >= 0 ) && - ( (idx - lag + 2) >= lower_bound ) && - ( (idx - lag + 2) <= local_max_index ) && - ( (idx - lag + 2) <= upper_bound ) && - ( ( (idx - lag + 2) % 3 ) == 0 ) ) { - - if ( verbose ) - HDfprintf(stdout, "(r, %d, %d, %d) ", - type, (idx - lag + 2), - (int)rename_to_main_addr); - - rename_entry2(cache_ptr, type, (idx - lag + 2), - rename_to_main_addr); - } - - - if ( ( pass2 ) && - ( (idx - lag + 3) >= 0 ) && - ( (idx - lag + 3) >= lower_bound ) && - ( (idx - lag + 3) <= local_max_index ) && - ( (idx - lag + 3) <= upper_bound ) && - ( ( (idx - lag + 3) % 5 ) == 0 ) ) { - - if ( verbose ) - HDfprintf(stdout, "(p, %d, %d) ", - type, (idx - lag + 3)); - - protect_entry2(file_ptr, type, (idx - lag + 3)); - } - - if ( ( pass2 ) && - ( (idx - lag + 5) >= 0 ) && - ( (idx - lag + 5) >= lower_bound ) && - ( (idx - lag + 5) <= local_max_index ) && - ( (idx - lag + 5) <= upper_bound ) && - ( ( (idx - lag + 5) % 5 ) == 0 ) ) { - - if ( verbose ) - HDfprintf(stdout, "(u, %d, %d) ", - type, (idx - lag + 5)); - - unprotect_entry2(file_ptr, type, idx-lag+5, NO_CHANGE, - H5C2__NO_FLAGS_SET); - } - - if ( do_mult_ro_protects ) - { - if ( ( pass2 ) && - ( (idx - lag + 5) >= 0 ) && - ( (idx - lag + 5) >= lower_bound ) && - ( (idx - lag + 5) < local_max_index ) && - ( (idx - lag + 5) < upper_bound ) && - ( (idx - lag + 5) % 9 == 0 ) ) { - - if ( verbose ) - HDfprintf(stdout, "(p-ro, %d, %d) ", type, - (idx - lag + 5)); - - protect_entry_ro2(file_ptr, type, (idx - lag + 5)); - } - - if ( ( pass2 ) && - ( (idx - lag + 6) >= 0 ) && - ( (idx - lag + 6) >= lower_bound ) && - ( (idx - lag + 6) < local_max_index ) && - ( (idx - lag + 6) < upper_bound ) && - ( (idx - lag + 6) % 11 == 0 ) ) { - - if ( verbose ) - HDfprintf(stdout, "(p-ro, %d, %d) ", type, - (idx - lag + 6)); - - protect_entry_ro2(file_ptr, type, (idx - lag + 6)); - } - - if ( ( pass2 ) && - ( (idx - lag + 7) >= 0 ) && - ( (idx - lag + 7) >= lower_bound ) && - ( (idx - lag + 7) < local_max_index ) && - ( (idx - lag + 7) < upper_bound ) && - ( (idx - lag + 7) % 13 == 0 ) ) { - - if ( verbose ) - HDfprintf(stdout, "(p-ro, %d, %d) ", type, - (idx - lag + 7)); - - protect_entry_ro2(file_ptr, type, (idx - lag + 7)); - } - - if ( ( pass2 ) && - ( (idx - lag + 7) >= 0 ) && - ( (idx - lag + 7) >= lower_bound ) && - ( (idx - lag + 7) < local_max_index ) && - ( (idx - lag + 7) < upper_bound ) && - ( (idx - lag + 7) % 9 == 0 ) ) { - - if ( verbose ) - 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 ) && - ( (idx - lag + 8) >= 0 ) && - ( (idx - lag + 8) >= lower_bound ) && - ( (idx - lag + 8) < local_max_index ) && - ( (idx - lag + 8) < upper_bound ) && - ( (idx - lag + 8) % 11 == 0 ) ) { - - if ( verbose ) - 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 ) && - ( (idx - lag + 9) >= 0 ) && - ( (idx - lag + 9) >= lower_bound ) && - ( (idx - lag + 9) < local_max_index ) && - ( (idx - lag + 9) < upper_bound ) && - ( (idx - lag + 9) % 13 == 0 ) ) { - - if ( verbose ) - HDfprintf(stdout, "(u-ro, %d, %d) ", type, - (idx - lag + 9)); - - unprotect_entry2(file_ptr, type, (idx - lag + 9), - FALSE, H5C2__NO_FLAGS_SET); - } - } /* if ( do_mult_ro_protects ) */ - - if ( ( pass2 ) && - ( idx >= 0 ) && - ( idx >= lower_bound ) && - ( idx <= local_max_index ) && - ( idx <= upper_bound ) ) { - - if ( verbose ) - HDfprintf(stdout, "(p, %d, %d) ", type, idx); - - protect_entry2(file_ptr, type, idx); - } - - - if ( ( pass2 ) && - ( (idx + lag - 2) >= 0 ) && - ( (idx + lag - 2) >= lower_bound ) && - ( (idx + lag - 2) <= local_max_index ) && - ( (idx + lag - 2) <= upper_bound ) && - ( ( (idx + lag - 2) % 7 ) == 0 ) ) { - - if ( verbose ) - 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 ) && - ( (idx + lag - 1) >= 0 ) && - ( (idx + lag - 1) >= lower_bound ) && - ( (idx + lag - 1) <= local_max_index ) && - ( (idx + lag - 1) <= upper_bound ) && - ( ( (idx + lag - 1) % 7 ) == 0 ) ) { - - if ( verbose ) - HDfprintf(stdout, "(p, %d, %d) ", - type, (idx + lag - 1)); - - protect_entry2(file_ptr, type, (idx + lag - 1)); - } - - - if ( do_destroys ) { - - if ( ( pass2 ) && - ( (idx + lag) >= 0 ) && - ( (idx + lag) >= lower_bound ) && - ( ( idx + lag) <= local_max_index ) && - ( ( idx + lag) <= upper_bound ) ) { - - switch ( (idx + lag) %4 ) { - - case 0: - if ( (entries2[type])[idx+lag].is_dirty ) { - - unprotect_entry2(file_ptr, type, idx + lag, - NO_CHANGE, - H5C2__NO_FLAGS_SET); - } else { - - unprotect_entry2(file_ptr, type, idx + lag, - dirty_unprotects, - H5C2__NO_FLAGS_SET); - } - break; - - case 1: /* we just did an insert */ - unprotect_entry2(file_ptr, type, idx + lag, - NO_CHANGE, - H5C2__NO_FLAGS_SET); - break; - - case 2: - if ( (entries2[type])[idx + lag].is_dirty ) { - - unprotect_entry2(file_ptr, type, idx + lag, - NO_CHANGE, - H5C2__DELETED_FLAG); - } else { - - unprotect_entry2(file_ptr, type, idx + lag, - dirty_destroys, - H5C2__DELETED_FLAG); - } - break; - - case 3: /* we just did an insrt */ - unprotect_entry2(file_ptr, type, idx + lag, - NO_CHANGE, - H5C2__DELETED_FLAG); - break; - - default: - HDassert(0); /* this can't happen... */ - break; - } - } - } else { - - if ( ( pass2 ) && - ( (idx + lag) >= 0 ) && - ( (idx + lag) >= lower_bound ) && - ( ( idx + lag) <= local_max_index ) && - ( ( idx + lag) <= upper_bound ) ) { - - if ( verbose ) - HDfprintf(stdout, - "(u, %d, %d) ", type, (idx + lag)); - - unprotect_entry2(file_ptr, type, idx + lag, - dirty_unprotects, - H5C2__NO_FLAGS_SET); - } - } - - idx--; - - if ( verbose ) - HDfprintf(stdout, "\n"); - - } /* while ( ( pass2 ) && ( idx >= lower_bound - lag ) ) */ - - end_trans(file_ptr, cache_ptr, verbose, trans_num, - "jrnl_row_major_scan_backward inner loop"); - - if ( verbose ) - HDfprintf(stdout, "end trans %lld.\n", (long long)trans_num); - - upper_bound = lower_bound - (2 * lag) - 2; - lower_bound = upper_bound - 8; - - idx = upper_bound + lag; - - } /* while ( ( pass2 ) && ( idx >= -lag ) ) */ - - type--; - - } /* while ( ( pass2 ) && ( type >= 0 ) ) */ - - if ( ( pass2 ) && ( display_stats ) ) { - - H5C2_stats(cache_ptr, "test cache", display_detailed_stats); - } - - return; - -} /* jrnl_row_major_scan_backward2() */ - - -/*------------------------------------------------------------------------- - * 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. - * - * If pass2 is false on entry, do nothing. - * - * Note that this function is an adaption of - * row_major_scan_forward2(). - * - * Return: void - * - * Programmer: John Mainzer - * 5/20/08 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -void -jrnl_row_major_scan_forward2(H5F_t * file_ptr, - int32_t max_index, - int32_t lag, - hbool_t verbose, - hbool_t reset_stats, - hbool_t display_stats, - hbool_t display_detailed_stats, - hbool_t do_inserts, - hbool_t dirty_inserts, - hbool_t do_renames, - hbool_t rename_to_main_addr, - hbool_t do_destroys, - hbool_t do_mult_ro_protects, - int dirty_destroys, - int dirty_unprotects, - uint64_t trans_num) -{ - const char * fcn_name = "jrnl_row_major_scan_forward2"; - H5C2_t * cache_ptr; - int32_t type; - int32_t idx; - int32_t local_max_index; - int32_t lower_bound; - int32_t upper_bound; - - if ( verbose ) - HDfprintf(stdout, "%s(): entering.\n", fcn_name); - - if ( pass2 ) { - - cache_ptr = file_ptr->shared->cache2; - - HDassert( cache_ptr != NULL ); - HDassert( lag >= 10 ); - - type = 0; - - if ( reset_stats ) { - - H5C2_stats__reset(cache_ptr); - } - } - - while ( ( pass2 ) && ( type < NUMBER_OF_ENTRY_TYPES ) ) - { - idx = -lag; - - local_max_index = MIN(max_index, max_indices2[type]); - - lower_bound = 0; - upper_bound = lower_bound + 8; - - while ( ( pass2 ) && ( idx <= (local_max_index + lag) ) ) - { - if ( idx == ( lower_bound - lag ) ) { - - trans_num++; - - begin_trans(cache_ptr, verbose, trans_num, - "jrnl_row_major_scan_forward inner loop"); - - if ( verbose ) - 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 ) ) - { - - if ( verbose ) { - - HDfprintf(stdout, "%lld:%d:%d: ", trans_num, type, idx); - } - - if ( ( pass2 ) && ( do_inserts ) && - ( (idx + lag) >= 0 ) && - ( (idx + lag) >= lower_bound ) && - ( (idx + lag) <= local_max_index ) && - ( (idx + lag) <= upper_bound ) && - ( ((idx + lag) % 2) == 0 ) && - ( ! entry_in_cache2(cache_ptr, type, (idx + lag)) ) ) { - - if ( verbose ) - HDfprintf(stdout, "1(i, %d, %d) ", type, (idx + lag)); - - /*** insert entry idx + lag (if not already present *** */ - insert_entry2(file_ptr, type, (idx + lag), dirty_inserts, - H5C2__NO_FLAGS_SET); - } - - - if ( ( pass2 ) && - ( (idx + lag - 1) >= 0 ) && - ( (idx + lag - 1) >= lower_bound ) && - ( (idx + lag - 1) <= local_max_index ) && - ( (idx + lag - 1) <= upper_bound ) && - ( ( (idx + lag - 1) % 3 ) == 0 ) ) { - - if ( verbose ) - 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 ) && - ( (idx + lag - 2) >= 0 ) && - ( (idx + lag - 2) >= lower_bound ) && - ( (idx + lag - 2) <= local_max_index ) && - ( (idx + lag - 2) <= upper_bound ) && - ( ( (idx + lag - 2) % 3 ) == 0 ) ) { - - if ( verbose ) - HDfprintf(stdout, "3(u, %d, %d) ", - type, (idx + lag - 2)); - - /*** unprotect entry idx + lag - 2 ***/ - unprotect_entry2(file_ptr, type, idx+lag-2, NO_CHANGE, - H5C2__NO_FLAGS_SET); - } - - - if ( ( pass2 ) && ( do_renames ) && - ( (idx + lag - 2) >= 0 ) && - ( (idx + lag - 2) >= lower_bound ) && - ( (idx + lag - 2) <= local_max_index ) && - ( (idx + lag - 2) <= upper_bound ) && - ( ( (idx + lag - 2) % 3 ) == 0 ) ) { - - if ( verbose ) - HDfprintf(stdout, "4(r, %d, %d, %d) ", - type, (idx + lag - 2), - (int)rename_to_main_addr); - - /*** rename entry idx + lag -2 ***/ - rename_entry2(cache_ptr, type, (idx + lag - 2), - rename_to_main_addr); - } - - - if ( ( pass2 ) && - ( (idx + lag - 3) >= 0 ) && - ( (idx + lag - 3) >= lower_bound ) && - ( (idx + lag - 3) <= local_max_index ) && - ( (idx + lag - 3) <= upper_bound ) && - ( ( (idx + lag - 3) % 5 ) == 0 ) ) { - - if ( verbose ) - 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 ) && - ( (idx + lag - 5) >= 0 ) && - ( (idx + lag - 5) >= lower_bound ) && - ( (idx + lag - 5) <= local_max_index ) && - ( (idx + lag - 5) <= upper_bound ) && - ( ( (idx + lag - 5) % 5 ) == 0 ) ) { - - if ( verbose ) - HDfprintf(stdout, "6(u, %d, %d) ", - type, (idx + lag - 5)); - - - /*** unprotect entry idx + lag - 5 ***/ - unprotect_entry2(file_ptr, type, idx+lag-5, NO_CHANGE, - H5C2__NO_FLAGS_SET); - } - - if ( do_mult_ro_protects ) - { - if ( ( pass2 ) && - ( (idx + lag - 5) >= 0 ) && - ( (idx + lag - 5) >= lower_bound ) && - ( (idx + lag - 5) < local_max_index ) && - ( (idx + lag - 5) < upper_bound ) && - ( (idx + lag - 5) % 9 == 0 ) ) { - - if ( verbose ) - 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 ) && - ( (idx + lag - 6) >= 0 ) && - ( (idx + lag - 6) >= lower_bound ) && - ( (idx + lag - 6) < local_max_index ) && - ( (idx + lag - 6) < upper_bound ) && - ( (idx + lag - 6) % 11 == 0 ) ) { - - if ( verbose ) - 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 ) && - ( (idx + lag - 7) >= 0 ) && - ( (idx + lag - 7) >= lower_bound ) && - ( (idx + lag - 7) < local_max_index ) && - ( (idx + lag - 7) < upper_bound ) && - ( (idx + lag - 7) % 13 == 0 ) ) { - - if ( verbose ) - 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 ) && - ( (idx + lag - 7) >= 0 ) && - ( (idx + lag - 7) >= lower_bound ) && - ( (idx + lag - 7) < local_max_index ) && - ( (idx + lag - 7) < upper_bound ) && - ( (idx + lag - 7) % 9 == 0 ) ) { - - if ( verbose ) - HDfprintf(stdout, "10(u-ro, %d, %d) ", type, - (idx + lag - 7)); - - /*** unprotect ro entry idx + lag - 7 ***/ - unprotect_entry2(file_ptr, type, (idx + lag - 7), - FALSE, H5C2__NO_FLAGS_SET); - } - - if ( ( pass2 ) && - ( (idx + lag - 8) >= 0 ) && - ( (idx + lag - 8) >= lower_bound ) && - ( (idx + lag - 8) < local_max_index ) && - ( (idx + lag - 8) < upper_bound ) && - ( (idx + lag - 8) % 11 == 0 ) ) { - - if ( verbose ) - HDfprintf(stdout, "11(u-ro, %d, %d) ", type, - (idx + lag - 8)); - - /*** unprotect ro entry idx + lag - 8 ***/ - unprotect_entry2(file_ptr, type, (idx + lag - 8), - FALSE, H5C2__NO_FLAGS_SET); - } - - if ( ( pass2 ) && - ( (idx + lag - 9) >= 0 ) && - ( (idx + lag - 9) >= lower_bound ) && - ( (idx + lag - 9) < local_max_index ) && - ( (idx + lag - 9) < upper_bound ) && - ( (idx + lag - 9) % 13 == 0 ) ) { - - if ( verbose ) - HDfprintf(stdout, "12(u-ro, %d, %d) ", type, - (idx + lag - 9)); - - /*** unprotect ro entry idx + lag - 9 ***/ - unprotect_entry2(file_ptr, type, (idx + lag - 9), - FALSE, H5C2__NO_FLAGS_SET); - } - } /* if ( do_mult_ro_protects ) */ - - if ( ( pass2 ) && - ( idx >= 0 ) && - ( idx >= lower_bound ) && - ( idx <= local_max_index ) && - ( idx <= upper_bound ) ) { - - if ( verbose ) - HDfprintf(stdout, "13(p, %d, %d) ", type, idx); - - /*** protect entry idx ***/ - protect_entry2(file_ptr, type, idx); - } - - if ( ( pass2 ) && - ( (idx - lag + 2) >= 0 ) && - ( (idx - lag + 2) >= lower_bound ) && - ( (idx - lag + 2) <= local_max_index ) && - ( (idx - lag + 2) <= upper_bound ) && - ( ( (idx - lag + 2) % 7 ) == 0 ) ) { - - if ( verbose ) - HDfprintf(stdout, "14(u, %d, %d) ", - type, (idx - lag + 2)); - - /*** unprotect entry idx - lag + 2 ***/ - unprotect_entry2(file_ptr, type, idx-lag+2, NO_CHANGE, - H5C2__NO_FLAGS_SET); - } - - if ( ( pass2 ) && - ( (idx - lag + 1) >= 0 ) && - ( (idx - lag + 1) >= lower_bound ) && - ( (idx - lag + 1) <= local_max_index ) && - ( (idx - lag + 1) <= upper_bound ) && - ( ( (idx - lag + 1) % 7 ) == 0 ) ) { - - if ( verbose ) - HDfprintf(stdout, "15(p, %d, %d) ", - type, (idx - lag + 1)); - - /*** protect entry idx - lag + 1 ***/ - protect_entry2(file_ptr, type, (idx - lag + 1)); - } - - - if ( do_destroys ) { - - if ( ( pass2 ) && - ( (idx - lag) >= 0 ) && - ( (idx - lag) >= lower_bound ) && - ( ( idx - lag) <= local_max_index ) && - ( ( idx - lag) <= upper_bound ) ) { - - switch ( (idx - lag) %4 ) { - - case 0: /* we just did an insert */ - - if ( verbose ) - HDfprintf(stdout, "16(u, %d, %d) ", - type, (idx - lag)); - - /*** unprotect entry NC idx - lag ***/ - unprotect_entry2(file_ptr, type, idx - lag, - NO_CHANGE, H5C2__NO_FLAGS_SET); - break; - - case 1: - if ( (entries2[type])[idx-lag].is_dirty ) { - - if ( verbose ) - HDfprintf(stdout, "17(u, %d, %d) ", - type, (idx - lag)); - - /*** unprotect entry NC idx - lag ***/ - unprotect_entry2(file_ptr, type, idx - lag, - NO_CHANGE, - H5C2__NO_FLAGS_SET); - } else { - - if ( verbose ) - HDfprintf(stdout, "18(u, %d, %d) ", - type, (idx - lag)); - - /*** unprotect entry idx - lag ***/ - unprotect_entry2(file_ptr, type, idx - lag, - dirty_unprotects, - H5C2__NO_FLAGS_SET); - } - break; - - case 2: /* we just did an insrt */ - - if ( verbose ) - HDfprintf(stdout, "19(u-del, %d, %d) ", - type, (idx - lag)); - - /*** unprotect delete idx - lag ***/ - unprotect_entry2(file_ptr, type, idx - lag, - NO_CHANGE, H5C2__DELETED_FLAG); - break; - - case 3: - if ( (entries2[type])[idx-lag].is_dirty ) { - - if ( verbose ) - HDfprintf(stdout, "20(u-del, %d, %d) ", - type, (idx - lag)); - - /*** unprotect delete idx - lag ***/ - unprotect_entry2(file_ptr, type, idx - lag, - NO_CHANGE, - H5C2__DELETED_FLAG); - } else { - - if ( verbose ) - HDfprintf(stdout, "21(u-del, %d, %d) ", - type, (idx - lag)); - - /*** unprotect delete idx - lag ***/ - unprotect_entry2(file_ptr, type, idx - lag, - dirty_destroys, - H5C2__DELETED_FLAG); - } - break; - - default: - HDassert(0); /* this can't happen... */ - break; - } - } - - } else { - - 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) ", - type, (idx - lag)); - - /*** unprotect idx - lag ***/ - unprotect_entry2(file_ptr, type, idx - lag, - dirty_unprotects, H5C2__NO_FLAGS_SET); - } - } - - idx++; - - if ( verbose ) - HDfprintf(stdout, "\n"); - - } /* while ( ( pass2 ) && ( idx <= upper_bound ) ) */ - - end_trans(file_ptr, cache_ptr, verbose, trans_num, - "jrnl_row_major_scan_forward inner loop"); - - if ( verbose ) - HDfprintf(stdout, "end trans %lld.\n", (long long)trans_num); - - lower_bound = upper_bound + (2 * lag) + 2; - upper_bound = lower_bound + 8; - - idx = lower_bound - lag; - - } /* while ( ( pass2 ) && ( idx <= (local_max_index + lag) ) ) */ - - type++; - - } /* while ( ( pass2 ) && ( type < NUMBER_OF_ENTRY_TYPES ) ) */ - - if ( ( pass2 ) && ( display_stats ) ) { - - H5C2_stats(cache_ptr, "test cache", display_detailed_stats); - } - - return; - -} /* jrnl_row_major_scan_forward2() */ - - -/*------------------------------------------------------------------------- - * 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 - * data structures, and verify that it contains the expected data. - * - * 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. - * - * Return: void - * - * Programmer: John Mainzer - * 5/13/08 - * - * Modifications: - * - * JRM -- 6/10/09 - * Added human readable parameter. - * - *------------------------------------------------------------------------- - */ - -static void -open_existing_file_for_journaling(const char * hdf_file_name, - const char * journal_file_name, - hid_t * file_id_ptr, - H5F_t ** file_ptr_ptr, - H5C2_t ** cache_ptr_ptr, - hbool_t human_readable, - hbool_t use_aio) -{ - const char * fcn_name = "open_existing_file_for_journaling()"; - hbool_t show_progress = FALSE; - hbool_t verbose = FALSE; - int cp = 0; - herr_t result; - H5AC2_jnl_config_t jnl_config; - hid_t fapl_id = -1; - hid_t file_id = -1; - H5F_t * file_ptr = NULL; - H5C2_t * cache_ptr = NULL; - - if ( pass2 ) - { - if ( ( hdf_file_name == NULL ) || - ( journal_file_name == NULL ) || - ( file_id_ptr == NULL ) || - ( file_ptr_ptr == NULL ) || - ( cache_ptr_ptr == NULL ) ) { - - failure_mssg2 = - "Bad param(s) on entry to open_existing_file_for_journaling().\n"; - pass2 = FALSE; - } - else if ( HDstrlen(journal_file_name) > H5AC2__MAX_JOURNAL_FILE_NAME_LEN ) { - - failure_mssg2 = "journal file name too long.\n"; - pass2 = FALSE; - - } else if ( verbose ) { - - HDfprintf(stdout, "%s: HDF file name = \"%s\".\n", - fcn_name, hdf_file_name); - HDfprintf(stdout, "%s: journal file name = \"%s\".\n", - fcn_name, journal_file_name); - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* create a file access propertly list. */ - if ( pass2 ) { - - fapl_id = H5Pcreate(H5P_FILE_ACCESS); - - if ( fapl_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pcreate() failed.\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* call H5Pset_libver_bounds() on the fapl_id */ - if ( pass2 ) { - - if ( H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) - < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pset_libver_bounds() failed.\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - if ( pass2 ) { - - jnl_config.version = H5AC2__CURR_JNL_CONFIG_VER; - - result = H5Pget_jnl_config(fapl_id, &jnl_config); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pget_jnl_config() failed.\n"; - } - - /* set journaling config fields to taste */ - jnl_config.enable_journaling = TRUE; - - HDstrcpy(jnl_config.journal_file_path, journal_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 = use_aio; - jnl_config.jbrb_human_readable = human_readable; - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - if ( pass2 ) { - - result = H5Pset_jnl_config(fapl_id, &jnl_config); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pset_jnl_config() failed.\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /**************************************/ - /* open the file with the fapl above. */ - /**************************************/ - - /* open the file using fapl_id */ - if ( pass2 ) { - - file_id = H5Fopen(hdf_file_name, H5F_ACC_RDWR, fapl_id); - - if ( file_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fopen() failed (1).\n"; - - } else { - - file_ptr = H5I_object_verify(file_id, H5I_FILE); - - if ( file_ptr == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "Can't get file_ptr."; - - if ( verbose ) { - HDfprintf(stdout, "%s: Can't get file_ptr.\n", fcn_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 - * 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 - * to the cache structure - */ - if ( pass2 ) { - - if ( file_ptr->shared->cache2 == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "can't get cache2 pointer(1).\n"; - - } else { - - cache_ptr = file_ptr->shared->cache2; - } - } - - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - if ( pass2 ) { - - *file_id_ptr = file_id; - *file_ptr_ptr = file_ptr; - *cache_ptr_ptr = cache_ptr; - } - - if ( show_progress ) - HDfprintf(stdout, "%s: cp = %d -- exiting.\n", fcn_name, cp++); - - return; - -} /* open_existing_file_for_journaling() */ - - -/*------------------------------------------------------------------------- - * 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 - * it contains the expected data. - * - * 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. - * - * Return: void - * - * Programmer: John Mainzer - * 7/10/08 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -static void -open_existing_file_without_journaling(const char * hdf_file_name, - hid_t * file_id_ptr, - H5F_t ** file_ptr_ptr, - H5C2_t ** cache_ptr_ptr) -{ - const char * fcn_name = "open_existing_file_without_journaling()"; - hbool_t show_progress = FALSE; - hbool_t verbose = FALSE; - int cp = 0; - hid_t fapl_id = -1; - hid_t file_id = -1; - H5F_t * file_ptr = NULL; - H5C2_t * cache_ptr = NULL; - - if ( pass2 ) - { - if ( ( hdf_file_name == NULL ) || - ( file_id_ptr == NULL ) || - ( file_ptr_ptr == NULL ) || - ( cache_ptr_ptr == NULL ) ) { - - failure_mssg2 = - "Bad param(s) on entry to open_existing_file_without_journaling().\n"; - pass2 = FALSE; - - } else { - - if ( verbose ) { - - HDfprintf(stdout, "%s: HDF file name = \"%s\".\n", - fcn_name, hdf_file_name); - } - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* create a file access propertly list. */ - if ( pass2 ) { - - fapl_id = H5Pcreate(H5P_FILE_ACCESS); - - if ( fapl_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pcreate() failed.\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* call H5Pset_libver_bounds() on the fapl_id */ - if ( pass2 ) { - - if ( H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, - H5F_LIBVER_LATEST) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pset_libver_bounds() failed.\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - - /**************************************/ - /* open the file with the fapl above. */ - /**************************************/ - - /* open the file using fapl_id */ - if ( pass2 ) { - - file_id = H5Fopen(hdf_file_name, H5F_ACC_RDWR, fapl_id); - - if ( file_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fopen() failed (2).\n"; - - } else { - - file_ptr = H5I_object_verify(file_id, H5I_FILE); - - if ( file_ptr == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "Can't get file_ptr."; - - if ( verbose ) { - HDfprintf(stdout, "%s: Can't get file_ptr.\n", fcn_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 - * 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 - * to the cache structure - */ - if ( pass2 ) { - - if ( file_ptr->shared->cache2 == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "can't get cache2 pointer(1).\n"; - - } else { - - cache_ptr = file_ptr->shared->cache2; - } - } - - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - if ( pass2 ) { - - *file_id_ptr = file_id; - *file_ptr_ptr = file_ptr; - *cache_ptr_ptr = cache_ptr; - } - - if ( show_progress ) - HDfprintf(stdout, "%s: cp = %d -- exiting.\n", fcn_name, cp++); - - return; - -} /* open_existing_file_without_journaling() */ - - -/*------------------------------------------------------------------------- - * 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 - * structures. and verify that it contains the expected data. - * - * 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. - * - * Return: void - * - * Programmer: John Mainzer - * 5/13/08 - * - * Modifications: - * - * 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 - * - *------------------------------------------------------------------------- - */ - -static void -setup_cache_for_journaling(const char * hdf_file_name, - const char * journal_file_name, - hid_t * file_id_ptr, - 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 */ - hbool_t UNUSED use_core_driver_if_avail) -#endif /* USE_CORE_DRIVER */ -{ - const char * fcn_name = "setup_cache_for_journaling()"; - hbool_t show_progress = FALSE; - hbool_t verbose = FALSE; - int cp = 0; - herr_t result; - H5AC2_cache_config_t mdj_config = - { - /* int version = */ H5C2__CURR_AUTO_SIZE_CTL_VER, - /* hbool_t rpt_fcn_enabled = */ FALSE, - /* hbool_t open_trace_file = */ FALSE, - /* hbool_t close_trace_file = */ FALSE, - /* char trace_file_name[] = */ "", - /* hbool_t evictions_enabled = */ TRUE, - /* hbool_t set_initial_size = */ TRUE, - /* size_t initial_size = */ ( 64 * 1024 ), - /* double min_clean_fraction = */ 0.5, - /* size_t max_size = */ (16 * 1024 * 1024 ), - /* size_t min_size = */ ( 8 * 1024 ), - /* long int epoch_length = */ 50000, - /* enum H5C2_cache_incr_mode incr_mode = */ H5C2_incr__off, - /* double lower_hr_threshold = */ 0.9, - /* double increment = */ 2.0, - /* hbool_t apply_max_increment = */ TRUE, - /* size_t max_increment = */ (4 * 1024 * 1024), - /* enum H5C2_cache_flash_incr_mode */ - /* flash_incr_mode = */ H5C2_flash_incr__off, - /* double flash_multiple = */ 1.0, - /* double flash_threshold = */ 0.25, - /* enum H5C2_cache_decr_mode decr_mode = */ H5C2_decr__off, - /* double upper_hr_threshold = */ 0.999, - /* double decrement = */ 0.9, - /* hbool_t apply_max_decrement = */ TRUE, - /* size_t max_decrement = */ (1 * 1024 * 1024), - /* int epochs_before_eviction = */ 3, - /* hbool_t apply_empty_reserve = */ TRUE, - /* double empty_reserve = */ 0.1, - /* int dirty_bytes_threshold = */ (8 * 1024) - }; - H5AC2_jnl_config_t jnl_config = - { - /* int version = */ H5AC2__CURR_JNL_CONFIG_VER, - /* hbool_t enable_journaling = */ TRUE, - /* char journal_file_path[] = */ "", - /* hbool_t journal_recovered = */ FALSE, - /* size_t jbrb_buf_size = */ (8 * 1024), - /* int jbrb_num_bufs = */ 2, - /* hbool_t jbrb_use_aio = */ FALSE, - /* hbool_t jbrb_human_readable = */ TRUE - }; - hid_t fapl_id = -1; - hid_t file_id = -1; - haddr_t actual_base_addr; - H5F_t * file_ptr = NULL; - H5C2_t * cache_ptr = NULL; - - if ( pass2 ) - { - if ( ( hdf_file_name == NULL ) || - ( journal_file_name == NULL ) || - ( file_id_ptr == NULL ) || - ( file_ptr_ptr == NULL ) || - ( cache_ptr_ptr == NULL ) ) { - - failure_mssg2 = - "Bad param(s) on entry to setup_cache_for_journaling().\n"; - pass2 = FALSE; - } - else if ( HDstrlen(journal_file_name) > H5AC2__MAX_JOURNAL_FILE_NAME_LEN ) - { - failure_mssg2 = "journal file name too long.\n"; - pass2 = FALSE; - - } else { - - HDstrcpy(jnl_config.journal_file_path, journal_file_name); - - if ( verbose ) { - - HDfprintf(stdout, "%s: HDF file name = \"%s\".\n", - fcn_name, hdf_file_name); - HDfprintf(stdout, "%s: journal file name = \"%s\".\n", - fcn_name, journal_file_name); - } - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* create a file access propertly list. */ - if ( pass2 ) { - - fapl_id = H5Pcreate(H5P_FILE_ACCESS); - - if ( fapl_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pcreate() failed.\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* call H5Pset_libver_bounds() on the fapl_id */ - if ( pass2 ) { - - if ( H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, - H5F_LIBVER_LATEST) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pset_libver_bounds() failed.\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - if ( pass2 ) { - - result = H5Pset_mdc_config(fapl_id, (H5AC1_cache_config_t *)&mdj_config); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pset_mdc_config() failed.\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - if ( pass2 ) { - - jnl_config.jbrb_human_readable = human_readable; - jnl_config.jbrb_use_aio = use_aio; - - result = H5Pset_jnl_config(fapl_id, &jnl_config); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pset_mdc_config() failed.\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - -#if USE_CORE_DRIVER - if ( ( pass2 ) && ( use_core_driver_if_avail ) ) { - - if ( H5Pset_fapl_core(fapl_id, 64 * 1024 * 1024, FALSE) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5P_set_fapl_core() failed.\n"; - } - } -#endif /* USE_CORE_DRIVER */ - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - - /**************************************/ - /* Create a file with the fapl above. */ - /**************************************/ - - /* create the file using fapl_id */ - if ( pass2 ) { - - file_id = H5Fcreate(hdf_file_name, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id); - - if ( file_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fcreate() failed.\n"; - - } else { - - file_ptr = H5I_object_verify(file_id, H5I_FILE); - - if ( file_ptr == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "Can't get file_ptr."; - - if ( verbose ) { - HDfprintf(stdout, "%s: Can't get file_ptr.\n", fcn_name); - } - } - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - if ( pass2 ) { /* allocate space for test entries */ - - actual_base_addr = H5MF_alloc(file_ptr, H5FD_MEM_DEFAULT, H5P_DEFAULT, - (hsize_t)(ADDR_SPACE_SIZE + BASE_ADDR)); - - if ( actual_base_addr == HADDR_UNDEF ) { - - pass2 = FALSE; - failure_mssg2 = "H5MF_alloc() failed."; - - if ( verbose ) { - HDfprintf(stdout, "%s: H5MF_alloc() failed.\n", fcn_name); - } - - } else if ( actual_base_addr > BASE_ADDR ) { - - /* If this happens, must increase BASE_ADDR so that the - * actual_base_addr is <= BASE_ADDR. This should only happen - * if the size of the superblock is increase. - */ - pass2 = FALSE; - failure_mssg2 = "actual_base_addr > BASE_ADDR"; - - if ( verbose ) { - HDfprintf(stdout, "%s: actual_base_addr > BASE_ADDR.\n", - fcn_name); - } - } - - saved_actual_base_addr = actual_base_addr; - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* 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"; - - } else { - - cache_ptr = file_ptr->shared->cache2; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - reset_entries2(); - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* close the fapl */ - if ( pass2 ) { - - if ( H5Pclose(fapl_id) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "error closing fapl.\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - if ( pass2 ) { - - *file_id_ptr = file_id; - *file_ptr_ptr = file_ptr; - *cache_ptr_ptr = cache_ptr; - } - - if ( show_progress ) - HDfprintf(stdout, "%s: cp = %d -- exiting.\n", fcn_name, cp++); - - return; - -} /* setup_cache_for_journaling() */ - - -/*------------------------------------------------------------------------- - * Function: takedown_cache_after_journaling() - * - * Purpose: If file_id >= 0, close the associated file, and then delete - * it. Verify that they journal file has been deleted. - * - * Return: void - * - * Programmer: John Mainzer - * 5/13/08 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -static void -takedown_cache_after_journaling(hid_t file_id, - const char * filename, - const char * journal_filename, - hbool_t - use_core_driver_if_avail) -{ - const char *fcn_name = "takedown_cache_after_journaling"; - hbool_t verbose = FALSE; - int error; - - if ( file_id >= 0 ) { - - if ( H5F_addr_defined(saved_actual_base_addr) ) { - H5F_t * file_ptr; - - file_ptr = H5I_object_verify(file_id, H5I_FILE); - - if ( file_ptr == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "Can't get file_ptr."; - - if ( verbose ) { - HDfprintf(stdout, "%s: Can't get file_ptr.\n", fcn_name); - } - } - - /* Flush the cache, so that the close call doesn't try to write to - * the space we free */ - H5Fflush(file_id, H5F_SCOPE_GLOBAL); - - H5MF_xfree(file_ptr, H5FD_MEM_DEFAULT, H5P_DEFAULT, saved_actual_base_addr, - (hsize_t)(ADDR_SPACE_SIZE + BASE_ADDR)); - saved_actual_base_addr = HADDR_UNDEF; - } - - if ( H5Fclose(file_id) < 0 ) { - - if ( pass2 ) { - - pass2 = FALSE; - failure_mssg2 = "file close failed."; - } - } else if ( ( ( ! USE_CORE_DRIVER ) || ( ! use_core_driver_if_avail ) ) && - ( ( error = HDremove(filename) ) != 0 ) ) { - - if ( verbose ) { - HDfprintf(stdout, - "HDremove(\"%s\") failed, returned %d, errno = %d = %s.\n", - filename, error, errno, strerror(errno)); - } - - if ( pass2 ) { - - pass2 = FALSE; - failure_mssg2 = "HDremove() failed (1).\n"; - } - } - } - - verify_journal_deleted(journal_filename); - - return; - -} /* takedown_cache_after_journaling() */ - - -/*------------------------------------------------------------------------- - * 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 - * differences are detected, or if any other error is detected, - * set pass2 to FALSE and set failure_mssg2 to point to an - * appropriate error message. - * - * Do nothing if pass2 is FALSE on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 5/06/08 - * - * Modifications: - * - * JRM -- 6/10/09 - * Updated function to deal with binary as well as human - * readable journal files. - * - *------------------------------------------------------------------------- - */ - -static void -verify_journal_contents(const char * journal_file_path_ptr, - const char * expected_file_path_ptr, - hbool_t human_readable) -{ - const char * fcn_name = "verify_journal_contents()"; - char ch; - char journal_buf[(8 * 1024) + 1]; - char expected_buf[(8 * 1024) + 1]; - hbool_t verbose = FALSE; - size_t cur_buf_len; - const size_t max_buf_len = (8 * 1024); - size_t journal_len = 0; - size_t expected_len = 0; - size_t first_line_len; - size_t journal_remainder_len = 0; - size_t expected_remainder_len = 0; - ssize_t read_result; - int journal_file_fd = -1; - int expected_file_fd = -1; - h5_stat_t buf; - - if ( pass2 ) { - - if ( journal_file_path_ptr == NULL ) { - - failure_mssg2 = "journal_file_path_ptr NULL on entry?!?", - pass2 = FALSE; - - } else if ( expected_file_path_ptr == NULL ) { - - failure_mssg2 = "expected_file_path_ptr NULL on entry?!?", - pass2 = FALSE; - - } - } - - if ( ( pass2 ) && ( verbose ) ) { - - HDfprintf(stdout, "%s: *journal_file_path_ptr = \"%s\"\n", - fcn_name, journal_file_path_ptr); - HDfprintf(stdout, "%s: *expected_file_path_ptr = \"%s\"\n", - fcn_name, expected_file_path_ptr); - } - - /* get the actual length of the journal file */ - if ( pass2 ) { - - if ( HDstat(journal_file_path_ptr, &buf) != 0 ) { - - if ( verbose ) { - - HDfprintf(stdout, "%s: HDstat(j) failed with errno = %d.\n", - fcn_name, errno); - } - failure_mssg2 = "stat() failed on journal file."; - pass2 = FALSE; - - } else { - - if ( (buf.st_size) == 0 ) { - - failure_mssg2 = "Journal file empty?!?"; - pass2 = FALSE; - - } else { - - journal_len = (size_t)(buf.st_size); - - if ( verbose ) { - - HDfprintf(stdout, "%s: journal_len = %d.\n", - fcn_name, (int)journal_len); - } - } - } - } - - /* get the actual length of the expected file */ - if ( pass2 ) { - - if ( HDstat(expected_file_path_ptr, &buf) != 0 ) { - - if ( verbose ) { - - HDfprintf(stdout, "%s: HDstat(e) failed with errno = %d.\n", - fcn_name, errno); - } - failure_mssg2 = "stat() failed on expected file."; - pass2 = FALSE; - - } else { - - if ( (buf.st_size) == 0 ) { - - failure_mssg2 = "Expected file empty?!?"; - pass2 = FALSE; - - } else { - - expected_len = (size_t)(buf.st_size); - - if ( verbose ) { - - 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)) - == -1 ) { - - if ( verbose ) { - - HDfprintf(stdout, "%s: HDopen(j) failed with errno = %d.\n", - fcn_name, errno); - } - failure_mssg2 = "Can't open journal file."; - pass2 = FALSE; - } - } - - /* open the expected file */ - if ( pass2 ) { - - if ( (expected_file_fd = HDopen(expected_file_path_ptr, O_RDONLY, 0777)) - == -1 ) { - - if ( verbose ) { - - HDfprintf(stdout, "%s: HDopen(e) failed with errno = %d.\n", - fcn_name, errno); - } - failure_mssg2 = "Can't open expected file."; - pass2 = FALSE; - } - } - - /* 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 - * 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 - * first line can't be very long. - */ - if ( pass2 ) { - - first_line_len = 1; - read_result = HDread(journal_file_fd, &ch, 1); - - while ( ( ch != '\n' ) && - ( first_line_len < 256 ) && - ( read_result == 1 ) ) { - - first_line_len++; - read_result = HDread(journal_file_fd, &ch, 1); - } - - if ( ch != '\n' ) { - - failure_mssg2 = "error skipping first line of journal file."; - pass2 = FALSE; - - } else if ( first_line_len > journal_len ) { - - failure_mssg2 = "first_line_len > journal_len?!?"; - pass2 = FALSE; - - } else { - - journal_remainder_len = journal_len - first_line_len; - } - } - - if ( pass2 ) { - - first_line_len = 1; - read_result = HDread(expected_file_fd, &ch, 1); - - while ( ( ch != '\n' ) && - ( first_line_len < 256 ) && - ( read_result == 1 ) ) { - - first_line_len++; - read_result = HDread(expected_file_fd, &ch, 1); - } - - if ( ch != '\n' ) { - - failure_mssg2 = "error skipping first line of expected file."; - pass2 = FALSE; - - } else if ( first_line_len > expected_len ) { - - failure_mssg2 = "first_line_len > expected_len?!?"; - pass2 = FALSE; - - } else { - - expected_remainder_len = expected_len - first_line_len; - } - } - - if ( pass2 ) { - - if ( journal_remainder_len != expected_remainder_len ) { - - failure_mssg2 = "Unexpected journal file contents(1)."; - pass2 = FALSE; - } - } - - /* 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 ) ) - { - HDassert( journal_remainder_len == expected_remainder_len ); - - if ( journal_remainder_len > max_buf_len ) { - - cur_buf_len = max_buf_len; - journal_remainder_len -= max_buf_len; - expected_remainder_len -= max_buf_len; - - } else { - - cur_buf_len = journal_remainder_len; - journal_remainder_len = 0; - expected_remainder_len = 0; - } - - read_result = HDread(journal_file_fd, journal_buf, cur_buf_len); - - if ( read_result != (int)cur_buf_len ) { - - if ( verbose ) { - - HDfprintf(stdout, - "%s: HDread(j) failed. result = %d, errno = %d.\n", - fcn_name, (int)read_result, errno); - } - failure_mssg2 = "error reading journal file."; - pass2 = FALSE; - } - - journal_buf[cur_buf_len] = '\0'; - - if ( pass2 ) { - - read_result = HDread(expected_file_fd, expected_buf, cur_buf_len); - - if ( read_result != (int)cur_buf_len ) { - - if ( verbose ) { - - HDfprintf(stdout, - "%s: HDread(e) failed. result = %d, errno = %d.\n", - fcn_name, (int)read_result, errno); - } - failure_mssg2 = "error reading expected file."; - pass2 = FALSE; - } - - expected_buf[cur_buf_len] = '\0'; - } - - if ( pass2 ) { - - if ( human_readable ) { - - if ( HDstrcmp(journal_buf, expected_buf) != 0 ) { - - if ( verbose ) { - - HDfprintf(stdout, - "expected_buf = \"%s\"\n", expected_buf); - HDfprintf(stdout, - "journal_buf = \"%s\"\n", journal_buf); - } - - failure_mssg2 = "Unexpected journal file contents(2)."; - pass2 = FALSE; - } - } else { /* binary journal file -- can't use strcmp() */ - - if ( HDmemcmp(journal_buf, expected_buf, (size_t)cur_buf_len) - != 0 ) { - - failure_mssg2 = "Unexpected journal file contents(2b)."; - pass2 = FALSE; - } - } - } - } - - if ( journal_file_fd != -1 ) { - - if ( HDclose(journal_file_fd) != 0 ) { - - if ( verbose ) { - - HDfprintf(stdout, "%s: HDclose(j) failed with errno = %d.\n", - fcn_name, errno); - } - - if ( pass2 ) { - - failure_mssg2 = "Can't close journal file."; - pass2 = FALSE; - } - } - } - - if ( expected_file_fd != -1 ) { - - if ( HDclose(expected_file_fd) != 0 ) { - - if ( verbose ) { - - HDfprintf(stdout, "%s: HDclose(e) failed with errno = %d.\n", - fcn_name, errno); - } - - if ( pass2 ) { - - failure_mssg2 = "Can't close expected file."; - pass2 = FALSE; - } - } - } - - return; - -} /* verify_journal_contents() */ - - -/*------------------------------------------------------------------------- - * Function: verify_journal_deleted() - * - * 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 - * are detected in this process, set pass2 to FALSE and set - * failure_mssg2 to point to an appropriate error message. - * - * Do nothing if pass2 is FALSE on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 5//08 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -static void -verify_journal_deleted(const char * journal_file_path_ptr) -{ - const char * fcn_name = "verify_journal_deleted()"; - hbool_t verbose = FALSE; - h5_stat_t buf; - - if ( pass2 ) { - - if ( journal_file_path_ptr == NULL ) { - - failure_mssg2 = "journal_file_path_ptr NULL on entry?!?", - pass2 = FALSE; - } - } - - if ( pass2 ) { - - if ( HDstat(journal_file_path_ptr, &buf) == 0 ) { - - if ( verbose ) { - - HDfprintf(stdout, "%s: HDstat(%s) succeeded.\n", fcn_name, - journal_file_path_ptr); - } - - failure_mssg2 = "journal file not deleted(1)."; - pass2 = FALSE; - - } else if ( errno != ENOENT ) { - - if ( verbose ) { - - HDfprintf(stdout, - "%s: HDstat() failed with unexpected errno = %d.\n", - fcn_name, errno); - } - failure_mssg2 = "journal file not deleted(2)."; - pass2 = FALSE; - - } - } - - return; - -} /* verify_journal_deleted() */ - - -/*------------------------------------------------------------------------- - * Function: verify_journal_empty() - * - * 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 - * are detected in this process, set pass2 to FALSE and set - * failure_mssg2 to point to an appropriate error message. - * - * Do nothing if pass2 is FALSE on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 5/06/08 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -static void -verify_journal_empty(const char * journal_file_path_ptr) -{ - const char * fcn_name = "verify_journal_empty()"; - hbool_t verbose = FALSE; - h5_stat_t buf; - - if ( pass2 ) { - - if ( journal_file_path_ptr == NULL ) { - - failure_mssg2 = "journal_file_path_ptr NULL on entry?!?", - pass2 = FALSE; - } - } - - if ( pass2 ) { - - if ( HDstat(journal_file_path_ptr, &buf) != 0 ) { - - if ( verbose ) { - - HDfprintf(stdout, "%s: HDstat() failed with errno = %d.\n", - fcn_name, errno); - } - failure_mssg2 = "stat() failed on journal file."; - pass2 = FALSE; - - } else { - - if ( (buf.st_size) > 0 ) { - - failure_mssg2 = "Empty journal file expected."; - pass2 = FALSE; - } - } - } - - return; - -} /* verify_journal_empty() */ - - -/*** metadata journaling smoke checks ***/ - -/*------------------------------------------------------------------------- - * Function: mdj_smoke_check_00() - * - * 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 - * 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 - * 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 - * journaling is working. - * - * 4) Close the file, and verify that the journal is deleted. - * - * 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. - * - * 7) Disable journaling on the open file. Verify that the - * journal file has been deleted. - * - * 8) Close and delete the file. - * - * Return: void - * - * Programmer: John Mainzer - * 3/11/08 - * - * 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, - hbool_t use_aio) -{ - const char * fcn_name = "mdj_smoke_check_00()"; - const char * human_readable_testfiles[] = - { - "testfiles/cache2_journal_sc00_000.jnl", - "testfiles/cache2_journal_sc00_001.jnl", - "testfiles/cache2_journal_sc00_002.jnl", - "testfiles/cache2_journal_sc00_003.jnl", - "testfiles/cache2_journal_sc00_004.jnl", - "testfiles/cache2_journal_sc00_005.jnl", - "testfiles/cache2_journal_sc00_006.jnl", - "testfiles/cache2_journal_sc00_007.jnl", - "testfiles/cache2_journal_sc00_008.jnl", - "testfiles/cache2_journal_sc00_009.jnl", - "testfiles/cache2_journal_sc00_010.jnl", - "testfiles/cache2_journal_sc00_011.jnl", - "testfiles/cache2_journal_sc00_012.jnl", - "testfiles/cache2_journal_sc00_013.jnl", - "testfiles/cache2_journal_sc00_014.jnl", - "testfiles/cache2_journal_sc00_015.jnl", - "testfiles/cache2_journal_sc00_016.jnl", - "testfiles/cache2_journal_sc00_017.jnl", - "testfiles/cache2_journal_sc00_018.jnl", - NULL - }; - const char * binary_testfiles[] = - { - "testfiles/cache2_journal_bsc00_000.jnl", - "testfiles/cache2_journal_bsc00_001.jnl", - "testfiles/cache2_journal_bsc00_002.jnl", - "testfiles/cache2_journal_bsc00_003.jnl", - "testfiles/cache2_journal_bsc00_004.jnl", - "testfiles/cache2_journal_bsc00_005.jnl", - "testfiles/cache2_journal_bsc00_006.jnl", - "testfiles/cache2_journal_bsc00_007.jnl", - "testfiles/cache2_journal_bsc00_008.jnl", - "testfiles/cache2_journal_bsc00_009.jnl", - "testfiles/cache2_journal_bsc00_010.jnl", - "testfiles/cache2_journal_bsc00_011.jnl", - "testfiles/cache2_journal_bsc00_012.jnl", - "testfiles/cache2_journal_bsc00_013.jnl", - "testfiles/cache2_journal_bsc00_014.jnl", - "testfiles/cache2_journal_bsc00_015.jnl", - "testfiles/cache2_journal_bsc00_016.jnl", - "testfiles/cache2_journal_bsc00_017.jnl", - "testfiles/cache2_journal_bsc00_018.jnl", - NULL - }; - const char **testfiles; - char filename[512]; - char journal_filename[H5AC2__MAX_JOURNAL_FILE_NAME_LEN + 1]; - hbool_t testfile_missing = FALSE; - hbool_t show_progress = FALSE; - hbool_t verbose = FALSE; - hbool_t update_architypes; - herr_t result; - int cp = 0; - hid_t file_id = -1; - 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; - - 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; - - if ( use_aio ) { - - TESTING("binary aio mdj smoke check 00 -- general coverage"); - - } else { - - TESTING("binary sio mdj smoke check 00 -- general coverage"); - } - } - - pass2 = TRUE; - - /***********************************************************************/ - /* 1) Create a file with cache configuration set to enable journaling. */ - /***********************************************************************/ - - /* setup the file name */ - if ( pass2 ) { - - if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, sizeof(filename)) - == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed (1).\n"; - } - } - - 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); - } - - /* setup the journal file name */ - if ( pass2 ) { - - 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) >= - H5AC2__MAX_JOURNAL_FILE_NAME_LEN ) { - - pass2 = FALSE; - failure_mssg2 = "journal file name too long.\n"; - } - } - - 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); - } - - /* clean out any existing journal file */ - HDremove(journal_filename); - setup_cache_for_journaling(filename, journal_filename, &file_id, - &file_ptr, &cache_ptr, human_readable, - use_aio, FALSE); - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - - /********************************************************************/ - /* 2) Using the test entries, simulate a selection of transactions, */ - /* which exercise the full range of metadata cache API calls */ - /* that can generate journal entries. Verify that these */ - /* transactions are reflected correctly in the journal. */ - /********************************************************************/ - - /* a) First a quick check to see if we can do anything */ - - begin_trans(cache_ptr, verbose, (uint64_t)1, "transaction 1.0"); - - 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); - - end_trans(file_ptr, cache_ptr, verbose, (uint64_t)1, "transaction 1.0"); - - flush_journal(cache_ptr); - - if ( update_architypes ) { - - copy_file(journal_filename, testfiles[0]); - } - - if ( file_exists(testfiles[0]) ) { - - verify_journal_contents(journal_filename, testfiles[0], human_readable); - - } else { - - testfile_missing = TRUE; - } - - flush_cache2(file_ptr, FALSE, FALSE, FALSE); /* resets transaction number */ - - verify_journal_empty(journal_filename); - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - - /* b) Verify that a sequence of cache operation that do not dirty - * any entry do not result in any journal activity. - */ - - begin_trans(cache_ptr, verbose, (uint64_t)1, "transaction 1.1"); - - protect_entry2(file_ptr, TINY_ENTRY_TYPE, 0); - protect_entry2(file_ptr, TINY_ENTRY_TYPE, 1); - protect_entry2(file_ptr, TINY_ENTRY_TYPE, 2); - unprotect_entry2(file_ptr, TINY_ENTRY_TYPE, 2, FALSE, H5C2__NO_FLAGS_SET); - unprotect_entry2(file_ptr, TINY_ENTRY_TYPE, 1, FALSE, H5C2__NO_FLAGS_SET); - unprotect_entry2(file_ptr, TINY_ENTRY_TYPE, 0, FALSE, H5C2__NO_FLAGS_SET); - - protect_entry_ro2(file_ptr, TINY_ENTRY_TYPE, 3); - protect_entry_ro2(file_ptr, TINY_ENTRY_TYPE, 3); - protect_entry_ro2(file_ptr, TINY_ENTRY_TYPE, 3); - unprotect_entry2(file_ptr, TINY_ENTRY_TYPE, 3, FALSE, H5C2__NO_FLAGS_SET); - unprotect_entry2(file_ptr, TINY_ENTRY_TYPE, 3, FALSE, H5C2__NO_FLAGS_SET); - unprotect_entry2(file_ptr, TINY_ENTRY_TYPE, 3, FALSE, H5C2__NO_FLAGS_SET); - - end_trans(file_ptr, cache_ptr, verbose, (uint64_t)1, "transaction 1.1"); - - flush_journal(cache_ptr); - - verify_journal_empty(journal_filename); - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - - /* 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). - */ - - begin_trans(cache_ptr, verbose, (uint64_t)2, "transaction 2.1"); - - protect_entry2(file_ptr, TINY_ENTRY_TYPE, 0); - unprotect_entry2(file_ptr, TINY_ENTRY_TYPE, 0, FALSE, H5C2__NO_FLAGS_SET); - protect_entry2(file_ptr, TINY_ENTRY_TYPE, 1); - unprotect_entry2(file_ptr, TINY_ENTRY_TYPE, 1, TRUE, H5C2__NO_FLAGS_SET); - protect_entry2(file_ptr, TINY_ENTRY_TYPE, 2); - unprotect_entry2(file_ptr, TINY_ENTRY_TYPE, 2, FALSE, H5C2__NO_FLAGS_SET); - protect_entry2(file_ptr, TINY_ENTRY_TYPE, 3); - unprotect_entry2(file_ptr, TINY_ENTRY_TYPE, 3, TRUE, H5C2__NO_FLAGS_SET); - protect_entry2(file_ptr, TINY_ENTRY_TYPE, 4); - unprotect_entry2(file_ptr, TINY_ENTRY_TYPE, 4, FALSE, H5C2__NO_FLAGS_SET); - protect_entry2(file_ptr, TINY_ENTRY_TYPE, 5); - unprotect_entry2(file_ptr, TINY_ENTRY_TYPE, 5, TRUE, H5C2__NO_FLAGS_SET); - protect_entry2(file_ptr, TINY_ENTRY_TYPE, 3); - unprotect_entry2(file_ptr, TINY_ENTRY_TYPE, 3, TRUE, H5C2__NO_FLAGS_SET); - protect_entry2(file_ptr, TINY_ENTRY_TYPE, 1); - unprotect_entry2(file_ptr, TINY_ENTRY_TYPE, 1, FALSE, H5C2__NO_FLAGS_SET); - - end_trans(file_ptr, cache_ptr, verbose, (uint64_t)2, "transaction 2.1"); - - flush_journal(cache_ptr); - - if ( update_architypes ) { - - copy_file(journal_filename, testfiles[1]); - } - - if ( file_exists(testfiles[1]) ) { - - verify_journal_contents(journal_filename, testfiles[1], human_readable); - - } else { - - testfile_missing = TRUE; - } - - flush_cache2(file_ptr, FALSE, FALSE, FALSE); /* resets transaction number */ - - verify_journal_empty(journal_filename); - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - - /* d) Mix up some protect/unprotect calls with renames. Do this with - * different orders to make things interesting. - */ - - begin_trans(cache_ptr, verbose, (uint64_t)1, "transaction 1.2"); - - protect_entry2(file_ptr, MICRO_ENTRY_TYPE, 0); - unprotect_entry2(file_ptr, MICRO_ENTRY_TYPE, 0, FALSE, H5C2__NO_FLAGS_SET); - protect_entry2(file_ptr, MICRO_ENTRY_TYPE, 1); - unprotect_entry2(file_ptr, MICRO_ENTRY_TYPE, 1, TRUE, H5C2__NO_FLAGS_SET); - protect_entry2(file_ptr, MICRO_ENTRY_TYPE, 2); - unprotect_entry2(file_ptr, MICRO_ENTRY_TYPE, 2, FALSE, H5C2__NO_FLAGS_SET); - protect_entry2(file_ptr, MICRO_ENTRY_TYPE, 2); - unprotect_entry2(file_ptr, MICRO_ENTRY_TYPE, 2, TRUE, H5C2__NO_FLAGS_SET); - protect_entry2(file_ptr, MICRO_ENTRY_TYPE, 3); - unprotect_entry2(file_ptr, MICRO_ENTRY_TYPE, 3, FALSE, H5C2__NO_FLAGS_SET); - protect_entry2(file_ptr, MICRO_ENTRY_TYPE, 4); - unprotect_entry2(file_ptr, MICRO_ENTRY_TYPE, 4, TRUE, H5C2__NO_FLAGS_SET); - - rename_entry2(cache_ptr, MICRO_ENTRY_TYPE, 2, FALSE); - rename_entry2(cache_ptr, MICRO_ENTRY_TYPE, 3, FALSE); - - end_trans(file_ptr, cache_ptr, verbose, (uint64_t)1, "transaction 1.2"); - - flush_journal(cache_ptr); - - if ( update_architypes ) { - - copy_file(journal_filename, testfiles[2]); - } - - if ( file_exists(testfiles[2]) ) { - - verify_journal_contents(journal_filename, testfiles[2], human_readable); - - } else { - - testfile_missing = TRUE; - } - - - - begin_trans(cache_ptr, verbose, (uint64_t)2, "transaction 2.2"); - - rename_entry2(cache_ptr, MICRO_ENTRY_TYPE, 3, TRUE); - rename_entry2(cache_ptr, MICRO_ENTRY_TYPE, 2, TRUE); - - protect_entry2(file_ptr, MICRO_ENTRY_TYPE, 0); - unprotect_entry2(file_ptr, MICRO_ENTRY_TYPE, 0, FALSE, H5C2__NO_FLAGS_SET); - protect_entry2(file_ptr, MICRO_ENTRY_TYPE, 1); - unprotect_entry2(file_ptr, MICRO_ENTRY_TYPE, 1, TRUE, H5C2__NO_FLAGS_SET); - protect_entry2(file_ptr, MICRO_ENTRY_TYPE, 2); - unprotect_entry2(file_ptr, MICRO_ENTRY_TYPE, 2, FALSE, H5C2__NO_FLAGS_SET); - protect_entry2(file_ptr, MICRO_ENTRY_TYPE, 3); - unprotect_entry2(file_ptr, MICRO_ENTRY_TYPE, 3, TRUE, H5C2__NO_FLAGS_SET); - protect_entry2(file_ptr, MICRO_ENTRY_TYPE, 4); - unprotect_entry2(file_ptr, MICRO_ENTRY_TYPE, 4, FALSE, H5C2__NO_FLAGS_SET); - protect_entry2(file_ptr, MICRO_ENTRY_TYPE, 5); - unprotect_entry2(file_ptr, MICRO_ENTRY_TYPE, 5, TRUE, H5C2__NO_FLAGS_SET); - - end_trans(file_ptr, cache_ptr, verbose, (uint64_t)2, "transaction 2.2"); - - flush_journal(cache_ptr); - - if ( update_architypes ) { - - copy_file(journal_filename, testfiles[3]); - } - - if ( file_exists(testfiles[3]) ) { - - verify_journal_contents(journal_filename, testfiles[3], human_readable); - - } else { - - testfile_missing = TRUE; - } - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - - - /* e-1) Start by pinning a selection of entries... */ - - begin_trans(cache_ptr, verbose, (uint64_t)3, "transaction 3.2"); - - protect_entry2(file_ptr, MICRO_ENTRY_TYPE, 0); - unprotect_entry2(file_ptr, MICRO_ENTRY_TYPE, 0, FALSE, H5C2__NO_FLAGS_SET); - protect_entry2(file_ptr, MICRO_ENTRY_TYPE, 1); - unprotect_entry2(file_ptr, MICRO_ENTRY_TYPE, 1, TRUE, H5C2__NO_FLAGS_SET); - protect_entry2(file_ptr, MICRO_ENTRY_TYPE, 2); - unprotect_entry2(file_ptr, MICRO_ENTRY_TYPE, 2, FALSE, H5C2__PIN_ENTRY_FLAG); - protect_entry2(file_ptr, MICRO_ENTRY_TYPE, 3); - unprotect_entry2(file_ptr, MICRO_ENTRY_TYPE, 3, TRUE, H5C2__PIN_ENTRY_FLAG); - protect_entry2(file_ptr, MICRO_ENTRY_TYPE, 4); - unprotect_entry2(file_ptr, MICRO_ENTRY_TYPE, 4, FALSE, H5C2__PIN_ENTRY_FLAG); - protect_entry2(file_ptr, MICRO_ENTRY_TYPE, 5); - unprotect_entry2(file_ptr, MICRO_ENTRY_TYPE, 5, TRUE, H5C2__PIN_ENTRY_FLAG); - protect_entry2(file_ptr, MICRO_ENTRY_TYPE, 6); - unprotect_entry2(file_ptr, MICRO_ENTRY_TYPE, 6, FALSE, H5C2__PIN_ENTRY_FLAG); - protect_entry2(file_ptr, MICRO_ENTRY_TYPE, 7); - unprotect_entry2(file_ptr, MICRO_ENTRY_TYPE, 7, TRUE, H5C2__PIN_ENTRY_FLAG); - protect_entry2(file_ptr, MICRO_ENTRY_TYPE, 8); - unprotect_entry2(file_ptr, MICRO_ENTRY_TYPE, 8, FALSE, H5C2__NO_FLAGS_SET); - protect_entry2(file_ptr, MICRO_ENTRY_TYPE, 9); - unprotect_entry2(file_ptr, MICRO_ENTRY_TYPE, 9, TRUE, H5C2__NO_FLAGS_SET); - - end_trans(file_ptr, cache_ptr, verbose, (uint64_t)3, "transaction 3.2"); - - flush_journal(cache_ptr); - - if ( update_architypes ) { - - copy_file(journal_filename, testfiles[4]); - } - - if ( file_exists(testfiles[4]) ) { - - verify_journal_contents(journal_filename, testfiles[4], human_readable); - - } else { - - testfile_missing = TRUE; - } - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - - /* e-2) ... then use the H5C2_mark_pinned_or_protected_entry_dirty() - * call to mark a variety of protected, pinned, and pinned and - * protected entries dirty. Also rename some pinned entries. - */ - - begin_trans(cache_ptr, verbose, (uint64_t)4, "transaction 4.2"); - - protect_entry2(file_ptr, MICRO_ENTRY_TYPE, 0); - protect_entry2(file_ptr, MICRO_ENTRY_TYPE, 1); - protect_entry2(file_ptr, MICRO_ENTRY_TYPE, 6); - protect_entry2(file_ptr, MICRO_ENTRY_TYPE, 7); - protect_entry2(file_ptr, MICRO_ENTRY_TYPE, 8); - protect_entry2(file_ptr, MICRO_ENTRY_TYPE, 9); - - mark_pinned_or_protected_entry_dirty2(file_ptr, MICRO_ENTRY_TYPE, 0); - mark_pinned_or_protected_entry_dirty2(file_ptr, MICRO_ENTRY_TYPE, 1); - mark_pinned_or_protected_entry_dirty2(file_ptr, MICRO_ENTRY_TYPE, 2); - mark_pinned_or_protected_entry_dirty2(file_ptr, MICRO_ENTRY_TYPE, 3); - mark_pinned_or_protected_entry_dirty2(file_ptr, MICRO_ENTRY_TYPE, 6); - mark_pinned_or_protected_entry_dirty2(file_ptr, MICRO_ENTRY_TYPE, 7); - - rename_entry2(cache_ptr, MICRO_ENTRY_TYPE, 4, FALSE); - rename_entry2(cache_ptr, MICRO_ENTRY_TYPE, 5, FALSE); - - unprotect_entry2(file_ptr, MICRO_ENTRY_TYPE, 0, FALSE, H5C2__NO_FLAGS_SET); - unprotect_entry2(file_ptr, MICRO_ENTRY_TYPE, 1, TRUE, H5C2__NO_FLAGS_SET); - unprotect_entry2(file_ptr, MICRO_ENTRY_TYPE, 6, FALSE, H5C2__NO_FLAGS_SET); - unprotect_entry2(file_ptr, MICRO_ENTRY_TYPE, 7, TRUE, H5C2__NO_FLAGS_SET); - unprotect_entry2(file_ptr, MICRO_ENTRY_TYPE, 8, FALSE, H5C2__NO_FLAGS_SET); - unprotect_entry2(file_ptr, MICRO_ENTRY_TYPE, 9, TRUE, H5C2__NO_FLAGS_SET); - - end_trans(file_ptr, cache_ptr, verbose, (uint64_t)4, "transaction 4.2"); - - flush_journal(cache_ptr); - - if ( update_architypes ) { - - copy_file(journal_filename, testfiles[5]); - } - - if ( file_exists(testfiles[5]) ) { - - verify_journal_contents(journal_filename, testfiles[5], human_readable); - - } else { - - testfile_missing = TRUE; - } - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - - /* e-3) ...finally, upin all the pinned entries, with an undo of the - * previous rename in the middle. - */ - - begin_trans(cache_ptr, verbose, (uint64_t)5, "transaction 5.2"); - - unpin_entry2(file_ptr, MICRO_ENTRY_TYPE, 2); - unpin_entry2(file_ptr, MICRO_ENTRY_TYPE, 3); - unpin_entry2(file_ptr, MICRO_ENTRY_TYPE, 4); - - rename_entry2(cache_ptr, MICRO_ENTRY_TYPE, 4, TRUE); - rename_entry2(cache_ptr, MICRO_ENTRY_TYPE, 5, TRUE); - - unpin_entry2(file_ptr, MICRO_ENTRY_TYPE, 5); - unpin_entry2(file_ptr, MICRO_ENTRY_TYPE, 6); - unpin_entry2(file_ptr, MICRO_ENTRY_TYPE, 7); - - end_trans(file_ptr, cache_ptr, verbose, (uint64_t)5, "transaction 5.2"); - - flush_journal(cache_ptr); - - if ( update_architypes ) { - - copy_file(journal_filename, testfiles[6]); - } - - if ( file_exists(testfiles[6]) ) { - - verify_journal_contents(journal_filename, testfiles[6], human_readable); - - } else { - - testfile_missing = TRUE; - } - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - - - /* 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 - * the H5C2_pin_ptrotected_entry() call. - */ - - begin_trans(cache_ptr, verbose, (uint64_t)6, "transaction 6.2"); - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 0); - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 1); - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 2); - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 3); - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 4); - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 5); - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 6); - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 7); - - pin_protected_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 2); - pin_protected_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 3); - - unprotect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 0, FALSE, H5C2__NO_FLAGS_SET); - unprotect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 1, TRUE, H5C2__NO_FLAGS_SET); - unprotect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 2, FALSE, H5C2__NO_FLAGS_SET); - unprotect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 3, TRUE, H5C2__NO_FLAGS_SET); - unprotect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 4, FALSE, H5C2__PIN_ENTRY_FLAG); - unprotect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 5, TRUE, H5C2__PIN_ENTRY_FLAG); - unprotect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 6, FALSE, H5C2__PIN_ENTRY_FLAG); - unprotect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 7, TRUE, H5C2__PIN_ENTRY_FLAG); - - end_trans(file_ptr, cache_ptr, verbose, (uint64_t)6, "transaction 6.2"); - - flush_journal(cache_ptr); - - if ( update_architypes ) { - - copy_file(journal_filename, testfiles[7]); - } - - if ( file_exists(testfiles[7]) ) { - - verify_journal_contents(journal_filename, testfiles[7], human_readable); - - } else { - - testfile_missing = TRUE; - } - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - - - /* 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(). - */ - - - begin_trans(cache_ptr, verbose, (uint64_t)7, "transaction 7.2"); - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 0); - unprotect_entry_with_size_change2(file_ptr, VARIABLE_ENTRY_TYPE, 0, - H5C2__SIZE_CHANGED_FLAG, - ((VARIABLE_ENTRY_SIZE / 16) * 15)); - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 1); - unprotect_entry_with_size_change2(file_ptr, VARIABLE_ENTRY_TYPE, 1, - H5C2__SIZE_CHANGED_FLAG|H5C2__DIRTIED_FLAG, - ((VARIABLE_ENTRY_SIZE / 16) * 14)); - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 2); - unprotect_entry_with_size_change2(file_ptr, VARIABLE_ENTRY_TYPE, 2, - H5C2__SIZE_CHANGED_FLAG, - ((VARIABLE_ENTRY_SIZE / 16) * 13)); - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 3); - unprotect_entry_with_size_change2(file_ptr, VARIABLE_ENTRY_TYPE, 3, - H5C2__SIZE_CHANGED_FLAG|H5C2__DIRTIED_FLAG, - ((VARIABLE_ENTRY_SIZE / 16) * 12)); - - resize_pinned_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 4, - ((VARIABLE_ENTRY_SIZE / 16) * 11)); - - 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, - ((VARIABLE_ENTRY_SIZE / 16) * 9)); - - mark_pinned_entry_dirty2(file_ptr, VARIABLE_ENTRY_TYPE, 7, TRUE, - ((VARIABLE_ENTRY_SIZE / 16) * 8)); - - end_trans(file_ptr, cache_ptr, verbose, (uint64_t)7, "transaction 7.2"); - - flush_journal(cache_ptr); - - if ( update_architypes ) { - - copy_file(journal_filename, testfiles[8]); - } - - if ( file_exists(testfiles[8]) ) { - - verify_journal_contents(journal_filename, testfiles[8], human_readable); - - } else { - - testfile_missing = TRUE; - } - - 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. */ - - - begin_trans(cache_ptr, verbose, (uint64_t)8, "transaction 8.2"); - - 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, - VARIABLE_ENTRY_SIZE); - - rename_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 1, FALSE); - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 1); - unprotect_entry_with_size_change2(file_ptr, VARIABLE_ENTRY_TYPE, 1, - H5C2__SIZE_CHANGED_FLAG|H5C2__DIRTIED_FLAG, - VARIABLE_ENTRY_SIZE); - - rename_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 2, FALSE); - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 2); - unprotect_entry_with_size_change2(file_ptr, VARIABLE_ENTRY_TYPE, 2, - H5C2__SIZE_CHANGED_FLAG, - VARIABLE_ENTRY_SIZE); - - rename_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 3, FALSE); - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 3); - unprotect_entry_with_size_change2(file_ptr, VARIABLE_ENTRY_TYPE, 3, - H5C2__SIZE_CHANGED_FLAG|H5C2__DIRTIED_FLAG, - VARIABLE_ENTRY_SIZE); - - rename_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 4, FALSE); - resize_pinned_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 4, VARIABLE_ENTRY_SIZE); - - rename_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 5, FALSE); - 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, - VARIABLE_ENTRY_SIZE); - - rename_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 7, FALSE); - mark_pinned_entry_dirty2(file_ptr, VARIABLE_ENTRY_TYPE, 7, TRUE, - VARIABLE_ENTRY_SIZE); - - end_trans(file_ptr, cache_ptr, verbose, (uint64_t)8, "transaction 8.2"); - - flush_journal(cache_ptr); - - if ( update_architypes ) { - - copy_file(journal_filename, testfiles[9]); - } - - if ( file_exists(testfiles[9]) ) { - - verify_journal_contents(journal_filename, testfiles[9], human_readable); - - } else { - - testfile_missing = TRUE; - } - - 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. - */ - - begin_trans(cache_ptr, verbose, (uint64_t)9, "transaction 9.2"); - - rename_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 0, TRUE); - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 0); - unprotect_entry_with_size_change2(file_ptr, VARIABLE_ENTRY_TYPE, 0, - H5C2__SIZE_CHANGED_FLAG, VARIABLE_ENTRY_SIZE); - - rename_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 1, TRUE); - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 1); - unprotect_entry_with_size_change2(file_ptr, VARIABLE_ENTRY_TYPE, 1, - H5C2__SIZE_CHANGED_FLAG|H5C2__DIRTIED_FLAG, - VARIABLE_ENTRY_SIZE); - - 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, - VARIABLE_ENTRY_SIZE); - - rename_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 3, TRUE); - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 3); - unprotect_entry_with_size_change2(file_ptr, VARIABLE_ENTRY_TYPE, 3, - H5C2__SIZE_CHANGED_FLAG|H5C2__DIRTIED_FLAG|H5C2__UNPIN_ENTRY_FLAG, - VARIABLE_ENTRY_SIZE); - - rename_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 4, TRUE); - resize_pinned_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 4, VARIABLE_ENTRY_SIZE); - unpin_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 4); - - rename_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 5, TRUE); - resize_pinned_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 5, VARIABLE_ENTRY_SIZE); - 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, - VARIABLE_ENTRY_SIZE); - unpin_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 6); - - rename_entry2(cache_ptr, VARIABLE_ENTRY_TYPE, 7, TRUE); - mark_pinned_entry_dirty2(file_ptr, VARIABLE_ENTRY_TYPE, 7, TRUE, - VARIABLE_ENTRY_SIZE); - unpin_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 7); - - end_trans(file_ptr, cache_ptr, verbose, (uint64_t)9, "transaction 9.2"); - - flush_journal(cache_ptr); - - if ( update_architypes ) { - - copy_file(journal_filename, testfiles[10]); - } - - if ( file_exists(testfiles[10]) ) { - - verify_journal_contents(journal_filename, testfiles[10], human_readable); - - } else { - - testfile_missing = TRUE; - } - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - flush_cache2(file_ptr, FALSE, FALSE, FALSE); /* resets transaction number */ - - verify_journal_empty(journal_filename); - - 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. - * - * g-1) Load several entries of VARIABLE_ENTRY_TYPE into the cache, and - * set their sizes to values less than the maximum. - */ - - begin_trans(cache_ptr, verbose, (uint64_t)1, "transaction 1.3"); - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 10); - unprotect_entry_with_size_change2(file_ptr, VARIABLE_ENTRY_TYPE, 10, - H5C2__SIZE_CHANGED_FLAG, - ((VARIABLE_ENTRY_SIZE / 4) * 1)); - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 11); - unprotect_entry_with_size_change2(file_ptr, VARIABLE_ENTRY_TYPE, 11, - H5C2__SIZE_CHANGED_FLAG, - ((VARIABLE_ENTRY_SIZE / 4) * 2)); - - protect_entry2(file_ptr, VARIABLE_ENTRY_TYPE, 12); - unprotect_entry_with_size_change2(file_ptr, VARIABLE_ENTRY_TYPE, 12, - H5C2__SIZE_CHANGED_FLAG, - ((VARIABLE_ENTRY_SIZE / 4) * 3)); - - end_trans(file_ptr, cache_ptr, verbose, (uint64_t)1, "transaction 1.3"); - - flush_journal(cache_ptr); - - if ( update_architypes ) { - - copy_file(journal_filename, testfiles[11]); - } - - if ( file_exists(testfiles[11]) ) { - - verify_journal_contents(journal_filename, testfiles[11], human_readable); - - } else { - - testfile_missing = TRUE; - } - - - /* g-2) Now setup flush operations on some entries to dirty, resize, - * and/or rename other entries. When these entries are dirtied - * in a transaction, the associated flush operations should be - * triggered and appear in the journal. - * - * In case you need a score card, in what follows, I set up the - * following dependencies: - * - * (MICRO_ENTRY_TYPE, 20) dirties (MICRO_ENTRY_TYPE, 30) - * - * (MICRO_ENTRY_TYPE, 21) renames, resizes, and dirties: - * (VARIABLE_ENTRY_TYPE, 10) - * (VARIABLE_ENTRY_TYPE, 13) - * - * (MICRO_ENTRY_TYPE, 22) resizes (VARIABLE_ENTRY_TYPE, 11) - * (VARIABLE_ENTRY_TYPE, 12) - * - * (MICRO_ENTRY_TYPE, 23) renames (VARIABLE_ENTRY_TYPE, 10) - * (VARIABLE_ENTRY_TYPE, 13) - * to their original locations - * - * (MICRO_ENTRY_TYPE, 24) dirties (MICRO_ENTRY_TYPE, 21) - * - * (MICRO_ENTRY_TYPE, 25) dirties (MICRO_ENTRY_TYPE, 22) - * (MICRO_ENTRY_TYPE, 23) - * - */ - - add_flush_op2(MICRO_ENTRY_TYPE, 20, - FLUSH_OP__DIRTY, MICRO_ENTRY_TYPE, 30, FALSE, 0); - - - add_flush_op2(MICRO_ENTRY_TYPE, 21, - FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 10, FALSE, VARIABLE_ENTRY_SIZE); - add_flush_op2(MICRO_ENTRY_TYPE, 21, - FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 10, FALSE, 0); - add_flush_op2(MICRO_ENTRY_TYPE, 21, - FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 10, FALSE, 0); - - add_flush_op2(MICRO_ENTRY_TYPE, 21, - FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 13, FALSE, VARIABLE_ENTRY_SIZE/4); - add_flush_op2(MICRO_ENTRY_TYPE, 21, - FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 13, FALSE, 0); - add_flush_op2(MICRO_ENTRY_TYPE, 21, - FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 13, FALSE, 0); - - - add_flush_op2(MICRO_ENTRY_TYPE, 22, - FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 11, FALSE, VARIABLE_ENTRY_SIZE); - - add_flush_op2(MICRO_ENTRY_TYPE, 22, - FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 12, FALSE, VARIABLE_ENTRY_SIZE); - - - add_flush_op2(MICRO_ENTRY_TYPE, 23, - FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 10, TRUE, 0); - - add_flush_op2(MICRO_ENTRY_TYPE, 23, - FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 13, TRUE, 0); - - - add_flush_op2(MICRO_ENTRY_TYPE, 24, - FLUSH_OP__DIRTY, MICRO_ENTRY_TYPE, 21, FALSE, 0); - - - add_flush_op2(MICRO_ENTRY_TYPE, 25, - FLUSH_OP__DIRTY, MICRO_ENTRY_TYPE, 22, FALSE, 0); - - add_flush_op2(MICRO_ENTRY_TYPE, 25, - FLUSH_OP__DIRTY, MICRO_ENTRY_TYPE, 23, FALSE, 0); - - - /* g-3) Start with a simple check -- dirty (MICRO_ENTRY_TYPE, 20), - * which should also dirty (MICRO_ENTRY_TYPE, 30) when - * (MICRO_ENTRY_TYPE, 20) is serialized at transaction close. - */ - - begin_trans(cache_ptr, verbose, (uint64_t)2, "transaction 2.3"); - - protect_entry2(file_ptr, MICRO_ENTRY_TYPE, 20); - unprotect_entry2(file_ptr, MICRO_ENTRY_TYPE, 20, TRUE, H5C2__NO_FLAGS_SET); - - end_trans(file_ptr, cache_ptr, verbose, (uint64_t)2, "transaction 2.3"); - - flush_journal(cache_ptr); - - if ( update_architypes ) { - - copy_file(journal_filename, testfiles[12]); - } - - if ( file_exists(testfiles[12]) ) { - - verify_journal_contents(journal_filename, testfiles[12], human_readable); - - } else { - - testfile_missing = TRUE; - } - - - /* 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) - */ - - begin_trans(cache_ptr, verbose, (uint64_t)3, "transaction 3.3"); - - protect_entry2(file_ptr, MICRO_ENTRY_TYPE, 24); - unprotect_entry2(file_ptr, MICRO_ENTRY_TYPE, 24, TRUE, H5C2__NO_FLAGS_SET); - - end_trans(file_ptr, cache_ptr, verbose, (uint64_t)3, "transaction 3.3"); - - flush_journal(cache_ptr); - - if ( update_architypes ) { - - copy_file(journal_filename, testfiles[13]); - } - - if ( file_exists(testfiles[13]) ) { - - verify_journal_contents(journal_filename, testfiles[13], human_readable); - - } else { - - testfile_missing = TRUE; - } - - - /* 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. - */ - - begin_trans(cache_ptr, verbose, (uint64_t)4, "transaction 4.3"); - - protect_entry2(file_ptr, MICRO_ENTRY_TYPE, 25); - unprotect_entry2(file_ptr, MICRO_ENTRY_TYPE, 25, TRUE, H5C2__NO_FLAGS_SET); - - end_trans(file_ptr, cache_ptr, verbose, (uint64_t)4, "transaction 4.3"); - - flush_journal(cache_ptr); - - if ( update_architypes ) { - - copy_file(journal_filename, testfiles[14]); - } - - if ( file_exists(testfiles[14]) ) { - - verify_journal_contents(journal_filename, testfiles[14], human_readable); - - } else { - - testfile_missing = TRUE; - } - - flush_cache2(file_ptr, FALSE, FALSE, FALSE); /* resets transaction number */ - - verify_journal_empty(journal_filename); - - 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 - * in the journal. Do this twice -- first with only the expunge - * entry in the transaction, and a second time with other entries - * involved. - * - * Note that no journal file will be written until the first - * entry, so start with a transaction that generates some data. - */ - - begin_trans(cache_ptr, verbose, (uint64_t)1, "transaction 1.4"); - - protect_entry2(file_ptr, MICRO_ENTRY_TYPE, 39); - unprotect_entry2(file_ptr, MICRO_ENTRY_TYPE, 39, TRUE, H5C2__NO_FLAGS_SET); - - end_trans(file_ptr, cache_ptr, verbose, (uint64_t)1, "transaction 1.4"); - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - - begin_trans(cache_ptr, verbose, (uint64_t)2, "transaction 2.4"); - - protect_entry2(file_ptr, MICRO_ENTRY_TYPE, 40); - unprotect_entry2(file_ptr, MICRO_ENTRY_TYPE, 40, TRUE, H5C2__NO_FLAGS_SET); - - expunge_entry2(file_ptr, MICRO_ENTRY_TYPE, 40); - - end_trans(file_ptr, cache_ptr, verbose, (uint64_t)2, "transaction 2.4"); - - flush_journal(cache_ptr); - - if ( update_architypes ) { - - copy_file(journal_filename, testfiles[15]); - } - - if ( file_exists(testfiles[15]) ) { - - verify_journal_contents(journal_filename, testfiles[15], human_readable); - - } else { - - testfile_missing = TRUE; - } - - 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"); - - protect_entry2(file_ptr, MICRO_ENTRY_TYPE, 41); - unprotect_entry2(file_ptr, MICRO_ENTRY_TYPE, 41, TRUE, H5C2__NO_FLAGS_SET); - expunge_entry2(file_ptr, MICRO_ENTRY_TYPE, 41); - protect_entry2(file_ptr, MICRO_ENTRY_TYPE, 42); - unprotect_entry2(file_ptr, MICRO_ENTRY_TYPE, 42, TRUE, H5C2__NO_FLAGS_SET); - - end_trans(file_ptr, cache_ptr, verbose, (uint64_t)3, "transaction 3.4"); - - flush_journal(cache_ptr); - - if ( update_architypes ) { - - copy_file(journal_filename, testfiles[16]); - } - - if ( file_exists(testfiles[16]) ) { - - verify_journal_contents(journal_filename, testfiles[16], human_readable); - - } else { - - testfile_missing = TRUE; - } - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - - /************************************************************/ - /* 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 */ - /* journaling is working. */ - /************************************************************/ - - /* a) Close the hdf5 file. */ - if ( pass2 ) { - - if ( H5Fclose(file_id) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "temporary H5Fclose() failed.\n"; - - } else { - file_id = -1; - file_ptr = NULL; - cache_ptr = NULL; - } - } - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - - /* b) Verify that the journal file has been deleted. */ - verify_journal_deleted(journal_filename); - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - - /* c) Re-open the hdf5 file. */ - open_existing_file_for_journaling(filename, journal_filename, &file_id, - &file_ptr, &cache_ptr, human_readable, - use_aio); - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - - /* d) do a transaction or to to verify that journaling is working. */ - - begin_trans(cache_ptr, verbose, (uint64_t)1, "transaction 1.5"); - - 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); - - end_trans(file_ptr, cache_ptr, verbose, (uint64_t)1, "transaction 1.5"); - - flush_journal(cache_ptr); - - if ( update_architypes ) { - - copy_file(journal_filename, testfiles[17]); - } - - if ( file_exists(testfiles[17]) ) { - - verify_journal_contents(journal_filename, testfiles[17], human_readable); - - } else { - - testfile_missing = TRUE; - } - - flush_cache2(file_ptr, FALSE, FALSE, FALSE); /* resets transaction number */ - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - /**************************************************************/ - /* 4) Close the file, and verify that the journal is deleted. */ - /**************************************************************/ - - /* Close the hdf5 file. */ - if ( pass2 ) { - - if ( H5Fclose(file_id) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "temporary H5Fclose() failed.\n"; - - } else { - file_id = -1; - file_ptr = NULL; - cache_ptr = NULL; - } - } - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - - /* b) Verify that the journal file has been deleted. */ - verify_journal_deleted(journal_filename); - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - - /************************************************************/ - /* 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. */ - /************************************************************/ - - /* re-open the file without journaling enabled */ - - 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. - * - * 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); - protect_entry2(file_ptr, 0, 0); - unprotect_entry2(file_ptr, 0, 0, TRUE, H5C2__NO_FLAGS_SET); - - end_trans(file_ptr, cache_ptr, verbose, (uint64_t)0, "transaction 1.6"); - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - if ( ( pass2 ) && ( cache_ptr->mdj_enabled ) ) { - - pass2 = FALSE; - failure_mssg2 = "journaling is enabled?!?!(1).\n"; - } - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - /* note that flush_journal() will throw an exception if journaling - * is not enabled, so we don't call it here. Instead, just call - * verify_journal_deleted() to verify that there is no journal file. - */ - - verify_journal_deleted(journal_filename); - - 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. */ - /************************************************************/ - - /* now enable journaling */ - if ( pass2 ) { - - jnl_config.version = H5AC2__CURR_JNL_CONFIG_VER; - - result = H5Fget_jnl_config(file_id, &jnl_config); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fget_jnl_config() failed.\n"; - } - - /* set journaling config fields to taste */ - jnl_config.enable_journaling = TRUE; - - HDstrcpy(jnl_config.journal_file_path, journal_filename); - - 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_human_readable = TRUE; - } - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - if ( pass2 ) { - - result = H5Fset_jnl_config(file_id, &jnl_config); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fset_jnl_config() failed.\n"; - } - } - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - /* do a transaction or to to verify that journaling is working. */ - - begin_trans(cache_ptr, verbose, (uint64_t)1, "transaction 1.7"); - - 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); - - end_trans(file_ptr, cache_ptr, verbose, (uint64_t)1, "transaction 1.7"); - - flush_journal(cache_ptr); - - if ( update_architypes ) { - - copy_file(journal_filename, testfiles[18]); - } - - if ( file_exists(testfiles[18]) ) { - - verify_journal_contents(journal_filename, testfiles[18], human_readable); - - } else { - - testfile_missing = TRUE; - } - - flush_cache2(file_ptr, FALSE, FALSE, FALSE); /* resets transaction number */ - - 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. */ - /************************************************************/ - - /* disable journaling */ - if ( pass2 ) { - - jnl_config.enable_journaling = FALSE; - - result = H5Fset_jnl_config(file_id, &jnl_config); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fset_jnl_config() failed.\n"; - } - } - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - verify_journal_deleted(journal_filename); - - 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 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fclose(file_id) failed.\n"; - - } - } - - HDremove(filename); - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - if ( pass2 ) { - - PASSED(); - - if ( testfile_missing ) { - - puts(" WARNING: One or more missing test files."); - fflush(stdout); - } - } else { - - H5_FAILED(); - } - - if ( ! pass2 ) { - - failures2++; - HDfprintf(stdout, "%s: failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - return; - -} /* mdj_smoke_check_00() */ - - -/*------------------------------------------------------------------------- - * Function: mdj_smoke_check_01() - * - * Purpose: Run a cut down version of smoke_check_1 in cache2.c, with - * journaling enabled. Check the journal files generated, - * and verify that the journal output matches the architype - * test files. Skip the comparison and generate a warning - * if an architype file is missing. - * - * Return: void - * - * Programmer: John Mainzer - * 5/19/08 - * - * 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, - hbool_t use_aio) -{ - const char * fcn_name = "mdj_smoke_check_01()"; - const char * human_readable_testfiles[] = - { - "testfiles/cache2_journal_sc01_000.jnl", - "testfiles/cache2_journal_sc01_001.jnl", - "testfiles/cache2_journal_sc01_002.jnl", - "testfiles/cache2_journal_sc01_003.jnl", - "testfiles/cache2_journal_sc01_004.jnl", - NULL - }; - const char * binary_testfiles[] = - { - "testfiles/cache2_journal_bsc01_000.jnl", - "testfiles/cache2_journal_bsc01_001.jnl", - "testfiles/cache2_journal_bsc01_002.jnl", - "testfiles/cache2_journal_bsc01_003.jnl", - "testfiles/cache2_journal_bsc01_004.jnl", - NULL - }; - const char **testfiles; - char filename[512]; - char journal_filename[H5AC2__MAX_JOURNAL_FILE_NAME_LEN + 1]; - hbool_t testfile_missing = FALSE; - hbool_t show_progress = FALSE; - hbool_t dirty_inserts = FALSE; - hbool_t verbose = FALSE; - hbool_t update_architypes; - int dirty_unprotects = FALSE; - int dirty_destroys = FALSE; - hbool_t display_stats = FALSE; - int32_t lag = 10; - int cp = 0; - int32_t max_index = 128; - uint64_t trans_num = 0; - hid_t file_id = -1; - H5F_t * file_ptr = NULL; - H5C2_t * cache_ptr = NULL; - - if ( human_readable ) { - - testfiles = human_readable_testfiles; - /* set update_architypes to TRUE to generate new architype files */ - update_architypes = FALSE; - TESTING("hr mdj smoke check 01 -- jnl clean ins, prot, unprot, del, ren"); - - } else { - - testfiles = binary_testfiles; - /* set update_architypes to TRUE to generate new architype files */ - update_architypes = TRUE; - TESTING("b mdj smoke check 01 -- jnl clean ins, prot, unprot, del, ren"); - } - - pass2 = TRUE; - - /********************************************************************/ - /* Create a file with cache configuration set to enable journaling. */ - /********************************************************************/ - - /* setup the file name */ - if ( pass2 ) { - - if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, sizeof(filename)) - == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed (1).\n"; - } - } - - 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); - } - - /* setup the journal file name */ - if ( pass2 ) { - - 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) >= - H5AC2__MAX_JOURNAL_FILE_NAME_LEN ) { - - pass2 = FALSE; - failure_mssg2 = "journal file name too long.\n"; - } - } - - 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); - } - - /* clean out any existing journal file */ - HDremove(journal_filename); - - /* 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. - * - * 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, - use_aio, FALSE); - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - - /******************************************/ - /* Run a small, fairly simple stress test */ - /******************************************/ - - trans_num = 0; - - jrnl_row_major_scan_forward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ verbose, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ FALSE, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts, - /* do_renames */ TRUE, - /* rename_to_main_addr */ FALSE, - /* do_destroys */ TRUE, - /* do_mult_ro_protects */ TRUE, - /* dirty_destroys */ dirty_destroys, - /* dirty_unprotects */ dirty_unprotects, - /* trans_num */ trans_num); - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - flush_journal(cache_ptr); - - if ( update_architypes ) { - - copy_file(journal_filename, testfiles[0]); - } - - if ( file_exists(testfiles[0]) ) { - - verify_journal_contents(journal_filename, testfiles[0], human_readable); - - } else { - - testfile_missing = TRUE; - } - - flush_cache2(file_ptr, FALSE, FALSE, FALSE); /* resets transaction number */ - - verify_journal_empty(journal_filename); - - trans_num = 0; - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - jrnl_row_major_scan_backward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ verbose, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ FALSE, - /* do_inserts */ FALSE, - /* dirty_inserts */ dirty_inserts, - /* do_renames */ TRUE, - /* rename_to_main_addr */ TRUE, - /* do_destroys */ FALSE, - /* do_mult_ro_protects */ TRUE, - /* dirty_destroys */ dirty_destroys, - /* dirty_unprotects */ dirty_unprotects, - /* trans_num */ trans_num); - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - flush_journal(cache_ptr); - - if ( update_architypes ) { - - copy_file(journal_filename, testfiles[1]); - } - - if ( file_exists(testfiles[1]) ) { - - verify_journal_contents(journal_filename, testfiles[1], human_readable); - - } else { - - testfile_missing = TRUE; - } - - flush_cache2(file_ptr, FALSE, FALSE, FALSE); /* resets transaction number */ - - verify_journal_empty(journal_filename); - - trans_num = 0; - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - jrnl_row_major_scan_forward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ verbose, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ FALSE, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts, - /* do_renames */ TRUE, - /* rename_to_main_addr */ FALSE, - /* do_destroys */ TRUE, - /* do_mult_ro_protects */ TRUE, - /* dirty_destroys */ dirty_destroys, - /* dirty_unprotects */ dirty_unprotects, - /* trans_num */ trans_num); - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - flush_journal(cache_ptr); - - if ( update_architypes ) { - - copy_file(journal_filename, testfiles[2]); - } - - if ( file_exists(testfiles[2]) ) { - - verify_journal_contents(journal_filename, testfiles[2], human_readable); - - } else { - - testfile_missing = TRUE; - } - - flush_cache2(file_ptr, FALSE, FALSE, FALSE); /* resets transaction number */ - - trans_num = 0; - - verify_journal_empty(journal_filename); - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - jrnl_col_major_scan_forward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ verbose, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ TRUE, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts, - /* dirty_unprotects */ dirty_unprotects, - /* trans_num */ trans_num); - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - flush_journal(cache_ptr); - - if ( update_architypes ) { - - copy_file(journal_filename, testfiles[3]); - } - - if ( file_exists(testfiles[3]) ) { - - verify_journal_contents(journal_filename, testfiles[3], human_readable); - - } else { - - testfile_missing = TRUE; - } - - flush_cache2(file_ptr, FALSE, FALSE, FALSE); /* resets transaction number */ - - verify_journal_empty(journal_filename); - - trans_num = 0; - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - jrnl_col_major_scan_backward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ verbose, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ TRUE, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts, - /* dirty_unprotects */ dirty_unprotects, - /* trans_num */ trans_num); - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - flush_journal(cache_ptr); - - if ( update_architypes ) { - - copy_file(journal_filename, testfiles[4]); - } - - if ( file_exists(testfiles[4]) ) { - - verify_journal_contents(journal_filename, testfiles[4], human_readable); - - } else { - - testfile_missing = TRUE; - } - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - /****************************************************/ - /* Close and discard the file and the journal file. */ - /****************************************************/ - - takedown_cache_after_journaling(file_id, filename, journal_filename, FALSE); - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - verify_clean2(); - verify_unprotected2(); - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - if ( pass2 ) { - - PASSED(); - - if ( testfile_missing ) { - - puts(" WARNING: One or more missing test files."); - fflush(stdout); - } - } else { - - H5_FAILED(); - } - - if ( ! pass2 ) { - - failures2++; - HDfprintf(stdout, "%s: failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - return; - -} /* mdj_smoke_check_01() */ - - -/*------------------------------------------------------------------------- - * Function: mdj_smoke_check_02() - * - * Purpose: Run a cut down version of smoke_check_2 in cache2.c, with - * journaling enabled. Check the journal files generated, - * and verify that the journal output matches the architype - * test files. Skip the comparison and generate a warning - * if an architype file is missing. - * - * Return: void - * - * Programmer: John Mainzer - * 5/19/08 - * - * 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, - hbool_t use_aio) -{ - const char * fcn_name = "mdj_smoke_check_02()"; - const char * human_readable_testfiles[] = - { - "testfiles/cache2_journal_sc02_000.jnl", - "testfiles/cache2_journal_sc02_001.jnl", - "testfiles/cache2_journal_sc02_002.jnl", - "testfiles/cache2_journal_sc02_003.jnl", - "testfiles/cache2_journal_sc02_004.jnl", - NULL - }; - const char * binary_testfiles[] = - { - "testfiles/cache2_journal_bsc02_000.jnl", - "testfiles/cache2_journal_bsc02_001.jnl", - "testfiles/cache2_journal_bsc02_002.jnl", - "testfiles/cache2_journal_bsc02_003.jnl", - "testfiles/cache2_journal_bsc02_004.jnl", - NULL - }; - const char **testfiles; - char filename[512]; - char journal_filename[H5AC2__MAX_JOURNAL_FILE_NAME_LEN + 1]; - hbool_t testfile_missing = FALSE; - hbool_t show_progress = FALSE; - hbool_t dirty_inserts = TRUE; - hbool_t verbose = FALSE; - hbool_t update_architypes = FALSE; - int dirty_unprotects = TRUE; - int dirty_destroys = TRUE; - hbool_t display_stats = FALSE; - int32_t lag = 10; - int cp = 0; - int32_t max_index = 128; - uint64_t trans_num = 0; - hid_t file_id = -1; - H5F_t * file_ptr = NULL; - H5C2_t * cache_ptr = NULL; - - if ( human_readable ) { - - testfiles = human_readable_testfiles; - /* set update_architypes to TRUE to generate new architype files */ - update_architypes = FALSE; - TESTING("hr mdj smoke check 02 -- jnl dirty ins, prot, unprot, del, ren"); - - } else { - - testfiles = binary_testfiles; - /* set update_architypes to TRUE to generate new architype files */ - update_architypes = FALSE; - TESTING("b mdj smoke check 02 -- jnl dirty ins, prot, unprot, del, ren"); - } - - pass2 = TRUE; - - /********************************************************************/ - /* Create a file with cache configuration set to enable journaling. */ - /********************************************************************/ - - /* setup the file name */ - if ( pass2 ) { - - if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, sizeof(filename)) == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed (1).\n"; - } - } - - 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); - } - - /* setup the journal file name */ - if ( pass2 ) { - - 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) >= H5AC2__MAX_JOURNAL_FILE_NAME_LEN ) { - - pass2 = FALSE; - failure_mssg2 = "journal file name too long.\n"; - } - } - - 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); - } - - /* clean out any existing journal file */ - HDremove(journal_filename); - - /* 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. - * - * 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, - use_aio, FALSE); - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - - /******************************************/ - /* Run a small, fairly simple stress test */ - /******************************************/ - - trans_num = 0; - - jrnl_row_major_scan_forward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ verbose, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ FALSE, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts, - /* do_renames */ TRUE, - /* rename_to_main_addr */ FALSE, - /* do_destroys */ TRUE, - /* do_mult_ro_protects */ TRUE, - /* dirty_destroys */ dirty_destroys, - /* dirty_unprotects */ dirty_unprotects, - /* trans_num */ trans_num); - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - flush_journal(cache_ptr); - - if ( update_architypes ) { - - copy_file(journal_filename, testfiles[0]); - } - - if ( file_exists(testfiles[0]) ) { - - verify_journal_contents(journal_filename, testfiles[0], human_readable); - - } else { - - testfile_missing = TRUE; - } - - flush_cache2(file_ptr, FALSE, FALSE, FALSE); /* resets transaction number */ - - verify_journal_empty(journal_filename); - - trans_num = 0; - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - jrnl_row_major_scan_backward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ verbose, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ FALSE, - /* do_inserts */ FALSE, - /* dirty_inserts */ dirty_inserts, - /* do_renames */ TRUE, - /* rename_to_main_addr */ TRUE, - /* do_destroys */ FALSE, - /* do_mult_ro_protects */ TRUE, - /* dirty_destroys */ dirty_destroys, - /* dirty_unprotects */ dirty_unprotects, - /* trans_num */ trans_num); - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - flush_journal(cache_ptr); - - if ( update_architypes ) { - - copy_file(journal_filename, testfiles[1]); - } - - if ( file_exists(testfiles[1]) ) { - - verify_journal_contents(journal_filename, testfiles[1], human_readable); - - } else { - - testfile_missing = TRUE; - } - - flush_cache2(file_ptr, FALSE, FALSE, FALSE); /* resets transaction number */ - - verify_journal_empty(journal_filename); - - trans_num = 0; - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - jrnl_row_major_scan_forward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ verbose, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ FALSE, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts, - /* do_renames */ TRUE, - /* rename_to_main_addr */ FALSE, - /* do_destroys */ FALSE, - /* do_mult_ro_protects */ TRUE, - /* dirty_destroys */ dirty_destroys, - /* dirty_unprotects */ dirty_unprotects, - /* trans_num */ trans_num); - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - flush_journal(cache_ptr); - - if ( update_architypes ) { - - copy_file(journal_filename, testfiles[2]); - } - - if ( file_exists(testfiles[2]) ) { - - verify_journal_contents(journal_filename, testfiles[2], human_readable); - - } else { - - testfile_missing = TRUE; - } - - flush_cache2(file_ptr, FALSE, FALSE, FALSE); /* resets transaction number */ - - trans_num = 0; - - verify_journal_empty(journal_filename); - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - jrnl_col_major_scan_forward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ verbose, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ TRUE, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts, - /* dirty_unprotects */ dirty_unprotects, - /* trans_num */ trans_num); - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - flush_journal(cache_ptr); - - if ( update_architypes ) { - - copy_file(journal_filename, testfiles[3]); - } - - if ( file_exists(testfiles[3]) ) { - - verify_journal_contents(journal_filename, testfiles[3], human_readable); - - } else { - - testfile_missing = TRUE; - } - - flush_cache2(file_ptr, FALSE, FALSE, FALSE); /* resets transaction number */ - - verify_journal_empty(journal_filename); - - trans_num = 0; - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - jrnl_col_major_scan_backward2(/* file_ptr */ file_ptr, - /* max_index */ max_index, - /* lag */ lag, - /* verbose */ verbose, - /* reset_stats */ TRUE, - /* display_stats */ display_stats, - /* display_detailed_stats */ TRUE, - /* do_inserts */ TRUE, - /* dirty_inserts */ dirty_inserts, - /* dirty_unprotects */ dirty_unprotects, - /* trans_num */ trans_num); - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - flush_journal(cache_ptr); - - if ( update_architypes ) { - - copy_file(journal_filename, testfiles[4]); - } - - if ( file_exists(testfiles[4]) ) { - - verify_journal_contents(journal_filename, testfiles[4], human_readable); - - } else { - - testfile_missing = TRUE; - } - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - /****************************************************/ - /* Close and discard the file and the journal file. */ - /****************************************************/ - - takedown_cache_after_journaling(file_id, filename, journal_filename, FALSE); - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - verify_clean2(); - verify_unprotected2(); - - if ( show_progress ) - HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass2, cp++); - - if ( pass2 ) { - - PASSED(); - - if ( testfile_missing ) { - - puts(" WARNING: One or more missing test files."); - fflush(stdout); - } - } else { - - H5_FAILED(); - } - - if ( ! pass2 ) { - - failures2++; - HDfprintf(stdout, "%s: failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - return; - -} /* mdj_smoke_check_02() */ - - -/*------------------------------------------------------------------------- - * Function: mdj_api_example_test - * - * 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 - * 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 - * file from becoming too long. - * - * 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 - * 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 - * 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 - * recent extensions to the superblock, so the first step - * 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 - * 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 - * and do what we want -- in this example we set up a selection - * 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 - * 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 - * 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 - * 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 - * format (using H5Pset_libver_bounds()). - * - * 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. - * - * 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 - * 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 - * 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 - * file as part of the close. - * - * Return: void - * - * Programmer: John Mainzer - * 12/14/08 - * - * Modifications: - * - * 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 - * - *------------------------------------------------------------------------- - */ - -#define CHUNK_SIZE 10 -#define DSET_SIZE (40 * CHUNK_SIZE) -#define NUM_DSETS 6 -#define NUM_RANDOM_ACCESSES 200000 - -static void -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]; - char journal_filename[H5AC2__MAX_JOURNAL_FILE_NAME_LEN + 1]; - hbool_t valid_chunk; - hbool_t report_progress = FALSE; - hid_t fapl_id = -1; - hid_t file_id = -1; - hid_t dataspace_id = -1; - hid_t filespace_ids[NUM_DSETS]; - hid_t memspace_id = -1; - hid_t dataset_ids[NUM_DSETS]; - hid_t properties; - char dset_name[64]; - int i, j, k, l, m, n; - int progress_counter; - herr_t status; - hsize_t dims[2]; - hsize_t a_size[2]; - hsize_t offset[2]; - hsize_t chunk_size[2]; - int data_chunk[CHUNK_SIZE][CHUNK_SIZE]; - H5AC2_jnl_config_t jnl_config_0; - H5AC2_jnl_config_t jnl_config_1; - - - if ( human_readable ) { - - if ( use_aio ) { - - TESTING("aio mdj example code -- human readable journal file"); - - } else { - - TESTING("sio mdj example code -- human readable journal file"); - } - } else { - - 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 ) { - - SKIPPED(); - - HDfprintf(stdout, " Long tests disabled.\n"); - - return; - } - - pass2 = TRUE; - - /* Open a file with journaling enabled. */ - - - /* setup the hdf5 file name */ - if ( ( pass2 ) && ( report_progress ) ) { - - HDfprintf(stdout,"\nSetting up file name ... "); - HDfflush(stdout); - } - - if ( pass2 ) { - - if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, sizeof(filename)) - == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed.\n"; - } - } - - - /* setup the journal file name */ - if ( ( pass2 ) && ( report_progress ) ) { - - HDfprintf(stdout,"\nSetting up journal file name ... "); - HDfflush(stdout); - } - - if ( pass2 ) { - - 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) >= - H5AC2__MAX_JOURNAL_FILE_NAME_LEN ) { - - pass2 = FALSE; - failure_mssg2 = "journal file name too long.\n"; - } - } - - - /* clean out any existing journal file -- must do this as - * HDF5 will refuse to overwrite an existing journal file. - */ - if ( ( pass2 ) && ( report_progress ) ) { - - HDfprintf(stdout,"\nRemoving any existing journal file ... "); - HDfflush(stdout); - } - - HDremove(journal_filename); - - - /* create a file access propertly list. */ - if ( ( pass2 ) && ( report_progress ) ) { - - HDfprintf(stdout,"\nCreating a FAPL ... "); - HDfflush(stdout); - } - - if ( pass2 ) { - - fapl_id = H5Pcreate(H5P_FILE_ACCESS); - - if ( fapl_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pcreate() failed.\n"; - } - } - - - /* need latest version of file format to use journaling */ - if ( ( pass2 ) && ( report_progress ) ) { - - HDfprintf(stdout,"\nCalling H5Pset_libver_bounds() on FAPL ... "); - HDfflush(stdout); - } - - if ( pass2 ) { - - if ( H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, - H5F_LIBVER_LATEST) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pset_libver_bounds() failed.\n"; - } - } - - - /* 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 - * changes. - */ - if ( ( pass2 ) && ( report_progress ) ) { - - HDfprintf(stdout, "\nCalling H5Pget_jnl_config() on FAPL ... "); - HDfflush(stdout); - } - - if ( pass2 ) { - - jnl_config_0.version = H5AC2__CURR_JNL_CONFIG_VER; - - status = H5Pget_jnl_config(fapl_id, &jnl_config_0); - - if ( status < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pset_mdc_config() failed.\n"; - } - } - - - /* Modify the current FAPL journaling configuration to enable - * journaling as desired, and then write the revised configuration - * back to the FAPL. - */ - if ( ( pass2 ) && ( report_progress ) ) { - - HDfprintf(stdout, - "\nRevising config & calling H5Pset_jnl_config() on FAPL ... "); - HDfflush(stdout); - } - - if ( pass2 ) { - - jnl_config_0.enable_journaling = TRUE; - - 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 - * 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. - */ - jnl_config_0.jbrb_buf_size = buf_size; - - /* 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 - * will usually be complete by the time that buffer is needed - * again. - */ - jnl_config_0.jbrb_num_bufs = num_bufs; - - /* 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 - * the binary journal file format which should reduce the size - * 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 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pset_mdc_config() failed.\n"; - } - } - - - /* Now open the file using the FAPL we have created. */ - if ( ( pass2 ) && ( report_progress ) ) { - - HDfprintf(stdout, - "\nCreating the HDF5 file using the new FAPL ... "); - HDfflush(stdout); - } - - if ( pass2 ) { - - file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id); - - if ( file_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fcreate() failed.\n"; - - } - } - - - /* create the datasets */ - - if ( ( pass2 ) && ( report_progress ) ) { - - HDfprintf(stdout,"\nCreating datasets ... "); - HDfflush(stdout); - } - - if ( pass2 ) { - - i = 0; - - while ( ( pass2 ) && ( i < NUM_DSETS ) ) - { - /* create a dataspace for the chunked dataset */ - dims[0] = DSET_SIZE; - dims[1] = DSET_SIZE; - dataspace_id = H5Screate_simple(2, dims, NULL); - - if ( dataspace_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Screate_simple() failed."; - } - - /* set the dataset creation plist to specify that the raw data is - * to be partioned into 10X10 element chunks. - */ - - if ( pass2 ) { - - chunk_size[0] = CHUNK_SIZE; - chunk_size[1] = CHUNK_SIZE; - properties = H5Pcreate(H5P_DATASET_CREATE); - - if ( properties < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pcreate() failed."; - } - } - - if ( pass2 ) { - - if ( H5Pset_chunk(properties, 2, chunk_size) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pset_chunk() failed."; - } - } - - /* create the dataset */ - if ( pass2 ) { - - sprintf(dset_name, "/dset%03d", i); - dataset_ids[i] = H5Dcreate2(file_id, dset_name, H5T_STD_I32BE, - dataspace_id, H5P_DEFAULT, - properties, H5P_DEFAULT); - - if ( dataset_ids[i] < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Dcreate() failed."; - } - } - - /* get the file space ID */ - if ( pass2 ) { - - filespace_ids[i] = H5Dget_space(dataset_ids[i]); - - if ( filespace_ids[i] < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Dget_space() failed."; - } - } - - i++; - } - } - - - /* 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 ) ) { - - HDfprintf(stdout, - "\nTurning off journaling ... "); - HDfflush(stdout); - } - - if ( pass2 ) { - - jnl_config_1.version = H5AC2__CURR_JNL_CONFIG_VER; - - status = H5Fget_jnl_config(file_id, &jnl_config_1); - - if ( status < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fget_mdc_config() failed.\n"; - } - } - - if ( pass2 ) { - - jnl_config_1.enable_journaling = FALSE; - - status = H5Fset_jnl_config(file_id, &jnl_config_1); - - if ( status < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fset_mdc_config() failed.\n"; - } - } - - - /* 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. - * - * 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. - */ - if ( ( pass2 ) && ( report_progress ) ) { - - HDfprintf(stdout, - "\nTurning journaling back on ... "); - HDfflush(stdout); - } - if ( pass2 ) { - - jnl_config_1.enable_journaling = TRUE; - - status = H5Fset_jnl_config(file_id, &jnl_config_1); - - if ( status < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fset_mdc_config() failed.\n"; - } - } - - - /* create the mem space to be used to read and write chunks */ - if ( pass2 ) { - - dims[0] = CHUNK_SIZE; - dims[1] = CHUNK_SIZE; - memspace_id = H5Screate_simple(2, dims, NULL); - - if ( memspace_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Screate_simple() failed."; - } - } - - /* select in memory hyperslab */ - if ( pass2 ) { - - offset[0] = 0; /*offset of hyperslab in memory*/ - offset[1] = 0; - a_size[0] = CHUNK_SIZE; /*size of hyperslab*/ - a_size[1] = CHUNK_SIZE; - status = H5Sselect_hyperslab(memspace_id, H5S_SELECT_SET, offset, NULL, - a_size, NULL); - - if ( status < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Sselect_hyperslab() failed."; - } - } - - if ( ( pass2 ) && ( report_progress ) ) { - - HDfprintf(stdout,"Done.\n"); - HDfflush(stdout); - } - - /* initialize all datasets on a round robin basis */ - i = 0; - progress_counter = 0; - - if ( ( pass2 ) && ( report_progress ) ) { - - HDfprintf(stdout, "Initializing datasets "); - HDfflush(stdout); - } - - while ( ( pass2 ) && ( i < DSET_SIZE ) ) - { - j = 0; - while ( ( pass2 ) && ( j < DSET_SIZE ) ) - { - m = 0; - while ( ( pass2 ) && ( m < NUM_DSETS ) ) - { - /* initialize the slab */ - for ( k = 0; k < CHUNK_SIZE; k++ ) - { - for ( l = 0; l < CHUNK_SIZE; l++ ) - { - data_chunk[k][l] = (DSET_SIZE * DSET_SIZE * m) + - (DSET_SIZE * (i + k)) + j + l; - } - } - - /* select on disk hyperslab */ - offset[0] = (hsize_t)i; /*offset of hyperslab in file*/ - offset[1] = (hsize_t)j; - a_size[0] = CHUNK_SIZE; /*size of hyperslab*/ - a_size[1] = CHUNK_SIZE; - status = H5Sselect_hyperslab(filespace_ids[m], H5S_SELECT_SET, - offset, NULL, a_size, NULL); - - if ( status < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "disk H5Sselect_hyperslab() failed."; - } - - /* write the chunk to file */ - status = H5Dwrite(dataset_ids[m], H5T_NATIVE_INT, memspace_id, - filespace_ids[m], H5P_DEFAULT, data_chunk); - - if ( status < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Dwrite() failed."; - } - m++; - } - j += CHUNK_SIZE; - } - - i += CHUNK_SIZE; - - if ( ( pass2 ) && ( report_progress ) ) { - - progress_counter += CHUNK_SIZE; - - if ( progress_counter >= DSET_SIZE / 20 ) { - - progress_counter = 0; - HDfprintf(stdout, "."); - HDfflush(stdout); - } - } - - /* 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 - * 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 - * overhead, and slow us down. (try it both ways). - */ -#if 0 - status = H5Fflush(file_id, H5F_SCOPE_GLOBAL); - - if ( status < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fflush() failed."; - } -#endif - } - - if ( ( pass2 ) && ( report_progress ) ) { - - HDfprintf(stdout," Done.\n"); /* initializing data sets */ - HDfflush(stdout); - } - - - /* do random reads on all datasets */ - - if ( ( pass2 ) && ( report_progress ) ) { - - HDfprintf(stdout, "Doing random reads on all datasets "); - HDfflush(stdout); - } - - n = 0; - progress_counter = 0; - while ( ( pass2 ) && ( n < NUM_RANDOM_ACCESSES ) ) - { - m = rand() % NUM_DSETS; - i = (rand() % (DSET_SIZE / CHUNK_SIZE)) * CHUNK_SIZE; - j = (rand() % (DSET_SIZE / CHUNK_SIZE)) * CHUNK_SIZE; - - /* select on disk hyperslab */ - offset[0] = (hsize_t)i; /*offset of hyperslab in file*/ - offset[1] = (hsize_t)j; - a_size[0] = CHUNK_SIZE; /*size of hyperslab*/ - a_size[1] = CHUNK_SIZE; - status = H5Sselect_hyperslab(filespace_ids[m], H5S_SELECT_SET, - offset, NULL, a_size, NULL); - - if ( status < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "disk hyperslab create failed."; - } - - /* read the chunk from file */ - if ( pass2 ) { - - status = H5Dread(dataset_ids[m], H5T_NATIVE_INT, memspace_id, - filespace_ids[m], H5P_DEFAULT, data_chunk); - - if ( status < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "disk hyperslab create failed."; - } - } - - /* validate the slab */ - if ( pass2 ) { - - valid_chunk = TRUE; - for ( k = 0; k < CHUNK_SIZE; k++ ) - { - for ( l = 0; l < CHUNK_SIZE; l++ ) - { - if ( data_chunk[k][l] - != - ((DSET_SIZE * DSET_SIZE * m) + - (DSET_SIZE * (i + k)) + j + l) ) { - - valid_chunk = FALSE; -#if 0 /* this will be useful from time to time -- lets keep it*/ - HDfprintf(stdout, - "data_chunk[%0d][%0d] = %0d, expect %0d.\n", - k, l, data_chunk[k][l], - ((DSET_SIZE * DSET_SIZE * m) + - (DSET_SIZE * (i + k)) + j + l)); - HDfprintf(stdout, - "m = %d, i = %d, j = %d, k = %d, l = %d\n", - m, i, j, k, l); -#endif - } - } - } - - if ( ! valid_chunk ) { -#if 1 - pass2 = FALSE; - failure_mssg2 = "slab validation failed."; -#else /* as above */ - fprintf(stdout, "Chunk (%0d, %0d) in /dset%03d is invalid.\n", - i, j, m); -#endif - } - } - - n++; - - if ( ( pass2 ) && ( report_progress ) ) { - - progress_counter++; - - if ( progress_counter >= NUM_RANDOM_ACCESSES / 20 ) { - - progress_counter = 0; - HDfprintf(stdout, "."); - HDfflush(stdout); - } - } - } - - if ( ( pass2 ) && ( report_progress ) ) { - - HDfprintf(stdout, " Done.\n"); /* random reads on all data sets */ - HDfflush(stdout); - } - - - /* close the file spaces we are done with */ - i = 1; - while ( ( pass2 ) && ( i < NUM_DSETS ) ) - { - if ( H5Sclose(filespace_ids[i]) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Sclose() failed."; - } - i++; - } - - - /* close the datasets we are done with */ - i = 1; - while ( ( pass2 ) && ( i < NUM_DSETS ) ) - { - if ( H5Dclose(dataset_ids[i]) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Dclose() failed."; - } - i++; - } - - - /* do random reads on data set 0 only */ - - if ( ( pass2 ) && ( report_progress ) ) { - - HDfprintf(stdout, "Doing random reads on dataset 0 "); - HDfflush(stdout); - } - - m = 0; - n = 0; - progress_counter = 0; - while ( ( pass2 ) && ( n < NUM_RANDOM_ACCESSES ) ) - { - i = (rand() % (DSET_SIZE / CHUNK_SIZE)) * CHUNK_SIZE; - j = (rand() % (DSET_SIZE / CHUNK_SIZE)) * CHUNK_SIZE; - - /* select on disk hyperslab */ - offset[0] = (hsize_t)i; /*offset of hyperslab in file*/ - offset[1] = (hsize_t)j; - a_size[0] = CHUNK_SIZE; /*size of hyperslab*/ - a_size[1] = CHUNK_SIZE; - status = H5Sselect_hyperslab(filespace_ids[m], H5S_SELECT_SET, - offset, NULL, a_size, NULL); - - if ( status < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "disk hyperslab create failed."; - } - - /* read the chunk from file */ - if ( pass2 ) { - - status = H5Dread(dataset_ids[m], H5T_NATIVE_INT, memspace_id, - filespace_ids[m], H5P_DEFAULT, data_chunk); - - if ( status < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "disk hyperslab create failed."; - } - } - - /* validate the slab */ - if ( pass2 ) { - - valid_chunk = TRUE; - for ( k = 0; k < CHUNK_SIZE; k++ ) - { - for ( l = 0; l < CHUNK_SIZE; l++ ) - { - if ( data_chunk[k][l] - != - ((DSET_SIZE * DSET_SIZE * m) + - (DSET_SIZE * (i + k)) + j + l) ) { - - valid_chunk = FALSE; - } -#if 0 /* this will be useful from time to time -- lets keep it */ - HDfprintf(stdout, "data_chunk[%0d][%0d] = %0d, expect %0d.\n", - k, l, data_chunk[k][l], - ((DSET_SIZE * DSET_SIZE * m) + - (DSET_SIZE * (i + k)) + j + l)); -#endif - } - } - - if ( ! valid_chunk ) { - - pass2 = FALSE; - failure_mssg2 = "slab validation failed."; -#if 0 /* as above */ - fprintf(stdout, "Chunk (%0d, %0d) in /dset%03d is invalid.\n", - i, j, m); -#endif - } - } - - n++; - - if ( ( pass2 ) && ( report_progress ) ) { - - progress_counter++; - - if ( progress_counter >= NUM_RANDOM_ACCESSES / 20 ) { - - progress_counter = 0; - HDfprintf(stdout, "."); - HDfflush(stdout); - } - } - } - - if ( ( pass2 ) && ( report_progress ) ) { - - HDfprintf(stdout, " Done.\n"); /* random reads data set 0 */ - HDfflush(stdout); - } - - - if ( ( pass2 ) && ( report_progress ) ) { - - HDfprintf(stdout,"Shutting down ... "); - HDfflush(stdout); - } - - - /* close file space 0 */ - if ( pass2 ) { - - if ( H5Sclose(filespace_ids[0]) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Sclose(filespace_ids[0]) failed."; - } - } - - /* close the data space */ - if ( pass2 ) { - - if ( H5Sclose(dataspace_id) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Sclose(dataspace) failed."; - } - } - - /* close the mem space */ - if ( pass2 ) { - - if ( H5Sclose(memspace_id) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Sclose(memspace_id) failed."; - } - } - - /* close dataset 0 */ - if ( pass2 ) { - - if ( H5Dclose(dataset_ids[0]) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Dclose(dataset_ids[0]) failed."; - } - } - - /* close the file and delete it */ - if ( pass2 ) { - - if ( H5Fclose(file_id) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fclose() failed.\n"; - - } - else if ( HDremove(filename) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "HDremove() failed.\n"; - } - } - - if ( ( pass2 ) && ( report_progress ) ) { - - HDfprintf(stdout,"Done.\n"); /* shutting down */ - HDfflush(stdout); - } - - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - failures2++; - HDfprintf(stdout, "%s: failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - return; - -} /* mdj_api_example_test() */ - - -/*** super block extension related test code ***/ - -/*------------------------------------------------------------------------- - * Function: check_superblock_extensions() - * - * 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 - * once journaling is fully implemented. - * - * Return: void - * - * Programmer: John Mainzer - * 2/26/08 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -extern hbool_t H5C2__check_for_journaling; - -static void -check_superblock_extensions(void) -{ - const char * fcn_name = "check_superblock_extensions()"; - char filename[512]; - hbool_t show_progress = FALSE; - hbool_t verbose = FALSE; - int cp = 0; - hid_t fapl_id = -1; - hid_t file_id = -1; - hid_t dataset_id = -1; - hid_t dataspace_id = -1; - H5F_t * file_ptr = NULL; - hsize_t dims[2]; - - - TESTING("superblock extensions"); - - pass2 = TRUE; - - /* 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. - * - * For now at least, the test proceeds as follows: - * - * 1) create a HDF5 file, and verify that journaling is - * 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. - * - * 4) Write data to the superblock marking the file as currently - * 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. - * - * 6) Reset the journaling information to indicate that the file - * is not being journaled, and close the file again. - * - * 7) Open the file a fourth time, and verify that the superblock - * 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. - * - * 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 - * progress. - * - * 12) Close the file and delete it. - */ - - /********************************************************/ - /* 1) create a HDF5 file, and verify that journaling is */ - /* listed as being off. */ - /********************************************************/ - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* setup the file name */ - if ( pass2 ) { - - if ( h5_fixname(FILENAMES[2], H5P_DEFAULT, filename, sizeof(filename)) - == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed.\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* create a file access propertly list */ - if ( pass2 ) { - - fapl_id = H5Pcreate(H5P_FILE_ACCESS); - - if ( fapl_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pcreate() failed.\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* call H5Pset_libver_bounds() on the fapl_id */ - if ( pass2 ) { - - if ( H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, - H5F_LIBVER_LATEST) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Pset_libver_bounds() failed.\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* create the file using fapl_id */ - if ( pass2 ) { - - file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id); - - if ( file_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fcreate() failed.\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* get a pointer to the files internal data structure and then - * verify that journaling is disabled. - */ - if ( pass2 ) { - - file_ptr = (H5F_t *)H5I_object_verify(file_id, H5I_FILE); - - if ( file_ptr == NULL ) { - - pass2 = FALSE; - 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"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /************************************************************/ - /* 2) create a dataset in the file, and then close the file */ - /************************************************************/ - - if ( pass2 ) { - - dims[0] = 4; - dims[1] = 6; - dataspace_id = H5Screate_simple(2, dims, NULL); - - if ( dataspace_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Screate_simple() failed."; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - if ( pass2 ) { - - /* Create the dataset. */ - dataset_id = H5Dcreate2(file_id, "/dset", H5T_STD_I32BE, dataspace_id, - H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); - - if ( dataspace_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Dcreate2() failed."; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - if ( pass2 ) { - - /* close the data set, the data space, and the file */ - if ( ( H5Dclose(dataset_id) < 0 ) || - ( H5Sclose(dataspace_id) < 0 ) || - ( H5Fclose(file_id) < 0 ) ) { - - pass2 = FALSE; - failure_mssg2 = "data set, data space, or file close failed."; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /****************************************************************/ - /* 3) Open the file again, and verifiy that journaling is still */ - /* listed as being off. */ - /****************************************************************/ - - /* open the file r/w using the default FAPL */ - if ( pass2 ) { - - file_id = H5Fopen(filename, H5F_ACC_RDWR, H5P_DEFAULT); - - if ( file_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fopen() failed (4).\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* get a pointer to the files internal data structure and then - * verify that journaling is disabled. - */ - if ( pass2 ) { - - file_ptr = (H5F_t *)H5I_object_verify(file_id, H5I_FILE); - - if ( file_ptr == NULL ) { - - pass2 = FALSE; - 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"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /*****************************************************************/ - /* 4) Write data to the superblock marking the file as currently */ - /* being journaled, and close the file again. */ - /*****************************************************************/ - - /* 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. - */ - - if ( pass2 ) { - - file_ptr->shared->mdc_jnl_enabled = TRUE; - file_ptr->shared->mdc_jnl_magic = 123; - file_ptr->shared->mdc_jnl_file_name_len = HDstrlen("abc"); - HDstrncpy(file_ptr->shared->mdc_jnl_file_name, - "abc", - file_ptr->shared->mdc_jnl_file_name_len + 1); - - if ( verbose ) { - - HDfprintf(stdout, "f->shared->mdc_jnl_enabled = %d\n", - (int)(file_ptr->shared->mdc_jnl_enabled)); - HDfprintf(stdout, "f->shared->mdc_jnl_magic = %d\n", - (int)(file_ptr->shared->mdc_jnl_magic)); - HDfprintf(stdout, "f->shared->mdc_jnl_file_name_len = %d\n", - (int)(file_ptr->shared->mdc_jnl_file_name_len)); - HDfprintf(stdout, "f->shared->mdc_jnl_file_name = \"%s\"\n", - file_ptr->shared->mdc_jnl_file_name); - } - - if ( H5F_super_write_mdj_msg(file_ptr, -1) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5F_super_write_mdj_msg failed (1)."; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* close the file again. */ - if ( pass2 ) { - - if ( H5Fclose(file_id) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "file close failed (1)."; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - - /*****************************************************************/ - /* 5) Open the file a third time, and verify that the superblock */ - /* extension indicates that the file is being journaled. */ - /*****************************************************************/ - - /* open the file r/w using the default FAPL -- turn off journaling - * in progress check during the open. - * */ - if ( pass2 ) { - - H5C2__check_for_journaling = FALSE; - file_id = H5Fopen(filename, H5F_ACC_RDWR, H5P_DEFAULT); - H5C2__check_for_journaling = TRUE; - - if ( file_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fopen() failed (5).\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* get a pointer to the files internal data structure and then - * verify that journaling is enabled. - */ - if ( pass2 ) { - - file_ptr = (H5F_t *)H5I_object_verify(file_id, H5I_FILE); - - if ( file_ptr == NULL ) { - - pass2 = FALSE; - 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 != - (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"; - - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /*****************************************************************/ - /* 6) Reset the journaling information to indicate that the file */ - /* is not being journaled, and close the file again. */ - /*****************************************************************/ - - if ( pass2 ) { - - file_ptr->shared->mdc_jnl_enabled = FALSE; - - if ( H5F_super_write_mdj_msg(file_ptr, -1) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5F_super_write_mdj_msg failed (2)."; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* close the file again. */ - if ( pass2 ) { - - if ( H5Fclose(file_id) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "file close failed (2)."; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - - /******************************************************************/ - /* 7) Open the file a fourth time, and verify that the superblock */ - /* extension indicates that the file is not being journaled. */ - /*******************************************************************/ - - /* open the file r/w using the default FAPL */ - if ( pass2 ) { - - file_id = H5Fopen(filename, H5F_ACC_RDWR, H5P_DEFAULT); - - if ( file_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fopen() failed (6).\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* get a pointer to the files internal data structure and then - * verify that journaling is disabled. - */ - if ( pass2 ) { - - file_ptr = (H5F_t *)H5I_object_verify(file_id, H5I_FILE); - - if ( file_ptr == NULL ) { - - pass2 = FALSE; - 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"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - - /*******************************************************************/ - /* 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. */ - /*******************************************************************/ - - if ( pass2 ) { - - file_ptr->shared->mdc_jnl_enabled = TRUE; - file_ptr->shared->mdc_jnl_magic = 456; - file_ptr->shared->mdc_jnl_file_name_len = HDstrlen("qrst"); - HDstrncpy(file_ptr->shared->mdc_jnl_file_name, - "qrst", - file_ptr->shared->mdc_jnl_file_name_len + 1); - - if ( H5F_super_write_mdj_msg(file_ptr, -1) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5F_super_write_mdj_msg failed (3)."; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - if ( pass2 ) { - - file_ptr->shared->mdc_jnl_enabled = TRUE; - file_ptr->shared->mdc_jnl_magic = 789; - file_ptr->shared->mdc_jnl_file_name_len = HDstrlen("z"); - HDstrncpy(file_ptr->shared->mdc_jnl_file_name, - "z", - file_ptr->shared->mdc_jnl_file_name_len + 1); - - if ( H5F_super_write_mdj_msg(file_ptr, -1) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5F_super_write_mdj_msg failed (4)."; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* close the file again. */ - if ( pass2 ) { - - if ( H5Fclose(file_id) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "file close failed (3)."; - } - } - - 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. */ - /***************************************************************/ - - /* open the file r/w using the default FAPL -- turn off journaling - * in progress check during the open. - */ - if ( pass2 ) { - - H5C2__check_for_journaling = FALSE; - file_id = H5Fopen(filename, H5F_ACC_RDWR, H5P_DEFAULT); - H5C2__check_for_journaling = TRUE; - - if ( file_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fopen() failed (7).\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* get a pointer to the files internal data structure and then - * verify that journaling is enabled. - */ - if ( pass2 ) { - - file_ptr = (H5F_t *)H5I_object_verify(file_id, H5I_FILE); - - if ( file_ptr == NULL ) { - - pass2 = FALSE; - 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 != - (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"; - - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - - /******************************************************************/ - /* 10) Write data to the superblock indicating that journaling is */ - /* not in progress. Close the file. */ - /******************************************************************/ - - if ( pass2 ) { - - file_ptr->shared->mdc_jnl_enabled = FALSE; - - if ( H5F_super_write_mdj_msg(file_ptr, -1) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5F_super_write_mdj_msg failed (5)."; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* close the file again. */ - if ( pass2 ) { - - if ( H5Fclose(file_id) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "file close failed (4)."; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - - /*************************************************************/ - /* 11) Reopen the file, and verify that journaling is not in */ - /* progress. */ - /*************************************************************/ - - /* open the file r/w using the default FAPL */ - if ( pass2 ) { - - file_id = H5Fopen(filename, H5F_ACC_RDWR, H5P_DEFAULT); - - if ( file_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fopen() failed (8).\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - /* get a pointer to the files internal data structure and then - * verify that journaling is disabled. - */ - if ( pass2 ) { - - file_ptr = (H5F_t *)H5I_object_verify(file_id, H5I_FILE); - - if ( file_ptr == NULL ) { - - pass2 = FALSE; - 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"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - - /*************************************/ - /* 12) Close the file and delete it. */ - /*************************************/ - - if ( pass2 ) { - - if ( H5Fclose(file_id) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "file close failed (5)."; - - } else if ( HDremove(filename) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "HDremove() failed.\n"; - } - } - - if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - failures2++; - HDfprintf(stdout, "%s: failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - -} /* check_superblock_extensions() */ - - -/*************************************************************************** - * Function: check_mdjsc_callbacks() - * - * Purpose: Verify that the registration and deregistration of - * metadata journaling status change registration/deregistraion - * works correctly. - * - * 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 - * appropriate error string. - * - * Return: void - * - * Programmer: John Mainzer - * 7/2/08 - * - **************************************************************************/ - -static void -check_mdjsc_callbacks(void) -{ - const char * fcn_name = "check_mdjsc_callbacks():"; - - TESTING("metadata journaling status change callbacks"); - - verify_mdjsc_callback_registration_deregistration(); - - verify_mdjsc_callback_execution(); - - verify_mdjsc_callback_error_rejection(); - - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - failures2++; - HDfprintf(stdout, "%s: failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - } - - return; - -} /* check_mdjsc_callbacks() */ - - -/*************************************************************************** - * - * Function: test_mdjsc_callback() - * - * 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; -static hbool_t callback_test_invalid_cache_ptr = FALSE; -static hbool_t callback_test_null_config_ptr = FALSE; -static hbool_t callback_test_invalid_config = FALSE; -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 -test_mdjsc_callback(const H5C2_mdj_config_t * config_ptr, - hid_t UNUSED dxpl_id, - void * data_ptr) -{ - if ( config_ptr == NULL ) - { - callback_test_null_config_ptr = TRUE; - } - - if ( ( callback_test_cache_ptr == NULL ) || - ( callback_test_cache_ptr->magic != H5C2__H5C2_T_MAGIC ) ) - { - callback_test_invalid_cache_ptr = TRUE; - } - else if ( callback_test_cache_ptr->slist_len > 0 ) - { - callback_test_cache_is_dirty = TRUE; - } - else if ( ( callback_test_cache_ptr != NULL ) && - ( callback_test_cache_ptr->mdj_enabled != - config_ptr->enable_journaling ) ) - { - callback_test_invalid_config = TRUE; - } - - if ( data_ptr == NULL ) - { - callback_test_null_data_ptr = TRUE; - callback_test_null_data_ptr_count++; - } - else - { - *((int *)data_ptr) += 1; - } - - return SUCCEED; - -} /* test_mdjsc_callback() */ - - -/*************************************************************************** - * - * Function: deregister_mdjsc_callback() - * - * 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 - * failure_mssg2 to the appropriate error message. - * - * Do nothing and return if pass2 is false on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 8/15/08 - * - **************************************************************************/ - -static void -deregister_mdjsc_callback(H5F_t * file_ptr, - H5C2_t * cache_ptr, - int32_t idx) -{ - herr_t result; - - if ( pass2 ) - { - if ( ( file_ptr == NULL ) || - ( cache_ptr == NULL ) || - ( cache_ptr->magic != H5C2__H5C2_T_MAGIC ) ) - { - pass2 = FALSE; - failure_mssg2 = - "deregister_mdjsc_callback(): bad param(s) on entry."; - } - } - - if ( pass2 ) - { - result = H5AC2_deregister_mdjsc_callback(file_ptr, idx); - - if ( result < 0 ) - { - pass2 = FALSE; - failure_mssg2 = "H5AC2_deregister_mdjsc_callback() failed."; - } - - verify_mdjsc_callback_deregistered(cache_ptr, idx); - } - - return; - -} /* deregister_mdjsc_callback() */ - - -/*************************************************************************** - * - * Function: register_mdjsc_callback() - * - * Purpose: Attempt to register the supplied metadata journaling - * status change callback, and verify that the registration - * took. - * - * If any error is detected, set pass2 t FALSE, and set the - * failure_mssg2 to the appropriate error message. - * - * Do nothing and return if pass2 is false on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 8/15/08 - * - **************************************************************************/ - -static void -register_mdjsc_callback(H5F_t * file_ptr, - H5C2_t * cache_ptr, - H5C2_mdj_status_change_func_t fcn_ptr, - void * data_ptr, - int32_t * idx_ptr) -{ - herr_t result; - H5C2_mdj_config_t init_config; - - if ( pass2 ) - { - if ( ( file_ptr == NULL ) || - ( cache_ptr == NULL ) || - ( cache_ptr->magic != H5C2__H5C2_T_MAGIC ) || - ( fcn_ptr == NULL ) || - ( idx_ptr == NULL ) ) - { - pass2 = FALSE; - failure_mssg2 = "register_mdjsc_callback(): bad param(s) on entry."; - } - } - - if ( pass2 ) - { - result = H5AC2_register_mdjsc_callback(file_ptr, fcn_ptr, data_ptr, - idx_ptr, &init_config); - - if ( result < 0 ) - { - pass2 = FALSE; - failure_mssg2 = "H5AC2_register_mdjsc_callback() failed."; - } - else if ( init_config.enable_journaling != cache_ptr->mdj_enabled ) - { - pass2 = FALSE; - failure_mssg2 = - "init_config.enable_journaling != cache_ptr->mdj_enabled"; - } - - verify_mdjsc_callback_registered(cache_ptr, - fcn_ptr, - data_ptr, - *idx_ptr); - } - - return; - -} /* register_mdjsc_callback() */ - - -/*************************************************************************** - * - * Function: verify_mdjsc_table_config() - * - * Purpose: Verify that the mdjsc callback table is configured as - * specified. - * - * If all is as it should be, do nothing. - * - * If anything is not as it should be, set pass2 to FALSE, - * and set failure_mssg2 to the appropriate error message. - * - * Do nothing and return if pass2 is false on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 8/15/08 - * - **************************************************************************/ - -static void -verify_mdjsc_table_config(H5C2_t * cache_ptr, - int32_t table_len, - int32_t num_entries, - int32_t max_idx_in_use, - hbool_t * free_entries) -{ - const char * fcn_name = "verify_mdjsc_table_config()"; - hbool_t show_progress = FALSE; - int cp = 0; - - 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 ) ) - { - pass2 = FALSE; - failure_mssg2 = "bad cache_ptr."; - } - } - - if ( show_progress ) - HDfprintf(stdout, "%s:%d: %d.\n", fcn_name, pass2, cp++); - - if ( pass2 ) - { - if ( cache_ptr->mdjsc_cb_tbl == NULL ) - { - pass2 = FALSE; - failure_mssg2 = "cache_ptr->mdjsc_cb_tbl == NULL."; - } - } - - if ( show_progress ) - HDfprintf(stdout, "%s:%d: %d.\n", fcn_name, pass2, cp++); - - if ( pass2 ) - { - if ( cache_ptr->mdjsc_cb_tbl_len != table_len ) - { - pass2 = FALSE; - failure_mssg2 = "mdjsc callback table len mismatch"; - } - else if ( cache_ptr->num_mdjsc_cbs != num_entries ) - { - pass2 = FALSE; - failure_mssg2 = "mdjsc callback table num entries mismatch"; - } - else if ( cache_ptr->mdjsc_cb_tbl_max_idx_in_use != max_idx_in_use ) - { - pass2 = FALSE; - failure_mssg2 = "mdjsc callback table max idx in use mismatch"; - } - } - - if ( show_progress ) - HDfprintf(stdout, "%s:%d: %d.\n", fcn_name, pass2, cp++); - - if ( ( pass2 ) && ( free_entries ) ) - { - int32_t i = 0; - int32_t j; - H5C2_mdjsc_record_t * record_ptr = NULL; - - while ( ( pass2 ) && ( i < table_len ) ) - { - if ( free_entries[i] ) - { - if ( (( (cache_ptr->mdjsc_cb_tbl)[i]).fcn_ptr != NULL) - || - (((cache_ptr->mdjsc_cb_tbl)[i]).data_ptr != NULL) - ) - { - pass2 = FALSE; - failure_mssg2 = - "mdjsc callback table entry in use that should be free"; - } - } - else - { - /* recall that the data_ptr can be NULL when an entry is - * in use. - */ - if ( ((cache_ptr->mdjsc_cb_tbl)[i]).fcn_ptr == NULL ) - { - pass2 = FALSE; - failure_mssg2 = - "mdjsc callback table entry free that shoult be in use"; - } - } - - i++; - } - - 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) ) && - ( j >= 0 ) && - ( j < table_len ) ) - { - record_ptr = &((cache_ptr->mdjsc_cb_tbl)[j]); - - if ( ( record_ptr->fcn_ptr != NULL ) || - ( record_ptr->data_ptr != NULL ) ) - { - pass2 = FALSE; - failure_mssg2 = "mdjsc callback table free list entry in use."; - } - - i++; - j = record_ptr->fl_next; - } - - if ( show_progress ) - HDfprintf(stdout, "%s:%d: %d.\n", fcn_name, pass2, cp++); - - if ( pass2 ) - { - if ( i != (table_len - num_entries) ) { - - pass2 = FALSE; - failure_mssg2 = - "mdjsc callback table free list shorter than expected."; - - } else if ( ( record_ptr != NULL ) && - ( record_ptr->fl_next != -1 ) ) { - - pass2 = FALSE; - failure_mssg2 = - "mdjsc callback table free list longer than expected."; - - } - } - } - - if ( show_progress ) - HDfprintf(stdout, "%s:%d: %d -- done.\n", fcn_name, pass2, cp++); - - return; - -} /* verify_mdjsc_table_config() */ - - -/*************************************************************************** - * - * Function: verify_mdjsc_callback_deregistered() - * - * Purpose: Verify that the suplied mdjsc callback is registerd - * in the metadata journaling status change callback table - * at the specified index and with the specified data ptr. - * - * If all is as it should be, do nothing. - * - * If anything is not as it should be, set pass2 to FALSE, - * and set failure_mssg2 to the appropriate error message. - * - * Do nothing and return if pass2 is false on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 8/15/08 - * - **************************************************************************/ - -static void -verify_mdjsc_callback_deregistered(H5C2_t * cache_ptr, - int32_t idx) -{ - if ( pass2 ) - { - if ( ( cache_ptr == NULL ) || - ( cache_ptr->magic != H5C2__H5C2_T_MAGIC ) ) - { - pass2 = FALSE; - failure_mssg2 = "bad cache_ptr."; - } - } - - if ( pass2 ) - { - if ( cache_ptr->mdjsc_cb_tbl == NULL ) - { - pass2 = FALSE; - failure_mssg2 = "cache_ptr->mdjsc_cb_tbl == NULL."; - } - } - - if ( ( pass2 ) && ( idx < cache_ptr->mdjsc_cb_tbl_len ) ) - { - if ( ((cache_ptr->mdjsc_cb_tbl)[idx]).fcn_ptr != NULL ) - { - pass2 = FALSE; - failure_mssg2 = "fcn_ptr mismatch"; - } - else if ( ((cache_ptr->mdjsc_cb_tbl)[idx]).data_ptr != NULL ) - { - pass2 = FALSE; - failure_mssg2 = "data_ptr mismatch"; - } - } - - return; - -} /* verify_mdjsc_callback_deregistered() */ - - -/*************************************************************************** - * - * Function: verify_mdjsc_callback_registered() - * - * Purpose: Verify that the suplied mdjsc callback is registerd - * in the metadata journaling status change callback table - * at the specified index and with the specified data ptr. - * - * If all is as it should be, do nothing. - * - * If anything is not as it should be, set pass2 to FALSE, - * and set failure_mssg2 to the appropriate error message. - * - * Do nothing and return if pass2 is false on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 8/15/08 - * - **************************************************************************/ - -static void -verify_mdjsc_callback_registered(H5C2_t * cache_ptr, - H5C2_mdj_status_change_func_t fcn_ptr, - void * data_ptr, - int32_t idx) -{ - if ( pass2 ) - { - if ( ( cache_ptr == NULL ) || - ( cache_ptr->magic != H5C2__H5C2_T_MAGIC ) ) - { - pass2 = FALSE; - failure_mssg2 = "bad cache_ptr."; - } - } - - if ( pass2 ) - { - if ( ( fcn_ptr == NULL ) || - ( idx < 0 ) ) - { - pass2 = FALSE; - failure_mssg2 = "bad fcn_ptr and/or negative idx."; - } - } - - if ( pass2 ) - { - if ( cache_ptr->mdjsc_cb_tbl == NULL ) - { - pass2 = FALSE; - failure_mssg2 = "cache_ptr->mdjsc_cb_tbl == NULL."; - } - } - - if ( pass2 ) - { - if ( cache_ptr->mdjsc_cb_tbl_len <= idx ) - { - pass2 = FALSE; - failure_mssg2 = "idx out of range."; - } - } - - if ( pass2 ) - { - if ( ((cache_ptr->mdjsc_cb_tbl)[idx]).fcn_ptr != fcn_ptr ) - { - pass2 = FALSE; - failure_mssg2 = "fcn_ptr mismatch"; - } - else if ( ((cache_ptr->mdjsc_cb_tbl)[idx]).data_ptr != data_ptr ) - { - pass2 = FALSE; - failure_mssg2 = "data_ptr mismatch"; - } - else if ( ((cache_ptr->mdjsc_cb_tbl)[idx]).fl_next != -1 ) - { - pass2 = FALSE; - failure_mssg2 = "fl_next != -1"; - } - } - - return; - -} /* verify_mdjsc_callback_registered() */ - - -/*************************************************************************** - * - * 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 - * invalid input. - * - * If anything is not as it should be, set pass2 to FALSE, - * and set failure_mssg2 to the appropriate error message. - * - * Do nothing and return if pass2 is false on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 8/20/08 - * - **************************************************************************/ - -static void -verify_mdjsc_callback_error_rejection(void) -{ - const char * fcn_name = "verify_mdjsc_callback_error_rejection():"; - char filename[512]; - char journal_filename[H5AC2__MAX_JOURNAL_FILE_NAME_LEN + 1]; - const int max_callbacks = 1024 * H5C2__MIN_MDJSC_CB_TBL_LEN; - int counters[1024 * H5C2__MIN_MDJSC_CB_TBL_LEN]; - int i; - int expected_num_entries = 0; - int expected_table_len = H5C2__MIN_MDJSC_CB_TBL_LEN; - int expected_max_idx = -1; - int32_t indicies[1024 * H5C2__MIN_MDJSC_CB_TBL_LEN]; - hbool_t free_entries[1024 * H5C2__MIN_MDJSC_CB_TBL_LEN]; - hbool_t show_progress = FALSE; - hbool_t verbose = FALSE; - int cp = 0; - herr_t result; - hid_t file_id = -1; - H5F_t * file_ptr = NULL; - H5C2_t * cache_ptr = NULL; - - for ( i = 0; i < max_callbacks; i++ ) - { - counters[i] = 0; - free_entries[i] = TRUE; - indicies[i] = -1; - } - - /* 1) Create a file with journaling enabled. - * - * 2) Attempt to register callbacks with a variety of NULL - * pointers supplied for parameters other than data_ptr. - * All attempts should fail. - * - * 3) Attempt to deregister a callback in an empty callback table. - * Should fail - * - * 4) Register a few callbacks. Attempt to deregister non-existant - * callbacks with indicies both inside and outside the range - * of indicies currently represented in the table. All should - * fail. - * - * 5) Deregister the remaining callbacks, and then close and delete - * the file. - */ - - - /* 1) Create a file with journaling enabled. - */ - - /* setup the file name */ - if ( pass2 ) { - - if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, - sizeof(filename)) == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed (1).\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass2, cp++); - HDfflush(stdout); - } - - if ( verbose ) { - HDfprintf(stdout, "%s filename = \"%s\".\n", fcn_name, filename); - HDfflush(stdout); - } - - /* setup the journal file name */ - if ( pass2 ) { - - 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) >= - H5AC2__MAX_JOURNAL_FILE_NAME_LEN ) { - - pass2 = FALSE; - failure_mssg2 = "journal file name too long.\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( verbose ) { - HDfprintf(stdout, "%s journal filename = \"%s\".\n", - fcn_name, journal_filename); - HDfflush(stdout); - } - - /* clean out any existing journal file */ - HDremove(journal_filename); - setup_cache_for_journaling(filename, journal_filename, &file_id, - &file_ptr, &cache_ptr, TRUE, FALSE, FALSE); - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - - /* 2) Attempt to register callbacks with a variety of NULL - * pointers supplied for parameters other than data_ptr. - * All attempts should fail. - */ - - if ( pass2 ) - { - result = H5AC2_register_mdjsc_callback(NULL, - test_mdjsc_callback, - NULL, - &(indicies[0]), - NULL); - - if ( result == SUCCEED ) - { - pass2 = FALSE; - failure_mssg2 = - "H5AC2_register_mdjsc_callback() succeeded with NULL file_ptr"; - } - } - - if ( pass2 ) - { - result = H5AC2_register_mdjsc_callback(file_ptr, - NULL, - NULL, - &(indicies[0]), - NULL); - - if ( result == SUCCEED ) - { - pass2 = FALSE; - failure_mssg2 = - "H5AC2_register_mdjsc_callback() succeeded with NULL fcn_ptr"; - } - } - - if ( pass2 ) - { - result = H5AC2_register_mdjsc_callback(file_ptr, - test_mdjsc_callback, - NULL, - NULL, - NULL); - - if ( result == SUCCEED ) - { - pass2 = FALSE; - failure_mssg2 = - "H5AC2_register_mdjsc_callback() succeeded with NULL idx_ptr"; - } - } - - - /* 3) Attempt to deregister a callback in an empty callback table. - * Should fail - */ - - if ( pass2 ) - { - result = H5AC2_deregister_mdjsc_callback(NULL, 0); - - if ( result == SUCCEED ) - { - pass2 = FALSE; - failure_mssg2 = - "H5AC2_deregister_mdjsc_callback() succeeded with NULL file_ptr"; - } - } - - if ( pass2 ) - { - result = H5AC2_deregister_mdjsc_callback(file_ptr, 0); - - if ( result == SUCCEED ) - { - pass2 = FALSE; - failure_mssg2 = - "H5AC2_deregister_mdjsc_callback() succeeded with invld idx(1)"; - } - } - - - - /* 4) Register a few callbacks. Attempt to deregister non-existant - * callbacks with indicies both inside and outside the range - * of indicies currently represented in the table. All should - * fail. - */ - - register_mdjsc_callback(file_ptr, cache_ptr, test_mdjsc_callback, - &(counters[0]), &(indicies[0])); - register_mdjsc_callback(file_ptr, cache_ptr, test_mdjsc_callback, - NULL, &(indicies[1])); - 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; - expected_num_entries += 3; - expected_max_idx = 2; - - verify_mdjsc_table_config(cache_ptr, expected_table_len, - expected_num_entries, expected_max_idx, - free_entries); - - - if ( pass2 ) - { - result = H5AC2_deregister_mdjsc_callback(file_ptr, 3); - - if ( result == SUCCEED ) - { - pass2 = FALSE; - failure_mssg2 = - "H5AC2_deregister_mdjsc_callback() succeeded with invld idx(2)"; - } - } - - if ( pass2 ) - { - result = H5AC2_deregister_mdjsc_callback(file_ptr, -1); - - if ( result == SUCCEED ) - { - pass2 = FALSE; - failure_mssg2 = - "H5AC2_deregister_mdjsc_callback() succeeded with invld idx(3)"; - } - } - - verify_mdjsc_table_config(cache_ptr, expected_table_len, - expected_num_entries, expected_max_idx, - free_entries); - - - if ( pass2 ) - { - result = H5AC2_deregister_mdjsc_callback(file_ptr, 1); - - if ( result != SUCCEED ) - { - pass2 = FALSE; - failure_mssg2 = - "H5AC2_deregister_mdjsc_callback() failed with valid idx"; - } - else - { - free_entries[1] = TRUE; - expected_num_entries--; - - verify_mdjsc_table_config(cache_ptr, expected_table_len, - expected_num_entries, expected_max_idx, - free_entries); - - } - } - - if ( pass2 ) - { - result = H5AC2_deregister_mdjsc_callback(file_ptr, -1); - - if ( result == SUCCEED ) - { - pass2 = FALSE; - failure_mssg2 = - "H5AC2_deregister_mdjsc_callback() succeeded with invld idx(4)"; - } - } - - - /* 5) Deregister the remaining callbacks, and then close and delete - * the file. - */ - - deregister_mdjsc_callback(file_ptr, cache_ptr, 0); - deregister_mdjsc_callback(file_ptr, cache_ptr, 2); - - 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, - expected_num_entries, expected_max_idx, - free_entries); - - - /* Close the file, and tidy up. - */ - - if ( pass2 ) { - - if ( H5Fclose(file_id) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fclose() failed."; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - /* delete the HDF5 file and journal file */ -#if 1 - HDremove(filename); - HDremove(journal_filename); -#endif - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d done.\n", - fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - return; - -} /* verify_mdjsc_callback_error_rejection() */ - - -/*************************************************************************** - * - * Function: verify_mdjsc_callback_execution() - * - * 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 - * to the callback function. - * - * If anything is not as it should be, set pass2 to FALSE, - * and set failure_mssg2 to the appropriate error message. - * - * Do nothing and return if pass2 is false on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 8/15/08 - * - **************************************************************************/ - -static void -verify_mdjsc_callback_execution(void) -{ - const char * fcn_name = "verify_mdjsc_callback_execution():"; - char filename[512]; - char journal_filename[H5AC2__MAX_JOURNAL_FILE_NAME_LEN + 1]; - const int max_callbacks = 1024 * H5C2__MIN_MDJSC_CB_TBL_LEN; - int counters[1024 * H5C2__MIN_MDJSC_CB_TBL_LEN]; - int i; - int expected_num_entries = 0; - int expected_table_len = H5C2__MIN_MDJSC_CB_TBL_LEN; - int expected_max_idx = -1; - int32_t indicies[1024 * H5C2__MIN_MDJSC_CB_TBL_LEN]; - hbool_t free_entries[1024 * H5C2__MIN_MDJSC_CB_TBL_LEN]; - hbool_t show_progress = FALSE; - hbool_t verbose = FALSE; - int cp = 0; - herr_t result; - hid_t dataset_id = -1; - hid_t dataspace_id = -1; - hid_t file_id = -1; - H5F_t * file_ptr = NULL; - H5C2_t * cache_ptr = NULL; - hsize_t dims[2]; - H5AC2_jnl_config_t jnl_config; - - for ( i = 0; i < max_callbacks; i++ ) - { - counters[i] = 0; - free_entries[i] = TRUE; - indicies[i] = -1; - } - - /* 1) Create a file with journaling enabled. - * - * 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 - * called, that it gets the correct data, and that the cache - * is clear at time of call. - * - * 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 - * clean at time of call. - * - * 7) Perform some more writes to the file. - * - * 8) 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. - * - * 9) Deregister the callback, and close the file. Recall that - * all metadata journaling status change callbacks must - * deregister before the metadata cache is destroyed. - * - * 10) Re-open the file with journaling disabled, and register - * several callbacks. Ensure that at least one has NULL - * data_ptr. - * - * 11) Enable journaling. Verify that the callbacks are called. - * - * 12) Perform some writes to the file. - * - * 13) Register a great number of callbacks. - * - * 14) Disable journaling. Verify that the callbacks are called. - * - * 15) Deregister some of the callbacks. - * - * 16) Enable journaling. Verify that the remaining callbacks are - * called. - * - * 17) Deregister the remaining callbacks, and then close and delete - * the file. - */ - - - /* 1) Create a file with journaling enabled. - */ - - /* setup the file name */ - if ( pass2 ) { - - if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, - sizeof(filename)) == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed (1).\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass2, cp++); - HDfflush(stdout); - } - - if ( verbose ) { - HDfprintf(stdout, "%s filename = \"%s\".\n", fcn_name, filename); - HDfflush(stdout); - } - - /* setup the journal file name */ - if ( pass2 ) { - - 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) >= - H5AC2__MAX_JOURNAL_FILE_NAME_LEN ) { - - pass2 = FALSE; - failure_mssg2 = "journal file name too long.\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( verbose ) { - HDfprintf(stdout, "%s journal filename = \"%s\".\n", - fcn_name, journal_filename); - HDfflush(stdout); - } - - /* clean out any existing journal file */ - HDremove(journal_filename); - setup_cache_for_journaling(filename, journal_filename, &file_id, - &file_ptr, &cache_ptr, TRUE, FALSE, FALSE); - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - - /* 2) Register a callback. - */ - - register_mdjsc_callback(file_ptr, cache_ptr, test_mdjsc_callback, - &(counters[0]), &(indicies[0])); - - free_entries[0] = FALSE; - expected_num_entries++; - expected_max_idx = 0; - - verify_mdjsc_table_config(cache_ptr, expected_table_len, - expected_num_entries, expected_max_idx, - free_entries); - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - /* 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. - */ - - if ( pass2 ) { - - jnl_config.version = H5AC2__CURR_JNL_CONFIG_VER; - - result = H5Fget_jnl_config(file_id, &jnl_config); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fget_jnl_config() failed.\n"; - } - - /* set journaling config fields to taste */ - jnl_config.enable_journaling = FALSE; - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( pass2 ) { - - counters[0] = 0; - callback_test_cache_ptr = cache_ptr; - callback_test_invalid_cache_ptr = FALSE; - callback_test_null_config_ptr = FALSE; - callback_test_invalid_config = FALSE; - callback_test_null_data_ptr = FALSE; - callback_test_cache_is_dirty = FALSE; - callback_test_null_data_ptr_count = 0; - - result = H5Fset_jnl_config(file_id, &jnl_config); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fset_jnl_config() failed.\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( pass2 ) { - - if ( counters[0] != 1 ) - { - pass2 = FALSE; - failure_mssg2 = "incorrect number of callback calls(1)."; - } - else if ( callback_test_cache_is_dirty ) - { - pass2 = FALSE; - failure_mssg2 = "callback found dirty cache(1)."; - } - else if ( ( callback_test_invalid_cache_ptr ) || - ( callback_test_null_config_ptr ) || - ( callback_test_invalid_config ) || - ( callback_test_null_data_ptr ) || - ( callback_test_null_data_ptr_count != 0 ) ) - { - pass2 = FALSE; - failure_mssg2 = "Bad parameter(s) to callback(1)."; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - - /* 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. - */ - - if ( pass2 ) { - - jnl_config.version = H5AC2__CURR_JNL_CONFIG_VER; - - result = H5Fget_jnl_config(file_id, &jnl_config); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fget_jnl_config() failed.\n"; - } - - /* set journaling config fields to taste */ - jnl_config.enable_journaling = TRUE; - - HDstrcpy(jnl_config.journal_file_path, journal_filename); - - 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_human_readable = TRUE; - - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( pass2 ) { - - counters[0] = 0; - callback_test_cache_ptr = cache_ptr; - callback_test_invalid_cache_ptr = FALSE; - callback_test_null_config_ptr = FALSE; - callback_test_invalid_config = FALSE; - callback_test_null_data_ptr = FALSE; - callback_test_cache_is_dirty = FALSE; - callback_test_null_data_ptr_count = 0; - - - result = H5Fset_jnl_config(file_id, &jnl_config); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fset_jnl_config() failed.\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( pass2 ) { - - if ( counters[0] != 1 ) - { - pass2 = FALSE; - failure_mssg2 = "incorrect number of callback calls(2)."; - } - else if ( callback_test_cache_is_dirty ) - { - pass2 = FALSE; - failure_mssg2 = "callback found dirty cache(2)."; - } - else if ( ( callback_test_invalid_cache_ptr ) || - ( callback_test_null_config_ptr ) || - ( callback_test_invalid_config ) || - ( callback_test_null_data_ptr ) ) - { - pass2 = FALSE; - failure_mssg2 = "Bad parameter(s) to callback(2)."; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - /* 5) Perform some writes to the file. */ - - if ( pass2 ) { - - dims[0] = 4; - dims[1] = 6; - dataspace_id = H5Screate_simple(2, dims, NULL); - - if ( dataspace_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Screate_simple() failed."; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( pass2 ) { - - /* Create the dataset. */ - dataset_id = H5Dcreate2(file_id, "/dset0", H5T_STD_I32BE, - dataspace_id, H5P_DEFAULT, - H5P_DEFAULT, H5P_DEFAULT); - - if ( dataspace_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Dcreate2() failed."; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( pass2 ) { - - /* close the data set, and the data space */ - if ( ( H5Dclose(dataset_id) < 0 ) || - ( H5Sclose(dataspace_id) < 0 ) ) - { - pass2 = FALSE; - failure_mssg2 = "data set, or data space close failed."; - } - } - - if ( pass2 ) { - - if ( cache_ptr->slist_len <= 0 ) { - - pass2 = FALSE; - failure_mssg2 = "cache isnt' dirty?!?"; - } - } - - - /* 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. - */ - - if ( pass2 ) { - - jnl_config.version = H5AC2__CURR_JNL_CONFIG_VER; - - result = H5Fget_jnl_config(file_id, &jnl_config); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fget_jnl_config() failed.\n"; - } - - /* set journaling config fields to taste */ - jnl_config.enable_journaling = FALSE; - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( pass2 ) { - - counters[0] = 0; - callback_test_cache_ptr = cache_ptr; - callback_test_invalid_cache_ptr = FALSE; - callback_test_null_config_ptr = FALSE; - callback_test_invalid_config = FALSE; - callback_test_null_data_ptr = FALSE; - callback_test_cache_is_dirty = FALSE; - - result = H5Fset_jnl_config(file_id, &jnl_config); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fset_jnl_config() failed.\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( pass2 ) { - - if ( counters[0] != 1 ) - { - pass2 = FALSE; - failure_mssg2 = "incorrect number of callback calls(3)."; - } - else if ( callback_test_cache_is_dirty ) - { - pass2 = FALSE; - failure_mssg2 = "callback found dirty cache(3)."; - } - else if ( ( callback_test_invalid_cache_ptr ) || - ( callback_test_null_config_ptr ) || - ( callback_test_invalid_config ) || - ( callback_test_null_data_ptr ) ) - { - pass2 = FALSE; - failure_mssg2 = "Bad parameter(s) to callback(3)."; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - - /* 7) Perform some more writes to the file. */ - - if ( pass2 ) { - - dims[0] = 6; - dims[1] = 8; - dataspace_id = H5Screate_simple(2, dims, NULL); - - if ( dataspace_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Screate_simple() failed."; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( pass2 ) { - - /* Create the dataset. */ - dataset_id = H5Dcreate2(file_id, "/dset1", H5T_STD_I32BE, - dataspace_id, H5P_DEFAULT, - H5P_DEFAULT, H5P_DEFAULT); - - if ( dataspace_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Dcreate2() failed."; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( pass2 ) { - - /* close the data set, and the data space */ - if ( ( H5Dclose(dataset_id) < 0 ) || - ( H5Sclose(dataspace_id) < 0 ) ) - { - pass2 = FALSE; - failure_mssg2 = "data set, or data space close failed."; - } - } - - if ( pass2 ) { - - if ( cache_ptr->slist_len <= 0 ) { - - pass2 = FALSE; - failure_mssg2 = "cache isnt' dirty?!?"; - } - } - - - /* 8) 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. - */ - - if ( pass2 ) { - - jnl_config.version = H5AC2__CURR_JNL_CONFIG_VER; - - result = H5Fget_jnl_config(file_id, &jnl_config); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fget_jnl_config() failed.\n"; - } - - /* set journaling config fields to taste */ - jnl_config.enable_journaling = TRUE; - - HDstrcpy(jnl_config.journal_file_path, journal_filename); - - 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_human_readable = TRUE; - - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( pass2 ) { - - counters[0] = 0; - callback_test_cache_ptr = cache_ptr; - callback_test_invalid_cache_ptr = FALSE; - callback_test_null_config_ptr = FALSE; - callback_test_invalid_config = FALSE; - callback_test_null_data_ptr = FALSE; - callback_test_cache_is_dirty = FALSE; - callback_test_null_data_ptr_count = 0; - - result = H5Fset_jnl_config(file_id, &jnl_config); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fset_jnl_config() failed.\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( pass2 ) { - - if ( counters[0] != 1 ) - { - pass2 = FALSE; - failure_mssg2 = "incorrect number of callback calls(4)."; - } - else if ( callback_test_cache_is_dirty ) - { - pass2 = FALSE; - failure_mssg2 = "callback found dirty cache(4)."; - } - else if ( ( callback_test_invalid_cache_ptr ) || - ( callback_test_null_config_ptr ) || - ( callback_test_invalid_config ) || - ( callback_test_null_data_ptr ) ) - { - pass2 = FALSE; - failure_mssg2 = "Bad parameter(s) to callback(4)."; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - - /* 9) Deregister the callback, and close the file. Recall that - * 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; - expected_num_entries = 0; - expected_max_idx = -1; - - verify_mdjsc_table_config(cache_ptr, expected_table_len, - expected_num_entries, expected_max_idx, - free_entries); - - if ( file_id >= 0 ) { - - if ( H5Fclose(file_id) < 0 ) { - - if ( pass2 ) { - - pass2 = FALSE; - failure_mssg2 = "file close failed."; - } - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d *cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - - - /* 10) Re-open the file with journaling disabled, and register - * several callbacks. Ensure that at least one has NULL - * data_ptr. - */ - - open_existing_file_without_journaling(filename, &file_id, - &file_ptr, &cache_ptr); - - - register_mdjsc_callback(file_ptr, cache_ptr, test_mdjsc_callback, - &(counters[0]), &(indicies[0])); - register_mdjsc_callback(file_ptr, cache_ptr, test_mdjsc_callback, - NULL, &(indicies[1])); - 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; - expected_num_entries += 3; - expected_max_idx = 2; - - verify_mdjsc_table_config(cache_ptr, expected_table_len, - expected_num_entries, expected_max_idx, - free_entries); - - - /* 11) Enable journaling. Verify that the callbacks are called. */ - - if ( pass2 ) { - - jnl_config.version = H5AC2__CURR_JNL_CONFIG_VER; - - result = H5Fget_jnl_config(file_id, &jnl_config); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fget_jnl_config() failed.\n"; - } - - /* set journaling config fields to taste */ - jnl_config.enable_journaling = TRUE; - - HDstrcpy(jnl_config.journal_file_path, journal_filename); - - 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_human_readable = TRUE; - - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( pass2 ) { - - counters[0] = 0; - callback_test_cache_ptr = cache_ptr; - callback_test_invalid_cache_ptr = FALSE; - callback_test_null_config_ptr = FALSE; - callback_test_invalid_config = FALSE; - callback_test_null_data_ptr = FALSE; - callback_test_cache_is_dirty = FALSE; - callback_test_null_data_ptr_count = 0; - - - result = H5Fset_jnl_config(file_id, &jnl_config); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fset_jnl_config() failed.\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( pass2 ) { - - if ( ( counters[0] != 1 ) && - ( counters[1] != 0 ) && - ( counters[2] != 1 ) && - ( counters[3] != 0 ) ) - { - pass2 = FALSE; - failure_mssg2 = "incorrect number of callback calls(5)."; - } - else if ( callback_test_cache_is_dirty ) - { - pass2 = FALSE; - failure_mssg2 = "callback found dirty cache(5)."; - } - else if ( ( callback_test_invalid_cache_ptr ) || - ( callback_test_null_config_ptr ) || - ( callback_test_invalid_config ) ) - { - pass2 = FALSE; - failure_mssg2 = "Bad parameter(s) to callback(5)."; - } - else if ( ( ! callback_test_null_data_ptr ) || - ( callback_test_null_data_ptr_count != 1 ) ) - { - pass2 = FALSE; - failure_mssg2 = "incorrect null data_ptr callbacks.(5)"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - - /* 12) Perform some writes to the file. */ - - if ( pass2 ) { - - dims[0] = 8; - dims[1] = 10; - dataspace_id = H5Screate_simple(2, dims, NULL); - - if ( dataspace_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Screate_simple() failed."; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( pass2 ) { - - /* Create the dataset. */ - dataset_id = H5Dcreate2(file_id, "/dset2", H5T_STD_I32BE, - dataspace_id, H5P_DEFAULT, - H5P_DEFAULT, H5P_DEFAULT); - - if ( dataspace_id < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Dcreate2() failed."; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( pass2 ) { - - /* close the data set, and the data space */ - if ( ( H5Dclose(dataset_id) < 0 ) || - ( H5Sclose(dataspace_id) < 0 ) ) - { - pass2 = FALSE; - failure_mssg2 = "data set, or data space close failed."; - } - } - - if ( pass2 ) { - - if ( cache_ptr->slist_len <= 0 ) { - - pass2 = FALSE; - failure_mssg2 = "cache isnt' dirty?!?"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - - /* 13) Register a great number of callbacks. */ - - for ( i = 3; i < max_callbacks; i++ ) - { - if ( ( pass2 ) && ( free_entries[i] ) ) - { - register_mdjsc_callback(file_ptr, cache_ptr, test_mdjsc_callback, - &(counters[i]), &(indicies[i])); - - HDassert( indicies[i] == i ); - - free_entries[i] = FALSE; - expected_num_entries++; - - if ( i > expected_max_idx ) { - - expected_max_idx = i; - } - - if ( expected_num_entries > expected_table_len ) { - - expected_table_len *= 2; - } - - verify_mdjsc_table_config(cache_ptr, expected_table_len, - expected_num_entries, expected_max_idx, - free_entries); - } - } - - HDassert( expected_num_entries == max_callbacks ); - HDassert( expected_max_idx == (max_callbacks - 1) ); - HDassert( expected_table_len == max_callbacks ); - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - - /* 14) Disable journaling. Verify that the callbacks are called. */ - - if ( pass2 ) { - - jnl_config.version = H5AC2__CURR_JNL_CONFIG_VER; - - result = H5Fget_jnl_config(file_id, &jnl_config); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fget_jnl_config() failed.\n"; - } - - /* set journaling config fields to taste */ - jnl_config.enable_journaling = FALSE; - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( pass2 ) { - - for ( i = 0; i < max_callbacks; i++ ) - { - counters[i] = 0; - } - callback_test_cache_ptr = cache_ptr; - callback_test_invalid_cache_ptr = FALSE; - callback_test_null_config_ptr = FALSE; - callback_test_invalid_config = FALSE; - callback_test_null_data_ptr = FALSE; - callback_test_cache_is_dirty = FALSE; - callback_test_null_data_ptr_count = 0; - - result = H5Fset_jnl_config(file_id, &jnl_config); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fset_jnl_config() failed.\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( pass2 ) { - int max_counter = 0; - int counter_sum = 0; - - for ( i = 0; i < max_callbacks; i++ ) - { - if ( counters[i] > max_counter ) - { - max_counter = counters[i]; - } - counter_sum += counters[i]; - } - - if ( ( counters[1] != 0 ) || - ( max_counter != 1 ) || - ( counter_sum != max_callbacks - 1 ) ) - { - pass2 = FALSE; - failure_mssg2 = "incorrect number of callback calls(6)."; - } - else if ( callback_test_cache_is_dirty ) - { - pass2 = FALSE; - failure_mssg2 = "callback found dirty cache(6)."; - } - else if ( ( callback_test_invalid_cache_ptr ) || - ( callback_test_null_config_ptr ) || - ( callback_test_invalid_config ) ) - { - pass2 = FALSE; - failure_mssg2 = "Bad parameter(s) to callback(6)."; - } - else if ( ( ! callback_test_null_data_ptr ) || - ( callback_test_null_data_ptr_count != 1 ) ) - { - pass2 = FALSE; - failure_mssg2 = "incorrect null data_ptr callbacks.(6)"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - - /* 15) Deregister some of the callbacks. */ - - /* working from the top downwards, de-register all entries with - * indicies not divisible by 8. - */ - - for ( i = max_callbacks - 1; i >= 0; i-- ) - { - if ( ( pass2 ) && ( ! free_entries[i] ) && ( (i % 8) != 0 ) ) - { - deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[i]); - - indicies[i] = -1; - free_entries[i] = TRUE; - expected_num_entries--; - - if ( i == expected_max_idx ) - { - double fraction_in_use; - - while ( ( expected_max_idx >= 0 ) && - ( free_entries[expected_max_idx] ) ) - { - expected_max_idx--; - } - - fraction_in_use = ((double)expected_num_entries) / - ((double)expected_table_len); - - while ( ( expected_max_idx < (expected_table_len / 2) ) - && - ( fraction_in_use < - H5C2__MDJSC_CB_TBL_MIN_ACTIVE_RATIO ) - && - ( (expected_table_len / 2) >= - H5C2__MIN_MDJSC_CB_TBL_LEN ) - ) - { - expected_table_len /= 2; - } - } - - verify_mdjsc_table_config(cache_ptr, expected_table_len, - expected_num_entries, - expected_max_idx, - free_entries); - } - } - - HDassert( expected_num_entries == max_callbacks / 8 ); - HDassert( expected_max_idx == (max_callbacks - 8) ); - HDassert( expected_table_len == max_callbacks ); - - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - - /* 16) Enable journaling. Verify that the remaining callbacks are - * called. - */ - - if ( pass2 ) { - - jnl_config.version = H5AC2__CURR_JNL_CONFIG_VER; - - result = H5Fget_jnl_config(file_id, &jnl_config); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fget_jnl_config() failed.\n"; - } - - /* set journaling config fields to taste */ - jnl_config.enable_journaling = TRUE; - - HDstrcpy(jnl_config.journal_file_path, journal_filename); - - 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_human_readable = TRUE; - - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( pass2 ) { - - for ( i = 0; i < max_callbacks; i++ ) - { - counters[i] = 0; - } - callback_test_cache_ptr = cache_ptr; - callback_test_invalid_cache_ptr = FALSE; - callback_test_null_config_ptr = FALSE; - callback_test_invalid_config = FALSE; - callback_test_null_data_ptr = FALSE; - callback_test_cache_is_dirty = FALSE; - callback_test_null_data_ptr_count = 0; - - result = H5Fset_jnl_config(file_id, &jnl_config); - - if ( result < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fset_jnl_config() failed.\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( pass2 ) { - int max_counter = 0; - int counter_sum = 0; - - for ( i = 0; i < max_callbacks; i++ ) - { - if ( counters[i] > max_counter ) - { - max_counter = counters[i]; - } - counter_sum += counters[i]; - } - - if ( ( max_counter != 1 ) || - ( counter_sum != ( max_callbacks / 8 ) ) ) - { - pass2 = FALSE; - failure_mssg2 = "incorrect number of callback calls(7)."; - } - else if ( callback_test_cache_is_dirty ) - { - pass2 = FALSE; - failure_mssg2 = "callback found dirty cache(7)."; - } - else if ( ( callback_test_invalid_cache_ptr ) || - ( callback_test_null_config_ptr ) || - ( callback_test_invalid_config ) ) - { - pass2 = FALSE; - failure_mssg2 = "Bad parameter(s) to callback(7)."; - } - else if ( ( callback_test_null_data_ptr ) || - ( callback_test_null_data_ptr_count != 0 ) ) - { - pass2 = FALSE; - failure_mssg2 = "incorrect null data_ptr callbacks.(6)"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - - /* 17) Deregister the remaining callbacks, and then close and delete - * the file. - */ - - for ( i = max_callbacks - 1; i >= 0; i-- ) - { - if ( ( pass2 ) && ( ! free_entries[i] ) ) - { - deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[i]); - - indicies[i] = -1; - free_entries[i] = TRUE; - expected_num_entries--; - - if ( i == expected_max_idx ) - { - double fraction_in_use; - - while ( ( expected_max_idx >= 0 ) && - ( free_entries[expected_max_idx] ) ) - { - expected_max_idx--; - } - - fraction_in_use = ((double)expected_num_entries) / - ((double)expected_table_len); - - while ( ( expected_max_idx < (expected_table_len / 2) ) - && - ( fraction_in_use < - H5C2__MDJSC_CB_TBL_MIN_ACTIVE_RATIO ) - && - ( (expected_table_len / 2) >= - H5C2__MIN_MDJSC_CB_TBL_LEN ) - ) - { - expected_table_len /= 2; - } - } - - verify_mdjsc_table_config(cache_ptr, expected_table_len, - expected_num_entries, - expected_max_idx, - free_entries); - } - } - - HDassert( expected_num_entries == 0 ); - HDassert( expected_max_idx == -1 ); - HDassert( expected_table_len == H5C2__MIN_MDJSC_CB_TBL_LEN ); - - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - - /* Close the file, and tidy up. - */ - - if ( pass2 ) { - - if ( H5Fclose(file_id) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fclose() failed."; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - /* delete the HDF5 file and journal file */ -#if 1 - HDremove(filename); - HDremove(journal_filename); -#endif - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d done.\n", - fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - return; - -} /* verify_mdjsc_callback_execution() */ - - -/*************************************************************************** - * - * Function: verify_mdjsc_callback_registration_deregistration() - * - * 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. - * - * If anything is not as it should be, set pass2 to FALSE, - * and set failure_mssg2 to the appropriate error message. - * - * Do nothing and return if pass2 is false on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 8/15/08 - * - **************************************************************************/ - -static void -verify_mdjsc_callback_registration_deregistration(void) -{ - const char * fcn_name = - "verify_mdjsc_callback_registration_deregistration():"; - char filename[512]; - char journal_filename[H5AC2__MAX_JOURNAL_FILE_NAME_LEN + 1]; - const int max_callbacks = 1024 * H5C2__MIN_MDJSC_CB_TBL_LEN; - int counters[1024 * H5C2__MIN_MDJSC_CB_TBL_LEN]; - int i; - int j; - int expected_num_entries = 0; - int expected_table_len = H5C2__MIN_MDJSC_CB_TBL_LEN; - int expected_max_idx = -1; - int32_t indicies[1024 * H5C2__MIN_MDJSC_CB_TBL_LEN]; - hbool_t free_entries[1024 * H5C2__MIN_MDJSC_CB_TBL_LEN]; - hbool_t show_progress = FALSE; - hbool_t verbose = FALSE; - int cp = 0; - hid_t file_id = -1; - H5F_t * file_ptr = NULL; - H5C2_t * cache_ptr = NULL; - - for ( i = 0; i < max_callbacks; i++ ) - { - counters[i] = 0; - free_entries[i] = TRUE; - indicies[i] = -1; - } - - /* 1) Open a file for journaling. It doesn't matter whether - * journaling is enabled or not, as this test is directed purely - * at the issue of whether the callback table is managed correctly. - * - * 2) Register a callback. Verify that is is added correctly to - * the metadata journaling status change callback table. - * - * 3) Deregister the callback. Verify that it is deleted correctly - * from the metadata journaling status change callback table. - * - * 4) Register H5C2__MIN_MDJSC_CB_TBL_LEN - 1 callbacks. Verify that - * they are all correctly added to the table, and that the table - * is of size H5C2__MIN_MDJSC_CB_TBL_LEN, and that it contains - * the expected number of entries. - * - * 5) Register one more entry. Verify that it is registered - * correctly, and that the table is now full. - * - * 6) Register another entry. Verify that is is correctly registered, - * that the table has doubled in size. - * - * 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. - * - * 9) Deregister all callbacks. Verify that the table is empty. - * - * 10) Register 8 * H5C2__MIN_MDJSC_CB_TBL_LEN + 1 callbacks. Verify - * 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 - * deregistrations. Verify that the table does not shrink. - * - * 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 - * 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 - * 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 - * 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 - * deregistered, and that the table does not shrink. - * - * 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. - * Verify that the table shrinks as expected. - * - * 20) Do a torture tests -- forcing the number of registered callbacks - * into the thousands. After each registration and deregistration, - * verify that the table is configured as expected. - */ - - - /* 1) Open a file for journaling. It doesn't matter whether - * journaling is enabled or not, as this test is directed purely - * at the issue of whether the callback table is managed correctly. - */ - - /* setup the file name */ - if ( pass2 ) { - - if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, - sizeof(filename)) == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed (1).\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass2, cp++); - HDfflush(stdout); - } - - if ( verbose ) { - HDfprintf(stdout, "%s filename = \"%s\".\n", fcn_name, filename); - HDfflush(stdout); - } - - /* setup the journal file name */ - if ( pass2 ) { - - 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) >= - H5AC2__MAX_JOURNAL_FILE_NAME_LEN ) { - - pass2 = FALSE; - failure_mssg2 = "journal file name too long.\n"; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( verbose ) { - HDfprintf(stdout, "%s journal filename = \"%s\".\n", - fcn_name, journal_filename); - HDfflush(stdout); - } - - /* clean out any existing journal file */ - HDremove(journal_filename); - setup_cache_for_journaling(filename, journal_filename, &file_id, - &file_ptr, &cache_ptr, TRUE, FALSE, FALSE); - - - /* 2) Register a callback. Verify that is is added correctly to - * the metadata journaling status change callback table. - */ - j = 0; - - register_mdjsc_callback(file_ptr, cache_ptr, test_mdjsc_callback, - &(counters[j]), &(indicies[j])); - - free_entries[j] = FALSE; - expected_num_entries++; - expected_max_idx = 0; - - verify_mdjsc_table_config(cache_ptr, expected_table_len, - expected_num_entries, expected_max_idx, - free_entries); - - j++; - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - - /* 3) Deregister the callback. Verify that it is deleted correctly - * from the metadata journaling status change callback table. - */ - j--; - - deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[j]); - - free_entries[j] = TRUE; - expected_num_entries--; - expected_max_idx = -1; - - verify_mdjsc_table_config(cache_ptr, expected_table_len, - expected_num_entries, expected_max_idx, - free_entries); - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - - /* 4) Register H5C2__MIN_MDJSC_CB_TBL_LEN - 1 callbacks. Verify that - * they are all correctly added to the table, and that the table - * is of size H5C2__MIN_MDJSC_CB_TBL_LEN, and that it contains - * the expected number of entries. - */ - for ( i = 0; i < H5C2__MIN_MDJSC_CB_TBL_LEN - 1; i++ ) - { - register_mdjsc_callback(file_ptr, cache_ptr, test_mdjsc_callback, - &(counters[j]), &(indicies[j])); - - free_entries[j] = FALSE; - expected_num_entries++; - expected_max_idx++; - - verify_mdjsc_table_config(cache_ptr, expected_table_len, - expected_num_entries, expected_max_idx, - free_entries); - - j++; - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - - /* 5) Register one more entry. Verify that it is registered - * correctly, and that the table is now full. - */ - - register_mdjsc_callback(file_ptr, cache_ptr, test_mdjsc_callback, - &(counters[j]), &(indicies[j])); - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - free_entries[j] = FALSE; - expected_num_entries++; - expected_max_idx++; - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - verify_mdjsc_table_config(cache_ptr, expected_table_len, - expected_num_entries, expected_max_idx, - free_entries); - - j++; - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - if ( ( pass2 ) && ( expected_num_entries != expected_table_len ) ) - { - pass2 = FALSE; - failure_mssg2 = "Unexpected table len(1)"; - } - - - /* 6) Register another entry. Verify that is is correctly registered, - * that the table has doubled in size. - */ - - register_mdjsc_callback(file_ptr, cache_ptr, test_mdjsc_callback, - &(counters[j]), &(indicies[j])); - - free_entries[j] = FALSE; - expected_num_entries++; - expected_max_idx++; - expected_table_len *= 2; - - verify_mdjsc_table_config(cache_ptr, expected_table_len, - expected_num_entries, expected_max_idx, - free_entries); - - j++; - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - - /* 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. - */ - - for ( i = 0; i < (H5C2__MIN_MDJSC_CB_TBL_LEN / 2) + 1; i++ ) - { - j--; - - deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[j]); - - free_entries[j] = TRUE; - expected_num_entries--; - expected_max_idx--; - - verify_mdjsc_table_config(cache_ptr, expected_table_len, - expected_num_entries, expected_max_idx, - free_entries); - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - - /* 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. - */ - - j--; - - deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[j]); - - free_entries[j] = TRUE; - expected_num_entries--; - expected_max_idx--; - expected_table_len /= 2; - - verify_mdjsc_table_config(cache_ptr, expected_table_len, - expected_num_entries, expected_max_idx, - free_entries); - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - - /* 9) Deregister all callbacks. Verify that the table is empty. - */ - - while ( expected_num_entries > 0 ) - { - j--; - - deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[j]); - - free_entries[j] = TRUE; - expected_num_entries--; - expected_max_idx--; - - verify_mdjsc_table_config(cache_ptr, expected_table_len, - expected_num_entries, expected_max_idx, - free_entries); - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - - /* 10) 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. - */ - - for ( i = 0; i < ((8 * H5C2__MIN_MDJSC_CB_TBL_LEN) + 1); i++ ) - { - register_mdjsc_callback(file_ptr, cache_ptr, test_mdjsc_callback, - &(counters[i]), &(indicies[i])); - - HDassert( indicies[i] == i ); - - free_entries[i] = FALSE; - expected_num_entries++; - expected_max_idx++; - - if ( expected_num_entries > expected_table_len ) { - - expected_table_len *= 2; - } - - verify_mdjsc_table_config(cache_ptr, expected_table_len, - expected_num_entries, expected_max_idx, - free_entries); - } - - HDassert( expected_table_len == 16 * H5C2__MIN_MDJSC_CB_TBL_LEN ); - HDassert( expected_table_len < 1024 ); - HDassert( expected_max_idx == 8 * H5C2__MIN_MDJSC_CB_TBL_LEN ); - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - - /* 11) Deregister all callbacks with even indicies. Verify the - * deregistrations. Verify that the table does not shrink. - */ - - for ( i = 0; i < (8 * H5C2__MIN_MDJSC_CB_TBL_LEN) + 1; i += 2 ) - { - deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[i]); - - indicies[i] = -1; - free_entries[i] = TRUE; - expected_num_entries--; - - if ( i == expected_max_idx ) { - expected_max_idx--; - } - - verify_mdjsc_table_config(cache_ptr, expected_table_len, - expected_num_entries, expected_max_idx, - free_entries); - - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - - /* 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 - * 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. - */ - - j = 8 * H5C2__MIN_MDJSC_CB_TBL_LEN; - - register_mdjsc_callback(file_ptr, cache_ptr, test_mdjsc_callback, - &(counters[j]), &(indicies[j])); - - HDassert( indicies[j] == j ); /* see comment above */ - free_entries[j] = FALSE; - expected_num_entries++; - - if ( j > expected_max_idx ) { - - expected_max_idx = j; - } - - verify_mdjsc_table_config(cache_ptr, expected_table_len, - expected_num_entries, expected_max_idx, - free_entries); - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - - /* 13) Starting with the lowest index, deregister all the callbacks. - * 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] ) - { - deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[i]); - - indicies[i] = -1; - free_entries[i] = TRUE; - expected_num_entries--; - - 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, - expected_num_entries, expected_max_idx, - free_entries); - } - } - - if ( show_progress ) { - - 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 - * to 16 * H5C2__MIN_MDJSC_CB_TBL_LEN. - */ - - for ( i = 0; i < ((8 * H5C2__MIN_MDJSC_CB_TBL_LEN) + 1); i++ ) - { - register_mdjsc_callback(file_ptr, cache_ptr, test_mdjsc_callback, - &(counters[i]), &(indicies[i])); - - HDassert( indicies[i] == i ); - - free_entries[i] = FALSE; - expected_num_entries++; - expected_max_idx++; - - if ( expected_num_entries > expected_table_len ) { - - expected_table_len *= 2; - } - - verify_mdjsc_table_config(cache_ptr, expected_table_len, - expected_num_entries, expected_max_idx, - free_entries); - } - - HDassert( expected_table_len == 16 * H5C2__MIN_MDJSC_CB_TBL_LEN ); - HDassert( expected_table_len < 1024 ); - HDassert( expected_max_idx == 8 * H5C2__MIN_MDJSC_CB_TBL_LEN ); - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - - /* 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 - */ - - for ( i = (8 * H5C2__MIN_MDJSC_CB_TBL_LEN); i >= 0; i-- ) - { - if ( ( ! free_entries[i] ) && - ( (i % (H5C2__MIN_MDJSC_CB_TBL_LEN /2)) != 0 ) ) - { - deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[i]); - - indicies[i] = -1; - free_entries[i] = TRUE; - expected_num_entries--; - - if ( i == expected_max_idx ) - { - expected_max_idx = -1; - } - - verify_mdjsc_table_config(cache_ptr, expected_table_len, - expected_num_entries, expected_max_idx, - free_entries); - } - } - - if ( show_progress ) { - - 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 - * they are placed in slots freed by the dergistrations in 15) above. - */ - - /* 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. - */ - - j = 1; - - for ( i = 0; i < H5C2__MIN_MDJSC_CB_TBL_LEN / 2; i++ ) - { - while ( ! free_entries[j] ) - { - j++; - } - - register_mdjsc_callback(file_ptr, cache_ptr, test_mdjsc_callback, - &(counters[j]), &(indicies[j])); - - HDassert( indicies[j] == j ); /* see comment above */ - free_entries[j] = FALSE; - expected_num_entries++; - - if ( j > expected_max_idx ) { - - expected_max_idx = j; - } - - verify_mdjsc_table_config(cache_ptr, expected_table_len, - expected_num_entries, expected_max_idx, - free_entries); - } - - HDassert( j == (H5C2__MIN_MDJSC_CB_TBL_LEN / 2) + 1 ); - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - - /* 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; - i++ ) - { - if ( ( ! free_entries[i] ) && - ( (i % H5C2__MIN_MDJSC_CB_TBL_LEN) != 0 ) ) - { - deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[i]); - - indicies[i] = -1; - free_entries[i] = TRUE; - expected_num_entries--; - - if ( i == expected_max_idx ) - { - expected_max_idx = -1; - } - - verify_mdjsc_table_config(cache_ptr, expected_table_len, - expected_num_entries, expected_max_idx, - free_entries); - } - } - - if ( show_progress ) { - - 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 - * slots freed by the dergistrations in 17) above. - */ - - /* 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) + - * (H5C2__MIN_MDJSC_CB_TBL_LEN / 2). - */ - - j = (7 * H5C2__MIN_MDJSC_CB_TBL_LEN) + (H5C2__MIN_MDJSC_CB_TBL_LEN / 2); - - register_mdjsc_callback(file_ptr, cache_ptr, test_mdjsc_callback, - &(counters[j]), &(indicies[j])); - - HDassert( indicies[j] == j ); /* see comment above */ - free_entries[j] = FALSE; - expected_num_entries++; - - if ( j > expected_max_idx ) { - - expected_max_idx = j; - } - - verify_mdjsc_table_config(cache_ptr, expected_table_len, - expected_num_entries, expected_max_idx, - free_entries); - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - - /* 19) Starting with the highest index, deregister all callbacks. - * Verify that the table shrinks as expected. - */ - - for ( i = (8 * H5C2__MIN_MDJSC_CB_TBL_LEN); i >= 0; i-- ) - { - if ( ( pass2 ) && ( ! free_entries[i] ) ) - { - deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[i]); - - indicies[i] = -1; - free_entries[i] = TRUE; - expected_num_entries--; - - if ( i == expected_max_idx ) - { - double fraction_in_use; - - while ( ( expected_max_idx >= 0 ) && - ( free_entries[expected_max_idx] ) ) - { - expected_max_idx--; - } - - fraction_in_use = ((double)expected_num_entries) / - ((double)expected_table_len); - - - if ( ( expected_max_idx < (expected_table_len / 2) ) - && - ( fraction_in_use < H5C2__MDJSC_CB_TBL_MIN_ACTIVE_RATIO ) - && - ( (expected_table_len / 2) >= H5C2__MIN_MDJSC_CB_TBL_LEN ) - ) - { - expected_table_len /= 2; - } - } - - verify_mdjsc_table_config(cache_ptr, expected_table_len, - expected_num_entries, expected_max_idx, - free_entries); - } - } - - if ( show_progress ) { - - 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, - * verify that the table is configured as expected. - */ - - /* register half the maximum number of callbacks in this test */ - - for ( i = 0; i < (max_callbacks / 2); i++ ) - { - register_mdjsc_callback(file_ptr, cache_ptr, test_mdjsc_callback, - &(counters[i]), &(indicies[i])); - - HDassert( indicies[i] == i ); - - free_entries[i] = FALSE; - expected_num_entries++; - expected_max_idx++; - - if ( expected_num_entries > expected_table_len ) { - - expected_table_len *= 2; - } - - verify_mdjsc_table_config(cache_ptr, expected_table_len, - expected_num_entries, expected_max_idx, - free_entries); - } - - HDassert( expected_table_len == (max_callbacks / 2) ); - HDassert( expected_max_idx == ((max_callbacks / 2) - 1) ); - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - - /* 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-- ) - { - if ( ( pass2 ) && ( ! free_entries[i] ) && ( (i % 2) == 1 ) ) - { - deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[i]); - - indicies[i] = -1; - free_entries[i] = TRUE; - expected_num_entries--; - - if ( i == expected_max_idx ) - { - double fraction_in_use; - - while ( ( expected_max_idx >= 0 ) && - ( free_entries[expected_max_idx] ) ) - { - expected_max_idx--; - } - - fraction_in_use = ((double)expected_num_entries) / - ((double)expected_table_len); - - - if ( ( expected_max_idx < (expected_table_len / 2) ) - && - ( fraction_in_use < H5C2__MDJSC_CB_TBL_MIN_ACTIVE_RATIO ) - && - ( (expected_table_len / 2) >= H5C2__MIN_MDJSC_CB_TBL_LEN ) - ) - { - expected_table_len /= 2; - } - } - - verify_mdjsc_table_config(cache_ptr, expected_table_len, - expected_num_entries, expected_max_idx, - free_entries); - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - /* 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 - * 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 ) ) - { - register_mdjsc_callback(file_ptr, cache_ptr, test_mdjsc_callback, - &(counters[i]), &(indicies[i])); - - HDassert( indicies[i] == i ); - - free_entries[i] = FALSE; - expected_num_entries++; - - if ( i > expected_max_idx ) { - - expected_max_idx = i; - } - - if ( expected_num_entries > expected_table_len ) { - - expected_table_len *= 2; - } - - verify_mdjsc_table_config(cache_ptr, expected_table_len, - expected_num_entries, expected_max_idx, - free_entries); - } - } - - HDassert( expected_num_entries == (max_callbacks / 2) ); - HDassert( expected_max_idx == ((max_callbacks / 2) - 1) ); - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - /* now register more entries up to max_callbacks */ - - for ( i = (max_callbacks / 2); i < max_callbacks; i++ ) - { - if ( ( pass2 ) && ( free_entries[i] ) ) - { - register_mdjsc_callback(file_ptr, cache_ptr, test_mdjsc_callback, - &(counters[i]), &(indicies[i])); - - HDassert( indicies[i] == i ); - - free_entries[i] = FALSE; - expected_num_entries++; - - if ( i > expected_max_idx ) { - - expected_max_idx = i; - } - - if ( expected_num_entries > expected_table_len ) { - - expected_table_len *= 2; - } - - verify_mdjsc_table_config(cache_ptr, expected_table_len, - expected_num_entries, expected_max_idx, - free_entries); - } - } - - HDassert( expected_num_entries == max_callbacks ); - HDassert( expected_max_idx == (max_callbacks - 1) ); - HDassert( expected_table_len == max_callbacks ); - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - - /* deregister every other 200 callbacks on increasing index */ - for ( i = 0; i < max_callbacks; i += 200 ) - { - for ( j = i; ( ( i < j + 200 ) && ( j < max_callbacks ) ); j++ ) - { - if ( ( pass2 ) && ( ! free_entries[i] ) ) - { - deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[i]); - - indicies[i] = -1; - free_entries[i] = TRUE; - expected_num_entries--; - - if ( i == expected_max_idx ) - { - double fraction_in_use; - - while ( ( expected_max_idx >= 0 ) && - ( free_entries[expected_max_idx] ) ) - { - expected_max_idx--; - } - - fraction_in_use = ((double)expected_num_entries) / - ((double)expected_table_len); - - if ( ( expected_max_idx < (expected_table_len / 2) ) - && - ( fraction_in_use < - H5C2__MDJSC_CB_TBL_MIN_ACTIVE_RATIO ) - && - ( (expected_table_len / 2) >= - H5C2__MIN_MDJSC_CB_TBL_LEN ) - ) - { - expected_table_len /= 2; - } - } - - verify_mdjsc_table_config(cache_ptr, expected_table_len, - expected_num_entries, - expected_max_idx, - free_entries); - } - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - - /* working from the top downwards, de-register all entries with - * indicies not divisible by 3. - */ - - for ( i = max_callbacks - 1; i >= 0; i-- ) - { - if ( ( pass2 ) && ( ! free_entries[i] ) && ( (i % 3) != 0 ) ) - { - deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[i]); - - indicies[i] = -1; - free_entries[i] = TRUE; - expected_num_entries--; - - if ( i == expected_max_idx ) - { - double fraction_in_use; - - while ( ( expected_max_idx >= 0 ) && - ( free_entries[expected_max_idx] ) ) - { - expected_max_idx--; - } - - fraction_in_use = ((double)expected_num_entries) / - ((double)expected_table_len); - - while ( ( expected_max_idx < (expected_table_len / 2) ) - && - ( fraction_in_use < - H5C2__MDJSC_CB_TBL_MIN_ACTIVE_RATIO ) - && - ( (expected_table_len / 2) >= - H5C2__MIN_MDJSC_CB_TBL_LEN ) - ) - { - expected_table_len /= 2; - } - } - - verify_mdjsc_table_config(cache_ptr, expected_table_len, - expected_num_entries, - expected_max_idx, - free_entries); - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - - /* working from low index up, deregister all entries with index - * greater than (max_callbacks / 8). - */ - - for ( i = (max_callbacks / 8); i < max_callbacks; i++ ) - { - if ( ( pass2 ) && ( ! free_entries[i] ) ) - { - deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[i]); - - indicies[i] = -1; - free_entries[i] = TRUE; - expected_num_entries--; - - if ( i == expected_max_idx ) - { - double fraction_in_use; - - while ( ( expected_max_idx >= 0 ) && - ( free_entries[expected_max_idx] ) ) - { - expected_max_idx--; - } - - fraction_in_use = ((double)expected_num_entries) / - ((double)expected_table_len); - - while ( ( expected_max_idx < (expected_table_len / 2) ) - && - ( fraction_in_use < - H5C2__MDJSC_CB_TBL_MIN_ACTIVE_RATIO ) - && - ( (expected_table_len / 2) >= - H5C2__MIN_MDJSC_CB_TBL_LEN ) - ) - { - expected_table_len /= 2; - } - } - - verify_mdjsc_table_config(cache_ptr, expected_table_len, - expected_num_entries, - expected_max_idx, - free_entries); - } - } - - HDassert( expected_table_len == (max_callbacks / 8) ); - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - - /* working from the top down, deregister the remaining callbacks. */ - - for ( i = (max_callbacks / 8); i >= 0; i-- ) - { - if ( ( pass2 ) && ( ! free_entries[i] ) ) - { - deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[i]); - - indicies[i] = -1; - free_entries[i] = TRUE; - expected_num_entries--; - - if ( i == expected_max_idx ) - { - double fraction_in_use; - - while ( ( expected_max_idx >= 0 ) && - ( free_entries[expected_max_idx] ) ) - { - expected_max_idx--; - } - - fraction_in_use = ((double)expected_num_entries) / - ((double)expected_table_len); - - while ( ( expected_max_idx < (expected_table_len / 2) ) - && - ( fraction_in_use < - H5C2__MDJSC_CB_TBL_MIN_ACTIVE_RATIO ) - && - ( (expected_table_len / 2) >= - H5C2__MIN_MDJSC_CB_TBL_LEN ) - ) - { - expected_table_len /= 2; - } - } - - verify_mdjsc_table_config(cache_ptr, expected_table_len, - expected_num_entries, - expected_max_idx, - free_entries); - } - } - - HDassert( expected_table_len == H5C2__MIN_MDJSC_CB_TBL_LEN ); - HDassert( expected_num_entries == 0 ); - HDassert( expected_max_idx == -1 ); - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - - /* Close the file, and tidy up. - */ - - if ( pass2 ) { - - if ( H5Fclose(file_id) < 0 ) { - - pass2 = FALSE; - failure_mssg2 = "H5Fclose() failed."; - } - } - - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - /* delete the HDF5 file and journal file */ -#if 1 - HDremove(filename); - HDremove(journal_filename); -#endif - if ( show_progress ) { - - HDfprintf(stdout, "%s%d cp = %d done.\n", - fcn_name, (int)pass2, cp++); - HDfflush(stdout); - } - - return; - -} /* verify_mdjsc_callback_registration_deregistration() */ - - -/*************************************************************************** - * Function: check_buffer_writes - * - * Purpose: Verify the function H5C2_jb__write_to_buffer properly writes - * messages of varying sizes into the journal buffers, and - * that the journal buffers properly flush out when filled. - * - * Return: void - * - * Programmer: Mike McGreevy - * Thursday, February 21, 2008 - * - * Changes: John Mainzer -- 4/16/09 - * Updated for the addition of new parameters to - * H5C2_jb__init(). - * - **************************************************************************/ - -static void -check_buffer_writes(hbool_t use_aio) -{ - const char * fcn_name = "check_buffer_writes(): "; - char filename[512]; - int i; - herr_t result; - H5C2_jbrb_t jbrb_struct; - FILE * readback; - hbool_t show_progress = FALSE; - int32_t checkpoint = 1; - char filldata[12][100]; - int repeatnum[12]; - - if ( use_aio ) { - - TESTING("metadata buffer & file aio writes"); - - } else { - - TESTING("metadata buffer & file sio writes"); - } - - pass2 = TRUE; - - /* Initialize data to get written as tests */ - HDmemcpy(filldata[0], "abcdefghijklmn\n", 16); - HDmemcpy(filldata[1], "ABCDEFGHIJKLMNO\n", 17); - HDmemcpy(filldata[2], "AaBbCcDdEeFfGgHh\n", 18); - 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", - 48); - 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); - HDassert(HDstrlen(filldata[2]) == 17); - HDassert(HDstrlen(filldata[3]) == 31); - HDassert(HDstrlen(filldata[4]) == 32); - HDassert(HDstrlen(filldata[5]) == 33); - HDassert(HDstrlen(filldata[6]) == 47); - HDassert(HDstrlen(filldata[7]) == 48); - HDassert(HDstrlen(filldata[8]) == 49); - HDassert(HDstrlen(filldata[9]) == 95); - HDassert(HDstrlen(filldata[10]) == 96); - HDassert(HDstrlen(filldata[11]) == 97); - - /* 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, - checkpoint++, (int)pass2); - - /* setup the file name */ - if ( pass2 ) { - - if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, sizeof(filename)) - == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed"; - - } /* end if */ - - } /* end if */ - - 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 - * ignored when human_readable is TRUE. - */ - - 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 */ use_aio, - /* human readable journal */ TRUE, - /* sizeof_addr */ 8, - /* sizeof_size */ 8); - - if ( result != 0) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb_init failed, check 1"; - - } /* end if */ - - } /* end if */ - - /* generate the header message manually */ - if ( pass2 ) { - - if ( H5C2_jb__write_header_entry(&jbrb_struct) != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__write_header_entry failed"; - } - } - - 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 */ - - /* Truncate journal file */ - if ( pass2 ) { - - if ( H5C2_jb__trunc(&jbrb_struct) != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb_trunc failed"; - - } /* end if */ - - } /* end if */ - - 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 - */ - - for (i=0; i<12; 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, - 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 - */ - - /* Initialize repeat array to specify how many times to repeat each write - within the write_noflush_verify calls. */ - repeatnum[0] = 16; - repeatnum[1] = 6; - repeatnum[2] = 16; - repeatnum[3] = 16; - repeatnum[4] = 6; - repeatnum[5] = 16; - repeatnum[6] = 16; - repeatnum[7] = 6; - repeatnum[8] = 16; - repeatnum[9] = 16; - repeatnum[10] = 6; - repeatnum[11] = 16; - - for (i=0; i<12; i++) { - - write_noflush_verify(&jbrb_struct, - (int)HDstrlen(filldata[i]), - filldata[i], - readback, - repeatnum[i]); - - if ( show_progress ) - HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, - checkpoint++, (int)pass2); - - } /* end for */ - - /* close journal file pointer */ - fclose(readback); - - /* Truncate the journal file */ - if ( pass2 ) { - - if ( H5C2_jb__trunc(&jbrb_struct) != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__trunc failed"; - - } /* end if */ - - } /* end if */ - - /* take down the journal file */ - if ( pass2 ) { - - if (H5C2_jb__takedown(&jbrb_struct) != SUCCEED) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__takedown failed"; - - } /* end if */ - - } /* end if */ - - /* report pass / failure information */ - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - failures2++; - HDfprintf(stdout, "%s: failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - - } - - return; - -} /* check_buffer_writes */ - - - -/*************************************************************************** - * Function: write_flush_verify - * - * 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. - * - * Return: void - * - * Programmer: Mike McGreevy - * Thursday, February 21, 2008 - * - **************************************************************************/ -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, - data, 0, (uint64_t)0) != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__write_to_buffer failed"; - - } /* end if */ - - } /* end if */ - - if ( pass2 ) { - - if ( H5C2_jb__flush(struct_ptr) != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb_flush failed"; - - } /* end if */ - - } /* end if */ - - if ( pass2 ) { - - fgets(verify, size+10, readback); - - if (HDstrcmp(verify, data) != 0) { - - pass2 = FALSE; - failure_mssg2 = "Journal entry not written correctly"; - - } /* end if */ - - } /* end if */ - - return; - -} /* write_flush_verify */ - - - -/*************************************************************************** - * Function: write_noflush_verify - * - * Purpose: Helper function for check_buffer_writes test. Writes a - * piece of data of specified size into the journal buffer - * multiple times, without calling H5C2_jb__flush in between - * writes. After all writes are completed, H5C2_jb__flush is - * called, and the data is read back from the journal file and - * verified for correctness. - * - * Return: void - * - * Programmer: Mike McGreevy - * Thursday, February 21, 2008 - * - **************************************************************************/ -static void -write_noflush_verify(H5C2_jbrb_t * struct_ptr, - int size, - char * data, - FILE * readback, - int repeats) -{ - int i; - char verify[150]; - - for (i=0; i - * Tuesday, February 26, 2008 - * - * Changes: JRM -- 3/21/09 - * Updated test to handle the new journal creation time strings - * in which all white space is replaced with underscores. - * - * JRM -- 4/16/09 - * Updated for the addition of new parameters to - * H5C2_jb__init(). - * - **************************************************************************/ -static void -check_message_format(void) -{ - const char * fcn_name = "check_message_format(): "; - char filename[512]; - char time_buf[32]; - char verify[9][500]; - char from_journal[9][500]; - char * p; - hbool_t show_progress = FALSE; - int32_t checkpoint = 1; - int i; - herr_t result; - FILE * readback; - H5C2_jbrb_t jbrb_struct; - time_t current_date; - - TESTING("journal file message format"); - - pass2 = TRUE; - - /* setup the file name */ - if ( pass2 ) { - - if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, sizeof(filename)) - == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed"; - - } /* end if */ - - } /* end if */ - - /* Give structure its magic number */ - jbrb_struct.magic = H5C2__H5C2_JBRB_T_MAGIC; - - /* Initialize H5C2_jbrb_t structure. */ - if ( pass2 ) { - - /* Note that the sizeof_addr & sizeof_size parameters are - * ignored when human_readable is TRUE. - */ - - 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, - /* human readable journal */ TRUE, - /* sizeof_addr */ 8, - /* sizeof_size */ 8); - - if ( result != 0) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb_init failed, check 2"; - - } /* end if */ - - } /* end if */ - - 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) - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__start_transaction failed"; - - } /* end if */ - - } /* end if */ - - 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") - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__journal_entry failed"; - - } /* end if */ - - } /* end if */ - - 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") - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__journal_entry failed"; - - } /* end if */ - - } /* end if */ - - 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") - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__journal_entry failed"; - - } /* end if */ - - } /* end if */ - - 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) - != 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, - checkpoint++, (int)pass2); - - /* Start a transaction */ - if ( pass2 ) { - - 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"; - - } /* end if */ - - } /* end if */ - - 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?!") - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__journal_entry failed"; - - } /* end if */ - - } /* end if */ - - 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) - != 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, - checkpoint++, (int)pass2); - - /* Flush the journal buffers. */ - if ( pass2 ) { - - if ( H5C2_jb__flush(/* H5C2_jbrb_t */ &jbrb_struct) - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__flush failed"; - - } /* end if */ - - } /* end if */ - - if ( pass2 ) { - - current_date = time(NULL); - - /* load ascii representation of current_date into time_buf[], - * replacing white space with underscores. - */ - time_buf[31] = '\0'; /* just to be safe */ - - if ( (p = HDctime(¤t_date)) == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "HDctime() failed"; - - } else { - - /* copy the string into time_buf, replacing white space with - * underscores. - * - * Do this to make parsing the header easier. - */ - i = 0; - - while ( ( i < 31 ) && ( *p != '\0' ) ) { - - if ( isspace(*p) ) { - - time_buf[i] = '_'; - - } else { - - time_buf[i] = *p; - } - - i++; - p++; - } - - time_buf[i] = '\0'; - } - } - - if ( show_progress ) /* 10 */ - HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, - checkpoint++, (int)pass2); - - if ( pass2 ) { - - /* Fill out verify array with expected messages */ - sprintf(verify[0], "0 ver_num 1 target_file_name HDF5.file journal_magic 123 creation_date %10.10s human_readable 1\n", time_buf); - sprintf(verify[1], "1 bgn_trans 1\n"); - sprintf(verify[2], "2 trans_num 1 length 1 base_addr 0x0 body 41 \n"); - sprintf(verify[3], "2 trans_num 1 length 2 base_addr 0x1 body 41 42 \n"); - sprintf(verify[4], "2 trans_num 1 length 4 base_addr 0x3 body 43 44 45 46 \n"); - sprintf(verify[5], "3 end_trans 1\n"); - sprintf(verify[6], "1 bgn_trans 2\n"); - sprintf(verify[7], "2 trans_num 2 length 11 base_addr 0x11d body 54 65 73 74 20 44 61 74 61 3f 21 \n"); - sprintf(verify[8], "3 end_trans 2\n"); - - /* verify that messages in journal are same as expected */ - readback = fopen(filename, "r"); - for (i = 0; i < 9; i++) { - - if ( pass2) { - - fgets(from_journal[i], 300, readback); - - if ( HDstrcmp(verify[i], from_journal[i]) != 0) { - - if ( show_progress ) { - - HDfprintf(stdout, "verify[%d] = \"%s\"\n", - i, verify[i]); - HDfprintf(stdout, "from_journal[%d] = \"%s\"\n", - i, from_journal[i]); - } - - pass2 = FALSE; - failure_mssg2 = "journal file not written correctly 1"; - - } /* end if */ - - } /* end if */ - - } /* end for */ - - fclose(readback); - } - - /* Truncate the journal file */ - if ( pass2 ) { - - if ( H5C2_jb__trunc(&jbrb_struct) != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__trunc failed"; - - } /* end if */ - - } /* end if */ - - 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) - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__start_transaction failed"; - - } /* end if */ - - } /* end if */ - - 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`}") - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__journal_entry failed"; - - } /* end if */ - - } /* end if */ - - 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) - != 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, - checkpoint++, (int)pass2); - - /* Add a comment */ - if ( pass2 ) { - 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, - checkpoint++, (int)pass2); - - /* Add a comment */ - if ( pass2 ) { - 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, - checkpoint++, (int)pass2); - - /* Flush the journal buffers. */ - if ( pass2 ) { - - if ( H5C2_jb__flush(/* H5C2_jbrb_t */ &jbrb_struct) - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__flush failed"; - - } /* end if */ - - } /* end if */ - - if ( pass2 ) { - - current_date = time(NULL); - - /* load ascii representation of current_date into time_buf[], - * replacing white space with underscores. - */ - - time_buf[31] = '\0'; /* just to be safe */ - - if ( (p = HDctime(¤t_date)) == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "HDctime() failed"; - - } else { - - /* copy the string into time_buf, replacing white space with - * underscores. - * - * Do this to make parsing the header easier. - */ - i = 0; - - while ( ( i < 31 ) && ( *p != '\0' ) ) { - - if ( isspace(*p) ) { - - time_buf[i] = '_'; - - } else { - - time_buf[i] = *p; - } - - i++; - p++; - } - - time_buf[i] = '\0'; - } - } - - if ( show_progress ) /* 15 */ - HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, - checkpoint++, (int)pass2); - - if ( pass2 ) { - - /* Fill out verify array with expected messages */ - sprintf(verify[0], "0 ver_num 1 target_file_name HDF5.file journal_magic 123 creation_date %10.10s human_readable 1\n", time_buf); - sprintf(verify[1], "1 bgn_trans 3\n"); - sprintf(verify[2], "2 trans_num 3 length 6 base_addr 0x6faf body 23 31 6e 4e 60 7d \n"); - sprintf(verify[3], "3 end_trans 3\n"); - sprintf(verify[4], "C comment This is a comment!\n"); - sprintf(verify[5], "C comment This is another comment!\n"); - - /* verify that messages in journal are same as expected */ - readback = fopen(filename, "r"); - for (i = 0; i < 6; i++) { - - if ( pass2) { - - fgets(from_journal[i], 300, readback); - - if ( HDstrcmp(verify[i], from_journal[i]) != 0) { - - if ( show_progress ) { - - HDfprintf(stdout, "verify[%d] = \"%s\"\n", - i, verify[i]); - HDfprintf(stdout, "from_journal[%d] = \"%s\"\n", - i, from_journal[i]); - } - - pass2 = FALSE; - failure_mssg2 = "journal file not written correctly 2"; - - } /* end if */ - - } /* end if */ - - } /* end for */ - - fclose(readback); - } - - /* Truncate the journal file */ - if ( pass2 ) { - - if ( H5C2_jb__trunc(&jbrb_struct) != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__trunc failed"; - - } /* end if */ - - } /* end if */ - - /* take down the journal file */ - if ( pass2 ) { - - if (H5C2_jb__takedown(&jbrb_struct) != SUCCEED) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__takedown failed"; - - } /* end if */ - - } /* end if */ - - if ( show_progress ) /* 16 */ - HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, - checkpoint++, (int)pass2); - - /* report pass / failure information */ - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - failures2++; - HDfprintf(stdout, "%s: failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - - } - - return; - -} /* end check_message_format */ - - -/*************************************************************************** - * Function: check_binary_message_format - * - * 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 - * for the human readable journal messages. Unlike Mike's - * code, it also tests the eoa message. - * - * Return: void - * - * Programmer: John Mainzer - * 5/2/09 - * - * Changes: None. - * - **************************************************************************/ - -static void -check_binary_message_format(void) -{ - const char * fcn_name = "check_binary_message_format()"; - char filename[512]; - char time_buf[32]; - char * p; - hbool_t show_progress = FALSE; - int32_t checkpoint = 1; - int i; - int fd; - herr_t result; - H5C2_jbrb_t jbrb_struct; - time_t current_date; - - TESTING("binary journal file message format"); - - pass2 = TRUE; - - /* setup the file name */ - if ( pass2 ) { - - if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, sizeof(filename)) - == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed"; - - } /* end if */ - - } /* end if */ - - /* Give structure its magic number */ - jbrb_struct.magic = H5C2__H5C2_JBRB_T_MAGIC; - - /* Initialize H5C2_jbrb_t structure. */ - if ( pass2 ) { - - /* Note that the sizeof_addr & sizeof_size parameters are - * ignored when human_readable is TRUE. - */ - - 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, - /* human readable journal */ FALSE, - /* sizeof_addr */ 8, - /* sizeof_size */ 8); - - if ( result != 0) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb_init failed, check 2"; - - } /* end if */ - - } /* end if */ - - 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) - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__start_transaction failed"; - - } /* end if */ - - } /* end if */ - - 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") - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__journal_entry failed"; - - } /* end if */ - - } /* end if */ - - 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, - /* eoa */ (haddr_t)0x01020304) - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__eoa failed(1)"; - - } /* end if */ - - } /* end if */ - - 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") - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__journal_entry failed"; - - } /* end if */ - - } /* end if */ - - 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") - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__journal_entry failed"; - - } /* end if */ - - } /* end if */ - - 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) - != 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, - checkpoint++, (int)pass2); - - /* Write an eoa message */ - if ( pass2 ) { - - if ( H5C2_jb__eoa(/* H5C2_jbrb_t */ &jbrb_struct, - /* eoa */ (haddr_t)0x0102030405) - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__eoa failed(2)"; - - } /* end if */ - - } /* end if */ - - 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) - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__start_transaction failed"; - - } /* end if */ - - } /* end if */ - - 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?!") - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__journal_entry failed"; - - } /* end if */ - - } /* end if */ - - 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) - != 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, - checkpoint++, (int)pass2); - - /* Flush the journal buffers. */ - if ( pass2 ) { - - if ( H5C2_jb__flush(/* H5C2_jbrb_t */ &jbrb_struct) - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__flush failed"; - - } /* end if */ - - } /* end if */ - - if ( pass2 ) { - - current_date = time(NULL); - - /* load ascii representation of current_date into time_buf[], - * replacing white space with underscores. - */ - time_buf[31] = '\0'; /* just to be safe */ - - if ( (p = HDctime(¤t_date)) == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "HDctime() failed"; - - } else { - - /* copy the string into time_buf, replacing white space with - * underscores. - * - * Do this to make parsing the header easier. - */ - i = 0; - - while ( ( i < 31 ) && ( *p != '\0' ) ) { - - if ( isspace(*p) ) { - - time_buf[i] = '_'; - - } else { - - time_buf[i] = *p; - } - - i++; - p++; - } - - time_buf[i] = '\0'; - } - } - - if ( show_progress ) /* 12 */ - HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, - checkpoint++, (int)pass2); - - if ( pass2 ) { - - char expected_header[256]; - int expected_header_len; - - uint8_t expected_msg_1[] = - { - /* mssg 1: begin transaction 1 */ - /* header: */ 'b', 't', 'r', 'n', - /* version: */ 0x00, - /* trans num: */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }; - int expected_msg_1_len = 13; - - uint8_t expected_msg_2[] = - { - /* mssg 2: journal entry */ - /* header: */ 'j', 'e', 'n', 't', - /* 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, - /* body: */ 'A', - /* chksum: */ 0x7c, 0x5f, 0xad, 0xda - }; - int expected_msg_2_len = 34; - - uint8_t expected_msg_3[] = - { - /* mssg 3: eoas */ - /* header: */ 'e', 'o', 'a', 's', - /* version: */ 0x00, - /* trans num: */ 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00 - }; - int expected_msg_3_len = 13; - - uint8_t expected_msg_4[] = - { - /* mssg 4: journal entry */ - /* header: */ 'j', 'e', 'n', 't', - /* 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, - /* body: */ 'A', 'B', - /* chksum: */ 0x33, 0x93, 0x98, 0x21 - }; - int expected_msg_4_len = 35; - - uint8_t expected_msg_5[] = - { - /* mssg 5: journal entry */ - /* header: */ 'j', 'e', 'n', 't', - /* 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, - /* body: */ 'C', 'D', 'E', 'F', - /* chksum: */ 0x6e, 0x7d, 0xaf, 0x57 - }; - int expected_msg_5_len = 37; - - uint8_t expected_msg_6[] = - { - /* mssg 6: end transaction 1 */ - /* header: */ 'e', 't', 'r', 'n', - /* version: */ 0x00, - /* trans num: */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }; - int expected_msg_6_len = 13; - - uint8_t expected_msg_7[] = - { - /* mssg 7: eoas */ - /* header: */ 'e', 'o', 'a', 's', - /* version: */ 0x00, - /* trans num: */ 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00 - }; - int expected_msg_7_len = 13; - - uint8_t expected_msg_8[] = - { - /* mssg 8: begin transaction 2 */ - /* header: */ 'b', 't', 'r', 'n', - /* version: */ 0x00, - /* trans num: */ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }; - int expected_msg_8_len = 13; - - uint8_t expected_msg_9[] = - { - /* mssg 9: journal entry */ - /* h9ader: */ 'j', 'e', 'n', 't', - /* 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', - 'a', '?', '!', - /* chksum: */ 0x01, 0x7f, 0xf3, 0x43 - }; - int expected_msg_9_len = 44; - - uint8_t expected_msg_10[] = - { - /* mssg 10: end transaction 2 */ - /* 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); - - if ( (fd = HDopen(filename, O_RDONLY, 0777)) == -1 ) { - - 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, - /* expected msg len */ expected_header_len, - /* last_msg */ FALSE, - /* mismatch failure msg */ "expected and actual headers differ.", - /* read failure msg */ "error reading header.", - /* eof failure msg */ "encountered eof in header msg.", - /* not last msg failure */ NULL); - - verify_journal_msg( - /* 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.", - /* read failure msg */ "error reading msg 1.", - /* eof failure msg */ "encountered eof in msg 1.", - /* not last msg failure */ NULL); - - verify_journal_msg( - /* 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.", - /* read failure msg */ "error reading msg 2.", - /* eof failure msg */ "encountered eof in msg 2", - /* not last msg failure */ NULL); - - verify_journal_msg( - /* 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.", - /* read failure msg */ "error reading msg 3.", - /* eof failure msg */ "encountered eof in msg 3", - /* not last msg failure */ NULL); - - verify_journal_msg( - /* 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.", - /* read failure msg */ "error reading msg 4.", - /* eof failure msg */ "encountered eof in msg 4", - /* not last msg failure */ NULL); - - verify_journal_msg( - /* 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.", - /* read failure msg */ "error reading msg 5.", - /* eof failure msg */ "encountered eof in msg 5", - /* not last msg failure */ NULL); - - verify_journal_msg( - /* 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.", - /* read failure msg */ "error reading msg 6.", - /* eof failure msg */ "encountered eof in msg 6", - /* not last msg failure */ NULL); - - verify_journal_msg( - /* 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.", - /* read failure msg */ "error reading msg 7.", - /* eof failure msg */ "encountered eof in msg 7", - /* not last msg failure */ NULL); - - verify_journal_msg( - /* 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.", - /* read failure msg */ "error reading msg 8.", - /* eof failure msg */ "encountered eof in msg 8", - /* not last msg failure */ NULL); - - verify_journal_msg( - /* 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.", - /* read failure msg */ "error reading msg 9.", - /* eof failure msg */ "encountered eof in msg 9", - /* not last msg failure */ NULL); - - verify_journal_msg( - /* 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.", - /* read failure msg */ "error reading msg 10.", - /* eof failure msg */ "encountered eof in msg 10", - /* not last msg failure */ "msg 10 does not end file"); - - if ( HDclose(fd) != 0 ) { - - pass2 = FALSE; - failure_mssg2 = "Unable to close journal file (1)."; - } - } - } - - /* Truncate the journal file */ - if ( pass2 ) { - - if ( H5C2_jb__trunc(&jbrb_struct) != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__trunc failed"; - - } /* end if */ - - } /* end if */ - - 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, - /* eoa */ (haddr_t)0x010203040506) - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__eoa failed(3)"; - - } /* end if */ - - } /* end if */ - - 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) - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__start_transaction failed"; - - } /* end if */ - - } /* end if */ - - 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, - /* data */ (const uint8_t *)"#1nN`}" ) - != 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, - checkpoint++, (int)pass2); - - /* End transaction */ - if ( pass2 ) { - 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, - checkpoint++, (int)pass2); - - /* Add a comment */ - if ( pass2 ) { - 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, - checkpoint++, (int)pass2); - - /* Add a comment */ - if ( pass2 ) { - 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, - checkpoint++, (int)pass2); - - /* Flush the journal buffers. */ - if ( pass2 ) { - - if ( H5C2_jb__flush(/* H5C2_jbrb_t */ &jbrb_struct) - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__flush failed"; - - } /* end if */ - - } /* end if */ - - if ( pass2 ) { - - current_date = time(NULL); - - /* load ascii representation of current_date into time_buf[], - * replacing white space with underscores. - */ - - time_buf[31] = '\0'; /* just to be safe */ - - if ( (p = HDctime(¤t_date)) == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "HDctime() failed"; - - } else { - - /* copy the string into time_buf, replacing white space with - * underscores. - * - * Do this to make parsing the header easier. - */ - i = 0; - - while ( ( i < 31 ) && ( *p != '\0' ) ) { - - if ( isspace(*p) ) { - - time_buf[i] = '_'; - - } else { - - time_buf[i] = *p; - } - - i++; - p++; - } - - time_buf[i] = '\0'; - } - } - - if ( show_progress ) /* 20 */ - HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, - checkpoint++, (int)pass2); - - if ( pass2 ) { - - char expected_header[256]; - int expected_header_len; - - uint8_t expected_msg_11[] = - { - /* mssg 11: eoas */ - /* header: */ 'e', 'o', 'a', 's', - /* version: */ 0x00, - /* trans num: */ 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00 - }; - int expected_msg_11_len = 13; - - - uint8_t expected_msg_12[] = - { - /* mssg 12: begin transaction 3 */ - /* header: */ 'b', 't', 'r', 'n', - /* version: */ 0x00, - /* trans num: */ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }; - int expected_msg_12_len = 13; - - uint8_t expected_msg_13[] = - { - /* mssg 13: journal entry */ - /* header: */ 'j', 'e', 'n', 't', - /* 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, - /* body: */ '#', '1', 'n', 'N', '`', '}', - /* chksum: */ 0x6b, 0x60, 0x0d, 0x6d - }; - int expected_msg_13_len = 39; - - uint8_t expected_msg_14[] = - { - /* mssg 14: end transaction 1 */ - /* 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); - - if ( (fd = HDopen(filename, O_RDONLY, 0777)) == -1 ) { - - 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, - /* expected msg len */ expected_header_len, - /* last_msg */ FALSE, - /* mismatch failure msg */ "expected and actual headers differ.", - /* read failure msg */ "error reading header.", - /* eof failure msg */ "encountered eof in header msg.", - /* not last msg failure */ NULL); - - verify_journal_msg( - /* 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.", - /* read failure msg */ "error reading msg 11.", - /* eof failure msg */ "encountered eof in msg 11.", - /* not last msg failure */ NULL); - - verify_journal_msg( - /* 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.", - /* read failure msg */ "error reading msg 12.", - /* eof failure msg */ "encountered eof in msg 12", - /* not last msg failure */ NULL); - - verify_journal_msg( - /* 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.", - /* read failure msg */ "error reading msg 13.", - /* eof failure msg */ "encountered eof in msg 13", - /* not last msg failure */ NULL); - - verify_journal_msg( - /* 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.", - /* read failure msg */ "error reading msg 14.", - /* eof failure msg */ "encountered eof in msg 14", - /* not last msg failure */ "msg 14 does not end file"); - - - if ( HDclose(fd) != 0 ) { - - pass2 = FALSE; - failure_mssg2 = "Unable to close journal file (1)."; - } - } - } - - /* Truncate the journal file */ - if ( pass2 ) { - - if ( H5C2_jb__trunc(&jbrb_struct) != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__trunc failed"; - - } /* end if */ - - } /* end if */ - - /* take down the journal file */ - if ( pass2 ) { - - if (H5C2_jb__takedown(&jbrb_struct) != SUCCEED) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__takedown failed"; - - } /* end if */ - - } /* end if */ - - if ( show_progress ) /* 20 */ - HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, - checkpoint++, (int)pass2); - - /* report pass / failure information */ - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - failures2++; - HDfprintf(stdout, "%s: failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - - } - - return; - -} /* check_binary_message_format() */ - - -/*************************************************************************** - * Function: verify_journal_msg - * - * 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 - * contents. If there is a mismatch, set pass2 to false - * and set the failure message as specified. - * - * Exit without any action if pass2 is false on entry. - * - * Return: void - * - * Programmer: J Mainzer - * - * Changes: None. - * - **************************************************************************/ - -static void -verify_journal_msg(int fd, - uint8_t expected_msg[], - int expected_msg_len, - hbool_t last_msg, - const char * mismatch_failure_msg, - const char * read_failure_msg, - const char * eof_failure_msg, - const char * not_last_msg_msg) -{ - const char * fcn_name = "verify_journal_msg()"; - hbool_t verbose = TRUE; - uint8_t ch; - int i = 0; - ssize_t ret_val; - - if ( pass2 ) { - - if ( ( fd < 0 ) || - ( expected_msg == NULL ) || - ( expected_msg_len <= 0 ) || - ( mismatch_failure_msg == NULL ) || - ( read_failure_msg == NULL ) || - ( eof_failure_msg == NULL ) || - ( ( last_msg) && ( not_last_msg_msg == NULL ) ) ) { - - pass2 = FALSE; - failure_mssg2 = "verify_journal_msg(): Bad params on entry."; - } - } - - while ( ( pass2 ) && ( i < expected_msg_len ) ) - { - ret_val = read(fd, (void *)(&ch), (size_t)1); - - if ( ret_val == 1 ) { - - if ( ch != expected_msg[i] ) { - - pass2 = FALSE; - failure_mssg2 = mismatch_failure_msg; - } - - } else if ( ret_val == -1 ) { - - if ( verbose ) { - - HDfprintf(stdout, "%s: read failed with errno = %d (%s).\n", - fcn_name, errno, strerror(errno)); - } - - pass2 = FALSE; - failure_mssg2 = mismatch_failure_msg; - - } else if ( ret_val == 0 ) { - - if ( verbose ) { - - HDfprintf(stdout, "%s: unexpected EOF.\n", fcn_name); - } - - pass2 = FALSE; - failure_mssg2 = eof_failure_msg; - - } else { - - if ( verbose ) { - - HDfprintf(stdout, "%s: read returned unexpected value (%d).\n", - fcn_name, (int)ret_val); - } - - pass2 = FALSE; - failure_mssg2 = "read returned unexpected value."; - - } - - i++; - - } - - if ( ( pass2 ) && ( last_msg ) ) { - - ret_val = read(fd, (void *)(&ch), (size_t)1); - - if ( ret_val != 0 ) { - - if ( verbose ) { - - HDfprintf(stdout, "%s: msg not at eof as expected.\n", fcn_name); - } - - pass2 = FALSE; - failure_mssg2 = not_last_msg_msg; - } - } - - return; - -} /* verify_journal_msg() */ - - -/*************************************************************************** - * Function: check_legal_calls - * - * Purpose: Verify that all H5C2_jb functions prevent use when appropriate. - * - * Return: void - * - * Programmer: Mike McGreevy - * Tuesday, February 26, 2008 - * - * Changes: JRM -- 4/16/09 - * Updated for the addition of new parameters to - * H5C2_jb__init(). - * - **************************************************************************/ - -static void -check_legal_calls(void) -{ - const char * fcn_name = "check_legal_calls(): "; - char filename[512]; - herr_t result; - H5C2_jbrb_t jbrb_struct; - hbool_t show_progress = FALSE; - int32_t checkpoint = 1; - - TESTING("journaling routine compatibility"); - - pass2 = TRUE; - - /* Give structure its magic number */ - jbrb_struct.magic = H5C2__H5C2_JBRB_T_MAGIC; - - /* setup the file name */ - if ( pass2 ) { - - if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, sizeof(filename)) - == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed"; - - } /* end if */ - - } /* end if */ - - 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 - * ignored when human_readable is TRUE. - */ - - 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, - /* human readable journal */ TRUE, - /* sizeof_addr */ 8, - /* sizeof_size */ 8); - - if ( result != SUCCEED) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb_init failed, check 3"; - - } /* end if */ - - } /* end if */ - - 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 - does not. */ - /* 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, - /* Transaction # */ (uint64_t)2) - == SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__start_transaction should have failed"; - - } /* end if */ - - } /* end if */ -#endif - 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 - does not. */ - if ( pass2 ) { - - 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, - checkpoint++, (int)pass2); - - /* Attempt to write a journal entry before transaction has started.. - 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, - /* Transaction # */ (uint64_t)1, - /* Base Address */ (haddr_t)123456789, - /* Length */ 16, - /* Body */ (const uint8_t *)"This should fail") - == SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__journal_entry should have failed"; - - } /* end if */ - - } /* end if */ - - 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, - /* Transaction # */ (uint64_t)1) - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__start_transaction failed"; - - } /* end if */ - - } /* end if */ - - 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 - 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, - /* Transaction # */ (uint64_t)1) - == SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__start_transaction should have failed"; - - } /* end if */ - - } /* end if */ - - 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 - journal entry has been written under this transaction. */ - if ( pass2 ) { - - 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 ) /* 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 - 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, - /* Transaction # */ (uint64_t)2, - /* Base Address */ (haddr_t)123456789, - /* Length */ 16, - /* Body */ (const uint8_t *)"This should fail") - == SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__journal_entry should have failed"; - - } /* end if */ - - } /* end if */ - - 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, - /* Transaction # */ (uint64_t)1, - /* Base Address */ (haddr_t)123456789, - /* Length */ 51, - /* Body */ (const uint8_t *)"This is the first transaction during transaction 1.") - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__journal_entry failed"; - - } /* end if */ - - } /* end if */ - - 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 - is still in progress. Ensure that it fails, and flag an error - if it does not. */ - if ( pass2 ) { - - if ( H5C2_jb__flush(/* H5C2_jbrb_t */ &jbrb_struct) - == SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__flush should have failed"; - - } /* end if */ - - } /* end if */ - - 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, - /* Transaction # */ (uint64_t)1) - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__end_transaction failed"; - - } /* end if */ - - } /* end if */ - - 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 - transaction 1 has already occurred. Ensure that it fails, and flag - an error if it does not. */ - if ( pass2 ) { - - if ( H5C2_jb__start_transaction(/* H5C2_jbrb_t */ &jbrb_struct, - /* Transaction # */ (uint64_t)1) - == SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__start_transaction should have failed"; - - } /* end if */ - - } /* end if */ - - 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, - /* Transaction # */ (uint64_t)2) - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__start_transaction failed"; - - } /* end if */ - - } /* end if */ - - 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, - /* Transaction # */ (uint64_t)2, - /* Base Address */ (haddr_t)7465, - /* Length */ 51, - /* Body */ (const uint8_t *)"This is the first transaction during transaction 2!") - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__journal_entry failed"; - - } /* end if */ - - } /* end if */ - - 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, - /* Transaction # */ (uint64_t)2, - /* 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, - checkpoint++, (int)pass2); - - /* End transaction 2. This should SUCCEED. */ - if ( pass2 ) { - - 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, - checkpoint++, (int)pass2); - - /* Attempt to truncate the journal file. 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__trunc(/* H5C2_jbrb_t */ &jbrb_struct) - == SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__trunc should have failed"; - - } /* end if */ - - } /* end if */ - - 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 - 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) - == SUCCEED) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__takedown should have failed"; - - } /* end if */ - - } /* end if */ - - 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) - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__flush failed"; - - } /* end if */ - - } /* end if */ - - 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 - 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) - == SUCCEED) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__takedown should have failed"; - - } /* end if */ - - } /* end if */ - - 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) - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__trunc failed"; - - } /* end if */ - - } /* end if */ - - 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) - != 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, - checkpoint++, (int)pass2); - - /* report pass / failure information */ - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - failures2++; - HDfprintf(stdout, "%s: failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - - } - - return; - -} /* end check_legal_calls */ - - - -/*************************************************************************** - * Function: check_transaction_tracking - * - * Purpose: Verify that the ring buffer successfully tracks when - * transactions make it to disk. - * - * Return: void - * - * Programmer: Mike McGreevy - * Tuesday, February 26, 2008 - * - * Changes: JRM -- 4/16/09 - * Updated for the addition of new parameters to - * H5C2_jb__init(). - * - **************************************************************************/ -static void -check_transaction_tracking(hbool_t use_aio) -{ - const char * fcn_name = "check_transaction_tracking(): "; - char filename[512]; - int i; - herr_t result; - H5C2_jbrb_t jbrb_struct; - hbool_t show_progress = FALSE; - int32_t checkpoint = 1; - int expected_tval[12]; - - if ( use_aio ) { - - TESTING("aio journal file transaction tracking"); - - } else { - - TESTING("sio journal file transaction tracking"); - } - - pass2 = TRUE; - - /* setup the file name */ - if ( pass2 ) { - - if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, sizeof(filename)) - == NULL ) { - - pass2 = FALSE; - failure_mssg2 = "h5_fixname() failed"; - - } /* end if */ - - } /* end if */ - - if ( show_progress ) /* 1 */ - HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, - checkpoint++, (int)pass2); - - /* Give structure its magic number */ - jbrb_struct.magic = H5C2__H5C2_JBRB_T_MAGIC; - - /* =================================================== - * First ring buffer configuration. - * 4 Buffers, each size 250. - * Writing transactions of size 100. - * 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 - * of the ring buffer. - * =================================================== */ - - /* Initialize H5C2_jbrb_t structure. */ - if ( pass2 ) { - - /* Note that the sizeof_addr & sizeof_size parameters are - * ignored when human_readable is TRUE. - */ - - 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 */ use_aio, - /* human readable journal */ TRUE, - /* sizeof_addr */ 8, - /* sizeof_size */ 8); - - if ( result != SUCCEED) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb_init failed, check 4"; - - } /* end if */ - - } /* end if */ - - - /* H5C2_jb__init() no longer generates the header message -- instead - * 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. - */ - if ( pass2 ) { - - if ( H5C2_jb__write_header_entry(&jbrb_struct) != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__write_header_entry failed"; - } - } - - - 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) - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__flush failed"; - - } /* end if */ - - } /* end if */ - - 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 - disk are accurately reported after each write. The following test the - case where multiple journal entries reside in each buffer before a flush - occurs. Also, the case when a transaction ends on a buffer boundary - 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; - expected_tval[4] = 2; - expected_tval[5] = 5; - expected_tval[6] = 5; - expected_tval[7] = 5; - expected_tval[8] = 7; - expected_tval[9] = 7; - expected_tval[10] = 10; - - /* write 20 messages and verify that expected values are as indicated in - the expected_tval array */ - for (i = 1; i < 11; 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, - checkpoint++, (int)pass2); - - /* Flush the journal buffers. */ - if ( pass2 ) { - - if ( H5C2_jb__flush(/* H5C2_jbrb_t */ &jbrb_struct) - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__flush failed"; - - } /* end if */ - - } /* end if */ - - /* Truncate the journal file. */ - if ( pass2 ) { - - if ( H5C2_jb__trunc(/* H5C2_jbrb_t */ &jbrb_struct) - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__trunc failed"; - - } /* end if */ - - } /* end if */ - - /* Take down the journal file. */ - if ( pass2 ) { - - 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 ) /* 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: - * - end transaction messages appear on buffer - * boundaries. - * =================================================== */ - - /* Initialize H5C2_jbrb_t structure. */ - if ( pass2 ) { - - /* Note that the sizeof_addr & sizeof_size parameters are - * ignored when human_readable is TRUE. - */ - - 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, - /* human readable journal */ TRUE, - /* sizeof_addr */ 8, - /* sizeof_size */ 8); - - if ( result != SUCCEED) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb_init failed, check 5"; - - } /* end if */ - - } /* end if */ - - /* generate the header message manually */ - if ( pass2 ) { - - if ( H5C2_jb__write_header_entry(&jbrb_struct) != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__write_header_entry failed"; - } - } - - /* Flush the journal buffers. */ - if ( pass2 ) { - - if ( H5C2_jb__flush(/* H5C2_jbrb_t */ &jbrb_struct) - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__flush failed"; - - } /* end if */ - - } /* end if */ - - 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 - ring buffer. */ - for (i=1; i<20; 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, - checkpoint++, (int)pass2); - - /* Flush the journal buffers. */ - if ( pass2 ) { - - if ( H5C2_jb__flush(/* H5C2_jbrb_t */ &jbrb_struct) - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__flush failed"; - - } /* end if */ - - } /* end if */ - - /* Truncate the journal file. */ - if ( pass2 ) { - - if ( H5C2_jb__trunc(/* H5C2_jbrb_t */ &jbrb_struct) - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__trunc failed"; - - } /* end if */ - - } /* end if */ - - /* Take down the journal file. */ - if ( pass2 ) { - - if (H5C2_jb__takedown(/* H5C2_jbrb_t */ &jbrb_struct) - != SUCCEED) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__takedown failed"; - - } /* end if */ - - } /* end if */ - - /* =================================================== - * Third ring buffer configuration - * 10 Buffers, each size 30. - * Writing transactions of size 100. - * Test cases: - * - end transaction messages start in one buffer - * and end in the following buffer. - * - end transaction messages start in the last - * buffer and loop around to the first buffer. - * - multiple buffers are filled between end - * transaction messages. - * =================================================== */ - - /* Initialize H5C2_jbrb_t structure. */ - if ( pass2 ) { - - /* Note that the sizeof_addr & sizeof_size parameters are - * ignored when human_readable is TRUE. - */ - - 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, - /* human readable journal */ TRUE, - /* sizeof_addr */ 8, - /* sizeof_size */ 8); - - if ( result != SUCCEED) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb_init failed, check 6"; - - } /* end if */ - - } /* end if */ - - /* generate the header message manually */ - if ( pass2 ) { - - if ( H5C2_jb__write_header_entry(&jbrb_struct) != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__write_header_entry failed"; - } - } - - - 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) - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__flush failed"; - - } /* end if */ - - } /* end if */ - - 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 - disk are accurately reported after each write. The following tests the - 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, - (uint64_t)0, - (uint64_t)0); /* 1 in bufs, 0 on disk */ - 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, - (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, - (uint64_t)3, - (uint64_t)3); /* 1 in bufs, 0 on disk */ - 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, - (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, - (uint64_t)5, - (uint64_t)7); /* 1 in bufs, 0 on disk */ - 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, - (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, - (uint64_t)8, - (uint64_t)9); /* 1 in bufs, 0 on disk */ - 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, - (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, - checkpoint++, (int)pass2); - - /* Flush the journal buffers. */ - if ( pass2 ) { - - if ( H5C2_jb__flush(/* H5C2_jbrb_t */ &jbrb_struct) - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__flush failed"; - - } /* end if */ - - } /* end if */ - - /* Truncate the journal file. */ - if ( pass2 ) { - - if ( H5C2_jb__trunc(/* H5C2_jbrb_t */ &jbrb_struct) - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__trunc failed"; - - } /* end if */ - - } /* end if */ - - /* Take down the journal file. */ - if ( pass2 ) { - - if (H5C2_jb__takedown(/* H5C2_jbrb_t */ &jbrb_struct) - != SUCCEED) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__takedown failed"; - - } /* end if */ - - } /* end if */ - - /* =================================================== - * Fourth ring buffer configuration - * 35 Buffers, each size 1. - * Writing transactions of size 100. - * 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 - * transaction message. - * =================================================== */ - - /* Initialize H5C2_jbrb_t structure. */ - if ( pass2 ) { - - /* Note that the sizeof_addr & sizeof_size parameters are - * ignored when human_readable is TRUE. - */ - - 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, - /* human readable journal */ TRUE, - /* sizeof_addr */ 8, - /* sizeof_size */ 8); - - if ( result != SUCCEED) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb_init failed, check 7"; - - } /* end if */ - - } /* end if */ - - /* generate the header message manually */ - if ( pass2 ) { - - if ( H5C2_jb__write_header_entry(&jbrb_struct) != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__write_header_entry failed"; - } - } - - - /* Flush the journal buffers. */ - if ( pass2 ) { - - if ( H5C2_jb__flush(/* H5C2_jbrb_t */ &jbrb_struct) - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__flush failed"; - - } /* end if */ - - } /* end if */ - - 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 - disk are accurately reported after each write. The following tests the - case where end transaction messages take up several journal buffers, and - 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, - /* 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, - checkpoint++, (int)pass2); - - /* Flush the journal buffers. */ - if ( pass2 ) { - - if ( H5C2_jb__flush(/* H5C2_jbrb_t */ &jbrb_struct) - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__flush failed"; - - } /* end if */ - - } /* end if */ - - /* Truncate the journal file. */ - if ( pass2 ) { - - if ( H5C2_jb__trunc(/* H5C2_jbrb_t */ &jbrb_struct) - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__trunc failed"; - - } /* end if */ - - } /* end if */ - - /* Take down the journal file. */ - if ( pass2 ) { - - 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 ) /* 13 */ - HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, - checkpoint++, (int)pass2); - - /* report pass / failure information */ - if ( pass2 ) { PASSED(); } else { H5_FAILED(); } - - if ( ! pass2 ) { - - failures2++; - HDfprintf(stdout, "%s: failure_mssg2 = \"%s\".\n", - fcn_name, failure_mssg2); - - } - - return; - -} /* end check_transaction_tracking */ - - - -/*************************************************************************** - * Function: write_verify_trans_num - * - * 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. - * - * Return: void - * - * Programmer: Mike McGreevy - * 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, - 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 - * by three (two hex characters and a space). - */ - if ( pass2 ) { - - if ( H5C2_jb__start_transaction(/* H5C2_jbrb_t */ struct_ptr, - /* trans number */ trans_num) - != SUCCEED) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__start_transaction failed"; - - } /* end if */ - - - if (trans_num < 10) { - - if ( H5C2_jb__journal_entry(/* H5C2_jbrb_t */ struct_ptr, - /* Transaction # */ trans_num, - /* Base Address */ (haddr_t)16, - /* Length */ 9, - /* Body */ (const uint8_t *)"XXXXXXXXX") - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__journal_entry failed"; - - } /* end if */ - - } /* end if */ - - else if (trans_num < 100) { - - if ( H5C2_jb__journal_entry(/* H5C2_jbrb_t */ struct_ptr, - /* Transaction # */ trans_num, - /* Base Address */ (haddr_t)16, - /* Length */ 8, - /* Body */ (const uint8_t *)"XXXXXXXX") - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__journal_entry failed"; - - } /* end if */ - - } /* end else if */ - - else { - - if ( H5C2_jb__journal_entry(/* H5C2_jbrb_t */ struct_ptr, - /* Transaction # */ trans_num, - /* Base Address */ (haddr_t)16, - /* Length */ 7, - /* Body */ (const uint8_t *)"XXXXXXX") - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__journal_entry failed"; - - } /* end if */ - - } /* end else */ - - if ( H5C2_jb__end_transaction(/* H5C2_jbrb_t */ struct_ptr, - /* Transaction # */ trans_num) - != SUCCEED ) { - - pass2 = FALSE; - failure_mssg2 = "H5C2_jb__end_transaction failed"; - - } /* end if */ - - } /* end if */ - - /* Make sure the last transaction that's on disk is as expected. */ - if ( pass2 ) { - - 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(1)"; - - } /* end if */ - - if ( struct_ptr->use_aio_fsync ) { - - if ( ( trans_verify < min_verify_val ) || - ( verify_val < trans_verify ) ) { - - 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; - -} /* end write_verify_trans_num */ - - -/*------------------------------------------------------------------------- - * Function: main - * - * Purpose: Run tests on the cache code contained in H5C2.c - * - * Return: Success: - * - * Failure: - * - * Programmer: John Mainzer - * 6/24/04 - * - * Modifications: - * - *------------------------------------------------------------------------- - */ - -int -main(void) -{ - int express_test; - - failures2 = 0; - - H5open(); - - express_test = GetTestExpress(); - - if ( express_test2 >= 3 ) { - - skip_long_tests2 = TRUE; - - } else { - - 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 - - - /* SIO Binary readable smoke checks */ -#if 1 - mdj_smoke_check_00(FALSE, FALSE); -#endif -#if 1 - mdj_smoke_check_01(FALSE, FALSE); -#endif -#if 1 - mdj_smoke_check_02(FALSE, FALSE); -#endif -#if 1 - 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 - - - /* AIO Binary readable smoke checks */ -#if 1 - mdj_smoke_check_00(FALSE, TRUE); -#endif -#if 1 - mdj_smoke_check_01(FALSE, TRUE); -#endif -#if 1 - mdj_smoke_check_02(FALSE, TRUE); -#endif -#if 1 - mdj_api_example_test(FALSE, TRUE, 32, (16 * 1024)); -#endif - - - /* targeted tests */ -#if 1 - check_buffer_writes(FALSE); -#endif -#if 1 - check_buffer_writes(TRUE); -#endif -#if 1 - check_legal_calls(); -#endif -#if 1 - check_message_format(); -#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 -#if 1 - check_mdjsc_callbacks(); -#endif - - return(failures2); - -} /* main() */ - diff --git a/test/cache_api.c b/test/cache_api.c new file mode 100644 index 0000000..3a7a56d --- /dev/null +++ b/test/cache_api.c @@ -0,0 +1,3633 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * Copyright by the Board of Trustees of the University of Illinois. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* Programmer: John Mainzer + * 11/10/05 + * + * This file contains tests for the API calls associated + * with the cache implemented in H5C.c + */ + +#include +#include "h5test.h" +#include "H5Iprivate.h" +#include "H5ACprivate.h" +#include "cache_common.h" + + +/* global variable declarations: */ + +extern const char *FILENAME[]; + +/* macro definitions */ + +/* private function declarations: */ + +static unsigned check_fapl_mdc_api_calls(void); + +static unsigned check_file_mdc_api_calls(void); + +static unsigned mdc_api_call_smoke_check(void); + +static unsigned check_fapl_mdc_api_errs(void); + +static unsigned check_file_mdc_api_errs(void); + + +/**************************************************************************/ +/**************************************************************************/ +/********************************* tests: *********************************/ +/**************************************************************************/ +/**************************************************************************/ + +/*------------------------------------------------------------------------- + * Function: check_fapl_mdc_api_calls() + * + * Purpose: Verify that the file access property list related + * metadata cache related API calls are functioning + * correctly. + * + * Since we have tested the H5C code elsewhere, it should + * be sufficient to verify that the desired configuration + * data is getting to the cache. + * + * Return: void + * + * Programmer: John Mainzer + * 4/12/04 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +static unsigned +check_fapl_mdc_api_calls(void) +{ + const char * fcn_name = "check_fapl_mdc_api_calls()"; + char filename[512]; + hbool_t show_progress = FALSE; + int cp = 0; + herr_t result; + hid_t fapl_id = -1; + hid_t test_fapl_id = -1; + hid_t file_id = -1; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + H5AC_cache_config_t default_config = H5AC__DEFAULT_CACHE_CONFIG; + H5AC_cache_config_t mod_config = + { + /* int version = */ H5AC__CURR_CACHE_CONFIG_VERSION, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024 + 1), + /* double min_clean_fraction = */ 0.2, + /* size_t max_size = */ (16 * 1024 * 1024 + 1), + /* size_t min_size = */ ( 1 * 1024 * 1024 + 1), + /* long int epoch_length = */ 50001, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 0.91, + /* double increment = */ 2.1, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024 + 1), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out, + /* double upper_hr_threshold = */ 0.998, + /* double decrement = */ 0.91, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024 - 1), + /* int epochs_before_eviction = */ 4, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.05, + /* int dirty_bytes_threshold = */ (256 * 1024) + }; + H5AC_cache_config_t scratch; + H5C_auto_size_ctl_t default_auto_size_ctl; + H5C_auto_size_ctl_t mod_auto_size_ctl; + + TESTING("MDC/FAPL related API calls"); + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + pass = TRUE; + + XLATE_EXT_TO_INT_MDC_CONFIG(default_auto_size_ctl, default_config) + XLATE_EXT_TO_INT_MDC_CONFIG(mod_auto_size_ctl, mod_config) + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* Create a FAPL and verify that it contains the default + * initial mdc configuration + */ + + if ( pass ) { + + fapl_id = H5Pcreate(H5P_FILE_ACCESS); + + if ( fapl_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pcreate(H5P_FILE_ACCESS) failed.\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + if ( pass ) { + + scratch.version = H5C__CURR_AUTO_SIZE_CTL_VER; + + result = H5Pget_mdc_config(fapl_id, (H5AC1_cache_config_t *)&scratch); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pget_mdc_config() failed.\n"; + + } else if (!CACHE_CONFIGS_EQUAL(default_config, scratch, TRUE, TRUE)) { + + pass = FALSE; + failure_mssg = "retrieved config doesn't match default."; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + + /* Modify the initial mdc configuration in a FAPL, and verify that + * the changes can be read back + */ + + if ( pass ) { + + result = H5Pset_mdc_config(fapl_id, (H5AC1_cache_config_t *)&mod_config); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pset_mdc_config() failed.\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + if ( pass ) { + + scratch.version = H5C__CURR_AUTO_SIZE_CTL_VER; + + result = H5Pget_mdc_config(fapl_id, (H5AC1_cache_config_t *)&scratch); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pget_mdc_config() failed.\n"; + + } else if ( ! CACHE_CONFIGS_EQUAL(mod_config, scratch, TRUE, TRUE) ) { + + pass = FALSE; + failure_mssg = "retrieved config doesn't match mod config."; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + if ( pass ) { + + if ( H5Pclose(fapl_id) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pclose() failed.\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* Open a file using the default FAPL. Verify that the resulting + * metadata cache uses the default configuration as well. Get a + * copy of the FAPL from the file, and verify that it contains the + * default initial meta data cache configuration. Close and delete + * the file. + */ + + /* setup the file name */ + if ( pass ) { + + if ( h5_fixname(FILENAME[1], H5P_DEFAULT, filename, sizeof(filename)) + == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed.\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* create the file using the default FAPL */ + if ( pass ) { + + file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + + if ( file_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fcreate() failed.\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* get a pointer to the files internal data structure */ + if ( pass ) { + + file_ptr = (H5F_t *)H5I_object_verify(file_id, H5I_FILE); + + if ( file_ptr == NULL ) { + + pass = FALSE; + failure_mssg = "Can't get file_ptr.\n"; + + } else { + + cache_ptr = file_ptr->shared->cache; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* verify that we can access the internal version of the cache config */ + if ( pass ) { + + if ( ( cache_ptr == NULL ) || + ( cache_ptr->magic != H5C__H5C_T_MAGIC ) || + ( cache_ptr->resize_ctl.version != H5C__CURR_AUTO_SIZE_CTL_VER ) ){ + + pass = FALSE; + failure_mssg = "Can't access cache resize_ctl.\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* conpare the cache's internal configuration with the expected value */ + if ( pass ) { + + if ( ! RESIZE_CONFIGS_ARE_EQUAL(default_auto_size_ctl, \ + cache_ptr->resize_ctl, TRUE) ) { + + + pass = FALSE; + failure_mssg = "Unexpected value(s) in cache resize_ctl 1.\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* get a copy of the files FAPL */ + if ( pass ) { + + fapl_id = H5Fget_access_plist(file_id); + + if ( fapl_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fget_access_plist() failed.\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* compare the initial cache config from the copy of the file's FAPL + * to the expected value. If all goes well, close the copy of the FAPL. + */ + if ( pass ) { + + scratch.version = H5C__CURR_AUTO_SIZE_CTL_VER; + + result = H5Pget_mdc_config(fapl_id, (H5AC1_cache_config_t *)&scratch); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pget_mdc_config() failed.\n"; + + } else if (!CACHE_CONFIGS_EQUAL(default_config, scratch, TRUE, TRUE)) { + + pass = FALSE; + failure_mssg = "config retrieved from file doesn't match default."; + + } else if ( H5Pclose(fapl_id) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pclose() failed.\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* close the file and delete it */ + if ( pass ) { + + if ( H5Fclose(file_id) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fclose() failed.\n"; + + } else if ( HDremove(filename) < 0 ) { + + pass = FALSE; + failure_mssg = "HDremove() failed.\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + + /* Open a file using a FAPL with a modified initial metadata cache + * configuration. Verify that the resulting metadata cache uses the + * modified configuration as well. Get a copy of the FAPL from the + * file, and verify that it contains the modified initial meta data + * cache configuration. Close and delete the file. + */ + + /* Create a FAPL */ + if ( pass ) { + + fapl_id = H5Pcreate(H5P_FILE_ACCESS); + + if ( fapl_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pcreate(H5P_FILE_ACCESS) failed.\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* Modify the initial mdc configuration in the FAPL. */ + + if ( pass ) { + + result = H5Pset_mdc_config(fapl_id, (H5AC1_cache_config_t *)&mod_config); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pset_mdc_config() failed.\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* setup the file name */ + if ( pass ) { + + if ( h5_fixname(FILENAME[1], H5P_DEFAULT, filename, sizeof(filename)) + == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed.\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* create the file using the modified FAPL */ + if ( pass ) { + + file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id); + + if ( file_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fcreate() failed.\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* get a pointer to the files internal data structure */ + if ( pass ) { + + file_ptr = (H5F_t *)H5I_object_verify(file_id, H5I_FILE); + + if ( file_ptr == NULL ) { + + pass = FALSE; + failure_mssg = "Can't get file_ptr.\n"; + + } else { + + cache_ptr = file_ptr->shared->cache; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* verify that we can access the internal version of the cache config */ + if ( pass ) { + + if ( ( cache_ptr == NULL ) || + ( cache_ptr->magic != H5C__H5C_T_MAGIC ) || + ( cache_ptr->resize_ctl.version != H5C__CURR_AUTO_SIZE_CTL_VER ) ){ + + pass = FALSE; + failure_mssg = "Can't access cache resize_ctl.\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* conpare the cache's internal configuration with the expected value */ + if ( pass ) { + + if ( ! RESIZE_CONFIGS_ARE_EQUAL(mod_auto_size_ctl, \ + cache_ptr->resize_ctl, TRUE) ) { + + + pass = FALSE; + failure_mssg = "Unexpected value(s) in cache resize_ctl 2.\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* get a copy of the files FAPL */ + if ( pass ) { + + test_fapl_id = H5Fget_access_plist(file_id); + + if ( test_fapl_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fget_access_plist() failed.\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* compare the initial cache config from the copy of the file's FAPL + * to the expected value. If all goes well, close the copy of the FAPL. + */ + if ( pass ) { + + scratch.version = H5C__CURR_AUTO_SIZE_CTL_VER; + + result = H5Pget_mdc_config(test_fapl_id, (H5AC1_cache_config_t *)&scratch); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pget_mdc_config() failed.\n"; + + } else if ( ! CACHE_CONFIGS_EQUAL(mod_config, scratch, TRUE, TRUE) ) { + + pass = FALSE; + failure_mssg = "config retrieved from file doesn't match."; + + } else if ( H5Pclose(test_fapl_id) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pclose() failed.\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* close the fapl used to create the file */ + if ( pass ) { + + if ( H5Pclose(fapl_id) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pclose() failed.\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* close the file and delete it */ + if ( pass ) { + + if ( H5Fclose(file_id) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fclose() failed.\n"; + + } else if ( HDremove(filename) < 0 ) { + + pass = FALSE; + failure_mssg = "HDremove() failed.\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) + HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + + return !pass; + +} /* check_fapl_mdc_api_calls() */ + + +/*------------------------------------------------------------------------- + * Function: check_file_mdc_api_calls() + * + * Purpose: Verify that the file related metadata cache API calls are + * functioning correctly. + * + * Since we have tested the H5C code elsewhere, it should + * be sufficient to verify that the desired configuration + * data is getting in and out of the cache. Similarly, + * we need only verify that the cache monitoring calls + * return the data that the cache thinks they should return. + * We shouldn't need to verify data correctness beyond that + * point. + * + * Return: void + * + * Programmer: John Mainzer + * 4/14/04 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +static unsigned +check_file_mdc_api_calls(void) +{ + const char * fcn_name = "check_file_mdc_api_calls()"; + char filename[512]; + hid_t file_id = -1; + size_t max_size; + size_t min_clean_size; + size_t cur_size; + int cur_num_entries; + double hit_rate; + H5AC_cache_config_t default_config = H5AC__DEFAULT_CACHE_CONFIG; + H5AC_cache_config_t mod_config_1 = + { + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024 + 1), + /* double min_clean_fraction = */ 0.2, + /* size_t max_size = */ (16 * 1024 * 1024 + 1), + /* size_t min_size = */ ( 1 * 1024 * 1024 + 1), + /* long int epoch_length = */ 50001, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 0.91, + /* double increment = */ 2.1, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024 + 1), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out, + /* double upper_hr_threshold = */ 0.998, + /* double decrement = */ 0.91, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024 - 1), + /* int epochs_before_eviction = */ 4, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.05, + /* int dirty_bytes_threshold = */ (256 * 1024) + }; + H5AC_cache_config_t mod_config_2 = + { + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ TRUE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (512 * 1024), + /* double min_clean_fraction = */ 0.1, + /* size_t max_size = */ ( 8 * 1024 * 1024), + /* size_t min_size = */ ( 512 * 1024), + /* long int epoch_length = */ 25000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (2 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__threshold, + /* double upper_hr_threshold = */ 0.9995, + /* double decrement = */ 0.95, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (512 * 1024), + /* int epochs_before_eviction = */ 4, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.05, + /* int dirty_bytes_threshold = */ (256 * 1024) + }; + H5AC_cache_config_t mod_config_3 = + { + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024), + /* double min_clean_fraction = */ 0.2, + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ ( 1 * 1024 * 1024), + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__off, + /* double lower_hr_threshold = */ 0.90, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__off, + /* double upper_hr_threshold = */ 0.999, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ FALSE, + /* size_t max_decrement = */ (1 * 1024 * 1024 - 1), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ FALSE, + /* double empty_reserve = */ 0.05, + /* int dirty_bytes_threshold = */ (256 * 1024) + }; + H5AC_cache_config_t mod_config_4 = + { + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024), + /* double min_clean_fraction = */ 0.15, + /* size_t max_size = */ (20 * 1024 * 1024), + /* size_t min_size = */ ( 1 * 1024 * 1024), + /* long int epoch_length = */ 75000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (2 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ + H5C_decr__age_out_with_threshold, + /* double upper_hr_threshold = */ 0.999, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1, + /* int dirty_bytes_threshold = */ (256 * 1024) + }; + + TESTING("MDC/FILE related API calls"); + + pass = TRUE; + + /* Open a file with the default FAPL. Verify that the cache is + * configured as per the default both by looking at its internal + * configuration, and via the H5Fget_mdc_config() call. + * + * Then set serveral different configurations, and verify that + * they took as per above. + */ + + /* setup the file name */ + if ( pass ) { + + if ( h5_fixname(FILENAME[1], H5P_DEFAULT, filename, sizeof(filename)) + == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed.\n"; + } + } + + /* create the file using the default FAPL */ + if ( pass ) { + + file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + + if ( file_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fcreate() failed.\n"; + } + } + + /* verify that the cache is set to the default config */ + validate_mdc_config(file_id, &default_config, TRUE, 1); + + /* set alternate config 1 */ + if ( pass ) { + + if ( H5Fset_mdc_config(file_id, (H5AC1_cache_config_t *)&mod_config_1) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fset_mdc_config() failed 1.\n"; + } + } + + /* verify that the cache is now set to the alternate config */ + validate_mdc_config(file_id, &mod_config_1, TRUE, 2); + + /* set alternate config 2 */ + if ( pass ) { + + if ( H5Fset_mdc_config(file_id, (H5AC1_cache_config_t *)&mod_config_2) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fset_mdc_config() failed 2.\n"; + } + } + + /* verify that the cache is now set to the alternate config */ + validate_mdc_config(file_id, &mod_config_2, TRUE, 3); + + /* set alternate config 3 */ + if ( pass ) { + + if ( H5Fset_mdc_config(file_id, (H5AC1_cache_config_t *)&mod_config_3) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fset_mdc_config() failed 3.\n"; + } + } + + /* verify that the cache is now set to the alternate config */ + validate_mdc_config(file_id, &mod_config_3, TRUE, 4); + + /* set alternate config 4 */ + if ( pass ) { + + if ( H5Fset_mdc_config(file_id, (H5AC1_cache_config_t *)&mod_config_4) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fset_mdc_config() failed 4.\n"; + } + } + + /* verify that the cache is now set to the alternate config */ + validate_mdc_config(file_id, &mod_config_4, TRUE, 5); + + + /* Run some quick smoke checks on the cache status monitoring + * calls -- no interesting data as the cache hasn't had a + * chance to do much yet. + */ + + if ( pass ) { + + if ( H5Fget_mdc_hit_rate(file_id, &hit_rate) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fget_mdc_hit_rate() failed 1.\n"; + + } else if ( hit_rate != 0.0 ) { + + pass = FALSE; + failure_mssg = + "H5Fget_mdc_hit_rate() returned unexpected hit rate.\n"; + + } +#if 0 /* this may be useful now and then -- keep it around */ + else { + + HDfprintf(stdout, + "H5Fget_mdc_hit_rate() reports hit_rate = %lf:\n", + hit_rate); + } +#endif + } + + if ( pass ) { + + if ( H5Fget_mdc_size(file_id, &max_size, &min_clean_size, + &cur_size, &cur_num_entries) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fget_mdc_size() failed 1.\n"; + + } else if ( ( mod_config_4.initial_size != max_size ) || + ( min_clean_size != (size_t) + ((double)max_size * mod_config_4.min_clean_fraction) ) ) { + + pass = FALSE; + failure_mssg = "H5Fget_mdc_size() returned unexpected value(s).\n"; + + } +#if 0 /* this may be useful now and then -- keep it around */ + else { + + HDfprintf(stdout, "H5Fget_mdc_size() reports:\n"); + HDfprintf(stdout, " max_size: %ld, min_clean_size: %ld\n", + (long)max_size, (long)min_clean_size); + HDfprintf(stdout, " cur_size: %ld, cur_num_entries: %d\n", + (long)cur_size, cur_num_entries); + } +#endif + } + + /* close the file and delete it */ + if ( pass ) { + + if ( H5Fclose(file_id) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fclose() failed.\n"; + + } else if ( HDremove(filename) < 0 ) { + + pass = FALSE; + failure_mssg = "HDremove() failed.\n"; + } + } + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) + HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + + return !pass; + +} /* check_file_mdc_api_calls() */ + + +/*------------------------------------------------------------------------- + * Function: mdc_api_call_smoke_check() + * + * Purpose: + * + * Return: void + * + * Programmer: John Mainzer + * 4/14/04 + * + * Modifications: + * + * JRM -- 7/12/06 + * Added progress reporting code. + * + *------------------------------------------------------------------------- + */ + +#define CHUNK_SIZE 2 +#define DSET_SIZE (200 * CHUNK_SIZE) +#define NUM_DSETS 6 +#define NUM_RANDOM_ACCESSES 200000 + +static unsigned +mdc_api_call_smoke_check(void) +{ + const char * fcn_name = "mdc_api_call_smoke_check()"; + char filename[512]; + hbool_t valid_chunk; + hbool_t report_progress = FALSE; + hbool_t dump_hit_rate = FALSE; + int64_t min_accesses = 1000; + double min_hit_rate = 0.90; + hbool_t dump_cache_size = FALSE; + hid_t file_id = -1; + hid_t dataspace_id = -1; + hid_t filespace_ids[NUM_DSETS]; + hid_t memspace_id = -1; + hid_t dataset_ids[NUM_DSETS]; + hid_t properties; + char dset_name[64]; + int i, j, k, l, m, n; + int progress_counter; + herr_t status; + hsize_t dims[2]; + hsize_t a_size[2]; + hsize_t offset[2]; + hsize_t chunk_size[2]; + int data_chunk[CHUNK_SIZE][CHUNK_SIZE]; + H5AC_cache_config_t default_config = H5AC__DEFAULT_CACHE_CONFIG; + H5AC_cache_config_t mod_config_1 = + { + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ 500000, + /* double min_clean_fraction = */ 0.1, + /* size_t max_size = */ 16000000, + /* size_t min_size = */ 250000, + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__off, + /* double lower_hr_threshold = */ 0.95, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ FALSE, + /* size_t max_increment = */ 4000000, + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__off, + /* double upper_hr_threshold = */ 0.999, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ FALSE, + /* size_t max_decrement = */ 1000000, + /* int epochs_before_eviction = */ 2, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.05, + /* int dirty_bytes_threshold = */ (256 * 1024) + }; + H5AC_cache_config_t mod_config_2 = + { + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ 12000000, + /* double min_clean_fraction = */ 0.1, + /* size_t max_size = */ 16000000, + /* size_t min_size = */ 250000, + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__off, + /* double lower_hr_threshold = */ 0.95, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ FALSE, + /* size_t max_increment = */ 4000000, + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__off, + /* double upper_hr_threshold = */ 0.999, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ FALSE, + /* size_t max_decrement = */ 1000000, + /* int epochs_before_eviction = */ 2, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.05, + /* int dirty_bytes_threshold = */ (256 * 1024) + }; + H5AC_cache_config_t mod_config_3 = + { + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ 2000000, + /* double min_clean_fraction = */ 0.1, + /* size_t max_size = */ 16000000, + /* size_t min_size = */ 250000, + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__off, + /* double lower_hr_threshold = */ 0.95, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ FALSE, + /* size_t max_increment = */ 4000000, + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__off, + /* double upper_hr_threshold = */ 0.999, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ FALSE, + /* size_t max_decrement = */ 1000000, + /* int epochs_before_eviction = */ 2, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.05, + /* int dirty_bytes_threshold = */ (256 * 1024) + }; + + TESTING("MDC API smoke check"); + + if ( skip_long_tests > 0 ) { + + SKIPPED(); + + HDfprintf(stdout, " Long tests disabled.\n"); + + return 0; + } + + pass = TRUE; + + /* Open a file with the default FAPL. Verify that the cache is + * configured as per the default both by looking at its internal + * configuration, and via the H5Fget_mdc_config() call. + * + * Then set the cache to mod_config_1, which fixes cache size at + * 500000 bytes, and turns off automatic cache resize. + */ + + /* setup the file name */ + + if ( ( pass ) && ( report_progress ) ) { + + HDfprintf(stdout,"\nSetting up file ... "); + HDfflush(stdout); + } + + if ( pass ) { + + if ( h5_fixname(FILENAME[1], H5P_DEFAULT, filename, sizeof(filename)) + == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed.\n"; + } + } + + /* create the file using the default FAPL */ + if ( pass ) { + + file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + + if ( file_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fcreate() failed.\n"; + } + } + + /* verify that the cache is set to the default config */ + validate_mdc_config(file_id, &default_config, TRUE, 1); + + /* set alternate config 1 */ + if ( pass ) { + + if ( H5Fset_mdc_config(file_id, (H5AC1_cache_config_t *)&mod_config_1) + < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fset_mdc_config() failed 1.\n"; + } + } + + /* verify that the cache is now set to the alternate config */ + validate_mdc_config(file_id, &mod_config_1, TRUE, 2); + + if ( ( pass ) && ( report_progress ) ) { + + HDfprintf(stdout,"Done.\n"); /* setting up file */ + HDfflush(stdout); + } + + + /* create the datasets */ + + if ( ( pass ) && ( report_progress ) ) { + + HDfprintf(stdout,"Creating datasets ... "); + HDfflush(stdout); + } + + if ( pass ) { + + i = 0; + + while ( ( pass ) && ( i < NUM_DSETS ) ) + { + /* create a dataspace for the chunked dataset */ + dims[0] = DSET_SIZE; + dims[1] = DSET_SIZE; + dataspace_id = H5Screate_simple(2, dims, NULL); + + if ( dataspace_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Screate_simple() failed."; + } + + /* set the dataset creation plist to specify that the raw data is + * to be partioned into 10X10 element chunks. + */ + + if ( pass ) { + + chunk_size[0] = CHUNK_SIZE; + chunk_size[1] = CHUNK_SIZE; + properties = H5Pcreate(H5P_DATASET_CREATE); + + if ( properties < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pcreate() failed."; + } + } + + if ( pass ) { + + if ( H5Pset_chunk(properties, 2, chunk_size) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pset_chunk() failed."; + } + } + + /* create the dataset */ + if ( pass ) { + + sprintf(dset_name, "/dset%03d", i); + dataset_ids[i] = H5Dcreate2(file_id, dset_name, H5T_STD_I32BE, + dataspace_id, H5P_DEFAULT, + properties, H5P_DEFAULT); + + if ( dataset_ids[i] < 0 ) { + + pass = FALSE; + failure_mssg = "H5Dcreate() failed."; + } + } + + /* get the file space ID */ + if ( pass ) { + + filespace_ids[i] = H5Dget_space(dataset_ids[i]); + + if ( filespace_ids[i] < 0 ) { + + pass = FALSE; + failure_mssg = "H5Dget_space() failed."; + } + } + + i++; + } + } + + /* create the mem space to be used to read and write chunks */ + if ( pass ) { + + dims[0] = CHUNK_SIZE; + dims[1] = CHUNK_SIZE; + memspace_id = H5Screate_simple(2, dims, NULL); + + if ( memspace_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Screate_simple() failed."; + } + } + + /* select in memory hyperslab */ + if ( pass ) { + + offset[0] = 0; /*offset of hyperslab in memory*/ + offset[1] = 0; + a_size[0] = CHUNK_SIZE; /*size of hyperslab*/ + a_size[1] = CHUNK_SIZE; + status = H5Sselect_hyperslab(memspace_id, H5S_SELECT_SET, offset, NULL, + a_size, NULL); + + if ( status < 0 ) { + + pass = FALSE; + failure_mssg = "H5Sselect_hyperslab() failed."; + } + } + + if ( ( pass ) && ( report_progress ) ) { + + HDfprintf(stdout,"Done.\n"); + HDfflush(stdout); + } + + /* initialize all datasets on a round robin basis */ + i = 0; + progress_counter = 0; + + if ( ( pass ) && ( report_progress ) ) { + + HDfprintf(stdout, "Initializing datasets "); + HDfflush(stdout); + } + + while ( ( pass ) && ( i < DSET_SIZE ) ) + { + j = 0; + while ( ( pass ) && ( j < DSET_SIZE ) ) + { + m = 0; + while ( ( pass ) && ( m < NUM_DSETS ) ) + { + /* initialize the slab */ + for ( k = 0; k < CHUNK_SIZE; k++ ) + { + for ( l = 0; l < CHUNK_SIZE; l++ ) + { + data_chunk[k][l] = (DSET_SIZE * DSET_SIZE * m) + + (DSET_SIZE * (i + k)) + j + l; + } + } + + /* select on disk hyperslab */ + offset[0] = i; /*offset of hyperslab in file*/ + offset[1] = j; + a_size[0] = CHUNK_SIZE; /*size of hyperslab*/ + a_size[1] = CHUNK_SIZE; + status = H5Sselect_hyperslab(filespace_ids[m], H5S_SELECT_SET, + offset, NULL, a_size, NULL); + + if ( status < 0 ) { + + pass = FALSE; + failure_mssg = "disk H5Sselect_hyperslab() failed."; + } + + /* write the chunk to file */ + status = H5Dwrite(dataset_ids[m], H5T_NATIVE_INT, memspace_id, + filespace_ids[m], H5P_DEFAULT, data_chunk); + + if ( status < 0 ) { + + pass = FALSE; + failure_mssg = "H5Dwrite() failed."; + } + m++; + } + j += CHUNK_SIZE; + } + + /* check the cache hit rate, and reset the counters. + * Hit rate should be just about unity here, so we will just + * get the data and (possibly) print it without checking it + * beyond ensuring that it agrees with the cache internal + * data structures. + * + * similarly, check cache size. + */ + + if ( ( pass ) && ( i % (DSET_SIZE / 4) == 0 ) ) { + + check_and_validate_cache_hit_rate(file_id, NULL, dump_hit_rate, + min_accesses, min_hit_rate); + + check_and_validate_cache_size(file_id, NULL, NULL, NULL, NULL, + dump_cache_size); + } + + i += CHUNK_SIZE; + + if ( ( pass ) && ( report_progress ) ) { + + progress_counter += CHUNK_SIZE; + + if ( progress_counter >= DSET_SIZE / 20 ) { + + progress_counter = 0; + HDfprintf(stdout, "."); + HDfflush(stdout); + } + } + } + + if ( ( pass ) && ( report_progress ) ) { + + HDfprintf(stdout," Done.\n"); /* initializing data sets */ + HDfflush(stdout); + } + + /* set alternate config 2 */ + if ( pass ) { + + if ( H5Fset_mdc_config(file_id, (H5AC1_cache_config_t *)&mod_config_2) + < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fset_mdc_config() failed 2.\n"; + } + } + + /* verify that the cache is now set to the alternate config */ + validate_mdc_config(file_id, &mod_config_2, TRUE, 3); + + /* do random reads on all datasets */ + + if ( ( pass ) && ( report_progress ) ) { + + HDfprintf(stdout, "Doing random reads on all datasets "); + HDfflush(stdout); + } + + n = 0; + progress_counter = 0; + while ( ( pass ) && ( n < NUM_RANDOM_ACCESSES ) ) + { + m = rand() % NUM_DSETS; + i = (rand() % (DSET_SIZE / CHUNK_SIZE)) * CHUNK_SIZE; + j = (rand() % (DSET_SIZE / CHUNK_SIZE)) * CHUNK_SIZE; + + /* select on disk hyperslab */ + offset[0] = i; /*offset of hyperslab in file*/ + offset[1] = j; + a_size[0] = CHUNK_SIZE; /*size of hyperslab*/ + a_size[1] = CHUNK_SIZE; + status = H5Sselect_hyperslab(filespace_ids[m], H5S_SELECT_SET, + offset, NULL, a_size, NULL); + + if ( status < 0 ) { + + pass = FALSE; + failure_mssg = "disk hyperslab create failed."; + } + + /* read the chunk from file */ + if ( pass ) { + + status = H5Dread(dataset_ids[m], H5T_NATIVE_INT, memspace_id, + filespace_ids[m], H5P_DEFAULT, data_chunk); + + if ( status < 0 ) { + + pass = FALSE; + failure_mssg = "disk hyperslab create failed."; + } + } + + /* validate the slab */ + if ( pass ) { + + valid_chunk = TRUE; + for ( k = 0; k < CHUNK_SIZE; k++ ) + { + for ( l = 0; l < CHUNK_SIZE; l++ ) + { + if ( data_chunk[k][l] + != + ((DSET_SIZE * DSET_SIZE * m) + + (DSET_SIZE * (i + k)) + j + l) ) { + + valid_chunk = FALSE; +#if 0 /* this will be useful from time to time -- lets keep it*/ + HDfprintf(stdout, + "data_chunk[%0d][%0d] = %0d, expect %0d.\n", + k, l, data_chunk[k][l], + ((DSET_SIZE * DSET_SIZE * m) + + (DSET_SIZE * (i + k)) + j + l)); + HDfprintf(stdout, + "m = %d, i = %d, j = %d, k = %d, l = %d\n", + m, i, j, k, l); +#endif + } + } + } + + if ( ! valid_chunk ) { +#if 1 + pass = FALSE; + failure_mssg = "slab validation failed."; +#else /* as above */ + fprintf(stdout, "Chunk (%0d, %0d) in /dset%03d is invalid.\n", + i, j, m); +#endif + } + } + + if ( ( pass ) && ( n % (NUM_RANDOM_ACCESSES / 4) == 0 ) ) { + + check_and_validate_cache_hit_rate(file_id, NULL, dump_hit_rate, + min_accesses, min_hit_rate); + + check_and_validate_cache_size(file_id, NULL, NULL, NULL, NULL, + dump_cache_size); + } + + n++; + + if ( ( pass ) && ( report_progress ) ) { + + progress_counter++; + + if ( progress_counter >= NUM_RANDOM_ACCESSES / 20 ) { + + progress_counter = 0; + HDfprintf(stdout, "."); + HDfflush(stdout); + } + } + } + + if ( ( pass ) && ( report_progress ) ) { + + HDfprintf(stdout, " Done.\n"); /* random reads on all data sets */ + HDfflush(stdout); + } + + + /* close the file spaces we are done with */ + i = 1; + while ( ( pass ) && ( i < NUM_DSETS ) ) + { + if ( H5Sclose(filespace_ids[i]) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Sclose() failed."; + } + i++; + } + + + /* close the datasets we are done with */ + i = 1; + while ( ( pass ) && ( i < NUM_DSETS ) ) + { + if ( H5Dclose(dataset_ids[i]) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Dclose() failed."; + } + i++; + } + + /* set alternate config 3 */ + if ( pass ) { + + if ( H5Fset_mdc_config(file_id, (H5AC1_cache_config_t *)&mod_config_3) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fset_mdc_config() failed 3.\n"; + } + } + + /* verify that the cache is now set to the alternate config */ + validate_mdc_config(file_id, &mod_config_3, TRUE, 4); + + /* do random reads on data set 0 only */ + + if ( ( pass ) && ( report_progress ) ) { + + HDfprintf(stdout, "Doing random reads on dataset 0 "); + HDfflush(stdout); + } + + m = 0; + n = 0; + progress_counter = 0; + while ( ( pass ) && ( n < NUM_RANDOM_ACCESSES ) ) + { + i = (rand() % (DSET_SIZE / CHUNK_SIZE)) * CHUNK_SIZE; + j = (rand() % (DSET_SIZE / CHUNK_SIZE)) * CHUNK_SIZE; + + /* select on disk hyperslab */ + offset[0] = i; /*offset of hyperslab in file*/ + offset[1] = j; + a_size[0] = CHUNK_SIZE; /*size of hyperslab*/ + a_size[1] = CHUNK_SIZE; + status = H5Sselect_hyperslab(filespace_ids[m], H5S_SELECT_SET, + offset, NULL, a_size, NULL); + + if ( status < 0 ) { + + pass = FALSE; + failure_mssg = "disk hyperslab create failed."; + } + + /* read the chunk from file */ + if ( pass ) { + + status = H5Dread(dataset_ids[m], H5T_NATIVE_INT, memspace_id, + filespace_ids[m], H5P_DEFAULT, data_chunk); + + if ( status < 0 ) { + + pass = FALSE; + failure_mssg = "disk hyperslab create failed."; + } + } + + /* validate the slab */ + if ( pass ) { + + valid_chunk = TRUE; + for ( k = 0; k < CHUNK_SIZE; k++ ) + { + for ( l = 0; l < CHUNK_SIZE; l++ ) + { + if ( data_chunk[k][l] + != + ((DSET_SIZE * DSET_SIZE * m) + + (DSET_SIZE * (i + k)) + j + l) ) { + + valid_chunk = FALSE; + } +#if 0 /* this will be useful from time to time -- lets keep it */ + HDfprintf(stdout, "data_chunk[%0d][%0d] = %0d, expect %0d.\n", + k, l, data_chunk[k][l], + ((DSET_SIZE * DSET_SIZE * m) + + (DSET_SIZE * (i + k)) + j + l)); +#endif + } + } + + if ( ! valid_chunk ) { + + pass = FALSE; + failure_mssg = "slab validation failed."; +#if 0 /* as above */ + fprintf(stdout, "Chunk (%0d, %0d) in /dset%03d is invalid.\n", + i, j, m); +#endif + } + } + + if ( ( pass ) && ( n % (NUM_RANDOM_ACCESSES / 4) == 0 ) ) { + + check_and_validate_cache_hit_rate(file_id, NULL, dump_hit_rate, + min_accesses, min_hit_rate); + + check_and_validate_cache_size(file_id, NULL, NULL, NULL, NULL, + dump_cache_size); + } + + n++; + + if ( ( pass ) && ( report_progress ) ) { + + progress_counter++; + + if ( progress_counter >= NUM_RANDOM_ACCESSES / 20 ) { + + progress_counter = 0; + HDfprintf(stdout, "."); + HDfflush(stdout); + } + } + } + + if ( ( pass ) && ( report_progress ) ) { + + HDfprintf(stdout, " Done.\n"); /* random reads data set 0 */ + HDfflush(stdout); + } + + + if ( ( pass ) && ( report_progress ) ) { + + HDfprintf(stdout,"Shutting down ... "); + HDfflush(stdout); + } + + + /* close file space 0 */ + if ( pass ) { + + if ( H5Sclose(filespace_ids[0]) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Sclose(filespace_ids[0]) failed."; + } + } + + /* close the data space */ + if ( pass ) { + + if ( H5Sclose(dataspace_id) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Sclose(dataspace) failed."; + } + } + + /* close the mem space */ + if ( pass ) { + + if ( H5Sclose(memspace_id) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Sclose(memspace_id) failed."; + } + } + + /* close dataset 0 */ + if ( pass ) { + + if ( H5Dclose(dataset_ids[0]) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Dclose(dataset_ids[0]) failed."; + } + } + + /* close the file and delete it */ + if ( pass ) { + + if ( H5Fclose(file_id) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fclose() failed.\n"; + + } + else if ( HDremove(filename) < 0 ) { + + pass = FALSE; + failure_mssg = "HDremove() failed.\n"; + } + } + + if ( ( pass ) && ( report_progress ) ) { + + HDfprintf(stdout,"Done.\n"); /* shutting down */ + HDfflush(stdout); + } + + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) + HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + + return !pass; + +} /* mdc_api_call_smoke_check() */ + + + +/* The following array of invalid external MDC cache configurations is + * used to test error rejection in the MDC related API calls. + */ + +#define NUM_INVALID_CONFIGS 41 + +H5AC_cache_config_t invalid_configs[NUM_INVALID_CONFIGS] = +{ + { + /* 0 -- bad version */ + /* int version = */ -1, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024), + /* double min_clean_fraction = */ 0.25, + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ ( 1 * 1024 * 1024), + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold, + /* double upper_hr_threshold = */ 0.999, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1, + /* int dirty_bytes_threshold = */ (256 * 1024) + }, + { + /* 1 -- bad rpt_fcn_enabled */ + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ (hbool_t)-1, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024), + /* double min_clean_fraction = */ 0.25, + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ ( 1 * 1024 * 1024), + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold, + /* double upper_hr_threshold = */ 0.999, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1, + /* int dirty_bytes_threshold = */ (256 * 1024) + }, + { + /* 2 -- bad open_trace_file */ + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ (hbool_t)-1, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024), + /* double min_clean_fraction = */ 0.25, + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ ( 1 * 1024 * 1024), + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold, + /* double upper_hr_threshold = */ 0.999, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1, + /* int dirty_bytes_threshold = */ (256 * 1024) + }, + { + /* 3 -- bad close_trace_file */ + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ (hbool_t)-1, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024), + /* double min_clean_fraction = */ 0.25, + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ ( 1 * 1024 * 1024), + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold, + /* double upper_hr_threshold = */ 0.999, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1, + /* int dirty_bytes_threshold = */ (256 * 1024) + }, + { + /* 4 -- open_trace_file == TRUE and empty trace_file_name */ + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ TRUE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024), + /* double min_clean_fraction = */ 0.25, + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ ( 1 * 1024 * 1024), + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold, + /* double upper_hr_threshold = */ 0.999, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1, + /* int dirty_bytes_threshold = */ (256 * 1024) + }, + { + /* 5 -- bad set_initial_size */ + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ 2, + /* size_t initial_size = */ (1 * 1024 * 1024), + /* double min_clean_fraction = */ 0.25, + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ ( 1 * 1024 * 1024), + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold, + /* double upper_hr_threshold = */ 0.999, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1, + /* int dirty_bytes_threshold = */ (256 * 1024) + }, + { + /* 6 -- max_size too big */ + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024), + /* double min_clean_fraction = */ 0.25, + /* size_t max_size = */ H5C__MAX_MAX_CACHE_SIZE + 1, + /* size_t min_size = */ ( 1 * 1024 * 1024), + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold, + /* double upper_hr_threshold = */ 0.999, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1, + /* int dirty_bytes_threshold = */ (256 * 1024) + }, + { + /* 7 -- min_size too small */ + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024), + /* double min_clean_fraction = */ 0.25, + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ H5C__MIN_MAX_CACHE_SIZE - 1, + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold, + /* double upper_hr_threshold = */ 0.999, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1, + /* int dirty_bytes_threshold = */ (256 * 1024) + }, + { + /* 8 -- min_size > max_size */ + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ FALSE, + /* size_t initial_size = */ (1 * 1024 * 1024), + /* double min_clean_fraction = */ 0.25, + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ (16 * 1024 * 1024 + 1), + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold, + /* double upper_hr_threshold = */ 0.999, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1, + /* int dirty_bytes_threshold = */ (256 * 1024) + }, + { + /* 9 -- initial size out of range (too big) */ + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (16 * 1024 * 1024 + 1), + /* double min_clean_fraction = */ 0.25, + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ ( 1 * 1024 * 1024), + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold, + /* double upper_hr_threshold = */ 0.999, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1, + /* int dirty_bytes_threshold = */ (256 * 1024) + }, + { + /* 10 -- initial_size out of range (too small) */ + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024 - 1), + /* double min_clean_fraction = */ 0.25, + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ ( 1 * 1024 * 1024), + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold, + /* double upper_hr_threshold = */ 0.999, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1, + /* int dirty_bytes_threshold = */ (256 * 1024) + }, + { + /* 11 -- min_clean_fraction too big */ + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024), + /* double min_clean_fraction = */ 1.000001, + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ ( 1 * 1024 * 1024), + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold, + /* double upper_hr_threshold = */ 0.999, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1, + /* int dirty_bytes_threshold = */ (256 * 1024) + }, + { + /* 12 -- min_clean_fraction too small */ + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024), + /* double min_clean_fraction = */ -0.00000001, + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ ( 1 * 1024 * 1024), + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold, + /* double upper_hr_threshold = */ 0.999, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1, + /* int dirty_bytes_threshold = */ (256 * 1024) + }, + { + /* 13 -- epoch_length too small */ + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024), + /* double min_clean_fraction = */ 0.25, + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ ( 1 * 1024 * 1024), + /* long int epoch_length = */ H5C__MIN_AR_EPOCH_LENGTH - 1, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold, + /* double upper_hr_threshold = */ 0.999, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1, + /* int dirty_bytes_threshold = */ (256 * 1024) + }, + { + /* 14 -- epoch_length too big */ + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024), + /* double min_clean_fraction = */ 0.25, + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ ( 1 * 1024 * 1024), + /* long int epoch_length = */ H5C__MAX_AR_EPOCH_LENGTH + 1, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold, + /* double upper_hr_threshold = */ 0.999, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1, + /* int dirty_bytes_threshold = */ (256 * 1024) + }, + { + /* 15 -- invalid incr_mode */ + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024), + /* double min_clean_fraction = */ 0.25, + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ ( 1 * 1024 * 1024), + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ -1, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold, + /* double upper_hr_threshold = */ 0.999, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1, + /* int dirty_bytes_threshold = */ (256 * 1024) + }, + { + /* 16 -- lower_hr_threshold too small */ + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024), + /* double min_clean_fraction = */ 0.25, + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ ( 1 * 1024 * 1024), + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ -0.000001, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold, + /* double upper_hr_threshold = */ 0.999, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1, + /* int dirty_bytes_threshold = */ (256 * 1024) + }, + { + /* 17 -- lower_hr_threshold too big */ + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024), + /* double min_clean_fraction = */ 0.25, + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ ( 1 * 1024 * 1024), + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 1.00000001, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold, + /* double upper_hr_threshold = */ 0.999, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1, + /* int dirty_bytes_threshold = */ (256 * 1024) + }, + { + /* 18 -- increment too small */ + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024), + /* double min_clean_fraction = */ 0.25, + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ ( 1 * 1024 * 1024), + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 0.999999999999, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold, + /* double upper_hr_threshold = */ 0.999, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1, + /* int dirty_bytes_threshold = */ (256 * 1024) + }, + { + /* 19 -- bad apply_max_increment */ + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024), + /* double min_clean_fraction = */ 0.25, + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ ( 1 * 1024 * 1024), + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ (hbool_t)-1, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold, + /* double upper_hr_threshold = */ 0.999, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1, + /* int dirty_bytes_threshold = */ (256 * 1024) + }, + { + /* 20 -- invalid flash_incr_mode */ + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024), + /* double min_clean_fraction = */ 0.25, + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ ( 1 * 1024 * 1024), + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ -1, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold, + /* double upper_hr_threshold = */ 0.999, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1, + /* int dirty_bytes_threshold = */ (256 * 1024) + }, + { + /* 21 -- flash_multiple too small */ + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024), + /* double min_clean_fraction = */ 0.25, + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ ( 1 * 1024 * 1024), + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__add_space, + /* double flash_multiple = */ 0.09, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold, + /* double upper_hr_threshold = */ 0.999, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1, + /* int dirty_bytes_threshold = */ (256 * 1024) + }, + { + /* 22 -- flash_multiple too big */ + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024), + /* double min_clean_fraction = */ 0.25, + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ ( 1 * 1024 * 1024), + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__add_space, + /* double flash_multiple = */ 10.001, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold, + /* double upper_hr_threshold = */ 0.999, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1, + /* int dirty_bytes_threshold = */ (256 * 1024) + }, + { + /* 23 -- flash_threshold too small */ + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024), + /* double min_clean_fraction = */ 0.25, + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ ( 1 * 1024 * 1024), + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__add_space, + /* double flash_multiple = */ 1.0, + /* double flash_threshold = */ 0.099, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold, + /* double upper_hr_threshold = */ 0.999, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1, + /* int dirty_bytes_threshold = */ (256 * 1024) + }, + { + /* 24 -- flash_threshold too big */ + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024), + /* double min_clean_fraction = */ 0.25, + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ ( 1 * 1024 * 1024), + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__add_space, + /* double flash_multiple = */ 1.0, + /* double flash_threshold = */ 1.001, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold, + /* double upper_hr_threshold = */ 0.999, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1, + /* int dirty_bytes_threshold = */ (256 * 1024) + }, + { + /* 25 -- bad decr_mode */ + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024), + /* double min_clean_fraction = */ 0.25, + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ ( 1 * 1024 * 1024), + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ -1, + /* double upper_hr_threshold = */ 0.999, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1, + /* int dirty_bytes_threshold = */ (256 * 1024) + }, + { + /* 26 -- upper_hr_threshold too big */ + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024), + /* double min_clean_fraction = */ 0.25, + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ ( 1 * 1024 * 1024), + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__threshold, + /* double upper_hr_threshold = */ 1.00001, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1, + /* int dirty_bytes_threshold = */ (256 * 1024) + }, + { + /* 27 -- decrement too small */ + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024), + /* double min_clean_fraction = */ 0.25, + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ ( 1 * 1024 * 1024), + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__threshold, + /* double upper_hr_threshold = */ 0.999, + /* double decrement = */ -0.0000000001, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1, + /* int dirty_bytes_threshold = */ (256 * 1024) + }, + { + /* 28 -- decrement too big */ + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024), + /* double min_clean_fraction = */ 0.25, + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ ( 1 * 1024 * 1024), + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__threshold, + /* double upper_hr_threshold = */ 0.999, + /* double decrement = */ 1.0000000001, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1, + /* int dirty_bytes_threshold = */ (256 * 1024) + }, + { + /* 29 -- epochs_before_eviction too small */ + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024), + /* double min_clean_fraction = */ 0.25, + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ ( 1 * 1024 * 1024), + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out, + /* double upper_hr_threshold = */ 0.999, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 0, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1, + /* int dirty_bytes_threshold = */ (256 * 1024) + }, + { + /* 30 -- epochs_before_eviction too big */ + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024), + /* double min_clean_fraction = */ 0.25, + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ ( 1 * 1024 * 1024), + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out, + /* double upper_hr_threshold = */ 0.999, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ H5C__MAX_EPOCH_MARKERS + 1, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1, + /* int dirty_bytes_threshold = */ (256 * 1024) + }, + { + /* 31 -- invalid apply_empty_reserve */ + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024), + /* double min_clean_fraction = */ 0.25, + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ ( 1 * 1024 * 1024), + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold, + /* double upper_hr_threshold = */ 0.999, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ 2, + /* double empty_reserve = */ 0.1, + /* int dirty_bytes_threshold = */ (256 * 1024) + }, + { + /* 32 -- empty_reserve too small */ + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024), + /* double min_clean_fraction = */ 0.25, + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ ( 1 * 1024 * 1024), + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold, + /* double upper_hr_threshold = */ 0.999, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ -0.0000000001, + /* int dirty_bytes_threshold = */ (256 * 1024) + }, + { + /* 33 -- empty_reserve too big */ + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024), + /* double min_clean_fraction = */ 0.25, + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ ( 1 * 1024 * 1024), + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold, + /* double upper_hr_threshold = */ 0.999, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 1.00000000001, + /* int dirty_bytes_threshold = */ (256 * 1024) + }, + { + /* 34 -- upper_hr_threshold too small */ + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024), + /* double min_clean_fraction = */ 0.25, + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ ( 1 * 1024 * 1024), + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold, + /* double upper_hr_threshold = */ -0.000000001, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1, + /* int dirty_bytes_threshold = */ (256 * 1024) + }, + { + /* 35 -- upper_hr_threshold too big */ + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024), + /* double min_clean_fraction = */ 0.25, + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ ( 1 * 1024 * 1024), + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold, + /* double upper_hr_threshold = */ 1.00000001, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1, + /* int dirty_bytes_threshold = */ (256 * 1024) + }, + { + /* 36 -- upper_hr_threshold <= lower_hr_threshold */ + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024), + /* double min_clean_fraction = */ 0.25, + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ ( 1 * 1024 * 1024), + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold, + /* double upper_hr_threshold = */ 0.9, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1, + /* int dirty_bytes_threshold = */ (256 * 1024) + }, + { + /* 37 -- dirty_bytes_threshold too small */ + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024), + /* double min_clean_fraction = */ 0.25, + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ ( 1 * 1024 * 1024), + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold, + /* double upper_hr_threshold = */ 0.999, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1, + /* int dirty_bytes_threshold = */ (H5C__MIN_MAX_CACHE_SIZE / 2) - 1 + }, + { + /* 38 -- dirty_bytes_threshold too big */ + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024), + /* double min_clean_fraction = */ 0.25, + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ ( 1 * 1024 * 1024), + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out_with_threshold, + /* double upper_hr_threshold = */ 0.9, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1, + /* int dirty_bytes_threshold = */ (H5C__MAX_MAX_CACHE_SIZE / 4) + 1 + }, + { + /* 39 -- attempt to disable evictions when auto incr enabled */ + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ FALSE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024), + /* double min_clean_fraction = */ 0.25, + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ ( 1 * 1024 * 1024), + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__off, + /* double upper_hr_threshold = */ 0.9, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1, + /* int dirty_bytes_threshold = */ (256 * 1024) + }, + { + /* 40 -- attempt to disable evictions when auto decr enabled */ + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ FALSE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ (1 * 1024 * 1024), + /* double min_clean_fraction = */ 0.25, + /* size_t max_size = */ (16 * 1024 * 1024), + /* size_t min_size = */ ( 1 * 1024 * 1024), + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__threshold, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 2.0, + /* double flash_threshold = */ 0.5, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__age_out, + /* double upper_hr_threshold = */ 0.9, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1, + /* int dirty_bytes_threshold = */ (256 * 1024) + } +}; + + +/*------------------------------------------------------------------------- + * Function: check_fapl_mdc_api_errs() + * + * Purpose: Verify that the FAPL related MDC API calls reject input + * errors gracefully. + * + * Return: void + * + * Programmer: John Mainzer + * 4/19/04 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +static unsigned +check_fapl_mdc_api_errs(void) +{ + const char * fcn_name = "check_fapl_mdc_api_errs()"; + static char msg[128]; + int i; + herr_t result; + hid_t fapl_id = -1; + H5AC_cache_config_t default_config = H5AC__DEFAULT_CACHE_CONFIG; + H5AC_cache_config_t scratch; + + TESTING("MDC/FAPL related API input errors"); + + pass = TRUE; + + + /* first test H5Pget_mdc_config(). + */ + + scratch.version = H5C__CURR_AUTO_SIZE_CTL_VER; + if ( pass ) { + + H5E_BEGIN_TRY { + result = H5Pget_mdc_config(-1, (H5AC1_cache_config_t *)&scratch); + } H5E_END_TRY; + + if ( result >= 0 ) { + + pass = FALSE; + failure_mssg = "H5Pget_mdc_config() accepted invalid plist_id."; + } + } + + /* Create a FAPL for test purposes, and verify that it contains the + * default MDC configuration. + */ + + if ( pass ) { + + fapl_id = H5Pcreate(H5P_FILE_ACCESS); + + if ( fapl_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pcreate(H5P_FILE_ACCESS) failed.\n"; + } + } + + scratch.version = H5C__CURR_AUTO_SIZE_CTL_VER; + if ( ( pass ) && + ( ( H5Pget_mdc_config(fapl_id, (H5AC1_cache_config_t *)&scratch) < 0) || + ( !CACHE_CONFIGS_EQUAL(default_config, scratch, TRUE, TRUE) ) ) ) { + + pass = FALSE; + failure_mssg = "New FAPL has unexpected metadata cache config?!?!?.\n"; + } + + if ( pass ) { + + H5E_BEGIN_TRY { + result = H5Pget_mdc_config(fapl_id, NULL); + } H5E_END_TRY; + + if ( result >= 0 ) { + + pass = FALSE; + failure_mssg = "H5Pget_mdc_config() accepted NULL config_ptr."; + } + } + + /* one last test for H5Pget_mdc_config() */ + + scratch.version = -1; /* a convenient, invalid value */ + if ( pass ) { + + H5E_BEGIN_TRY { + result = H5Pget_mdc_config(fapl_id, (H5AC1_cache_config_t *)&scratch); + } H5E_END_TRY; + + if ( result >= 0 ) { + + pass = FALSE; + failure_mssg = "H5Pget_mdc_config() accepted bad config version."; + } + } + + + /* now test H5Pset_mdc_config() + */ + + scratch.version = H5C__CURR_AUTO_SIZE_CTL_VER; + if ( pass ) { + + H5E_BEGIN_TRY { + result = H5Pset_mdc_config(-1, (H5AC1_cache_config_t *)&default_config); + } H5E_END_TRY; + + if ( result >= 0 ) { + + pass = FALSE; + failure_mssg = "H5Pset_mdc_config() accepted bad invalid plist_id."; + } + } + + if ( pass ) { + + H5E_BEGIN_TRY { + result = H5Pset_mdc_config(fapl_id, NULL); + } H5E_END_TRY; + + if ( result >= 0 ) { + + pass = FALSE; + failure_mssg = "H5Pset_mdc_config() accepted NULL config_ptr."; + } + } + + i = 0; + while ( ( pass ) && ( i < NUM_INVALID_CONFIGS ) ) + { + H5E_BEGIN_TRY { + result = H5Pset_mdc_config(fapl_id, (H5AC1_cache_config_t *)&(invalid_configs[i])); + } H5E_END_TRY; + + if ( result >= 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "H5Pset_mdc_config() accepted invalid_configs[%d].", i); + failure_mssg = msg; + } + i++; + } + + /* verify that none of the above calls to H5Pset_mdc_config() changed + * the configuration in the FAPL. + */ + scratch.version = H5C__CURR_AUTO_SIZE_CTL_VER; + if ( ( pass ) && + ( ( H5Pget_mdc_config(fapl_id, (H5AC1_cache_config_t *)&scratch) < 0 ) || + ( !CACHE_CONFIGS_EQUAL(default_config, scratch, TRUE, TRUE) ) ) ) { + + pass = FALSE; + failure_mssg = "FAPL metadata cache config changed???.\n"; + } + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) + HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + + return !pass; + +} /* check_fapl_mdc_api_errs() */ + + +/*------------------------------------------------------------------------- + * Function: check_file_mdc_api_errs() + * + * Purpose: Verify that the file related MDC API calls reject input + * errors gracefully. + * + * Return: void + * + * Programmer: John Mainzer + * 4/19/04 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +static unsigned +check_file_mdc_api_errs(void) +{ + const char * fcn_name = "check_file_mdc_api_errs()"; + char filename[512]; + static char msg[128]; + hbool_t show_progress = FALSE; + int i; + herr_t result; + hid_t file_id = -1; + size_t max_size; + size_t min_clean_size; + size_t cur_size; + int cur_num_entries; + double hit_rate; + + H5AC_cache_config_t default_config = H5AC__DEFAULT_CACHE_CONFIG; + H5AC_cache_config_t scratch; + + TESTING("MDC/FILE related API input errors"); + + pass = TRUE; + + /* Create a file for test purposes, and veify that its metadata cache + * set to the default MDC configuration. + */ + + /* setup the file name */ + if ( pass ) { + + if ( show_progress ) { + + HDfprintf(stdout, "%s: calling h5_fixname().\n", fcn_name); + } + + if ( h5_fixname(FILENAME[1], H5P_DEFAULT, filename, sizeof(filename)) + == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed.\n"; + } + } + + if ( pass ) { + + if ( show_progress ) { + + HDfprintf(stdout, "%s: calling H5Fcreate().\n", fcn_name); + } + + file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + + if ( file_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fcreate() failed.\n"; + } + } + + validate_mdc_config(file_id, &default_config, TRUE, 1); + + + /* test H5Fget_mdc_config(). */ + + scratch.version = H5C__CURR_AUTO_SIZE_CTL_VER; + if ( pass ) { + + if ( show_progress ) { + + HDfprintf(stdout, "%s: testing H5Fget_mdc_config() 1.\n", fcn_name); + } + + H5E_BEGIN_TRY { + result = H5Fget_mdc_config(-1, (H5AC1_cache_config_t *)&scratch); + } H5E_END_TRY; + + if ( result >= 0 ) { + + pass = FALSE; + failure_mssg = "H5Fget_mdc_config() accepted invalid file_id."; + } + } + + if ( pass ) { + + if ( show_progress ) { + + HDfprintf(stdout, "%s: testing H5Fget_mdc_config() 2.\n", fcn_name); + } + + H5E_BEGIN_TRY { + result = H5Fget_mdc_config(file_id, NULL); + } H5E_END_TRY; + + if ( result >= 0 ) { + + pass = FALSE; + failure_mssg = "H5Fget_mdc_config() accepted NULL config_ptr."; + } + } + + scratch.version = -1; /* a convenient, invalid value */ + if ( pass ) { + + if ( show_progress ) { + + HDfprintf(stdout, "%s: testing H5Fget_mdc_config() 3.\n", fcn_name); + } + + H5E_BEGIN_TRY { + result = H5Fget_mdc_config(file_id, (H5AC1_cache_config_t *)&scratch); + } H5E_END_TRY; + + if ( result >= 0 ) { + + pass = FALSE; + failure_mssg = "H5Fget_mdc_config() accepted bad config version."; + } + } + + + /* test H5Fset_mdc_config() */ + + scratch.version = H5C__CURR_AUTO_SIZE_CTL_VER; + if ( pass ) { + + if ( show_progress ) { + + HDfprintf(stdout, "%s: testing H5Fset_mdc_config() 1.\n", fcn_name); + } + + H5E_BEGIN_TRY { + result = H5Fset_mdc_config(-1, (H5AC1_cache_config_t *)&default_config); + } H5E_END_TRY; + + if ( result >= 0 ) { + + pass = FALSE; + failure_mssg = "H5Fset_mdc_config() accepted bad invalid file_id."; + } + } + + if ( pass ) { + + if ( show_progress ) { + + HDfprintf(stdout, "%s: testing H5Fset_mdc_config() 2.\n", fcn_name); + } + + H5E_BEGIN_TRY { + result = H5Fset_mdc_config(file_id, NULL); + } H5E_END_TRY; + + if ( result >= 0 ) { + + pass = FALSE; + failure_mssg = "H5Fset_mdc_config() accepted NULL config_ptr."; + } + } + + i = 0; + while ( ( pass ) && ( i < NUM_INVALID_CONFIGS ) ) + { + if ( show_progress ) { + + HDfprintf(stdout, + "%s: testing H5Fset_mdc_config() with invalid config %d.\n", + fcn_name, i); + } + + H5E_BEGIN_TRY { + result = + H5Fset_mdc_config(file_id, (H5AC1_cache_config_t *)&(invalid_configs[i])); + } H5E_END_TRY; + + if ( result >= 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "H5Fset_mdc_config() accepted invalid_configs[%d].", i); + failure_mssg = msg; + } + i++; + } + + /* verify that none of the above calls to H5Fset_mdc_config() changed + * the configuration in the FAPL. + */ + validate_mdc_config(file_id, &default_config, TRUE, 2); + + + /* test H5Fget_mdc_hit_rate() */ + if ( pass ) { + + if ( show_progress ) { + + HDfprintf(stdout, "%s: testing H5Fget_mdc_hit_rate() 1.\n", + fcn_name); + } + + H5E_BEGIN_TRY { + result = H5Fget_mdc_hit_rate(-1, &hit_rate); + } H5E_END_TRY; + + if ( result >= 0 ) { + + pass = FALSE; + failure_mssg = "H5Fget_mdc_hit_rate() accepted bad file_id."; + } + } + + if ( pass ) { + + if ( show_progress ) { + + HDfprintf(stdout, "%s: testing H5Fget_mdc_hit_rate() 2.\n", + fcn_name); + } + + H5E_BEGIN_TRY { + result = H5Fget_mdc_hit_rate(file_id, NULL); + } H5E_END_TRY; + + if ( result >= 0 ) { + + pass = FALSE; + failure_mssg = "H5Fget_mdc_hit_rate() accepted NULL hit_rate_ptr."; + } + } + + + /* test H5Freset_mdc_hit_rate_stats() */ + if ( pass ) { + + if ( show_progress ) { + + HDfprintf(stdout, "%s: testing H5Freset_mdc_hit_rate_stats().\n", + fcn_name); + } + + H5E_BEGIN_TRY { + result = H5Freset_mdc_hit_rate_stats(-1); + } H5E_END_TRY; + + if ( result >= 0 ) { + + pass = FALSE; + failure_mssg = + "H5Freset_mdc_hit_rate_stats() accepted bad file_id."; + } + } + + + /* test H5Fget_mdc_size() */ + if ( pass ) { + + if ( show_progress ) { + + HDfprintf(stdout, "%s: testing H5Fget_mdc_size() 1.\n", fcn_name); + } + + H5E_BEGIN_TRY { + result = H5Fget_mdc_size(-1, &max_size, &min_clean_size, + &cur_size, &cur_num_entries); + } H5E_END_TRY; + + if ( result >= 0 ) { + + pass = FALSE; + failure_mssg = "H5Fget_mdc_size() accepted bad file_id."; + } + } + + if ( pass ) { + + if ( show_progress ) { + + HDfprintf(stdout, "%s: testing H5Fget_mdc_size() 2.\n", fcn_name); + } + + if ( ( H5Fget_mdc_size(file_id, &max_size, NULL, NULL, NULL) < 0 ) || + ( H5Fget_mdc_size(file_id, NULL, &min_clean_size, + NULL, NULL) < 0 ) || + ( H5Fget_mdc_size(file_id, NULL, NULL, &cur_size, NULL) < 0 ) || + ( H5Fget_mdc_size(file_id, NULL, NULL, NULL, + &cur_num_entries) < 0 ) || + ( H5Fget_mdc_size(file_id, NULL, NULL, NULL, NULL) < 0 ) ) { + + pass = FALSE; + failure_mssg = "H5Fget_mdc_size() failed to handle NULL params."; + } + } + + + /* close the file and delete it */ + if ( pass ) { + + if ( show_progress ) { + + HDfprintf(stdout, "%s: cleaning up from tests.\n", fcn_name); + } + + if ( H5Fclose(file_id) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fclose() failed.\n"; + + } else if ( HDremove(filename) < 0 ) { + + pass = FALSE; + failure_mssg = "HDremove() failed.\n"; + } + } + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) + HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + + return !pass; + +} /* check_file_mdc_api_errs() */ + + +/*------------------------------------------------------------------------- + * Function: main + * + * Purpose: Run tests on the cache code contained in H5C.c + * + * Return: Success: + * + * Failure: + * + * Programmer: John Mainzer + * 6/24/04 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +int +main(void) +{ + unsigned nerrs = 0; + + H5open(); + + express_test = GetTestExpress(); + + if ( express_test >= 3 ) { + + skip_long_tests = TRUE; + + } else { + + skip_long_tests = FALSE; + } + + printf("===================================\n"); + printf("Cache API tests\n"); + printf(" express_test = %d\n", express_test); + printf(" skip_long_tests = %d\n", (int)skip_long_tests); + printf(" use_core_driver = %d\n", USE_CORE_DRIVER); + printf("===================================\n"); + + +#if 1 + nerrs += check_fapl_mdc_api_calls(); +#endif +#if 1 + nerrs += check_file_mdc_api_calls(); +#endif +#if 1 + nerrs += mdc_api_call_smoke_check(); +#endif +#if 1 + nerrs += check_fapl_mdc_api_errs(); +#endif +#if 1 + nerrs += check_file_mdc_api_errs(); +#endif + + return( nerrs > 0 ); + +} /* main() */ diff --git a/test/cache_common.c b/test/cache_common.c new file mode 100644 index 0000000..c4ae165 --- /dev/null +++ b/test/cache_common.c @@ -0,0 +1,5876 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * Copyright by the Board of Trustees of the University of Illinois. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* Programmer: John Mainzer + * 9/13/07 + * + * This file contains common code for tests of the cache + * implemented in H5C.c + */ + +#include + +#include "H5private.h" + +#include "h5test.h" +#include "H5Iprivate.h" +#include "H5ACprivate.h" +#include "H5MFprivate.h" +#include "H5MMprivate.h" +#include "cache_common.h" + + +/* global variable declarations: */ + +const char *FILENAME[] = { + "cache_test", + "cache_api_test", + NULL +}; + +hid_t saved_fapl_id = H5P_DEFAULT; /* store the fapl id here between + * cache setup and takedown. Note + * that if saved_fapl_id == H5P_DEFAULT, + * we assume that there is no fapl to + * close. + */ + +hid_t saved_fid = -1; /* store the file id here between cache setup + * and takedown. + */ + +H5C_t * saved_cache = NULL; /* store the pointer to the instance of + * of H5C_t created by H5Fcreate() + * here between test cache setup and + * shutdown. + */ + +haddr_t saved_actual_base_addr = HADDR_UNDEF; /* Store the address of the + space allocated for cache items in the file between + cache setup & takedown */ + +hbool_t write_permitted = TRUE; +hbool_t pass = TRUE; /* set to false on error */ +hbool_t skip_long_tests = TRUE; +hbool_t run_full_test = TRUE; +hbool_t try_core_file_driver = TRUE; +hbool_t core_file_driver_failed = FALSE; +const char *failure_mssg = NULL; +int failures = 0; +int express_test = 0; + +test_entry_t pico_entries[NUM_PICO_ENTRIES]; +test_entry_t nano_entries[NUM_NANO_ENTRIES]; +test_entry_t micro_entries[NUM_MICRO_ENTRIES]; +test_entry_t tiny_entries[NUM_TINY_ENTRIES]; +test_entry_t small_entries[NUM_SMALL_ENTRIES]; +test_entry_t medium_entries[NUM_MEDIUM_ENTRIES]; +test_entry_t large_entries[NUM_LARGE_ENTRIES]; +test_entry_t huge_entries[NUM_HUGE_ENTRIES]; +test_entry_t monster_entries[NUM_MONSTER_ENTRIES]; +test_entry_t variable_entries[NUM_VARIABLE_ENTRIES]; + +test_entry_t * entries[NUMBER_OF_ENTRY_TYPES] = +{ + pico_entries, + nano_entries, + micro_entries, + tiny_entries, + small_entries, + medium_entries, + large_entries, + huge_entries, + monster_entries, + variable_entries +}; + +const int32_t max_indices[NUMBER_OF_ENTRY_TYPES] = +{ + NUM_PICO_ENTRIES - 1, + NUM_NANO_ENTRIES - 1, + NUM_MICRO_ENTRIES - 1, + NUM_TINY_ENTRIES - 1, + NUM_SMALL_ENTRIES - 1, + NUM_MEDIUM_ENTRIES - 1, + NUM_LARGE_ENTRIES - 1, + NUM_HUGE_ENTRIES - 1, + NUM_MONSTER_ENTRIES - 1, + NUM_VARIABLE_ENTRIES - 1 +}; + +const size_t entry_sizes[NUMBER_OF_ENTRY_TYPES] = +{ + PICO_ENTRY_SIZE, + NANO_ENTRY_SIZE, + MICRO_ENTRY_SIZE, + TINY_ENTRY_SIZE, + SMALL_ENTRY_SIZE, + MEDIUM_ENTRY_SIZE, + LARGE_ENTRY_SIZE, + HUGE_ENTRY_SIZE, + MONSTER_ENTRY_SIZE, + VARIABLE_ENTRY_SIZE +}; + +const haddr_t base_addrs[NUMBER_OF_ENTRY_TYPES] = +{ + PICO_BASE_ADDR, + NANO_BASE_ADDR, + MICRO_BASE_ADDR, + TINY_BASE_ADDR, + SMALL_BASE_ADDR, + MEDIUM_BASE_ADDR, + LARGE_BASE_ADDR, + HUGE_BASE_ADDR, + MONSTER_BASE_ADDR, + VARIABLE_BASE_ADDR +}; + +const haddr_t alt_base_addrs[NUMBER_OF_ENTRY_TYPES] = +{ + PICO_ALT_BASE_ADDR, + NANO_ALT_BASE_ADDR, + MICRO_ALT_BASE_ADDR, + TINY_ALT_BASE_ADDR, + SMALL_ALT_BASE_ADDR, + MEDIUM_ALT_BASE_ADDR, + LARGE_ALT_BASE_ADDR, + HUGE_ALT_BASE_ADDR, + MONSTER_ALT_BASE_ADDR, + VARIABLE_ALT_BASE_ADDR +}; + +const char * entry_type_names[NUMBER_OF_ENTRY_TYPES] = +{ + "pico entries -- 1 B", + "nano entries -- 4 B", + "micro entries -- 16 B", + "tiny entries -- 64 B", + "small entries -- 256 B", + "medium entries -- 1 KB", + "large entries -- 4 KB", + "huge entries -- 16 KB", + "monster entries -- 64 KB", + "variable entries -- 1B - 10KB" +}; + + +/* callback table declaration */ + +const H5C_class_t types[NUMBER_OF_ENTRY_TYPES] = +{ + { + PICO_ENTRY_TYPE, + "pico_entry", + H5FD_MEM_DEFAULT, + (H5C_deserialize_func_t)pico_deserialize, + (H5C_image_len_func_t)pico_image_len, + (H5C_serialize_func_t)pico_serialize, + (H5C_free_icr_func_t)pico_free_icr, + (H5C_clear_dirty_bits_func_t)pico_clear_dirty_bits + }, + { + NANO_ENTRY_TYPE, + "nano_entry", + H5FD_MEM_DEFAULT, + (H5C_deserialize_func_t)nano_deserialize, + (H5C_image_len_func_t)nano_image_len, + (H5C_serialize_func_t)nano_serialize, + (H5C_free_icr_func_t)nano_free_icr, + (H5C_clear_dirty_bits_func_t)nano_clear_dirty_bits + }, + { + MICRO_ENTRY_TYPE, + "micro_entry", + H5FD_MEM_DEFAULT, + (H5C_deserialize_func_t)micro_deserialize, + (H5C_image_len_func_t)micro_image_len, + (H5C_serialize_func_t)micro_serialize, + (H5C_free_icr_func_t)micro_free_icr, + (H5C_clear_dirty_bits_func_t)micro_clear_dirty_bits + }, + { + TINY_ENTRY_TYPE, + "tiny_entry", + H5FD_MEM_DEFAULT, + (H5C_deserialize_func_t)tiny_deserialize, + (H5C_image_len_func_t)tiny_image_len, + (H5C_serialize_func_t)tiny_serialize, + (H5C_free_icr_func_t)tiny_free_icr, + (H5C_clear_dirty_bits_func_t)tiny_clear_dirty_bits + }, + { + SMALL_ENTRY_TYPE, + "small_entry", + H5FD_MEM_DEFAULT, + (H5C_deserialize_func_t)small_deserialize, + (H5C_image_len_func_t)small_image_len, + (H5C_serialize_func_t)small_serialize, + (H5C_free_icr_func_t)small_free_icr, + (H5C_clear_dirty_bits_func_t)small_clear_dirty_bits + }, + { + MEDIUM_ENTRY_TYPE, + "medium_entry", + H5FD_MEM_DEFAULT, + (H5C_deserialize_func_t)medium_deserialize, + (H5C_image_len_func_t)medium_image_len, + (H5C_serialize_func_t)medium_serialize, + (H5C_free_icr_func_t)medium_free_icr, + (H5C_clear_dirty_bits_func_t)medium_clear_dirty_bits + }, + { + LARGE_ENTRY_TYPE, + "large_entry", + H5FD_MEM_DEFAULT, + (H5C_deserialize_func_t)large_deserialize, + (H5C_image_len_func_t)large_image_len, + (H5C_serialize_func_t)large_serialize, + (H5C_free_icr_func_t)large_free_icr, + (H5C_clear_dirty_bits_func_t)large_clear_dirty_bits + }, + { + HUGE_ENTRY_TYPE, + "huge_entry", + H5FD_MEM_DEFAULT, + (H5C_deserialize_func_t)huge_deserialize, + (H5C_image_len_func_t)huge_image_len, + (H5C_serialize_func_t)huge_serialize, + (H5C_free_icr_func_t)huge_free_icr, + (H5C_clear_dirty_bits_func_t)huge_clear_dirty_bits + }, + { + MONSTER_ENTRY_TYPE, + "monster_entry", + H5FD_MEM_DEFAULT, + (H5C_deserialize_func_t)monster_deserialize, + (H5C_image_len_func_t)monster_image_len, + (H5C_serialize_func_t)monster_serialize, + (H5C_free_icr_func_t)monster_free_icr, + (H5C_clear_dirty_bits_func_t)monster_clear_dirty_bits + }, + { + VARIABLE_ENTRY_TYPE, + "variable_entry", + H5FD_MEM_DEFAULT, + (H5C_deserialize_func_t)variable_deserialize, + (H5C_image_len_func_t)variable_image_len, + (H5C_serialize_func_t)variable_serialize, + (H5C_free_icr_func_t)variable_free_icr, + (H5C_clear_dirty_bits_func_t)variable_clear_dirty_bits + } +}; + +static void * deserialize(haddr_t addr, + size_t len, + const void * image_ptr, + hbool_t * dirty_ptr); + +static herr_t image_len(void *thing, + size_t *image_len_ptr); + +static herr_t serialize(haddr_t addr, + size_t len, + void * image_ptr, + void * thing, + unsigned * flags_ptr, + haddr_t * new_addr_ptr, + size_t * new_len_ptr, + void ** new_image_ptr_ptr); + +static herr_t free_icr(test_entry_t *entry_ptr); + +static herr_t clear_dirty_bits(test_entry_t *entry_ptr); + +/* address translation funtions: */ + + +/*------------------------------------------------------------------------- + * Function: addr_to_type_and_index + * + * Purpose: Given an address, compute the type and index of the + * associated entry. + * + * Return: void + * + * Programmer: John Mainzer + * 6/10/04 + * + *------------------------------------------------------------------------- + */ +void +addr_to_type_and_index(haddr_t addr, + int32_t * type_ptr, + int32_t * index_ptr) +{ + int i; + int32_t type; + int32_t idx; + + HDassert( type_ptr ); + HDassert( index_ptr ); + + /* we only have a small number of entry types, so just do a + * linear search. If NUMBER_OF_ENTRY_TYPES grows, we may want + * to do a binary search instead. + */ + i = 1; + if ( addr >= PICO_ALT_BASE_ADDR ) { + + while ( ( i < NUMBER_OF_ENTRY_TYPES ) && + ( addr >= alt_base_addrs[i] ) ) + { + i++; + } + + } else { + + while ( ( i < NUMBER_OF_ENTRY_TYPES ) && + ( addr >= base_addrs[i] ) ) + { + i++; + } + } + + type = i - 1; + + HDassert( ( type >= 0 ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); + + if ( addr >= PICO_ALT_BASE_ADDR ) { + + idx = (int32_t)((addr - alt_base_addrs[type]) / entry_sizes[type]); + HDassert( ( idx >= 0 ) && ( idx <= max_indices[type] ) ); + HDassert( !((entries[type])[idx].at_main_addr) ); + HDassert( addr == (entries[type])[idx].alt_addr ); + + } else { + + idx = (int32_t)((addr - base_addrs[type]) / entry_sizes[type]); + HDassert( ( idx >= 0 ) && ( idx <= max_indices[type] ) ); + HDassert( (entries[type])[idx].at_main_addr ); + HDassert( addr == (entries[type])[idx].main_addr ); + } + + HDassert( addr == (entries[type])[idx].addr ); + + *type_ptr = type; + *index_ptr = idx; + + return; + +} /* addr_to_type_and_index() */ + +/* Call back functions: */ + + +/*------------------------------------------------------------------------- + * + * Function: check_if_write_permitted + * + * Purpose: Determine if a write is permitted under the current + * circumstances, and set *write_permitted_ptr accordingly. + * As a general rule it is, but when we are running in parallel + * mode with collective I/O, we must ensure that a read cannot + * cause a write. + * + * In the event of failure, the value of *write_permitted_ptr + * is undefined. + * + * Return: Non-negative on success/Negative on failure. + * + * Programmer: John Mainzer, 5/15/04 + * + *------------------------------------------------------------------------- + */ + +herr_t +check_write_permitted(const H5F_t UNUSED * f, + hid_t UNUSED dxpl_id, + hbool_t * write_permitted_ptr) +{ + + HDassert( write_permitted_ptr ); + *write_permitted_ptr = write_permitted; + + return(SUCCEED); + +} /* check_write_permitted() */ + + +/*------------------------------------------------------------------------- + * Function: deserialize & friends + * + * Purpose: deserialize the entry. The helper functions verify that the + * correct version of deserialize is being called, and then call + * deserialize proper. + * + * Return: void * (pointer to the in core representation of the entry) + * + * Programmer: John Mainzer + * 9/20/07 + * + *------------------------------------------------------------------------- + */ + +static void * +deserialize(haddr_t addr, size_t len, const void * image_ptr, hbool_t * dirty_ptr) +{ + int32_t type; + int32_t idx; + test_entry_t * entry_ptr; + test_entry_t * base_addr; + + addr_to_type_and_index(addr, &type, &idx); + + base_addr = entries[type]; + entry_ptr = &(base_addr[idx]); + + HDassert( entry_ptr->type >= 0 ); + HDassert( entry_ptr->type < NUMBER_OF_ENTRY_TYPES ); + HDassert( entry_ptr->index == idx ); + HDassert( entry_ptr->index >= 0 ); + HDassert( entry_ptr->index <= max_indices[type] ); + HDassert( entry_ptr == entry_ptr->self ); + HDassert( entry_ptr->addr == addr ); + HDassert( entry_ptr->size == len ); + HDassert( ( entry_ptr->type == VARIABLE_ENTRY_TYPE ) || + ( entry_ptr->size == entry_sizes[type] ) ); + HDassert( dirty_ptr != NULL ); + + /* for now *dirty_ptr will always be FALSE */ + *dirty_ptr = FALSE; + + + /* verify that the image contains the expected data. */ + HDassert( image_ptr != NULL ); + if ( ( ( entry_ptr->at_main_addr ) + && + ( entry_ptr->written_to_main_addr ) + ) + || + ( ( ! ( entry_ptr->at_main_addr ) ) + && + ( entry_ptr->written_to_alt_addr ) + ) + ) { + + if ( ( type == PICO_ENTRY_TYPE ) || ( type == VARIABLE_ENTRY_TYPE ) ) { + + if ( (*((const char *)image_ptr)) != (char)(idx & 0xFF) ) { + + HDfprintf(stdout, "type = %d, idx = %d, addr = 0x%lx.\n", + type, idx, (long)addr); + HDfprintf(stdout, "*image_ptr = 0x%x\n", + (int)(*((const char *)image_ptr))); + HDfprintf(stdout, "expected *image_ptr = 0x%x\n", + (int)(idx & 0xFF)); + } + HDassert( (*((const char *)image_ptr)) == (char)(idx & 0xFF) ); + + } else { + + if ( (*(((const char *)image_ptr) + 2)) != (char)(idx & 0xFF) ) { + + HDfprintf(stdout, "type = %d, idx = %d, addr = 0x%lx.\n", + type, idx, (long)addr); + HDfprintf(stdout, "*image_ptr = 0x%x 0x%x 0x%x\n", + (int)(*((const char *)image_ptr)), + (int)(*(((const char *)image_ptr) + 1)), + (int)(*(((const char *)image_ptr) + 2))); + HDfprintf(stdout, "expected *image_ptr = 0x%x\n", + (int)(idx & 0xFF), + (int)((idx & 0xFF00)>>8)); + } + HDassert( (*((const char *)image_ptr)) == (char)(type & 0xFF) ); + HDassert( (*(((const char *)image_ptr) + 1)) == + (char)((idx & 0xFF00)>>8) ); + HDassert( (*(((const char *)image_ptr) + 2)) == + (char)(idx & 0xFF) ); + + } + } + + entry_ptr->deserialized = TRUE; + + entry_ptr->header.is_dirty = FALSE; + entry_ptr->is_dirty = FALSE; + + (entry_ptr->deserializes)++; + + return((void *)entry_ptr); + +} /* deserialize() */ + +void * +pico_deserialize(haddr_t addr, size_t len, const void * image_ptr, + const UNUSED void * udata_ptr, hbool_t * dirty_ptr) +{ + return deserialize(addr, len, image_ptr, dirty_ptr); +} + +void * +nano_deserialize(haddr_t addr, size_t len, const void * image_ptr, + const UNUSED void * udata_ptr, hbool_t * dirty_ptr) +{ + return deserialize(addr, len, image_ptr, dirty_ptr); +} + +void * +micro_deserialize(haddr_t addr, size_t len, const void * image_ptr, + const UNUSED void * udata_ptr, hbool_t * dirty_ptr) +{ + return deserialize(addr, len, image_ptr, dirty_ptr); +} + +void * +tiny_deserialize(haddr_t addr, size_t len, const void * image_ptr, + const UNUSED void * udata_ptr, hbool_t * dirty_ptr) +{ + return deserialize(addr, len, image_ptr, dirty_ptr); +} + +void * +small_deserialize(haddr_t addr, size_t len, const void * image_ptr, + const UNUSED void * udata_ptr, hbool_t * dirty_ptr) +{ + return deserialize(addr, len, image_ptr, dirty_ptr); +} + +void * +medium_deserialize(haddr_t addr, size_t len, const void * image_ptr, + const UNUSED void * udata_ptr, hbool_t * dirty_ptr) +{ + return deserialize(addr, len, image_ptr, dirty_ptr); +} + +void * +large_deserialize(haddr_t addr, size_t len, const void * image_ptr, + const UNUSED void * udata_ptr, hbool_t * dirty_ptr) +{ + return deserialize(addr, len, image_ptr, dirty_ptr); +} + +void * +huge_deserialize(haddr_t addr, size_t len, const void * image_ptr, + const UNUSED void * udata_ptr, hbool_t * dirty_ptr) +{ + return deserialize(addr, len, image_ptr, dirty_ptr); +} + +void * +monster_deserialize(haddr_t addr, size_t len, const void * image_ptr, + const UNUSED void * udata_ptr, hbool_t * dirty_ptr) +{ + return deserialize(addr, len, image_ptr, dirty_ptr); +} + +void * +variable_deserialize(haddr_t addr, size_t len, const void * image_ptr, + const UNUSED void * udata_ptr, hbool_t * dirty_ptr) +{ + return deserialize(addr, len, image_ptr, dirty_ptr); +} + + +/*------------------------------------------------------------------------- + * Function: image_len & friends + * + * Purpose: Return the real (and possibly reduced) length of the image. + * The helper functions verify that the correct version of + * deserialize is being called, and then call deserialize + * proper. + * + * Return: SUCCEED + * + * Programmer: John Mainzer + * 9/19/07 + * + *------------------------------------------------------------------------- + */ + +herr_t +image_len(void *thing, size_t *image_len_ptr) +{ + int32_t type; + int32_t idx; + test_entry_t * entry_ptr; + test_entry_t * base_addr; + + HDassert( thing ); + HDassert( image_len_ptr ); + + entry_ptr = (test_entry_t *)thing; + + HDassert( entry_ptr->self == entry_ptr ); + + type = entry_ptr->type; + idx = entry_ptr->index; + + HDassert( ( type >= 0 ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); + HDassert( ( idx >= 0 ) && ( idx <= max_indices[type] ) ); + + base_addr = entries[type]; + HDassert( entry_ptr == &(base_addr[idx]) ); + + if ( type != VARIABLE_ENTRY_TYPE ) { + + HDassert( entry_ptr->size == entry_sizes[type] ); + + } else { + + HDassert( entry_ptr->size <= entry_sizes[type] ); + HDassert( entry_ptr->size > 0 ); + } + + *image_len_ptr = entry_ptr->size; + + return(SUCCEED); + +} /* image_len() */ + + +herr_t +pico_image_len(void *thing, size_t *image_len_ptr) +{ + HDassert( ((test_entry_t *)thing)->type == PICO_ENTRY_TYPE ); + return(image_len(thing, image_len_ptr)); +} + +herr_t +nano_image_len(void *thing, size_t *image_len_ptr) +{ + HDassert( ((test_entry_t *)thing)->type == NANO_ENTRY_TYPE ); + return(image_len(thing, image_len_ptr)); +} + +herr_t +micro_image_len(void *thing, size_t *image_len_ptr) +{ + HDassert( ((test_entry_t *)thing)->type == MICRO_ENTRY_TYPE ); + return(image_len(thing, image_len_ptr)); +} + +herr_t +tiny_image_len(void *thing, size_t *image_len_ptr) +{ + HDassert( ((test_entry_t *)thing)->type == TINY_ENTRY_TYPE ); + return(image_len(thing, image_len_ptr)); +} + + +herr_t +small_image_len(void *thing, size_t *image_len_ptr) +{ + HDassert( ((test_entry_t *)thing)->type == SMALL_ENTRY_TYPE ); + return(image_len(thing, image_len_ptr)); +} + +herr_t +medium_image_len(void *thing, size_t *image_len_ptr) +{ + HDassert( ((test_entry_t *)thing)->type == MEDIUM_ENTRY_TYPE ); + return(image_len(thing, image_len_ptr)); +} + +herr_t +large_image_len(void *thing, size_t *image_len_ptr) +{ + HDassert( ((test_entry_t *)thing)->type == LARGE_ENTRY_TYPE ); + return(image_len(thing, image_len_ptr)); +} + +herr_t +huge_image_len(void *thing, size_t *image_len_ptr) +{ + HDassert( ((test_entry_t *)thing)->type == HUGE_ENTRY_TYPE ); + return(image_len(thing, image_len_ptr)); +} + +herr_t +monster_image_len(void *thing, size_t *image_len_ptr) +{ + HDassert( ((test_entry_t *)thing)->type == MONSTER_ENTRY_TYPE ); + return(image_len(thing, image_len_ptr)); +} + +herr_t +variable_image_len(void *thing, size_t *image_len_ptr) +{ + HDassert( ((test_entry_t *)thing)->type == VARIABLE_ENTRY_TYPE ); + return(image_len(thing, image_len_ptr)); +} + + +/*------------------------------------------------------------------------- + * Function: serialize & friends + * + * Purpose: Serialize the supplied entry. For now this consistes of + * loading the type and index of the entry into the first + * three bytes of the image (if it is long enough -- if not + * just load the low order byte of the index into the first + * byte of the image). + * + * The helper functions verify that the correct version of + * serialize is being called, and then call serialize + * proper. + * + * Return: SUCCEED if successful, FAIL otherwise. + * + * Programmer: John Mainzer + * 9/19/07 + * + *------------------------------------------------------------------------- + */ + +herr_t +serialize(haddr_t addr, size_t len, void * image_ptr, void * thing, + unsigned * flags_ptr, haddr_t * new_addr_ptr, size_t * new_len_ptr, + void ** new_image_ptr_ptr) +{ + const char * fcn_name = "serialize()"; + char * char_ptr; + hbool_t verbose = FALSE; + herr_t ret_val = SUCCEED; + int32_t i; + int32_t type; + int32_t idx; + test_entry_t * entry_ptr; + test_entry_t * base_addr; + + if ( verbose ) { + + HDfprintf(stdout, "%s: addr = 0x%lx, len = %ld.\n", fcn_name, + (long)addr, (long)len); + } + + HDassert( image_ptr ); + HDassert( thing ); + HDassert( flags_ptr ); + + *flags_ptr = 0; + + HDassert( new_addr_ptr ); + HDassert( new_len_ptr ); + HDassert( new_image_ptr_ptr ); + + entry_ptr = (test_entry_t *)thing; + + HDassert( entry_ptr->self == entry_ptr ); + HDassert( entry_ptr->addr == addr ); + HDassert( entry_ptr->size == len ); + + /* shouldn't serialize the entry unless it is dirty */ + HDassert( entry_ptr->is_dirty ); + + type = entry_ptr->type; + idx = entry_ptr->index; + + HDassert( ( type >= 0 ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); + HDassert( ( idx >= 0 ) && ( idx <= max_indices[type] ) ); + + base_addr = entries[type]; + + HDassert( entry_ptr == &(base_addr[idx]) ); + + HDassert( entry_ptr->num_flush_ops >= 0 ); + HDassert( entry_ptr->num_flush_ops < MAX_FLUSH_OPS ); + + if ( entry_ptr->num_flush_ops > 0 ) { + + for ( i = 0; i < entry_ptr->num_flush_ops; i++ ) + { + HDassert( entry_ptr->file_ptr ); + + execute_flush_op(entry_ptr->file_ptr, + entry_ptr, + &((entry_ptr->flush_ops)[i]), + flags_ptr); + } + entry_ptr->num_flush_ops = 0; + entry_ptr->flush_op_self_resize_in_progress = FALSE; + + /* This looks wrong, but it isn't -- *flags_ptr will be modified + * by execute_flush_op() only if the target is this entry -- + * and the flags set will accumulate over the set of calls in + * the for loop. + */ + + if ( ( pass ) && + ( ((*flags_ptr) & H5C__SERIALIZE_RESIZED_FLAG) != 0 ) ) { + + /* re-allocate *image_ptr, and place the new pointer in + * *new_image_ptr_ptr. + */ + image_ptr = H5MM_xfree(image_ptr); + + if ( image_ptr != NULL ) { + + ret_val = FAIL; + pass = FALSE; + failure_mssg = "couldn't free image_ptr."; + } + + if ( pass ) { + + HDassert( entry_ptr->type == VARIABLE_ENTRY_TYPE ); + HDassert( entry_ptr->size > 0 ); + HDassert( entry_ptr->size <= VARIABLE_ENTRY_SIZE ); + + image_ptr = H5MM_malloc((size_t)(entry_ptr->size)); + + if ( image_ptr == NULL ) { + + ret_val = FAIL; + pass = FALSE; + failure_mssg = "couldn't allocate new image."; + + } else { + + *new_image_ptr_ptr = image_ptr; + *new_len_ptr = entry_ptr->size; + len = entry_ptr->size; + + } + } + } + + if ( ((*flags_ptr) & H5C__SERIALIZE_RENAMED_FLAG) != 0 ) { + + HDassert( ((*flags_ptr) | H5C__SERIALIZE_RESIZED_FLAG) != 0 ); + + /* place the new address in *new_addr_ptr */ + + *new_addr_ptr = entry_ptr->addr; + } + } + + /* null out the image to avoid spurious failures */ + HDmemset(image_ptr, 0, len); + + if ( ( type == PICO_ENTRY_TYPE ) || ( type == VARIABLE_ENTRY_TYPE ) ) { + + HDassert( entry_ptr->size >= PICO_ENTRY_SIZE ); + *((char *)image_ptr) = (char)((entry_ptr->index) & 0xFF); + + } else { + + HDassert(entry_ptr->size >= NANO_ENTRY_SIZE ); + *((char *)image_ptr) = (char)((entry_ptr->type) & 0xFF); + *(((char *)image_ptr) + 1) = + (char)(((entry_ptr->index) & 0xFF00) >> 8); + *(((char *)image_ptr) + 2) = (char)((entry_ptr->index) & 0xFF); + + } + + /* We no longer do the actual write through an callback -- this is + * as close to that callback as we will get. Hence mark the entry + * clean here. If all goes well, it will be flushed shortly. + */ + + entry_ptr->is_dirty = FALSE; + + /* since the entry is about to be written to disk, we can mark it + * as initialized. + */ + if ( entry_ptr->at_main_addr ) { + entry_ptr->written_to_main_addr = TRUE; + } else { + entry_ptr->written_to_alt_addr = TRUE; + } + + /* do book keeping */ + (entry_ptr->serializes)++; + entry_ptr->serialized = TRUE; + + return(SUCCEED); + +} /* serialize() */ + +herr_t +pico_serialize(const H5F_t UNUSED *f, hid_t UNUSED dxpl_id, haddr_t addr, + size_t len, void * image_ptr, void * thing, unsigned * flags_ptr, + haddr_t * new_addr_ptr, size_t * new_len_ptr, void ** new_image_ptr_ptr) +{ + HDassert( ((test_entry_t *)thing)->type == PICO_ENTRY_TYPE ); + return(serialize(addr, len, image_ptr, thing, flags_ptr, + new_addr_ptr, new_len_ptr, new_image_ptr_ptr)); +} + +herr_t +nano_serialize(const H5F_t UNUSED *f, hid_t UNUSED dxpl_id, haddr_t addr, + size_t len, void * image_ptr, void * thing, unsigned * flags_ptr, + haddr_t * new_addr_ptr, size_t * new_len_ptr, void ** new_image_ptr_ptr) +{ + HDassert( ((test_entry_t *)thing)->type == NANO_ENTRY_TYPE ); + return(serialize(addr, len, image_ptr, thing, flags_ptr, + new_addr_ptr, new_len_ptr, new_image_ptr_ptr)); +} + +herr_t +micro_serialize(const H5F_t UNUSED *f, hid_t UNUSED dxpl_id, haddr_t addr, + size_t len, void * image_ptr, void * thing, unsigned * flags_ptr, + haddr_t * new_addr_ptr, size_t * new_len_ptr, void ** new_image_ptr_ptr) +{ + HDassert( ((test_entry_t *)thing)->type == MICRO_ENTRY_TYPE ); + return(serialize(addr, len, image_ptr, thing, flags_ptr, + new_addr_ptr, new_len_ptr, new_image_ptr_ptr)); +} + +herr_t +tiny_serialize(const H5F_t UNUSED *f, hid_t UNUSED dxpl_id, haddr_t addr, + size_t len, void * image_ptr, void * thing, unsigned * flags_ptr, + haddr_t * new_addr_ptr, size_t * new_len_ptr, void ** new_image_ptr_ptr) +{ + HDassert( ((test_entry_t *)thing)->type == TINY_ENTRY_TYPE ); + return(serialize(addr, len, image_ptr, thing, flags_ptr, + new_addr_ptr, new_len_ptr, new_image_ptr_ptr)); +} + +herr_t +small_serialize(const H5F_t UNUSED *f, hid_t UNUSED dxpl_id, haddr_t addr, + size_t len, void * image_ptr, void * thing, unsigned * flags_ptr, + haddr_t * new_addr_ptr, size_t * new_len_ptr, void ** new_image_ptr_ptr) +{ + HDassert( ((test_entry_t *)thing)->type == SMALL_ENTRY_TYPE ); + return(serialize(addr, len, image_ptr, thing, flags_ptr, + new_addr_ptr, new_len_ptr, new_image_ptr_ptr)); +} + +herr_t +medium_serialize(const H5F_t UNUSED *f, hid_t UNUSED dxpl_id, haddr_t addr, + size_t len, void * image_ptr, void * thing, unsigned * flags_ptr, + haddr_t * new_addr_ptr, size_t * new_len_ptr, void ** new_image_ptr_ptr) +{ + HDassert( ((test_entry_t *)thing)->type == MEDIUM_ENTRY_TYPE ); + return(serialize(addr, len, image_ptr, thing, flags_ptr, + new_addr_ptr, new_len_ptr, new_image_ptr_ptr)); +} + +herr_t +large_serialize(const H5F_t UNUSED *f, hid_t UNUSED dxpl_id, haddr_t addr, + size_t len, void * image_ptr, void * thing, unsigned * flags_ptr, + haddr_t * new_addr_ptr, size_t * new_len_ptr, void ** new_image_ptr_ptr) +{ + HDassert( ((test_entry_t *)thing)->type == LARGE_ENTRY_TYPE ); + return(serialize(addr, len, image_ptr, thing, flags_ptr, + new_addr_ptr, new_len_ptr, new_image_ptr_ptr)); +} + +herr_t +huge_serialize(const H5F_t UNUSED *f, hid_t UNUSED dxpl_id, haddr_t addr, + size_t len, void * image_ptr, void * thing, unsigned * flags_ptr, + haddr_t * new_addr_ptr, size_t * new_len_ptr, void ** new_image_ptr_ptr) +{ + HDassert( ((test_entry_t *)thing)->type == HUGE_ENTRY_TYPE ); + return(serialize(addr, len, image_ptr, thing, flags_ptr, + new_addr_ptr, new_len_ptr, new_image_ptr_ptr)); +} + +herr_t +monster_serialize(const H5F_t UNUSED *f, hid_t UNUSED dxpl_id, haddr_t addr, + size_t len, void * image_ptr, void * thing, unsigned * flags_ptr, + haddr_t * new_addr_ptr, size_t * new_len_ptr, void ** new_image_ptr_ptr) +{ + HDassert( ((test_entry_t *)thing)->type == MONSTER_ENTRY_TYPE ); + return(serialize(addr, len, image_ptr, thing, flags_ptr, + new_addr_ptr, new_len_ptr, new_image_ptr_ptr)); +} + +herr_t +variable_serialize(const H5F_t UNUSED *f, hid_t UNUSED dxpl_id, haddr_t addr, + size_t len, void * image_ptr, void * thing, unsigned * flags_ptr, + haddr_t * new_addr_ptr, size_t * new_len_ptr, void ** new_image_ptr_ptr) +{ + HDassert( ((test_entry_t *)thing)->type == VARIABLE_ENTRY_TYPE ); + return(serialize(addr, len, image_ptr, thing, flags_ptr, + new_addr_ptr, new_len_ptr, new_image_ptr_ptr)); +} + + +/*------------------------------------------------------------------------- + * Function: free_icr & friends + * + * Purpose: Nominally, this callback is supposed to free the + * in core representation of the entry. + * + * In the context of this test bed, we use it to do + * do all the processing we used to do on a destroy. + * In particular, we use it to release all the pins + * that this entry may have on other entries. + * + * The helper functions verify that the correct version of + * serialize is being called, and then call free_icr + * proper. + * + * Return: SUCCEED + * + * Programmer: John Mainzer + * 9/19/07 + * + *------------------------------------------------------------------------- + */ + +herr_t +free_icr(test_entry_t *entry_ptr) +{ + test_entry_t * base_addr; + + HDassert( entry_ptr ); + + base_addr = entries[entry_ptr->type]; + + HDassert( entry_ptr->index >= 0 ); + HDassert( entry_ptr->index <= max_indices[entry_ptr->type] ); + HDassert( entry_ptr == &(base_addr[entry_ptr->index]) ); + HDassert( entry_ptr == entry_ptr->self ); + HDassert( entry_ptr->cache_ptr != NULL ); + HDassert( entry_ptr->cache_ptr->magic == H5C__H5C_T_MAGIC ); + HDassert( ( entry_ptr->header.destroy_in_progress ) || + ( entry_ptr->header.addr == entry_ptr->addr ) ); + HDassert( entry_ptr->header.size == entry_ptr->size ); + HDassert( ( entry_ptr->type == VARIABLE_ENTRY_TYPE ) || + ( entry_ptr->size == entry_sizes[entry_ptr->type] ) ); + HDassert( !(entry_ptr->is_dirty) ); + HDassert( !(entry_ptr->header.is_dirty) ); + + if ( entry_ptr->num_pins > 0 ) { + int i; + + for ( i = 0; i < entry_ptr->num_pins; i++ ) { + test_entry_t * pinned_entry_ptr; + test_entry_t * pinned_base_addr; + + pinned_base_addr = entries[entry_ptr->pin_type[i]]; + pinned_entry_ptr = &(pinned_base_addr[entry_ptr->pin_idx[i]]); + + HDassert( 0 <= pinned_entry_ptr->type ); + HDassert( pinned_entry_ptr->type < NUMBER_OF_ENTRY_TYPES ); + HDassert( pinned_entry_ptr->type == entry_ptr->pin_type[i] ); + HDassert( pinned_entry_ptr->index >= 0 ); + HDassert( pinned_entry_ptr->index <= + max_indices[pinned_entry_ptr->type] ); + HDassert( pinned_entry_ptr->index == entry_ptr->pin_idx[i] ); + HDassert( pinned_entry_ptr == pinned_entry_ptr->self ); + HDassert( pinned_entry_ptr->header.is_pinned ); + HDassert( pinned_entry_ptr->is_pinned ); + HDassert( pinned_entry_ptr->pinning_ref_count > 0 ); + + pinned_entry_ptr->pinning_ref_count--; + + if ( pinned_entry_ptr->pinning_ref_count <= 0 ) { + + HDassert( pinned_entry_ptr->file_ptr ); + + unpin_entry(pinned_entry_ptr->file_ptr, + pinned_entry_ptr->type, + pinned_entry_ptr->index); + } + + entry_ptr->pin_type[i] = -1; + entry_ptr->pin_idx[i] = -1; + } + entry_ptr->num_pins = 0; + } + + entry_ptr->destroyed = TRUE; + entry_ptr->cache_ptr = NULL; + + return(SUCCEED); + +} /* free_icr() */ + +herr_t +pico_free_icr(haddr_t addr, size_t len, void * thing) +{ + test_entry_t * entry_ptr = (test_entry_t *)thing; + + HDassert( entry_ptr->addr == addr ); + HDassert( entry_ptr->size == len ); + HDassert( entry_ptr->type == PICO_ENTRY_TYPE ); + + return(free_icr(entry_ptr)); +} + +herr_t +nano_free_icr(haddr_t addr, size_t len, void * thing) +{ + test_entry_t * entry_ptr = (test_entry_t *)thing; + + HDassert( entry_ptr->addr == addr ); + HDassert( entry_ptr->size == len ); + HDassert( entry_ptr->type == NANO_ENTRY_TYPE ); + + return(free_icr(entry_ptr)); +} + +herr_t +micro_free_icr(haddr_t addr, size_t len, void * thing) +{ + test_entry_t * entry_ptr = (test_entry_t *)thing; + + HDassert( entry_ptr->addr == addr ); + HDassert( entry_ptr->size == len ); + HDassert( entry_ptr->type == MICRO_ENTRY_TYPE ); + + return(free_icr(entry_ptr)); +} + +herr_t +tiny_free_icr(haddr_t addr, size_t len, void * thing) +{ + test_entry_t * entry_ptr = (test_entry_t *)thing; + + HDassert( entry_ptr->addr == addr ); + HDassert( entry_ptr->size == len ); + HDassert( entry_ptr->type == TINY_ENTRY_TYPE ); + + return(free_icr(entry_ptr)); +} + +herr_t +small_free_icr(haddr_t addr, size_t len, void * thing) +{ + test_entry_t * entry_ptr = (test_entry_t *)thing; + + HDassert( entry_ptr->addr == addr ); + HDassert( entry_ptr->size == len ); + HDassert( entry_ptr->type == SMALL_ENTRY_TYPE ); + + return(free_icr(entry_ptr)); +} + +herr_t +medium_free_icr(haddr_t addr, size_t len, void * thing) +{ + test_entry_t * entry_ptr = (test_entry_t *)thing; + + HDassert( entry_ptr->addr == addr ); + HDassert( entry_ptr->size == len ); + HDassert( entry_ptr->type == MEDIUM_ENTRY_TYPE ); + + return(free_icr(entry_ptr)); +} + +herr_t +large_free_icr(haddr_t addr, size_t len, void * thing) +{ + test_entry_t * entry_ptr = (test_entry_t *)thing; + + HDassert( entry_ptr->addr == addr ); + HDassert( entry_ptr->size == len ); + HDassert( entry_ptr->type == LARGE_ENTRY_TYPE ); + + return(free_icr(entry_ptr)); +} + +herr_t +huge_free_icr(haddr_t addr, size_t len, void * thing) +{ + test_entry_t * entry_ptr = (test_entry_t *)thing; + + HDassert( entry_ptr->addr == addr ); + HDassert( entry_ptr->size == len ); + HDassert( entry_ptr->type == HUGE_ENTRY_TYPE ); + + return(free_icr(entry_ptr)); +} + +herr_t +monster_free_icr(haddr_t addr, size_t len, void * thing) +{ + test_entry_t * entry_ptr = (test_entry_t *)thing; + + HDassert( entry_ptr->addr == addr ); + HDassert( entry_ptr->size == len ); + HDassert( entry_ptr->type == MONSTER_ENTRY_TYPE ); + + return(free_icr(entry_ptr)); +} + +herr_t +variable_free_icr(haddr_t addr, size_t len, void * thing) +{ + test_entry_t * entry_ptr = (test_entry_t *)thing; + + HDassert( entry_ptr->addr == addr ); + HDassert( entry_ptr->size == len ); + HDassert( entry_ptr->type == VARIABLE_ENTRY_TYPE ); + + return(free_icr(entry_ptr)); +} + + +/*------------------------------------------------------------------------- + * Function: clear_dirty_bits & friends + * + * Purpose: Clear the dirty bits. The helper functions verify that the + * correct version of clear_dirty_gits is being called, and + * then call clear_dirty_bits() proper. + * + * Return: SUCCEED + * + * Programmer: John Mainzer + * 9/20/07 + * + *------------------------------------------------------------------------- + */ + +herr_t +clear_dirty_bits(test_entry_t * entry_ptr) +{ + test_entry_t * base_addr; + + HDassert( entry_ptr ); + + base_addr = entries[entry_ptr->type]; + + HDassert( entry_ptr->index >= 0 ); + HDassert( entry_ptr->index <= max_indices[entry_ptr->type] ); + HDassert( entry_ptr == &(base_addr[entry_ptr->index]) ); + HDassert( entry_ptr == entry_ptr->self ); + HDassert( entry_ptr->header.addr == entry_ptr->addr ); + HDassert( entry_ptr->header.size == entry_ptr->size ); + HDassert( ( entry_ptr->type == VARIABLE_ENTRY_TYPE ) || + ( entry_ptr->size == entry_sizes[entry_ptr->type] ) ); + + entry_ptr->is_dirty = FALSE; + + entry_ptr->cleared = TRUE; + + return(SUCCEED); + +} /* clear_dirty_bits() */ + +herr_t +pico_clear_dirty_bits(haddr_t addr, size_t len, void * thing) +{ + test_entry_t * entry_ptr = (test_entry_t *)thing; + + HDassert( entry_ptr->addr == addr ); + HDassert( entry_ptr->size == len ); + HDassert( entry_ptr->type == PICO_ENTRY_TYPE ); + + return(clear_dirty_bits(entry_ptr)); +} + +herr_t +nano_clear_dirty_bits(haddr_t addr, size_t len, void * thing) +{ + test_entry_t * entry_ptr = (test_entry_t *)thing; + + HDassert( entry_ptr->addr == addr ); + HDassert( entry_ptr->size == len ); + HDassert( entry_ptr->type == NANO_ENTRY_TYPE ); + + return(clear_dirty_bits(entry_ptr)); +} + +herr_t +micro_clear_dirty_bits(haddr_t addr, size_t len, void * thing) +{ + test_entry_t * entry_ptr = (test_entry_t *)thing; + + HDassert( entry_ptr->addr == addr ); + HDassert( entry_ptr->size == len ); + HDassert( entry_ptr->type == MICRO_ENTRY_TYPE ); + + return(clear_dirty_bits(entry_ptr)); +} + +herr_t +tiny_clear_dirty_bits(haddr_t addr, size_t len, void * thing) +{ + test_entry_t * entry_ptr = (test_entry_t *)thing; + + HDassert( entry_ptr->addr == addr ); + HDassert( entry_ptr->size == len ); + HDassert( entry_ptr->type == TINY_ENTRY_TYPE ); + + return(clear_dirty_bits(entry_ptr)); +} + +herr_t +small_clear_dirty_bits(haddr_t addr, size_t len, void * thing) +{ + test_entry_t * entry_ptr = (test_entry_t *)thing; + + HDassert( entry_ptr->addr == addr ); + HDassert( entry_ptr->size == len ); + HDassert( entry_ptr->type == SMALL_ENTRY_TYPE ); + + return(clear_dirty_bits(entry_ptr)); +} + +herr_t +medium_clear_dirty_bits(haddr_t addr, size_t len, void * thing) +{ + test_entry_t * entry_ptr = (test_entry_t *)thing; + + HDassert( entry_ptr->addr == addr ); + HDassert( entry_ptr->size == len ); + HDassert( entry_ptr->type == MEDIUM_ENTRY_TYPE ); + + return(clear_dirty_bits(entry_ptr)); +} + +herr_t +large_clear_dirty_bits(haddr_t addr, size_t len, void * thing) +{ + test_entry_t * entry_ptr = (test_entry_t *)thing; + + HDassert( entry_ptr->addr == addr ); + HDassert( entry_ptr->size == len ); + HDassert( entry_ptr->type == LARGE_ENTRY_TYPE ); + + return(clear_dirty_bits(entry_ptr)); +} + +herr_t +huge_clear_dirty_bits(haddr_t addr, size_t len, void * thing) +{ + test_entry_t * entry_ptr = (test_entry_t *)thing; + + HDassert( entry_ptr->addr == addr ); + HDassert( entry_ptr->size == len ); + HDassert( entry_ptr->type == HUGE_ENTRY_TYPE ); + + return(clear_dirty_bits(entry_ptr)); +} + +herr_t +monster_clear_dirty_bits(haddr_t addr, size_t len, void * thing) +{ + test_entry_t * entry_ptr = (test_entry_t *)thing; + + HDassert( entry_ptr->addr == addr ); + HDassert( entry_ptr->size == len ); + HDassert( entry_ptr->type == MONSTER_ENTRY_TYPE ); + + return(clear_dirty_bits(entry_ptr)); +} + +herr_t +variable_clear_dirty_bits(haddr_t addr, size_t len, void * thing) +{ + test_entry_t * entry_ptr = (test_entry_t *)thing; + + HDassert( entry_ptr->addr == addr ); + HDassert( entry_ptr->size == len ); + HDassert( entry_ptr->type == VARIABLE_ENTRY_TYPE ); + + return(clear_dirty_bits(entry_ptr)); +} + + +/**************************************************************************/ +/**************************************************************************/ +/************************** test utility functions: ***********************/ +/**************************************************************************/ +/**************************************************************************/ + +/*------------------------------------------------------------------------- + * Function: add_flush_op + * + * Purpose: Do nothing if pass is FALSE on entry. + * + * Otherwise, add the specified flush operation to the + * target instance of test_entry_t. + * + * Return: void + * + * Programmer: John Mainzer + * 9/1/06 + * + *------------------------------------------------------------------------- + */ + +void +add_flush_op(int target_type, + int target_idx, + int op_code, + int type, + int idx, + hbool_t flag, + size_t new_size) +{ + int i; + test_entry_t * target_base_addr; + test_entry_t * target_entry_ptr; + + HDassert( ( 0 <= target_type ) && ( target_type < NUMBER_OF_ENTRY_TYPES ) ); + HDassert( ( 0 <= target_idx ) && + ( target_idx <= max_indices[target_type] ) ); + HDassert( ( 0 <= op_code ) && ( op_code <= FLUSH_OP__MAX_OP ) ); + HDassert( ( op_code != FLUSH_OP__RESIZE ) || + ( type == VARIABLE_ENTRY_TYPE ) ); + HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); + HDassert( ( 0 <= idx ) && ( idx <= max_indices[type] ) ); + HDassert( ( flag == TRUE ) || ( flag == FALSE ) ); + HDassert( new_size <= VARIABLE_ENTRY_SIZE ); + + if ( pass ) { + + target_base_addr = entries[target_type]; + target_entry_ptr = &(target_base_addr[target_idx]); + + HDassert( target_entry_ptr->index == target_idx ); + HDassert( target_entry_ptr->type == target_type ); + HDassert( target_entry_ptr == target_entry_ptr->self ); + HDassert( target_entry_ptr->num_flush_ops < MAX_FLUSH_OPS ); + + i = (target_entry_ptr->num_flush_ops)++; + (target_entry_ptr->flush_ops)[i].op_code = op_code; + (target_entry_ptr->flush_ops)[i].type = type; + (target_entry_ptr->flush_ops)[i].idx = idx; + (target_entry_ptr->flush_ops)[i].flag = flag; + (target_entry_ptr->flush_ops)[i].size = new_size; + + } + + return; + +} /* add_flush_op() */ + + +/*------------------------------------------------------------------------- + * Function: create_pinned_entry_dependency + * + * Purpose: Do nothing if pass is FALSE on entry. + * + * Otherwise, set up a pinned entry dependency so we can + * test the pinned entry modifications to the flush routine. + * + * Given the types and indicies of the pinned and pinning + * entries, add the pinned entry to the list of pinned + * entries in the pinning entry, increment the + * pinning reference count of the pinned entry, and + * if that count was zero initially, pin the entry. + * + * Return: void + * + * Programmer: John Mainzer + * 6/10/04 + * + *------------------------------------------------------------------------- + */ + +void +create_pinned_entry_dependency(H5F_t * file_ptr, + int pinning_type, + int pinning_idx, + int pinned_type, + int pinned_idx) +{ + test_entry_t * pinning_base_addr; + test_entry_t * pinning_entry_ptr; + test_entry_t * pinned_base_addr; + test_entry_t * pinned_entry_ptr; + + if ( pass ) { + + HDassert( ( 0 <= pinning_type ) && + ( pinning_type < NUMBER_OF_ENTRY_TYPES ) ); + HDassert( ( 0 <= pinning_idx ) && + ( pinning_idx <= max_indices[pinning_type] ) ); + HDassert( ( 0 <= pinned_type ) && + ( pinned_type < NUMBER_OF_ENTRY_TYPES ) ); + HDassert( ( 0 <= pinned_idx ) && + ( pinned_idx <= max_indices[pinned_type] ) ); + + pinning_base_addr = entries[pinning_type]; + pinning_entry_ptr = &(pinning_base_addr[pinning_idx]); + + pinned_base_addr = entries[pinned_type]; + pinned_entry_ptr = &(pinned_base_addr[pinned_idx]); + + HDassert( pinning_entry_ptr->index == pinning_idx ); + HDassert( pinning_entry_ptr->type == pinning_type ); + HDassert( pinning_entry_ptr == pinning_entry_ptr->self ); + HDassert( pinning_entry_ptr->num_pins < MAX_PINS ); + + HDassert( pinning_entry_ptr->index == pinning_idx ); + HDassert( pinning_entry_ptr->type == pinning_type ); + HDassert( pinning_entry_ptr == pinning_entry_ptr->self ); + HDassert( ! ( pinning_entry_ptr->is_protected ) ); + + pinning_entry_ptr->pin_type[pinning_entry_ptr->num_pins] = pinned_type; + pinning_entry_ptr->pin_idx[pinning_entry_ptr->num_pins] = pinned_idx; + (pinning_entry_ptr->num_pins)++; + + if ( pinned_entry_ptr->pinning_ref_count == 0 ) { + + protect_entry(file_ptr, pinned_type, pinned_idx); + unprotect_entry(file_ptr, pinned_type, pinned_idx, FALSE, + H5C__PIN_ENTRY_FLAG); + } + + (pinned_entry_ptr->pinning_ref_count)++; + } + + return; + +} /* create_pinned_entry_dependency() */ + + +/*------------------------------------------------------------------------- + * Function: dirty_entry + * + * Purpose: Given a pointer to a cache, an entry type, and an index, + * dirty the target entry. + * + * If the dirty_pin parameter is true, verify that the + * target entry is in the cache and is pinned. If it + * isn't, scream and die. If it is, use the + * H5C_mark_pinned_entry_dirty() call to dirty it. + * + * Do nothing if pass is false on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 6/10/04 + * + *------------------------------------------------------------------------- + */ + +void +dirty_entry(H5F_t * file_ptr, + int32_t type, + int32_t idx, + hbool_t dirty_pin) +{ + H5C_t * cache_ptr; + test_entry_t * base_addr; + test_entry_t * entry_ptr; + + if ( pass ) { + + cache_ptr = file_ptr->shared->cache; + + HDassert( cache_ptr ); + HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); + HDassert( ( 0 <= idx ) && ( idx <= max_indices[type] ) ); + + if ( dirty_pin ) { + + if ( ! entry_in_cache(cache_ptr, type, idx) ) { + + pass = FALSE; + failure_mssg = "entry to be dirty pinned is not in cache."; + + } else { + + base_addr = entries[type]; + entry_ptr = &(base_addr[idx]); + + HDassert( entry_ptr->index == idx ); + HDassert( entry_ptr->type == type ); + HDassert( entry_ptr == entry_ptr->self ); + + if ( ! ( (entry_ptr->header).is_pinned ) ) { + + pass = FALSE; + failure_mssg = "entry to be dirty pinned is not pinned."; + + } else { + + mark_pinned_entry_dirty(file_ptr, type, idx, + FALSE, (size_t)0); + + } + } + } else { + + protect_entry(file_ptr, type, idx); + unprotect_entry(file_ptr, type, idx, TRUE, H5C__NO_FLAGS_SET); + } + } + + return; + +} /* dirty_entry() */ + + +/*------------------------------------------------------------------------- + * Function: execute_flush_op + * + * Purpose: Given a pointer to an instance of struct flush_op, execute + * it. + * + * Do nothing if pass is false on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 9/1/06 + * + *------------------------------------------------------------------------- + */ + +void +execute_flush_op(H5F_t * file_ptr, + struct test_entry_t * entry_ptr, + struct flush_op * op_ptr, + unsigned * flags_ptr) +{ + /* const char * fcn_name = "execute_flush_op()"; */ + H5C_t * cache_ptr; + + if ( pass ) { + + cache_ptr = file_ptr->shared->cache; + HDassert( cache_ptr != NULL ); + HDassert( cache_ptr->magic == H5C__H5C_T_MAGIC ); + HDassert( entry_ptr != NULL ); + HDassert( entry_ptr = entry_ptr->self ); + HDassert( entry_ptr->header.addr == entry_ptr->addr ); + HDassert( ( entry_ptr->flush_op_self_resize_in_progress ) || + ( entry_ptr->header.size == entry_ptr->size ) ); + HDassert( op_ptr != NULL ); + HDassert( ( 0 <= entry_ptr->type ) && + ( entry_ptr->type < NUMBER_OF_ENTRY_TYPES ) ); + HDassert( ( 0 <= entry_ptr->index ) && + ( entry_ptr->index <= max_indices[entry_ptr->type] ) ); + HDassert( ( 0 <= op_ptr->type ) && + ( op_ptr->type < NUMBER_OF_ENTRY_TYPES ) ); + HDassert( ( 0 <= op_ptr->idx ) && + ( op_ptr->idx <= max_indices[op_ptr->type] ) ); + HDassert( ( op_ptr->flag == FALSE ) || ( op_ptr->flag == TRUE ) ); + HDassert( flags_ptr != NULL ); + + switch ( op_ptr->op_code ) + { + case FLUSH_OP__NO_OP: + break; + + case FLUSH_OP__DIRTY: + HDassert( ( entry_ptr->type != op_ptr->type ) || + ( entry_ptr->index != op_ptr->idx ) ); + + dirty_entry(file_ptr, op_ptr->type, op_ptr->idx, + op_ptr->flag); + break; + + case FLUSH_OP__RESIZE: + if ( ( entry_ptr->type == op_ptr->type ) && + ( entry_ptr->index == op_ptr->idx ) ) { + + /* the flush operation is acting on the entry to + * which it is attached. Handle this here: + */ + HDassert( entry_ptr->type == VARIABLE_ENTRY_TYPE ); + HDassert( op_ptr->size > 0 ); + HDassert( op_ptr->size <= VARIABLE_ENTRY_SIZE ); + + entry_ptr->size = op_ptr->size; + + (*flags_ptr) |= H5C__SERIALIZE_RESIZED_FLAG; + + entry_ptr->flush_op_self_resize_in_progress = TRUE; + + } else { + + /* change the size of some other entry */ + + resize_entry(file_ptr, op_ptr->type, op_ptr->idx, + op_ptr->size, op_ptr->flag); + } + break; + + case FLUSH_OP__RENAME: + if ( ( entry_ptr->type == op_ptr->type ) && + ( entry_ptr->index == op_ptr->idx ) ) { + + /* the flush operation is acting on the entry to + * which it is attached. Handle this here: + */ + + HDassert( ((*flags_ptr) & H5C__SERIALIZE_RESIZED_FLAG) + != 0 ); + + (*flags_ptr) |= H5C__SERIALIZE_RENAMED_FLAG; + + if ( op_ptr->flag ) { + + HDassert( entry_ptr->addr == entry_ptr->alt_addr ); + entry_ptr->addr = entry_ptr->main_addr; + entry_ptr->at_main_addr = TRUE; + + } else { + + HDassert( entry_ptr->addr == entry_ptr->main_addr ); + entry_ptr->addr = entry_ptr->alt_addr; + entry_ptr->at_main_addr = FALSE; + + } + + } else { + + rename_entry(cache_ptr, op_ptr->type, op_ptr->idx, + op_ptr->flag); + } + break; + + default: + pass = FALSE; + failure_mssg = "Undefined flush op code."; + break; + } + } + + return; + +} /* execute_flush_op() */ + + +/*------------------------------------------------------------------------- + * Function: entry_in_cache + * + * Purpose: Given a pointer to a cache, an entry type, and an index, + * determine if the entry is currently in the cache. + * + * Return: TRUE if the entry is in the cache, and FALSE otherwise. + * + * Programmer: John Mainzer + * 6/10/04 + * + *------------------------------------------------------------------------- + */ + +hbool_t +entry_in_cache(H5C_t * cache_ptr, + int32_t type, + int32_t idx) +{ + hbool_t in_cache = FALSE; /* will set to TRUE if necessary */ + test_entry_t * base_addr; + test_entry_t * entry_ptr; + H5C_cache_entry_t * test_ptr = NULL; + + HDassert( cache_ptr ); + HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); + HDassert( ( 0 <= idx ) && ( idx <= max_indices[type] ) ); + + base_addr = entries[type]; + entry_ptr = &(base_addr[idx]); + + HDassert( entry_ptr->index == idx ); + HDassert( entry_ptr->type == type ); + HDassert( entry_ptr == entry_ptr->self ); + + H5C_TEST__SEARCH_INDEX(cache_ptr, entry_ptr->addr, test_ptr) + + if ( test_ptr != NULL ) { + + in_cache = TRUE; + HDassert( test_ptr == (H5C_cache_entry_t *)entry_ptr ); + HDassert( entry_ptr->addr == entry_ptr->header.addr ); + } + + return(in_cache); + +} /* entry_in_cache() */ + + +/*------------------------------------------------------------------------- + * Function: recommend_core_file_driver + * + * Purpose: Using the core file driver for test files allows us to avoid + * disk I/O, and thust offers the potential of speeding up + * tests. However, if the target system has insufficient + * physical memory to accomodate the test file, using the + * core file driver will actually slow the test down, as the + * target system will page fault continuously. + * + * The purpose of this function is to determine whether it + * makes sense to use the core file driver on this particular + * system. + * + * To do this, we need to determine a number of facts about + * the host system -- most particularly how much physical + * RAM it has. This information is not always available. + * If it is not, we assume the worst and report that using + * the core file driver would be ill advised. + * + * Return: TRUE If use of the core file driver seems a good idea. + * + * FALSE If available data on the host system suggests that + * user of the core file driver is ill advised, or + * if no information is available upon which to base + * a suggestion. + * + * Programmer: John Mainzer + * 1/13/09 + * + *------------------------------------------------------------------------- + */ + +hbool_t +recommend_core_file_driver(void) +{ + const char * fcn_name = "recommend_core_file_driver()"; + hbool_t core_file_driver_recomended = FALSE; + hbool_t verbose = FALSE; + unsigned long long free_ram = 0; + unsigned long long free_swap = 0; + unsigned long long physical_ram = 0; + + free_ram = H5_get_free_ram(); + free_swap = H5_get_free_swap(); + physical_ram = H5_get_physical_ram(); + + if ( ( physical_ram > ((((unsigned long long)MAX_ADDR) / 5) * 9) ) || + ( ( physical_ram > ((((unsigned long long)MAX_ADDR) / 2) * 3) ) && + ( ( ((unsigned long long)MAX_ADDR) < free_ram ) || + ( ((unsigned long long)MAX_ADDR) < free_swap ) ) ) ) { + + core_file_driver_recomended = TRUE; + } + + if ( verbose ) { + + HDfprintf(stdout, "%s: physical_ram = %lld\n", + fcn_name, (long long)physical_ram); + HDfprintf(stdout, "%s: free_ram = %lld\n", + fcn_name, (long long)free_ram); + HDfprintf(stdout, "%s: free_swap = %lld\n", + fcn_name, (long long)free_swap); + HDfprintf(stdout, "%s: MAX_ADDR = %lld\n", + fcn_name, (long long)MAX_ADDR); + HDfprintf(stdout, "%s: core_file_driver_recomended = %d\n", + fcn_name, (int)core_file_driver_recomended); + } + + return(core_file_driver_recomended); + +} /* recommend_core_file_driver() */ + + +/*------------------------------------------------------------------------- + * Function: reset_entries + * + * Purpose: reset the contents of the entries arrays to know values. + * + * Return: void + * + * Programmer: John Mainzer + * 6/10/04 + * + *------------------------------------------------------------------------- + */ + +void +reset_entries(void) + +{ + int i; + int j; + int k; + int32_t max_index; + haddr_t addr = PICO_BASE_ADDR; + haddr_t alt_addr = PICO_ALT_BASE_ADDR; + size_t entry_size; + test_entry_t * base_addr; + + for ( i = 0; i < NUMBER_OF_ENTRY_TYPES; i++ ) + { + entry_size = entry_sizes[i]; + max_index = max_indices[i]; + base_addr = entries[i]; + + HDassert( base_addr ); + + for ( j = 0; j <= max_index; j++ ) + { + /* one can argue that we should fill the header with garbage. + * If this is desired, we can simply comment out the header + * initialization - the headers will be full of garbage soon + * enough. + */ + + base_addr[j].header.addr = (haddr_t)0; + base_addr[j].header.size = (size_t)0; + base_addr[j].header.type = NULL; + base_addr[j].header.is_dirty = FALSE; + base_addr[j].header.is_protected = FALSE; + base_addr[j].header.is_read_only = FALSE; + base_addr[j].header.ro_ref_count = FALSE; + base_addr[j].header.next = NULL; + base_addr[j].header.prev = NULL; + base_addr[j].header.aux_next = NULL; + base_addr[j].header.aux_prev = NULL; + + base_addr[j].self = &(base_addr[j]); + base_addr[j].cache_ptr = NULL; + base_addr[j].written_to_main_addr = FALSE; + base_addr[j].written_to_alt_addr = FALSE; + base_addr[j].addr = addr; + base_addr[j].at_main_addr = TRUE; + base_addr[j].main_addr = addr; + base_addr[j].alt_addr = alt_addr; + base_addr[j].size = entry_size; + base_addr[j].type = i; + base_addr[j].index = j; + base_addr[j].serializes = 0; + base_addr[j].deserializes = 0; + base_addr[j].is_dirty = FALSE; + base_addr[j].is_protected = FALSE; + base_addr[j].is_read_only = FALSE; + base_addr[j].ro_ref_count = FALSE; + + base_addr[j].is_pinned = FALSE; + base_addr[j].pinning_ref_count = 0; + base_addr[j].num_pins = 0; + for ( k = 0; k < MAX_PINS; k++ ) + { + base_addr[j].pin_type[k] = -1; + base_addr[j].pin_idx[k] = -1; + } + + base_addr[j].num_flush_ops = 0; + for ( k = 0; k < MAX_FLUSH_OPS; k++ ) + { + base_addr[j].flush_ops[k].op_code = FLUSH_OP__NO_OP; + base_addr[j].flush_ops[k].type = -1; + base_addr[j].flush_ops[k].idx = -1; + base_addr[j].flush_ops[k].flag = FALSE; + base_addr[j].flush_ops[k].size = 0; + } + base_addr[j].flush_op_self_resize_in_progress = FALSE; + + base_addr[j].deserialized = FALSE; + base_addr[j].cleared = FALSE; + base_addr[j].serialized = FALSE; + base_addr[j].destroyed = FALSE; + + addr += (haddr_t)entry_size; + alt_addr += (haddr_t)entry_size; + } + } + + return; + +} /* reset_entries() */ + + +/*------------------------------------------------------------------------- + * Function: resize_entry + * + * Purpose: Given a pointer to a cache, an entry type, an index, and + * a size, set the size of the target entry to the size. Note + * that at present, the type of the entry must be + * VARIABLE_ENTRY_TYPE. + * + * If the resize_pin parameter is true, verify that the + * target entry is in the cache and is pinned. If it + * isn't, scream and die. If it is, use the + * H5C_mark_pinned_entry_dirty() call to resize it. + * + * Do nothing if pass is false on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 6/10/04 + * + *------------------------------------------------------------------------- + */ + +void +resize_entry(H5F_t * file_ptr, + int32_t type, + int32_t idx, + size_t new_size, + hbool_t resize_pin) +{ + H5C_t * cache_ptr; + test_entry_t * base_addr; + test_entry_t * entry_ptr; + + if ( pass ) { + + cache_ptr = file_ptr->shared->cache; + + HDassert( cache_ptr ); + HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); + HDassert( type == VARIABLE_ENTRY_TYPE ); + HDassert( ( 0 <= idx ) && ( idx <= max_indices[type] ) ); + HDassert( ( 0 < new_size ) && ( new_size <= entry_sizes[type] ) ); + + base_addr = entries[type]; + entry_ptr = &(base_addr[idx]); + + HDassert( entry_ptr->index == idx ); + HDassert( entry_ptr->type == type ); + HDassert( entry_ptr == entry_ptr->self ); + + if ( resize_pin ) { + + if ( ! entry_in_cache(cache_ptr, type, idx) ) { + + pass = FALSE; + failure_mssg = "entry to be resized pinned is not in cache."; + + } else { + + if ( ! ( (entry_ptr->header).is_pinned ) ) { + + pass = FALSE; + failure_mssg = "entry to be resized pinned is not pinned."; + + } else { + + mark_pinned_entry_dirty(file_ptr, type, idx, + TRUE, new_size); + } + } + } else { + + protect_entry(file_ptr, type, idx); + unprotect_entry_with_size_change(file_ptr, type, idx, + H5C__SIZE_CHANGED_FLAG, new_size); + } + } + + return; + +} /* resize_entry() */ + + +/*------------------------------------------------------------------------- + * Function: resize_pinned_entry + * + * Purpose: Given a pointer to a cache, an entry type, an index, and + * a new size, change the size of the target pinned entry + * to match the supplied new size. + * + * Do nothing if pass is false on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 1/11/08 + * + *------------------------------------------------------------------------- + */ + +void +resize_pinned_entry(H5F_t * file_ptr, + int32_t type, + int32_t idx, + size_t new_size) +{ + H5C_t * cache_ptr; + herr_t result; + test_entry_t * base_addr; + test_entry_t * entry_ptr; + + if ( pass ) { + + cache_ptr = file_ptr->shared->cache; + HDassert( cache_ptr ); + HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); + HDassert( ( 0 <= idx ) && ( idx <= max_indices[type] ) ); + HDassert( type == VARIABLE_ENTRY_TYPE ) ; + HDassert( ( 0 < new_size ) && ( new_size <= entry_sizes[type] ) ); + + if ( ! entry_in_cache(cache_ptr, type, idx) ) { + + pass = FALSE; + failure_mssg = "entry not in cache."; + + } else { + + base_addr = entries[type]; + entry_ptr = &(base_addr[idx]); + + HDassert( entry_ptr->index == idx ); + HDassert( entry_ptr->type == type ); + HDassert( entry_ptr->cache_ptr == cache_ptr ); + HDassert( entry_ptr == entry_ptr->self ); + + if ( ! ( (entry_ptr->header).is_pinned ) ) { + + pass = FALSE; + failure_mssg = "entry to be resized is not pinned."; + + } else { + + entry_ptr->size = new_size; + + result = H5C_resize_pinned_entry((void *)entry_ptr, + new_size); + entry_ptr->is_dirty = TRUE; + + if ( result != SUCCEED ) { + + pass = FALSE; + failure_mssg = "error(s) in H5C_resize_pinned_entry()."; + + } else { + + HDassert( entry_ptr->size = (entry_ptr->header).size ); + + } + } + } + } + + return; + +} /* resize_pinned_entry() */ + + +/*------------------------------------------------------------------------- + * Function: verify_clean + * + * Purpose: Verify that all cache entries are marked as clean. If any + * are not, set pass to FALSE. + * + * Do nothing if pass is FALSE on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 6/10/04 + * + *------------------------------------------------------------------------- + */ + +void +verify_clean(void) + +{ + int i; + int j; + int dirty_count = 0; + int32_t max_index; + test_entry_t * base_addr; + + if ( pass ) { + + for ( i = 0; i < NUMBER_OF_ENTRY_TYPES; i++ ) + { + max_index = max_indices[i]; + base_addr = entries[i]; + + HDassert( base_addr ); + + for ( j = 0; j <= max_index; j++ ) + { + if ( ( base_addr[j].header.is_dirty ) || + ( base_addr[j].is_dirty ) ) { + + dirty_count++; + } + } + } + + if ( dirty_count > 0 ) { + + pass = FALSE; + failure_mssg = "verify_clean() found dirty entry(s)."; + } + } + + return; + +} /* verify_clean() */ + + +/*------------------------------------------------------------------------- + * Function: verify_entry_status + * + * Purpose: Verify that a list of entries have the expected status. + * If any discrepencies are found, set the failure message + * and set pass to FALSE. + * + * Do nothing if pass is FALSE on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 10/8/04 + * + *------------------------------------------------------------------------- + */ + +void +verify_entry_status(H5C_t * cache_ptr, + int tag, + int num_entries, + struct expected_entry_status expected[]) +{ + static char msg[128]; + hbool_t in_cache = FALSE; /* will set to TRUE if necessary */ + int i; + test_entry_t * entry_ptr; + test_entry_t * base_addr; + + i = 0; + while ( ( pass ) && ( i < num_entries ) ) + { + base_addr = entries[expected[i].entry_type]; + entry_ptr = &(base_addr[expected[i].entry_index]); + + if ( ( ! expected[i].in_cache ) && + ( ( expected[i].is_dirty ) || + ( expected[i].is_protected ) || + ( expected[i].is_pinned ) ) ) { + + pass = FALSE; + sprintf(msg, "%d: Contradictory data in expected[%d].\n", tag, i); + failure_mssg = msg; + } + + if ( pass ) { + + in_cache = entry_in_cache(cache_ptr, expected[i].entry_type, + expected[i].entry_index); + + if ( in_cache != expected[i].in_cache ) { + + pass = FALSE; + sprintf(msg, + "%d entry (%d, %d) in cache actual/expected = %d/%d.\n", + tag, + (int)expected[i].entry_type, + (int)expected[i].entry_index, + (int)in_cache, + (int)expected[i].in_cache); + failure_mssg = msg; + } + } + + if ( pass ) { + + if ( entry_ptr->size != expected[i].size ) { + + pass = FALSE; + sprintf(msg, + "%d entry (%d, %d) size actualexpected = %ld/%ld.\n", + tag, + (int)expected[i].entry_type, + (int)expected[i].entry_index, + (long)(entry_ptr->size), + (long)expected[i].size); + failure_mssg = msg; + } + } + + if ( ( pass ) && ( in_cache ) ) { + + if ( entry_ptr->header.size != expected[i].size ) { + + pass = FALSE; + sprintf(msg, + "%d entry (%d, %d) header size actual/expected = %ld/%ld.\n", + tag, + (int)expected[i].entry_type, + (int)expected[i].entry_index, + (long)(entry_ptr->header.size), + (long)expected[i].size); + failure_mssg = msg; + } + } + + if ( pass ) { + + if ( entry_ptr->at_main_addr != expected[i].at_main_addr ) { + + pass = FALSE; + sprintf(msg, + "%d entry (%d, %d) at main addr actual/expected = %d/%d.\n", + tag, + (int)expected[i].entry_type, + (int)expected[i].entry_index, + (int)(entry_ptr->at_main_addr), + (int)expected[i].at_main_addr); + failure_mssg = msg; + } + } + + if ( pass ) { + + if ( entry_ptr->is_dirty != expected[i].is_dirty ) { + + pass = FALSE; + sprintf(msg, + "%d entry (%d, %d) is_dirty actual/expected = %d/%d.\n", + tag, + (int)expected[i].entry_type, + (int)expected[i].entry_index, + (int)(entry_ptr->is_dirty), + (int)expected[i].is_dirty); + failure_mssg = msg; + } + } + + if ( ( pass ) && ( in_cache ) ) { + + if ( entry_ptr->header.is_dirty != expected[i].is_dirty ) { + + pass = FALSE; + sprintf(msg, + "%d entry (%d, %d) header is_dirty actual/expected = %d/%d.\n", + tag, + (int)expected[i].entry_type, + (int)expected[i].entry_index, + (int)(entry_ptr->header.is_dirty), + (int)expected[i].is_dirty); + failure_mssg = msg; + } + } + + if ( pass ) { + + if ( entry_ptr->is_protected != expected[i].is_protected ) { + + pass = FALSE; + sprintf(msg, + "%d entry (%d, %d) is_protected actual/expected = %d/%d.\n", + tag, + (int)expected[i].entry_type, + (int)expected[i].entry_index, + (int)(entry_ptr->is_protected), + (int)expected[i].is_protected); + failure_mssg = msg; + } + } + + if ( ( pass ) && ( in_cache ) ) { + + if ( entry_ptr->header.is_protected != expected[i].is_protected ) { + + pass = FALSE; + sprintf(msg, + "%d entry (%d, %d) header is_protected actual/expected = %d/%d.\n", + tag, + (int)expected[i].entry_type, + (int)expected[i].entry_index, + (int)(entry_ptr->header.is_protected), + (int)expected[i].is_protected); + failure_mssg = msg; + } + } + + if ( pass ) { + + if ( entry_ptr->is_pinned != expected[i].is_pinned ) { + + pass = FALSE; + sprintf(msg, + "%d entry (%d, %d) is_pinned actual/expected = %d/%d.\n", + tag, + (int)expected[i].entry_type, + (int)expected[i].entry_index, + (int)(entry_ptr->is_pinned), + (int)expected[i].is_pinned); + failure_mssg = msg; + } + } + + if ( ( pass ) && ( in_cache ) ) { + + if ( entry_ptr->header.is_pinned != expected[i].is_pinned ) { + + pass = FALSE; + sprintf(msg, + "%d entry (%d, %d) header is_pinned actual/expected = %d/%d.\n", + tag, + (int)expected[i].entry_type, + (int)expected[i].entry_index, + (int)(entry_ptr->header.is_pinned), + (int)expected[i].is_pinned); + failure_mssg = msg; + } + } + + if ( pass ) { + + if ( ( entry_ptr->deserialized != expected[i].deserialized ) || + ( entry_ptr->cleared != expected[i].cleared ) || + ( entry_ptr->serialized != expected[i].serialized ) || + ( entry_ptr->destroyed != expected[i].destroyed ) ) { + + pass = FALSE; + sprintf(msg, + "%d entry (%d,%d) deserialized = %d(%d), clrd = %d(%d), serialized = %d(%d), dest = %d(%d)\n", + tag, + (int)expected[i].entry_type, + (int)expected[i].entry_index, + (int)(entry_ptr->deserialized), + (int)(expected[i].deserialized), + (int)(entry_ptr->cleared), + (int)(expected[i].cleared), + (int)(entry_ptr->serialized), + (int)(expected[i].serialized), + (int)(entry_ptr->destroyed), + (int)(expected[i].destroyed)); + failure_mssg = msg; + } + } + i++; + } /* while */ + + return; + +} /* verify_entry_status() */ + + +/*------------------------------------------------------------------------- + * Function: verify_unprotected + * + * Purpose: Verify that no cache entries are marked as protected. If + * any are, set pass to FALSE. + * + * Do nothing if pass is FALSE on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 6/10/04 + * + *------------------------------------------------------------------------- + */ + +void +verify_unprotected(void) + +{ + int i; + int j; + int protected_count = 0; + int32_t max_index; + test_entry_t * base_addr; + + if ( pass ) { + + for ( i = 0; i < NUMBER_OF_ENTRY_TYPES; i++ ) + { + max_index = max_indices[i]; + base_addr = entries[i]; + + HDassert( base_addr ); + + for ( j = 0; j <= max_index; j++ ) + { + HDassert( base_addr[j].header.is_protected == + base_addr[j].is_protected ); + + if ( ( base_addr[j].header.is_protected ) || + ( base_addr[j].is_protected ) ) { + + protected_count++; + } + } + } + + if ( protected_count > 0 ) { + + pass = FALSE; + failure_mssg = "verify_unprotected() found protected entry(s)."; + } + } + + return; + +} /* verify_unprotected() */ + + +/***************************************************************************** + * + * Function: setup_cache() + * + * Purpose: Open an HDF file. This will allocate an instance and + * initialize an associated instance of H5C_t. However, + * we want to test an instance of H5C_t, so allocate and + * initialize one with the file ID returned by the call to + * H5Fcreate(). Return a pointer to this instance of H5C_t. + * + * Observe that we open a HDF file because the cache now + * writes directly to file, and we need the file I/O facilities + * associated with the file. + * + * To avoid tripping on error check code, must allocate enough + * space in the file to hold all the test entries and their + * alternates. This is a little sticky, as the addresses of + * all the test entries are determined at compile time. + * + * Deal with this by choosing BASE_ADDR large enough that + * the base address of the allocate space will be less than + * or equal to BASE_ADDR, and then requesting an extra BASE_ADDR + * bytes, so we don't have to wory about exceeding the allocation. + * + * Return: Success: Ptr to H5C_t + * + * Failure: NULL + * + * Programmer: JRM -- 9/13/07 + * + *****************************************************************************/ + +H5F_t * +setup_cache(size_t max_cache_size, + size_t min_clean_size) +{ + const char * fcn_name = "setup_cache()"; + char filename[512]; + hbool_t show_progress = FALSE; + hbool_t verbose = TRUE; + int mile_stone = 1; + hid_t fid = -1; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + H5F_t * ret_val = NULL; + haddr_t actual_base_addr; + hid_t fapl_id = H5P_DEFAULT; + + if ( show_progress ) /* 1 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + saved_fid = -1; + +#if 0 /* This debugging code is useful from time to time -- keep it for now */ + HDfprintf(stdout, "PICO_BASE_ADDR = 0x%lx, PICO_ALT_BASE_ADDR = 0x%lx.\n", + (long)PICO_BASE_ADDR, (long)PICO_ALT_BASE_ADDR); + HDfprintf(stdout, "NANO_BASE_ADDR = 0x%lx, NANO_ALT_BASE_ADDR = 0x%lx.\n", + (long)NANO_BASE_ADDR, (long)NANO_ALT_BASE_ADDR); + HDfprintf(stdout, + "MICRO_BASE_ADDR = 0x%lx, MICRO_ALT_BASE_ADDR = 0x%lx.\n", + (long)MICRO_BASE_ADDR, (long)MICRO_ALT_BASE_ADDR); + HDfprintf(stdout, "TINY_BASE_ADDR = 0x%lx, TINY_ALT_BASE_ADDR = 0x%lx.\n", + (long)TINY_BASE_ADDR, (long)TINY_ALT_BASE_ADDR); + HDfprintf(stdout, + "SMALL_BASE_ADDR = 0x%lx, SMALL_ALT_BASE_ADDR = 0x%lx.\n", + (long)SMALL_BASE_ADDR, (long)SMALL_ALT_BASE_ADDR); + HDfprintf(stdout, + "MEDIUM_BASE_ADDR = 0x%lx, MEDIUM_ALT_BASE_ADDR = 0x%lx.\n", + (long)MEDIUM_BASE_ADDR, (long)MEDIUM_ALT_BASE_ADDR); + HDfprintf(stdout, + "LARGE_BASE_ADDR = 0x%lx, LARGE_ALT_BASE_ADDR = 0x%lx.\n", + (long)LARGE_BASE_ADDR, (long)LARGE_ALT_BASE_ADDR); + HDfprintf(stdout, "HUGE_BASE_ADDR = 0x%lx, HUGE_ALT_BASE_ADDR = 0x%lx.\n", + (long)HUGE_BASE_ADDR, (long)HUGE_ALT_BASE_ADDR); + HDfprintf(stdout, + "MONSTER_BASE_ADDR = 0x%lx, MONSTER_ALT_BASE_ADDR = 0x%lx.\n", + (long)MONSTER_BASE_ADDR, (long)MONSTER_ALT_BASE_ADDR); + HDfprintf(stdout, + "VARIABLE_BASE_ADDR = 0x%lx, VARIABLE_ALT_BASE_ADDR = 0x%lx.\n", + (long)VARIABLE_BASE_ADDR, (long)VARIABLE_ALT_BASE_ADDR); +#endif /* JRM */ + + /* setup the file name */ + if ( pass ) { + + if ( h5_fixname(FILENAME[0], H5P_DEFAULT, filename, sizeof(filename)) + == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed.\n"; + } + } + + if ( show_progress ) /* 2 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + if ( ( pass ) && ( try_core_file_driver ) ) { + + if ( (fapl_id = H5Pcreate(H5P_FILE_ACCESS)) == FAIL ) { + + pass = FALSE; + failure_mssg = "H5Pcreate(H5P_FILE_ACCESS) failed.\n"; + } + else if ( H5Pset_fapl_core(fapl_id, MAX_ADDR, FALSE) < 0 ) { + + H5Pclose(fapl_id); + fapl_id = H5P_DEFAULT; + pass = FALSE; + failure_mssg = "H5P_set_fapl_core() failed.\n"; + } + else if ( (fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id)) + < 0 ) { + + core_file_driver_failed = TRUE; + + if ( verbose ) { + HDfprintf(stdout, "%s: H5Fcreate() with CFD failed.\n", fcn_name); + } + + } else { + + saved_fapl_id = fapl_id; + } + } + + if ( show_progress ) /* 3 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + /* if we either aren't using the core file driver, or a create + * with the core file driver failed, try again with a regular file. + * If this fails, we are cooked. + */ + if ( ( pass ) && ( fid < 0 ) ) { + + fid = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id); + + saved_fid = fid; + + if ( fid < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fcreate() failed."; + + if ( verbose ) { + HDfprintf(stdout, "%s: H5Fcreate() failed.\n", fcn_name); + } + } + } + + if ( show_progress ) /* 4 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + if ( pass ) { + + HDassert( fid >= 0 ); + + saved_fid = fid; + + if ( H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fflush() failed."; + + if ( verbose ) { + HDfprintf(stdout, "%s: H5Fflush() failed.\n", fcn_name); + } + + } else { + + file_ptr = H5I_object_verify(fid, H5I_FILE); + + if ( file_ptr == NULL ) { + + pass = FALSE; + failure_mssg = "Can't get file_ptr."; + + if ( verbose ) { + HDfprintf(stdout, "%s: H5Fflush() failed.\n", fcn_name); + } + } + } + } + + if ( show_progress ) /* 5 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + if ( pass ) { + + /* A bit of fancy footwork here: + * + * The call to H5Fcreate() allocates an instance of H5C_t, + * initializes it, and stores its address in f->shared->cache. + * + * We don't want to use this cache, as it has a bunch of extra + * initialization that may change over time, and in any case + * it will not in general be configured the way we want it. + * + * We used to deal with this problem by storing the file pointer + * in another instance of H5C_t, and then ignoring the original + * version. However, this strategy doesn't work any more, as + * we can't store the file pointer in the instance of H5C_t, + * and we have modified many cache routines to use a file + * pointer to look up the target cache. + * + * Thus we now make note of the address of the instance of + * H5C_t created by the call to H5Fcreate(), set + * file_ptr->shared->cache to NULL, call H5C_create() + * to allocate a new instance of H5C_t for test purposes, + * and store than new instance's address in + * file_ptr->shared->cache. + * + * On shut down, we call H5C_dest on our instance of H5C_t, + * set file_ptr->shared->cache to point to the original + * instance, and then close the file normally. + */ + + HDassert( saved_cache == NULL ); + + saved_cache = file_ptr->shared->cache; + + file_ptr->shared->cache = NULL; + + cache_ptr = H5C_create(max_cache_size, + min_clean_size, + (NUMBER_OF_ENTRY_TYPES - 1), + (const char **)entry_type_names, + check_write_permitted, + TRUE, + NULL, + NULL); + + file_ptr->shared->cache = cache_ptr; + } + + if ( show_progress ) /* 6 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + if ( pass ) { + + if ( cache_ptr == NULL ) { + + pass = FALSE; + failure_mssg = "H5C_create() failed."; + + if ( verbose ) { + HDfprintf(stdout, "%s: H5C_create() failed.\n", fcn_name); + } + + } else if ( cache_ptr->magic != H5C__H5C_T_MAGIC ) { + + pass = FALSE; + failure_mssg = "Bad cache_ptr magic."; + + if ( verbose ) { + HDfprintf(stdout, "%s: Bad cache_ptr magic.\n", fcn_name); + } + } + } + + if ( show_progress ) /* 7 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + if ( pass ) { /* allocate space for test entries */ + + actual_base_addr = H5MF_alloc(file_ptr, H5FD_MEM_DEFAULT, H5P_DEFAULT, + (hsize_t)(ADDR_SPACE_SIZE + BASE_ADDR)); + + if ( actual_base_addr == HADDR_UNDEF ) { + + pass = FALSE; + failure_mssg = "H5MF_alloc() failed."; + + if ( verbose ) { + HDfprintf(stdout, "%s: H5MF_alloc() failed.\n", fcn_name); + } + + } else if ( actual_base_addr > BASE_ADDR ) { + + /* If this happens, must increase BASE_ADDR so that the + * actual_base_addr is <= BASE_ADDR. This should only happen + * if the size of the superblock is increase. + */ + pass = FALSE; + failure_mssg = "actual_base_addr > BASE_ADDR"; + + if ( verbose ) { + HDfprintf(stdout, "%s: actual_base_addr > BASE_ADDR.\n", + fcn_name); + } + } + + saved_actual_base_addr = actual_base_addr; + } + + if ( show_progress ) /* 8 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + if ( pass ) { + + H5C_stats__reset(cache_ptr); + ret_val = file_ptr; + } + + if ( show_progress ) /* 9 */ + HDfprintf(stdout, "%s() - %0d -- pass = %d\n", + fcn_name, mile_stone++, (int)pass); + + return(ret_val); + +} /* setup_cache() */ + + +/*------------------------------------------------------------------------- + * Function: takedown_cache() + * + * Purpose: Flush the specified cache and destroy it. If requested, + * dump stats first. Then close and delete the associate + * file. + * + * If pass is FALSE, do nothing. + * + * Return: void + * + * Programmer: John Mainzer + * 9/14/07 + * + *------------------------------------------------------------------------- + */ + +void +takedown_cache(H5F_t * file_ptr, + hbool_t dump_stats, + hbool_t dump_detailed_stats) +{ + char filename[512]; + + if ( file_ptr != NULL ) { + H5C_t * cache_ptr = file_ptr->shared->cache; + + if ( dump_stats ) { + + H5C_stats(cache_ptr, "test cache", dump_detailed_stats); + } + + flush_cache(file_ptr, TRUE, FALSE, FALSE); + + H5C_dest(file_ptr, H5P_DATASET_XFER_DEFAULT); + + if ( saved_cache != NULL ) { + + file_ptr->shared->cache = saved_cache; + saved_cache = NULL; + } + + if ( H5F_addr_defined(saved_actual_base_addr) ) { + + H5MF_xfree(file_ptr, H5FD_MEM_DEFAULT, H5P_DEFAULT, saved_actual_base_addr, + (hsize_t)(ADDR_SPACE_SIZE + BASE_ADDR)); + saved_actual_base_addr = HADDR_UNDEF; + } + } + + if ( saved_fapl_id != H5P_DEFAULT ) { + + H5Pclose(saved_fapl_id); + saved_fapl_id = H5P_DEFAULT; + } + + if ( saved_fid != -1 ) { + + if ( H5Fclose(saved_fid) < 0 ) { + + pass = FALSE; + failure_mssg = "couldn't close test file."; + + } else { + + saved_fid = -1; + + } + + if ( ( ! try_core_file_driver ) || ( core_file_driver_failed ) ) { + + if ( h5_fixname(FILENAME[0], H5P_DEFAULT, filename, sizeof(filename)) + == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed.\n"; + } + + if ( HDremove(filename) < 0 ) { + + pass = FALSE; + failure_mssg = "couldn't delete test file."; + + } + } + } + + return; + +} /* takedown_cache() */ + + +/*------------------------------------------------------------------------- + * Function: expunge_entry() + * + * Purpose: Expunge the entry indicated by the type and index. + * + * + * Return: void + * + * Programmer: John Mainzer + * 7/6/06 + * + *------------------------------------------------------------------------- + */ + +void +expunge_entry(H5F_t * file_ptr, + int32_t type, + int32_t idx) +{ + /* const char * fcn_name = "expunge_entry()"; */ + herr_t result; + test_entry_t * base_addr; + test_entry_t * entry_ptr; + + if ( pass ) { +#ifndef NDEBUG + H5C_t * cache_ptr = file_ptr->shared->cache; + + HDassert( cache_ptr ); +#endif /* NDEBUG */ + + HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); + HDassert( ( 0 <= idx ) && ( idx <= max_indices[type] ) ); + + base_addr = entries[type]; + entry_ptr = &(base_addr[idx]); + + HDassert( entry_ptr->index == idx ); + HDassert( entry_ptr->type == type ); + HDassert( entry_ptr == entry_ptr->self ); + HDassert( entry_ptr->cache_ptr == cache_ptr ); + HDassert( ! ( entry_ptr->header.is_protected ) ); + HDassert( ! ( entry_ptr->is_protected ) ); + HDassert( ! ( entry_ptr->header.is_pinned ) ); + HDassert( ! ( entry_ptr->is_pinned ) ); + + result = H5C_expunge_entry(file_ptr, H5P_DATASET_XFER_DEFAULT, + &(types[type]), + entry_ptr->addr); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "error in H5C_expunge_entry()."; + + } + } + + return; + +} /* expunge_entry() */ + + +/*------------------------------------------------------------------------- + * Function: flush_cache() + * + * Purpose: Flush the specified cache, destroying all entries if + requested. If requested, dump stats first. + * + * Return: void + * + * Programmer: John Mainzer + * 6/23/04 + * + *------------------------------------------------------------------------- + */ + +void +flush_cache(H5F_t * file_ptr, + hbool_t destroy_entries, + hbool_t dump_stats, + hbool_t dump_detailed_stats) +{ + const char * fcn_name = "flush_cache()"; + H5C_t * cache_ptr; + hbool_t show_progress = FALSE; + herr_t result = 0; + int mile_post = 0; + + if ( show_progress ) { + HDfprintf(stdout, "%s: mile_post = %d.\n", + fcn_name, mile_post++); /* 0 */ + } + + verify_unprotected(); + + if ( show_progress ) { + HDfprintf(stdout, "%s: mile_post = %d - %d.\n", + fcn_name, mile_post++, (int)pass); /* 1 */ + } + + if ( pass ) { + + HDassert(file_ptr); + + cache_ptr = file_ptr->shared->cache; + + if ( destroy_entries ) { + + result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, + H5C__FLUSH_INVALIDATE_FLAG); + + } else { + + result = H5C_flush_cache(file_ptr, H5P_DATASET_XFER_DEFAULT, + H5C__NO_FLAGS_SET); + } + } + + if ( show_progress ) { + HDfprintf(stdout, "%s: mile_post = %d - %d.\n", + fcn_name, mile_post++, (int)pass); /* 2 */ + } + + if ( dump_stats ) { + + H5C_stats(cache_ptr, "test cache", dump_detailed_stats); + } + + if ( show_progress ) { + HDfprintf(stdout, "%s: *mile_post = %d - %d.\n", + fcn_name, mile_post++, (int)pass); /* 3 */ + } + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "error in H5C_flush_cache()."; + } + + if ( show_progress ) { + HDfprintf(stdout, "%s: mile_post = %d - %d.\n", + fcn_name, mile_post++, (int)pass); /* 4 */ + } + + return; + +} /* flush_cache() */ + + +/*------------------------------------------------------------------------- + * Function: insert_entry() + * + * Purpose: Insert the entry indicated by the type and index. Mark + * it clean or dirty as indicated. + * + * Note that I don't see much practical use for inserting + * a clean entry, but the interface permits it so we should + * test it. + * + * Do nothing if pass is false. + * + * Return: void + * + * Programmer: John Mainzer + * 6/16/04 + * + *------------------------------------------------------------------------- + */ + +void +insert_entry(H5F_t * file_ptr, + int32_t type, + int32_t idx, + hbool_t UNUSED dirty, + unsigned int flags) +{ + H5C_t * cache_ptr; + herr_t result; + hbool_t insert_pinned; + test_entry_t * base_addr; + test_entry_t * entry_ptr; + + if ( pass ) { + + cache_ptr = file_ptr->shared->cache; + + HDassert( cache_ptr ); + HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); + HDassert( ( 0 <= idx ) && ( idx <= max_indices[type] ) ); + + base_addr = entries[type]; + entry_ptr = &(base_addr[idx]); + + HDassert( entry_ptr->index == idx ); + HDassert( entry_ptr->type == type ); + HDassert( entry_ptr == entry_ptr->self ); + HDassert( !(entry_ptr->is_protected) ); + + insert_pinned = ((flags & H5C__PIN_ENTRY_FLAG) != 0 ); + + entry_ptr->is_dirty = TRUE; + + result = H5C_insert_entry(file_ptr, H5P_DATASET_XFER_DEFAULT, + &(types[type]), entry_ptr->addr, + entry_ptr->size, (void *)entry_ptr, flags); + + if ( ( result < 0 ) || + ( entry_ptr->header.is_protected ) || + ( entry_ptr->header.type != &(types[type]) ) || + ( entry_ptr->size != entry_ptr->header.size ) || + ( entry_ptr->addr != entry_ptr->header.addr ) ) { + + pass = FALSE; + failure_mssg = "error in H5C_insert()."; + +#if 0 /* This is useful debugging code. Lets keep it around. */ + + HDfprintf(stdout, "result = %d\n", (int)result); + HDfprintf(stdout, "entry_ptr->header.is_protected = %d\n", + (int)(entry_ptr->header.is_protected)); + HDfprintf(stdout, + "entry_ptr->header.type != &(types[type]) = %d\n", + (int)(entry_ptr->header.type != &(types[type]))); + HDfprintf(stdout, + "entry_ptr->size != entry_ptr->header.size = %d\n", + (int)(entry_ptr->size != entry_ptr->header.size)); + HDfprintf(stdout, + "entry_ptr->addr != entry_ptr->header.addr = %d\n", + (int)(entry_ptr->addr != entry_ptr->header.addr)); +#endif + } + HDassert( entry_ptr->cache_ptr == NULL ); + + entry_ptr->file_ptr = file_ptr; + entry_ptr->cache_ptr = cache_ptr; + + if ( insert_pinned ) { + + HDassert( entry_ptr->header.is_pinned ); + entry_ptr->is_pinned = TRUE; + + } else { + + HDassert( ! ( entry_ptr->header.is_pinned ) ); + entry_ptr->is_pinned = FALSE; + + } + HDassert( entry_ptr->header.is_dirty ); + HDassert( ((entry_ptr->header).type)->id == type ); + } + + return; + +} /* insert_entry() */ + + +/*------------------------------------------------------------------------- + * Function: mark_pinned_entry_dirty() + * + * Purpose: Mark the specified entry as dirty. + * + * Do nothing if pass is FALSE on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 3/28/06 + * + *------------------------------------------------------------------------- + */ + +void +mark_pinned_entry_dirty(H5F_t * file_ptr, + int32_t type, + int32_t idx, + hbool_t size_changed, + size_t new_size) +{ +#ifndef NDEBUG + H5C_t * cache_ptr; +#endif /* NDEBUG */ + herr_t result; + test_entry_t * base_addr; + test_entry_t * entry_ptr; + + if ( pass ) { + +#ifndef NDEBUG + cache_ptr = file_ptr->shared->cache; +#endif /* NDEBUG */ + + HDassert( cache_ptr ); + HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); + HDassert( ( 0 <= idx ) && ( idx <= max_indices[type] ) ); + + base_addr = entries[type]; + entry_ptr = &(base_addr[idx]); + + HDassert( entry_ptr->index == idx ); + HDassert( entry_ptr->type == type ); + HDassert( entry_ptr == entry_ptr->self ); + HDassert( entry_ptr->cache_ptr == cache_ptr ); + HDassert( ! (entry_ptr->header.is_protected) ); + HDassert( entry_ptr->header.is_pinned ); + HDassert( entry_ptr->is_pinned ); + + entry_ptr->is_dirty = TRUE; + + if ( size_changed ) { + + /* update entry size now to keep the sanity checks happy */ + entry_ptr->size = new_size; + } + + result = H5C_mark_pinned_entry_dirty((void *)entry_ptr, + size_changed, + new_size); + + if ( ( result < 0 ) || + ( ! (entry_ptr->header.is_dirty) ) || + ( ! (entry_ptr->header.is_pinned) ) || + ( entry_ptr->header.type != &(types[type]) ) || + ( entry_ptr->size != entry_ptr->header.size ) || + ( entry_ptr->addr != entry_ptr->header.addr ) ) { + +#if 0 /* This is useful debugging code -- keep it around */ + HDfprintf(stdout, "result = %ld.\n", (long)result); + HDfprintf(stdout, "entry_ptr->header.is_dirty = %d.\n", + (int)(entry_ptr->header.is_dirty)); + HDfprintf(stdout, "entry_ptr->header.is_pinned = %d.\n", + (int)(entry_ptr->header.is_pinned)); + HDfprintf(stdout, + "(entry_ptr->header.type != &(types[type])) = %d.\n", + (int)(entry_ptr->header.type != &(types[type]))); + HDfprintf(stdout, + "entry_ptr->size = %ld, entry_ptr->header.size = %ld.\n", + (long)(entry_ptr->size), (long)(entry_ptr->header.size)); + HDfprintf(stdout, + "entry_ptr->addr = %ld, entry_ptr->header.addr = %ld.\n", + (long)(entry_ptr->addr), (long)(entry_ptr->header.addr)); +#endif + pass = FALSE; + failure_mssg = "error in H5C_mark_pinned_entry_dirty()."; + + } + + HDassert( ((entry_ptr->header).type)->id == type ); + + } + + return; + +} /* mark_pinned_entry_dirty() */ + + +/*------------------------------------------------------------------------- + * Function: mark_pinned_or_protected_entry_dirty() + * + * Purpose: Mark the specified entry as dirty. + * + * Do nothing if pass is FALSE on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 5/17/06 + * + *------------------------------------------------------------------------- + */ + +void +mark_pinned_or_protected_entry_dirty(H5F_t * file_ptr, + int32_t type, + int32_t idx) +{ +#ifndef NDEBUG + H5C_t * cache_ptr; +#endif /* NDEBUG */ + herr_t result; + test_entry_t * base_addr; + test_entry_t * entry_ptr; + + if ( pass ) { + +#ifndef NDEBUG + cache_ptr = file_ptr->shared->cache; +#endif /* NDEBUG */ + + HDassert( cache_ptr ); + HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); + HDassert( ( 0 <= idx ) && ( idx <= max_indices[type] ) ); + + base_addr = entries[type]; + entry_ptr = &(base_addr[idx]); + + HDassert( entry_ptr->index == idx ); + HDassert( entry_ptr->type == type ); + HDassert( entry_ptr == entry_ptr->self ); + HDassert( entry_ptr->cache_ptr == cache_ptr ); + HDassert( entry_ptr->header.is_protected || + entry_ptr->header.is_pinned ); + + entry_ptr->is_dirty = TRUE; + + result = H5C_mark_pinned_or_protected_entry_dirty((void *)entry_ptr); + + if ( ( result < 0 ) + || + ( ( ! (entry_ptr->header.is_protected) ) + && + ( ! (entry_ptr->header.is_pinned) ) + ) + || + ( ( entry_ptr->header.is_protected ) + && + ( ! ( entry_ptr->header.dirtied ) ) + ) + || + ( ( ! ( entry_ptr->header.is_protected ) ) + && + ( ! ( entry_ptr->header.is_dirty ) ) + ) + || + ( entry_ptr->header.type != &(types[type]) ) + || + ( entry_ptr->size != entry_ptr->header.size ) + || + ( entry_ptr->addr != entry_ptr->header.addr ) ) { + + pass = FALSE; + failure_mssg = + "error in H5C_mark_pinned_or_protected_entry_dirty()."; + + } + + HDassert( ((entry_ptr->header).type)->id == type ); + + } + + return; + +} /* mark_pinned_or_protected_entry_dirty() */ + + +/*------------------------------------------------------------------------- + * Function: rename_entry() + * + * Purpose: Rename the entry indicated by the type and index to its + * main or alternate address as indicated. If the entry is + * already at the desired entry, do nothing. + * + * Return: void + * + * Programmer: John Mainzer + * 6/21/04 + * + *------------------------------------------------------------------------- + */ + +void +rename_entry(H5C_t * cache_ptr, + int32_t type, + int32_t idx, + hbool_t main_addr) +{ + herr_t result; + hbool_t done = TRUE; /* will set to FALSE if we have work to do */ + haddr_t old_addr = HADDR_UNDEF; + haddr_t new_addr = HADDR_UNDEF; + test_entry_t * base_addr; + test_entry_t * entry_ptr; + + if ( pass ) { + + HDassert( cache_ptr ); + HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); + HDassert( ( 0 <= idx ) && ( idx <= max_indices[type] ) ); + + base_addr = entries[type]; + entry_ptr = &(base_addr[idx]); + + HDassert( entry_ptr->index == idx ); + HDassert( entry_ptr->type == type ); + HDassert( entry_ptr == entry_ptr->self ); + HDassert( entry_ptr->cache_ptr == cache_ptr ); + HDassert( !(entry_ptr->is_protected) ); + HDassert( !(entry_ptr->header.is_protected) ); + + + if ( entry_ptr->at_main_addr && !main_addr ) { + + /* rename to alt addr */ + + HDassert( entry_ptr->addr == entry_ptr->main_addr ); + + done = FALSE; + old_addr = entry_ptr->addr; + new_addr = entry_ptr->alt_addr; + + } else if ( !(entry_ptr->at_main_addr) && main_addr ) { + + /* rename to main addr */ + + HDassert( entry_ptr->addr == entry_ptr->alt_addr ); + + done = FALSE; + old_addr = entry_ptr->addr; + new_addr = entry_ptr->main_addr; + } + + if ( ! done ) { + + entry_ptr->is_dirty = TRUE; + + result = H5C_rename_entry(cache_ptr, &(types[type]), + old_addr, new_addr); + } + + if ( ! done ) { + + if ( ( result < 0 ) || + ( ( ! ( entry_ptr->header.destroy_in_progress ) ) && + ( entry_ptr->header.addr != new_addr ) ) ) { + + pass = FALSE; + failure_mssg = "error in H5C_rename_entry()."; + + } else { + + entry_ptr->addr = new_addr; + entry_ptr->at_main_addr = main_addr; + } + } + + HDassert( ((entry_ptr->header).type)->id == type ); + + HDassert( entry_ptr->header.is_dirty ); + HDassert( entry_ptr->is_dirty ); + } + + return; + +} /* rename_entry() */ + + +/*------------------------------------------------------------------------- + * Function: pin_protected_entry() + * + * Purpose: Pin the specified protected entry. + * + * Do nothing if pass is FALSE on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 5/17/06 + * + *------------------------------------------------------------------------- + */ + +void +pin_protected_entry(H5F_t * file_ptr, + int32_t type, + int32_t idx) +{ + /* const char * fcn_name = "pin_protected_entry()"; */ + herr_t result; + test_entry_t * base_addr; + test_entry_t * entry_ptr; + + if ( pass ) { +#ifndef NDEBUG + H5C_t * cache_ptr = file_ptr->shared->cache; +#endif /* NDEBUG */ + + HDassert( cache_ptr ); + HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); + HDassert( ( 0 <= idx ) && ( idx <= max_indices[type] ) ); + + base_addr = entries[type]; + entry_ptr = &(base_addr[idx]); + + HDassert( entry_ptr->index == idx ); + HDassert( entry_ptr->type == type ); + HDassert( entry_ptr == entry_ptr->self ); + HDassert( entry_ptr->cache_ptr == cache_ptr ); + HDassert( entry_ptr->header.is_protected ); + HDassert( ! entry_ptr->header.is_pinned ); + + result = H5C_pin_protected_entry((void *)entry_ptr); + + if ( ( result < 0 ) + || + ( ! (entry_ptr->header.is_protected) ) + || + ( ! (entry_ptr->header.is_pinned) ) + || + ( entry_ptr->header.type != &(types[type]) ) + || + ( entry_ptr->size != entry_ptr->header.size ) + || + ( entry_ptr->addr != entry_ptr->header.addr ) ) { + + pass = FALSE; + failure_mssg = + "error in H5C_pin_protected_entry()."; + + } + + entry_ptr->is_pinned = TRUE; + + HDassert( ((entry_ptr->header).type)->id == type ); + + } + + return; + +} /* pinned_protected_entry2() */ + + +/*------------------------------------------------------------------------- + * Function: protect_entry() + * + * Purpose: Protect the entry indicated by the type and index. + * + * Do nothing if pass is FALSE on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 6/11/04 + * + *------------------------------------------------------------------------- + */ + +void +protect_entry(H5F_t * file_ptr, + int32_t type, + int32_t idx) +{ + const char * fcn_name = "protect_entry()"; + H5C_t * cache_ptr; + hbool_t verbose = FALSE; + test_entry_t * base_addr; + test_entry_t * entry_ptr; + H5C_cache_entry_t * cache_entry_ptr; + + if ( verbose ) { + HDfprintf(stdout, "\n%s: entering. type = %d, idx = %d.\n", + fcn_name, type, idx); + } + + if ( pass ) { + + cache_ptr = file_ptr->shared->cache; + + HDassert( cache_ptr ); + HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); + HDassert( ( 0 <= idx ) && ( idx <= max_indices[type] ) ); + + base_addr = entries[type]; + entry_ptr = &(base_addr[idx]); + + HDassert( entry_ptr->index == idx ); + HDassert( entry_ptr->type == type ); + HDassert( entry_ptr == entry_ptr->self ); + HDassert( !(entry_ptr->is_protected) ); + + if ( verbose ) { + HDfprintf(stdout, + "%s: calling H5C_protect(). addr = 0x%lx, len = %ld.\n", + fcn_name, (long)(entry_ptr->addr), + (long)(entry_ptr->size)); + } + + cache_entry_ptr = H5C_protect(file_ptr, H5P_DATASET_XFER_DEFAULT, + &(types[type]), entry_ptr->addr, + entry_ptr->size, NULL, + H5C__NO_FLAGS_SET); + + if ( verbose ) { + HDfprintf(stdout, + "%s: H5C_protect() returns. addr = 0x%lx, len = %ld.\n", + fcn_name, (long)(entry_ptr->addr), + (long)(entry_ptr->size)); + } + + if ( ( cache_entry_ptr != (void *)entry_ptr ) || + ( !(entry_ptr->header.is_protected) ) || + ( entry_ptr->header.type != &(types[type]) ) || + ( entry_ptr->size != entry_ptr->header.size ) || + ( entry_ptr->addr != entry_ptr->header.addr ) ) { + +#if 0 + /* I've written the following debugging code several times + * now. Lets keep it around so I don't have to write it + * again. + * - JRM + */ + HDfprintf(stdout, "( cache_entry_ptr != (void *)entry_ptr ) = %d\n", + (int)( cache_entry_ptr != (void *)entry_ptr )); + HDfprintf(stdout, "cache_entry_ptr = 0x%lx, entry_ptr = 0x%lx\n", + (long)cache_entry_ptr, (long)entry_ptr); + HDfprintf(stdout, "entry_ptr->header.is_protected = %d\n", + (int)(entry_ptr->header.is_protected)); + HDfprintf(stdout, + "( entry_ptr->header.type != &(types[type]) ) = %d\n", + (int)( entry_ptr->header.type != &(types[type]) )); + HDfprintf(stdout, + "entry_ptr->size = %d, entry_ptr->header.size = %d\n", + (int)(entry_ptr->size), (int)(entry_ptr->header.size)); + HDfprintf(stdout, + "entry_ptr->addr = %d, entry_ptr->header.addr = %d\n", + (int)(entry_ptr->addr), (int)(entry_ptr->header.addr)); +#endif + pass = FALSE; + failure_mssg = "error in H5C_protect()."; + + } else { + + HDassert( ( entry_ptr->cache_ptr == NULL ) || + ( entry_ptr->cache_ptr == cache_ptr ) ); + + entry_ptr->cache_ptr = cache_ptr; + entry_ptr->file_ptr = file_ptr; + entry_ptr->is_protected = TRUE; + + } + + HDassert( ((entry_ptr->header).type)->id == type ); + } + + if ( verbose ) { + HDfprintf(stdout, "%s: exiting.\n", fcn_name); + } + + return; + +} /* protect_entry() */ + + +/*------------------------------------------------------------------------- + * Function: protect_entry_ro() + * + * Purpose: Do a read only protect the entry indicated by the type + * and index. + * + * Do nothing if pass is FALSE on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 4/1/07 + * + *------------------------------------------------------------------------- + */ + +void +protect_entry_ro(H5F_t * file_ptr, + int32_t type, + int32_t idx) +{ + H5C_t * cache_ptr; + test_entry_t * base_addr; + test_entry_t * entry_ptr; + H5C_cache_entry_t * cache_entry_ptr; + + if ( pass ) { + + cache_ptr = file_ptr->shared->cache; + + HDassert( cache_ptr ); + HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); + HDassert( ( 0 <= idx ) && ( idx <= max_indices[type] ) ); + + base_addr = entries[type]; + entry_ptr = &(base_addr[idx]); + + HDassert( entry_ptr->index == idx ); + HDassert( entry_ptr->type == type ); + HDassert( entry_ptr == entry_ptr->self ); + HDassert( ( ! ( entry_ptr->is_protected ) ) || + ( ( entry_ptr->is_read_only ) && + ( entry_ptr->ro_ref_count > 0 ) ) ); + + cache_entry_ptr = H5C_protect(file_ptr, H5P_DATASET_XFER_DEFAULT, + &(types[type]), entry_ptr->addr, + entry_ptr->size, NULL, + H5C__READ_ONLY_FLAG); + + if ( ( cache_entry_ptr != (void *)entry_ptr ) || + ( !(entry_ptr->header.is_protected) ) || + ( !(entry_ptr->header.is_read_only) ) || + ( entry_ptr->header.ro_ref_count <= 0 ) || + ( entry_ptr->header.type != &(types[type]) ) || + ( entry_ptr->size != entry_ptr->header.size ) || + ( entry_ptr->addr != entry_ptr->header.addr ) ) { + + pass = FALSE; + failure_mssg = "error in read only H5C_protect()."; + + } else { + + HDassert( ( entry_ptr->cache_ptr == NULL ) || + ( entry_ptr->cache_ptr == cache_ptr ) ); + + entry_ptr->cache_ptr = cache_ptr; + entry_ptr->file_ptr = file_ptr; + entry_ptr->is_protected = TRUE; + entry_ptr->is_read_only = TRUE; + entry_ptr->ro_ref_count++; + } + + HDassert( ((entry_ptr->header).type)->id == type ); + } + + return; + +} /* protect_entry_ro() */ + + +/*------------------------------------------------------------------------- + * Function: unpin_entry() + * + * Purpose: Unpin the entry indicated by the type and index. + * + * Do nothing if pass is FALSE on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 3/28/06 + * + *------------------------------------------------------------------------- + */ + +void +unpin_entry(H5F_t * file_ptr, + int32_t type, + int32_t idx) +{ + herr_t result; + test_entry_t * base_addr; + test_entry_t * entry_ptr; + + if ( pass ) { +#ifndef NDEBUG + H5C_t * cache_ptr; + + cache_ptr = file_ptr->shared->cache; + + HDassert( cache_ptr ); +#endif /* NDEBUG */ + HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); + HDassert( ( 0 <= idx ) && ( idx <= max_indices[type] ) ); + + base_addr = entries[type]; + entry_ptr = &(base_addr[idx]); + + HDassert( entry_ptr->index == idx ); + HDassert( entry_ptr->type == type ); + HDassert( entry_ptr == entry_ptr->self ); + HDassert( entry_ptr->cache_ptr == cache_ptr ); + HDassert( ! (entry_ptr->header.is_protected) ); + HDassert( entry_ptr->header.is_pinned ); + HDassert( entry_ptr->is_pinned ); + + result = H5C_unpin_entry(entry_ptr); + + if ( ( result < 0 ) || + ( entry_ptr->header.is_pinned ) || + ( entry_ptr->header.type != &(types[type]) ) || + ( entry_ptr->size != entry_ptr->header.size ) || + ( entry_ptr->addr != entry_ptr->header.addr ) ) { + + pass = FALSE; + failure_mssg = "error in H5C_unpin()."; + + } + + entry_ptr->is_pinned = FALSE; + + HDassert( ((entry_ptr->header).type)->id == type ); + + } + + return; + +} /* unpin_entry() */ + + +/*------------------------------------------------------------------------- + * Function: unprotect_entry() + * + * Purpose: Unprotect the entry indicated by the type and index. + * + * Do nothing if pass is FALSE on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 6/12/04 + * + *------------------------------------------------------------------------- + */ + +void +unprotect_entry(H5F_t * file_ptr, + int32_t type, + int32_t idx, + int dirty, + unsigned int flags) +{ + const char * fcn_name = "unprotect_entry()"; + herr_t result; + hbool_t verbose = FALSE; + hbool_t pin_flag_set; + hbool_t unpin_flag_set; + test_entry_t * base_addr; + test_entry_t * entry_ptr; + + if ( verbose ) { + HDfprintf(stdout, + "\n%s: entering. type = %d, idx = %d, dirty = %d, flags = %0x.\n", + fcn_name, type, idx, (int)dirty, (int)flags); + } + + if ( pass ) { +#ifndef NDEBUG + H5C_t * cache_ptr; + + cache_ptr = file_ptr->shared->cache; + + HDassert( cache_ptr ); +#endif /* NDEBUG */ + HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); + HDassert( ( 0 <= idx ) && ( idx <= max_indices[type] ) ); + + base_addr = entries[type]; + entry_ptr = &(base_addr[idx]); + + HDassert( entry_ptr->index == idx ); + HDassert( entry_ptr->type == type ); + HDassert( entry_ptr == entry_ptr->self ); + HDassert( entry_ptr->cache_ptr == cache_ptr ); + HDassert( entry_ptr->header.is_protected ); + HDassert( entry_ptr->is_protected ); + + pin_flag_set = ((flags & H5C__PIN_ENTRY_FLAG) != 0 ); + unpin_flag_set = ((flags & H5C__UNPIN_ENTRY_FLAG) != 0 ); + + HDassert ( ! ( pin_flag_set && unpin_flag_set ) ); + HDassert ( ( ! pin_flag_set ) || ( ! (entry_ptr->is_pinned) ) ); + HDassert ( ( ! unpin_flag_set ) || ( entry_ptr->is_pinned ) ); + + if ( ( dirty == TRUE ) || ( dirty == FALSE ) ) { + + flags |= (dirty ? H5C__DIRTIED_FLAG : H5C__NO_FLAGS_SET); + entry_ptr->is_dirty = (entry_ptr->is_dirty || dirty); + } + + if ( verbose ) { + HDfprintf(stdout, "%s: calling H5C_unprotect(). addr = 0X%lx.\n", + fcn_name, (long)(entry_ptr->addr)); + } + + result = H5C_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT, + &(types[type]), entry_ptr->addr, + (void *)entry_ptr, flags, (size_t)0); + + if ( verbose ) { + HDfprintf(stdout, "%s: H5C_unprotect() returns. addr = 0X%lx.\n", + fcn_name, (long)(entry_ptr->addr)); + } + + + if ( ( result < 0 ) || + ( ( entry_ptr->header.is_protected ) && + ( ( ! ( entry_ptr->is_read_only ) ) || + ( entry_ptr->ro_ref_count <= 0 ) ) ) || + ( entry_ptr->header.type != &(types[type]) ) || + ( entry_ptr->size != entry_ptr->header.size ) || + ( entry_ptr->addr != entry_ptr->header.addr ) ) { + + pass = FALSE; + failure_mssg = "error in H5C_unprotect()."; + + if ( verbose ) { + HDfprintf(stdout, "%s: error in H5C_unprotect():\n", fcn_name); + + if ( result < 0 ) + HDfprintf(stdout, " result = %d.\n", (int)result); + + if ( ( entry_ptr->header.is_protected ) && + ( ( ! ( entry_ptr->is_read_only ) ) || + ( entry_ptr->ro_ref_count <= 0 ) ) ) + HDfprintf(stdout, " R/O sanity check failed.\n"); + + if ( entry_ptr->header.type != &(types[type]) ) + HDfprintf(stdout, " Type mismatch.\n"); + + if ( entry_ptr->size != entry_ptr->header.size ) + HDfprintf(stdout, " size mismatch.\n"); + + if ( entry_ptr->addr != entry_ptr->header.addr ) + HDfprintf(stdout, " addr mismatch.\n"); + } + } + else + { + if ( entry_ptr->ro_ref_count > 1 ) { + + entry_ptr->ro_ref_count--; + + if ( verbose ) + HDfprintf(stdout, "%s: decremented ro ref count to %d.\n", + fcn_name, entry_ptr->ro_ref_count); + + } else if ( entry_ptr->ro_ref_count == 1 ) { + + entry_ptr->is_protected = FALSE; + entry_ptr->is_read_only = FALSE; + entry_ptr->ro_ref_count = 0; + + if ( verbose ) + HDfprintf(stdout, "%s: r/o unprotected.\n", fcn_name); + + } else { + + entry_ptr->is_protected = FALSE; + + if ( verbose ) + HDfprintf(stdout, "%s: r/w unprotected.\n", fcn_name); + + } + + if ( pin_flag_set ) { + + HDassert ( entry_ptr->header.is_pinned ); + entry_ptr->is_pinned = TRUE; + + } else if ( unpin_flag_set ) { + + HDassert ( ! ( entry_ptr->header.is_pinned ) ); + entry_ptr->is_pinned = FALSE; + + } + } + + HDassert( ((entry_ptr->header).type)->id == type ); + + if ( ( flags & H5C__DIRTIED_FLAG ) != 0 + && ( (flags & H5C__DELETED_FLAG) == 0 ) ) { + + HDassert( entry_ptr->header.is_dirty ); + HDassert( entry_ptr->is_dirty ); + } + + HDassert( entry_ptr->header.is_protected == entry_ptr->is_protected ); + HDassert( entry_ptr->header.is_read_only == entry_ptr->is_read_only ); + HDassert( entry_ptr->header.ro_ref_count == entry_ptr->ro_ref_count ); + } + + if ( verbose ) { + HDfprintf(stdout, "\n%s: exiting.\n", fcn_name); + } + + return; + +} /* unprotect_entry() */ + + +/*------------------------------------------------------------------------- + * Function: unprotect_entry_with_size_change() + * + * Purpose: Version of unprotect_entry() that allow access to the new + * size change parameters in H5C_unprotect_entry() + * + * At present, only the sizes of VARIABLE_ENTRY_TYPE entries + * can be changed. Thus this function will scream and die + * if the H5C__SIZE_CHANGED_FLAG is set and the type is not + * VARIABLE_ENTRY_TYPE. + * + * Do nothing if pass is FALSE on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 8/31/06 + * + *------------------------------------------------------------------------- + */ + +void +unprotect_entry_with_size_change(H5F_t * file_ptr, + int32_t type, + int32_t idx, + unsigned int flags, + size_t new_size) +{ + /* const char * fcn_name = "unprotect_entry_with_size_change()"; */ + herr_t result; + hbool_t dirty_flag_set; + hbool_t pin_flag_set; + hbool_t unpin_flag_set; + hbool_t size_changed_flag_set; + test_entry_t * base_addr; + test_entry_t * entry_ptr; + + if ( pass ) { +#ifndef NDEBUG + H5C_t * cache_ptr; + + cache_ptr = file_ptr->shared->cache; + + HDassert( cache_ptr ); +#endif /* NDEBUG */ + HDassert( ( 0 <= type ) && ( type < NUMBER_OF_ENTRY_TYPES ) ); + HDassert( ( 0 <= idx ) && ( idx <= max_indices[type] ) ); + HDassert( new_size <= entry_sizes[type] ); + + base_addr = entries[type]; + entry_ptr = &(base_addr[idx]); + + HDassert( entry_ptr->index == idx ); + HDassert( entry_ptr->type == type ); + HDassert( entry_ptr == entry_ptr->self ); + HDassert( entry_ptr->cache_ptr == cache_ptr ); + HDassert( entry_ptr->header.is_protected ); + HDassert( entry_ptr->is_protected ); + + dirty_flag_set = ((flags & H5C__DIRTIED_FLAG) != 0 ); + pin_flag_set = ((flags & H5C__PIN_ENTRY_FLAG) != 0 ); + unpin_flag_set = ((flags & H5C__UNPIN_ENTRY_FLAG) != 0 ); + size_changed_flag_set = ((flags & H5C__SIZE_CHANGED_FLAG) != 0 ); + + HDassert ( ! ( pin_flag_set && unpin_flag_set ) ); + HDassert ( ( ! pin_flag_set ) || ( ! (entry_ptr->is_pinned) ) ); + HDassert ( ( ! unpin_flag_set ) || ( entry_ptr->is_pinned ) ); + HDassert ( ( ! size_changed_flag_set ) || ( new_size > 0 ) ); + HDassert ( ( ! size_changed_flag_set ) || + ( type == VARIABLE_ENTRY_TYPE ) ); + + entry_ptr->is_dirty = (entry_ptr->is_dirty || dirty_flag_set); + + if ( size_changed_flag_set ) { + + entry_ptr->is_dirty = TRUE; + entry_ptr->size = new_size; + } + + result = H5C_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT, + &(types[type]), entry_ptr->addr, + (void *)entry_ptr, flags, new_size); + + if ( ( result < 0 ) || + ( entry_ptr->header.is_protected ) || + ( entry_ptr->header.type != &(types[type]) ) || + ( entry_ptr->size != entry_ptr->header.size ) || + ( entry_ptr->addr != entry_ptr->header.addr ) ) { + + pass = FALSE; + failure_mssg = "error in H5C_unprotect()."; + + } + else + { + entry_ptr->is_protected = FALSE; + + if ( pin_flag_set ) { + + HDassert ( entry_ptr->header.is_pinned ); + entry_ptr->is_pinned = TRUE; + + } else if ( unpin_flag_set ) { + + HDassert ( ! ( entry_ptr->header.is_pinned ) ); + entry_ptr->is_pinned = FALSE; + + } + } + + HDassert( ((entry_ptr->header).type)->id == type ); + + if ( ( flags & H5C__DIRTIED_FLAG ) != 0 + && ( (flags & H5C__DELETED_FLAG) == 0 ) ) { + + HDassert( entry_ptr->header.is_dirty ); + HDassert( entry_ptr->is_dirty ); + } + } + + return; + +} /* unprotect_entry_with_size_change() */ + + +/*------------------------------------------------------------------------- + * Function: row_major_scan_forward() + * + * Purpose: Do a sequence of inserts, protects, unprotects, renames, + * destroys while scanning through the set of entries. If + * pass is false on entry, do nothing. + * + * Return: void + * + * Programmer: John Mainzer + * 6/12/04 + * + *------------------------------------------------------------------------- + */ + +void +row_major_scan_forward(H5F_t * file_ptr, + int32_t max_index, + int32_t lag, + hbool_t verbose, + hbool_t reset_stats, + hbool_t display_stats, + hbool_t display_detailed_stats, + hbool_t do_inserts, + hbool_t dirty_inserts, + hbool_t do_renames, + hbool_t rename_to_main_addr, + hbool_t do_destroys, + hbool_t do_mult_ro_protects, + int dirty_destroys, + int dirty_unprotects) +{ + const char * fcn_name = "row_major_scan_forward"; + H5C_t * cache_ptr; + int32_t type = 0; + int32_t idx; + int32_t local_max_index; + + if ( verbose ) + HDfprintf(stdout, "%s(): entering.\n", fcn_name); + + if ( pass ) { + + cache_ptr = file_ptr->shared->cache; + + HDassert( cache_ptr != NULL ); + + HDassert( lag >= 10 ); + + if ( reset_stats ) { + + H5C_stats__reset(cache_ptr); + } + } + + while ( ( pass ) && ( type < NUMBER_OF_ENTRY_TYPES ) ) + { + idx = -lag; + + local_max_index = MIN(max_index, max_indices[type]); + + while ( ( pass ) && ( idx <= (local_max_index + lag) ) ) + { + if ( verbose ) { + + HDfprintf(stdout, "%d:%d: ", type, idx); + } + + if ( ( pass ) && ( do_inserts ) && ( (idx + lag) >= 0 ) && + ( (idx + lag) <= local_max_index ) && + ( ((idx + lag) % 2) == 0 ) && + ( ! entry_in_cache(cache_ptr, type, (idx + lag)) ) ) { + + if ( verbose ) + HDfprintf(stdout, "1(i, %d, %d) ", type, (idx + lag)); + + insert_entry(file_ptr, type, (idx + lag), dirty_inserts, + H5C__NO_FLAGS_SET); + } + + + if ( ( pass ) && ( (idx + lag - 1) >= 0 ) && + ( (idx + lag - 1) <= local_max_index ) && + ( ( (idx + lag - 1) % 3 ) == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "2(p, %d, %d) ", type, (idx + lag - 1)); + + protect_entry(file_ptr, type, (idx + lag - 1)); + } + + if ( ( pass ) && ( (idx + lag - 2) >= 0 ) && + ( (idx + lag - 2) <= local_max_index ) && + ( ( (idx + lag - 2) % 3 ) == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "3(u, %d, %d) ", type, (idx + lag - 2)); + + unprotect_entry(file_ptr, type, idx+lag-2, NO_CHANGE, + H5C__NO_FLAGS_SET); + } + + + if ( ( pass ) && ( do_renames ) && ( (idx + lag - 2) >= 0 ) && + ( (idx + lag - 2) <= local_max_index ) && + ( ( (idx + lag - 2) % 3 ) == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "4(r, %d, %d, %d) ", + type, (idx + lag - 2), (int)rename_to_main_addr); + + rename_entry(cache_ptr, type, (idx + lag - 2), + rename_to_main_addr); + } + + + if ( ( pass ) && ( (idx + lag - 3) >= 0 ) && + ( (idx + lag - 3) <= local_max_index ) && + ( ( (idx + lag - 3) % 5 ) == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "5(p, %d, %d) ", type, (idx + lag - 3)); + + protect_entry(file_ptr, type, (idx + lag - 3)); + } + + if ( ( pass ) && ( (idx + lag - 5) >= 0 ) && + ( (idx + lag - 5) <= local_max_index ) && + ( ( (idx + lag - 5) % 5 ) == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "6(u, %d, %d) ", type, (idx + lag - 5)); + + unprotect_entry(file_ptr, type, idx+lag-5, NO_CHANGE, + H5C__NO_FLAGS_SET); + } + + if ( do_mult_ro_protects ) + { + if ( ( pass ) && ( (idx + lag - 5) >= 0 ) && + ( (idx + lag - 5) < local_max_index ) && + ( (idx + lag - 5) % 9 == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "7(p-ro, %d, %d) ", type, + (idx + lag - 5)); + + protect_entry_ro(file_ptr, type, (idx + lag - 5)); + } + + if ( ( pass ) && ( (idx + lag - 6) >= 0 ) && + ( (idx + lag - 6) < local_max_index ) && + ( (idx + lag - 6) % 11 == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "8(p-ro, %d, %d) ", type, + (idx + lag - 6)); + + protect_entry_ro(file_ptr, type, (idx + lag - 6)); + } + + if ( ( pass ) && ( (idx + lag - 7) >= 0 ) && + ( (idx + lag - 7) < local_max_index ) && + ( (idx + lag - 7) % 13 == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "9(p-ro, %d, %d) ", type, + (idx + lag - 7)); + + protect_entry_ro(file_ptr, type, (idx + lag - 7)); + } + + if ( ( pass ) && ( (idx + lag - 7) >= 0 ) && + ( (idx + lag - 7) < local_max_index ) && + ( (idx + lag - 7) % 9 == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "10(u-ro, %d, %d) ", type, + (idx + lag - 7)); + + unprotect_entry(file_ptr, type, (idx + lag - 7), + FALSE, H5C__NO_FLAGS_SET); + } + + if ( ( pass ) && ( (idx + lag - 8) >= 0 ) && + ( (idx + lag - 8) < local_max_index ) && + ( (idx + lag - 8) % 11 == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "11(u-ro, %d, %d) ", type, + (idx + lag - 8)); + + unprotect_entry(file_ptr, type, (idx + lag - 8), + FALSE, H5C__NO_FLAGS_SET); + } + + if ( ( pass ) && ( (idx + lag - 9) >= 0 ) && + ( (idx + lag - 9) < local_max_index ) && + ( (idx + lag - 9) % 13 == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "12(u-ro, %d, %d) ", type, + (idx + lag - 9)); + + unprotect_entry(file_ptr, type, (idx + lag - 9), + FALSE, H5C__NO_FLAGS_SET); + } + } /* if ( do_mult_ro_protects ) */ + + if ( ( pass ) && ( idx >= 0 ) && ( idx <= local_max_index ) ) { + + if ( verbose ) + HDfprintf(stdout, "13(p, %d, %d) ", type, idx); + + protect_entry(file_ptr, type, idx); + } + + if ( ( pass ) && ( (idx - lag + 2) >= 0 ) && + ( (idx - lag + 2) <= local_max_index ) && + ( ( (idx - lag + 2) % 7 ) == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "14(u, %d, %d) ", type, (idx - lag + 2)); + + unprotect_entry(file_ptr, type, idx-lag+2, NO_CHANGE, + H5C__NO_FLAGS_SET); + } + + if ( ( pass ) && ( (idx - lag + 1) >= 0 ) && + ( (idx - lag + 1) <= local_max_index ) && + ( ( (idx - lag + 1) % 7 ) == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "15(p, %d, %d) ", type, (idx - lag + 1)); + + protect_entry(file_ptr, type, (idx - lag + 1)); + } + + + if ( do_destroys ) { + + if ( ( pass ) && ( (idx - lag) >= 0 ) && + ( ( idx - lag) <= local_max_index ) ) { + + switch ( (idx - lag) %4 ) { + + case 0: /* we just did an insert */ + + if ( verbose ) + HDfprintf(stdout, + "16(u, %d, %d) ", type, (idx - lag)); + + unprotect_entry(file_ptr, type, idx - lag, + NO_CHANGE, H5C__NO_FLAGS_SET); + break; + + case 1: + if ( (entries[type])[idx-lag].is_dirty ) { + + if ( verbose ) + HDfprintf(stdout, + "17(u, %d, %d) ", type, (idx - lag)); + + unprotect_entry(file_ptr, type, idx - lag, + NO_CHANGE, H5C__NO_FLAGS_SET); + } else { + + if ( verbose ) + HDfprintf(stdout, + "18(u, %d, %d) ", type, (idx - lag)); + + unprotect_entry(file_ptr, type, idx - lag, + dirty_unprotects, + H5C__NO_FLAGS_SET); + } + break; + + case 2: /* we just did an insrt */ + + if ( verbose ) + HDfprintf(stdout, + "19(u-del, %d, %d) ", type, (idx - lag)); + + unprotect_entry(file_ptr, type, idx - lag, + NO_CHANGE, H5C__DELETED_FLAG); + break; + + case 3: + if ( (entries[type])[idx-lag].is_dirty ) { + + if ( verbose ) + HDfprintf(stdout, + "20(u-del, %d, %d) ", + type, (idx - lag)); + + unprotect_entry(file_ptr, type, idx - lag, + NO_CHANGE, H5C__DELETED_FLAG); + } else { + + if ( verbose ) + HDfprintf(stdout, + "21(u-del, %d, %d) ", + type, (idx - lag)); + + unprotect_entry(file_ptr, type, idx - lag, + dirty_destroys, + H5C__DELETED_FLAG); + } + break; + + default: + HDassert(0); /* this can't happen... */ + break; + } + } + + } else { + + if ( ( pass ) && ( (idx - lag) >= 0 ) && + ( ( idx - lag) <= local_max_index ) ) { + + if ( verbose ) + HDfprintf(stdout, "22(u, %d, %d) ", type, (idx - lag)); + + unprotect_entry(file_ptr, type, idx - lag, + dirty_unprotects, H5C__NO_FLAGS_SET); + } + } + + if ( verbose ) + HDfprintf(stdout, "\n"); + + idx++; + } + type++; + } + + if ( ( pass ) && ( display_stats ) ) { + + H5C_stats(cache_ptr, "test cache", display_detailed_stats); + } + + return; + +} /* row_major_scan_forward() */ + + +/*------------------------------------------------------------------------- + * Function: hl_row_major_scan_forward() + * + * Purpose: Do a high locality sequence of inserts, protects, and + * unprotects while scanning through the set of entries. + * If pass is false on entry, do nothing. + * + * Return: void + * + * Programmer: John Mainzer + * 10/21/04 + * + *------------------------------------------------------------------------- + */ + +void +hl_row_major_scan_forward(H5F_t * file_ptr, + int32_t max_index, + hbool_t verbose, + hbool_t reset_stats, + hbool_t display_stats, + hbool_t display_detailed_stats, + hbool_t do_inserts, + hbool_t dirty_inserts) +{ + const char * fcn_name = "hl_row_major_scan_forward"; + H5C_t * cache_ptr; + int32_t type = 0; + int32_t idx; + int32_t i; + int32_t lag = 100; + int32_t local_max_index; + + if ( verbose ) + HDfprintf(stdout, "%s(): entering.\n", fcn_name); + + if ( pass ) { + + cache_ptr = file_ptr->shared->cache; + + HDassert( cache_ptr != NULL ); + HDassert( lag > 5 ); + HDassert( max_index >= 200 ); + HDassert( max_index <= MAX_ENTRIES ); + + if ( reset_stats ) { + + H5C_stats__reset(cache_ptr); + } + } + + while ( ( pass ) && ( type < NUMBER_OF_ENTRY_TYPES ) ) + { + idx = -lag; + + local_max_index = MIN(max_index, max_indices[type]); + + while ( ( pass ) && ( idx <= (local_max_index + lag) ) ) + { + if ( ( pass ) && ( do_inserts ) && ( (idx + lag) >= 0 ) && + ( (idx + lag) <= max_indices[type] ) && + ( ((idx + lag) % 2) == 0 ) && + ( ! entry_in_cache(cache_ptr, type, (idx + lag)) ) ) { + + if ( verbose ) + HDfprintf(stdout, "(i, %d, %d) ", type, (idx + lag)); + + insert_entry(file_ptr, type, (idx + lag), dirty_inserts, + H5C__NO_FLAGS_SET); + } + + i = idx; + + while ( ( pass ) && ( i >= idx - lag ) && ( i >= 0 ) ) + { + if ( ( pass ) && ( i >= 0 ) && ( i <= local_max_index ) ) { + + if ( verbose ) + HDfprintf(stdout, "(p, %d, %d) ", type, i); + + protect_entry(file_ptr, type, i); + + if ( verbose ) + HDfprintf(stdout, "(u, %d, %d) ", type, i); + + unprotect_entry(file_ptr, type, i, NO_CHANGE, + H5C__NO_FLAGS_SET); + } + i--; + } + + if ( verbose ) + HDfprintf(stdout, "\n"); + + idx++; + } + type++; + } + + if ( ( pass ) && ( display_stats ) ) { + + H5C_stats(cache_ptr, "test cache", display_detailed_stats); + } + + return; + +} /* hl_row_major_scan_forward() */ + + +/*------------------------------------------------------------------------- + * Function: row_major_scan_backward() + * + * Purpose: Do a sequence of inserts, protects, unprotects, renames, + * destroys while scanning backwards through the set of + * entries. If pass is false on entry, do nothing. + * + * Return: void + * + * Programmer: John Mainzer + * 6/12/04 + * + *------------------------------------------------------------------------- + */ + +void +row_major_scan_backward(H5F_t * file_ptr, + int32_t max_index, + int32_t lag, + hbool_t verbose, + hbool_t reset_stats, + hbool_t display_stats, + hbool_t display_detailed_stats, + hbool_t do_inserts, + hbool_t dirty_inserts, + hbool_t do_renames, + hbool_t rename_to_main_addr, + hbool_t do_destroys, + hbool_t do_mult_ro_protects, + int dirty_destroys, + int dirty_unprotects) +{ + const char * fcn_name = "row_major_scan_backward"; + H5C_t * cache_ptr; + int32_t type = NUMBER_OF_ENTRY_TYPES - 1; + int32_t idx; + int32_t local_max_index; + + if ( verbose ) + HDfprintf(stdout, "%s(): Entering.\n", fcn_name); + + if ( pass ) { + + cache_ptr = file_ptr->shared->cache; + + HDassert( cache_ptr != NULL ); + HDassert( lag >= 10 ); + + if ( reset_stats ) { + + H5C_stats__reset(cache_ptr); + } + } + + while ( ( pass ) && ( type >= 0 ) ) + { + local_max_index = MIN(max_index, max_indices[type]); + + /*idx = max_indices[type] + lag; */ + idx = local_max_index + lag; + + while ( ( pass ) && ( idx >= -lag ) ) + { + if ( ( pass ) && ( do_inserts ) && ( (idx - lag) >= 0 ) && + /*( (idx - lag) <= max_indices[type] ) && */ + ( (idx - lag) <= local_max_index ) && + ( ((idx - lag) % 2) == 1 ) && + ( ! entry_in_cache(cache_ptr, type, (idx - lag)) ) ) { + + if ( verbose ) + HDfprintf(stdout, "(i, %d, %d) ", type, (idx - lag)); + + insert_entry(file_ptr, type, (idx - lag), dirty_inserts, + H5C__NO_FLAGS_SET); + } + + + if ( ( pass ) && ( (idx - lag + 1) >= 0 ) && + /*( (idx - lag + 1) <= max_indices[type] ) && */ + ( (idx - lag + 1) <= local_max_index ) && + ( ( (idx - lag + 1) % 3 ) == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "(p, %d, %d) ", type, (idx - lag + 1)); + + protect_entry(file_ptr, type, (idx - lag + 1)); + } + + if ( ( pass ) && ( (idx - lag + 2) >= 0 ) && + /*( (idx - lag + 2) <= max_indices[type] ) && */ + ( (idx - lag + 2) <= local_max_index ) && + ( ( (idx - lag + 2) % 3 ) == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "(u, %d, %d) ", type, (idx - lag + 2)); + + unprotect_entry(file_ptr, type, idx-lag+2, NO_CHANGE, + H5C__NO_FLAGS_SET); + } + + + if ( ( pass ) && ( do_renames ) && ( (idx - lag + 2) >= 0 ) && + /*( (idx - lag + 2) <= max_indices[type] ) && */ + ( (idx - lag + 2) <= local_max_index ) && + ( ( (idx - lag + 2) % 3 ) == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "(r, %d, %d, %d) ", + type, (idx + lag + 2), (int)rename_to_main_addr); + + rename_entry(cache_ptr, type, (idx - lag + 2), + rename_to_main_addr); + } + + + if ( ( pass ) && ( (idx - lag + 3) >= 0 ) && + /*( (idx - lag + 3) <= max_indices[type] ) && */ + ( (idx - lag + 3) <= local_max_index ) && + ( ( (idx - lag + 3) % 5 ) == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "(p, %d, %d) ", type, (idx - lag + 3)); + + protect_entry(file_ptr, type, (idx - lag + 3)); + } + + if ( ( pass ) && ( (idx - lag + 5) >= 0 ) && + /*( (idx - lag + 5) <= max_indices[type] ) && */ + ( (idx - lag + 5) <= local_max_index ) && + ( ( (idx - lag + 5) % 5 ) == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "(u, %d, %d) ", type, (idx - lag + 5)); + + unprotect_entry(file_ptr, type, idx-lag+5, NO_CHANGE, + H5C__NO_FLAGS_SET); + } + + if ( do_mult_ro_protects ) + { + if ( ( pass ) && ( (idx - lag + 5) >= 0 ) && + /*( (idx - lag + 5) < max_indices[type] ) && */ + ( (idx - lag + 5) < local_max_index ) && + ( (idx - lag + 5) % 9 == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "(p-ro, %d, %d) ", type, + (idx - lag + 5)); + + protect_entry_ro(file_ptr, type, (idx - lag + 5)); + } + + if ( ( pass ) && ( (idx - lag + 6) >= 0 ) && + /*( (idx - lag + 6) < max_indices[type] ) && */ + ( (idx - lag + 6) < local_max_index ) && + ( (idx - lag + 6) % 11 == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "(p-ro, %d, %d) ", type, + (idx - lag + 6)); + + protect_entry_ro(file_ptr, type, (idx - lag + 6)); + } + + if ( ( pass ) && ( (idx - lag + 7) >= 0 ) && + /* ( (idx - lag + 7) < max_indices[type] ) && */ + ( (idx - lag + 7) < local_max_index ) && + ( (idx - lag + 7) % 13 == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "(p-ro, %d, %d) ", type, + (idx - lag + 7)); + + protect_entry_ro(file_ptr, type, (idx - lag + 7)); + } + + if ( ( pass ) && ( (idx - lag + 7) >= 0 ) && + /*( (idx - lag + 7) < max_indices[type] ) && */ + ( (idx - lag + 7) < local_max_index ) && + ( (idx - lag + 7) % 9 == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "(u-ro, %d, %d) ", type, + (idx - lag + 7)); + + unprotect_entry(file_ptr, type, (idx - lag + 7), + FALSE, H5C__NO_FLAGS_SET); + } + + if ( ( pass ) && ( (idx - lag + 8) >= 0 ) && + /*( (idx - lag + 8) < max_indices[type] ) && */ + ( (idx - lag + 8) < local_max_index ) && + ( (idx - lag + 8) % 11 == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "(u-ro, %d, %d) ", type, + (idx - lag + 8)); + + unprotect_entry(file_ptr, type, (idx - lag + 8), + FALSE, H5C__NO_FLAGS_SET); + } + + if ( ( pass ) && ( (idx - lag + 9) >= 0 ) && + /*( (idx - lag + 9) < max_indices[type] ) && */ + ( (idx - lag + 9) < local_max_index ) && + ( (idx - lag + 9) % 13 == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "(u-ro, %d, %d) ", type, + (idx - lag + 9)); + + unprotect_entry(file_ptr, type, (idx - lag + 9), + FALSE, H5C__NO_FLAGS_SET); + } + } /* if ( do_mult_ro_protects ) */ + + /*if ( ( pass ) && ( idx >= 0 ) && ( idx <= max_indices[type] ) ) { */ + if ( ( pass ) && ( idx >= 0 ) && ( idx <= local_max_index ) ) { + + if ( verbose ) + HDfprintf(stdout, "(p, %d, %d) ", type, idx); + + protect_entry(file_ptr, type, idx); + } + + + if ( ( pass ) && ( (idx + lag - 2) >= 0 ) && + /*( (idx + lag - 2) <= max_indices[type] ) && */ + ( (idx + lag - 2) <= local_max_index ) && + ( ( (idx + lag - 2) % 7 ) == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "(u, %d, %d) ", type, (idx + lag - 2)); + + unprotect_entry(file_ptr, type, idx+lag-2, NO_CHANGE, + H5C__NO_FLAGS_SET); + } + + if ( ( pass ) && ( (idx + lag - 1) >= 0 ) && + /*( (idx + lag - 1) <= max_indices[type] ) && */ + ( (idx + lag - 1) <= local_max_index ) && + ( ( (idx + lag - 1) % 7 ) == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "(p, %d, %d) ", type, (idx + lag - 1)); + + protect_entry(file_ptr, type, (idx + lag - 1)); + } + + + if ( do_destroys ) { + + if ( ( pass ) && ( (idx + lag) >= 0 ) && + /*( ( idx + lag) <= max_indices[type] ) ) { */ + ( ( idx + lag) <= local_max_index ) ) { + + switch ( (idx + lag) %4 ) { + + case 0: + if ( (entries[type])[idx+lag].is_dirty ) { + + unprotect_entry(file_ptr, type, idx + lag, + NO_CHANGE, H5C__NO_FLAGS_SET); + } else { + + unprotect_entry(file_ptr, type, idx + lag, + dirty_unprotects, + H5C__NO_FLAGS_SET); + } + break; + + case 1: /* we just did an insert */ + unprotect_entry(file_ptr, type, idx + lag, + NO_CHANGE, H5C__NO_FLAGS_SET); + break; + + case 2: + if ( (entries[type])[idx + lag].is_dirty ) { + + unprotect_entry(file_ptr, type, idx + lag, + NO_CHANGE, H5C__DELETED_FLAG); + } else { + + unprotect_entry(file_ptr, type, idx + lag, + dirty_destroys, + H5C__DELETED_FLAG); + } + break; + + case 3: /* we just did an insrt */ + unprotect_entry(file_ptr, type, idx + lag, + NO_CHANGE, H5C__DELETED_FLAG); + break; + + default: + HDassert(0); /* this can't happen... */ + break; + } + } + } else { + + if ( ( pass ) && ( (idx + lag) >= 0 ) && + /*( ( idx + lag) <= max_indices[type] ) ) { */ + ( ( idx + lag) <= local_max_index ) ) { + + if ( verbose ) + HDfprintf(stdout, "(u, %d, %d) ", type, (idx + lag)); + + unprotect_entry(file_ptr, type, idx + lag, + dirty_unprotects, H5C__NO_FLAGS_SET); + } + } + + if ( verbose ) + HDfprintf(stdout, "\n"); + + idx--; + } + type--; + } + + if ( ( pass ) && ( display_stats ) ) { + + H5C_stats(cache_ptr, "test cache", display_detailed_stats); + } + + return; + +} /* row_major_scan_backward() */ + + +/*------------------------------------------------------------------------- + * Function: hl_row_major_scan_backward() + * + * Purpose: Do a high locality sequence of inserts, protects, and + * unprotects while scanning through the set of entries. + * If pass is false on entry, do nothing. + * + * Return: void + * + * Programmer: John Mainzer + * 10/21/04 + * + *------------------------------------------------------------------------- + */ + +void +hl_row_major_scan_backward(H5F_t * file_ptr, + int32_t max_index, + hbool_t verbose, + hbool_t reset_stats, + hbool_t display_stats, + hbool_t display_detailed_stats, + hbool_t do_inserts, + hbool_t dirty_inserts) +{ + const char * fcn_name = "hl_row_major_scan_backward"; + H5C_t * cache_ptr; + int32_t type = NUMBER_OF_ENTRY_TYPES - 1; + int32_t idx; + int32_t i; + int32_t lag = 100; + int32_t local_max_index; + + if ( verbose ) + HDfprintf(stdout, "%s(): entering.\n", fcn_name); + + if ( pass ) { + + cache_ptr = file_ptr->shared->cache; + + HDassert( cache_ptr != NULL ); + HDassert( lag > 5 ); + HDassert( max_index >= 200 ); + HDassert( max_index <= MAX_ENTRIES ); + + if ( reset_stats ) { + + H5C_stats__reset(cache_ptr); + } + } + + while ( ( pass ) && ( type >= 0 ) ) + { + idx = max_indices[type] + lag; + + local_max_index = MIN(max_index, max_indices[type]); + + while ( ( pass ) && ( idx >= -lag ) ) + { + if ( ( pass ) && ( do_inserts ) && ( (idx + lag) >= 0 ) && + ( (idx + lag) <= local_max_index ) && + ( ((idx + lag) % 2) == 0 ) && + ( ! entry_in_cache(cache_ptr, type, (idx + lag)) ) ) { + + if ( verbose ) + HDfprintf(stdout, "(i, %d, %d) ", type, (idx + lag)); + + insert_entry(file_ptr, type, (idx + lag), dirty_inserts, + H5C__NO_FLAGS_SET); + } + + i = idx; + + while ( ( pass ) && ( i >= idx - lag ) && ( i >= 0 ) ) + { + if ( ( pass ) && ( i >= 0 ) && ( i <= local_max_index ) ) { + + if ( verbose ) + HDfprintf(stdout, "(p, %d, %d) ", type, i); + + protect_entry(file_ptr, type, i); + + if ( verbose ) + HDfprintf(stdout, "(u, %d, %d) ", type, i); + + unprotect_entry(file_ptr, type, i, NO_CHANGE, + H5C__NO_FLAGS_SET); + } + i--; + } + + if ( verbose ) + HDfprintf(stdout, "\n"); + + idx--; + } + type--; + } + + if ( ( pass ) && ( display_stats ) ) { + + H5C_stats(cache_ptr, "test cache", display_detailed_stats); + } + + return; + +} /* hl_row_major_scan_backward() */ + + +/*------------------------------------------------------------------------- + * Function: col_major_scan_forward() + * + * Purpose: Do a sequence of inserts, protects, and unprotects + * while scanning through the set of entries. If + * pass is false on entry, do nothing. + * + * Return: void + * + * Programmer: John Mainzer + * 6/23/04 + * + *------------------------------------------------------------------------- + */ + +void +col_major_scan_forward(H5F_t * file_ptr, + int32_t max_index, + int32_t lag, + hbool_t verbose, + hbool_t reset_stats, + hbool_t display_stats, + hbool_t display_detailed_stats, + hbool_t do_inserts, + hbool_t dirty_inserts, + int dirty_unprotects) +{ + const char * fcn_name = "col_major_scan_forward()"; + H5C_t * cache_ptr; + int i; + int32_t type = 0; + int32_t idx; + int32_t local_max_index[NUMBER_OF_ENTRY_TYPES]; + + if ( verbose ) + HDfprintf(stdout, "%s: entering.\n", fcn_name); + + if ( pass ) { + + cache_ptr = file_ptr->shared->cache; + + for ( i = 0; i < NUMBER_OF_ENTRY_TYPES; i++ ) + { + local_max_index[i] = MIN(max_index, max_indices[i]); + } + + HDassert( lag > 5 ); + + if ( reset_stats ) { + + H5C_stats__reset(cache_ptr); + } + } + + idx = -lag; + + while ( ( pass ) && ( (idx - lag) <= MAX_ENTRIES ) ) + { + type = 0; + + while ( ( pass ) && ( type < NUMBER_OF_ENTRY_TYPES ) ) + { + if ( ( pass ) && ( do_inserts ) && ( (idx + lag) >= 0 ) && + /*( (idx + lag) <= max_indices[type] ) && */ + ( (idx + lag) <= local_max_index[type] ) && + ( ((idx + lag) % 3) == 0 ) && + ( ! entry_in_cache(cache_ptr, type, (idx + lag)) ) ) { + + if ( verbose ) + HDfprintf(stdout, "(i, %d, %d) ", type, (idx + lag)); + + insert_entry(file_ptr, type, (idx + lag), dirty_inserts, + H5C__NO_FLAGS_SET); + } + + /*if ( ( pass ) && ( idx >= 0 ) && ( idx <= max_indices[type] ) ) { */ + if ( ( pass ) && + ( idx >= 0 ) && + ( idx <= local_max_index[type] ) ) { + + if ( verbose ) + HDfprintf(stdout, "(p, %d, %d) ", type, idx); + + protect_entry(file_ptr, type, idx); + } + + if ( ( pass ) && ( (idx - lag) >= 0 ) && + /*( (idx - lag) <= max_indices[type] ) ) { */ + ( (idx - lag) <= local_max_index[type] ) ) { + + if ( verbose ) + HDfprintf(stdout, "(u, %d, %d) ", type, (idx - lag)); + + unprotect_entry(file_ptr, type, idx - lag, + dirty_unprotects, H5C__NO_FLAGS_SET); + } + + if ( verbose ) + HDfprintf(stdout, "\n"); + + type++; + } + + idx++; + } + + if ( ( pass ) && ( display_stats ) ) { + + H5C_stats(cache_ptr, "test cache", display_detailed_stats); + } + + return; + +} /* col_major_scan_forward() */ + + +/*------------------------------------------------------------------------- + * Function: hl_col_major_scan_forward() + * + * Purpose: Do a high locality sequence of inserts, protects, and + * unprotects while scanning through the set of entries. If + * pass is false on entry, do nothing. + * + * Return: void + * + * Programmer: John Mainzer + * 19/25/04 + * + *------------------------------------------------------------------------- + */ + +void +hl_col_major_scan_forward(H5F_t * file_ptr, + int32_t max_index, + hbool_t verbose, + hbool_t reset_stats, + hbool_t display_stats, + hbool_t display_detailed_stats, + hbool_t do_inserts, + hbool_t dirty_inserts, + int dirty_unprotects) +{ + const char * fcn_name = "hl_col_major_scan_forward()"; + H5C_t * cache_ptr; + int32_t type = 0; + int32_t idx; + int32_t lag = 200; + int32_t i; + int32_t local_max_index; + + if ( verbose ) + HDfprintf(stdout, "%s: entering.\n", fcn_name); + + if ( pass ) { + + cache_ptr = file_ptr->shared->cache; + + HDassert( cache_ptr != NULL ); + HDassert( lag > 5 ); + HDassert( max_index >= 500 ); + HDassert( max_index <= MAX_ENTRIES ); + + if ( reset_stats ) { + + H5C_stats__reset(cache_ptr); + } + } + + idx = 0; + + local_max_index = MIN(max_index, MAX_ENTRIES); + + while ( ( pass ) && ( idx <= local_max_index ) ) + { + + i = idx; + + while ( ( pass ) && ( i >= 0 ) && ( i >= (idx - lag) ) ) { + + type = 0; + + while ( ( pass ) && ( type < NUMBER_OF_ENTRY_TYPES ) ) + { + if ( ( pass ) && ( do_inserts ) && ( i == idx ) && + ( i <= local_max_index ) && + ( (i % 3) == 0 ) && + ( ! entry_in_cache(cache_ptr, type, i) ) ) { + + if ( verbose ) + HDfprintf(stdout, "(i, %d, %d) ", type, i); + + insert_entry(file_ptr, type, i, dirty_inserts, + H5C__NO_FLAGS_SET); + } + + if ( ( pass ) && ( i >= 0 ) && ( i <= local_max_index ) ) { + + if ( verbose ) + HDfprintf(stdout, "(p, %d, %d) ", type, i); + + protect_entry(file_ptr, type, i); + } + + if ( ( pass ) && ( i >= 0 ) && + /*( i <= max_indices[type] ) ) { */ + ( i <= local_max_index ) ) { + + if ( verbose ) + HDfprintf(stdout, "(u, %d, %d) ", type, i); + + unprotect_entry(file_ptr, type, i, + dirty_unprotects, H5C__NO_FLAGS_SET); + } + + if ( verbose ) + HDfprintf(stdout, "\n"); + + type++; + } + + i--; + } + + idx++; + } + + if ( ( pass ) && ( display_stats ) ) { + + H5C_stats(cache_ptr, "test cache", display_detailed_stats); + } + + return; + +} /* hl_col_major_scan_forward() */ + + +/*------------------------------------------------------------------------- + * Function: col_major_scan_backward() + * + * Purpose: Do a sequence of inserts, protects, and unprotects + * while scanning backwards through the set of + * entries. If pass is false on entry, do nothing. + * + * Return: void + * + * Programmer: John Mainzer + * 6/23/04 + * + *------------------------------------------------------------------------- + */ + +void +col_major_scan_backward(H5F_t * file_ptr, + int32_t max_index, + int32_t lag, + hbool_t verbose, + hbool_t reset_stats, + hbool_t display_stats, + hbool_t display_detailed_stats, + hbool_t do_inserts, + hbool_t dirty_inserts, + int dirty_unprotects) +{ + const char * fcn_name = "col_major_scan_backward()"; + H5C_t * cache_ptr; + int i; + int mile_stone = 1; + int32_t type; + int32_t idx; + int32_t local_max_index[NUMBER_OF_ENTRY_TYPES]; + + if ( verbose ) + HDfprintf(stdout, "%s: entering.\n", fcn_name); + + if ( pass ) { + + cache_ptr = file_ptr->shared->cache; + + HDassert( cache_ptr != NULL ); + + for ( i = 0; i < NUMBER_OF_ENTRY_TYPES; i++ ) + { + local_max_index[i] = MIN(max_index, max_indices[i]); + } + + HDassert( lag > 5 ); + + if ( reset_stats ) { + + H5C_stats__reset(cache_ptr); + } + } + + /* idx = MAX_ENTRIES + lag; */ + idx = local_max_index[NUMBER_OF_ENTRY_TYPES - 1] + lag; + + if ( verbose ) /* 1 */ + HDfprintf(stdout, "%s: point %d.\n", fcn_name, mile_stone++); + + + while ( ( pass ) && ( (idx + lag) >= 0 ) ) + { + type = NUMBER_OF_ENTRY_TYPES - 1; + + while ( ( pass ) && ( type >= 0 ) ) + { + if ( ( pass ) && ( do_inserts) && ( (idx - lag) >= 0 ) && + /*( (idx - lag) <= max_indices[type] ) && */ + ( (idx - lag) <= local_max_index[type] ) && + ( ((idx - lag) % 3) == 0 ) && + ( ! entry_in_cache(cache_ptr, type, (idx - lag)) ) ) { + + if ( verbose ) + HDfprintf(stdout, "(i, %d, %d) ", type, (idx - lag)); + + insert_entry(file_ptr, type, (idx - lag), dirty_inserts, + H5C__NO_FLAGS_SET); + } + + /*if ( ( pass ) && ( idx >= 0 ) && ( idx <= max_indices[type] ) ) { */ + if ( ( pass ) && + ( idx >= 0 ) && + ( idx <= local_max_index[type] ) ) { + + if ( verbose ) + HDfprintf(stdout, "(p, %d, %d) ", type, idx); + + protect_entry(file_ptr, type, idx); + } + + if ( ( pass ) && ( (idx + lag) >= 0 ) && + /*( (idx + lag) <= max_indices[type] ) ) { */ + ( (idx + lag) <= local_max_index[type] ) ) { + + if ( verbose ) + HDfprintf(stdout, "(u, %d, %d) ", type, (idx + lag)); + + unprotect_entry(file_ptr, type, idx + lag, + dirty_unprotects, H5C__NO_FLAGS_SET); + } + + if ( verbose ) + HDfprintf(stdout, "\n"); + + type--; + } + + idx--; + } + + if ( verbose ) /* 2 */ + HDfprintf(stdout, "%s: point %d.\n", fcn_name, mile_stone++); + + if ( ( pass ) && ( display_stats ) ) { + + H5C_stats(cache_ptr, "test cache", display_detailed_stats); + } + + if ( verbose ) + HDfprintf(stdout, "%s: exiting.\n", fcn_name); + + return; + +} /* col_major_scan_backward() */ + + +/*------------------------------------------------------------------------- + * Function: hl_col_major_scan_backward() + * + * Purpose: Do a high locality sequence of inserts, protects, and + * unprotects while scanning backwards through the set of + * entries. If pass is false on entry, do nothing. + * + * Return: void + * + * Programmer: John Mainzer + * 10/25/04 + * + *------------------------------------------------------------------------- + */ + +void +hl_col_major_scan_backward(H5F_t * file_ptr, + int32_t max_index, + hbool_t verbose, + hbool_t reset_stats, + hbool_t display_stats, + hbool_t display_detailed_stats, + hbool_t do_inserts, + hbool_t dirty_inserts, + int dirty_unprotects) +{ + const char * fcn_name = "hl_col_major_scan_backward()"; + H5C_t * cache_ptr; + int32_t type = 0; + int32_t idx; + int32_t lag = 50; + int32_t i; + int32_t local_max_index; + + if ( verbose ) + HDfprintf(stdout, "%s: entering.\n", fcn_name); + + if ( pass ) { + + cache_ptr = file_ptr->shared->cache; + + HDassert( cache_ptr != NULL ); + HDassert( lag > 5 ); + HDassert( max_index >= 500 ); + HDassert( max_index <= MAX_ENTRIES ); + + local_max_index = MIN(max_index, MAX_ENTRIES); + + if ( reset_stats ) { + + H5C_stats__reset(cache_ptr); + } + + idx = local_max_index; + } + + while ( ( pass ) && ( idx >= 0 ) ) + { + + i = idx; + + while ( ( pass ) && ( i <= local_max_index ) && ( i <= (idx + lag) ) ) { + + type = 0; + + while ( ( pass ) && ( type < NUMBER_OF_ENTRY_TYPES ) ) + { + if ( ( pass ) && ( do_inserts ) && ( i == idx ) && + ( i <= local_max_index ) && + ( ! entry_in_cache(cache_ptr, type, i) ) ) { + + if ( verbose ) + HDfprintf(stdout, "(i, %d, %d) ", type, i); + + insert_entry(file_ptr, type, i, dirty_inserts, + H5C__NO_FLAGS_SET); + } + + if ( ( pass ) && ( i >= 0 ) && ( i <= local_max_index ) ) { + + if ( verbose ) + HDfprintf(stdout, "(p, %d, %d) ", type, i); + + protect_entry(file_ptr, type, i); + } + + if ( ( pass ) && ( i >= 0 ) && + ( i <= local_max_index ) ) { + + if ( verbose ) + HDfprintf(stdout, "(u, %d, %d) ", type, i); + + unprotect_entry(file_ptr, type, i, + dirty_unprotects, H5C__NO_FLAGS_SET); + } + + if ( verbose ) + HDfprintf(stdout, "\n"); + + type++; + } + + i++; + } + + idx--; + } + + if ( ( pass ) && ( display_stats ) ) { + + H5C_stats(cache_ptr, "test cache", display_detailed_stats); + } + + return; + +} /* hl_col_major_scan_backward() */ + + +/*** H5AC level utility functions ***/ + +/*------------------------------------------------------------------------- + * Function: check_and_validate_cache_hit_rate() + * + * Purpose: Use the API functions to get and reset the cache hit rate. + * Verify that the value returned by the API call agrees with + * the cache internal data structures. + * + * If the number of cache accesses exceeds the value provided + * in the min_accesses parameter, and the hit rate is less than + * min_hit_rate, set pass to FALSE, and set failure_mssg to + * a string indicating that hit rate was unexpectedly low. + * + * Return hit rate in *hit_rate_ptr, and print the data to + * stdout if requested. + * + * If an error is detected, set pass to FALSE, and set + * failure_mssg to an appropriate value. + * + * Return: void + * + * Programmer: John Mainzer + * 4/18/04 + * + *------------------------------------------------------------------------- + */ + +void +check_and_validate_cache_hit_rate(hid_t file_id, + double * hit_rate_ptr, + hbool_t dump_data, + int64_t min_accesses, + double min_hit_rate) +{ + /* const char * fcn_name = "check_and_validate_cache_hit_rate()"; */ + herr_t result; + int64_t cache_hits = 0; + int64_t cache_accesses = 0; + double expected_hit_rate; + double hit_rate; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + + /* get a pointer to the files internal data structure */ + if ( pass ) { + + file_ptr = (H5F_t *)H5I_object_verify(file_id, H5I_FILE); + + if ( file_ptr == NULL ) { + + pass = FALSE; + failure_mssg = "Can't get file_ptr."; + + } else { + + cache_ptr = file_ptr->shared->cache; + } + } + + /* verify that we can access the cache data structure */ + if ( pass ) { + + if ( ( cache_ptr == NULL ) || + ( cache_ptr->magic != H5C__H5C_T_MAGIC ) ) { + + pass = FALSE; + failure_mssg = "Can't access cache resize_ctl."; + } + } + + /* compare the cache's internal configuration with the expected value */ + if ( pass ) { + + cache_hits = cache_ptr->cache_hits; + cache_accesses = cache_ptr->cache_accesses; + + if ( cache_accesses > 0 ) { + + expected_hit_rate = ((double)cache_hits) / ((double)cache_accesses); + + } else { + + expected_hit_rate = 0.0; + } + + result = H5Fget_mdc_hit_rate(file_id, &hit_rate); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fget_mdc_hit_rate() failed."; + + } else if ( ! DBL_REL_EQUAL(hit_rate, expected_hit_rate, 0.00001) ) { + + pass = FALSE; + failure_mssg = "unexpected hit rate (1)."; + + } + } + + if ( pass ) { /* reset the hit rate */ + + result = H5Freset_mdc_hit_rate_stats(file_id); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "H5Freset_mdc_hit_rate_stats() failed."; + } + } + + /* set *hit_rate_ptr if appropriate */ + if ( ( pass ) && ( hit_rate_ptr != NULL ) ) { + + *hit_rate_ptr = hit_rate; + } + + /* dump data to stdout if requested */ + if ( ( pass ) && ( dump_data ) ) { + + HDfprintf(stdout, + "cache_hits: %ld, cache_accesses: %ld, hit_rate: %lf\n", + (long)cache_hits, (long)cache_accesses, hit_rate); + } + + if ( ( pass ) && + ( cache_accesses > min_accesses ) && + ( hit_rate < min_hit_rate ) ) { + + pass = FALSE; + failure_mssg = "Unexpectedly low hit rate."; + } + + return; + +} /* check_and_validate_cache_hit_rate() */ + + +/*------------------------------------------------------------------------- + * Function: check_and_validate_cache_size() + * + * Purpose: Use the API function to get the cache size data. Verify + * that the values returned by the API call agree with + * the cache internal data structures. + * + * Return size data in the locations specified by the pointer + * parameters if these parameters are not NULL. Print the + * data to stdout if requested. + * + * If an error is detected, set pass to FALSE, and set + * failure_mssg to an appropriate value. + * + * Return: void + * + * Programmer: John Mainzer + * 4/18/04 + * + *------------------------------------------------------------------------- + */ + +void +check_and_validate_cache_size(hid_t file_id, + size_t * max_size_ptr, + size_t * min_clean_size_ptr, + size_t * cur_size_ptr, + int32_t * cur_num_entries_ptr, + hbool_t dump_data) +{ + /* const char * fcn_name = "check_and_validate_cache_size()"; */ + herr_t result; + size_t expected_max_size; + size_t max_size; + size_t expected_min_clean_size; + size_t min_clean_size; + size_t expected_cur_size; + size_t cur_size; + int32_t expected_cur_num_entries; + int cur_num_entries; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + + /* get a pointer to the files internal data structure */ + if ( pass ) { + + file_ptr = (H5F_t *)H5I_object_verify(file_id, H5I_FILE); + + if ( file_ptr == NULL ) { + + pass = FALSE; + failure_mssg = "Can't get file_ptr."; + + } else { + + cache_ptr = file_ptr->shared->cache; + } + } + + /* verify that we can access the cache data structure */ + if ( pass ) { + + if ( ( cache_ptr == NULL ) || + ( cache_ptr->magic != H5C__H5C_T_MAGIC ) ) { + + pass = FALSE; + failure_mssg = "Can't access cache data structure."; + } + } + + /* compare the cache's internal configuration with the expected value */ + if ( pass ) { + + expected_max_size = cache_ptr->max_cache_size; + expected_min_clean_size = cache_ptr->min_clean_size; + expected_cur_size = cache_ptr->index_size; + expected_cur_num_entries = cache_ptr->index_len; + + result = H5Fget_mdc_size(file_id, + &max_size, + &min_clean_size, + &cur_size, + &cur_num_entries); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fget_mdc_size() failed."; + + } else if ( ( max_size != expected_max_size ) || + ( min_clean_size != expected_min_clean_size ) || + ( cur_size != expected_cur_size ) || + ( cur_num_entries != (int)expected_cur_num_entries ) ) { + + pass = FALSE; + failure_mssg = "H5Fget_mdc_size() returned unexpected value(s)."; + + } + } + + /* return size values if requested */ + if ( ( pass ) && ( max_size_ptr != NULL ) ) { + + *max_size_ptr = max_size; + } + + if ( ( pass ) && ( min_clean_size_ptr != NULL ) ) { + + *min_clean_size_ptr = min_clean_size; + } + + if ( ( pass ) && ( cur_size_ptr != NULL ) ) { + + *cur_size_ptr = cur_size; + } + + if ( ( pass ) && ( cur_num_entries_ptr != NULL ) ) { + + *cur_num_entries_ptr = cur_num_entries; + } + + + /* dump data to stdout if requested */ + if ( ( pass ) && ( dump_data ) ) { + + HDfprintf(stdout, + "max_sz: %ld, min_clean_sz: %ld, cur_sz: %ld, cur_ent: %ld\n", + (long)max_size, (long)min_clean_size, (long)cur_size, + (long)cur_num_entries); + } + + return; + +} /* check_and_validate_cache_size() */ + + +/*------------------------------------------------------------------------- + * Function: validate_mdc_config() + * + * Purpose: Verify that the file indicated by the file_id parameter + * has both internal and external configuration matching + * *config_ptr. + * + * Do nothin on success. On failure, set pass to FALSE, and + * load an error message into failue_mssg. Note that + * failure_msg is assumed to be at least 128 bytes in length. + * + * Return: void + * + * Programmer: John Mainzer + * 4/14/04 + * + *------------------------------------------------------------------------- + */ + +void +validate_mdc_config(hid_t file_id, + H5AC_cache_config_t * ext_config_ptr, + hbool_t compare_init, + int test_num) +{ + /* const char * fcn_name = "validate_mdc_config()"; */ + static char msg[256]; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + H5AC_cache_config_t scratch; + H5C_auto_size_ctl_t int_config; + + XLATE_EXT_TO_INT_MDC_CONFIG(int_config, (*ext_config_ptr)) + + /* get a pointer to the files internal data structure */ + if ( pass ) { + + file_ptr = (H5F_t *)H5I_object_verify(file_id, H5I_FILE); + + if ( file_ptr == NULL ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, "Can't get file_ptr #%d.", test_num); + failure_mssg = msg; + + } else { + + cache_ptr = file_ptr->shared->cache; + } + } + + /* verify that we can access the internal version of the cache config */ + if ( pass ) { + + if ( ( cache_ptr == NULL ) || + ( cache_ptr->magic != H5C__H5C_T_MAGIC ) || + ( cache_ptr->resize_ctl.version != H5C__CURR_AUTO_SIZE_CTL_VER ) ){ + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "Can't access cache resize_ctl #%d.", test_num); + failure_mssg = msg; + } + } + + /* compare the cache's internal configuration with the expected value */ + if ( pass ) { + + if ( ! RESIZE_CONFIGS_ARE_EQUAL(int_config, cache_ptr->resize_ctl, + compare_init) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "Unexpected internal config #%d.", test_num); + failure_mssg = msg; + } + } + + /* obtain external cache config */ + if ( pass ) { + + scratch.version = H5AC__CURR_CACHE_CONFIG_VERSION; + + if ( H5Fget_mdc_config(file_id, (H5AC1_cache_config_t *)&scratch) < 0 ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "H5Fget_mdc_config() failed #%d.", test_num); + failure_mssg = msg; + } + } + + if ( pass ) { + + /* Recall that in any configuration supplied by the cache + * at run time, the set_initial_size field will always + * be FALSE, regardless of the value passed in. Thus we + * always presume that this field need not match that of + * the supplied external configuration. + * + * The cache also sets the initial_size field to the current + * cache max size instead of the value initialy supplied. + * Depending on circumstances, this may or may not match + * the original. Hence the compare_init parameter. + */ + if ( ! CACHE_CONFIGS_EQUAL((*ext_config_ptr), scratch, \ + FALSE, compare_init) ) { + + pass = FALSE; + HDsnprintf(msg, (size_t)128, + "Unexpected external config #%d.", test_num); + failure_mssg = msg; + } + } + + return; + +} /* validate_mdc_config() */ + diff --git a/test/cache_common.h b/test/cache_common.h new file mode 100644 index 0000000..00aa1e3 --- /dev/null +++ b/test/cache_common.h @@ -0,0 +1,978 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * Copyright by the Board of Trustees of the University of Illinois. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* Programmer: John Mainzer + * 10/27/05 + * + * This file contains common #defines, type definitions, and + * externs for tests of the cache implemented in H5C.c + */ +#include "h5test.h" +#include "H5Iprivate.h" +#include "H5ACprivate.h" + +#define H5C_PACKAGE /*suppress error about including H5pkg */ + +#include "H5Cpkg.h" + +#define H5F_PACKAGE /*suppress error about including H5Fpkg */ + +#include "H5Fpkg.h" + +#define NO_CHANGE -1 + +#define USE_CORE_DRIVER TRUE + +/* with apologies for the abuse of terminology... */ + +#define PICO_ENTRY_TYPE 0 +#define NANO_ENTRY_TYPE 1 +#define MICRO_ENTRY_TYPE 2 +#define TINY_ENTRY_TYPE 3 +#define SMALL_ENTRY_TYPE 4 +#define MEDIUM_ENTRY_TYPE 5 +#define LARGE_ENTRY_TYPE 6 +#define HUGE_ENTRY_TYPE 7 +#define MONSTER_ENTRY_TYPE 8 +#define VARIABLE_ENTRY_TYPE 9 + +#define NUMBER_OF_ENTRY_TYPES 10 + +#define PICO_ENTRY_SIZE (size_t)1 +#define NANO_ENTRY_SIZE (size_t)4 +#define MICRO_ENTRY_SIZE (size_t)16 +#define TINY_ENTRY_SIZE (size_t)64 +#define SMALL_ENTRY_SIZE (size_t)256 +#define MEDIUM_ENTRY_SIZE (size_t)1024 +#define LARGE_ENTRY_SIZE (size_t)(4 * 1024) +#define HUGE_ENTRY_SIZE (size_t)(16 * 1024) +#define MONSTER_ENTRY_SIZE (size_t)(64 * 1024) +#define VARIABLE_ENTRY_SIZE (size_t)(10 * 1024) + +#define NUM_PICO_ENTRIES (10 * 1024) +#define NUM_NANO_ENTRIES (10 * 1024) +#define NUM_MICRO_ENTRIES (10 * 1024) +#define NUM_TINY_ENTRIES (10 * 1024) +#define NUM_SMALL_ENTRIES (10 * 1024) +#define NUM_MEDIUM_ENTRIES (10 * 1024) +#define NUM_LARGE_ENTRIES (10 * 1024) +#define NUM_HUGE_ENTRIES (10 * 1024) +#define NUM_MONSTER_ENTRIES (10 * 1024) +#define NUM_VARIABLE_ENTRIES (10 * 1024) + +#define MAX_ENTRIES (10 * 1024) + + +/* The choice of the BASE_ADDR below is arbitrary -- it just has to be + * larger than the superblock. + */ +#define BASE_ADDR (haddr_t)1024 +#define PICO_BASE_ADDR BASE_ADDR +#define NANO_BASE_ADDR (haddr_t)(PICO_BASE_ADDR + \ + (PICO_ENTRY_SIZE * NUM_PICO_ENTRIES)) +#define MICRO_BASE_ADDR (haddr_t)(NANO_BASE_ADDR + \ + (NANO_ENTRY_SIZE * NUM_NANO_ENTRIES)) +#define TINY_BASE_ADDR (haddr_t)(MICRO_BASE_ADDR + \ + (MICRO_ENTRY_SIZE * NUM_MICRO_ENTRIES)) +#define SMALL_BASE_ADDR (haddr_t)(TINY_BASE_ADDR + \ + (TINY_ENTRY_SIZE * NUM_TINY_ENTRIES)) +#define MEDIUM_BASE_ADDR (haddr_t)(SMALL_BASE_ADDR + \ + (SMALL_ENTRY_SIZE * NUM_SMALL_ENTRIES)) +#define LARGE_BASE_ADDR (haddr_t)(MEDIUM_BASE_ADDR + \ + (MEDIUM_ENTRY_SIZE * NUM_MEDIUM_ENTRIES)) +#define HUGE_BASE_ADDR (haddr_t)(LARGE_BASE_ADDR + \ + (LARGE_ENTRY_SIZE * NUM_LARGE_ENTRIES)) +#define MONSTER_BASE_ADDR (haddr_t)(HUGE_BASE_ADDR + \ + (HUGE_ENTRY_SIZE * NUM_HUGE_ENTRIES)) +#define VARIABLE_BASE_ADDR (haddr_t)(MONSTER_BASE_ADDR + \ + (MONSTER_ENTRY_SIZE * NUM_MONSTER_ENTRIES)) + +#define PICO_ALT_BASE_ADDR (haddr_t)(VARIABLE_BASE_ADDR + \ + (VARIABLE_ENTRY_SIZE * NUM_VARIABLE_ENTRIES)) +#define NANO_ALT_BASE_ADDR (haddr_t)(PICO_ALT_BASE_ADDR + \ + (PICO_ENTRY_SIZE * NUM_PICO_ENTRIES)) +#define MICRO_ALT_BASE_ADDR (haddr_t)(NANO_ALT_BASE_ADDR + \ + (NANO_ENTRY_SIZE * NUM_NANO_ENTRIES)) +#define TINY_ALT_BASE_ADDR (haddr_t)(MICRO_ALT_BASE_ADDR + \ + (MICRO_ENTRY_SIZE * NUM_MICRO_ENTRIES)) +#define SMALL_ALT_BASE_ADDR (haddr_t)(TINY_ALT_BASE_ADDR + \ + (TINY_ENTRY_SIZE * NUM_TINY_ENTRIES)) +#define MEDIUM_ALT_BASE_ADDR (haddr_t)(SMALL_ALT_BASE_ADDR + \ + (SMALL_ENTRY_SIZE * NUM_SMALL_ENTRIES)) +#define LARGE_ALT_BASE_ADDR (haddr_t)(MEDIUM_ALT_BASE_ADDR + \ + (MEDIUM_ENTRY_SIZE * NUM_MEDIUM_ENTRIES)) +#define HUGE_ALT_BASE_ADDR (haddr_t)(LARGE_ALT_BASE_ADDR + \ + (LARGE_ENTRY_SIZE * NUM_LARGE_ENTRIES)) +#define MONSTER_ALT_BASE_ADDR (haddr_t)(HUGE_ALT_BASE_ADDR + \ + (HUGE_ENTRY_SIZE * NUM_HUGE_ENTRIES)) +#define VARIABLE_ALT_BASE_ADDR (haddr_t)(MONSTER_ALT_BASE_ADDR + \ + (MONSTER_ENTRY_SIZE * NUM_MONSTER_ENTRIES)) +#define MAX_ADDR (haddr_t)(VARIABLE_ALT_BASE_ADDR + \ + (VARIABLE_ENTRY_SIZE * NUM_VARIABLE_ENTRIES)) +#define ADDR_SPACE_SIZE (haddr_t)(MAX_ADDR - BASE_ADDR) + +#define MAX_PINS 8 /* Maximum number of entries that can be + * directly pinned by a single entry. + */ + +#define FLUSH_OP__NO_OP 0 +#define FLUSH_OP__DIRTY 1 +#define FLUSH_OP__RESIZE 2 +#define FLUSH_OP__RENAME 3 +#define FLUSH_OP__MAX_OP 3 + +#define MAX_FLUSH_OPS 10 /* Maximum number of flush operations + * that can be associated with a + * cache entry. + */ + +typedef struct flush_op +{ + int op_code; /* integer op code indicating the + * operation to be performed. At + * present it must be one of: + * + * FLUSH_OP__NO_OP + * FLUSH_OP__DIRTY + * FLUSH_OP__RESIZE + * FLUSH_OP__RENAME + */ + int type; /* type code of the cache entry that + * is the target of the operation. + * This value is passed into the + * function implementing the flush + * operation. + */ + int idx; /* index of the cache entry that + * is the target of the operation. + * This value is passed into the + * function implementing the flush + * operation. + */ + hbool_t flag; /* boolean flag passed into the + * function implementing the flush + * operation. The meaning of the + * flag is dependant upon the flush + * operation: + * + * FLUSH_OP__DIRTY: TRUE iff the + * target is pinned, and is to + * be dirtied via the + * H5C_mark_pinned_entry_dirty() + * call. + * + * FLUSH_OP__RESIZE: TRUE iff the + * target is pinned, and is to + * be resized via the + * H5C_mark_pinned_entry_dirty() + * call. + * + * FLUSH_OP__RENAME: TRUE iff the + * target is to be renamed to + * its main address. + */ + size_t size; /* New target size in the + * FLUSH_OP__RENAME operation. + * Unused elsewhere. + */ +} flush_op; + +typedef struct test_entry_t +{ + H5C_cache_entry_t header; /* entry data used by the cache + * -- must be first + */ + struct test_entry_t * self; /* pointer to this entry -- used for + * sanity checking. + */ + H5F_t * file_ptr; /* pointer to the file in which the + * entry resides, or NULL if the entry + * is not in a file. + */ + H5C_t * cache_ptr; /* pointer to the cache in which + * the entry resides, or NULL if the + * entry is not in cache. + */ + hbool_t written_to_main_addr; + /* Flag indicating whether an image + * of the entry has been written to + * its main address. Since we no + * longer have a flush callback, we + * set this field to true whenever the + * entry is serialized while at its + * main address. + */ + hbool_t written_to_alt_addr; + /* Flag indicating whether an image + * of the entry has been written to + * its alternate address. Since we no + * longer have a flush callback, we + * set this field to true whenever the + * entry is serialized while at its + * alternate address. + */ + haddr_t addr; /* where the cache thinks this entry + * is located + */ + hbool_t at_main_addr; /* boolean flag indicating whether + * the entry is supposed to be at + * either its main or alternate + * address. + */ + haddr_t main_addr; /* initial location of the entry + */ + haddr_t alt_addr; /* location to which the entry + * can be relocated or "renamed" + */ + size_t size; /* how big the cache thinks this + * entry is + */ + int32_t type; /* indicates which entry array this + * entry is in + */ + int32_t index; /* index in its entry array + */ + int32_t serializes; /* number of times this entry has + * been serialized. + */ + int32_t deserializes; /* number of times this entry has + * been deserialized + */ + hbool_t is_dirty; /* entry has been modified since + * last write + */ + hbool_t is_protected; /* entry should currently be on + * the cache's protected list. + */ + hbool_t is_read_only; /* TRUE iff the entry should be + * protected read only. + */ + int ro_ref_count; /* Number of outstanding read only + * protects on the entry. + */ + hbool_t is_pinned; /* entry is currently pinned in + * the cache. + */ + int pinning_ref_count; /* Number of entries that + * pin this entry in the cache. + * When this count drops to zero, + * this entry should be unpinned. + */ + int num_pins; /* Number of entries that this + * entry pins in the cache. This + * value must be in the range + * [0, MAX_PINS]. + */ + int pin_type[MAX_PINS]; /* array of the types of entries + * pinned by this entry. + */ + int pin_idx[MAX_PINS]; /* array of the indicies of + * entries pinned by this entry. + */ + int num_flush_ops; /* integer field containing the + * number of flush operations to + * be executed when the entry is + * flushed. This value must lie in + * the closed interval + * [0, MAX_FLUSH_OPS]. + */ + struct flush_op flush_ops[MAX_FLUSH_OPS]; /* Array of instances + * of struct flush_op detailing the + * flush operations (if any) that + * are to be executed when the entry + * is flushed from the cache. + * + * num_flush_ops contains the number + * of valid entries in this array. + */ + hbool_t flush_op_self_resize_in_progress; /* Boolean flag + * that is set to TRUE iff this + * entry is being flushed, it has + * been resized by a resize flush + * op, and the flush function has + * not yet returned, This field is + * used to turn off overactive santity + * checking code that would otherwise + * cause a false test failure. + */ + hbool_t deserialized; /* entry has been deserialized since + * the last time it was reset. + */ + hbool_t cleared; /* entry has been cleared since the + * last time it was reset. + */ + hbool_t serialized; /* entry has been serialized since the + * last time it was reset. + */ + hbool_t destroyed; /* entry has been destroyed since the + * last time it was reset. + */ +} test_entry_t; + +/* The following are cut down test versions of the hash table manipulation + * macros from H5Cpkg.c, which have been further modified to avoid references + * to the error reporting macros. Needless to say, these macros must be + * updated as necessary. + */ + +#define H5C__HASH_MASK ((size_t)(H5C__HASH_TABLE_LEN - 1) << 3) +#define H5C__HASH_FCN(x) (int)(((x) & H5C__HASH_MASK) >> 3) + +#define H5C_TEST__PRE_HT_SEARCH_SC(cache_ptr, Addr) \ +if ( ( (cache_ptr) == NULL ) || \ + ( (cache_ptr)->magic != H5C__H5C_T_MAGIC ) || \ + ( ! H5F_addr_defined(Addr) ) || \ + ( H5C__HASH_FCN(Addr) < 0 ) || \ + ( H5C__HASH_FCN(Addr) >= H5C__HASH_TABLE_LEN ) ) { \ + HDfprintf(stdout, "Pre HT search SC failed.\n"); \ +} + +#define H5C_TEST__POST_SUC_HT_SEARCH_SC(cache_ptr, entry_ptr, Addr, k) \ +if ( ( (cache_ptr) == NULL ) || \ + ( (cache_ptr)->magic != H5C__H5C_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) ) ) ) { \ + HDfprintf(stdout, "Post successful HT search SC failed.\n"); \ +} + + +#define H5C_TEST__SEARCH_INDEX(cache_ptr, Addr, entry_ptr) \ +{ \ + int k; \ + int depth = 0; \ + H5C_TEST__PRE_HT_SEARCH_SC(cache_ptr, Addr) \ + k = H5C__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 ) \ + { \ + H5C_TEST__POST_SUC_HT_SEARCH_SC(cache_ptr, entry_ptr, Addr, k) \ + 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); \ + } \ + } \ +} + + +/* Macros used in H5AC level tests */ + +#define CACHE_CONFIGS_EQUAL(a, b, cmp_set_init, cmp_init_size) \ +( ( (a).version == (b).version ) && \ + ( (a).rpt_fcn_enabled == (b).rpt_fcn_enabled ) && \ + ( (a).open_trace_file == (b).open_trace_file ) && \ + ( (a).close_trace_file == (b).close_trace_file ) && \ + ( ( (a).open_trace_file == FALSE ) || \ + ( strcmp((a).trace_file_name, (b).trace_file_name) == 0 ) ) && \ + ( (a).evictions_enabled == (b).evictions_enabled ) && \ + ( ( ! cmp_set_init ) || \ + ( (a).set_initial_size == (b).set_initial_size ) ) && \ + ( ( ! cmp_init_size ) || \ + ( (a).initial_size == (b).initial_size ) ) && \ + ( DBL_REL_EQUAL((a).min_clean_fraction, (b).min_clean_fraction, 0.00001 ) ) && \ + ( (a).max_size == (b).max_size ) && \ + ( (a).min_size == (b).min_size ) && \ + ( (a).epoch_length == (b).epoch_length ) && \ + ( (a).incr_mode == (b).incr_mode ) && \ + ( DBL_REL_EQUAL((a).lower_hr_threshold, (b).lower_hr_threshold, 0.00001 ) ) && \ + ( DBL_REL_EQUAL((a).increment, (b).increment, 0.00001 ) ) && \ + ( (a).apply_max_increment == (b).apply_max_increment ) && \ + ( (a).max_increment == (b).max_increment ) && \ + ( (a).flash_incr_mode == (b).flash_incr_mode ) && \ + ( DBL_REL_EQUAL((a).flash_multiple, (b).flash_multiple, 0.00001 ) ) && \ + ( DBL_REL_EQUAL((a).flash_threshold, (b).flash_threshold, 0.00001 ) ) && \ + ( (a).decr_mode == (b).decr_mode ) && \ + ( DBL_REL_EQUAL((a).upper_hr_threshold, (b).upper_hr_threshold, 0.00001 ) ) && \ + ( DBL_REL_EQUAL((a).decrement, (b).decrement, 0.00001 ) ) && \ + ( (a).apply_max_decrement == (b).apply_max_decrement ) && \ + ( (a).max_decrement == (b).max_decrement ) && \ + ( (a).epochs_before_eviction == (b).epochs_before_eviction ) && \ + ( (a).apply_empty_reserve == (b).apply_empty_reserve ) && \ + ( DBL_REL_EQUAL((a).empty_reserve, (b).empty_reserve, 0.00001 ) ) ) + + +#define RESIZE_CONFIGS_ARE_EQUAL(a, b, compare_init) \ +( ( (a).version == (b).version ) && \ + ( (a).rpt_fcn == (b).rpt_fcn ) && \ + ( ( ! compare_init ) || \ + ( (a).set_initial_size == (b).set_initial_size ) ) && \ + ( ( ! compare_init ) || \ + ( (a).initial_size == (b).initial_size ) ) && \ + ( DBL_REL_EQUAL((a).min_clean_fraction, (b).min_clean_fraction, 0.00001 ) ) && \ + ( (a).max_size == (b).max_size ) && \ + ( (a).min_size == (b).min_size ) && \ + ( (a).epoch_length == (b).epoch_length ) && \ + ( (a).incr_mode == (b).incr_mode ) && \ + ( DBL_REL_EQUAL((a).lower_hr_threshold, (b).lower_hr_threshold, 0.00001 ) ) && \ + ( DBL_REL_EQUAL((a).increment, (b).increment, 0.00001 ) ) && \ + ( (a).apply_max_increment == (b).apply_max_increment ) && \ + ( (a).max_increment == (b).max_increment ) && \ + ( (a).flash_incr_mode == (b).flash_incr_mode ) && \ + ( DBL_REL_EQUAL((a).flash_multiple, (b).flash_multiple, 0.00001 ) ) && \ + ( DBL_REL_EQUAL((a).flash_threshold, (b).flash_threshold, 0.00001 ) ) && \ + ( (a).decr_mode == (b).decr_mode ) && \ + ( DBL_REL_EQUAL((a).upper_hr_threshold, (b).upper_hr_threshold, 0.00001 ) ) && \ + ( DBL_REL_EQUAL((a).decrement, (b).decrement, 0.00001 ) ) && \ + ( (a).apply_max_decrement == (b).apply_max_decrement ) && \ + ( (a).max_decrement == (b).max_decrement ) && \ + ( (a).epochs_before_eviction == (b).epochs_before_eviction ) && \ + ( (a).apply_empty_reserve == (b).apply_empty_reserve ) && \ + ( DBL_REL_EQUAL((a).empty_reserve, (b).empty_reserve, 0.00001 ) ) ) + + +#define XLATE_EXT_TO_INT_MDC_CONFIG(i, e) \ +{ \ + (i).version = H5C__CURR_AUTO_SIZE_CTL_VER; \ + if ( (e).rpt_fcn_enabled ) \ + (i).rpt_fcn = H5C_def_auto_resize_rpt_fcn; \ + else \ + (i).rpt_fcn = NULL; \ + (i).set_initial_size = (e).set_initial_size; \ + (i).initial_size = (e).initial_size; \ + (i).min_clean_fraction = (e).min_clean_fraction; \ + (i).max_size = (e).max_size; \ + (i).min_size = (e).min_size; \ + (i).epoch_length = (long int)((e).epoch_length); \ + (i).incr_mode = (e).incr_mode; \ + (i).lower_hr_threshold = (e).lower_hr_threshold; \ + (i).increment = (e).increment; \ + (i).apply_max_increment = (e).apply_max_increment; \ + (i).max_increment = (e).max_increment; \ + (i).flash_incr_mode = (e).flash_incr_mode; \ + (i).flash_multiple = (e).flash_multiple; \ + (i).flash_threshold = (e).flash_threshold; \ + (i).decr_mode = (e).decr_mode; \ + (i).upper_hr_threshold = (e).upper_hr_threshold; \ + (i).decrement = (e).decrement; \ + (i).apply_max_decrement = (e).apply_max_decrement; \ + (i).max_decrement = (e).max_decrement; \ + (i).epochs_before_eviction = (int)((e).epochs_before_eviction); \ + (i).apply_empty_reserve = (e).apply_empty_reserve; \ + (i).empty_reserve = (e).empty_reserve; \ +} + + + +/* misc type definitions */ + +struct flush_cache_test_spec +{ + int entry_num; + int entry_type; + int entry_index; + hbool_t insert_flag; + hbool_t dirty_flag; + unsigned int flags; + hbool_t expected_deserialized; + hbool_t expected_cleared; + hbool_t expected_serialized; + hbool_t expected_destroyed; +}; + +struct pe_flush_cache_test_spec +{ + int entry_num; + int entry_type; + int entry_index; + hbool_t insert_flag; + hbool_t dirty_flag; + unsigned int flags; + int num_pins; + int pin_type[MAX_PINS]; + int pin_idx[MAX_PINS]; + hbool_t expected_deserialized; + hbool_t expected_cleared; + hbool_t expected_serialized; + hbool_t expected_destroyed; +}; + +struct fo_flush_entry_check +{ + int entry_num; + int entry_type; + int entry_index; + size_t expected_size; + hbool_t in_cache; + hbool_t at_main_addr; + hbool_t is_dirty; + hbool_t is_protected; + hbool_t is_pinned; + hbool_t expected_deserialized; + hbool_t expected_cleared; + hbool_t expected_serialized; + hbool_t expected_destroyed; +}; + +struct fo_flush_cache_test_spec +{ + int entry_num; + int entry_type; + int entry_index; + hbool_t insert_flag; + unsigned int flags; + size_t new_size; + int num_pins; + int pin_type[MAX_PINS]; + int pin_idx[MAX_PINS]; + int num_flush_ops; + struct flush_op flush_ops[MAX_FLUSH_OPS]; + hbool_t expected_deserialized; + hbool_t expected_cleared; + hbool_t expected_serialized; + hbool_t expected_destroyed; +}; + +struct rename_entry_test_spec +{ + int entry_type; + int entry_index; + hbool_t is_dirty; + hbool_t is_pinned; +}; + +struct expected_entry_status +{ + int entry_type; + int entry_index; + size_t size; + hbool_t in_cache; + hbool_t at_main_addr; + hbool_t is_dirty; + hbool_t is_protected; + hbool_t is_pinned; + hbool_t deserialized; + hbool_t cleared; + hbool_t serialized; + hbool_t destroyed; +}; + + + + +/* global variable externs: */ + +extern haddr_t saved_actual_base_addr; +extern hbool_t write_permitted; +extern hbool_t pass; /* set to false on error */ +extern hbool_t skip_long_tests; +extern hbool_t run_full_test; +extern hbool_t try_core_file_driver; +extern hbool_t core_file_driver_failed; +extern const char *failure_mssg; +extern int express_test; +extern int failures; + +extern test_entry_t pico_entries[NUM_PICO_ENTRIES]; +extern test_entry_t nano_entries[NUM_NANO_ENTRIES]; +extern test_entry_t micro_entries[NUM_MICRO_ENTRIES]; +extern test_entry_t tiny_entries[NUM_TINY_ENTRIES]; +extern test_entry_t small_entries[NUM_SMALL_ENTRIES]; +extern test_entry_t medium_entries[NUM_MEDIUM_ENTRIES]; +extern test_entry_t large_entries[NUM_LARGE_ENTRIES]; +extern test_entry_t huge_entries[NUM_HUGE_ENTRIES]; +extern test_entry_t monster_entries[NUM_MONSTER_ENTRIES]; + +extern test_entry_t * entries[NUMBER_OF_ENTRY_TYPES]; +extern const int32_t max_indices[NUMBER_OF_ENTRY_TYPES]; +extern const size_t entry_sizes[NUMBER_OF_ENTRY_TYPES]; +extern const haddr_t base_addrs[NUMBER_OF_ENTRY_TYPES]; +extern const haddr_t alt_base_addrs[NUMBER_OF_ENTRY_TYPES]; +extern const char * entry_type_names[NUMBER_OF_ENTRY_TYPES]; + + +/* call back function declarations: */ + +herr_t check_write_permitted(const H5F_t UNUSED * f, + hid_t UNUSED dxpl_id, + hbool_t * write_permitted_ptr); + +herr_t pico_clear_dirty_bits(haddr_t addr, size_t len, void * thing); +herr_t nano_clear_dirty_bits(haddr_t addr, size_t len, void * thing); +herr_t micro_clear_dirty_bits(haddr_t addr, size_t len, void * thing); +herr_t tiny_clear_dirty_bits(haddr_t addr, size_t len, void * thing); +herr_t small_clear_dirty_bits(haddr_t addr, size_t len, void * thing); +herr_t medium_clear_dirty_bits(haddr_t addr, size_t len, void * thing); +herr_t large_clear_dirty_bits(haddr_t addr, size_t len, void * thing); +herr_t huge_clear_dirty_bits(haddr_t addr, size_t len, void * thing); +herr_t monster_clear_dirty_bits(haddr_t addr, size_t len, void * thing); +herr_t variable_clear_dirty_bits(haddr_t addr, size_t len, void * thing); + + +void * pico_deserialize(haddr_t addr, size_t len, const void * image_ptr, + const void * udata_ptr, hbool_t * dirty_ptr); +void * nano_deserialize(haddr_t addr, size_t len, const void * image_ptr, + const void * udata_ptr, hbool_t * dirty_ptr); +void * micro_deserialize(haddr_t addr, size_t len, const void * image_ptr, + const void * udata_ptr, hbool_t * dirty_ptr); +void * tiny_deserialize(haddr_t addr, size_t len, const void * image_ptr, + const void * udata_ptr, hbool_t * dirty_ptr); +void * small_deserialize(haddr_t addr, size_t len, const void * image_ptr, + const void * udata_ptr, hbool_t * dirty_ptr); +void * medium_deserialize(haddr_t addr, size_t len, const void * image_ptr, + const void * udata_ptr, hbool_t * dirty_ptr); +void * large_deserialize(haddr_t addr, size_t len, const void * image_ptr, + const void * udata_ptr, hbool_t * dirty_ptr); +void * huge_deserialize(haddr_t addr, size_t len, const void * image_ptr, + const void * udata_ptr, hbool_t * dirty_ptr); +void * monster_deserialize(haddr_t addr, size_t len, const void * image_ptr, + const void * udata_ptr, hbool_t * dirty_ptr); +void * variable_deserialize(haddr_t addr, size_t len, const void * image_ptr, + const void * udata_ptr, hbool_t * dirty_ptr); + +herr_t pico_image_len(void *thing, size_t *image_len_ptr); +herr_t nano_image_len(void *thing, size_t *image_len_ptr); +herr_t micro_image_len(void *thing, size_t *image_len_ptr); +herr_t tiny_image_len(void *thing, size_t *image_len_ptr); +herr_t small_image_len(void *thing, size_t *image_len_ptr); +herr_t medium_image_len(void *thing, size_t *image_len_ptr); +herr_t large_image_len(void *thing, size_t *image_len_ptr); +herr_t huge_image_len(void *thing, size_t *image_len_ptr); +herr_t monster_image_len(void *thing, size_t *image_len_ptr); +herr_t variable_image_len(void *thing, size_t *image_len_ptr); + +herr_t pico_serialize(const H5F_t *f, hid_t dxpl_id, haddr_t addr, + size_t len, void * image_ptr, + void * thing, unsigned * flags_ptr, + haddr_t * new_addr_ptr, size_t * new_len_ptr, + void ** new_image_ptr_ptr); +herr_t nano_serialize(const H5F_t *f, hid_t dxpl_id, haddr_t addr, + size_t len, void * image_ptr, + void * thing, unsigned * flags_ptr, + haddr_t * new_addr_ptr, size_t * new_len_ptr, + void ** new_image_ptr_ptr); +herr_t micro_serialize(const H5F_t *f, hid_t dxpl_id, haddr_t addr, + size_t len, void * image_ptr, + void * thing, unsigned * flags_ptr, + haddr_t * new_addr_ptr, size_t * new_len_ptr, + void ** new_image_ptr_ptr); +herr_t tiny_serialize(const H5F_t *f, hid_t dxpl_id, haddr_t addr, + size_t len, void * image_ptr, + void * thing, unsigned * flags_ptr, + haddr_t * new_addr_ptr, size_t * new_len_ptr, + void ** new_image_ptr_ptr); +herr_t small_serialize(const H5F_t *f, hid_t dxpl_id, haddr_t addr, + size_t len, void * image_ptr, + void * thing, unsigned * flags_ptr, + haddr_t * new_addr_ptr, size_t * new_len_ptr, + void ** new_image_ptr_ptr); +herr_t medium_serialize(const H5F_t *f, hid_t dxpl_id, haddr_t addr, + size_t len, void * image_ptr, + void * thing, unsigned * flags_ptr, + haddr_t * new_addr_ptr, size_t * new_len_ptr, + void ** new_image_ptr_ptr); +herr_t large_serialize(const H5F_t *f, hid_t dxpl_id, haddr_t addr, + size_t len, void * image_ptr, + void * thing, unsigned * flags_ptr, + haddr_t * new_addr_ptr, size_t * new_len_ptr, + void ** new_image_ptr_ptr); +herr_t huge_serialize(const H5F_t *f, hid_t dxpl_id, haddr_t addr, + size_t len, void * image_ptr, + void * thing, unsigned * flags_ptr, + haddr_t * new_addr_ptr, size_t * new_len_ptr, + void ** new_image_ptr_ptr); +herr_t monster_serialize(const H5F_t *f, hid_t dxpl_id, haddr_t addr, + size_t len, void * image_ptr, + void * thing, unsigned * flags_ptr, + haddr_t * new_addr_ptr, size_t * new_len_ptr, + void ** new_image_ptr_ptr); +herr_t variable_serialize(const H5F_t *f, hid_t dxpl_id, haddr_t addr, + size_t len, void * image_ptr, + void * thing, unsigned * flags_ptr, + haddr_t * new_addr_ptr, size_t * new_len_ptr, + void ** new_image_ptr_ptr); + +herr_t pico_free_icr(haddr_t addr, size_t len, void * thing); +herr_t nano_free_icr(haddr_t addr, size_t len, void * thing); +herr_t micro_free_icr(haddr_t addr, size_t len, void * thing); +herr_t tiny_free_icr(haddr_t addr, size_t len, void * thing); +herr_t small_free_icr(haddr_t addr, size_t len, void * thing); +herr_t medium_free_icr(haddr_t addr, size_t len, void * thing); +herr_t large_free_icr(haddr_t addr, size_t len, void * thing); +herr_t huge_free_icr(haddr_t addr, size_t len, void * thing); +herr_t monster_free_icr(haddr_t addr, size_t len, void * thing); +herr_t variable_free_icr(haddr_t addr, size_t len, void * thing); + + +/* callback table extern */ + +extern const H5C_class_t types[NUMBER_OF_ENTRY_TYPES]; + + +/* function declarations: */ + +void add_flush_op(int target_type, + int target_idx, + int op_code, + int type, + int idx, + hbool_t flag, + size_t size); + + +void addr_to_type_and_index(haddr_t addr, + int32_t * type_ptr, + int32_t * index_ptr); + +#if 0 /* keep this for a while -- it may be useful */ +haddr_t type_and_index_to_addr(int32_t type, + int32_t idx); +#endif + +void dirty_entry(H5F_t * file_ptr, + int32_t type, + int32_t idx, + hbool_t dirty_pin); + +void expunge_entry(H5F_t * file_ptr, + int32_t type, + int32_t idx); + +void insert_entry(H5F_t * file_ptr, + int32_t type, + int32_t idx, + hbool_t dirty, + unsigned int flags); + +void mark_pinned_entry_dirty(H5F_t * file_ptr, + int32_t type, + int32_t idx, + hbool_t size_changed, + size_t new_size); + +void mark_pinned_or_protected_entry_dirty(H5F_t * file_ptr, + int32_t type, + int32_t idx); + +void rename_entry(H5C_t * cache_ptr, + int32_t type, + int32_t idx, + hbool_t main_addr); + +void pin_protected_entry(H5F_t * file_ptr, + int32_t type, + int32_t idx); + +void protect_entry(H5F_t * file_ptr, + int32_t type, + int32_t idx); + +void protect_entry_ro(H5F_t * file_ptr, + int32_t type, + int32_t idx); + +hbool_t entry_in_cache(H5C_t * cache_ptr, + int32_t type, + int32_t idx); + +void create_pinned_entry_dependency(H5F_t * file_ptr, + int pinning_type, + int pinning_idx, + int pinned_type, + int pinned_idx); + +void execute_flush_op(H5F_t * file_ptr, + struct test_entry_t * entry_ptr, + struct flush_op * op_ptr, + unsigned * flags_ptr); + +hbool_t recommend_core_file_driver(void); + +void reset_entries(void); + +void resize_entry(H5F_t * file_ptr, + int32_t type, + int32_t idx, + size_t new_size, + hbool_t resize_pin); + +void resize_pinned_entry(H5F_t * file_ptr, + int32_t type, + int32_t idx, + size_t new_size); + +H5F_t * setup_cache(size_t max_cache_size, size_t min_clean_size); + +void row_major_scan_forward(H5F_t * file_ptr, + int32_t max_index, + int32_t lag, + hbool_t verbose, + hbool_t reset_stats, + hbool_t display_stats, + hbool_t display_detailed_stats, + hbool_t do_inserts, + hbool_t dirty_inserts, + hbool_t do_renames, + hbool_t rename_to_main_addr, + hbool_t do_destroys, + hbool_t do_mult_ro_protects, + int dirty_destroys, + int dirty_unprotects); + +void hl_row_major_scan_forward(H5F_t * file_ptr, + int32_t max_index, + hbool_t verbose, + hbool_t reset_stats, + hbool_t display_stats, + hbool_t display_detailed_stats, + hbool_t do_inserts, + hbool_t dirty_inserts); + +void row_major_scan_backward(H5F_t * file_ptr, + int32_t max_index, + int32_t lag, + hbool_t verbose, + hbool_t reset_stats, + hbool_t display_stats, + hbool_t display_detailed_stats, + hbool_t do_inserts, + hbool_t dirty_inserts, + hbool_t do_renames, + hbool_t rename_to_main_addr, + hbool_t do_destroys, + hbool_t do_mult_ro_protects, + int dirty_destroys, + int dirty_unprotects); + +void hl_row_major_scan_backward(H5F_t * file_ptr, + int32_t max_index, + hbool_t verbose, + hbool_t reset_stats, + hbool_t display_stats, + hbool_t display_detailed_stats, + hbool_t do_inserts, + hbool_t dirty_inserts); + +void col_major_scan_forward(H5F_t * file_ptr, + int32_t max_index, + int32_t lag, + hbool_t verbose, + hbool_t reset_stats, + hbool_t display_stats, + hbool_t display_detailed_stats, + hbool_t do_inserts, + hbool_t dirty_inserts, + int dirty_unprotects); + +void hl_col_major_scan_forward(H5F_t * file_ptr, + int32_t max_index, + hbool_t verbose, + hbool_t reset_stats, + hbool_t display_stats, + hbool_t display_detailed_stats, + hbool_t do_inserts, + hbool_t dirty_inserts, + int dirty_unprotects); + +void col_major_scan_backward(H5F_t * file_ptr, + int32_t max_index, + int32_t lag, + hbool_t verbose, + hbool_t reset_stats, + hbool_t display_stats, + hbool_t display_detailed_stats, + hbool_t do_inserts, + hbool_t dirty_inserts, + int dirty_unprotects); + +void hl_col_major_scan_backward(H5F_t * file_ptr, + int32_t max_index, + hbool_t verbose, + hbool_t reset_stats, + hbool_t display_stats, + hbool_t display_detailed_stats, + hbool_t do_inserts, + hbool_t dirty_inserts, + int dirty_unprotects); + +void takedown_cache(H5F_t * file_ptr, + hbool_t dump_stats, + hbool_t dump_detailed_stats); + +void flush_cache(H5F_t * file_ptr, + hbool_t destroy_entries, + hbool_t dump_stats, + hbool_t dump_detailed_stats); + +void unpin_entry(H5F_t * file_ptr, + int32_t type, + int32_t idx); + +void unprotect_entry(H5F_t * file_ptr, + int32_t type, + int32_t idx, + int dirty, + unsigned int flags); + +void unprotect_entry_with_size_change(H5F_t * file_ptr, + int32_t type, + int32_t idx, + unsigned int flags, + size_t new_size); + +void verify_clean(void); + +void verify_entry_status(H5C_t * cache_ptr, + int tag, + int num_entries, + struct expected_entry_status expected[]); + +void verify_unprotected(void); + + +/*** H5AC level utility functions ***/ + +void check_and_validate_cache_hit_rate(hid_t file_id, + double * hit_rate_ptr, + hbool_t dump_data, + int64_t min_accesses, + double min_hit_rate); + +void check_and_validate_cache_size(hid_t file_id, + size_t * max_size_ptr, + size_t * min_clean_size_ptr, + size_t * cur_size_ptr, + int32_t * cur_num_entries_ptr, + hbool_t dump_data); + +void validate_mdc_config(hid_t file_id, + H5AC_cache_config_t * ext_config_ptr, + hbool_t compare_init, + int test_num); + diff --git a/test/cache_jnl_file_marking.c b/test/cache_jnl_file_marking.c new file mode 100644 index 0000000..646f71b --- /dev/null +++ b/test/cache_jnl_file_marking.c @@ -0,0 +1,3605 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * Copyright by the Board of Trustees of the University of Illinois. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* Programmer: John Mainzer + * 3/08 + * + * This file contains tests for the metadata journaling + * features implemented in H5C.c and friends. + */ + +#include + +#define H5F_PACKAGE /*suppress error about including H5Fpkg */ + +#include "h5test.h" +#include "H5Eprivate.h" +#include "H5Iprivate.h" +#include "H5MMprivate.h" /* Memory management */ +#include "H5MFprivate.h" +#include "H5ACprivate.h" +#include "cache_common.h" +#include "H5Fpkg.h" + +#define HDF5_FILE_NAME "HDF5.file" + +/* global variable declarations: */ + +const char *FILENAMES[] = { + "cache_test", + "cache_journal_test", + "cache_sb_test", + "journal_file", + "test_in_progress", + NULL +}; + + +/* private function declarations: */ + +/* utility functions */ + +static void check_test_in_progress(const char * str); + +static hbool_t file_exists(const char * file_path_ptr); + +static void mark_test_in_progress(const char * str); + +static void setup_cache_for_journaling(const char * hdf_file_name, + const char * journal_file_name, + hid_t * file_id_ptr, + H5F_t ** file_ptr_ptr, + H5C_t ** cache_ptr_ptr, + hbool_t use_core_driver_if_avail); + +static void usage(void); + +/* test functions */ + +static void setup_mdj_file_marking_after_open_test(hbool_t verbose); +static void check_mdj_file_marking_after_open_test(hbool_t verbose); + +static void setup_mdj_file_marking_on_create_test(hbool_t verbose); +static void check_mdj_file_marking_on_create_test(hbool_t verbose); + +static void setup_mdj_file_marking_on_open_test(hbool_t verbose); +static void check_mdj_file_marking_on_open_test(hbool_t verbose); + +static void setup_mdj_file_unmarking_on_file_close_test(hbool_t verbose); +static void check_mdj_file_unmarking_on_file_close_test(hbool_t verbose); + +static void setup_mdj_file_unmarking_on_journaling_shutdown_test(hbool_t verbose); +static void check_mdj_file_unmarking_on_journaling_shutdown_test(hbool_t verbose); + +static void setup_mdj_file_unmarking_on_recovery_test(hbool_t verbose); +static void check_mdj_file_unmarking_on_recovery_test(hbool_t verbose); + + +/**************************************************************************/ +/**************************************************************************/ +/********************************* tests: *********************************/ +/**************************************************************************/ +/**************************************************************************/ + +/*** metadata journaling test utility functions ***/ + +/*------------------------------------------------------------------------- + * Function: check_test_in_progress() + * + * Purpose: If pass is true on entry, test to see if the test in + * progress file exists. If it does not, set pass to FALSE + * and set a failure message. + * + * If the test in progress file does exist, check to see if + * its contents matches the supplied string. It it does not, + * set pass to FALSE and set the appropriate failure message. + * + * Do nothing if pass is FALSE on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 10/9/08 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +static void +check_test_in_progress(const char * str) + +{ + const char * fcn_name = "check_test_in_progress()"; + char buffer[512]; + char filename[512]; + hbool_t show_progress = FALSE; + hbool_t verbose = FALSE; + size_t input_len; + int cp = 0; + herr_t result; + int fd = -1; + h5_stat_t buf; + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass, cp++); + HDfflush(stdout); + } + + if ( pass ) { + + if ( ( str == NULL ) || + ( strlen(str) <= 0 ) || + ( strlen(str) >= 512 ) ) { + + pass = FALSE; + failure_mssg = "bad str on entry to check_test_in_progress()."; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass, cp++); + HDfflush(stdout); + } + + /* setup the journal file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[4], H5P_DEFAULT, filename, + sizeof(filename)) == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed.\n"; + } + else if ( strlen(filename) >= 512 ) { + + pass = FALSE; + failure_mssg = "test in progress file name too long.\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass, cp++); + HDfflush(stdout); + } + + if ( verbose ) { + HDfprintf(stdout, "%s filename = \"%s\".\n", fcn_name, filename); + HDfflush(stdout); + } + + if ( ( pass ) && ( ! file_exists(filename) ) ) { + + pass = FALSE; + failure_mssg = "test not in progress?!?"; + } + + + /* get the length of the test in progress file */ + if ( pass ) { + + if ( HDstat(filename, &buf) != 0 ) { + + if ( verbose ) { + + HDfprintf(stdout, "%s: HDstat() failed with errno = %d.\n", + fcn_name, errno); + } + failure_mssg = "stat() failed on test in progress file."; + pass = FALSE; + + } else { + + if ( (buf.st_size) == 0 ) { + + failure_mssg = "test in progress file empty?!?"; + pass = FALSE; + + } else if ( (buf.st_size) >= 512 ) { + + failure_mssg = "test in progress file too big?!?"; + pass = FALSE; + + } else { + + input_len = (size_t)(buf.st_size); + + if ( verbose ) { + + HDfprintf(stdout, "%s: input_len = %d.\n", + fcn_name, (int)input_len); + } + } + } + } + + /* open the test in progress file */ + if ( pass ) { + + if ( (fd = HDopen(filename, O_RDONLY, 0777)) == -1 ) { + + if ( verbose ) { + + HDfprintf(stdout, "%s: HDopen(i) failed with errno = %d.\n", + fcn_name, errno); + } + failure_mssg = "Can't open test in progress file."; + pass = FALSE; + } + } + + /* read the contents of the test in progress file */ + if ( pass ) + { + result = HDread(fd, buffer, input_len); + + if ( result != (int)input_len ) { + + if ( verbose ) { + + HDfprintf(stdout, + "%s: HDread() failed. result = %d, errno = %d.\n", + fcn_name, (int)result, errno); + } + failure_mssg = "error reading test in progress file."; + pass = FALSE; + } + + buffer[input_len] = '\0'; + } + + if ( fd != -1 ) { + + if ( HDclose(fd) != 0 ) { + + if ( verbose ) { + + HDfprintf(stdout, "%s: HDclose() failed with errno = %d.\n", + fcn_name, errno); + } + + if ( pass ) { + + failure_mssg = "Can't close test in progress file."; + pass = FALSE; + } + } + } + + HDremove(filename); + + if ( pass ) { + + if ( strcmp(str, buffer) != 0 ) { + + if ( verbose ) { + + HDfprintf(stdout, + "%s: expected/actual test in progress = %s/%s\n", + fcn_name, str, buffer); + } + + pass = FALSE; + failure_mssg = "Unexpected test in progress?!?"; + } + } + + return; + +} /* check_test_in_progress() */ + + +/*------------------------------------------------------------------------- + * Function: file_exists() + * + * Purpose: If pass 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 pass + * to FALSE and set failure_mssg to point to an appropriate + * error message. + * + * Do nothing and return FALSE if pass is FALSE on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 5//08 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +static hbool_t +file_exists(const char * file_path_ptr) +{ + const char * fcn_name = "file_exists()"; + hbool_t ret_val = FALSE; /* will set to TRUE if necessary */ + hbool_t verbose = FALSE; + h5_stat_t buf; + + if ( pass ) { + + if ( file_path_ptr == NULL ) { + + failure_mssg = "file_path_ptr NULL on entry?!?", + pass = FALSE; + } + } + + if ( pass ) { + + if ( HDstat(file_path_ptr, &buf) == 0 ) { + + if ( verbose ) { + + HDfprintf(stdout, "%s: HDstat(%s) succeeded.\n", fcn_name, + file_path_ptr); + } + + ret_val = TRUE; + + } else if ( errno == ENOENT ) { + + if ( verbose ) { + + HDfprintf(stdout, "%s: HDstat(%s) failed with ENOENT\n", + fcn_name, file_path_ptr); + } + + } else { + + if ( verbose ) { + + HDfprintf(stdout, + "%s: HDstat() failed with unexpected errno = %d.\n", + fcn_name, errno); + } + + failure_mssg = "HDstat() returned unexpected value."; + pass = FALSE; + + } + } + + return(ret_val); + +} /* file_exists() */ + + +/*------------------------------------------------------------------------- + * Function: mark_test_in_progress() + * + * Purpose: If pass is true on entry, test to see if the test in + * progress file exists. If it does, set pass to FALSE + * and set a failure message. + * + * If the test in progress file doesn't exist, create it, + * open it, write the supplied string to it, and then close + * it. If any errors are detected, set pass to FALSE, and + * set the appropriate failure message. + * + * Do nothing if pass is FALSE on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 10/9/08 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +static void +mark_test_in_progress(const char * str) + +{ + const char * fcn_name = "mark_test_in_progress()"; + char filename[512]; + hbool_t show_progress = FALSE; + hbool_t verbose = FALSE; + int cp = 0; + herr_t result; + int fd = -1; + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass, cp++); + HDfflush(stdout); + } + + if ( pass ) { + + if ( ( str == NULL ) || + ( strlen(str) >= 512 ) ) { + + pass = FALSE; + failure_mssg = "bad str on entry to mark_test_in_progress()."; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass, cp++); + HDfflush(stdout); + } + + /* setup the journal file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[4], H5P_DEFAULT, filename, + sizeof(filename)) == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed.\n"; + } + else if ( strlen(filename) >= 512 ) { + + pass = FALSE; + failure_mssg = "test in progress file name too long.\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass, cp++); + HDfflush(stdout); + } + + if ( verbose ) { + HDfprintf(stdout, "%s filename = \"%s\".\n", fcn_name, filename); + HDfflush(stdout); + } + + if ( ( pass ) && ( file_exists(filename) ) ) { + + pass = FALSE; + failure_mssg = "test already in progress?!?"; + } + + /* open the test in progress file */ + if ( pass ) { + + if ( (fd = HDopen(filename, O_WRONLY|O_CREAT|O_TRUNC, 0777)) + == -1 ) { + + if ( verbose ) { + + HDfprintf(stdout, "%s: HDopen(i) failed with errno = %d.\n", + fcn_name, errno); + } + failure_mssg = "Can't open test in progress file."; + pass = FALSE; + } + } + + if ( pass ) { + + result = HDwrite(fd, str, strlen(str)); + + if ( result != (int)strlen(str) ) { + + if ( verbose ) { + + HDfprintf(stdout, + "%s: HDwrite() failed. result = %d, errno = %d.\n", + fcn_name, (int)result, errno); + } + failure_mssg = "error writing test in progress file."; + pass = FALSE; + } + } + + if ( fd != -1 ) { + + if ( HDclose(fd) != 0 ) { + + if ( verbose ) { + + HDfprintf(stdout, "%s: HDclose() failed with errno = %d.\n", + fcn_name, errno); + } + + if ( pass ) { + + failure_mssg = "Can't close test in progress file."; + pass = FALSE; + } + } + } + + return; + +} /* mark_test_in_progress() */ + + +/*------------------------------------------------------------------------- + * Function: setup_cache_for_journaling() + * + * Purpose: If pass 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 pass to FALSE, and set failure_mssg + * to point to an appropriate failure message. + * + * Do nothing if pass is FALSE on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 5/13/08 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +static void +setup_cache_for_journaling(const char * hdf_file_name, + const char * journal_file_name, + hid_t * file_id_ptr, + H5F_t ** file_ptr_ptr, + H5C_t ** cache_ptr_ptr, +#if USE_CORE_DRIVER + hbool_t use_core_driver_if_avail) +#else /* USE_CORE_DRIVER */ + hbool_t UNUSED use_core_driver_if_avail) +#endif /* USE_CORE_DRIVER */ +{ + const char * fcn_name = "setup_cache_for_journaling()"; + hbool_t show_progress = FALSE; + hbool_t verbose = FALSE; + int cp = 0; + herr_t result; + H5AC_cache_config_t mdj_config = + { + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ ( 64 * 1024 ), + /* double min_clean_fraction = */ 0.5, + /* size_t max_size = */ (16 * 1024 * 1024 ), + /* size_t min_size = */ ( 8 * 1024 ), + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__off, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 1.0, + /* double flash_threshold = */ 0.25, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__off, + /* double upper_hr_threshold = */ 0.999, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1, + /* int dirty_bytes_threshold = */ (8 * 1024) + }; + H5AC_jnl_config_t jnl_config = + { + /* int version = */ H5AC__CURR_JNL_CONFIG_VER, + /* hbool_t enable_journaling = */ TRUE, + /* char journal_file_path[] = */ "", + /* hbool_t journal_recovered = */ FALSE, + /* size_t jbrb_buf_size = */ (8 * 1024), + /* int jbrb_num_bufs = */ 2, + /* hbool_t jbrb_use_aio = */ FALSE, + /* hbool_t jbrb_human_readable = */ TRUE + }; + hid_t fapl_id = -1; + hid_t file_id = -1; + haddr_t actual_base_addr; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + + if ( pass ) + { + if ( ( hdf_file_name == NULL ) || + ( journal_file_name == NULL ) || + ( file_id_ptr == NULL ) || + ( file_ptr_ptr == NULL ) || + ( cache_ptr_ptr == NULL ) ) { + + failure_mssg = + "Bad param(s) on entry to setup_cache_for_journaling().\n"; + pass = FALSE; + } + else if ( strlen(journal_file_name) > H5AC__MAX_JOURNAL_FILE_NAME_LEN ) + { + failure_mssg = "journal file name too long.\n"; + pass = FALSE; + + } else { + + strcpy(jnl_config.journal_file_path, journal_file_name); + + if ( verbose ) { + + HDfprintf(stdout, "%s: HDF file name = \"%s\".\n", + fcn_name, hdf_file_name); + HDfprintf(stdout, "%s: journal file name = \"%s\".\n", + fcn_name, journal_file_name); + } + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* create a file access propertly list. */ + if ( pass ) { + + fapl_id = H5Pcreate(H5P_FILE_ACCESS); + + if ( fapl_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pcreate() failed.\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* call H5Pset_libver_bounds() on the fapl_id */ + if ( pass ) { + + if ( H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, + H5F_LIBVER_LATEST) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pset_libver_bounds() failed.\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + if ( pass ) { + + result = H5Pset_mdc_config(fapl_id, (H5AC1_cache_config_t *)&mdj_config); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pset_mdc_config() failed.\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + if ( pass ) { + + result = H5Pset_jnl_config(fapl_id, &jnl_config); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pset_mdc_config() failed.\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + +#if USE_CORE_DRIVER + if ( ( pass ) && ( use_core_driver_if_avail ) ) { + + if ( H5Pset_fapl_core(fapl_id, 64 * 1024 * 1024, FALSE) < 0 ) { + + pass = FALSE; + failure_mssg = "H5P_set_fapl_core() failed.\n"; + } + } +#endif /* USE_CORE_DRIVER */ + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + + /**************************************/ + /* Create a file with the fapl above. */ + /**************************************/ + + /* create the file using fapl_id */ + if ( pass ) { + + file_id = H5Fcreate(hdf_file_name, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id); + + if ( file_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fcreate() failed.\n"; + + } else { + + file_ptr = (H5F_t *)H5I_object_verify(file_id, H5I_FILE); + + if ( file_ptr == NULL ) { + + pass = FALSE; + failure_mssg = "Can't get file_ptr."; + + if ( verbose ) { + HDfprintf(stdout, "%s: Can't get file_ptr.\n", fcn_name); + } + } + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + if ( pass ) { /* allocate space for test entries */ + + actual_base_addr = H5MF_alloc(file_ptr, H5FD_MEM_DEFAULT, H5P_DEFAULT, + (hsize_t)(ADDR_SPACE_SIZE + BASE_ADDR)); + + if ( actual_base_addr == HADDR_UNDEF ) { + + pass = FALSE; + failure_mssg = "H5MF_alloc() failed."; + + if ( verbose ) { + HDfprintf(stdout, "%s: H5MF_alloc() failed.\n", fcn_name); + } + + } else if ( actual_base_addr > BASE_ADDR ) { + + /* If this happens, must increase BASE_ADDR so that the + * actual_base_addr is <= BASE_ADDR. This should only happen + * if the size of the superblock is increase. + */ + pass = FALSE; + failure_mssg = "actual_base_addr > BASE_ADDR"; + + if ( verbose ) { + HDfprintf(stdout, "%s: actual_base_addr > BASE_ADDR.\n", + fcn_name); + } + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* get a pointer to the files internal data structure and then + * to the cache structure + */ + if ( pass ) { + + if ( file_ptr->shared->cache == NULL ) { + + pass = FALSE; + failure_mssg = "can't get cache pointer(1).\n"; + + } else { + + cache_ptr = file_ptr->shared->cache; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + reset_entries(); + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* close the fapl */ + if ( pass ) { + + if ( H5Pclose(fapl_id) < 0 ) { + + pass = FALSE; + failure_mssg = "error closing fapl.\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + if ( pass ) { + + *file_id_ptr = file_id; + *file_ptr_ptr = file_ptr; + *cache_ptr_ptr = cache_ptr; + } + + if ( show_progress ) + HDfprintf(stdout, "%s: cp = %d -- exiting.\n", fcn_name, cp++); + + return; + +} /* setup_cache_for_journaling() */ + + +/*************************************************************************** + * Function: setup_mdj_file_marking_on_create_test + * + * Purpose: Setup test to verify that HDF5 file is marked as having + * journaling in progress when journaling is enabled at file + * creation time. + * + * Do this by creating a test file with metadata journaling + * enabled, and then exiting without closing the file. + * + * Return: void + * + * Programmer: John Mainzer + * 10/8/08 + * + **************************************************************************/ + +static void +setup_mdj_file_marking_on_create_test(hbool_t verbose) +{ + const char * fcn_name = "setup_mdj_file_marking_on_create_test():"; + char filename[512]; + char journal_filename[H5AC__MAX_JOURNAL_FILE_NAME_LEN + 1]; + hbool_t show_progress = FALSE; + int cp = 0; + uint64_t trans_num; + hid_t file_id = -1; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + + /* setup the file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, + sizeof(filename)) == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed (1).\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass, cp++); + HDfflush(stdout); + } + + if ( verbose ) { + HDfprintf(stdout, "%s filename = \"%s\".\n", fcn_name, filename); + HDfflush(stdout); + } + + /* setup the journal file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[3], H5P_DEFAULT, journal_filename, + sizeof(journal_filename)) == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed (2).\n"; + } + else if ( strlen(journal_filename) >= + H5AC__MAX_JOURNAL_FILE_NAME_LEN ) { + + pass = FALSE; + failure_mssg = "journal file name too long.\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", + fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( verbose ) { + HDfprintf(stdout, "%s journal filename = \"%s\".\n", + fcn_name, journal_filename); + HDfflush(stdout); + } + + if ( pass ) { + + /* clean out any existing journal file */ + HDremove(journal_filename); + setup_cache_for_journaling(filename, journal_filename, &file_id, + &file_ptr, &cache_ptr, FALSE); + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + /* run a dummy transaction to fource metadata journaling + * initialization. + */ + H5C_begin_transaction(cache_ptr, &trans_num, "dummy"); + H5C_end_transaction(file_ptr, H5AC_dxpl_id, cache_ptr, + trans_num, "dummy"); + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( ( verbose ) && ( ! pass ) ) { + HDfprintf(stdout, "%s%d failure_mssg = \"%s\".\n", + fcn_name, pass, failure_mssg); + HDfflush(stdout); + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d child exiting.\n", + fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + mark_test_in_progress("mdj_file_marking_on_create_test"); + + abort(); + + } + + return; + +} /* setup_mdj_file_marking_on_create_test() */ + + +/*************************************************************************** + * Function: check_mdj_file_marking_on_create_test + * + * Purpose: Check to see if a test to verify that a HDF5 file is marked + * as having journaling in progress when journaling is enabled + * at file creation time passes. + * + * Do this by trying to open the test file created by the + * associated setup function. Open should fail, as the file + * should be marked as journaling in progress. + * + * On either success or failure, clean up the test file and + * the associated journal file. + * + * Return: void + * + * Programmer: John Mainzer + * 10/8/08 + * + **************************************************************************/ + +static void +check_mdj_file_marking_on_create_test(hbool_t verbose) +{ + const char * fcn_name = "check_mdj_file_marking_on_create_test():"; + char filename[512]; + char journal_filename[H5AC__MAX_JOURNAL_FILE_NAME_LEN + 1]; + hbool_t show_progress = FALSE; + int cp = 0; + hid_t file_id = -1; + hid_t fapl_id = -1; + + check_test_in_progress("mdj_file_marking_on_create_test"); + + /* setup the file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, + sizeof(filename)) == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed (1).\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass, cp++); + HDfflush(stdout); + } + + if ( verbose ) { + HDfprintf(stdout, "%s filename = \"%s\".\n", fcn_name, filename); + HDfflush(stdout); + } + + /* setup the journal file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[3], H5P_DEFAULT, journal_filename, + sizeof(journal_filename)) == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed (2).\n"; + } + else if ( strlen(journal_filename) >= + H5AC__MAX_JOURNAL_FILE_NAME_LEN ) { + + pass = FALSE; + failure_mssg = "journal file name too long.\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( verbose ) { + HDfprintf(stdout, "%s journal filename = \"%s\".\n", + fcn_name, journal_filename); + HDfflush(stdout); + } + + if ( pass ) { + + if ( show_progress ) { + + HDfprintf(stdout, "%s:%d: cp = %d child exited as expected.\n", + fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + /* create a file access propertly list. */ + if ( pass ) { + + fapl_id = H5Pcreate(H5P_FILE_ACCESS); + + if ( fapl_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pcreate() failed.\n"; + } + } + + if ( show_progress ) { + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + /* call H5Pset_libver_bounds() on the fapl_id */ + if ( pass ) { + + if ( H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, + H5F_LIBVER_LATEST) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pset_libver_bounds() failed.\n"; + } + } + + if ( show_progress ) { + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + /* attempt to open the file -- should fail as the child + * exited without closing the file properly, and thus + * the file should still be marked as having journaling + * in progress. + */ + + if ( pass ) { + + H5E_BEGIN_TRY { + + file_id = H5Fopen(filename, H5F_ACC_RDWR, fapl_id); + + } H5E_END_TRY; + + if ( file_id >= 0 ) { + + pass = FALSE; + failure_mssg = "H5Fopen() succeeded - 1."; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + /* delete the HDF5 file and journal file */ +#if 1 + HDremove(filename); + HDremove(journal_filename); +#endif + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d parent done.\n", + fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + } + + return; + +} /* check_mdj_file_marking_on_create_test() */ + + +/*************************************************************************** + * Function: setup_mdj_file_marking_after_open_test + * + * Purpose: Setup a test to verify that a HDF5 file is marked as having + * journaling in progress when journaling is enabled on an + * open file. + * + * Do this by: + * + * 1) creating a test file, + * + * 2) writing some data to it, + * + * 3) enable journaling on the open file via a call to + * H5Fset_mdc_config() + * + * 4) exiting without closing the file. + * + * set pass to FALSE and set a failure message if errors + * are detected. + * + * Return: void + * + * Programmer: John Mainzer + * 10/8/08 + * + **************************************************************************/ + +static void +setup_mdj_file_marking_after_open_test(hbool_t verbose) +{ + const char * fcn_name = "setup_mdj_file_marking_after_open_test():"; + char filename[512]; + char journal_filename[H5AC__MAX_JOURNAL_FILE_NAME_LEN + 1]; + hbool_t show_progress = FALSE; + herr_t result; + int cp = 0; + hid_t file_id = -1; + hid_t fapl_id = -1; + hid_t dataset_id = -1; + hid_t dataspace_id = -1; + hsize_t dims[2]; + H5AC_jnl_config_t jnl_config; + + /* setup the file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, + sizeof(filename)) == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed (1).\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass, cp++); + HDfflush(stdout); + } + + if ( verbose ) { + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass, cp++); + HDfflush(stdout); + } + + /* setup the journal file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[3], H5P_DEFAULT, journal_filename, + sizeof(journal_filename)) == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed (2).\n"; + } + else if ( strlen(journal_filename) >= + H5AC__MAX_JOURNAL_FILE_NAME_LEN ) { + + pass = FALSE; + failure_mssg = "journal file name too long.\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( verbose ) { + HDfprintf(stdout, "%s journal filename = \"%s\".\n", + fcn_name, journal_filename); + HDfflush(stdout); + } + + if ( pass ) { + + /* create a file access propertly list. */ + if ( pass ) { + + fapl_id = H5Pcreate(H5P_FILE_ACCESS); + + if ( fapl_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pcreate() failed.\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass, cp++); + HDfflush(stdout); + } + + /* call H5Pset_libver_bounds() on the fapl_id */ + if ( pass ) { + + if ( H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, + H5F_LIBVER_LATEST) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pset_libver_bounds() failed.\n"; + } + } + + /* open the file with a fapl indicating latest version of + * the file format. + */ + if ( pass ) { + + file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id); + + if ( file_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fcreate() failed.\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( pass ) { + + dims[0] = 4; + dims[1] = 6; + dataspace_id = H5Screate_simple(2, dims, NULL); + + if ( dataspace_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Screate_simple() failed."; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( pass ) { + + /* Create the dataset. */ + dataset_id = H5Dcreate2(file_id, "/dset", H5T_STD_I32BE, + dataspace_id, H5P_DEFAULT, + H5P_DEFAULT, H5P_DEFAULT); + + if ( dataspace_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Dcreate2() failed."; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + /* now enable journaling */ + if ( pass ) { + + jnl_config.version = H5AC__CURR_JNL_CONFIG_VER; + + result = H5Fget_jnl_config(file_id, &jnl_config); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fget_jnl_config() failed.\n"; + } + + /* set journaling config fields to taste */ + jnl_config.enable_journaling = TRUE; + + strcpy(jnl_config.journal_file_path, journal_filename); + + 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_human_readable = TRUE; + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( pass ) { + + result = H5Fset_jnl_config(file_id, &jnl_config); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fset_jnl_config() failed.\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( ( verbose ) && ( ! pass ) ) { + HDfprintf(stdout, "%s%d failure_mssg = \"%s\".\n", + fcn_name, pass, failure_mssg); + HDfflush(stdout); + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d exiting.\n", + fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + mark_test_in_progress("mdj_file_marking_after_open_test"); + + abort(); + + } + + return; + +} /* setup_mdj_file_marking_after_open_test() */ + + +/*************************************************************************** + * Function: check_mdj_file_marking_after_open_test + * + * Purpose: Check to see if the test to rvVerify that a HDF5 file is + * marked as having journaling in progress when journaling is + * enabled on an open file passed. + * + * Try to open the test file created by the associated setup + * function. Open should fail, as the file should be marked + * as journaling in progress. + * + * On either success or failure, clean up the test file and + * the associated journal file. + * + * Return: void + * + * Programmer: John Mainzer + * 10/8/08 + * + **************************************************************************/ + +static void +check_mdj_file_marking_after_open_test(hbool_t verbose) +{ + const char * fcn_name = "check_mdj_file_marking_after_open_test():"; + char filename[512]; + char journal_filename[H5AC__MAX_JOURNAL_FILE_NAME_LEN + 1]; + hbool_t show_progress = FALSE; + int cp = 0; + hid_t file_id = -1; + hid_t fapl_id = -1; + + check_test_in_progress("mdj_file_marking_after_open_test"); + + /* setup the file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, + sizeof(filename)) == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed (1).\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass, cp++); + HDfflush(stdout); + } + + if ( verbose ) { + HDfprintf(stdout, "%s filename = \"%s\".\n", fcn_name, filename); + HDfflush(stdout); + } + + /* setup the journal file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[3], H5P_DEFAULT, journal_filename, + sizeof(journal_filename)) == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed (2).\n"; + } + else if ( strlen(journal_filename) >= + H5AC__MAX_JOURNAL_FILE_NAME_LEN ) { + + pass = FALSE; + failure_mssg = "journal file name too long.\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", + fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( verbose ) { + HDfprintf(stdout, "%s journal filename = \"%s\".\n", + fcn_name, journal_filename); + HDfflush(stdout); + } + + if ( pass ) { + + /* create a file access propertly list. */ + if ( pass ) { + + fapl_id = H5Pcreate(H5P_FILE_ACCESS); + + if ( fapl_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pcreate() failed.\n"; + } + } + + if ( show_progress ) { + HDfprintf(stdout, "%s:%d cp = %d.\n", + fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + /* call H5Pset_libver_bounds() on the fapl_id */ + if ( pass ) { + + if ( H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, + H5F_LIBVER_LATEST) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pset_libver_bounds() failed.\n"; + } + } + + if ( show_progress ) { + HDfprintf(stdout, "%s%d cp = %d.\n", + fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + /* attempt to open the file -- should fail as the setup program + * exited without closing the file properly, and thus + * the file should still be marked as having journaling + * in progress. + */ + + if ( pass ) { + + H5E_BEGIN_TRY { + + file_id = H5Fopen(filename, H5F_ACC_RDWR, fapl_id); + + } H5E_END_TRY; + + if ( file_id >= 0 ) { + + pass = FALSE; + failure_mssg = "H5Fopen() succeeded - 2."; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", + fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + /* delete the HDF5 file and journal file */ +#if 1 + HDremove(filename); + HDremove(journal_filename); +#endif + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d parent done.\n", + fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + } + + return; + +} /* check_mdj_file_marking_after_open_test() */ + + +/*************************************************************************** + * Function: setup_mdj_file_marking_on_open_test + * + * Purpose: Setup test to verify that a HDF5 file is marked as having + * journaling in progress when journaling is enabled at file + * open time. + * + * Do this by: + * + * 1) creating a test file in the child, + * + * 2) writing some data to it, + * + * 3) closing the test file. + * + * 4) re-openting the test file with metadata journaling + * enabled, and then + * + * 5) exiting from the child without closing the file. + * + * Return: void + * + * Programmer: John Mainzer + * 10/8/08 + * + **************************************************************************/ + +static void +setup_mdj_file_marking_on_open_test(hbool_t verbose) +{ + const char * fcn_name = "setup_mdj_file_marking_on_open_test():"; + char filename[512]; + char journal_filename[H5AC__MAX_JOURNAL_FILE_NAME_LEN + 1]; + hbool_t show_progress = FALSE; + herr_t result; + int cp = 0; + hid_t file_id = -1; + hid_t fapl_id = -1; + hid_t dataset_id = -1; + hid_t dataspace_id = -1; + hsize_t dims[2]; + H5F_t * file_ptr = NULL; + H5AC_jnl_config_t jnl_config; + + /* setup the file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, + sizeof(filename)) == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed (1).\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass, cp++); + HDfflush(stdout); + } + + if ( verbose ) { + HDfprintf(stdout, "%s filename = \"%s\".\n", fcn_name, filename); + HDfflush(stdout); + } + + /* setup the journal file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[3], H5P_DEFAULT, journal_filename, + sizeof(journal_filename)) == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed (2).\n"; + } + else if ( strlen(journal_filename) >= + H5AC__MAX_JOURNAL_FILE_NAME_LEN ) { + + pass = FALSE; + failure_mssg = "journal file name too long.\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", + fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( verbose ) { + HDfprintf(stdout, "%s journal filename = \"%s\".\n", + fcn_name, journal_filename); + HDfflush(stdout); + } + + if ( pass ) { + +#if 0 /* JRM */ + /* Quincey: + * + * It looks like we may have a bug here -- + * + * In the original version of this test, I: + * + * 1) created a file using the default FAPL, + * + * 2) added a data set to the file + * + * 3) closed it, + * + * 4) tried to re-open it using a FAPL that set the + * latest format, and enabled journaling. + * + * I hit an assertion failure on step 4. + * + * I then modified the above to select the latest file + * format on file create, and the problem went away. + * + * Is this as it should be, or do we have a bug here? + * + * JRM -- 7/9/08 + */ + + if ( pass ) { + + file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, + H5P_DEFAULT); + + if ( file_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fcreate() failed.\n"; + } + } +#else /* JRM */ + + /* create a file access propertly list. */ + if ( pass ) { + + fapl_id = H5Pcreate(H5P_FILE_ACCESS); + + if ( fapl_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pcreate() failed.\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + /* call H5Pset_libver_bounds() on the fapl_id */ + if ( pass ) { + + if ( H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, + H5F_LIBVER_LATEST) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pset_libver_bounds() failed.\n"; + } + } + + /* open the file with a fapl indicating latest version of + * the file format. + */ + if ( pass ) { + + file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id); + + if ( file_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fcreate() failed.\n"; + } + } +#endif /* JRM */ + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( pass ) { + + dims[0] = 4; + dims[1] = 6; + dataspace_id = H5Screate_simple(2, dims, NULL); + + if ( dataspace_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Screate_simple() failed."; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( pass ) { + + /* Create the dataset. */ + dataset_id = H5Dcreate2(file_id, "/dset", H5T_STD_I32BE, + dataspace_id, H5P_DEFAULT, + H5P_DEFAULT, H5P_DEFAULT); + + if ( dataspace_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Dcreate2() failed."; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( pass ) { + + /* close the data set, the data space, and the file */ + if ( ( H5Dclose(dataset_id) < 0 ) || + ( H5Sclose(dataspace_id) < 0 ) || + ( H5Pclose(fapl_id) < 0 ) || + ( H5Fclose(file_id) < 0 ) ) { + + pass = FALSE; + failure_mssg = "data set, data space, or file close failed."; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + /* create a file access propertly list. */ + if ( pass ) { + + fapl_id = H5Pcreate(H5P_FILE_ACCESS); + + if ( fapl_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pcreate() failed.\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + /* call H5Pset_libver_bounds() on the fapl_id */ + if ( pass ) { + + if ( H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, + H5F_LIBVER_LATEST) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pset_libver_bounds() failed.\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( pass ) { + + jnl_config.version = H5AC__CURR_JNL_CONFIG_VER; + + result = H5Pget_jnl_config(fapl_id, &jnl_config); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pget_jnl_config() failed.\n"; + } + + /* set journaling config fields to taste */ + jnl_config.enable_journaling = TRUE; + + strcpy(jnl_config.journal_file_path, journal_filename); + + 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_human_readable = TRUE; + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( pass ) { + + result = H5Pset_jnl_config(fapl_id, &jnl_config); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pset_jnl_config() failed.\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + /* open the file using fapl_id */ + if ( pass ) { + + file_id = H5Fopen(filename, H5F_ACC_RDWR, fapl_id); + + if ( file_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fopen() failed (9).\n"; + + } else { + + file_ptr = (H5F_t *)H5I_object_verify(file_id, H5I_FILE); + + if ( file_ptr == NULL ) { + + pass = FALSE; + failure_mssg = "Can't get file_ptr."; + + if ( verbose ) { + + HDfprintf(stdout, "%s: Can't get file_ptr.\n",fcn_name); + } + } + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( ( verbose ) && ( ! pass ) ) { + + HDfprintf(stdout, "%s%d failure_mssg = \"%s\".\n", + fcn_name, pass, failure_mssg); + HDfflush(stdout); + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d exiting.\n", + fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + mark_test_in_progress("mdj_file_marking_on_open_test"); + + abort(); + } + + return; + +} /* setup_mdj_file_marking_on_open_test() */ + + +/*************************************************************************** + * Function: check_mdj_file_marking_on_open_test + * + * Purpose: Check to verify that a HDF5 file is marked as having + * journaling in progress when journaling is enabled at + * file open time. + * + * Do this by trying to open the test file created by the + * associated setup function. + * + * Open should fail, as the file should be marked as journaling + * in progress. + * + * On either success or failure, clean up the test file and + * the associated journal file. + * + * Return: void + * + * Programmer: John Mainzer + * 10/8/08 + * + **************************************************************************/ + +static void +check_mdj_file_marking_on_open_test(hbool_t verbose) +{ + const char * fcn_name = "check_mdj_file_marking_on_open_test():"; + char filename[512]; + char journal_filename[H5AC__MAX_JOURNAL_FILE_NAME_LEN + 1]; + hbool_t show_progress = FALSE; + int cp = 0; + hid_t file_id = -1; + hid_t fapl_id = -1; + + check_test_in_progress("mdj_file_marking_on_open_test"); + + /* setup the file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, + sizeof(filename)) == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed (1).\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass, cp++); + HDfflush(stdout); + } + + if ( verbose ) { + HDfprintf(stdout, "%s filename = \"%s\".\n", fcn_name, filename); + HDfflush(stdout); + } + + /* setup the journal file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[3], H5P_DEFAULT, journal_filename, + sizeof(journal_filename)) == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed (2).\n"; + } + else if ( strlen(journal_filename) >= + H5AC__MAX_JOURNAL_FILE_NAME_LEN ) { + + pass = FALSE; + failure_mssg = "journal file name too long.\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( verbose ) { + HDfprintf(stdout, "%s journal filename = \"%s\".\n", + fcn_name, journal_filename); + HDfflush(stdout); + } + + if ( pass ) { + + /* create a file access propertly list. */ + if ( pass ) { + + fapl_id = H5Pcreate(H5P_FILE_ACCESS); + + if ( fapl_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pcreate() failed.\n"; + } + } + + if ( show_progress ) { + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + /* call H5Pset_libver_bounds() on the fapl_id */ + if ( pass ) { + + if ( H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, + H5F_LIBVER_LATEST) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pset_libver_bounds() failed.\n"; + } + } + + if ( show_progress ) { + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + /* attempt to open the file -- should fail as the child + * exited without closing the file properly, and thus + * the file should still be marked as having journaling + * in progress. + */ + + if ( pass ) { + + H5E_BEGIN_TRY { + + file_id = H5Fopen(filename, H5F_ACC_RDWR, fapl_id); + + } H5E_END_TRY; + + if ( file_id >= 0 ) { + + pass = FALSE; + failure_mssg = "H5Fopen() succeeded - 3."; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + /* delete the HDF5 file and journal file */ +#if 1 + HDremove(filename); + HDremove(journal_filename); +#endif + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d done.\n", + fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + } + + return; + +} /* check_mdj_file_marking_on_open_test() */ + + +/*************************************************************************** + * Function: setup_mdj_file_unmarking_on_file_close_test + * + * Purpose: Setup test to verify that a HDF5 file on which journaling + * is enabled is marked as having not having journaling in + * progress when the file is closed. + * + * Do this as follows: + * + * 1) create a test file with metadata journaling + * enabled, + * + * 2) perform some operation(s) that dirty metadata + * and result in journal activity. + * + * 3) close the file. + * + * Return: void + * + * Programmer: John Mainzer + * 10/8/08 + * + **************************************************************************/ + +static void +setup_mdj_file_unmarking_on_file_close_test(hbool_t verbose) +{ + const char * fcn_name = "setup_mdj_file_unmarking_on_file_close_test():"; + char filename[512]; + char journal_filename[H5AC__MAX_JOURNAL_FILE_NAME_LEN + 1]; + hbool_t show_progress = FALSE; + int cp = 0; + hid_t file_id = -1; + hid_t dataset_id = -1; + hid_t dataspace_id = -1; + hsize_t dims[2]; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d -- entering.\n", fcn_name, pass, cp++); + HDfflush(stdout); + } + + /* setup the file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, + sizeof(filename)) == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed (1).\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass, cp++); + HDfflush(stdout); + } + + if ( verbose ) { + HDfprintf(stdout, "%s filename = \"%s\".\n", fcn_name, filename); + HDfflush(stdout); + } + + /* setup the journal file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[3], H5P_DEFAULT, journal_filename, + sizeof(journal_filename)) == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed (2).\n"; + } + else if ( strlen(journal_filename) >= + H5AC__MAX_JOURNAL_FILE_NAME_LEN ) { + + pass = FALSE; + failure_mssg = "journal file name too long.\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( verbose ) { + HDfprintf(stdout, "%s journal filename = \"%s\".\n", + fcn_name, journal_filename); + HDfflush(stdout); + } + + if ( pass ) { + + /* clean out any existing journal file */ + setup_cache_for_journaling(filename, journal_filename, &file_id, + &file_ptr, &cache_ptr, FALSE); + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + /* create a data set so as to force a bit of journaling */ + if ( pass ) { + + dims[0] = 4; + dims[1] = 6; + dataspace_id = H5Screate_simple(2, dims, NULL); + + if ( dataspace_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Screate_simple() failed."; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( pass ) { + + /* Create the dataset. */ + dataset_id = H5Dcreate2(file_id, "/dset", H5T_STD_I32BE, + dataspace_id, H5P_DEFAULT, + H5P_DEFAULT, H5P_DEFAULT); + + if ( dataspace_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Dcreate2() failed."; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + /* now close the file... */ + + if ( pass ) { + + if ( ( H5Dclose(dataset_id) < 0 ) || + ( H5Sclose(dataspace_id) < 0 ) || + ( H5Fclose(file_id) < 0 ) ) { + + pass = FALSE; + failure_mssg = "dataset, dataspace, or file close failed."; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + mark_test_in_progress("mdj_file_unmarking_on_file_close_test"); + + return; + +} /* setup_mdj_file_unmarking_on_file_close_test() */ + + +/*************************************************************************** + * Function: check_mdj_file_unmarking_on_file_close_test + * + * Purpose: Check to verify that a HDF5 file on which journaling is + * enabled is marked as having not having journaling in + * progress when the file is closed. + * + * To do this, attempt to re-open the file created by the + * associated setup function. This should succeed. + * + * On either success or failure, clean up the test file and + * the associated journal file. + * + * Return: void + * + * Programmer: John Mainzer + * 10/8/08 + * + **************************************************************************/ + +static void +check_mdj_file_unmarking_on_file_close_test(hbool_t verbose) +{ + const char * fcn_name = "check_mdj_file_unmarking_on_file_close_test():"; + char filename[512]; + char journal_filename[H5AC__MAX_JOURNAL_FILE_NAME_LEN + 1]; + hbool_t show_progress = FALSE; + int cp = 0; + hid_t fapl_id = -1; + hid_t file_id = -1; + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d -- entering.\n", fcn_name, pass, cp++); + HDfflush(stdout); + } + + check_test_in_progress("mdj_file_unmarking_on_file_close_test"); + + /* setup the file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, + sizeof(filename)) == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed (1).\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass, cp++); + HDfflush(stdout); + } + + if ( verbose ) { + HDfprintf(stdout, "%s filename = \"%s\".\n", fcn_name, filename); + HDfflush(stdout); + } + + /* setup the journal file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[3], H5P_DEFAULT, journal_filename, + sizeof(journal_filename)) == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed (2).\n"; + } + else if ( strlen(journal_filename) >= + H5AC__MAX_JOURNAL_FILE_NAME_LEN ) { + + pass = FALSE; + failure_mssg = "journal file name too long.\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( verbose ) { + HDfprintf(stdout, "%s journal filename = \"%s\".\n", + fcn_name, journal_filename); + HDfflush(stdout); + } + + /* attempt to re-open file created by setup. Should succeed */ + + /* create a file access propertly list. */ + if ( pass ) { + + fapl_id = H5Pcreate(H5P_FILE_ACCESS); + + if ( fapl_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pcreate() failed.\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + /* call H5Pset_libver_bounds() on the fapl_id */ + if ( pass ) { + + if ( H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, + H5F_LIBVER_LATEST) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pset_libver_bounds() failed.\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + /* attempt to open the file -- should succeed as the close should + * shutdown journaling. + */ + + if ( pass ) { + + file_id = H5Fopen(filename, H5F_ACC_RDWR, fapl_id); + + if ( file_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fopen() failed (10)."; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + /* close the file and fapl */ + + if ( pass ) { + + if ( ( H5Pclose(fapl_id) < 0 ) || + ( H5Fclose(file_id) < 0 ) ) { + + pass = FALSE; + failure_mssg = "fapl or file close failed."; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + /* delete the HDF5 file and journal file */ +#if 1 + HDremove(filename); + HDremove(journal_filename); +#endif + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + return; + +} /* verify_mdj_file_unmarking_on_file_close() */ + + +/*************************************************************************** + * Function: setup_mdj_file_unmarking_on_journaling_shutdown_test + * + * Purpose: Setup test to verify that a HDF5 file on which journaling + * is enabled is marked as having not having journaling in + * progress when journaling is disabled via the + * H5Fset_mdc_config() API call. + * + * Do this by: + * + * 1) creating a test file in the child with metadata + * journaling enabled, + * + * 2) performing some operation(s) that dirty metadata + * and result in journal activity. + * + * 3) using the H5Fset_mdc_config() to disable journaling. + * + * 4) exiting from the child without closing the file. + * + * Return: void + * + * Programmer: John Mainzer + * 7/9/08 + * + **************************************************************************/ + +static void +setup_mdj_file_unmarking_on_journaling_shutdown_test(hbool_t verbose) +{ + const char * fcn_name = + "setup_mdj_file_unmarking_on_journaling_shutdown_test():"; + char filename[512]; + char journal_filename[H5AC__MAX_JOURNAL_FILE_NAME_LEN + 1]; + hbool_t show_progress = FALSE; + herr_t result; + int cp = 0; + hid_t file_id = -1; + hid_t dataset_id = -1; + hid_t dataspace_id = -1; + hsize_t dims[2]; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + H5AC_jnl_config_t jnl_config; + + /* setup the file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, + sizeof(filename)) == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed (1).\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass, cp++); + HDfflush(stdout); + } + + if ( verbose ) { + HDfprintf(stdout, "%s filename = \"%s\".\n", fcn_name, filename); + HDfflush(stdout); + } + + /* setup the journal file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[3], H5P_DEFAULT, journal_filename, + sizeof(journal_filename)) == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed (2).\n"; + } + else if ( strlen(journal_filename) >= + H5AC__MAX_JOURNAL_FILE_NAME_LEN ) { + + pass = FALSE; + failure_mssg = "journal file name too long.\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( verbose ) { + HDfprintf(stdout, "%s journal filename = \"%s\".\n", + fcn_name, journal_filename); + HDfflush(stdout); + } + + if ( pass ) { + + /* clean out any existing journal file */ + setup_cache_for_journaling(filename, journal_filename, &file_id, + &file_ptr, &cache_ptr, FALSE); + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + /* create a data set so as to force a bit of journaling */ + if ( pass ) { + + dims[0] = 4; + dims[1] = 6; + dataspace_id = H5Screate_simple(2, dims, NULL); + + if ( dataspace_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Screate_simple() failed."; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( pass ) { + + /* Create the dataset. */ + dataset_id = H5Dcreate2(file_id, "/dset", H5T_STD_I32BE, + dataspace_id, H5P_DEFAULT, + H5P_DEFAULT, H5P_DEFAULT); + + if ( dataspace_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Dcreate2() failed."; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + /* now dis-able journaling */ + if ( pass ) { + + jnl_config.version = H5AC__CURR_JNL_CONFIG_VER; + + result = H5Fget_jnl_config(file_id, &jnl_config); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fget_jnl_config() failed.\n"; + } + + jnl_config.enable_journaling = FALSE; + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( pass ) { + + result = H5Fset_jnl_config(file_id, &jnl_config); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fset_jnl_config() failed.\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( ( verbose ) && ( ! pass ) ) { + HDfprintf(stdout, "%s%d failure_mssg = \"%s\".\n", + fcn_name, pass, failure_mssg); + HDfflush(stdout); + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d exiting.\n", + fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + mark_test_in_progress("mdj_file_unmarking_on_journaling_shutdown_test"); + + abort(); + } + + return; + +} /* setup_mdj_file_unmarking_on_journaling_shutdown_test() */ + + +/*************************************************************************** + * Function: check_mdj_file_unmarking_on_journaling_shutdown_test + * + * Purpose: Check to verify that a HDF5 file on which journaling is + * enabled is marked as having not having journaling in + * progress when journaling is disabled via the + * H5Fset_mdc_config() API call. + * + * Do this by trying to open the test file created by the + * associated setup function. + * + * Open should succeed, as the file should be marked as + * journaling not in progress. + * + * Note that the file will be synced out as part of the + * journaling shutdown process, so the metadata should be + * in a consistant state. Strictly speaking, this is not + * necessary for this test, for as long as the the file is + * not marked as having journaling in progress, we should + * pass. However, testing this without using the HDF5 + * library to open the file would be inconvenient -- hence + * we make use of the sync on journal shutdown to make the + * test easier to implement. + * + * On either success or failure, clean up the test file and + * the associated journal file. + * + * Return: void + * + * Programmer: John Mainzer + * 10/8/08 + * + **************************************************************************/ + +static void +check_mdj_file_unmarking_on_journaling_shutdown_test(hbool_t verbose) +{ + const char * fcn_name = + "check_mdj_file_unmarking_on_journaling_shutdown_test():"; + char filename[512]; + char journal_filename[H5AC__MAX_JOURNAL_FILE_NAME_LEN + 1]; + hbool_t show_progress = FALSE; + int cp = 0; + hid_t file_id = -1; + hid_t fapl_id = -1; + + check_test_in_progress("mdj_file_unmarking_on_journaling_shutdown_test"); + + /* setup the file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, + sizeof(filename)) == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed (1).\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass, cp++); + HDfflush(stdout); + } + + if ( verbose ) { + HDfprintf(stdout, "%s filename = \"%s\".\n", fcn_name, filename); + HDfflush(stdout); + } + + /* setup the journal file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[3], H5P_DEFAULT, journal_filename, + sizeof(journal_filename)) == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed (2).\n"; + } + else if ( strlen(journal_filename) >= + H5AC__MAX_JOURNAL_FILE_NAME_LEN ) { + + pass = FALSE; + failure_mssg = "journal file name too long.\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( verbose ) { + HDfprintf(stdout, "%s journal filename = \"%s\".\n", + fcn_name, journal_filename); + HDfflush(stdout); + } + + if ( pass ) { + + /* create a file access propertly list. */ + if ( pass ) { + + fapl_id = H5Pcreate(H5P_FILE_ACCESS); + + if ( fapl_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pcreate() failed.\n"; + } + } + + if ( show_progress ) { + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + /* call H5Pset_libver_bounds() on the fapl_id */ + if ( pass ) { + + if ( H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, + H5F_LIBVER_LATEST) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pset_libver_bounds() failed.\n"; + } + } + + if ( show_progress ) { + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + /* attempt to open the file -- should succeed as the setup function + * disabled journaling just before exiting, which should have + * had the dual effect of marking the file as not having + * journaling in progress, and syncing the file out to disk. + */ + + file_id = H5Fopen(filename, H5F_ACC_RDWR, fapl_id); + + if ( file_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fopen() failed (11)."; + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + /* close the file and fapl */ + + if ( pass ) { + + if ( ( H5Pclose(fapl_id) < 0 ) || + ( H5Fclose(file_id) < 0 ) ) { + + pass = FALSE; + failure_mssg = "fapl or file close failed."; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + /* delete the HDF5 file and journal file */ +#if 1 + HDremove(filename); + HDremove(journal_filename); +#endif + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d done.\n", + fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + } + + return; + +} /* check_mdj_file_unmarking_on_journaling_shutdown_test() */ + + +/*************************************************************************** + * Function: setup_mdj_file_unmarking_on_recovery_test + * + * Purpose: Setup test to verify that HDF5 file that is marked as as + * having journaling in progress is unmarked when the file + * is opened with the journal_recovered flag set in the + * cache configuration structure in the file access + * property list. + * + * Do this by creating a test file metadata journaling enabled, + * and then exiting without closing the file. Note that + * we must flush the file before exiting, as we want the file + * to be readable, but be marked as journaling in progress. + * + * Return: void + * + * Programmer: John Mainzer + * 7/14/08 + * + **************************************************************************/ + +static void +setup_mdj_file_unmarking_on_recovery_test(hbool_t verbose) +{ + const char * fcn_name = "setup_mdj_file_unmarking_on_recovery_test():"; + char filename[512]; + char journal_filename[H5AC__MAX_JOURNAL_FILE_NAME_LEN + 1]; + hbool_t show_progress = FALSE; + int cp = 0; + uint64_t trans_num; + hid_t file_id = -1; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + + /* setup the file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, + sizeof(filename)) == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed (1).\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass, cp++); + HDfflush(stdout); + } + + if ( verbose ) { + HDfprintf(stdout, "%s filename = \"%s\".\n", fcn_name, filename); + HDfflush(stdout); + } + + /* setup the journal file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[3], H5P_DEFAULT, journal_filename, + sizeof(journal_filename)) == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed (2).\n"; + } + else if ( strlen(journal_filename) >= + H5AC__MAX_JOURNAL_FILE_NAME_LEN ) { + + pass = FALSE; + failure_mssg = "journal file name too long.\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( verbose ) { + HDfprintf(stdout, "%s journal filename = \"%s\".\n", + fcn_name, journal_filename); + HDfflush(stdout); + } + + if ( pass ) { + + /* clean out any existing journal file */ + HDremove(journal_filename); + setup_cache_for_journaling(filename, journal_filename, &file_id, + &file_ptr, &cache_ptr, FALSE); + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + /* run a dummy transaction to fource metadata journaling + * initialization. + */ + H5C_begin_transaction(cache_ptr, &trans_num, "dummy"); + H5C_end_transaction(file_ptr, H5AC_dxpl_id, cache_ptr, + trans_num, "dummy"); + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + /* flush the file to ensure that it is in a readable state */ + if ( pass ) { + + if ( H5Fflush(file_id, H5F_SCOPE_GLOBAL) < 0 ) { + + if ( verbose ) { + + HDfprintf(stdout, "%s: H5Fflush() failed.\n", fcn_name); + HDfflush(stdout); + } + pass = FALSE; + failure_mssg = "H5Fflush() failed."; + } + } + + if ( ( verbose ) && ( ! pass ) ) { + HDfprintf(stdout, "%s%d failure_mssg = \"%s\".\n", + fcn_name, pass, failure_mssg); + HDfflush(stdout); + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d exiting.\n", + fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + mark_test_in_progress("mdj_file_unmarking_on_recovery_test"); + + abort(); + } + + return; + +} /* setup_mdj_file_unmarking_on_recovery_test() */ + + +/*************************************************************************** + * Function: check_mdj_file_unmarking_on_recovery_test + * + * Purpose: Check to verify that a HDF5 file that is marked as as + * having journaling in progress is unmarked when the file + * is opened with the journal_recovered flag set in the + * cache configuration structure in the file access property + * list. + * + * Do this by trying to open the test file created by the + * assocated setup function. + * + * Open should fail, as the file should be marked as journaling + * in progress. + * + * Try to open again with the journal_recovered flag set. This + * should succeed. + * + * Close and open again without the journal recovered flag + * set to verify that the file is no longer marked as + * having journaling in progress. + * + * On either success or failure, clean up the test file and + * the associated journal file. + * + * Return: void + * + * Programmer: John Mainzer + * 10/8/08 + * + **************************************************************************/ + +static void +check_mdj_file_unmarking_on_recovery_test(hbool_t verbose) +{ + const char * fcn_name = "check_mdj_file_unmarking_on_recovery_test():"; + char filename[512]; + char journal_filename[H5AC__MAX_JOURNAL_FILE_NAME_LEN + 1]; + hbool_t show_progress = FALSE; + herr_t result; + int cp = 0; + hid_t file_id = -1; + hid_t fapl_id = -1; + H5AC_jnl_config_t jnl_config; + + check_test_in_progress("mdj_file_unmarking_on_recovery_test"); + + /* setup the file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, + sizeof(filename)) == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed (1).\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass, cp++); + HDfflush(stdout); + } + + if ( verbose ) { + HDfprintf(stdout, "%s filename = \"%s\".\n", fcn_name, filename); + HDfflush(stdout); + } + + /* setup the journal file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[3], H5P_DEFAULT, journal_filename, + sizeof(journal_filename)) == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed (2).\n"; + } + else if ( strlen(journal_filename) >= + H5AC__MAX_JOURNAL_FILE_NAME_LEN ) { + + pass = FALSE; + failure_mssg = "journal file name too long.\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( verbose ) { + HDfprintf(stdout, "%s journal filename = \"%s\".\n", + fcn_name, journal_filename); + HDfflush(stdout); + } + + if ( pass ) { + + /* create a file access propertly list. */ + if ( pass ) { + + fapl_id = H5Pcreate(H5P_FILE_ACCESS); + + if ( fapl_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pcreate() failed.\n"; + } + } + + if ( show_progress ) { + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + /* call H5Pset_libver_bounds() on the fapl_id */ + if ( pass ) { + + if ( H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, + H5F_LIBVER_LATEST) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pset_libver_bounds() failed.\n"; + } + } + + if ( show_progress ) { + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + /* attempt to open the file -- should fail as the setup fcn + * exited without closing the file properly, and thus + * the file should still be marked as having journaling + * in progress. + */ + + if ( pass ) { + + H5E_BEGIN_TRY { + + file_id = H5Fopen(filename, H5F_ACC_RDWR, fapl_id); + + } H5E_END_TRY; + + if ( file_id >= 0 ) { + + pass = FALSE; + failure_mssg = "H5Fopen() succeeded - 4."; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + + /* now set the file recovered flag in the journal config + * structure in the fapl, and try to open again. Should + * succeed, and the file should not be marked as having + * journaling in progress. + */ + if ( pass ) { + + jnl_config.version = H5AC__CURR_JNL_CONFIG_VER; + + result = H5Pget_jnl_config(fapl_id, &jnl_config); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pget_jnl_config() failed.\n"; + } + + jnl_config.journal_recovered = TRUE; + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( pass ) { + + result = H5Pset_jnl_config(fapl_id, &jnl_config); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pset_jnl_config() failed(1).\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( pass ) { + + file_id = H5Fopen(filename, H5F_ACC_RDWR, fapl_id); + + if ( file_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fopen() failed (12)."; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( pass ) { + + if ( H5Fclose(file_id) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fclose() failed(1)."; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + /* now, turn off the journal recovered flag, and try to + * open the file again. Should succeed. + */ + + if ( pass ) { + + jnl_config.journal_recovered = FALSE; + + result = H5Pset_jnl_config(fapl_id, &jnl_config); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pset_jnl_config() failed(2).\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( pass ) { + + file_id = H5Fopen(filename, H5F_ACC_RDWR, fapl_id); + + if ( file_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fopen() failed (13)."; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( pass ) { + + if ( ( H5Fclose(file_id) < 0 ) || + ( H5Pclose(fapl_id) < 0 ) ) { + + pass = FALSE; + failure_mssg = "H5Fclose() or H5Pclose() failed(2)."; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d: cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + /* delete the HDF5 file and journal file */ +#if 1 + HDremove(filename); + HDremove(journal_filename); +#endif + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d done.\n", + fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + } + + return; + +} /* check_mdj_file_unmarking_on_recovery_test() */ + + +/*------------------------------------------------------------------------- + * Function: usage + * + * Purpose: Display a brief message describing the purpose and use + * of the program. + * + * Return: void + * + * Programmer: John Mainzer + * 10/8/08 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +void +usage(void) + +{ + const char * s[] = + { + "\n", + "cache_jnl_file_marking:\n", + "\n", + "Setup or check the results of the specified test.\n", + "\n", + "usage: cache_jnl_file_marking [verbose]\n", + "\n", + "where:\n", + "\n", + " ::= ( file_marking_after_open |\n", + " file_marking_on_create |\n", + " file_marking_on_open |\n", + " file_unmarking_on_file_close |\n", + " file_unmarking_on_journaling_shutdown |\n", + " file_unmarking_on_recovery )\n", + "\n", + " :: ( setup | check )\n", + "\n", + "Returns 0 on success, 1 on failure.\n", + "\n", + NULL, + }; + int i = 0; + + while ( s[i] != NULL ) { + + HDfprintf(stdout, "%s", s[i]); + i++; + } + + return; + +} /* usage() */ + + +/*------------------------------------------------------------------------- + * Function: main + * + * Purpose: Run the specified setup or check of metadata journaling + * HDF5 file marking or unmarking. + * + * Return: Success: 0 + * + * Failure: A positive integer. + * + * Programmer: John Mainzer + * 10/8/08 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +int +main(int argc, + char * argv[]) +{ + int express_test; + int result = 0; + hbool_t setup = FALSE; + hbool_t check = FALSE; + hbool_t verbose = FALSE; + + express_test = GetTestExpress(); + + pass = TRUE; + + if ( argc == 4 ) { + + if ( strcmp("verbose", argv[3]) == 0 ) { + + verbose = TRUE; + + } else { + + pass = FALSE; + usage(); + + } + + } else if ( argc != 3 ) { + + pass = FALSE; + usage(); + } + + if ( verbose ) { + + HDfprintf(stdout, "%s %s %s %s:\n", argv[0], argv[1], argv[2], argv[3]); + } + + if ( pass ) { + + if ( strcmp("setup", argv[2]) == 0 ) { + + setup = TRUE; + + } else if ( strcmp("check", argv[2]) == 0 ) { + + check = TRUE; + + } else { + + pass = FALSE; + usage(); + } + } + + if ( pass ) { + + H5open(); + + if ( strcmp("file_marking_after_open", argv[1]) == 0 ) { + + if ( setup ) { + + setup_mdj_file_marking_after_open_test(verbose); + + } else if ( check ) { + + check_mdj_file_marking_after_open_test(verbose); + + } else { + + pass = FALSE; + failure_mssg = "setup and check both FALSE?"; + } + + } else if ( strcmp("file_marking_on_create", argv[1]) == 0 ) { + + if ( setup ) { + + setup_mdj_file_marking_on_create_test(verbose); + + } else if ( check ) { + + check_mdj_file_marking_on_create_test(verbose); + + } else { + + pass = FALSE; + failure_mssg = "setup and check both FALSE?"; + } + + } else if ( strcmp("file_marking_on_open", argv[1]) == 0 ) { + + if ( setup ) { + + setup_mdj_file_marking_on_open_test(verbose); + + } else if ( check ) { + + check_mdj_file_marking_on_open_test(verbose); + + } else { + + pass = FALSE; + failure_mssg = "setup and check both FALSE?"; + } + + } else if ( strcmp("file_unmarking_on_file_close", argv[1]) == 0 ) { + + if ( setup ) { + + setup_mdj_file_unmarking_on_file_close_test(verbose); + + } else if ( check ) { + + check_mdj_file_unmarking_on_file_close_test(verbose); + + } else { + + pass = FALSE; + failure_mssg = "setup and check both FALSE?"; + } + + } else if ( strcmp("file_unmarking_on_journaling_shutdown", argv[1]) + == 0 ) { + + if ( setup ) { + + setup_mdj_file_unmarking_on_journaling_shutdown_test(verbose); + + } else if ( check ) { + + check_mdj_file_unmarking_on_journaling_shutdown_test(verbose); + + } else { + + pass = FALSE; + failure_mssg = "setup and check both FALSE?"; + } + + } else if ( strcmp("file_unmarking_on_recovery", argv[1]) == 0 ) { + + if ( setup ) { + + setup_mdj_file_unmarking_on_recovery_test(verbose); + + } else if ( check ) { + + check_mdj_file_unmarking_on_recovery_test(verbose); + + } else { + + pass = FALSE; + failure_mssg = "setup and check both FALSE?"; + } + + } else { + + pass = FALSE; + failure_mssg = "unknown test requested."; + usage(); + } + } + + if ( verbose ) { + + if ( pass ) { + + if ( setup ) { + + HDfprintf(stdout, "test setup succeeded.\n"); + + } else if ( check ) { + + HDfprintf(stdout, "test passed.\n"); + + } + } else { + + HDfprintf(stdout, "FAILED. Failure mssg = \"%s\"\n", + failure_mssg); + } + } + + if ( ! pass ) { + + result = 1; + } + + if ( result != 0 ) { + + HDfprintf(stderr, "fail\n"); + } + + return(result); + +} /* main() */ + diff --git a/test/cache_journal.c b/test/cache_journal.c new file mode 100644 index 0000000..49340fa --- /dev/null +++ b/test/cache_journal.c @@ -0,0 +1,14066 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * Copyright by the Board of Trustees of the University of Illinois. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* Programmer: John Mainzer + * 3/08 + * + * This file contains tests for the metadata journaling + * features implemented in H5C.c and friends. + */ + +#include + +#define H5F_PACKAGE /*suppress error about including H5Fpkg */ + +#include "h5test.h" +#include "H5Eprivate.h" +#include "H5Iprivate.h" +#include "H5MMprivate.h" /* Memory management */ +#include "H5MFprivate.h" +#include "H5ACprivate.h" +#include "H5Cprivate.h" +#include "cache_common.h" +#include "H5Fpkg.h" + +#define HDF5_FILE_NAME "HDF5.file" + +/* global variable declarations: */ + +const char *FILENAMES[] = { + "cache_test", + "cache_journal_test", + "cache_sb_test", + "journal_file", + NULL +}; + +/* private function declarations: */ + +/* utility functions */ + +static void begin_trans(H5C_t * cache_ptr, + hbool_t verbose, + uint64_t expected_trans_num, + const char * trans_name); + +static void copy_file(const char * input_file, + const char * output_file); + +static void end_trans(H5F_t * file_ptr, + H5C_t * cache_ptr, + hbool_t verbose, + uint64_t trans_num, + const char * trans_name); + +static hbool_t file_exists(const char * file_path_ptr); + +static void flush_journal(H5C_t * cache_ptr); + +static void jrnl_col_major_scan_backward(H5F_t * file_ptr, + int32_t max_index, + int32_t lag, + hbool_t verbose, + hbool_t reset_stats, + hbool_t display_stats, + hbool_t display_detailed_stats, + hbool_t do_inserts, + hbool_t dirty_inserts, + int dirty_unprotects, + uint64_t trans_num); + +static void jrnl_col_major_scan_forward(H5F_t * file_ptr, + int32_t max_index, + int32_t lag, + hbool_t verbose, + hbool_t reset_stats, + hbool_t display_stats, + hbool_t display_detailed_stats, + hbool_t do_inserts, + hbool_t dirty_inserts, + int dirty_unprotects, + uint64_t trans_num); + +static void jrnl_row_major_scan_backward(H5F_t * file_ptr, + int32_t max_index, + int32_t lag, + hbool_t verbose, + hbool_t reset_stats, + hbool_t display_stats, + hbool_t display_detailed_stats, + hbool_t do_inserts, + hbool_t dirty_inserts, + hbool_t do_renames, + hbool_t rename_to_main_addr, + hbool_t do_destroys, + hbool_t do_mult_ro_protects, + int dirty_destroys, + int dirty_unprotects, + uint64_t trans_num); + +static void jrnl_row_major_scan_forward(H5F_t * file_ptr, + int32_t max_index, + int32_t lag, + hbool_t verbose, + hbool_t reset_stats, + hbool_t display_stats, + hbool_t display_detailed_stats, + hbool_t do_inserts, + hbool_t dirty_inserts, + hbool_t do_renames, + hbool_t rename_to_main_addr, + hbool_t do_destroys, + hbool_t do_mult_ro_protects, + int dirty_destroys, + int dirty_unprotects, + uint64_t trans_num); + +static void open_existing_file_for_journaling(const char * hdf_file_name, + const char * journal_file_name, + hid_t * file_id_ptr, + H5F_t ** file_ptr_ptr, + H5C_t ** cache_ptr_ptr, + 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, + H5F_t ** file_ptr_ptr, + H5C_t ** cache_ptr_ptr); + +static void setup_cache_for_journaling(const char * hdf_file_name, + const char * journal_file_name, + hid_t * file_id_ptr, + H5F_t ** file_ptr_ptr, + H5C_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, + const char * filename, + const char * journal_filename, + hbool_t use_core_driver_if_avail); + +static void verify_journal_contents(const char * journal_file_path_ptr, + const char * expected_file_path_ptr, + hbool_t human_readable); + +static void verify_journal_deleted(const char * journal_file_path_ptr); + +static void verify_journal_empty(const char * journal_file_path_ptr); + +/* test functions */ + +static void check_buffer_writes(hbool_t use_aio); + +static void write_flush_verify(H5C_jbrb_t * struct_ptr, + int size, + char * data, + FILE * readback); + +static void write_noflush_verify(H5C_jbrb_t * struct_ptr, + int size, + char * data, + FILE * readback, + int repeats); + +static void check_superblock_extensions(void); + +static void check_mdjsc_callbacks(void); + +static herr_t test_mdjsc_callback(const H5C_mdj_config_t * config_ptr, + hid_t dxpl_id, + void * data_ptr); + +static void deregister_mdjsc_callback(H5F_t * file_ptr, + H5C_t * cache_ptr, + int32_t idx); + +static void register_mdjsc_callback(H5F_t * file_ptr, + H5C_t * cache_ptr, + H5C_mdj_status_change_func_t fcn_ptr, + void * data_ptr, + int32_t * idx_ptr); + +static void verify_mdjsc_table_config(H5C_t * cache_ptr, + int32_t table_len, + int32_t num_entries, + int32_t max_idx_in_use, + hbool_t * free_entries); + +static void verify_mdjsc_callback_deregistered(H5C_t * cache_ptr, + int32_t idx); + +static void verify_mdjsc_callback_registered(H5C_t * cache_ptr, + H5C_mdj_status_change_func_t fcn_ptr, + void * data_ptr, + int32_t idx); + +static void verify_mdjsc_callback_error_rejection(void); + +static void verify_mdjsc_callback_execution(void); + +static void verify_mdjsc_callback_registration_deregistration(void); + +static void check_binary_message_format(void); + +static void verify_journal_msg(int fd, + uint8_t expected_msg[], + int expected_msg_len, + hbool_t last_msg, + const char * mismatch_failure_msg, + const char * read_failure_msg, + const char * eof_failure_msg, + const char * not_last_msg_msg); + +static void check_message_format(void); + +static void check_legal_calls(void); + +static void check_transaction_tracking(hbool_t use_aio); + +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, + hbool_t use_aio); + +static void mdj_smoke_check_01(hbool_t human_readable, + hbool_t use_aio); + +static void mdj_smoke_check_02(hbool_t human_readable, + hbool_t use_aio); + +static void write_verify_trans_num(H5C_jbrb_t * struct_ptr, + uint64_t trans_num, + uint64_t min_verify_val, + uint64_t verify_val); + + +/**************************************************************************/ +/**************************************************************************/ +/********************************* tests: *********************************/ +/**************************************************************************/ +/**************************************************************************/ + +/*** metadata journaling test utility functions ***/ + +/*------------------------------------------------------------------------- + * Function: begin_trans() + * + * Purpose: If pass 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_mssg + * to point to an appropriate failure message. + * + * Do nothing if pass is FALSE on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 5/15/08 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +static void +begin_trans(H5C_t * cache_ptr, + hbool_t verbose, + uint64_t expected_trans_num, + const char * trans_name) +{ + const char * fcn_name = "begin_trans()"; + herr_t result; + uint64_t trans_num = 0; + + if ( pass ) { + + result = H5C_begin_transaction(cache_ptr, &trans_num, trans_name); + + if ( result < 0 ) { + + if ( verbose ) { + + HDfprintf(stdout, "%s: H5C_begin_transaction(%s) failed.\n", + fcn_name, trans_name); + } + pass = FALSE; + failure_mssg = "H5C_begin_transaction() failed.\n"; + + } else if ( trans_num != expected_trans_num ) { + + if ( verbose ) { + + HDfprintf(stdout, "%s: actual/expected trans num = %lld/%lld.\n", + fcn_name, (long long)trans_num, + (long long)expected_trans_num); + } + pass = FALSE; + failure_mssg = "begin_trans() issued unexpected trans_num.\n"; + } + } + + return; + +} /* begin_trans() */ + + +/*------------------------------------------------------------------------- + * Function: copy_file() + * + * Purpose: If pass is true, copy the input file to the output file. + * Set pass to FALSE and set failure_mssg to point to an + * appropriate error message on failure. + * + * Do nothing if pass is false on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 5/15/08 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +static void +copy_file(const char * input_file, + const char * output_file) +{ + const char * fcn_name = "copy_file()"; + char buffer[(8 * 1024) + 1]; + hbool_t verbose = FALSE; + size_t cur_buf_len; + const size_t max_buf_len = (8 * 1024); + size_t input_len; + size_t input_remainder = 0; + ssize_t result; + int input_file_fd = -1; + int output_file_fd = -1; + h5_stat_t buf; + + if ( pass ) { + + if ( input_file == NULL ) { + + failure_mssg = "input_file NULL on entry?!?", + pass = FALSE; + + } else if ( output_file == NULL ) { + + failure_mssg = "output_file NULL on entry?!?", + pass = FALSE; + + } + } + + /* get the length of the input file */ + if ( pass ) { + + if ( HDstat(input_file, &buf) != 0 ) { + + if ( verbose ) { + + HDfprintf(stdout, "%s: HDstat() failed with errno = %d.\n", + fcn_name, errno); + } + failure_mssg = "stat() failed on journal file."; + pass = FALSE; + + } else { + + if ( (buf.st_size) == 0 ) { + + failure_mssg = "input file empty?!?"; + pass = FALSE; + + } else { + + input_len = (size_t)(buf.st_size); + input_remainder = input_len; + + if ( verbose ) { + + HDfprintf(stdout, "%s: input_len = %d.\n", + fcn_name, (int)input_len); + } + } + } + } + + /* open the input file */ + if ( pass ) { + + if ( (input_file_fd = HDopen(input_file, O_RDONLY, 0777)) == -1 ) { + + if ( verbose ) { + + HDfprintf(stdout, "%s: HDopen(i) failed with errno = %d.\n", + fcn_name, errno); + } + failure_mssg = "Can't open input file."; + pass = FALSE; + } + } + + /* open the output file */ + if ( pass ) { + + if ( (output_file_fd = HDopen(output_file, O_WRONLY|O_CREAT|O_TRUNC, 0777)) + == -1 ) { + + if ( verbose ) { + + HDfprintf(stdout, "%s: HDopen(i) failed with errno = %d.\n", + fcn_name, errno); + } + failure_mssg = "Can't open output file."; + pass = FALSE; + } + } + + while ( ( pass ) && + ( input_remainder > 0 ) ) + { + if ( input_remainder > max_buf_len ) { + + cur_buf_len = max_buf_len; + input_remainder -= max_buf_len; + + } else { + + cur_buf_len = input_remainder; + input_remainder = 0; + } + + result = HDread(input_file_fd, buffer, cur_buf_len); + + if ( result != (int)cur_buf_len ) { + + if ( verbose ) { + + HDfprintf(stdout, + "%s: HDread() failed. result = %d, errno = %d.\n", + fcn_name, (int)result, errno); + } + failure_mssg = "error reading input file."; + pass = FALSE; + } + + buffer[cur_buf_len] = '\0'; + + if ( pass ) { + + result = HDwrite(output_file_fd, buffer, cur_buf_len); + + if ( result != (int)cur_buf_len ) { + + if ( verbose ) { + + HDfprintf(stdout, + "%s: HDwrite() failed. result = %d, errno = %d.\n", + fcn_name, (int)result, errno); + } + failure_mssg = "error writing output file."; + pass = FALSE; + } + } + } + + if ( input_file_fd != -1 ) { + + if ( HDclose(input_file_fd) != 0 ) { + + if ( verbose ) { + + HDfprintf(stdout, "%s: HDclose(i) failed with errno = %d.\n", + fcn_name, errno); + } + + if ( pass ) { + + failure_mssg = "Can't close input file."; + pass = FALSE; + } + } + } + + if ( output_file_fd != -1 ) { + + if ( HDclose(output_file_fd) != 0 ) { + + if ( verbose ) { + + HDfprintf(stdout, "%s: HDclose(o) failed with errno = %d.\n", + fcn_name, errno); + } + + if ( pass ) { + + failure_mssg = "Can't close output file."; + pass = FALSE; + } + } + } + + return; + +} /* copy_file() */ + + +/*------------------------------------------------------------------------- + * Function: end_trans() + * + * Purpose: If pass is true on entry, attempt to end the current + * transaction. If the operation fails, set pass to FALSE, + * and set failure_mssg to point to an appropriate failure + * message. + * + * Do nothing if pass is FALSE on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 5/15/08 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +static void +end_trans(H5F_t * file_ptr, + H5C_t * cache_ptr, + hbool_t verbose, + uint64_t trans_num, + const char * trans_name) +{ + const char * fcn_name = "end_trans()"; + herr_t result; + + if ( pass ) { + + result = H5C_end_transaction(file_ptr, H5AC_dxpl_id, cache_ptr, + trans_num, trans_name); + + if ( result < 0 ) { + + if ( verbose ) { + HDfprintf(stdout, + "%s: H5C_end_transaction(%lld, \"%s\") failed.\n", + fcn_name, (long long)trans_num, trans_name); + } + pass = FALSE; + failure_mssg = "H5C_end_transaction() failed.\n"; + } + } + + return; + +} /* end_trans() */ + + +/*------------------------------------------------------------------------- + * Function: file_exists() + * + * Purpose: If pass 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 pass + * to FALSE and set failure_mssg to point to an appropriate + * error message. + * + * Do nothing and return FALSE if pass is FALSE on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 5//08 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +static hbool_t +file_exists(const char * file_path_ptr) +{ + const char * fcn_name = "file_exists()"; + hbool_t ret_val = FALSE; /* will set to TRUE if necessary */ + hbool_t verbose = FALSE; + h5_stat_t buf; + + if ( pass ) { + + if ( file_path_ptr == NULL ) { + + failure_mssg = "file_path_ptr NULL on entry?!?", + pass = FALSE; + } + } + + if ( pass ) { + + if ( HDstat(file_path_ptr, &buf) == 0 ) { + + if ( verbose ) { + + HDfprintf(stdout, "%s: HDstat(%s) succeeded.\n", fcn_name, + file_path_ptr); + } + + ret_val = TRUE; + + } else if ( errno == ENOENT ) { + + if ( verbose ) { + + HDfprintf(stdout, "%s: HDstat(%s) failed with ENOENT\n", + fcn_name, file_path_ptr); + } + + } else { + + if ( verbose ) { + + HDfprintf(stdout, + "%s: HDstat() failed with unexpected errno = %d.\n", + fcn_name, errno); + } + + failure_mssg = "HDstat() returned unexpected value."; + pass = FALSE; + + } + } + + return(ret_val); + +} /* file_exists() */ + + +/*------------------------------------------------------------------------- + * Function: flush_journal() + * + * Purpose: If pass is true on entry, attempt to flush the journal. + * If the operation fails, set pass to FALSE, and set + * failure_mssg to point to an appropriate failure message. + * + * Do nothing if pass is FALSE on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 5/15/08 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +static void +flush_journal(H5C_t * cache_ptr) +{ + if ( pass ) { + + if ( H5C_jb__flush(&(cache_ptr->mdj_jbrb)) < 0 ) { + + pass = FALSE; + failure_mssg = "H5C_jb__flush() reports failure."; + } + } + + return; + +} /* flush_journal() */ + + +/*------------------------------------------------------------------------- + * Function: jrnl_col_major_scan_backward() + * + * Purpose: Do a sequence of inserts, protects, and unprotects + * broken into a sequence of transactions while scanning + * backwards through the set of entries. + * + * If pass is false on entry, do nothing. + * + * Note tht this function is an adaption of + * col_major_scan_backward() + * + * Return: void + * + * Programmer: John Mainzer + * 5/20/08 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +void +jrnl_col_major_scan_backward(H5F_t * file_ptr, + int32_t max_index, + int32_t lag, + hbool_t verbose, + hbool_t reset_stats, + hbool_t display_stats, + hbool_t display_detailed_stats, + hbool_t do_inserts, + hbool_t dirty_inserts, + int dirty_unprotects, + uint64_t trans_num) +{ + const char * fcn_name = "jrnl_col_major_scan_backward()"; + H5C_t * cache_ptr; + int i; + int mile_stone = 1; + int32_t type; + int32_t idx; + int32_t local_max_index[NUMBER_OF_ENTRY_TYPES]; + + if ( verbose ) + HDfprintf(stdout, "%s: entering.\n", fcn_name); + + if ( pass ) { + + cache_ptr = file_ptr->shared->cache; + + HDassert( cache_ptr != NULL ); + + for ( i = 0; i < NUMBER_OF_ENTRY_TYPES; i++ ) + { + local_max_index[i] = MIN(max_index, max_indices[i]); + } + + HDassert( lag > 5 ); + + if ( reset_stats ) { + + H5C_stats__reset(cache_ptr); + } + + idx = local_max_index[NUMBER_OF_ENTRY_TYPES - 1] + lag; + } + + if ( verbose ) /* 1 */ + HDfprintf(stdout, "%s: point %d.\n", fcn_name, mile_stone++); + + + while ( ( pass ) && ( (idx + lag) >= 0 ) ) + { + type = NUMBER_OF_ENTRY_TYPES - 1; + + 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); + } + + while ( ( pass ) && ( type >= 0 ) ) + { + if ( verbose ) { + + HDfprintf(stdout, "%d:%d: ", type, idx); + } + + if ( ( pass ) && ( do_inserts) && ( (idx - lag) >= 0 ) && + ( (idx - lag) <= local_max_index[type] ) && + ( ((idx - lag) % 3) == 0 ) && + ( ! entry_in_cache(cache_ptr, type, (idx - lag)) ) ) { + + if ( verbose ) + HDfprintf(stdout, "(i, %d, %d) ", type, (idx - lag)); + + insert_entry(file_ptr, type, (idx - lag), dirty_inserts, + H5C__NO_FLAGS_SET); + } + + if ( ( pass ) && + ( idx >= 0 ) && + ( idx <= local_max_index[type] ) ) { + + if ( verbose ) + HDfprintf(stdout, "(p, %d, %d) ", type, idx); + + protect_entry(file_ptr, type, idx); + } + + if ( ( pass ) && ( (idx + lag) >= 0 ) && + ( (idx + lag) <= local_max_index[type] ) ) { + + if ( verbose ) + HDfprintf(stdout, "(u, %d, %d) ", type, (idx + lag)); + + unprotect_entry(file_ptr, type, idx + lag, + dirty_unprotects, H5C__NO_FLAGS_SET); + } + + if ( verbose ) + HDfprintf(stdout, "\n"); + + type--; + } + + end_trans(file_ptr, cache_ptr, verbose, trans_num, + "jrnl_col_major_scan_backward outer loop"); + + if ( verbose ) { + + HDfprintf(stdout, "end trans %lld, idx = %d.\n", trans_num, idx); + } + + if ( ( verbose ) && ( ! pass ) ) { + + HDfprintf(stdout, "pass == FALSE, failure mssg = \"%s\".\n", + failure_mssg); + } + + idx--; + } + + if ( verbose ) /* 2 */ + HDfprintf(stdout, "%s: point %d.\n", fcn_name, mile_stone++); + + if ( ( pass ) && ( display_stats ) ) { + + H5C_stats(cache_ptr, "test cache", display_detailed_stats); + } + + if ( verbose ) + HDfprintf(stdout, "%s: exiting.\n", fcn_name); + + return; + +} /* jrnl_col_major_scan_backward() */ + + +/*------------------------------------------------------------------------- + * Function: jrnl_col_major_scan_forward() + * + * Purpose: Do a sequence of inserts, protects, and unprotects + * broken into a sequence of transactions while scanning + * through the set of entries. + * + * Note that this function is an adaption of + * col_major_scan_forward(). + * + * If pass is false on entry, do nothing. + * + * Return: void + * + * Programmer: John Mainzer + * 5/20/08 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +void +jrnl_col_major_scan_forward(H5F_t * file_ptr, + int32_t max_index, + int32_t lag, + hbool_t verbose, + hbool_t reset_stats, + hbool_t display_stats, + hbool_t display_detailed_stats, + hbool_t do_inserts, + hbool_t dirty_inserts, + int dirty_unprotects, + uint64_t trans_num) +{ + const char * fcn_name = "jrnl_col_major_scan_forward()"; + H5C_t * cache_ptr; + int i; + int32_t type; + int32_t idx; + int32_t local_max_index[NUMBER_OF_ENTRY_TYPES]; + + if ( verbose ) + HDfprintf(stdout, "%s: entering.\n", fcn_name); + + if ( pass ) { + + cache_ptr = file_ptr->shared->cache; + + HDassert( cache_ptr != NULL ); + + for ( i = 0; i < NUMBER_OF_ENTRY_TYPES; i++ ) + { + local_max_index[i] = MIN(max_index, max_indices[i]); + } + + HDassert( lag > 5 ); + + type = 0; + + if ( reset_stats ) { + + H5C_stats__reset(cache_ptr); + } + + idx = -lag; + } + + while ( ( pass ) && ( (idx - lag) <= MAX_ENTRIES ) ) + { + type = 0; + + 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); + } + + while ( ( pass ) && ( type < NUMBER_OF_ENTRY_TYPES ) ) + { + if ( verbose ) { + + HDfprintf(stdout, "%d:%d: ", type, idx); + } + + if ( ( pass ) && ( do_inserts ) && ( (idx + lag) >= 0 ) && + ( (idx + lag) <= local_max_index[type] ) && + ( ((idx + lag) % 3) == 0 ) && + ( ! entry_in_cache(cache_ptr, type, (idx + lag)) ) ) { + + if ( verbose ) + HDfprintf(stdout, "(i, %d, %d) ", type, (idx + lag)); + + insert_entry(file_ptr, type, (idx + lag), dirty_inserts, + H5C__NO_FLAGS_SET); + } + + if ( ( pass ) && + ( idx >= 0 ) && + ( idx <= local_max_index[type] ) ) { + + if ( verbose ) + HDfprintf(stdout, "(p, %d, %d) ", type, idx); + + protect_entry(file_ptr, type, idx); + } + + if ( ( pass ) && ( (idx - lag) >= 0 ) && + ( (idx - lag) <= local_max_index[type] ) ) { + + if ( verbose ) + HDfprintf(stdout, "(u, %d, %d) ", type, (idx - lag)); + + unprotect_entry(file_ptr, type, idx - lag, + dirty_unprotects, H5C__NO_FLAGS_SET); + } + + if ( verbose ) + HDfprintf(stdout, "\n"); + + type++; + } + + end_trans(file_ptr, cache_ptr, verbose, trans_num, + "jrnl_col_major_scan_forward outer loop"); + + if ( verbose ) { + + HDfprintf(stdout, "end trans %lld, idx = %d.\n", trans_num, idx); + } + + if ( ( verbose ) && ( ! pass ) ) { + + HDfprintf(stdout, "pass == FALSE, failure mssg = \"%s\".\n", + failure_mssg); + } + + idx++; + } + + if ( ( pass ) && ( display_stats ) ) { + + H5C_stats(cache_ptr, "test cache", display_detailed_stats); + } + + return; + +} /* jrnl_col_major_scan_forward() */ + + +/*------------------------------------------------------------------------- + * Function: jrnl_row_major_scan_backward() + * + * Purpose: Do a sequence of inserts, protects, unprotects, renames, + * destroys broken into transactions while scanning backwards + * through the set of entries. + * + * If pass is false on entry, do nothing. + * + * Note that this function is an adaption of + * row_major_scan_backward() + * + * Return: void + * + * Programmer: John Mainzer + * 5/20/08 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +void +jrnl_row_major_scan_backward(H5F_t * file_ptr, + int32_t max_index, + int32_t lag, + hbool_t verbose, + hbool_t reset_stats, + hbool_t display_stats, + hbool_t display_detailed_stats, + hbool_t do_inserts, + hbool_t dirty_inserts, + hbool_t do_renames, + hbool_t rename_to_main_addr, + hbool_t do_destroys, + hbool_t do_mult_ro_protects, + int dirty_destroys, + int dirty_unprotects, + uint64_t trans_num) +{ + const char * fcn_name = "jrnl_row_major_scan_backward"; + H5C_t * cache_ptr; + int32_t type; + int32_t idx; + int32_t local_max_index; + int32_t lower_bound; + int32_t upper_bound; + + if ( verbose ) + HDfprintf(stdout, "%s(): Entering.\n", fcn_name); + + if ( pass ) { + + cache_ptr = file_ptr->shared->cache; + + HDassert( cache_ptr != NULL ); + HDassert( lag >= 10 ); + + if ( reset_stats ) { + + H5C_stats__reset(cache_ptr); + } + } + + type = NUMBER_OF_ENTRY_TYPES - 1; + + while ( ( pass ) && ( type >= 0 ) ) + { + local_max_index = MIN(max_index, max_indices[type]); + + idx = local_max_index + lag; + + upper_bound = local_max_index; + lower_bound = upper_bound - 8; + + while ( ( pass ) && ( idx >= -lag ) ) + { + if ( idx == ( upper_bound + lag ) ) { + + trans_num++; + + begin_trans(cache_ptr, verbose, trans_num, + "jrnl_row_major_scan_backward inner loop"); + + if ( verbose ) + HDfprintf(stdout, "begin trans %lld.\n", + (long long)trans_num); + + if ( verbose ) + HDfprintf(stdout, "(%d, %d)\n", lower_bound, upper_bound); + } + + while ( ( pass ) && ( idx >= lower_bound - lag ) ) + { + if ( verbose ) { + + HDfprintf(stdout, "%lld:%d:%d: ", trans_num, type, idx); + } + + if ( ( pass ) && ( do_inserts ) && + ( (idx - lag) >= 0 ) && + ( (idx - lag) >= lower_bound ) && + ( (idx - lag) <= local_max_index ) && + ( (idx - lag) <= upper_bound ) && + ( ((idx - lag) % 2) == 1 ) && + ( ! entry_in_cache(cache_ptr, type, (idx - lag)) ) ) { + + if ( verbose ) + HDfprintf(stdout, "(i, %d, %d) ", type, (idx - lag)); + + insert_entry(file_ptr, type, (idx - lag), dirty_inserts, + H5C__NO_FLAGS_SET); + } + + + if ( ( pass ) && + ( (idx - lag + 1) >= 0 ) && + ( (idx - lag + 1) >= lower_bound ) && + ( (idx - lag + 1) <= local_max_index ) && + ( (idx - lag + 1) <= upper_bound ) && + ( ( (idx - lag + 1) % 3 ) == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "(p, %d, %d) ", + type, (idx - lag + 1)); + + protect_entry(file_ptr, type, (idx - lag + 1)); + } + + if ( ( pass ) && + ( (idx - lag + 2) >= 0 ) && + ( (idx - lag + 2) >= lower_bound ) && + ( (idx - lag + 2) <= local_max_index ) && + ( (idx - lag + 2) <= upper_bound ) && + ( ( (idx - lag + 2) % 3 ) == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "(u, %d, %d) ", + type, (idx - lag + 2)); + + unprotect_entry(file_ptr, type, idx-lag+2, NO_CHANGE, + H5C__NO_FLAGS_SET); + } + + + if ( ( pass ) && ( do_renames ) && + ( (idx - lag + 2) >= 0 ) && + ( (idx - lag + 2) >= lower_bound ) && + ( (idx - lag + 2) <= local_max_index ) && + ( (idx - lag + 2) <= upper_bound ) && + ( ( (idx - lag + 2) % 3 ) == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "(r, %d, %d, %d) ", + type, (idx - lag + 2), + (int)rename_to_main_addr); + + rename_entry(cache_ptr, type, (idx - lag + 2), + rename_to_main_addr); + } + + + if ( ( pass ) && + ( (idx - lag + 3) >= 0 ) && + ( (idx - lag + 3) >= lower_bound ) && + ( (idx - lag + 3) <= local_max_index ) && + ( (idx - lag + 3) <= upper_bound ) && + ( ( (idx - lag + 3) % 5 ) == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "(p, %d, %d) ", + type, (idx - lag + 3)); + + protect_entry(file_ptr, type, (idx - lag + 3)); + } + + if ( ( pass ) && + ( (idx - lag + 5) >= 0 ) && + ( (idx - lag + 5) >= lower_bound ) && + ( (idx - lag + 5) <= local_max_index ) && + ( (idx - lag + 5) <= upper_bound ) && + ( ( (idx - lag + 5) % 5 ) == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "(u, %d, %d) ", + type, (idx - lag + 5)); + + unprotect_entry(file_ptr, type, idx-lag+5, NO_CHANGE, + H5C__NO_FLAGS_SET); + } + + if ( do_mult_ro_protects ) + { + if ( ( pass ) && + ( (idx - lag + 5) >= 0 ) && + ( (idx - lag + 5) >= lower_bound ) && + ( (idx - lag + 5) < local_max_index ) && + ( (idx - lag + 5) < upper_bound ) && + ( (idx - lag + 5) % 9 == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "(p-ro, %d, %d) ", type, + (idx - lag + 5)); + + protect_entry_ro(file_ptr, type, (idx - lag + 5)); + } + + if ( ( pass ) && + ( (idx - lag + 6) >= 0 ) && + ( (idx - lag + 6) >= lower_bound ) && + ( (idx - lag + 6) < local_max_index ) && + ( (idx - lag + 6) < upper_bound ) && + ( (idx - lag + 6) % 11 == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "(p-ro, %d, %d) ", type, + (idx - lag + 6)); + + protect_entry_ro(file_ptr, type, (idx - lag + 6)); + } + + if ( ( pass ) && + ( (idx - lag + 7) >= 0 ) && + ( (idx - lag + 7) >= lower_bound ) && + ( (idx - lag + 7) < local_max_index ) && + ( (idx - lag + 7) < upper_bound ) && + ( (idx - lag + 7) % 13 == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "(p-ro, %d, %d) ", type, + (idx - lag + 7)); + + protect_entry_ro(file_ptr, type, (idx - lag + 7)); + } + + if ( ( pass ) && + ( (idx - lag + 7) >= 0 ) && + ( (idx - lag + 7) >= lower_bound ) && + ( (idx - lag + 7) < local_max_index ) && + ( (idx - lag + 7) < upper_bound ) && + ( (idx - lag + 7) % 9 == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "(u-ro, %d, %d) ", type, + (idx - lag + 7)); + + unprotect_entry(file_ptr, type, (idx - lag + 7), + FALSE, H5C__NO_FLAGS_SET); + } + + if ( ( pass ) && + ( (idx - lag + 8) >= 0 ) && + ( (idx - lag + 8) >= lower_bound ) && + ( (idx - lag + 8) < local_max_index ) && + ( (idx - lag + 8) < upper_bound ) && + ( (idx - lag + 8) % 11 == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "(u-ro, %d, %d) ", type, + (idx - lag + 8)); + + unprotect_entry(file_ptr, type, (idx - lag + 8), + FALSE, H5C__NO_FLAGS_SET); + } + + if ( ( pass ) && + ( (idx - lag + 9) >= 0 ) && + ( (idx - lag + 9) >= lower_bound ) && + ( (idx - lag + 9) < local_max_index ) && + ( (idx - lag + 9) < upper_bound ) && + ( (idx - lag + 9) % 13 == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "(u-ro, %d, %d) ", type, + (idx - lag + 9)); + + unprotect_entry(file_ptr, type, (idx - lag + 9), + FALSE, H5C__NO_FLAGS_SET); + } + } /* if ( do_mult_ro_protects ) */ + + if ( ( pass ) && + ( idx >= 0 ) && + ( idx >= lower_bound ) && + ( idx <= local_max_index ) && + ( idx <= upper_bound ) ) { + + if ( verbose ) + HDfprintf(stdout, "(p, %d, %d) ", type, idx); + + protect_entry(file_ptr, type, idx); + } + + + if ( ( pass ) && + ( (idx + lag - 2) >= 0 ) && + ( (idx + lag - 2) >= lower_bound ) && + ( (idx + lag - 2) <= local_max_index ) && + ( (idx + lag - 2) <= upper_bound ) && + ( ( (idx + lag - 2) % 7 ) == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "(u, %d, %d) ", + type, (idx + lag - 2)); + + unprotect_entry(file_ptr, type, idx+lag-2, NO_CHANGE, + H5C__NO_FLAGS_SET); + } + + if ( ( pass ) && + ( (idx + lag - 1) >= 0 ) && + ( (idx + lag - 1) >= lower_bound ) && + ( (idx + lag - 1) <= local_max_index ) && + ( (idx + lag - 1) <= upper_bound ) && + ( ( (idx + lag - 1) % 7 ) == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "(p, %d, %d) ", + type, (idx + lag - 1)); + + protect_entry(file_ptr, type, (idx + lag - 1)); + } + + + if ( do_destroys ) { + + if ( ( pass ) && + ( (idx + lag) >= 0 ) && + ( (idx + lag) >= lower_bound ) && + ( ( idx + lag) <= local_max_index ) && + ( ( idx + lag) <= upper_bound ) ) { + + switch ( (idx + lag) %4 ) { + + case 0: + if ( (entries[type])[idx+lag].is_dirty ) { + + unprotect_entry(file_ptr, type, idx + lag, + NO_CHANGE, + H5C__NO_FLAGS_SET); + } else { + + unprotect_entry(file_ptr, type, idx + lag, + dirty_unprotects, + H5C__NO_FLAGS_SET); + } + break; + + case 1: /* we just did an insert */ + unprotect_entry(file_ptr, type, idx + lag, + NO_CHANGE, + H5C__NO_FLAGS_SET); + break; + + case 2: + if ( (entries[type])[idx + lag].is_dirty ) { + + unprotect_entry(file_ptr, type, idx + lag, + NO_CHANGE, + H5C__DELETED_FLAG); + } else { + + unprotect_entry(file_ptr, type, idx + lag, + dirty_destroys, + H5C__DELETED_FLAG); + } + break; + + case 3: /* we just did an insrt */ + unprotect_entry(file_ptr, type, idx + lag, + NO_CHANGE, + H5C__DELETED_FLAG); + break; + + default: + HDassert(0); /* this can't happen... */ + break; + } + } + } else { + + if ( ( pass ) && + ( (idx + lag) >= 0 ) && + ( (idx + lag) >= lower_bound ) && + ( ( idx + lag) <= local_max_index ) && + ( ( idx + lag) <= upper_bound ) ) { + + if ( verbose ) + HDfprintf(stdout, + "(u, %d, %d) ", type, (idx + lag)); + + unprotect_entry(file_ptr, type, idx + lag, + dirty_unprotects, + H5C__NO_FLAGS_SET); + } + } + + idx--; + + if ( verbose ) + HDfprintf(stdout, "\n"); + + } /* while ( ( pass ) && ( idx >= lower_bound - lag ) ) */ + + end_trans(file_ptr, cache_ptr, verbose, trans_num, + "jrnl_row_major_scan_backward inner loop"); + + if ( verbose ) + HDfprintf(stdout, "end trans %lld.\n", (long long)trans_num); + + upper_bound = lower_bound - (2 * lag) - 2; + lower_bound = upper_bound - 8; + + idx = upper_bound + lag; + + } /* while ( ( pass ) && ( idx >= -lag ) ) */ + + type--; + + } /* while ( ( pass ) && ( type >= 0 ) ) */ + + if ( ( pass ) && ( display_stats ) ) { + + H5C_stats(cache_ptr, "test cache", display_detailed_stats); + } + + return; + +} /* jrnl_row_major_scan_backward() */ + + +/*------------------------------------------------------------------------- + * Function: jrnl_row_major_scan_forward() + * + * Purpose: Do a sequence of inserts, protects, unprotects, renames, + * and destroys broken into transactions while scanning + * through the set of entries. + * + * If pass is false on entry, do nothing. + * + * Note that this function is an adaption of + * row_major_scan_forward(). + * + * Return: void + * + * Programmer: John Mainzer + * 5/20/08 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +void +jrnl_row_major_scan_forward(H5F_t * file_ptr, + int32_t max_index, + int32_t lag, + hbool_t verbose, + hbool_t reset_stats, + hbool_t display_stats, + hbool_t display_detailed_stats, + hbool_t do_inserts, + hbool_t dirty_inserts, + hbool_t do_renames, + hbool_t rename_to_main_addr, + hbool_t do_destroys, + hbool_t do_mult_ro_protects, + int dirty_destroys, + int dirty_unprotects, + uint64_t trans_num) +{ + const char * fcn_name = "jrnl_row_major_scan_forward"; + H5C_t * cache_ptr; + int32_t type; + int32_t idx; + int32_t local_max_index; + int32_t lower_bound; + int32_t upper_bound; + + if ( verbose ) + HDfprintf(stdout, "%s(): entering.\n", fcn_name); + + if ( pass ) { + + cache_ptr = file_ptr->shared->cache; + + HDassert( cache_ptr != NULL ); + HDassert( lag >= 10 ); + + type = 0; + + if ( reset_stats ) { + + H5C_stats__reset(cache_ptr); + } + } + + while ( ( pass ) && ( type < NUMBER_OF_ENTRY_TYPES ) ) + { + idx = -lag; + + local_max_index = MIN(max_index, max_indices[type]); + + lower_bound = 0; + upper_bound = lower_bound + 8; + + while ( ( pass ) && ( idx <= (local_max_index + lag) ) ) + { + if ( idx == ( lower_bound - lag ) ) { + + trans_num++; + + begin_trans(cache_ptr, verbose, trans_num, + "jrnl_row_major_scan_forward inner loop"); + + if ( verbose ) + HDfprintf(stdout, "begin trans %lld.\n", + (long long)trans_num); + + if ( verbose ) + HDfprintf(stdout, "(%d, %d)\n", lower_bound, upper_bound); + } + + while ( ( pass ) && ( idx <= upper_bound + lag ) ) + { + + if ( verbose ) { + + HDfprintf(stdout, "%lld:%d:%d: ", trans_num, type, idx); + } + + if ( ( pass ) && ( do_inserts ) && + ( (idx + lag) >= 0 ) && + ( (idx + lag) >= lower_bound ) && + ( (idx + lag) <= local_max_index ) && + ( (idx + lag) <= upper_bound ) && + ( ((idx + lag) % 2) == 0 ) && + ( ! entry_in_cache(cache_ptr, type, (idx + lag)) ) ) { + + if ( verbose ) + HDfprintf(stdout, "1(i, %d, %d) ", type, (idx + lag)); + + /*** insert entry idx + lag (if not already present *** */ + insert_entry(file_ptr, type, (idx + lag), dirty_inserts, + H5C__NO_FLAGS_SET); + } + + + if ( ( pass ) && + ( (idx + lag - 1) >= 0 ) && + ( (idx + lag - 1) >= lower_bound ) && + ( (idx + lag - 1) <= local_max_index ) && + ( (idx + lag - 1) <= upper_bound ) && + ( ( (idx + lag - 1) % 3 ) == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, + "2(p, %d, %d) ", type, (idx + lag - 1)); + + /*** protect entry idx + lag - 1 ***/ + protect_entry(file_ptr, type, (idx + lag - 1)); + } + + if ( ( pass ) && + ( (idx + lag - 2) >= 0 ) && + ( (idx + lag - 2) >= lower_bound ) && + ( (idx + lag - 2) <= local_max_index ) && + ( (idx + lag - 2) <= upper_bound ) && + ( ( (idx + lag - 2) % 3 ) == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "3(u, %d, %d) ", + type, (idx + lag - 2)); + + /*** unprotect entry idx + lag - 2 ***/ + unprotect_entry(file_ptr, type, idx+lag-2, NO_CHANGE, + H5C__NO_FLAGS_SET); + } + + + if ( ( pass ) && ( do_renames ) && + ( (idx + lag - 2) >= 0 ) && + ( (idx + lag - 2) >= lower_bound ) && + ( (idx + lag - 2) <= local_max_index ) && + ( (idx + lag - 2) <= upper_bound ) && + ( ( (idx + lag - 2) % 3 ) == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "4(r, %d, %d, %d) ", + type, (idx + lag - 2), + (int)rename_to_main_addr); + + /*** rename entry idx + lag -2 ***/ + rename_entry(cache_ptr, type, (idx + lag - 2), + rename_to_main_addr); + } + + + if ( ( pass ) && + ( (idx + lag - 3) >= 0 ) && + ( (idx + lag - 3) >= lower_bound ) && + ( (idx + lag - 3) <= local_max_index ) && + ( (idx + lag - 3) <= upper_bound ) && + ( ( (idx + lag - 3) % 5 ) == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "5(p, %d, %d) ", + type, (idx + lag - 3)); + + /*** protect entry idx + lag - 3 ***/ + protect_entry(file_ptr, type, (idx + lag - 3)); + } + + if ( ( pass ) && + ( (idx + lag - 5) >= 0 ) && + ( (idx + lag - 5) >= lower_bound ) && + ( (idx + lag - 5) <= local_max_index ) && + ( (idx + lag - 5) <= upper_bound ) && + ( ( (idx + lag - 5) % 5 ) == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "6(u, %d, %d) ", + type, (idx + lag - 5)); + + + /*** unprotect entry idx + lag - 5 ***/ + unprotect_entry(file_ptr, type, idx+lag-5, NO_CHANGE, + H5C__NO_FLAGS_SET); + } + + if ( do_mult_ro_protects ) + { + if ( ( pass ) && + ( (idx + lag - 5) >= 0 ) && + ( (idx + lag - 5) >= lower_bound ) && + ( (idx + lag - 5) < local_max_index ) && + ( (idx + lag - 5) < upper_bound ) && + ( (idx + lag - 5) % 9 == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "7(p-ro, %d, %d) ", type, + (idx + lag - 5)); + + /*** protect ro entry idx + lag - 5 ***/ + protect_entry_ro(file_ptr, type, (idx + lag - 5)); + } + + if ( ( pass ) && + ( (idx + lag - 6) >= 0 ) && + ( (idx + lag - 6) >= lower_bound ) && + ( (idx + lag - 6) < local_max_index ) && + ( (idx + lag - 6) < upper_bound ) && + ( (idx + lag - 6) % 11 == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "8(p-ro, %d, %d) ", type, + (idx + lag - 6)); + + /*** protect ro entry idx + lag - 6 ***/ + protect_entry_ro(file_ptr, type, (idx + lag - 6)); + } + + if ( ( pass ) && + ( (idx + lag - 7) >= 0 ) && + ( (idx + lag - 7) >= lower_bound ) && + ( (idx + lag - 7) < local_max_index ) && + ( (idx + lag - 7) < upper_bound ) && + ( (idx + lag - 7) % 13 == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "9(p-ro, %d, %d) ", type, + (idx + lag - 7)); + + /*** protect ro entry idx + lag - 7 ***/ + protect_entry_ro(file_ptr, type, (idx + lag - 7)); + } + + if ( ( pass ) && + ( (idx + lag - 7) >= 0 ) && + ( (idx + lag - 7) >= lower_bound ) && + ( (idx + lag - 7) < local_max_index ) && + ( (idx + lag - 7) < upper_bound ) && + ( (idx + lag - 7) % 9 == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "10(u-ro, %d, %d) ", type, + (idx + lag - 7)); + + /*** unprotect ro entry idx + lag - 7 ***/ + unprotect_entry(file_ptr, type, (idx + lag - 7), + FALSE, H5C__NO_FLAGS_SET); + } + + if ( ( pass ) && + ( (idx + lag - 8) >= 0 ) && + ( (idx + lag - 8) >= lower_bound ) && + ( (idx + lag - 8) < local_max_index ) && + ( (idx + lag - 8) < upper_bound ) && + ( (idx + lag - 8) % 11 == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "11(u-ro, %d, %d) ", type, + (idx + lag - 8)); + + /*** unprotect ro entry idx + lag - 8 ***/ + unprotect_entry(file_ptr, type, (idx + lag - 8), + FALSE, H5C__NO_FLAGS_SET); + } + + if ( ( pass ) && + ( (idx + lag - 9) >= 0 ) && + ( (idx + lag - 9) >= lower_bound ) && + ( (idx + lag - 9) < local_max_index ) && + ( (idx + lag - 9) < upper_bound ) && + ( (idx + lag - 9) % 13 == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "12(u-ro, %d, %d) ", type, + (idx + lag - 9)); + + /*** unprotect ro entry idx + lag - 9 ***/ + unprotect_entry(file_ptr, type, (idx + lag - 9), + FALSE, H5C__NO_FLAGS_SET); + } + } /* if ( do_mult_ro_protects ) */ + + if ( ( pass ) && + ( idx >= 0 ) && + ( idx >= lower_bound ) && + ( idx <= local_max_index ) && + ( idx <= upper_bound ) ) { + + if ( verbose ) + HDfprintf(stdout, "13(p, %d, %d) ", type, idx); + + /*** protect entry idx ***/ + protect_entry(file_ptr, type, idx); + } + + if ( ( pass ) && + ( (idx - lag + 2) >= 0 ) && + ( (idx - lag + 2) >= lower_bound ) && + ( (idx - lag + 2) <= local_max_index ) && + ( (idx - lag + 2) <= upper_bound ) && + ( ( (idx - lag + 2) % 7 ) == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "14(u, %d, %d) ", + type, (idx - lag + 2)); + + /*** unprotect entry idx - lag + 2 ***/ + unprotect_entry(file_ptr, type, idx-lag+2, NO_CHANGE, + H5C__NO_FLAGS_SET); + } + + if ( ( pass ) && + ( (idx - lag + 1) >= 0 ) && + ( (idx - lag + 1) >= lower_bound ) && + ( (idx - lag + 1) <= local_max_index ) && + ( (idx - lag + 1) <= upper_bound ) && + ( ( (idx - lag + 1) % 7 ) == 0 ) ) { + + if ( verbose ) + HDfprintf(stdout, "15(p, %d, %d) ", + type, (idx - lag + 1)); + + /*** protect entry idx - lag + 1 ***/ + protect_entry(file_ptr, type, (idx - lag + 1)); + } + + + if ( do_destroys ) { + + if ( ( pass ) && + ( (idx - lag) >= 0 ) && + ( (idx - lag) >= lower_bound ) && + ( ( idx - lag) <= local_max_index ) && + ( ( idx - lag) <= upper_bound ) ) { + + switch ( (idx - lag) %4 ) { + + case 0: /* we just did an insert */ + + if ( verbose ) + HDfprintf(stdout, "16(u, %d, %d) ", + type, (idx - lag)); + + /*** unprotect entry NC idx - lag ***/ + unprotect_entry(file_ptr, type, idx - lag, + NO_CHANGE, H5C__NO_FLAGS_SET); + break; + + case 1: + if ( (entries[type])[idx-lag].is_dirty ) { + + if ( verbose ) + HDfprintf(stdout, "17(u, %d, %d) ", + type, (idx - lag)); + + /*** unprotect entry NC idx - lag ***/ + unprotect_entry(file_ptr, type, idx - lag, + NO_CHANGE, + H5C__NO_FLAGS_SET); + } else { + + if ( verbose ) + HDfprintf(stdout, "18(u, %d, %d) ", + type, (idx - lag)); + + /*** unprotect entry idx - lag ***/ + unprotect_entry(file_ptr, type, idx - lag, + dirty_unprotects, + H5C__NO_FLAGS_SET); + } + break; + + case 2: /* we just did an insrt */ + + if ( verbose ) + HDfprintf(stdout, "19(u-del, %d, %d) ", + type, (idx - lag)); + + /*** unprotect delete idx - lag ***/ + unprotect_entry(file_ptr, type, idx - lag, + NO_CHANGE, H5C__DELETED_FLAG); + break; + + case 3: + if ( (entries[type])[idx-lag].is_dirty ) { + + if ( verbose ) + HDfprintf(stdout, "20(u-del, %d, %d) ", + type, (idx - lag)); + + /*** unprotect delete idx - lag ***/ + unprotect_entry(file_ptr, type, idx - lag, + NO_CHANGE, + H5C__DELETED_FLAG); + } else { + + if ( verbose ) + HDfprintf(stdout, "21(u-del, %d, %d) ", + type, (idx - lag)); + + /*** unprotect delete idx - lag ***/ + unprotect_entry(file_ptr, type, idx - lag, + dirty_destroys, + H5C__DELETED_FLAG); + } + break; + + default: + HDassert(0); /* this can't happen... */ + break; + } + } + + } else { + + if ( ( pass ) && + ( (idx - lag) >= 0 ) && + ( (idx - lag) >= lower_bound ) && + ( ( idx - lag) <= local_max_index ) && + ( ( idx - lag) <= upper_bound ) ) { + + if ( verbose ) + HDfprintf(stdout, "22(u, %d, %d) ", + type, (idx - lag)); + + /*** unprotect idx - lag ***/ + unprotect_entry(file_ptr, type, idx - lag, + dirty_unprotects, H5C__NO_FLAGS_SET); + } + } + + idx++; + + if ( verbose ) + HDfprintf(stdout, "\n"); + + } /* while ( ( pass ) && ( idx <= upper_bound ) ) */ + + end_trans(file_ptr, cache_ptr, verbose, trans_num, + "jrnl_row_major_scan_forward inner loop"); + + if ( verbose ) + HDfprintf(stdout, "end trans %lld.\n", (long long)trans_num); + + lower_bound = upper_bound + (2 * lag) + 2; + upper_bound = lower_bound + 8; + + idx = lower_bound - lag; + + } /* while ( ( pass ) && ( idx <= (local_max_index + lag) ) ) */ + + type++; + + } /* while ( ( pass ) && ( type < NUMBER_OF_ENTRY_TYPES ) ) */ + + if ( ( pass ) && ( display_stats ) ) { + + H5C_stats(cache_ptr, "test cache", display_detailed_stats); + } + + return; + +} /* jrnl_row_major_scan_forward() */ + + +/*------------------------------------------------------------------------- + * Function: open_existing_file_for_journaling() + * + * Purpose: If pass 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 pass to FALSE, and set failure_mssg + * to point to an appropriate failure message. + * + * Do nothing if pass is FALSE on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 5/13/08 + * + * Modifications: + * + * JRM -- 6/10/09 + * Added human readable parameter. + * + *------------------------------------------------------------------------- + */ + +static void +open_existing_file_for_journaling(const char * hdf_file_name, + const char * journal_file_name, + hid_t * file_id_ptr, + H5F_t ** file_ptr_ptr, + H5C_t ** cache_ptr_ptr, + hbool_t human_readable, + hbool_t use_aio) +{ + const char * fcn_name = "open_existing_file_for_journaling()"; + hbool_t show_progress = FALSE; + hbool_t verbose = FALSE; + int cp = 0; + herr_t result; + H5AC_jnl_config_t jnl_config; + hid_t fapl_id = -1; + hid_t file_id = -1; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + + if ( pass ) + { + if ( ( hdf_file_name == NULL ) || + ( journal_file_name == NULL ) || + ( file_id_ptr == NULL ) || + ( file_ptr_ptr == NULL ) || + ( cache_ptr_ptr == NULL ) ) { + + failure_mssg = + "Bad param(s) on entry to open_existing_file_for_journaling().\n"; + pass = FALSE; + } + else if ( HDstrlen(journal_file_name) > H5AC__MAX_JOURNAL_FILE_NAME_LEN ) { + + failure_mssg = "journal file name too long.\n"; + pass = FALSE; + + } else if ( verbose ) { + + HDfprintf(stdout, "%s: HDF file name = \"%s\".\n", + fcn_name, hdf_file_name); + HDfprintf(stdout, "%s: journal file name = \"%s\".\n", + fcn_name, journal_file_name); + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* create a file access propertly list. */ + if ( pass ) { + + fapl_id = H5Pcreate(H5P_FILE_ACCESS); + + if ( fapl_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pcreate() failed.\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* call H5Pset_libver_bounds() on the fapl_id */ + if ( pass ) { + + if ( H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, H5F_LIBVER_LATEST) + < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pset_libver_bounds() failed.\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + if ( pass ) { + + jnl_config.version = H5AC__CURR_JNL_CONFIG_VER; + + result = H5Pget_jnl_config(fapl_id, &jnl_config); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pget_jnl_config() failed.\n"; + } + + /* set journaling config fields to taste */ + jnl_config.enable_journaling = TRUE; + + HDstrcpy(jnl_config.journal_file_path, journal_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 = use_aio; + jnl_config.jbrb_human_readable = human_readable; + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + if ( pass ) { + + result = H5Pset_jnl_config(fapl_id, &jnl_config); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pset_jnl_config() failed.\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /**************************************/ + /* open the file with the fapl above. */ + /**************************************/ + + /* open the file using fapl_id */ + if ( pass ) { + + file_id = H5Fopen(hdf_file_name, H5F_ACC_RDWR, fapl_id); + + if ( file_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fopen() failed (1).\n"; + + } else { + + file_ptr = H5I_object_verify(file_id, H5I_FILE); + + if ( file_ptr == NULL ) { + + pass = FALSE; + failure_mssg = "Can't get file_ptr."; + + if ( verbose ) { + HDfprintf(stdout, "%s: Can't get file_ptr.\n", fcn_name); + } + } + } + } + + /* At least within the context of the cache 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 + * 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 + * to the cache structure + */ + if ( pass ) { + + if ( file_ptr->shared->cache == NULL ) { + + pass = FALSE; + failure_mssg = "can't get cache pointer(1).\n"; + + } else { + + cache_ptr = file_ptr->shared->cache; + } + } + + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + if ( pass ) { + + *file_id_ptr = file_id; + *file_ptr_ptr = file_ptr; + *cache_ptr_ptr = cache_ptr; + } + + if ( show_progress ) + HDfprintf(stdout, "%s: cp = %d -- exiting.\n", fcn_name, cp++); + + return; + +} /* open_existing_file_for_journaling() */ + + +/*------------------------------------------------------------------------- + * Function: open_existing_file_without_journaling() + * + * Purpose: If pass 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 pass to FALSE, and set failure_mssg + * to point to an appropriate failure message. + * + * Do nothing if pass is FALSE on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 7/10/08 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +static void +open_existing_file_without_journaling(const char * hdf_file_name, + hid_t * file_id_ptr, + H5F_t ** file_ptr_ptr, + H5C_t ** cache_ptr_ptr) +{ + const char * fcn_name = "open_existing_file_without_journaling()"; + hbool_t show_progress = FALSE; + hbool_t verbose = FALSE; + int cp = 0; + hid_t fapl_id = -1; + hid_t file_id = -1; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + + if ( pass ) + { + if ( ( hdf_file_name == NULL ) || + ( file_id_ptr == NULL ) || + ( file_ptr_ptr == NULL ) || + ( cache_ptr_ptr == NULL ) ) { + + failure_mssg = + "Bad param(s) on entry to open_existing_file_without_journaling().\n"; + pass = FALSE; + + } else { + + if ( verbose ) { + + HDfprintf(stdout, "%s: HDF file name = \"%s\".\n", + fcn_name, hdf_file_name); + } + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* create a file access propertly list. */ + if ( pass ) { + + fapl_id = H5Pcreate(H5P_FILE_ACCESS); + + if ( fapl_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pcreate() failed.\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* call H5Pset_libver_bounds() on the fapl_id */ + if ( pass ) { + + if ( H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, + H5F_LIBVER_LATEST) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pset_libver_bounds() failed.\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + + /**************************************/ + /* open the file with the fapl above. */ + /**************************************/ + + /* open the file using fapl_id */ + if ( pass ) { + + file_id = H5Fopen(hdf_file_name, H5F_ACC_RDWR, fapl_id); + + if ( file_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fopen() failed (2).\n"; + + } else { + + file_ptr = H5I_object_verify(file_id, H5I_FILE); + + if ( file_ptr == NULL ) { + + pass = FALSE; + failure_mssg = "Can't get file_ptr."; + + if ( verbose ) { + HDfprintf(stdout, "%s: Can't get file_ptr.\n", fcn_name); + } + } + } + } + + /* At least within the context of the cache 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 + * 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 + * to the cache structure + */ + if ( pass ) { + + if ( file_ptr->shared->cache == NULL ) { + + pass = FALSE; + failure_mssg = "can't get cache pointer(1).\n"; + + } else { + + cache_ptr = file_ptr->shared->cache; + } + } + + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + if ( pass ) { + + *file_id_ptr = file_id; + *file_ptr_ptr = file_ptr; + *cache_ptr_ptr = cache_ptr; + } + + if ( show_progress ) + HDfprintf(stdout, "%s: cp = %d -- exiting.\n", fcn_name, cp++); + + return; + +} /* open_existing_file_without_journaling() */ + + +/*------------------------------------------------------------------------- + * Function: setup_cache_for_journaling() + * + * Purpose: If pass 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 pass to FALSE, and set failure_mssg + * to point to an appropriate failure message. + * + * Do nothing if pass is FALSE on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 5/13/08 + * + * Modifications: + * + * 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 + * + *------------------------------------------------------------------------- + */ + +static void +setup_cache_for_journaling(const char * hdf_file_name, + const char * journal_file_name, + hid_t * file_id_ptr, + H5F_t ** file_ptr_ptr, + H5C_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 */ + hbool_t UNUSED use_core_driver_if_avail) +#endif /* USE_CORE_DRIVER */ +{ + const char * fcn_name = "setup_cache_for_journaling()"; + hbool_t show_progress = FALSE; + hbool_t verbose = FALSE; + int cp = 0; + herr_t result; + H5AC_cache_config_t mdj_config = + { + /* int version = */ H5C__CURR_AUTO_SIZE_CTL_VER, + /* hbool_t rpt_fcn_enabled = */ FALSE, + /* hbool_t open_trace_file = */ FALSE, + /* hbool_t close_trace_file = */ FALSE, + /* char trace_file_name[] = */ "", + /* hbool_t evictions_enabled = */ TRUE, + /* hbool_t set_initial_size = */ TRUE, + /* size_t initial_size = */ ( 64 * 1024 ), + /* double min_clean_fraction = */ 0.5, + /* size_t max_size = */ (16 * 1024 * 1024 ), + /* size_t min_size = */ ( 8 * 1024 ), + /* long int epoch_length = */ 50000, + /* enum H5C_cache_incr_mode incr_mode = */ H5C_incr__off, + /* double lower_hr_threshold = */ 0.9, + /* double increment = */ 2.0, + /* hbool_t apply_max_increment = */ TRUE, + /* size_t max_increment = */ (4 * 1024 * 1024), + /* enum H5C_cache_flash_incr_mode */ + /* flash_incr_mode = */ H5C_flash_incr__off, + /* double flash_multiple = */ 1.0, + /* double flash_threshold = */ 0.25, + /* enum H5C_cache_decr_mode decr_mode = */ H5C_decr__off, + /* double upper_hr_threshold = */ 0.999, + /* double decrement = */ 0.9, + /* hbool_t apply_max_decrement = */ TRUE, + /* size_t max_decrement = */ (1 * 1024 * 1024), + /* int epochs_before_eviction = */ 3, + /* hbool_t apply_empty_reserve = */ TRUE, + /* double empty_reserve = */ 0.1, + /* int dirty_bytes_threshold = */ (8 * 1024) + }; + H5AC_jnl_config_t jnl_config = + { + /* int version = */ H5AC__CURR_JNL_CONFIG_VER, + /* hbool_t enable_journaling = */ TRUE, + /* char journal_file_path[] = */ "", + /* hbool_t journal_recovered = */ FALSE, + /* size_t jbrb_buf_size = */ (8 * 1024), + /* int jbrb_num_bufs = */ 2, + /* hbool_t jbrb_use_aio = */ FALSE, + /* hbool_t jbrb_human_readable = */ TRUE + }; + hid_t fapl_id = -1; + hid_t file_id = -1; + haddr_t actual_base_addr; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + + if ( pass ) + { + if ( ( hdf_file_name == NULL ) || + ( journal_file_name == NULL ) || + ( file_id_ptr == NULL ) || + ( file_ptr_ptr == NULL ) || + ( cache_ptr_ptr == NULL ) ) { + + failure_mssg = + "Bad param(s) on entry to setup_cache_for_journaling().\n"; + pass = FALSE; + } + else if ( HDstrlen(journal_file_name) > H5AC__MAX_JOURNAL_FILE_NAME_LEN ) + { + failure_mssg = "journal file name too long.\n"; + pass = FALSE; + + } else { + + HDstrcpy(jnl_config.journal_file_path, journal_file_name); + + if ( verbose ) { + + HDfprintf(stdout, "%s: HDF file name = \"%s\".\n", + fcn_name, hdf_file_name); + HDfprintf(stdout, "%s: journal file name = \"%s\".\n", + fcn_name, journal_file_name); + } + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* create a file access propertly list. */ + if ( pass ) { + + fapl_id = H5Pcreate(H5P_FILE_ACCESS); + + if ( fapl_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pcreate() failed.\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* call H5Pset_libver_bounds() on the fapl_id */ + if ( pass ) { + + if ( H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, + H5F_LIBVER_LATEST) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pset_libver_bounds() failed.\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + if ( pass ) { + + result = H5Pset_mdc_config(fapl_id, (H5AC1_cache_config_t *)&mdj_config); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pset_mdc_config() failed.\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + if ( pass ) { + + jnl_config.jbrb_human_readable = human_readable; + jnl_config.jbrb_use_aio = use_aio; + + result = H5Pset_jnl_config(fapl_id, &jnl_config); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pset_mdc_config() failed.\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + +#if USE_CORE_DRIVER + if ( ( pass ) && ( use_core_driver_if_avail ) ) { + + if ( H5Pset_fapl_core(fapl_id, 64 * 1024 * 1024, FALSE) < 0 ) { + + pass = FALSE; + failure_mssg = "H5P_set_fapl_core() failed.\n"; + } + } +#endif /* USE_CORE_DRIVER */ + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + + /**************************************/ + /* Create a file with the fapl above. */ + /**************************************/ + + /* create the file using fapl_id */ + if ( pass ) { + + file_id = H5Fcreate(hdf_file_name, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id); + + if ( file_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fcreate() failed.\n"; + + } else { + + file_ptr = H5I_object_verify(file_id, H5I_FILE); + + if ( file_ptr == NULL ) { + + pass = FALSE; + failure_mssg = "Can't get file_ptr."; + + if ( verbose ) { + HDfprintf(stdout, "%s: Can't get file_ptr.\n", fcn_name); + } + } + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + if ( pass ) { /* allocate space for test entries */ + + actual_base_addr = H5MF_alloc(file_ptr, H5FD_MEM_DEFAULT, H5P_DEFAULT, + (hsize_t)(ADDR_SPACE_SIZE + BASE_ADDR)); + + if ( actual_base_addr == HADDR_UNDEF ) { + + pass = FALSE; + failure_mssg = "H5MF_alloc() failed."; + + if ( verbose ) { + HDfprintf(stdout, "%s: H5MF_alloc() failed.\n", fcn_name); + } + + } else if ( actual_base_addr > BASE_ADDR ) { + + /* If this happens, must increase BASE_ADDR so that the + * actual_base_addr is <= BASE_ADDR. This should only happen + * if the size of the superblock is increase. + */ + pass = FALSE; + failure_mssg = "actual_base_addr > BASE_ADDR"; + + if ( verbose ) { + HDfprintf(stdout, "%s: actual_base_addr > BASE_ADDR.\n", + fcn_name); + } + } + + saved_actual_base_addr = actual_base_addr; + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* get a pointer to the files internal data structure and then + * to the cache structure + */ + if ( pass ) { + + if ( file_ptr->shared->cache == NULL ) { + + pass = FALSE; + failure_mssg = "can't get cache pointer(1).\n"; + + } else { + + cache_ptr = file_ptr->shared->cache; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + reset_entries(); + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* close the fapl */ + if ( pass ) { + + if ( H5Pclose(fapl_id) < 0 ) { + + pass = FALSE; + failure_mssg = "error closing fapl.\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + if ( pass ) { + + *file_id_ptr = file_id; + *file_ptr_ptr = file_ptr; + *cache_ptr_ptr = cache_ptr; + } + + if ( show_progress ) + HDfprintf(stdout, "%s: cp = %d -- exiting.\n", fcn_name, cp++); + + return; + +} /* setup_cache_for_journaling() */ + + +/*------------------------------------------------------------------------- + * Function: takedown_cache_after_journaling() + * + * Purpose: If file_id >= 0, close the associated file, and then delete + * it. Verify that they journal file has been deleted. + * + * Return: void + * + * Programmer: John Mainzer + * 5/13/08 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +static void +takedown_cache_after_journaling(hid_t file_id, + const char * filename, + const char * journal_filename, + hbool_t + use_core_driver_if_avail) +{ + const char *fcn_name = "takedown_cache_after_journaling"; + hbool_t verbose = FALSE; + int error; + + if ( file_id >= 0 ) { + + if ( H5F_addr_defined(saved_actual_base_addr) ) { + H5F_t * file_ptr; + + file_ptr = H5I_object_verify(file_id, H5I_FILE); + + if ( file_ptr == NULL ) { + + pass = FALSE; + failure_mssg = "Can't get file_ptr."; + + if ( verbose ) { + HDfprintf(stdout, "%s: Can't get file_ptr.\n", fcn_name); + } + } + + /* Flush the cache, so that the close call doesn't try to write to + * the space we free */ + H5Fflush(file_id, H5F_SCOPE_GLOBAL); + + H5MF_xfree(file_ptr, H5FD_MEM_DEFAULT, H5P_DEFAULT, saved_actual_base_addr, + (hsize_t)(ADDR_SPACE_SIZE + BASE_ADDR)); + saved_actual_base_addr = HADDR_UNDEF; + } + + if ( H5Fclose(file_id) < 0 ) { + + if ( pass ) { + + pass = FALSE; + failure_mssg = "file close failed."; + } + } else if ( ( ( ! USE_CORE_DRIVER ) || ( ! use_core_driver_if_avail ) ) && + ( ( error = HDremove(filename) ) != 0 ) ) { + + if ( verbose ) { + HDfprintf(stdout, + "HDremove(\"%s\") failed, returned %d, errno = %d = %s.\n", + filename, error, errno, strerror(errno)); + } + + if ( pass ) { + + pass = FALSE; + failure_mssg = "HDremove() failed (1).\n"; + } + } + } + + verify_journal_deleted(journal_filename); + + return; + +} /* takedown_cache_after_journaling() */ + + +/*------------------------------------------------------------------------- + * Function: verify_journal_contents() + * + * Purpose: If pass 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 pass to FALSE and set failure_mssg to point to an + * appropriate error message. + * + * Do nothing if pass is FALSE on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 5/06/08 + * + * Modifications: + * + * JRM -- 6/10/09 + * Updated function to deal with binary as well as human + * readable journal files. + * + *------------------------------------------------------------------------- + */ + +static void +verify_journal_contents(const char * journal_file_path_ptr, + const char * expected_file_path_ptr, + hbool_t human_readable) +{ + const char * fcn_name = "verify_journal_contents()"; + char ch; + char journal_buf[(8 * 1024) + 1]; + char expected_buf[(8 * 1024) + 1]; + hbool_t verbose = FALSE; + size_t cur_buf_len; + const size_t max_buf_len = (8 * 1024); + size_t journal_len = 0; + size_t expected_len = 0; + size_t first_line_len; + size_t journal_remainder_len = 0; + size_t expected_remainder_len = 0; + ssize_t read_result; + int journal_file_fd = -1; + int expected_file_fd = -1; + h5_stat_t buf; + + if ( pass ) { + + if ( journal_file_path_ptr == NULL ) { + + failure_mssg = "journal_file_path_ptr NULL on entry?!?", + pass = FALSE; + + } else if ( expected_file_path_ptr == NULL ) { + + failure_mssg = "expected_file_path_ptr NULL on entry?!?", + pass = FALSE; + + } + } + + if ( ( pass ) && ( verbose ) ) { + + HDfprintf(stdout, "%s: *journal_file_path_ptr = \"%s\"\n", + fcn_name, journal_file_path_ptr); + HDfprintf(stdout, "%s: *expected_file_path_ptr = \"%s\"\n", + fcn_name, expected_file_path_ptr); + } + + /* get the actual length of the journal file */ + if ( pass ) { + + if ( HDstat(journal_file_path_ptr, &buf) != 0 ) { + + if ( verbose ) { + + HDfprintf(stdout, "%s: HDstat(j) failed with errno = %d.\n", + fcn_name, errno); + } + failure_mssg = "stat() failed on journal file."; + pass = FALSE; + + } else { + + if ( (buf.st_size) == 0 ) { + + failure_mssg = "Journal file empty?!?"; + pass = FALSE; + + } else { + + journal_len = (size_t)(buf.st_size); + + if ( verbose ) { + + HDfprintf(stdout, "%s: journal_len = %d.\n", + fcn_name, (int)journal_len); + } + } + } + } + + /* get the actual length of the expected file */ + if ( pass ) { + + if ( HDstat(expected_file_path_ptr, &buf) != 0 ) { + + if ( verbose ) { + + HDfprintf(stdout, "%s: HDstat(e) failed with errno = %d.\n", + fcn_name, errno); + } + failure_mssg = "stat() failed on expected file."; + pass = FALSE; + + } else { + + if ( (buf.st_size) == 0 ) { + + failure_mssg = "Expected file empty?!?"; + pass = FALSE; + + } else { + + expected_len = (size_t)(buf.st_size); + + if ( verbose ) { + + HDfprintf(stdout, "%s: expected_len = %d.\n", + fcn_name, (int)expected_len); + } + } + } + } + + /* open the journal file */ + if ( pass ) { + + if ( (journal_file_fd = HDopen(journal_file_path_ptr, O_RDONLY, 0777)) + == -1 ) { + + if ( verbose ) { + + HDfprintf(stdout, "%s: HDopen(j) failed with errno = %d.\n", + fcn_name, errno); + } + failure_mssg = "Can't open journal file."; + pass = FALSE; + } + } + + /* open the expected file */ + if ( pass ) { + + if ( (expected_file_fd = HDopen(expected_file_path_ptr, O_RDONLY, 0777)) + == -1 ) { + + if ( verbose ) { + + HDfprintf(stdout, "%s: HDopen(e) failed with errno = %d.\n", + fcn_name, errno); + } + failure_mssg = "Can't open expected file."; + pass = FALSE; + } + } + + /* 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 + * 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 + * first line can't be very long. + */ + if ( pass ) { + + first_line_len = 1; + read_result = HDread(journal_file_fd, &ch, 1); + + while ( ( ch != '\n' ) && + ( first_line_len < 256 ) && + ( read_result == 1 ) ) { + + first_line_len++; + read_result = HDread(journal_file_fd, &ch, 1); + } + + if ( ch != '\n' ) { + + failure_mssg = "error skipping first line of journal file."; + pass = FALSE; + + } else if ( first_line_len > journal_len ) { + + failure_mssg = "first_line_len > journal_len?!?"; + pass = FALSE; + + } else { + + journal_remainder_len = journal_len - first_line_len; + } + } + + if ( pass ) { + + first_line_len = 1; + read_result = HDread(expected_file_fd, &ch, 1); + + while ( ( ch != '\n' ) && + ( first_line_len < 256 ) && + ( read_result == 1 ) ) { + + first_line_len++; + read_result = HDread(expected_file_fd, &ch, 1); + } + + if ( ch != '\n' ) { + + failure_mssg = "error skipping first line of expected file."; + pass = FALSE; + + } else if ( first_line_len > expected_len ) { + + failure_mssg = "first_line_len > expected_len?!?"; + pass = FALSE; + + } else { + + expected_remainder_len = expected_len - first_line_len; + } + } + + if ( pass ) { + + if ( journal_remainder_len != expected_remainder_len ) { + + failure_mssg = "Unexpected journal file contents(1)."; + pass = FALSE; + } + } + + /* 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 ( ( pass ) && + ( journal_remainder_len > 0 ) ) + { + HDassert( journal_remainder_len == expected_remainder_len ); + + if ( journal_remainder_len > max_buf_len ) { + + cur_buf_len = max_buf_len; + journal_remainder_len -= max_buf_len; + expected_remainder_len -= max_buf_len; + + } else { + + cur_buf_len = journal_remainder_len; + journal_remainder_len = 0; + expected_remainder_len = 0; + } + + read_result = HDread(journal_file_fd, journal_buf, cur_buf_len); + + if ( read_result != (int)cur_buf_len ) { + + if ( verbose ) { + + HDfprintf(stdout, + "%s: HDread(j) failed. result = %d, errno = %d.\n", + fcn_name, (int)read_result, errno); + } + failure_mssg = "error reading journal file."; + pass = FALSE; + } + + journal_buf[cur_buf_len] = '\0'; + + if ( pass ) { + + read_result = HDread(expected_file_fd, expected_buf, cur_buf_len); + + if ( read_result != (int)cur_buf_len ) { + + if ( verbose ) { + + HDfprintf(stdout, + "%s: HDread(e) failed. result = %d, errno = %d.\n", + fcn_name, (int)read_result, errno); + } + failure_mssg = "error reading expected file."; + pass = FALSE; + } + + expected_buf[cur_buf_len] = '\0'; + } + + if ( pass ) { + + if ( human_readable ) { + + if ( HDstrcmp(journal_buf, expected_buf) != 0 ) { + + if ( verbose ) { + + HDfprintf(stdout, + "expected_buf = \"%s\"\n", expected_buf); + HDfprintf(stdout, + "journal_buf = \"%s\"\n", journal_buf); + } + + failure_mssg = "Unexpected journal file contents(2)."; + pass = FALSE; + } + } else { /* binary journal file -- can't use strcmp() */ + + if ( HDmemcmp(journal_buf, expected_buf, (size_t)cur_buf_len) + != 0 ) { + + failure_mssg = "Unexpected journal file contents(2b)."; + pass = FALSE; + } + } + } + } + + if ( journal_file_fd != -1 ) { + + if ( HDclose(journal_file_fd) != 0 ) { + + if ( verbose ) { + + HDfprintf(stdout, "%s: HDclose(j) failed with errno = %d.\n", + fcn_name, errno); + } + + if ( pass ) { + + failure_mssg = "Can't close journal file."; + pass = FALSE; + } + } + } + + if ( expected_file_fd != -1 ) { + + if ( HDclose(expected_file_fd) != 0 ) { + + if ( verbose ) { + + HDfprintf(stdout, "%s: HDclose(e) failed with errno = %d.\n", + fcn_name, errno); + } + + if ( pass ) { + + failure_mssg = "Can't close expected file."; + pass = FALSE; + } + } + } + + return; + +} /* verify_journal_contents() */ + + +/*------------------------------------------------------------------------- + * Function: verify_journal_deleted() + * + * Purpose: If pass is true on entry, stat the target journal file, + * and verify that it does not exist. If it does, set + * pass to FALSE, and set failure_mssg to point to an + * appropriate failure message. Similarly, if any errors + * are detected in this process, set pass to FALSE and set + * failure_mssg to point to an appropriate error message. + * + * Do nothing if pass is FALSE on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 5//08 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +static void +verify_journal_deleted(const char * journal_file_path_ptr) +{ + const char * fcn_name = "verify_journal_deleted()"; + hbool_t verbose = FALSE; + h5_stat_t buf; + + if ( pass ) { + + if ( journal_file_path_ptr == NULL ) { + + failure_mssg = "journal_file_path_ptr NULL on entry?!?", + pass = FALSE; + } + } + + if ( pass ) { + + if ( HDstat(journal_file_path_ptr, &buf) == 0 ) { + + if ( verbose ) { + + HDfprintf(stdout, "%s: HDstat(%s) succeeded.\n", fcn_name, + journal_file_path_ptr); + } + + failure_mssg = "journal file not deleted(1)."; + pass = FALSE; + + } else if ( errno != ENOENT ) { + + if ( verbose ) { + + HDfprintf(stdout, + "%s: HDstat() failed with unexpected errno = %d.\n", + fcn_name, errno); + } + failure_mssg = "journal file not deleted(2)."; + pass = FALSE; + + } + } + + return; + +} /* verify_journal_deleted() */ + + +/*------------------------------------------------------------------------- + * Function: verify_journal_empty() + * + * Purpose: If pass is true on entry, stat the target journal file, + * and verify that it has length zero. If it is not, set + * pass to FALSE, and set failure_mssg to point to an + * appropriate failure message. Similarly, if any errors + * are detected in this process, set pass to FALSE and set + * failure_mssg to point to an appropriate error message. + * + * Do nothing if pass is FALSE on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 5/06/08 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +static void +verify_journal_empty(const char * journal_file_path_ptr) +{ + const char * fcn_name = "verify_journal_empty()"; + hbool_t verbose = FALSE; + h5_stat_t buf; + + if ( pass ) { + + if ( journal_file_path_ptr == NULL ) { + + failure_mssg = "journal_file_path_ptr NULL on entry?!?", + pass = FALSE; + } + } + + if ( pass ) { + + if ( HDstat(journal_file_path_ptr, &buf) != 0 ) { + + if ( verbose ) { + + HDfprintf(stdout, "%s: HDstat() failed with errno = %d.\n", + fcn_name, errno); + } + failure_mssg = "stat() failed on journal file."; + pass = FALSE; + + } else { + + if ( (buf.st_size) > 0 ) { + + failure_mssg = "Empty journal file expected."; + pass = FALSE; + } + } + } + + return; + +} /* verify_journal_empty() */ + + +/*** metadata journaling smoke checks ***/ + +/*------------------------------------------------------------------------- + * Function: mdj_smoke_check_00() + * + * 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 + * 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 + * 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 + * journaling is working. + * + * 4) Close the file, and verify that the journal is deleted. + * + * 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. + * + * 7) Disable journaling on the open file. Verify that the + * journal file has been deleted. + * + * 8) Close and delete the file. + * + * Return: void + * + * Programmer: John Mainzer + * 3/11/08 + * + * 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, + hbool_t use_aio) +{ + const char * fcn_name = "mdj_smoke_check_00()"; + const char * human_readable_testfiles[] = + { + "testfiles/cache_journal_sc00_000.jnl", + "testfiles/cache_journal_sc00_001.jnl", + "testfiles/cache_journal_sc00_002.jnl", + "testfiles/cache_journal_sc00_003.jnl", + "testfiles/cache_journal_sc00_004.jnl", + "testfiles/cache_journal_sc00_005.jnl", + "testfiles/cache_journal_sc00_006.jnl", + "testfiles/cache_journal_sc00_007.jnl", + "testfiles/cache_journal_sc00_008.jnl", + "testfiles/cache_journal_sc00_009.jnl", + "testfiles/cache_journal_sc00_010.jnl", + "testfiles/cache_journal_sc00_011.jnl", + "testfiles/cache_journal_sc00_012.jnl", + "testfiles/cache_journal_sc00_013.jnl", + "testfiles/cache_journal_sc00_014.jnl", + "testfiles/cache_journal_sc00_015.jnl", + "testfiles/cache_journal_sc00_016.jnl", + "testfiles/cache_journal_sc00_017.jnl", + "testfiles/cache_journal_sc00_018.jnl", + NULL + }; + const char * binary_testfiles[] = + { + "testfiles/cache_journal_bsc00_000.jnl", + "testfiles/cache_journal_bsc00_001.jnl", + "testfiles/cache_journal_bsc00_002.jnl", + "testfiles/cache_journal_bsc00_003.jnl", + "testfiles/cache_journal_bsc00_004.jnl", + "testfiles/cache_journal_bsc00_005.jnl", + "testfiles/cache_journal_bsc00_006.jnl", + "testfiles/cache_journal_bsc00_007.jnl", + "testfiles/cache_journal_bsc00_008.jnl", + "testfiles/cache_journal_bsc00_009.jnl", + "testfiles/cache_journal_bsc00_010.jnl", + "testfiles/cache_journal_bsc00_011.jnl", + "testfiles/cache_journal_bsc00_012.jnl", + "testfiles/cache_journal_bsc00_013.jnl", + "testfiles/cache_journal_bsc00_014.jnl", + "testfiles/cache_journal_bsc00_015.jnl", + "testfiles/cache_journal_bsc00_016.jnl", + "testfiles/cache_journal_bsc00_017.jnl", + "testfiles/cache_journal_bsc00_018.jnl", + NULL + }; + const char **testfiles; + char filename[512]; + char journal_filename[H5AC__MAX_JOURNAL_FILE_NAME_LEN + 1]; + hbool_t testfile_missing = FALSE; + hbool_t show_progress = FALSE; + hbool_t verbose = FALSE; + hbool_t update_architypes; + herr_t result; + int cp = 0; + hid_t file_id = -1; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + H5AC_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; + + 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; + + if ( use_aio ) { + + TESTING("binary aio mdj smoke check 00 -- general coverage"); + + } else { + + TESTING("binary sio mdj smoke check 00 -- general coverage"); + } + } + + pass = TRUE; + + /***********************************************************************/ + /* 1) Create a file with cache configuration set to enable journaling. */ + /***********************************************************************/ + + /* setup the file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, sizeof(filename)) + == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed (1).\n"; + } + } + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + if ( verbose ) { + HDfprintf(stdout, "%s: filename = \"%s\".\n", fcn_name, filename); + } + + /* setup the journal file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[3], H5P_DEFAULT, journal_filename, + sizeof(journal_filename)) == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed (2).\n"; + } + else if ( HDstrlen(journal_filename) >= + H5AC__MAX_JOURNAL_FILE_NAME_LEN ) { + + pass = FALSE; + failure_mssg = "journal file name too long.\n"; + } + } + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + 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, + use_aio, FALSE); + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + + /********************************************************************/ + /* 2) Using the test entries, simulate a selection of transactions, */ + /* which exercise the full range of metadata cache API calls */ + /* that can generate journal entries. Verify that these */ + /* transactions are reflected correctly in the journal. */ + /********************************************************************/ + + /* a) First a quick check to see if we can do anything */ + + begin_trans(cache_ptr, verbose, (uint64_t)1, "transaction 1.0"); + + insert_entry(file_ptr, 0, 1, FALSE, H5C__NO_FLAGS_SET); + + protect_entry(file_ptr, 0, 0); + + unprotect_entry(file_ptr, 0, 0, TRUE, H5C__NO_FLAGS_SET); + + end_trans(file_ptr, cache_ptr, verbose, (uint64_t)1, "transaction 1.0"); + + flush_journal(cache_ptr); + + if ( update_architypes ) { + + copy_file(journal_filename, testfiles[0]); + } + + if ( file_exists(testfiles[0]) ) { + + verify_journal_contents(journal_filename, testfiles[0], human_readable); + + } else { + + testfile_missing = TRUE; + } + + flush_cache(file_ptr, FALSE, FALSE, FALSE); /* resets transaction number */ + + verify_journal_empty(journal_filename); + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + + /* b) Verify that a sequence of cache operation that do not dirty + * any entry do not result in any journal activity. + */ + + begin_trans(cache_ptr, verbose, (uint64_t)1, "transaction 1.1"); + + protect_entry(file_ptr, TINY_ENTRY_TYPE, 0); + protect_entry(file_ptr, TINY_ENTRY_TYPE, 1); + protect_entry(file_ptr, TINY_ENTRY_TYPE, 2); + unprotect_entry(file_ptr, TINY_ENTRY_TYPE, 2, FALSE, H5C__NO_FLAGS_SET); + unprotect_entry(file_ptr, TINY_ENTRY_TYPE, 1, FALSE, H5C__NO_FLAGS_SET); + unprotect_entry(file_ptr, TINY_ENTRY_TYPE, 0, FALSE, H5C__NO_FLAGS_SET); + + protect_entry_ro(file_ptr, TINY_ENTRY_TYPE, 3); + protect_entry_ro(file_ptr, TINY_ENTRY_TYPE, 3); + protect_entry_ro(file_ptr, TINY_ENTRY_TYPE, 3); + unprotect_entry(file_ptr, TINY_ENTRY_TYPE, 3, FALSE, H5C__NO_FLAGS_SET); + unprotect_entry(file_ptr, TINY_ENTRY_TYPE, 3, FALSE, H5C__NO_FLAGS_SET); + unprotect_entry(file_ptr, TINY_ENTRY_TYPE, 3, FALSE, H5C__NO_FLAGS_SET); + + end_trans(file_ptr, cache_ptr, verbose, (uint64_t)1, "transaction 1.1"); + + flush_journal(cache_ptr); + + verify_journal_empty(journal_filename); + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + + /* 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). + */ + + begin_trans(cache_ptr, verbose, (uint64_t)2, "transaction 2.1"); + + protect_entry(file_ptr, TINY_ENTRY_TYPE, 0); + unprotect_entry(file_ptr, TINY_ENTRY_TYPE, 0, FALSE, H5C__NO_FLAGS_SET); + protect_entry(file_ptr, TINY_ENTRY_TYPE, 1); + unprotect_entry(file_ptr, TINY_ENTRY_TYPE, 1, TRUE, H5C__NO_FLAGS_SET); + protect_entry(file_ptr, TINY_ENTRY_TYPE, 2); + unprotect_entry(file_ptr, TINY_ENTRY_TYPE, 2, FALSE, H5C__NO_FLAGS_SET); + protect_entry(file_ptr, TINY_ENTRY_TYPE, 3); + unprotect_entry(file_ptr, TINY_ENTRY_TYPE, 3, TRUE, H5C__NO_FLAGS_SET); + protect_entry(file_ptr, TINY_ENTRY_TYPE, 4); + unprotect_entry(file_ptr, TINY_ENTRY_TYPE, 4, FALSE, H5C__NO_FLAGS_SET); + protect_entry(file_ptr, TINY_ENTRY_TYPE, 5); + unprotect_entry(file_ptr, TINY_ENTRY_TYPE, 5, TRUE, H5C__NO_FLAGS_SET); + protect_entry(file_ptr, TINY_ENTRY_TYPE, 3); + unprotect_entry(file_ptr, TINY_ENTRY_TYPE, 3, TRUE, H5C__NO_FLAGS_SET); + protect_entry(file_ptr, TINY_ENTRY_TYPE, 1); + unprotect_entry(file_ptr, TINY_ENTRY_TYPE, 1, FALSE, H5C__NO_FLAGS_SET); + + end_trans(file_ptr, cache_ptr, verbose, (uint64_t)2, "transaction 2.1"); + + flush_journal(cache_ptr); + + if ( update_architypes ) { + + copy_file(journal_filename, testfiles[1]); + } + + if ( file_exists(testfiles[1]) ) { + + verify_journal_contents(journal_filename, testfiles[1], human_readable); + + } else { + + testfile_missing = TRUE; + } + + flush_cache(file_ptr, FALSE, FALSE, FALSE); /* resets transaction number */ + + verify_journal_empty(journal_filename); + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + + /* d) Mix up some protect/unprotect calls with renames. Do this with + * different orders to make things interesting. + */ + + begin_trans(cache_ptr, verbose, (uint64_t)1, "transaction 1.2"); + + protect_entry(file_ptr, MICRO_ENTRY_TYPE, 0); + unprotect_entry(file_ptr, MICRO_ENTRY_TYPE, 0, FALSE, H5C__NO_FLAGS_SET); + protect_entry(file_ptr, MICRO_ENTRY_TYPE, 1); + unprotect_entry(file_ptr, MICRO_ENTRY_TYPE, 1, TRUE, H5C__NO_FLAGS_SET); + protect_entry(file_ptr, MICRO_ENTRY_TYPE, 2); + unprotect_entry(file_ptr, MICRO_ENTRY_TYPE, 2, FALSE, H5C__NO_FLAGS_SET); + protect_entry(file_ptr, MICRO_ENTRY_TYPE, 2); + unprotect_entry(file_ptr, MICRO_ENTRY_TYPE, 2, TRUE, H5C__NO_FLAGS_SET); + protect_entry(file_ptr, MICRO_ENTRY_TYPE, 3); + unprotect_entry(file_ptr, MICRO_ENTRY_TYPE, 3, FALSE, H5C__NO_FLAGS_SET); + protect_entry(file_ptr, MICRO_ENTRY_TYPE, 4); + unprotect_entry(file_ptr, MICRO_ENTRY_TYPE, 4, TRUE, H5C__NO_FLAGS_SET); + + rename_entry(cache_ptr, MICRO_ENTRY_TYPE, 2, FALSE); + rename_entry(cache_ptr, MICRO_ENTRY_TYPE, 3, FALSE); + + end_trans(file_ptr, cache_ptr, verbose, (uint64_t)1, "transaction 1.2"); + + flush_journal(cache_ptr); + + if ( update_architypes ) { + + copy_file(journal_filename, testfiles[2]); + } + + if ( file_exists(testfiles[2]) ) { + + verify_journal_contents(journal_filename, testfiles[2], human_readable); + + } else { + + testfile_missing = TRUE; + } + + + + begin_trans(cache_ptr, verbose, (uint64_t)2, "transaction 2.2"); + + rename_entry(cache_ptr, MICRO_ENTRY_TYPE, 3, TRUE); + rename_entry(cache_ptr, MICRO_ENTRY_TYPE, 2, TRUE); + + protect_entry(file_ptr, MICRO_ENTRY_TYPE, 0); + unprotect_entry(file_ptr, MICRO_ENTRY_TYPE, 0, FALSE, H5C__NO_FLAGS_SET); + protect_entry(file_ptr, MICRO_ENTRY_TYPE, 1); + unprotect_entry(file_ptr, MICRO_ENTRY_TYPE, 1, TRUE, H5C__NO_FLAGS_SET); + protect_entry(file_ptr, MICRO_ENTRY_TYPE, 2); + unprotect_entry(file_ptr, MICRO_ENTRY_TYPE, 2, FALSE, H5C__NO_FLAGS_SET); + protect_entry(file_ptr, MICRO_ENTRY_TYPE, 3); + unprotect_entry(file_ptr, MICRO_ENTRY_TYPE, 3, TRUE, H5C__NO_FLAGS_SET); + protect_entry(file_ptr, MICRO_ENTRY_TYPE, 4); + unprotect_entry(file_ptr, MICRO_ENTRY_TYPE, 4, FALSE, H5C__NO_FLAGS_SET); + protect_entry(file_ptr, MICRO_ENTRY_TYPE, 5); + unprotect_entry(file_ptr, MICRO_ENTRY_TYPE, 5, TRUE, H5C__NO_FLAGS_SET); + + end_trans(file_ptr, cache_ptr, verbose, (uint64_t)2, "transaction 2.2"); + + flush_journal(cache_ptr); + + if ( update_architypes ) { + + copy_file(journal_filename, testfiles[3]); + } + + if ( file_exists(testfiles[3]) ) { + + verify_journal_contents(journal_filename, testfiles[3], human_readable); + + } else { + + testfile_missing = TRUE; + } + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + + + /* e-1) Start by pinning a selection of entries... */ + + begin_trans(cache_ptr, verbose, (uint64_t)3, "transaction 3.2"); + + protect_entry(file_ptr, MICRO_ENTRY_TYPE, 0); + unprotect_entry(file_ptr, MICRO_ENTRY_TYPE, 0, FALSE, H5C__NO_FLAGS_SET); + protect_entry(file_ptr, MICRO_ENTRY_TYPE, 1); + unprotect_entry(file_ptr, MICRO_ENTRY_TYPE, 1, TRUE, H5C__NO_FLAGS_SET); + protect_entry(file_ptr, MICRO_ENTRY_TYPE, 2); + unprotect_entry(file_ptr, MICRO_ENTRY_TYPE, 2, FALSE, H5C__PIN_ENTRY_FLAG); + protect_entry(file_ptr, MICRO_ENTRY_TYPE, 3); + unprotect_entry(file_ptr, MICRO_ENTRY_TYPE, 3, TRUE, H5C__PIN_ENTRY_FLAG); + protect_entry(file_ptr, MICRO_ENTRY_TYPE, 4); + unprotect_entry(file_ptr, MICRO_ENTRY_TYPE, 4, FALSE, H5C__PIN_ENTRY_FLAG); + protect_entry(file_ptr, MICRO_ENTRY_TYPE, 5); + unprotect_entry(file_ptr, MICRO_ENTRY_TYPE, 5, TRUE, H5C__PIN_ENTRY_FLAG); + protect_entry(file_ptr, MICRO_ENTRY_TYPE, 6); + unprotect_entry(file_ptr, MICRO_ENTRY_TYPE, 6, FALSE, H5C__PIN_ENTRY_FLAG); + protect_entry(file_ptr, MICRO_ENTRY_TYPE, 7); + unprotect_entry(file_ptr, MICRO_ENTRY_TYPE, 7, TRUE, H5C__PIN_ENTRY_FLAG); + protect_entry(file_ptr, MICRO_ENTRY_TYPE, 8); + unprotect_entry(file_ptr, MICRO_ENTRY_TYPE, 8, FALSE, H5C__NO_FLAGS_SET); + protect_entry(file_ptr, MICRO_ENTRY_TYPE, 9); + unprotect_entry(file_ptr, MICRO_ENTRY_TYPE, 9, TRUE, H5C__NO_FLAGS_SET); + + end_trans(file_ptr, cache_ptr, verbose, (uint64_t)3, "transaction 3.2"); + + flush_journal(cache_ptr); + + if ( update_architypes ) { + + copy_file(journal_filename, testfiles[4]); + } + + if ( file_exists(testfiles[4]) ) { + + verify_journal_contents(journal_filename, testfiles[4], human_readable); + + } else { + + testfile_missing = TRUE; + } + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + + /* e-2) ... then use the H5C_mark_pinned_or_protected_entry_dirty() + * call to mark a variety of protected, pinned, and pinned and + * protected entries dirty. Also rename some pinned entries. + */ + + begin_trans(cache_ptr, verbose, (uint64_t)4, "transaction 4.2"); + + protect_entry(file_ptr, MICRO_ENTRY_TYPE, 0); + protect_entry(file_ptr, MICRO_ENTRY_TYPE, 1); + protect_entry(file_ptr, MICRO_ENTRY_TYPE, 6); + protect_entry(file_ptr, MICRO_ENTRY_TYPE, 7); + protect_entry(file_ptr, MICRO_ENTRY_TYPE, 8); + protect_entry(file_ptr, MICRO_ENTRY_TYPE, 9); + + mark_pinned_or_protected_entry_dirty(file_ptr, MICRO_ENTRY_TYPE, 0); + mark_pinned_or_protected_entry_dirty(file_ptr, MICRO_ENTRY_TYPE, 1); + mark_pinned_or_protected_entry_dirty(file_ptr, MICRO_ENTRY_TYPE, 2); + mark_pinned_or_protected_entry_dirty(file_ptr, MICRO_ENTRY_TYPE, 3); + mark_pinned_or_protected_entry_dirty(file_ptr, MICRO_ENTRY_TYPE, 6); + mark_pinned_or_protected_entry_dirty(file_ptr, MICRO_ENTRY_TYPE, 7); + + rename_entry(cache_ptr, MICRO_ENTRY_TYPE, 4, FALSE); + rename_entry(cache_ptr, MICRO_ENTRY_TYPE, 5, FALSE); + + unprotect_entry(file_ptr, MICRO_ENTRY_TYPE, 0, FALSE, H5C__NO_FLAGS_SET); + unprotect_entry(file_ptr, MICRO_ENTRY_TYPE, 1, TRUE, H5C__NO_FLAGS_SET); + unprotect_entry(file_ptr, MICRO_ENTRY_TYPE, 6, FALSE, H5C__NO_FLAGS_SET); + unprotect_entry(file_ptr, MICRO_ENTRY_TYPE, 7, TRUE, H5C__NO_FLAGS_SET); + unprotect_entry(file_ptr, MICRO_ENTRY_TYPE, 8, FALSE, H5C__NO_FLAGS_SET); + unprotect_entry(file_ptr, MICRO_ENTRY_TYPE, 9, TRUE, H5C__NO_FLAGS_SET); + + end_trans(file_ptr, cache_ptr, verbose, (uint64_t)4, "transaction 4.2"); + + flush_journal(cache_ptr); + + if ( update_architypes ) { + + copy_file(journal_filename, testfiles[5]); + } + + if ( file_exists(testfiles[5]) ) { + + verify_journal_contents(journal_filename, testfiles[5], human_readable); + + } else { + + testfile_missing = TRUE; + } + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + + /* e-3) ...finally, upin all the pinned entries, with an undo of the + * previous rename in the middle. + */ + + begin_trans(cache_ptr, verbose, (uint64_t)5, "transaction 5.2"); + + unpin_entry(file_ptr, MICRO_ENTRY_TYPE, 2); + unpin_entry(file_ptr, MICRO_ENTRY_TYPE, 3); + unpin_entry(file_ptr, MICRO_ENTRY_TYPE, 4); + + rename_entry(cache_ptr, MICRO_ENTRY_TYPE, 4, TRUE); + rename_entry(cache_ptr, MICRO_ENTRY_TYPE, 5, TRUE); + + unpin_entry(file_ptr, MICRO_ENTRY_TYPE, 5); + unpin_entry(file_ptr, MICRO_ENTRY_TYPE, 6); + unpin_entry(file_ptr, MICRO_ENTRY_TYPE, 7); + + end_trans(file_ptr, cache_ptr, verbose, (uint64_t)5, "transaction 5.2"); + + flush_journal(cache_ptr); + + if ( update_architypes ) { + + copy_file(journal_filename, testfiles[6]); + } + + if ( file_exists(testfiles[6]) ) { + + verify_journal_contents(journal_filename, testfiles[6], human_readable); + + } else { + + testfile_missing = TRUE; + } + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + + + /* 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 + * the H5C_pin_ptrotected_entry() call. + */ + + begin_trans(cache_ptr, verbose, (uint64_t)6, "transaction 6.2"); + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 0); + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 1); + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 2); + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 3); + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 4); + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 5); + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 6); + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 7); + + pin_protected_entry(file_ptr, VARIABLE_ENTRY_TYPE, 2); + pin_protected_entry(file_ptr, VARIABLE_ENTRY_TYPE, 3); + + unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 0, FALSE, H5C__NO_FLAGS_SET); + unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 1, TRUE, H5C__NO_FLAGS_SET); + unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 2, FALSE, H5C__NO_FLAGS_SET); + unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 3, TRUE, H5C__NO_FLAGS_SET); + unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 4, FALSE, H5C__PIN_ENTRY_FLAG); + unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 5, TRUE, H5C__PIN_ENTRY_FLAG); + unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 6, FALSE, H5C__PIN_ENTRY_FLAG); + unprotect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 7, TRUE, H5C__PIN_ENTRY_FLAG); + + end_trans(file_ptr, cache_ptr, verbose, (uint64_t)6, "transaction 6.2"); + + flush_journal(cache_ptr); + + if ( update_architypes ) { + + copy_file(journal_filename, testfiles[7]); + } + + if ( file_exists(testfiles[7]) ) { + + verify_journal_contents(journal_filename, testfiles[7], human_readable); + + } else { + + testfile_missing = TRUE; + } + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + + + /* f-2) Now resize a selection of pinned and unpinned entries via + * protect/unprotect pairs, H5C_resize_pinned_entry() and + * H5C_mark_pinned_entry_dirty(). + */ + + + begin_trans(cache_ptr, verbose, (uint64_t)7, "transaction 7.2"); + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 0); + unprotect_entry_with_size_change(file_ptr, VARIABLE_ENTRY_TYPE, 0, + H5C__SIZE_CHANGED_FLAG, + ((VARIABLE_ENTRY_SIZE / 16) * 15)); + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 1); + unprotect_entry_with_size_change(file_ptr, VARIABLE_ENTRY_TYPE, 1, + H5C__SIZE_CHANGED_FLAG|H5C__DIRTIED_FLAG, + ((VARIABLE_ENTRY_SIZE / 16) * 14)); + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 2); + unprotect_entry_with_size_change(file_ptr, VARIABLE_ENTRY_TYPE, 2, + H5C__SIZE_CHANGED_FLAG, + ((VARIABLE_ENTRY_SIZE / 16) * 13)); + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 3); + unprotect_entry_with_size_change(file_ptr, VARIABLE_ENTRY_TYPE, 3, + H5C__SIZE_CHANGED_FLAG|H5C__DIRTIED_FLAG, + ((VARIABLE_ENTRY_SIZE / 16) * 12)); + + resize_pinned_entry(file_ptr, VARIABLE_ENTRY_TYPE, 4, + ((VARIABLE_ENTRY_SIZE / 16) * 11)); + + resize_pinned_entry(file_ptr, VARIABLE_ENTRY_TYPE, 5, + ((VARIABLE_ENTRY_SIZE / 16) * 10)); + + mark_pinned_entry_dirty(file_ptr, VARIABLE_ENTRY_TYPE, 6, TRUE, + ((VARIABLE_ENTRY_SIZE / 16) * 9)); + + mark_pinned_entry_dirty(file_ptr, VARIABLE_ENTRY_TYPE, 7, TRUE, + ((VARIABLE_ENTRY_SIZE / 16) * 8)); + + end_trans(file_ptr, cache_ptr, verbose, (uint64_t)7, "transaction 7.2"); + + flush_journal(cache_ptr); + + if ( update_architypes ) { + + copy_file(journal_filename, testfiles[8]); + } + + if ( file_exists(testfiles[8]) ) { + + verify_journal_contents(journal_filename, testfiles[8], human_readable); + + } else { + + testfile_missing = TRUE; + } + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + + + /* f-3) Now put all the sizes back, and also rename all the entries. */ + + + begin_trans(cache_ptr, verbose, (uint64_t)8, "transaction 8.2"); + + rename_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 0, FALSE); + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 0); + unprotect_entry_with_size_change(file_ptr, VARIABLE_ENTRY_TYPE, 0, + H5C__SIZE_CHANGED_FLAG, + VARIABLE_ENTRY_SIZE); + + rename_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 1, FALSE); + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 1); + unprotect_entry_with_size_change(file_ptr, VARIABLE_ENTRY_TYPE, 1, + H5C__SIZE_CHANGED_FLAG|H5C__DIRTIED_FLAG, + VARIABLE_ENTRY_SIZE); + + rename_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 2, FALSE); + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 2); + unprotect_entry_with_size_change(file_ptr, VARIABLE_ENTRY_TYPE, 2, + H5C__SIZE_CHANGED_FLAG, + VARIABLE_ENTRY_SIZE); + + rename_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 3, FALSE); + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 3); + unprotect_entry_with_size_change(file_ptr, VARIABLE_ENTRY_TYPE, 3, + H5C__SIZE_CHANGED_FLAG|H5C__DIRTIED_FLAG, + VARIABLE_ENTRY_SIZE); + + rename_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 4, FALSE); + resize_pinned_entry(file_ptr, VARIABLE_ENTRY_TYPE, 4, VARIABLE_ENTRY_SIZE); + + rename_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 5, FALSE); + resize_pinned_entry(file_ptr, VARIABLE_ENTRY_TYPE, 5, VARIABLE_ENTRY_SIZE); + + rename_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 6, FALSE); + mark_pinned_entry_dirty(file_ptr, VARIABLE_ENTRY_TYPE, 6, TRUE, + VARIABLE_ENTRY_SIZE); + + rename_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 7, FALSE); + mark_pinned_entry_dirty(file_ptr, VARIABLE_ENTRY_TYPE, 7, TRUE, + VARIABLE_ENTRY_SIZE); + + end_trans(file_ptr, cache_ptr, verbose, (uint64_t)8, "transaction 8.2"); + + flush_journal(cache_ptr); + + if ( update_architypes ) { + + copy_file(journal_filename, testfiles[9]); + } + + if ( file_exists(testfiles[9]) ) { + + verify_journal_contents(journal_filename, testfiles[9], human_readable); + + } else { + + testfile_missing = TRUE; + } + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + + + /* f-4) Finally, rename all the entries back to their original locations, + * and unpin all the pinned entries. + */ + + begin_trans(cache_ptr, verbose, (uint64_t)9, "transaction 9.2"); + + rename_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 0, TRUE); + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 0); + unprotect_entry_with_size_change(file_ptr, VARIABLE_ENTRY_TYPE, 0, + H5C__SIZE_CHANGED_FLAG, VARIABLE_ENTRY_SIZE); + + rename_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 1, TRUE); + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 1); + unprotect_entry_with_size_change(file_ptr, VARIABLE_ENTRY_TYPE, 1, + H5C__SIZE_CHANGED_FLAG|H5C__DIRTIED_FLAG, + VARIABLE_ENTRY_SIZE); + + rename_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 2, TRUE); + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 2); + unprotect_entry_with_size_change(file_ptr, VARIABLE_ENTRY_TYPE, 2, + H5C__SIZE_CHANGED_FLAG|H5C__UNPIN_ENTRY_FLAG, + VARIABLE_ENTRY_SIZE); + + rename_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 3, TRUE); + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 3); + unprotect_entry_with_size_change(file_ptr, VARIABLE_ENTRY_TYPE, 3, + H5C__SIZE_CHANGED_FLAG|H5C__DIRTIED_FLAG|H5C__UNPIN_ENTRY_FLAG, + VARIABLE_ENTRY_SIZE); + + rename_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 4, TRUE); + resize_pinned_entry(file_ptr, VARIABLE_ENTRY_TYPE, 4, VARIABLE_ENTRY_SIZE); + unpin_entry(file_ptr, VARIABLE_ENTRY_TYPE, 4); + + rename_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 5, TRUE); + resize_pinned_entry(file_ptr, VARIABLE_ENTRY_TYPE, 5, VARIABLE_ENTRY_SIZE); + unpin_entry(file_ptr, VARIABLE_ENTRY_TYPE, 5); + + rename_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 6, TRUE); + mark_pinned_entry_dirty(file_ptr, VARIABLE_ENTRY_TYPE, 6, TRUE, + VARIABLE_ENTRY_SIZE); + unpin_entry(file_ptr, VARIABLE_ENTRY_TYPE, 6); + + rename_entry(cache_ptr, VARIABLE_ENTRY_TYPE, 7, TRUE); + mark_pinned_entry_dirty(file_ptr, VARIABLE_ENTRY_TYPE, 7, TRUE, + VARIABLE_ENTRY_SIZE); + unpin_entry(file_ptr, VARIABLE_ENTRY_TYPE, 7); + + end_trans(file_ptr, cache_ptr, verbose, (uint64_t)9, "transaction 9.2"); + + flush_journal(cache_ptr); + + if ( update_architypes ) { + + copy_file(journal_filename, testfiles[10]); + } + + if ( file_exists(testfiles[10]) ) { + + verify_journal_contents(journal_filename, testfiles[10], human_readable); + + } else { + + testfile_missing = TRUE; + } + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + flush_cache(file_ptr, FALSE, FALSE, FALSE); /* resets transaction number */ + + verify_journal_empty(journal_filename); + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, 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. + * + * g-1) Load several entries of VARIABLE_ENTRY_TYPE into the cache, and + * set their sizes to values less than the maximum. + */ + + begin_trans(cache_ptr, verbose, (uint64_t)1, "transaction 1.3"); + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 10); + unprotect_entry_with_size_change(file_ptr, VARIABLE_ENTRY_TYPE, 10, + H5C__SIZE_CHANGED_FLAG, + ((VARIABLE_ENTRY_SIZE / 4) * 1)); + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 11); + unprotect_entry_with_size_change(file_ptr, VARIABLE_ENTRY_TYPE, 11, + H5C__SIZE_CHANGED_FLAG, + ((VARIABLE_ENTRY_SIZE / 4) * 2)); + + protect_entry(file_ptr, VARIABLE_ENTRY_TYPE, 12); + unprotect_entry_with_size_change(file_ptr, VARIABLE_ENTRY_TYPE, 12, + H5C__SIZE_CHANGED_FLAG, + ((VARIABLE_ENTRY_SIZE / 4) * 3)); + + end_trans(file_ptr, cache_ptr, verbose, (uint64_t)1, "transaction 1.3"); + + flush_journal(cache_ptr); + + if ( update_architypes ) { + + copy_file(journal_filename, testfiles[11]); + } + + if ( file_exists(testfiles[11]) ) { + + verify_journal_contents(journal_filename, testfiles[11], human_readable); + + } else { + + testfile_missing = TRUE; + } + + + /* g-2) Now setup flush operations on some entries to dirty, resize, + * and/or rename other entries. When these entries are dirtied + * in a transaction, the associated flush operations should be + * triggered and appear in the journal. + * + * In case you need a score card, in what follows, I set up the + * following dependencies: + * + * (MICRO_ENTRY_TYPE, 20) dirties (MICRO_ENTRY_TYPE, 30) + * + * (MICRO_ENTRY_TYPE, 21) renames, resizes, and dirties: + * (VARIABLE_ENTRY_TYPE, 10) + * (VARIABLE_ENTRY_TYPE, 13) + * + * (MICRO_ENTRY_TYPE, 22) resizes (VARIABLE_ENTRY_TYPE, 11) + * (VARIABLE_ENTRY_TYPE, 12) + * + * (MICRO_ENTRY_TYPE, 23) renames (VARIABLE_ENTRY_TYPE, 10) + * (VARIABLE_ENTRY_TYPE, 13) + * to their original locations + * + * (MICRO_ENTRY_TYPE, 24) dirties (MICRO_ENTRY_TYPE, 21) + * + * (MICRO_ENTRY_TYPE, 25) dirties (MICRO_ENTRY_TYPE, 22) + * (MICRO_ENTRY_TYPE, 23) + * + */ + + add_flush_op(MICRO_ENTRY_TYPE, 20, + FLUSH_OP__DIRTY, MICRO_ENTRY_TYPE, 30, FALSE, 0); + + + add_flush_op(MICRO_ENTRY_TYPE, 21, + FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 10, FALSE, VARIABLE_ENTRY_SIZE); + add_flush_op(MICRO_ENTRY_TYPE, 21, + FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 10, FALSE, 0); + add_flush_op(MICRO_ENTRY_TYPE, 21, + FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 10, FALSE, 0); + + add_flush_op(MICRO_ENTRY_TYPE, 21, + FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 13, FALSE, VARIABLE_ENTRY_SIZE/4); + add_flush_op(MICRO_ENTRY_TYPE, 21, + FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 13, FALSE, 0); + add_flush_op(MICRO_ENTRY_TYPE, 21, + FLUSH_OP__DIRTY, VARIABLE_ENTRY_TYPE, 13, FALSE, 0); + + + add_flush_op(MICRO_ENTRY_TYPE, 22, + FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 11, FALSE, VARIABLE_ENTRY_SIZE); + + add_flush_op(MICRO_ENTRY_TYPE, 22, + FLUSH_OP__RESIZE, VARIABLE_ENTRY_TYPE, 12, FALSE, VARIABLE_ENTRY_SIZE); + + + add_flush_op(MICRO_ENTRY_TYPE, 23, + FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 10, TRUE, 0); + + add_flush_op(MICRO_ENTRY_TYPE, 23, + FLUSH_OP__RENAME, VARIABLE_ENTRY_TYPE, 13, TRUE, 0); + + + add_flush_op(MICRO_ENTRY_TYPE, 24, + FLUSH_OP__DIRTY, MICRO_ENTRY_TYPE, 21, FALSE, 0); + + + add_flush_op(MICRO_ENTRY_TYPE, 25, + FLUSH_OP__DIRTY, MICRO_ENTRY_TYPE, 22, FALSE, 0); + + add_flush_op(MICRO_ENTRY_TYPE, 25, + FLUSH_OP__DIRTY, MICRO_ENTRY_TYPE, 23, FALSE, 0); + + + /* g-3) Start with a simple check -- dirty (MICRO_ENTRY_TYPE, 20), + * which should also dirty (MICRO_ENTRY_TYPE, 30) when + * (MICRO_ENTRY_TYPE, 20) is serialized at transaction close. + */ + + begin_trans(cache_ptr, verbose, (uint64_t)2, "transaction 2.3"); + + protect_entry(file_ptr, MICRO_ENTRY_TYPE, 20); + unprotect_entry(file_ptr, MICRO_ENTRY_TYPE, 20, TRUE, H5C__NO_FLAGS_SET); + + end_trans(file_ptr, cache_ptr, verbose, (uint64_t)2, "transaction 2.3"); + + flush_journal(cache_ptr); + + if ( update_architypes ) { + + copy_file(journal_filename, testfiles[12]); + } + + if ( file_exists(testfiles[12]) ) { + + verify_journal_contents(journal_filename, testfiles[12], human_readable); + + } else { + + testfile_missing = TRUE; + } + + + /* 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) + */ + + begin_trans(cache_ptr, verbose, (uint64_t)3, "transaction 3.3"); + + protect_entry(file_ptr, MICRO_ENTRY_TYPE, 24); + unprotect_entry(file_ptr, MICRO_ENTRY_TYPE, 24, TRUE, H5C__NO_FLAGS_SET); + + end_trans(file_ptr, cache_ptr, verbose, (uint64_t)3, "transaction 3.3"); + + flush_journal(cache_ptr); + + if ( update_architypes ) { + + copy_file(journal_filename, testfiles[13]); + } + + if ( file_exists(testfiles[13]) ) { + + verify_journal_contents(journal_filename, testfiles[13], human_readable); + + } else { + + testfile_missing = TRUE; + } + + + /* 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. + */ + + begin_trans(cache_ptr, verbose, (uint64_t)4, "transaction 4.3"); + + protect_entry(file_ptr, MICRO_ENTRY_TYPE, 25); + unprotect_entry(file_ptr, MICRO_ENTRY_TYPE, 25, TRUE, H5C__NO_FLAGS_SET); + + end_trans(file_ptr, cache_ptr, verbose, (uint64_t)4, "transaction 4.3"); + + flush_journal(cache_ptr); + + if ( update_architypes ) { + + copy_file(journal_filename, testfiles[14]); + } + + if ( file_exists(testfiles[14]) ) { + + verify_journal_contents(journal_filename, testfiles[14], human_readable); + + } else { + + testfile_missing = TRUE; + } + + flush_cache(file_ptr, FALSE, FALSE, FALSE); /* resets transaction number */ + + verify_journal_empty(journal_filename); + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + + + /* h) Dirty an entry, and then expunge it. Entry should not appear + * in the journal. Do this twice -- first with only the expunge + * entry in the transaction, and a second time with other entries + * involved. + * + * Note that no journal file will be written until the first + * entry, so start with a transaction that generates some data. + */ + + begin_trans(cache_ptr, verbose, (uint64_t)1, "transaction 1.4"); + + protect_entry(file_ptr, MICRO_ENTRY_TYPE, 39); + unprotect_entry(file_ptr, MICRO_ENTRY_TYPE, 39, TRUE, H5C__NO_FLAGS_SET); + + end_trans(file_ptr, cache_ptr, verbose, (uint64_t)1, "transaction 1.4"); + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + + begin_trans(cache_ptr, verbose, (uint64_t)2, "transaction 2.4"); + + protect_entry(file_ptr, MICRO_ENTRY_TYPE, 40); + unprotect_entry(file_ptr, MICRO_ENTRY_TYPE, 40, TRUE, H5C__NO_FLAGS_SET); + + expunge_entry(file_ptr, MICRO_ENTRY_TYPE, 40); + + end_trans(file_ptr, cache_ptr, verbose, (uint64_t)2, "transaction 2.4"); + + flush_journal(cache_ptr); + + if ( update_architypes ) { + + copy_file(journal_filename, testfiles[15]); + } + + if ( file_exists(testfiles[15]) ) { + + verify_journal_contents(journal_filename, testfiles[15], human_readable); + + } else { + + testfile_missing = TRUE; + } + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + + + begin_trans(cache_ptr, verbose, (uint64_t)3, "transaction 3.4"); + + protect_entry(file_ptr, MICRO_ENTRY_TYPE, 41); + unprotect_entry(file_ptr, MICRO_ENTRY_TYPE, 41, TRUE, H5C__NO_FLAGS_SET); + expunge_entry(file_ptr, MICRO_ENTRY_TYPE, 41); + protect_entry(file_ptr, MICRO_ENTRY_TYPE, 42); + unprotect_entry(file_ptr, MICRO_ENTRY_TYPE, 42, TRUE, H5C__NO_FLAGS_SET); + + end_trans(file_ptr, cache_ptr, verbose, (uint64_t)3, "transaction 3.4"); + + flush_journal(cache_ptr); + + if ( update_architypes ) { + + copy_file(journal_filename, testfiles[16]); + } + + if ( file_exists(testfiles[16]) ) { + + verify_journal_contents(journal_filename, testfiles[16], human_readable); + + } else { + + testfile_missing = TRUE; + } + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + + /************************************************************/ + /* 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 */ + /* journaling is working. */ + /************************************************************/ + + /* a) Close the hdf5 file. */ + if ( pass ) { + + if ( H5Fclose(file_id) < 0 ) { + + pass = FALSE; + failure_mssg = "temporary H5Fclose() failed.\n"; + + } else { + file_id = -1; + file_ptr = NULL; + cache_ptr = NULL; + } + } + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + + /* b) Verify that the journal file has been deleted. */ + verify_journal_deleted(journal_filename); + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + + /* c) Re-open the hdf5 file. */ + open_existing_file_for_journaling(filename, journal_filename, &file_id, + &file_ptr, &cache_ptr, human_readable, + use_aio); + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + + /* d) do a transaction or to to verify that journaling is working. */ + + begin_trans(cache_ptr, verbose, (uint64_t)1, "transaction 1.5"); + + insert_entry(file_ptr, 0, 1, FALSE, H5C__NO_FLAGS_SET); + protect_entry(file_ptr, 0, 0); + unprotect_entry(file_ptr, 0, 0, TRUE, H5C__NO_FLAGS_SET); + + end_trans(file_ptr, cache_ptr, verbose, (uint64_t)1, "transaction 1.5"); + + flush_journal(cache_ptr); + + if ( update_architypes ) { + + copy_file(journal_filename, testfiles[17]); + } + + if ( file_exists(testfiles[17]) ) { + + verify_journal_contents(journal_filename, testfiles[17], human_readable); + + } else { + + testfile_missing = TRUE; + } + + flush_cache(file_ptr, FALSE, FALSE, FALSE); /* resets transaction number */ + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + /**************************************************************/ + /* 4) Close the file, and verify that the journal is deleted. */ + /**************************************************************/ + + /* Close the hdf5 file. */ + if ( pass ) { + + if ( H5Fclose(file_id) < 0 ) { + + pass = FALSE; + failure_mssg = "temporary H5Fclose() failed.\n"; + + } else { + file_id = -1; + file_ptr = NULL; + cache_ptr = NULL; + } + } + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + + /* b) Verify that the journal file has been deleted. */ + verify_journal_deleted(journal_filename); + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + + /************************************************************/ + /* 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. */ + /************************************************************/ + + /* re-open the file without journaling enabled */ + + open_existing_file_without_journaling(filename, &file_id, + &file_ptr, &cache_ptr); + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + + /* do a transaction to verify that journaling is disabled. + * + * 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_entry(file_ptr, 0, 10, FALSE, H5C__NO_FLAGS_SET); + protect_entry(file_ptr, 0, 0); + unprotect_entry(file_ptr, 0, 0, TRUE, H5C__NO_FLAGS_SET); + + end_trans(file_ptr, cache_ptr, verbose, (uint64_t)0, "transaction 1.6"); + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + if ( ( pass ) && ( cache_ptr->mdj_enabled ) ) { + + pass = FALSE; + failure_mssg = "journaling is enabled?!?!(1).\n"; + } + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + /* note that flush_journal() will throw an exception if journaling + * is not enabled, so we don't call it here. Instead, just call + * verify_journal_deleted() to verify that there is no journal file. + */ + + verify_journal_deleted(journal_filename); + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + + /************************************************************/ + /* 6) Enable journaling on the open file. Do a transaction */ + /* or two to verify that journaling is working. */ + /************************************************************/ + + /* now enable journaling */ + if ( pass ) { + + jnl_config.version = H5AC__CURR_JNL_CONFIG_VER; + + result = H5Fget_jnl_config(file_id, &jnl_config); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fget_jnl_config() failed.\n"; + } + + /* set journaling config fields to taste */ + jnl_config.enable_journaling = TRUE; + + HDstrcpy(jnl_config.journal_file_path, journal_filename); + + 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_human_readable = TRUE; + } + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + if ( pass ) { + + result = H5Fset_jnl_config(file_id, &jnl_config); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fset_jnl_config() failed.\n"; + } + } + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + /* do a transaction or to to verify that journaling is working. */ + + begin_trans(cache_ptr, verbose, (uint64_t)1, "transaction 1.7"); + + insert_entry(file_ptr, 0, 20, FALSE, H5C__NO_FLAGS_SET); + protect_entry(file_ptr, 0, 0); + unprotect_entry(file_ptr, 0, 0, TRUE, H5C__NO_FLAGS_SET); + + end_trans(file_ptr, cache_ptr, verbose, (uint64_t)1, "transaction 1.7"); + + flush_journal(cache_ptr); + + if ( update_architypes ) { + + copy_file(journal_filename, testfiles[18]); + } + + if ( file_exists(testfiles[18]) ) { + + verify_journal_contents(journal_filename, testfiles[18], human_readable); + + } else { + + testfile_missing = TRUE; + } + + flush_cache(file_ptr, FALSE, FALSE, FALSE); /* resets transaction number */ + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + + /************************************************************/ + /* 7) Disable journaling on the open file. Verify that the */ + /* journal file has been deleted. */ + /************************************************************/ + + /* disable journaling */ + if ( pass ) { + + jnl_config.enable_journaling = FALSE; + + result = H5Fset_jnl_config(file_id, &jnl_config); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fset_jnl_config() failed.\n"; + } + } + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + verify_journal_deleted(journal_filename); + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + + /*********************************/ + /* 8) Close and delete the file. */ + /*********************************/ + + if ( pass ) { + + if ( H5Fclose(file_id) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fclose(file_id) failed.\n"; + + } + } + + HDremove(filename); + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + if ( pass ) { + + PASSED(); + + if ( testfile_missing ) { + + puts(" WARNING: One or more missing test files."); + fflush(stdout); + } + } else { + + H5_FAILED(); + } + + if ( ! pass ) { + + failures++; + HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + return; + +} /* mdj_smoke_check_00() */ + + +/*------------------------------------------------------------------------- + * Function: mdj_smoke_check_01() + * + * Purpose: Run a cut down version of smoke_check_1 in cache.c, with + * journaling enabled. Check the journal files generated, + * and verify that the journal output matches the architype + * test files. Skip the comparison and generate a warning + * if an architype file is missing. + * + * Return: void + * + * Programmer: John Mainzer + * 5/19/08 + * + * 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, + hbool_t use_aio) +{ + const char * fcn_name = "mdj_smoke_check_01()"; + const char * human_readable_testfiles[] = + { + "testfiles/cache_journal_sc01_000.jnl", + "testfiles/cache_journal_sc01_001.jnl", + "testfiles/cache_journal_sc01_002.jnl", + "testfiles/cache_journal_sc01_003.jnl", + "testfiles/cache_journal_sc01_004.jnl", + NULL + }; + const char * binary_testfiles[] = + { + "testfiles/cache_journal_bsc01_000.jnl", + "testfiles/cache_journal_bsc01_001.jnl", + "testfiles/cache_journal_bsc01_002.jnl", + "testfiles/cache_journal_bsc01_003.jnl", + "testfiles/cache_journal_bsc01_004.jnl", + NULL + }; + const char **testfiles; + char filename[512]; + char journal_filename[H5AC__MAX_JOURNAL_FILE_NAME_LEN + 1]; + hbool_t testfile_missing = FALSE; + hbool_t show_progress = FALSE; + hbool_t dirty_inserts = FALSE; + hbool_t verbose = FALSE; + hbool_t update_architypes; + int dirty_unprotects = FALSE; + int dirty_destroys = FALSE; + hbool_t display_stats = FALSE; + int32_t lag = 10; + int cp = 0; + int32_t max_index = 128; + uint64_t trans_num = 0; + hid_t file_id = -1; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + + if ( human_readable ) { + + testfiles = human_readable_testfiles; + /* set update_architypes to TRUE to generate new architype files */ + update_architypes = FALSE; + TESTING("hr mdj smoke check 01 -- jnl clean ins, prot, unprot, del, ren"); + + } else { + + testfiles = binary_testfiles; + /* set update_architypes to TRUE to generate new architype files */ + update_architypes = TRUE; + TESTING("b mdj smoke check 01 -- jnl clean ins, prot, unprot, del, ren"); + } + + pass = TRUE; + + /********************************************************************/ + /* Create a file with cache configuration set to enable journaling. */ + /********************************************************************/ + + /* setup the file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, sizeof(filename)) + == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed (1).\n"; + } + } + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + if ( verbose ) { + HDfprintf(stdout, "%s: filename = \"%s\".\n", fcn_name, filename); + } + + /* setup the journal file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[3], H5P_DEFAULT, journal_filename, + sizeof(journal_filename)) == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed (2).\n"; + } + else if ( HDstrlen(journal_filename) >= + H5AC__MAX_JOURNAL_FILE_NAME_LEN ) { + + pass = FALSE; + failure_mssg = "journal file name too long.\n"; + } + } + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + 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 + * 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. + * + * 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, + use_aio, FALSE); + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + + /******************************************/ + /* Run a small, fairly simple stress test */ + /******************************************/ + + trans_num = 0; + + jrnl_row_major_scan_forward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ verbose, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ FALSE, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts, + /* do_renames */ TRUE, + /* rename_to_main_addr */ FALSE, + /* do_destroys */ TRUE, + /* do_mult_ro_protects */ TRUE, + /* dirty_destroys */ dirty_destroys, + /* dirty_unprotects */ dirty_unprotects, + /* trans_num */ trans_num); + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + flush_journal(cache_ptr); + + if ( update_architypes ) { + + copy_file(journal_filename, testfiles[0]); + } + + if ( file_exists(testfiles[0]) ) { + + verify_journal_contents(journal_filename, testfiles[0], human_readable); + + } else { + + testfile_missing = TRUE; + } + + flush_cache(file_ptr, FALSE, FALSE, FALSE); /* resets transaction number */ + + verify_journal_empty(journal_filename); + + trans_num = 0; + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + jrnl_row_major_scan_backward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ verbose, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ FALSE, + /* do_inserts */ FALSE, + /* dirty_inserts */ dirty_inserts, + /* do_renames */ TRUE, + /* rename_to_main_addr */ TRUE, + /* do_destroys */ FALSE, + /* do_mult_ro_protects */ TRUE, + /* dirty_destroys */ dirty_destroys, + /* dirty_unprotects */ dirty_unprotects, + /* trans_num */ trans_num); + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + flush_journal(cache_ptr); + + if ( update_architypes ) { + + copy_file(journal_filename, testfiles[1]); + } + + if ( file_exists(testfiles[1]) ) { + + verify_journal_contents(journal_filename, testfiles[1], human_readable); + + } else { + + testfile_missing = TRUE; + } + + flush_cache(file_ptr, FALSE, FALSE, FALSE); /* resets transaction number */ + + verify_journal_empty(journal_filename); + + trans_num = 0; + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + jrnl_row_major_scan_forward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ verbose, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ FALSE, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts, + /* do_renames */ TRUE, + /* rename_to_main_addr */ FALSE, + /* do_destroys */ TRUE, + /* do_mult_ro_protects */ TRUE, + /* dirty_destroys */ dirty_destroys, + /* dirty_unprotects */ dirty_unprotects, + /* trans_num */ trans_num); + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + flush_journal(cache_ptr); + + if ( update_architypes ) { + + copy_file(journal_filename, testfiles[2]); + } + + if ( file_exists(testfiles[2]) ) { + + verify_journal_contents(journal_filename, testfiles[2], human_readable); + + } else { + + testfile_missing = TRUE; + } + + flush_cache(file_ptr, FALSE, FALSE, FALSE); /* resets transaction number */ + + trans_num = 0; + + verify_journal_empty(journal_filename); + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + jrnl_col_major_scan_forward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ verbose, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ TRUE, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts, + /* dirty_unprotects */ dirty_unprotects, + /* trans_num */ trans_num); + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + flush_journal(cache_ptr); + + if ( update_architypes ) { + + copy_file(journal_filename, testfiles[3]); + } + + if ( file_exists(testfiles[3]) ) { + + verify_journal_contents(journal_filename, testfiles[3], human_readable); + + } else { + + testfile_missing = TRUE; + } + + flush_cache(file_ptr, FALSE, FALSE, FALSE); /* resets transaction number */ + + verify_journal_empty(journal_filename); + + trans_num = 0; + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + jrnl_col_major_scan_backward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ verbose, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ TRUE, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts, + /* dirty_unprotects */ dirty_unprotects, + /* trans_num */ trans_num); + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + flush_journal(cache_ptr); + + if ( update_architypes ) { + + copy_file(journal_filename, testfiles[4]); + } + + if ( file_exists(testfiles[4]) ) { + + verify_journal_contents(journal_filename, testfiles[4], human_readable); + + } else { + + testfile_missing = TRUE; + } + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + /****************************************************/ + /* Close and discard the file and the journal file. */ + /****************************************************/ + + takedown_cache_after_journaling(file_id, filename, journal_filename, FALSE); + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + verify_clean(); + verify_unprotected(); + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + if ( pass ) { + + PASSED(); + + if ( testfile_missing ) { + + puts(" WARNING: One or more missing test files."); + fflush(stdout); + } + } else { + + H5_FAILED(); + } + + if ( ! pass ) { + + failures++; + HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + return; + +} /* mdj_smoke_check_01() */ + + +/*------------------------------------------------------------------------- + * Function: mdj_smoke_check_02() + * + * Purpose: Run a cut down version of smoke_check_2 in cache.c, with + * journaling enabled. Check the journal files generated, + * and verify that the journal output matches the architype + * test files. Skip the comparison and generate a warning + * if an architype file is missing. + * + * Return: void + * + * Programmer: John Mainzer + * 5/19/08 + * + * 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, + hbool_t use_aio) +{ + const char * fcn_name = "mdj_smoke_check_02()"; + const char * human_readable_testfiles[] = + { + "testfiles/cache_journal_sc02_000.jnl", + "testfiles/cache_journal_sc02_001.jnl", + "testfiles/cache_journal_sc02_002.jnl", + "testfiles/cache_journal_sc02_003.jnl", + "testfiles/cache_journal_sc02_004.jnl", + NULL + }; + const char * binary_testfiles[] = + { + "testfiles/cache_journal_bsc02_000.jnl", + "testfiles/cache_journal_bsc02_001.jnl", + "testfiles/cache_journal_bsc02_002.jnl", + "testfiles/cache_journal_bsc02_003.jnl", + "testfiles/cache_journal_bsc02_004.jnl", + NULL + }; + const char **testfiles; + char filename[512]; + char journal_filename[H5AC__MAX_JOURNAL_FILE_NAME_LEN + 1]; + hbool_t testfile_missing = FALSE; + hbool_t show_progress = FALSE; + hbool_t dirty_inserts = TRUE; + hbool_t verbose = FALSE; + hbool_t update_architypes = FALSE; + int dirty_unprotects = TRUE; + int dirty_destroys = TRUE; + hbool_t display_stats = FALSE; + int32_t lag = 10; + int cp = 0; + int32_t max_index = 128; + uint64_t trans_num = 0; + hid_t file_id = -1; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + + if ( human_readable ) { + + testfiles = human_readable_testfiles; + /* set update_architypes to TRUE to generate new architype files */ + update_architypes = FALSE; + TESTING("hr mdj smoke check 02 -- jnl dirty ins, prot, unprot, del, ren"); + + } else { + + testfiles = binary_testfiles; + /* set update_architypes to TRUE to generate new architype files */ + update_architypes = FALSE; + TESTING("b mdj smoke check 02 -- jnl dirty ins, prot, unprot, del, ren"); + } + + pass = TRUE; + + /********************************************************************/ + /* Create a file with cache configuration set to enable journaling. */ + /********************************************************************/ + + /* setup the file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, sizeof(filename)) == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed (1).\n"; + } + } + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + if ( verbose ) { + HDfprintf(stdout, "%s: filename = \"%s\".\n", fcn_name, filename); + } + + /* setup the journal file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[3], H5P_DEFAULT, journal_filename, sizeof(journal_filename)) == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed (2).\n"; + } + else if ( HDstrlen(journal_filename) >= H5AC__MAX_JOURNAL_FILE_NAME_LEN ) { + + pass = FALSE; + failure_mssg = "journal file name too long.\n"; + } + } + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + 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 + * 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. + * + * 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, + use_aio, FALSE); + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + + /******************************************/ + /* Run a small, fairly simple stress test */ + /******************************************/ + + trans_num = 0; + + jrnl_row_major_scan_forward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ verbose, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ FALSE, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts, + /* do_renames */ TRUE, + /* rename_to_main_addr */ FALSE, + /* do_destroys */ TRUE, + /* do_mult_ro_protects */ TRUE, + /* dirty_destroys */ dirty_destroys, + /* dirty_unprotects */ dirty_unprotects, + /* trans_num */ trans_num); + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + flush_journal(cache_ptr); + + if ( update_architypes ) { + + copy_file(journal_filename, testfiles[0]); + } + + if ( file_exists(testfiles[0]) ) { + + verify_journal_contents(journal_filename, testfiles[0], human_readable); + + } else { + + testfile_missing = TRUE; + } + + flush_cache(file_ptr, FALSE, FALSE, FALSE); /* resets transaction number */ + + verify_journal_empty(journal_filename); + + trans_num = 0; + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + jrnl_row_major_scan_backward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ verbose, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ FALSE, + /* do_inserts */ FALSE, + /* dirty_inserts */ dirty_inserts, + /* do_renames */ TRUE, + /* rename_to_main_addr */ TRUE, + /* do_destroys */ FALSE, + /* do_mult_ro_protects */ TRUE, + /* dirty_destroys */ dirty_destroys, + /* dirty_unprotects */ dirty_unprotects, + /* trans_num */ trans_num); + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + flush_journal(cache_ptr); + + if ( update_architypes ) { + + copy_file(journal_filename, testfiles[1]); + } + + if ( file_exists(testfiles[1]) ) { + + verify_journal_contents(journal_filename, testfiles[1], human_readable); + + } else { + + testfile_missing = TRUE; + } + + flush_cache(file_ptr, FALSE, FALSE, FALSE); /* resets transaction number */ + + verify_journal_empty(journal_filename); + + trans_num = 0; + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + jrnl_row_major_scan_forward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ verbose, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ FALSE, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts, + /* do_renames */ TRUE, + /* rename_to_main_addr */ FALSE, + /* do_destroys */ FALSE, + /* do_mult_ro_protects */ TRUE, + /* dirty_destroys */ dirty_destroys, + /* dirty_unprotects */ dirty_unprotects, + /* trans_num */ trans_num); + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + flush_journal(cache_ptr); + + if ( update_architypes ) { + + copy_file(journal_filename, testfiles[2]); + } + + if ( file_exists(testfiles[2]) ) { + + verify_journal_contents(journal_filename, testfiles[2], human_readable); + + } else { + + testfile_missing = TRUE; + } + + flush_cache(file_ptr, FALSE, FALSE, FALSE); /* resets transaction number */ + + trans_num = 0; + + verify_journal_empty(journal_filename); + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + jrnl_col_major_scan_forward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ verbose, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ TRUE, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts, + /* dirty_unprotects */ dirty_unprotects, + /* trans_num */ trans_num); + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + flush_journal(cache_ptr); + + if ( update_architypes ) { + + copy_file(journal_filename, testfiles[3]); + } + + if ( file_exists(testfiles[3]) ) { + + verify_journal_contents(journal_filename, testfiles[3], human_readable); + + } else { + + testfile_missing = TRUE; + } + + flush_cache(file_ptr, FALSE, FALSE, FALSE); /* resets transaction number */ + + verify_journal_empty(journal_filename); + + trans_num = 0; + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + jrnl_col_major_scan_backward(/* file_ptr */ file_ptr, + /* max_index */ max_index, + /* lag */ lag, + /* verbose */ verbose, + /* reset_stats */ TRUE, + /* display_stats */ display_stats, + /* display_detailed_stats */ TRUE, + /* do_inserts */ TRUE, + /* dirty_inserts */ dirty_inserts, + /* dirty_unprotects */ dirty_unprotects, + /* trans_num */ trans_num); + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + flush_journal(cache_ptr); + + if ( update_architypes ) { + + copy_file(journal_filename, testfiles[4]); + } + + if ( file_exists(testfiles[4]) ) { + + verify_journal_contents(journal_filename, testfiles[4], human_readable); + + } else { + + testfile_missing = TRUE; + } + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + /****************************************************/ + /* Close and discard the file and the journal file. */ + /****************************************************/ + + takedown_cache_after_journaling(file_id, filename, journal_filename, FALSE); + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + verify_clean(); + verify_unprotected(); + + if ( show_progress ) + HDfprintf(stdout, "%s:%d cp = %d.\n", fcn_name, pass, cp++); + + if ( pass ) { + + PASSED(); + + if ( testfile_missing ) { + + puts(" WARNING: One or more missing test files."); + fflush(stdout); + } + } else { + + H5_FAILED(); + } + + if ( ! pass ) { + + failures++; + HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + return; + +} /* mdj_smoke_check_02() */ + + +/*------------------------------------------------------------------------- + * Function: mdj_api_example_test + * + * 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 + * 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 + * file from becoming too long. + * + * We begin by creating an hdf5 file with journaling enabled. + * + * The inital calls to TESTING(), SKIPPED(), h5_fixname(), + * HDremove(), the initialization of pass, 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 + * 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 + * recent extensions to the superblock, so the first step + * 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 + * particulars -- note that we must set the version field of + * the H5AC_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 + * and do what we want -- in this example we set up a selection + * 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 + * 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 + * journaling via the H5Fset_jnl_config() call, we don't need + * to set all the fields in the H5AC_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 H5AC_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 + * 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. + * + * 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 + * 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 + * 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 + * file as part of the close. + * + * Return: void + * + * Programmer: John Mainzer + * 12/14/08 + * + * Modifications: + * + * 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 + * + *------------------------------------------------------------------------- + */ + +#define CHUNK_SIZE 10 +#define DSET_SIZE (40 * CHUNK_SIZE) +#define NUM_DSETS 6 +#define NUM_RANDOM_ACCESSES 200000 + +static void +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]; + char journal_filename[H5AC__MAX_JOURNAL_FILE_NAME_LEN + 1]; + hbool_t valid_chunk; + hbool_t report_progress = FALSE; + hid_t fapl_id = -1; + hid_t file_id = -1; + hid_t dataspace_id = -1; + hid_t filespace_ids[NUM_DSETS]; + hid_t memspace_id = -1; + hid_t dataset_ids[NUM_DSETS]; + hid_t properties; + char dset_name[64]; + int i, j, k, l, m, n; + int progress_counter; + herr_t status; + hsize_t dims[2]; + hsize_t a_size[2]; + hsize_t offset[2]; + hsize_t chunk_size[2]; + int data_chunk[CHUNK_SIZE][CHUNK_SIZE]; + H5AC_jnl_config_t jnl_config_0; + H5AC_jnl_config_t jnl_config_1; + + + if ( human_readable ) { + + if ( use_aio ) { + + TESTING("aio mdj example code -- human readable journal file"); + + } else { + + TESTING("sio mdj example code -- human readable journal file"); + } + } else { + + if ( use_aio ) { + + TESTING("aio mdj example code -- binary journal file"); + + } else { + + TESTING("sio mdj example code -- binary journal file"); + } + } + + if ( skip_long_tests > 0 ) { + + SKIPPED(); + + HDfprintf(stdout, " Long tests disabled.\n"); + + return; + } + + pass = TRUE; + + /* Open a file with journaling enabled. */ + + + /* setup the hdf5 file name */ + if ( ( pass ) && ( report_progress ) ) { + + HDfprintf(stdout,"\nSetting up file name ... "); + HDfflush(stdout); + } + + if ( pass ) { + + if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, sizeof(filename)) + == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed.\n"; + } + } + + + /* setup the journal file name */ + if ( ( pass ) && ( report_progress ) ) { + + HDfprintf(stdout,"\nSetting up journal file name ... "); + HDfflush(stdout); + } + + if ( pass ) { + + if ( h5_fixname(FILENAMES[3], H5P_DEFAULT, journal_filename, + sizeof(journal_filename)) == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed (2).\n"; + } + else if ( HDstrlen(journal_filename) >= + H5AC__MAX_JOURNAL_FILE_NAME_LEN ) { + + pass = FALSE; + failure_mssg = "journal file name too long.\n"; + } + } + + + /* clean out any existing journal file -- must do this as + * HDF5 will refuse to overwrite an existing journal file. + */ + if ( ( pass ) && ( report_progress ) ) { + + HDfprintf(stdout,"\nRemoving any existing journal file ... "); + HDfflush(stdout); + } + + HDremove(journal_filename); + + + /* create a file access propertly list. */ + if ( ( pass ) && ( report_progress ) ) { + + HDfprintf(stdout,"\nCreating a FAPL ... "); + HDfflush(stdout); + } + + if ( pass ) { + + fapl_id = H5Pcreate(H5P_FILE_ACCESS); + + if ( fapl_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pcreate() failed.\n"; + } + } + + + /* need latest version of file format to use journaling */ + if ( ( pass ) && ( report_progress ) ) { + + HDfprintf(stdout,"\nCalling H5Pset_libver_bounds() on FAPL ... "); + HDfflush(stdout); + } + + if ( pass ) { + + if ( H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, + H5F_LIBVER_LATEST) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pset_libver_bounds() failed.\n"; + } + } + + + /* 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 + * changes. + */ + if ( ( pass ) && ( report_progress ) ) { + + HDfprintf(stdout, "\nCalling H5Pget_jnl_config() on FAPL ... "); + HDfflush(stdout); + } + + if ( pass ) { + + jnl_config_0.version = H5AC__CURR_JNL_CONFIG_VER; + + status = H5Pget_jnl_config(fapl_id, &jnl_config_0); + + if ( status < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pset_mdc_config() failed.\n"; + } + } + + + /* Modify the current FAPL journaling configuration to enable + * journaling as desired, and then write the revised configuration + * back to the FAPL. + */ + if ( ( pass ) && ( report_progress ) ) { + + HDfprintf(stdout, + "\nRevising config & calling H5Pset_jnl_config() on FAPL ... "); + HDfflush(stdout); + } + + if ( pass ) { + + jnl_config_0.enable_journaling = TRUE; + + 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 + * 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. + */ + jnl_config_0.jbrb_buf_size = buf_size; + + /* 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 + * will usually be complete by the time that buffer is needed + * again. + */ + jnl_config_0.jbrb_num_bufs = num_bufs; + + /* 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 + * the binary journal file format which should reduce the size + * 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 ) { + + pass = FALSE; + failure_mssg = "H5Pset_mdc_config() failed.\n"; + } + } + + + /* Now open the file using the FAPL we have created. */ + if ( ( pass ) && ( report_progress ) ) { + + HDfprintf(stdout, + "\nCreating the HDF5 file using the new FAPL ... "); + HDfflush(stdout); + } + + if ( pass ) { + + file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id); + + if ( file_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fcreate() failed.\n"; + + } + } + + + /* create the datasets */ + + if ( ( pass ) && ( report_progress ) ) { + + HDfprintf(stdout,"\nCreating datasets ... "); + HDfflush(stdout); + } + + if ( pass ) { + + i = 0; + + while ( ( pass ) && ( i < NUM_DSETS ) ) + { + /* create a dataspace for the chunked dataset */ + dims[0] = DSET_SIZE; + dims[1] = DSET_SIZE; + dataspace_id = H5Screate_simple(2, dims, NULL); + + if ( dataspace_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Screate_simple() failed."; + } + + /* set the dataset creation plist to specify that the raw data is + * to be partioned into 10X10 element chunks. + */ + + if ( pass ) { + + chunk_size[0] = CHUNK_SIZE; + chunk_size[1] = CHUNK_SIZE; + properties = H5Pcreate(H5P_DATASET_CREATE); + + if ( properties < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pcreate() failed."; + } + } + + if ( pass ) { + + if ( H5Pset_chunk(properties, 2, chunk_size) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pset_chunk() failed."; + } + } + + /* create the dataset */ + if ( pass ) { + + sprintf(dset_name, "/dset%03d", i); + dataset_ids[i] = H5Dcreate2(file_id, dset_name, H5T_STD_I32BE, + dataspace_id, H5P_DEFAULT, + properties, H5P_DEFAULT); + + if ( dataset_ids[i] < 0 ) { + + pass = FALSE; + failure_mssg = "H5Dcreate() failed."; + } + } + + /* get the file space ID */ + if ( pass ) { + + filespace_ids[i] = H5Dget_space(dataset_ids[i]); + + if ( filespace_ids[i] < 0 ) { + + pass = FALSE; + failure_mssg = "H5Dget_space() failed."; + } + } + + i++; + } + } + + + /* 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 ( ( pass ) && ( report_progress ) ) { + + HDfprintf(stdout, + "\nTurning off journaling ... "); + HDfflush(stdout); + } + + if ( pass ) { + + jnl_config_1.version = H5AC__CURR_JNL_CONFIG_VER; + + status = H5Fget_jnl_config(file_id, &jnl_config_1); + + if ( status < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fget_mdc_config() failed.\n"; + } + } + + if ( pass ) { + + jnl_config_1.enable_journaling = FALSE; + + status = H5Fset_jnl_config(file_id, &jnl_config_1); + + if ( status < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fset_mdc_config() failed.\n"; + } + } + + + /* 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. + * + * 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. + */ + if ( ( pass ) && ( report_progress ) ) { + + HDfprintf(stdout, + "\nTurning journaling back on ... "); + HDfflush(stdout); + } + if ( pass ) { + + jnl_config_1.enable_journaling = TRUE; + + status = H5Fset_jnl_config(file_id, &jnl_config_1); + + if ( status < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fset_mdc_config() failed.\n"; + } + } + + + /* create the mem space to be used to read and write chunks */ + if ( pass ) { + + dims[0] = CHUNK_SIZE; + dims[1] = CHUNK_SIZE; + memspace_id = H5Screate_simple(2, dims, NULL); + + if ( memspace_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Screate_simple() failed."; + } + } + + /* select in memory hyperslab */ + if ( pass ) { + + offset[0] = 0; /*offset of hyperslab in memory*/ + offset[1] = 0; + a_size[0] = CHUNK_SIZE; /*size of hyperslab*/ + a_size[1] = CHUNK_SIZE; + status = H5Sselect_hyperslab(memspace_id, H5S_SELECT_SET, offset, NULL, + a_size, NULL); + + if ( status < 0 ) { + + pass = FALSE; + failure_mssg = "H5Sselect_hyperslab() failed."; + } + } + + if ( ( pass ) && ( report_progress ) ) { + + HDfprintf(stdout,"Done.\n"); + HDfflush(stdout); + } + + /* initialize all datasets on a round robin basis */ + i = 0; + progress_counter = 0; + + if ( ( pass ) && ( report_progress ) ) { + + HDfprintf(stdout, "Initializing datasets "); + HDfflush(stdout); + } + + while ( ( pass ) && ( i < DSET_SIZE ) ) + { + j = 0; + while ( ( pass ) && ( j < DSET_SIZE ) ) + { + m = 0; + while ( ( pass ) && ( m < NUM_DSETS ) ) + { + /* initialize the slab */ + for ( k = 0; k < CHUNK_SIZE; k++ ) + { + for ( l = 0; l < CHUNK_SIZE; l++ ) + { + data_chunk[k][l] = (DSET_SIZE * DSET_SIZE * m) + + (DSET_SIZE * (i + k)) + j + l; + } + } + + /* select on disk hyperslab */ + offset[0] = (hsize_t)i; /*offset of hyperslab in file*/ + offset[1] = (hsize_t)j; + a_size[0] = CHUNK_SIZE; /*size of hyperslab*/ + a_size[1] = CHUNK_SIZE; + status = H5Sselect_hyperslab(filespace_ids[m], H5S_SELECT_SET, + offset, NULL, a_size, NULL); + + if ( status < 0 ) { + + pass = FALSE; + failure_mssg = "disk H5Sselect_hyperslab() failed."; + } + + /* write the chunk to file */ + status = H5Dwrite(dataset_ids[m], H5T_NATIVE_INT, memspace_id, + filespace_ids[m], H5P_DEFAULT, data_chunk); + + if ( status < 0 ) { + + pass = FALSE; + failure_mssg = "H5Dwrite() failed."; + } + m++; + } + j += CHUNK_SIZE; + } + + i += CHUNK_SIZE; + + if ( ( pass ) && ( report_progress ) ) { + + progress_counter += CHUNK_SIZE; + + if ( progress_counter >= DSET_SIZE / 20 ) { + + progress_counter = 0; + HDfprintf(stdout, "."); + HDfflush(stdout); + } + } + + /* 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 + * 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 + * overhead, and slow us down. (try it both ways). + */ +#if 0 + status = H5Fflush(file_id, H5F_SCOPE_GLOBAL); + + if ( status < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fflush() failed."; + } +#endif + } + + if ( ( pass ) && ( report_progress ) ) { + + HDfprintf(stdout," Done.\n"); /* initializing data sets */ + HDfflush(stdout); + } + + + /* do random reads on all datasets */ + + if ( ( pass ) && ( report_progress ) ) { + + HDfprintf(stdout, "Doing random reads on all datasets "); + HDfflush(stdout); + } + + n = 0; + progress_counter = 0; + while ( ( pass ) && ( n < NUM_RANDOM_ACCESSES ) ) + { + m = rand() % NUM_DSETS; + i = (rand() % (DSET_SIZE / CHUNK_SIZE)) * CHUNK_SIZE; + j = (rand() % (DSET_SIZE / CHUNK_SIZE)) * CHUNK_SIZE; + + /* select on disk hyperslab */ + offset[0] = (hsize_t)i; /*offset of hyperslab in file*/ + offset[1] = (hsize_t)j; + a_size[0] = CHUNK_SIZE; /*size of hyperslab*/ + a_size[1] = CHUNK_SIZE; + status = H5Sselect_hyperslab(filespace_ids[m], H5S_SELECT_SET, + offset, NULL, a_size, NULL); + + if ( status < 0 ) { + + pass = FALSE; + failure_mssg = "disk hyperslab create failed."; + } + + /* read the chunk from file */ + if ( pass ) { + + status = H5Dread(dataset_ids[m], H5T_NATIVE_INT, memspace_id, + filespace_ids[m], H5P_DEFAULT, data_chunk); + + if ( status < 0 ) { + + pass = FALSE; + failure_mssg = "disk hyperslab create failed."; + } + } + + /* validate the slab */ + if ( pass ) { + + valid_chunk = TRUE; + for ( k = 0; k < CHUNK_SIZE; k++ ) + { + for ( l = 0; l < CHUNK_SIZE; l++ ) + { + if ( data_chunk[k][l] + != + ((DSET_SIZE * DSET_SIZE * m) + + (DSET_SIZE * (i + k)) + j + l) ) { + + valid_chunk = FALSE; +#if 0 /* this will be useful from time to time -- lets keep it*/ + HDfprintf(stdout, + "data_chunk[%0d][%0d] = %0d, expect %0d.\n", + k, l, data_chunk[k][l], + ((DSET_SIZE * DSET_SIZE * m) + + (DSET_SIZE * (i + k)) + j + l)); + HDfprintf(stdout, + "m = %d, i = %d, j = %d, k = %d, l = %d\n", + m, i, j, k, l); +#endif + } + } + } + + if ( ! valid_chunk ) { +#if 1 + pass = FALSE; + failure_mssg = "slab validation failed."; +#else /* as above */ + fprintf(stdout, "Chunk (%0d, %0d) in /dset%03d is invalid.\n", + i, j, m); +#endif + } + } + + n++; + + if ( ( pass ) && ( report_progress ) ) { + + progress_counter++; + + if ( progress_counter >= NUM_RANDOM_ACCESSES / 20 ) { + + progress_counter = 0; + HDfprintf(stdout, "."); + HDfflush(stdout); + } + } + } + + if ( ( pass ) && ( report_progress ) ) { + + HDfprintf(stdout, " Done.\n"); /* random reads on all data sets */ + HDfflush(stdout); + } + + + /* close the file spaces we are done with */ + i = 1; + while ( ( pass ) && ( i < NUM_DSETS ) ) + { + if ( H5Sclose(filespace_ids[i]) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Sclose() failed."; + } + i++; + } + + + /* close the datasets we are done with */ + i = 1; + while ( ( pass ) && ( i < NUM_DSETS ) ) + { + if ( H5Dclose(dataset_ids[i]) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Dclose() failed."; + } + i++; + } + + + /* do random reads on data set 0 only */ + + if ( ( pass ) && ( report_progress ) ) { + + HDfprintf(stdout, "Doing random reads on dataset 0 "); + HDfflush(stdout); + } + + m = 0; + n = 0; + progress_counter = 0; + while ( ( pass ) && ( n < NUM_RANDOM_ACCESSES ) ) + { + i = (rand() % (DSET_SIZE / CHUNK_SIZE)) * CHUNK_SIZE; + j = (rand() % (DSET_SIZE / CHUNK_SIZE)) * CHUNK_SIZE; + + /* select on disk hyperslab */ + offset[0] = (hsize_t)i; /*offset of hyperslab in file*/ + offset[1] = (hsize_t)j; + a_size[0] = CHUNK_SIZE; /*size of hyperslab*/ + a_size[1] = CHUNK_SIZE; + status = H5Sselect_hyperslab(filespace_ids[m], H5S_SELECT_SET, + offset, NULL, a_size, NULL); + + if ( status < 0 ) { + + pass = FALSE; + failure_mssg = "disk hyperslab create failed."; + } + + /* read the chunk from file */ + if ( pass ) { + + status = H5Dread(dataset_ids[m], H5T_NATIVE_INT, memspace_id, + filespace_ids[m], H5P_DEFAULT, data_chunk); + + if ( status < 0 ) { + + pass = FALSE; + failure_mssg = "disk hyperslab create failed."; + } + } + + /* validate the slab */ + if ( pass ) { + + valid_chunk = TRUE; + for ( k = 0; k < CHUNK_SIZE; k++ ) + { + for ( l = 0; l < CHUNK_SIZE; l++ ) + { + if ( data_chunk[k][l] + != + ((DSET_SIZE * DSET_SIZE * m) + + (DSET_SIZE * (i + k)) + j + l) ) { + + valid_chunk = FALSE; + } +#if 0 /* this will be useful from time to time -- lets keep it */ + HDfprintf(stdout, "data_chunk[%0d][%0d] = %0d, expect %0d.\n", + k, l, data_chunk[k][l], + ((DSET_SIZE * DSET_SIZE * m) + + (DSET_SIZE * (i + k)) + j + l)); +#endif + } + } + + if ( ! valid_chunk ) { + + pass = FALSE; + failure_mssg = "slab validation failed."; +#if 0 /* as above */ + fprintf(stdout, "Chunk (%0d, %0d) in /dset%03d is invalid.\n", + i, j, m); +#endif + } + } + + n++; + + if ( ( pass ) && ( report_progress ) ) { + + progress_counter++; + + if ( progress_counter >= NUM_RANDOM_ACCESSES / 20 ) { + + progress_counter = 0; + HDfprintf(stdout, "."); + HDfflush(stdout); + } + } + } + + if ( ( pass ) && ( report_progress ) ) { + + HDfprintf(stdout, " Done.\n"); /* random reads data set 0 */ + HDfflush(stdout); + } + + + if ( ( pass ) && ( report_progress ) ) { + + HDfprintf(stdout,"Shutting down ... "); + HDfflush(stdout); + } + + + /* close file space 0 */ + if ( pass ) { + + if ( H5Sclose(filespace_ids[0]) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Sclose(filespace_ids[0]) failed."; + } + } + + /* close the data space */ + if ( pass ) { + + if ( H5Sclose(dataspace_id) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Sclose(dataspace) failed."; + } + } + + /* close the mem space */ + if ( pass ) { + + if ( H5Sclose(memspace_id) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Sclose(memspace_id) failed."; + } + } + + /* close dataset 0 */ + if ( pass ) { + + if ( H5Dclose(dataset_ids[0]) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Dclose(dataset_ids[0]) failed."; + } + } + + /* close the file and delete it */ + if ( pass ) { + + if ( H5Fclose(file_id) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fclose() failed.\n"; + + } + else if ( HDremove(filename) < 0 ) { + + pass = FALSE; + failure_mssg = "HDremove() failed.\n"; + } + } + + if ( ( pass ) && ( report_progress ) ) { + + HDfprintf(stdout,"Done.\n"); /* shutting down */ + HDfflush(stdout); + } + + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + failures++; + HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + return; + +} /* mdj_api_example_test() */ + + +/*** super block extension related test code ***/ + +/*------------------------------------------------------------------------- + * Function: check_superblock_extensions() + * + * 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 + * once journaling is fully implemented. + * + * Return: void + * + * Programmer: John Mainzer + * 2/26/08 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +extern hbool_t H5C__check_for_journaling; + +static void +check_superblock_extensions(void) +{ + const char * fcn_name = "check_superblock_extensions()"; + char filename[512]; + hbool_t show_progress = FALSE; + hbool_t verbose = FALSE; + int cp = 0; + hid_t fapl_id = -1; + hid_t file_id = -1; + hid_t dataset_id = -1; + hid_t dataspace_id = -1; + H5F_t * file_ptr = NULL; + hsize_t dims[2]; + + + TESTING("superblock extensions"); + + pass = TRUE; + + /* 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. + * + * For now at least, the test proceeds as follows: + * + * 1) create a HDF5 file, and verify that journaling is + * 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. + * + * 4) Write data to the superblock marking the file as currently + * 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. + * + * 6) Reset the journaling information to indicate that the file + * is not being journaled, and close the file again. + * + * 7) Open the file a fourth time, and verify that the superblock + * 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. + * + * 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 + * progress. + * + * 12) Close the file and delete it. + */ + + /********************************************************/ + /* 1) create a HDF5 file, and verify that journaling is */ + /* listed as being off. */ + /********************************************************/ + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* setup the file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[2], H5P_DEFAULT, filename, sizeof(filename)) + == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed.\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* create a file access propertly list */ + if ( pass ) { + + fapl_id = H5Pcreate(H5P_FILE_ACCESS); + + if ( fapl_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pcreate() failed.\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* call H5Pset_libver_bounds() on the fapl_id */ + if ( pass ) { + + if ( H5Pset_libver_bounds(fapl_id, H5F_LIBVER_LATEST, + H5F_LIBVER_LATEST) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Pset_libver_bounds() failed.\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* create the file using fapl_id */ + if ( pass ) { + + file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, fapl_id); + + if ( file_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fcreate() failed.\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* get a pointer to the files internal data structure and then + * verify that journaling is disabled. + */ + if ( pass ) { + + file_ptr = (H5F_t *)H5I_object_verify(file_id, H5I_FILE); + + if ( file_ptr == NULL ) { + + pass = FALSE; + failure_mssg = "Can't get file_ptr (1).\n"; + + } else if ( file_ptr->shared->mdc_jnl_enabled ) { + + pass = FALSE; + failure_mssg = "Journaling enabled on file creation.\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /************************************************************/ + /* 2) create a dataset in the file, and then close the file */ + /************************************************************/ + + if ( pass ) { + + dims[0] = 4; + dims[1] = 6; + dataspace_id = H5Screate_simple(2, dims, NULL); + + if ( dataspace_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Screate_simple() failed."; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + if ( pass ) { + + /* Create the dataset. */ + dataset_id = H5Dcreate2(file_id, "/dset", H5T_STD_I32BE, dataspace_id, + H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + + if ( dataspace_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Dcreate2() failed."; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + if ( pass ) { + + /* close the data set, the data space, and the file */ + if ( ( H5Dclose(dataset_id) < 0 ) || + ( H5Sclose(dataspace_id) < 0 ) || + ( H5Fclose(file_id) < 0 ) ) { + + pass = FALSE; + failure_mssg = "data set, data space, or file close failed."; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /****************************************************************/ + /* 3) Open the file again, and verifiy that journaling is still */ + /* listed as being off. */ + /****************************************************************/ + + /* open the file r/w using the default FAPL */ + if ( pass ) { + + file_id = H5Fopen(filename, H5F_ACC_RDWR, H5P_DEFAULT); + + if ( file_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fopen() failed (4).\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* get a pointer to the files internal data structure and then + * verify that journaling is disabled. + */ + if ( pass ) { + + file_ptr = (H5F_t *)H5I_object_verify(file_id, H5I_FILE); + + if ( file_ptr == NULL ) { + + pass = FALSE; + failure_mssg = "Can't get file_ptr (2).\n"; + + } else if ( file_ptr->shared->mdc_jnl_enabled ) { + + pass = FALSE; + failure_mssg = "Journaling enabled on file open (1).\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /*****************************************************************/ + /* 4) Write data to the superblock marking the file as currently */ + /* being journaled, and close the file again. */ + /*****************************************************************/ + + /* 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. + */ + + if ( pass ) { + + file_ptr->shared->mdc_jnl_enabled = TRUE; + file_ptr->shared->mdc_jnl_magic = 123; + file_ptr->shared->mdc_jnl_file_name_len = HDstrlen("abc"); + HDstrncpy(file_ptr->shared->mdc_jnl_file_name, + "abc", + file_ptr->shared->mdc_jnl_file_name_len + 1); + + if ( verbose ) { + + HDfprintf(stdout, "f->shared->mdc_jnl_enabled = %d\n", + (int)(file_ptr->shared->mdc_jnl_enabled)); + HDfprintf(stdout, "f->shared->mdc_jnl_magic = %d\n", + (int)(file_ptr->shared->mdc_jnl_magic)); + HDfprintf(stdout, "f->shared->mdc_jnl_file_name_len = %d\n", + (int)(file_ptr->shared->mdc_jnl_file_name_len)); + HDfprintf(stdout, "f->shared->mdc_jnl_file_name = \"%s\"\n", + file_ptr->shared->mdc_jnl_file_name); + } + + if ( H5F_super_write_mdj_msg(file_ptr, -1) < 0 ) { + + pass = FALSE; + failure_mssg = "H5F_super_write_mdj_msg failed (1)."; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* close the file again. */ + if ( pass ) { + + if ( H5Fclose(file_id) < 0 ) { + + pass = FALSE; + failure_mssg = "file close failed (1)."; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + + /*****************************************************************/ + /* 5) Open the file a third time, and verify that the superblock */ + /* extension indicates that the file is being journaled. */ + /*****************************************************************/ + + /* open the file r/w using the default FAPL -- turn off journaling + * in progress check during the open. + * */ + if ( pass ) { + + H5C__check_for_journaling = FALSE; + file_id = H5Fopen(filename, H5F_ACC_RDWR, H5P_DEFAULT); + H5C__check_for_journaling = TRUE; + + if ( file_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fopen() failed (5).\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* get a pointer to the files internal data structure and then + * verify that journaling is enabled. + */ + if ( pass ) { + + file_ptr = (H5F_t *)H5I_object_verify(file_id, H5I_FILE); + + if ( file_ptr == NULL ) { + + pass = FALSE; + failure_mssg = "Can't get file_ptr (3).\n"; + + } else if ( ! file_ptr->shared->mdc_jnl_enabled ) { + + pass = FALSE; + failure_mssg = "Journaling disabled on file open (1).\n"; + + } else if ( file_ptr->shared->mdc_jnl_magic != 123 ) { + + pass = FALSE; + HDfprintf(stdout, "%s: mdc_jnl_magic = %d (%d).\n", + fcn_name, (int)(file_ptr->shared->mdc_jnl_magic), + 123); + failure_mssg = "unexpected mdc_jnl_magic(1).\n"; + + } else if ( file_ptr->shared->mdc_jnl_file_name_len != + (size_t)HDstrlen("abc") ) { + + pass = FALSE; + failure_mssg = "unexpected mdc_jnl_file_name_len (1).\n"; + + } else if ( HDstrcmp(file_ptr->shared->mdc_jnl_file_name, "abc") != 0 ) { + + pass = FALSE; + failure_mssg = "unexpected mdc_jnl_file_name (1).\n"; + + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /*****************************************************************/ + /* 6) Reset the journaling information to indicate that the file */ + /* is not being journaled, and close the file again. */ + /*****************************************************************/ + + if ( pass ) { + + file_ptr->shared->mdc_jnl_enabled = FALSE; + + if ( H5F_super_write_mdj_msg(file_ptr, -1) < 0 ) { + + pass = FALSE; + failure_mssg = "H5F_super_write_mdj_msg failed (2)."; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* close the file again. */ + if ( pass ) { + + if ( H5Fclose(file_id) < 0 ) { + + pass = FALSE; + failure_mssg = "file close failed (2)."; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + + /******************************************************************/ + /* 7) Open the file a fourth time, and verify that the superblock */ + /* extension indicates that the file is not being journaled. */ + /*******************************************************************/ + + /* open the file r/w using the default FAPL */ + if ( pass ) { + + file_id = H5Fopen(filename, H5F_ACC_RDWR, H5P_DEFAULT); + + if ( file_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fopen() failed (6).\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* get a pointer to the files internal data structure and then + * verify that journaling is disabled. + */ + if ( pass ) { + + file_ptr = (H5F_t *)H5I_object_verify(file_id, H5I_FILE); + + if ( file_ptr == NULL ) { + + pass = FALSE; + failure_mssg = "Can't get file_ptr (4).\n"; + + } else if ( file_ptr->shared->mdc_jnl_enabled ) { + + pass = FALSE; + failure_mssg = "Journaling enabled on file open (2).\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + + /*******************************************************************/ + /* 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. */ + /*******************************************************************/ + + if ( pass ) { + + file_ptr->shared->mdc_jnl_enabled = TRUE; + file_ptr->shared->mdc_jnl_magic = 456; + file_ptr->shared->mdc_jnl_file_name_len = HDstrlen("qrst"); + HDstrncpy(file_ptr->shared->mdc_jnl_file_name, + "qrst", + file_ptr->shared->mdc_jnl_file_name_len + 1); + + if ( H5F_super_write_mdj_msg(file_ptr, -1) < 0 ) { + + pass = FALSE; + failure_mssg = "H5F_super_write_mdj_msg failed (3)."; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + if ( pass ) { + + file_ptr->shared->mdc_jnl_enabled = TRUE; + file_ptr->shared->mdc_jnl_magic = 789; + file_ptr->shared->mdc_jnl_file_name_len = HDstrlen("z"); + HDstrncpy(file_ptr->shared->mdc_jnl_file_name, + "z", + file_ptr->shared->mdc_jnl_file_name_len + 1); + + if ( H5F_super_write_mdj_msg(file_ptr, -1) < 0 ) { + + pass = FALSE; + failure_mssg = "H5F_super_write_mdj_msg failed (4)."; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* close the file again. */ + if ( pass ) { + + if ( H5Fclose(file_id) < 0 ) { + + pass = FALSE; + failure_mssg = "file close failed (3)."; + } + } + + 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. */ + /***************************************************************/ + + /* open the file r/w using the default FAPL -- turn off journaling + * in progress check during the open. + */ + if ( pass ) { + + H5C__check_for_journaling = FALSE; + file_id = H5Fopen(filename, H5F_ACC_RDWR, H5P_DEFAULT); + H5C__check_for_journaling = TRUE; + + if ( file_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fopen() failed (7).\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* get a pointer to the files internal data structure and then + * verify that journaling is enabled. + */ + if ( pass ) { + + file_ptr = (H5F_t *)H5I_object_verify(file_id, H5I_FILE); + + if ( file_ptr == NULL ) { + + pass = FALSE; + failure_mssg = "Can't get file_ptr (5).\n"; + + } else if ( ! file_ptr->shared->mdc_jnl_enabled ) { + + pass = FALSE; + failure_mssg = "Journaling disabled on file open (2).\n"; + + } else if ( file_ptr->shared->mdc_jnl_magic != 789 ) { + + pass = FALSE; + HDfprintf(stdout, "%s: mdc_jnl_magic = %d (%d).\n", + fcn_name, (int)(file_ptr->shared->mdc_jnl_magic), + 789); + failure_mssg = "unexpected mdc_jnl_magic(2).\n"; + + } else if ( file_ptr->shared->mdc_jnl_file_name_len != + (size_t)HDstrlen("z") ) { + + pass = FALSE; + failure_mssg = "unexpected mdc_jnl_file_name_len (2).\n"; + + } else if ( HDstrcmp(file_ptr->shared->mdc_jnl_file_name, "z") != 0 ) { + + pass = FALSE; + failure_mssg = "unexpected mdc_jnl_file_name (2).\n"; + + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + + /******************************************************************/ + /* 10) Write data to the superblock indicating that journaling is */ + /* not in progress. Close the file. */ + /******************************************************************/ + + if ( pass ) { + + file_ptr->shared->mdc_jnl_enabled = FALSE; + + if ( H5F_super_write_mdj_msg(file_ptr, -1) < 0 ) { + + pass = FALSE; + failure_mssg = "H5F_super_write_mdj_msg failed (5)."; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* close the file again. */ + if ( pass ) { + + if ( H5Fclose(file_id) < 0 ) { + + pass = FALSE; + failure_mssg = "file close failed (4)."; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + + /*************************************************************/ + /* 11) Reopen the file, and verify that journaling is not in */ + /* progress. */ + /*************************************************************/ + + /* open the file r/w using the default FAPL */ + if ( pass ) { + + file_id = H5Fopen(filename, H5F_ACC_RDWR, H5P_DEFAULT); + + if ( file_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fopen() failed (8).\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + /* get a pointer to the files internal data structure and then + * verify that journaling is disabled. + */ + if ( pass ) { + + file_ptr = (H5F_t *)H5I_object_verify(file_id, H5I_FILE); + + if ( file_ptr == NULL ) { + + pass = FALSE; + failure_mssg = "Can't get file_ptr (6).\n"; + + } else if ( file_ptr->shared->mdc_jnl_enabled ) { + + pass = FALSE; + failure_mssg = "Journaling enabled on file open (3).\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + + /*************************************/ + /* 12) Close the file and delete it. */ + /*************************************/ + + if ( pass ) { + + if ( H5Fclose(file_id) < 0 ) { + + pass = FALSE; + failure_mssg = "file close failed (5)."; + + } else if ( HDremove(filename) < 0 ) { + + pass = FALSE; + failure_mssg = "HDremove() failed.\n"; + } + } + + if ( show_progress ) HDfprintf(stdout, "%s: cp = %d.\n", fcn_name, cp++); + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + failures++; + HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + +} /* check_superblock_extensions() */ + + +/*************************************************************************** + * Function: check_mdjsc_callbacks() + * + * Purpose: Verify that the registration and deregistration of + * metadata journaling status change registration/deregistraion + * works correctly. + * + * 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 pass to false, and failure_mssg to an + * appropriate error string. + * + * Return: void + * + * Programmer: John Mainzer + * 7/2/08 + * + **************************************************************************/ + +static void +check_mdjsc_callbacks(void) +{ + const char * fcn_name = "check_mdjsc_callbacks():"; + + TESTING("metadata journaling status change callbacks"); + + verify_mdjsc_callback_registration_deregistration(); + + verify_mdjsc_callback_execution(); + + verify_mdjsc_callback_error_rejection(); + + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + failures++; + HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + } + + return; + +} /* check_mdjsc_callbacks() */ + + +/*************************************************************************** + * + * Function: test_mdjsc_callback() + * + * Purpose: Test callback function used to test the metadata + * journaling status change callback facility. + * + * Return: void + * + * Programmer: John Mainzer + * 8/15/08 + * + **************************************************************************/ + +static H5C_t * callback_test_cache_ptr = NULL; +static hbool_t callback_test_invalid_cache_ptr = FALSE; +static hbool_t callback_test_null_config_ptr = FALSE; +static hbool_t callback_test_invalid_config = FALSE; +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 +test_mdjsc_callback(const H5C_mdj_config_t * config_ptr, + hid_t UNUSED dxpl_id, + void * data_ptr) +{ + if ( config_ptr == NULL ) + { + callback_test_null_config_ptr = TRUE; + } + + if ( ( callback_test_cache_ptr == NULL ) || + ( callback_test_cache_ptr->magic != H5C__H5C_T_MAGIC ) ) + { + callback_test_invalid_cache_ptr = TRUE; + } + else if ( callback_test_cache_ptr->slist_len > 0 ) + { + callback_test_cache_is_dirty = TRUE; + } + else if ( ( callback_test_cache_ptr != NULL ) && + ( callback_test_cache_ptr->mdj_enabled != + config_ptr->enable_journaling ) ) + { + callback_test_invalid_config = TRUE; + } + + if ( data_ptr == NULL ) + { + callback_test_null_data_ptr = TRUE; + callback_test_null_data_ptr_count++; + } + else + { + *((int *)data_ptr) += 1; + } + + return SUCCEED; + +} /* test_mdjsc_callback() */ + + +/*************************************************************************** + * + * Function: deregister_mdjsc_callback() + * + * 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 pass t FALSE, and set the + * failure_mssg to the appropriate error message. + * + * Do nothing and return if pass is false on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 8/15/08 + * + **************************************************************************/ + +static void +deregister_mdjsc_callback(H5F_t * file_ptr, + H5C_t * cache_ptr, + int32_t idx) +{ + herr_t result; + + if ( pass ) + { + if ( ( file_ptr == NULL ) || + ( cache_ptr == NULL ) || + ( cache_ptr->magic != H5C__H5C_T_MAGIC ) ) + { + pass = FALSE; + failure_mssg = + "deregister_mdjsc_callback(): bad param(s) on entry."; + } + } + + if ( pass ) + { + result = H5AC_deregister_mdjsc_callback(file_ptr, idx); + + if ( result < 0 ) + { + pass = FALSE; + failure_mssg = "H5AC_deregister_mdjsc_callback() failed."; + } + + verify_mdjsc_callback_deregistered(cache_ptr, idx); + } + + return; + +} /* deregister_mdjsc_callback() */ + + +/*************************************************************************** + * + * Function: register_mdjsc_callback() + * + * Purpose: Attempt to register the supplied metadata journaling + * status change callback, and verify that the registration + * took. + * + * If any error is detected, set pass t FALSE, and set the + * failure_mssg to the appropriate error message. + * + * Do nothing and return if pass is false on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 8/15/08 + * + **************************************************************************/ + +static void +register_mdjsc_callback(H5F_t * file_ptr, + H5C_t * cache_ptr, + H5C_mdj_status_change_func_t fcn_ptr, + void * data_ptr, + int32_t * idx_ptr) +{ + herr_t result; + H5C_mdj_config_t init_config; + + if ( pass ) + { + if ( ( file_ptr == NULL ) || + ( cache_ptr == NULL ) || + ( cache_ptr->magic != H5C__H5C_T_MAGIC ) || + ( fcn_ptr == NULL ) || + ( idx_ptr == NULL ) ) + { + pass = FALSE; + failure_mssg = "register_mdjsc_callback(): bad param(s) on entry."; + } + } + + if ( pass ) + { + result = H5AC_register_mdjsc_callback(file_ptr, fcn_ptr, data_ptr, + idx_ptr, &init_config); + + if ( result < 0 ) + { + pass = FALSE; + failure_mssg = "H5AC_register_mdjsc_callback() failed."; + } + else if ( init_config.enable_journaling != cache_ptr->mdj_enabled ) + { + pass = FALSE; + failure_mssg = + "init_config.enable_journaling != cache_ptr->mdj_enabled"; + } + + verify_mdjsc_callback_registered(cache_ptr, + fcn_ptr, + data_ptr, + *idx_ptr); + } + + return; + +} /* register_mdjsc_callback() */ + + +/*************************************************************************** + * + * Function: verify_mdjsc_table_config() + * + * Purpose: Verify that the mdjsc callback table is configured as + * specified. + * + * If all is as it should be, do nothing. + * + * If anything is not as it should be, set pass to FALSE, + * and set failure_mssg to the appropriate error message. + * + * Do nothing and return if pass is false on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 8/15/08 + * + **************************************************************************/ + +static void +verify_mdjsc_table_config(H5C_t * cache_ptr, + int32_t table_len, + int32_t num_entries, + int32_t max_idx_in_use, + hbool_t * free_entries) +{ + const char * fcn_name = "verify_mdjsc_table_config()"; + hbool_t show_progress = FALSE; + int cp = 0; + + if ( show_progress ) + HDfprintf(stdout, "%s:%d: %d.\n", fcn_name, pass, cp++); + + if ( pass ) + { + if ( ( cache_ptr == NULL ) || + ( cache_ptr->magic != H5C__H5C_T_MAGIC ) ) + { + pass = FALSE; + failure_mssg = "bad cache_ptr."; + } + } + + if ( show_progress ) + HDfprintf(stdout, "%s:%d: %d.\n", fcn_name, pass, cp++); + + if ( pass ) + { + if ( cache_ptr->mdjsc_cb_tbl == NULL ) + { + pass = FALSE; + failure_mssg = "cache_ptr->mdjsc_cb_tbl == NULL."; + } + } + + if ( show_progress ) + HDfprintf(stdout, "%s:%d: %d.\n", fcn_name, pass, cp++); + + if ( pass ) + { + if ( cache_ptr->mdjsc_cb_tbl_len != table_len ) + { + pass = FALSE; + failure_mssg = "mdjsc callback table len mismatch"; + } + else if ( cache_ptr->num_mdjsc_cbs != num_entries ) + { + pass = FALSE; + failure_mssg = "mdjsc callback table num entries mismatch"; + } + else if ( cache_ptr->mdjsc_cb_tbl_max_idx_in_use != max_idx_in_use ) + { + pass = FALSE; + failure_mssg = "mdjsc callback table max idx in use mismatch"; + } + } + + if ( show_progress ) + HDfprintf(stdout, "%s:%d: %d.\n", fcn_name, pass, cp++); + + if ( ( pass ) && ( free_entries ) ) + { + int32_t i = 0; + int32_t j; + H5C_mdjsc_record_t * record_ptr = NULL; + + while ( ( pass ) && ( i < table_len ) ) + { + if ( free_entries[i] ) + { + if ( (( (cache_ptr->mdjsc_cb_tbl)[i]).fcn_ptr != NULL) + || + (((cache_ptr->mdjsc_cb_tbl)[i]).data_ptr != NULL) + ) + { + pass = FALSE; + failure_mssg = + "mdjsc callback table entry in use that should be free"; + } + } + else + { + /* recall that the data_ptr can be NULL when an entry is + * in use. + */ + if ( ((cache_ptr->mdjsc_cb_tbl)[i]).fcn_ptr == NULL ) + { + pass = FALSE; + failure_mssg = + "mdjsc callback table entry free that shoult be in use"; + } + } + + i++; + } + + if ( show_progress ) + HDfprintf(stdout, "%s:%d: %d.\n", fcn_name, pass, cp++); + + i = 0; + j = cache_ptr->mdjsc_cb_tbl_fl_head; + + while ( ( pass ) && + ( i < (table_len - num_entries) ) && + ( j >= 0 ) && + ( j < table_len ) ) + { + record_ptr = &((cache_ptr->mdjsc_cb_tbl)[j]); + + if ( ( record_ptr->fcn_ptr != NULL ) || + ( record_ptr->data_ptr != NULL ) ) + { + pass = FALSE; + failure_mssg = "mdjsc callback table free list entry in use."; + } + + i++; + j = record_ptr->fl_next; + } + + if ( show_progress ) + HDfprintf(stdout, "%s:%d: %d.\n", fcn_name, pass, cp++); + + if ( pass ) + { + if ( i != (table_len - num_entries) ) { + + pass = FALSE; + failure_mssg = + "mdjsc callback table free list shorter than expected."; + + } else if ( ( record_ptr != NULL ) && + ( record_ptr->fl_next != -1 ) ) { + + pass = FALSE; + failure_mssg = + "mdjsc callback table free list longer than expected."; + + } + } + } + + if ( show_progress ) + HDfprintf(stdout, "%s:%d: %d -- done.\n", fcn_name, pass, cp++); + + return; + +} /* verify_mdjsc_table_config() */ + + +/*************************************************************************** + * + * Function: verify_mdjsc_callback_deregistered() + * + * Purpose: Verify that the suplied mdjsc callback is registerd + * in the metadata journaling status change callback table + * at the specified index and with the specified data ptr. + * + * If all is as it should be, do nothing. + * + * If anything is not as it should be, set pass to FALSE, + * and set failure_mssg to the appropriate error message. + * + * Do nothing and return if pass is false on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 8/15/08 + * + **************************************************************************/ + +static void +verify_mdjsc_callback_deregistered(H5C_t * cache_ptr, + int32_t idx) +{ + if ( pass ) + { + if ( ( cache_ptr == NULL ) || + ( cache_ptr->magic != H5C__H5C_T_MAGIC ) ) + { + pass = FALSE; + failure_mssg = "bad cache_ptr."; + } + } + + if ( pass ) + { + if ( cache_ptr->mdjsc_cb_tbl == NULL ) + { + pass = FALSE; + failure_mssg = "cache_ptr->mdjsc_cb_tbl == NULL."; + } + } + + if ( ( pass ) && ( idx < cache_ptr->mdjsc_cb_tbl_len ) ) + { + if ( ((cache_ptr->mdjsc_cb_tbl)[idx]).fcn_ptr != NULL ) + { + pass = FALSE; + failure_mssg = "fcn_ptr mismatch"; + } + else if ( ((cache_ptr->mdjsc_cb_tbl)[idx]).data_ptr != NULL ) + { + pass = FALSE; + failure_mssg = "data_ptr mismatch"; + } + } + + return; + +} /* verify_mdjsc_callback_deregistered() */ + + +/*************************************************************************** + * + * Function: verify_mdjsc_callback_registered() + * + * Purpose: Verify that the suplied mdjsc callback is registerd + * in the metadata journaling status change callback table + * at the specified index and with the specified data ptr. + * + * If all is as it should be, do nothing. + * + * If anything is not as it should be, set pass to FALSE, + * and set failure_mssg to the appropriate error message. + * + * Do nothing and return if pass is false on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 8/15/08 + * + **************************************************************************/ + +static void +verify_mdjsc_callback_registered(H5C_t * cache_ptr, + H5C_mdj_status_change_func_t fcn_ptr, + void * data_ptr, + int32_t idx) +{ + if ( pass ) + { + if ( ( cache_ptr == NULL ) || + ( cache_ptr->magic != H5C__H5C_T_MAGIC ) ) + { + pass = FALSE; + failure_mssg = "bad cache_ptr."; + } + } + + if ( pass ) + { + if ( ( fcn_ptr == NULL ) || + ( idx < 0 ) ) + { + pass = FALSE; + failure_mssg = "bad fcn_ptr and/or negative idx."; + } + } + + if ( pass ) + { + if ( cache_ptr->mdjsc_cb_tbl == NULL ) + { + pass = FALSE; + failure_mssg = "cache_ptr->mdjsc_cb_tbl == NULL."; + } + } + + if ( pass ) + { + if ( cache_ptr->mdjsc_cb_tbl_len <= idx ) + { + pass = FALSE; + failure_mssg = "idx out of range."; + } + } + + if ( pass ) + { + if ( ((cache_ptr->mdjsc_cb_tbl)[idx]).fcn_ptr != fcn_ptr ) + { + pass = FALSE; + failure_mssg = "fcn_ptr mismatch"; + } + else if ( ((cache_ptr->mdjsc_cb_tbl)[idx]).data_ptr != data_ptr ) + { + pass = FALSE; + failure_mssg = "data_ptr mismatch"; + } + else if ( ((cache_ptr->mdjsc_cb_tbl)[idx]).fl_next != -1 ) + { + pass = FALSE; + failure_mssg = "fl_next != -1"; + } + } + + return; + +} /* verify_mdjsc_callback_registered() */ + + +/*************************************************************************** + * + * 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 + * invalid input. + * + * If anything is not as it should be, set pass to FALSE, + * and set failure_mssg to the appropriate error message. + * + * Do nothing and return if pass is false on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 8/20/08 + * + **************************************************************************/ + +static void +verify_mdjsc_callback_error_rejection(void) +{ + const char * fcn_name = "verify_mdjsc_callback_error_rejection():"; + char filename[512]; + char journal_filename[H5AC__MAX_JOURNAL_FILE_NAME_LEN + 1]; + const int max_callbacks = 1024 * H5C__MIN_MDJSC_CB_TBL_LEN; + int counters[1024 * H5C__MIN_MDJSC_CB_TBL_LEN]; + int i; + int expected_num_entries = 0; + int expected_table_len = H5C__MIN_MDJSC_CB_TBL_LEN; + int expected_max_idx = -1; + int32_t indicies[1024 * H5C__MIN_MDJSC_CB_TBL_LEN]; + hbool_t free_entries[1024 * H5C__MIN_MDJSC_CB_TBL_LEN]; + hbool_t show_progress = FALSE; + hbool_t verbose = FALSE; + int cp = 0; + herr_t result; + hid_t file_id = -1; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + + for ( i = 0; i < max_callbacks; i++ ) + { + counters[i] = 0; + free_entries[i] = TRUE; + indicies[i] = -1; + } + + /* 1) Create a file with journaling enabled. + * + * 2) Attempt to register callbacks with a variety of NULL + * pointers supplied for parameters other than data_ptr. + * All attempts should fail. + * + * 3) Attempt to deregister a callback in an empty callback table. + * Should fail + * + * 4) Register a few callbacks. Attempt to deregister non-existant + * callbacks with indicies both inside and outside the range + * of indicies currently represented in the table. All should + * fail. + * + * 5) Deregister the remaining callbacks, and then close and delete + * the file. + */ + + + /* 1) Create a file with journaling enabled. + */ + + /* setup the file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, + sizeof(filename)) == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed (1).\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass, cp++); + HDfflush(stdout); + } + + if ( verbose ) { + HDfprintf(stdout, "%s filename = \"%s\".\n", fcn_name, filename); + HDfflush(stdout); + } + + /* setup the journal file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[3], H5P_DEFAULT, journal_filename, + sizeof(journal_filename)) == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed (2).\n"; + } + else if ( HDstrlen(journal_filename) >= + H5AC__MAX_JOURNAL_FILE_NAME_LEN ) { + + pass = FALSE; + failure_mssg = "journal file name too long.\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( verbose ) { + HDfprintf(stdout, "%s journal filename = \"%s\".\n", + fcn_name, journal_filename); + HDfflush(stdout); + } + + /* clean out any existing journal file */ + HDremove(journal_filename); + setup_cache_for_journaling(filename, journal_filename, &file_id, + &file_ptr, &cache_ptr, TRUE, FALSE, FALSE); + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + + /* 2) Attempt to register callbacks with a variety of NULL + * pointers supplied for parameters other than data_ptr. + * All attempts should fail. + */ + + if ( pass ) + { + result = H5AC_register_mdjsc_callback(NULL, + test_mdjsc_callback, + NULL, + &(indicies[0]), + NULL); + + if ( result == SUCCEED ) + { + pass = FALSE; + failure_mssg = + "H5AC_register_mdjsc_callback() succeeded with NULL file_ptr"; + } + } + + if ( pass ) + { + result = H5AC_register_mdjsc_callback(file_ptr, + NULL, + NULL, + &(indicies[0]), + NULL); + + if ( result == SUCCEED ) + { + pass = FALSE; + failure_mssg = + "H5AC_register_mdjsc_callback() succeeded with NULL fcn_ptr"; + } + } + + if ( pass ) + { + result = H5AC_register_mdjsc_callback(file_ptr, + test_mdjsc_callback, + NULL, + NULL, + NULL); + + if ( result == SUCCEED ) + { + pass = FALSE; + failure_mssg = + "H5AC_register_mdjsc_callback() succeeded with NULL idx_ptr"; + } + } + + + /* 3) Attempt to deregister a callback in an empty callback table. + * Should fail + */ + + if ( pass ) + { + result = H5AC_deregister_mdjsc_callback(NULL, 0); + + if ( result == SUCCEED ) + { + pass = FALSE; + failure_mssg = + "H5AC_deregister_mdjsc_callback() succeeded with NULL file_ptr"; + } + } + + if ( pass ) + { + result = H5AC_deregister_mdjsc_callback(file_ptr, 0); + + if ( result == SUCCEED ) + { + pass = FALSE; + failure_mssg = + "H5AC_deregister_mdjsc_callback() succeeded with invld idx(1)"; + } + } + + + + /* 4) Register a few callbacks. Attempt to deregister non-existant + * callbacks with indicies both inside and outside the range + * of indicies currently represented in the table. All should + * fail. + */ + + register_mdjsc_callback(file_ptr, cache_ptr, test_mdjsc_callback, + &(counters[0]), &(indicies[0])); + register_mdjsc_callback(file_ptr, cache_ptr, test_mdjsc_callback, + NULL, &(indicies[1])); + 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; + expected_num_entries += 3; + expected_max_idx = 2; + + verify_mdjsc_table_config(cache_ptr, expected_table_len, + expected_num_entries, expected_max_idx, + free_entries); + + + if ( pass ) + { + result = H5AC_deregister_mdjsc_callback(file_ptr, 3); + + if ( result == SUCCEED ) + { + pass = FALSE; + failure_mssg = + "H5AC_deregister_mdjsc_callback() succeeded with invld idx(2)"; + } + } + + if ( pass ) + { + result = H5AC_deregister_mdjsc_callback(file_ptr, -1); + + if ( result == SUCCEED ) + { + pass = FALSE; + failure_mssg = + "H5AC_deregister_mdjsc_callback() succeeded with invld idx(3)"; + } + } + + verify_mdjsc_table_config(cache_ptr, expected_table_len, + expected_num_entries, expected_max_idx, + free_entries); + + + if ( pass ) + { + result = H5AC_deregister_mdjsc_callback(file_ptr, 1); + + if ( result != SUCCEED ) + { + pass = FALSE; + failure_mssg = + "H5AC_deregister_mdjsc_callback() failed with valid idx"; + } + else + { + free_entries[1] = TRUE; + expected_num_entries--; + + verify_mdjsc_table_config(cache_ptr, expected_table_len, + expected_num_entries, expected_max_idx, + free_entries); + + } + } + + if ( pass ) + { + result = H5AC_deregister_mdjsc_callback(file_ptr, -1); + + if ( result == SUCCEED ) + { + pass = FALSE; + failure_mssg = + "H5AC_deregister_mdjsc_callback() succeeded with invld idx(4)"; + } + } + + + /* 5) Deregister the remaining callbacks, and then close and delete + * the file. + */ + + deregister_mdjsc_callback(file_ptr, cache_ptr, 0); + deregister_mdjsc_callback(file_ptr, cache_ptr, 2); + + 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, + expected_num_entries, expected_max_idx, + free_entries); + + + /* Close the file, and tidy up. + */ + + if ( pass ) { + + if ( H5Fclose(file_id) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fclose() failed."; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + /* delete the HDF5 file and journal file */ +#if 1 + HDremove(filename); + HDremove(journal_filename); +#endif + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d done.\n", + fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + return; + +} /* verify_mdjsc_callback_error_rejection() */ + + +/*************************************************************************** + * + * Function: verify_mdjsc_callback_execution() + * + * 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 + * to the callback function. + * + * If anything is not as it should be, set pass to FALSE, + * and set failure_mssg to the appropriate error message. + * + * Do nothing and return if pass is false on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 8/15/08 + * + **************************************************************************/ + +static void +verify_mdjsc_callback_execution(void) +{ + const char * fcn_name = "verify_mdjsc_callback_execution():"; + char filename[512]; + char journal_filename[H5AC__MAX_JOURNAL_FILE_NAME_LEN + 1]; + const int max_callbacks = 1024 * H5C__MIN_MDJSC_CB_TBL_LEN; + int counters[1024 * H5C__MIN_MDJSC_CB_TBL_LEN]; + int i; + int expected_num_entries = 0; + int expected_table_len = H5C__MIN_MDJSC_CB_TBL_LEN; + int expected_max_idx = -1; + int32_t indicies[1024 * H5C__MIN_MDJSC_CB_TBL_LEN]; + hbool_t free_entries[1024 * H5C__MIN_MDJSC_CB_TBL_LEN]; + hbool_t show_progress = FALSE; + hbool_t verbose = FALSE; + int cp = 0; + herr_t result; + hid_t dataset_id = -1; + hid_t dataspace_id = -1; + hid_t file_id = -1; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + hsize_t dims[2]; + H5AC_jnl_config_t jnl_config; + + for ( i = 0; i < max_callbacks; i++ ) + { + counters[i] = 0; + free_entries[i] = TRUE; + indicies[i] = -1; + } + + /* 1) Create a file with journaling enabled. + * + * 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 + * called, that it gets the correct data, and that the cache + * is clear at time of call. + * + * 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 + * clean at time of call. + * + * 7) Perform some more writes to the file. + * + * 8) 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. + * + * 9) Deregister the callback, and close the file. Recall that + * all metadata journaling status change callbacks must + * deregister before the metadata cache is destroyed. + * + * 10) Re-open the file with journaling disabled, and register + * several callbacks. Ensure that at least one has NULL + * data_ptr. + * + * 11) Enable journaling. Verify that the callbacks are called. + * + * 12) Perform some writes to the file. + * + * 13) Register a great number of callbacks. + * + * 14) Disable journaling. Verify that the callbacks are called. + * + * 15) Deregister some of the callbacks. + * + * 16) Enable journaling. Verify that the remaining callbacks are + * called. + * + * 17) Deregister the remaining callbacks, and then close and delete + * the file. + */ + + + /* 1) Create a file with journaling enabled. + */ + + /* setup the file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, + sizeof(filename)) == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed (1).\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass, cp++); + HDfflush(stdout); + } + + if ( verbose ) { + HDfprintf(stdout, "%s filename = \"%s\".\n", fcn_name, filename); + HDfflush(stdout); + } + + /* setup the journal file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[3], H5P_DEFAULT, journal_filename, + sizeof(journal_filename)) == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed (2).\n"; + } + else if ( HDstrlen(journal_filename) >= + H5AC__MAX_JOURNAL_FILE_NAME_LEN ) { + + pass = FALSE; + failure_mssg = "journal file name too long.\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( verbose ) { + HDfprintf(stdout, "%s journal filename = \"%s\".\n", + fcn_name, journal_filename); + HDfflush(stdout); + } + + /* clean out any existing journal file */ + HDremove(journal_filename); + setup_cache_for_journaling(filename, journal_filename, &file_id, + &file_ptr, &cache_ptr, TRUE, FALSE, FALSE); + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + + /* 2) Register a callback. + */ + + register_mdjsc_callback(file_ptr, cache_ptr, test_mdjsc_callback, + &(counters[0]), &(indicies[0])); + + free_entries[0] = FALSE; + expected_num_entries++; + expected_max_idx = 0; + + verify_mdjsc_table_config(cache_ptr, expected_table_len, + expected_num_entries, expected_max_idx, + free_entries); + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + /* 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. + */ + + if ( pass ) { + + jnl_config.version = H5AC__CURR_JNL_CONFIG_VER; + + result = H5Fget_jnl_config(file_id, &jnl_config); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fget_jnl_config() failed.\n"; + } + + /* set journaling config fields to taste */ + jnl_config.enable_journaling = FALSE; + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( pass ) { + + counters[0] = 0; + callback_test_cache_ptr = cache_ptr; + callback_test_invalid_cache_ptr = FALSE; + callback_test_null_config_ptr = FALSE; + callback_test_invalid_config = FALSE; + callback_test_null_data_ptr = FALSE; + callback_test_cache_is_dirty = FALSE; + callback_test_null_data_ptr_count = 0; + + result = H5Fset_jnl_config(file_id, &jnl_config); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fset_jnl_config() failed.\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( pass ) { + + if ( counters[0] != 1 ) + { + pass = FALSE; + failure_mssg = "incorrect number of callback calls(1)."; + } + else if ( callback_test_cache_is_dirty ) + { + pass = FALSE; + failure_mssg = "callback found dirty cache(1)."; + } + else if ( ( callback_test_invalid_cache_ptr ) || + ( callback_test_null_config_ptr ) || + ( callback_test_invalid_config ) || + ( callback_test_null_data_ptr ) || + ( callback_test_null_data_ptr_count != 0 ) ) + { + pass = FALSE; + failure_mssg = "Bad parameter(s) to callback(1)."; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + + /* 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. + */ + + if ( pass ) { + + jnl_config.version = H5AC__CURR_JNL_CONFIG_VER; + + result = H5Fget_jnl_config(file_id, &jnl_config); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fget_jnl_config() failed.\n"; + } + + /* set journaling config fields to taste */ + jnl_config.enable_journaling = TRUE; + + HDstrcpy(jnl_config.journal_file_path, journal_filename); + + 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_human_readable = TRUE; + + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( pass ) { + + counters[0] = 0; + callback_test_cache_ptr = cache_ptr; + callback_test_invalid_cache_ptr = FALSE; + callback_test_null_config_ptr = FALSE; + callback_test_invalid_config = FALSE; + callback_test_null_data_ptr = FALSE; + callback_test_cache_is_dirty = FALSE; + callback_test_null_data_ptr_count = 0; + + + result = H5Fset_jnl_config(file_id, &jnl_config); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fset_jnl_config() failed.\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( pass ) { + + if ( counters[0] != 1 ) + { + pass = FALSE; + failure_mssg = "incorrect number of callback calls(2)."; + } + else if ( callback_test_cache_is_dirty ) + { + pass = FALSE; + failure_mssg = "callback found dirty cache(2)."; + } + else if ( ( callback_test_invalid_cache_ptr ) || + ( callback_test_null_config_ptr ) || + ( callback_test_invalid_config ) || + ( callback_test_null_data_ptr ) ) + { + pass = FALSE; + failure_mssg = "Bad parameter(s) to callback(2)."; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + /* 5) Perform some writes to the file. */ + + if ( pass ) { + + dims[0] = 4; + dims[1] = 6; + dataspace_id = H5Screate_simple(2, dims, NULL); + + if ( dataspace_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Screate_simple() failed."; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( pass ) { + + /* Create the dataset. */ + dataset_id = H5Dcreate2(file_id, "/dset0", H5T_STD_I32BE, + dataspace_id, H5P_DEFAULT, + H5P_DEFAULT, H5P_DEFAULT); + + if ( dataspace_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Dcreate2() failed."; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( pass ) { + + /* close the data set, and the data space */ + if ( ( H5Dclose(dataset_id) < 0 ) || + ( H5Sclose(dataspace_id) < 0 ) ) + { + pass = FALSE; + failure_mssg = "data set, or data space close failed."; + } + } + + if ( pass ) { + + if ( cache_ptr->slist_len <= 0 ) { + + pass = FALSE; + failure_mssg = "cache isnt' dirty?!?"; + } + } + + + /* 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. + */ + + if ( pass ) { + + jnl_config.version = H5AC__CURR_JNL_CONFIG_VER; + + result = H5Fget_jnl_config(file_id, &jnl_config); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fget_jnl_config() failed.\n"; + } + + /* set journaling config fields to taste */ + jnl_config.enable_journaling = FALSE; + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( pass ) { + + counters[0] = 0; + callback_test_cache_ptr = cache_ptr; + callback_test_invalid_cache_ptr = FALSE; + callback_test_null_config_ptr = FALSE; + callback_test_invalid_config = FALSE; + callback_test_null_data_ptr = FALSE; + callback_test_cache_is_dirty = FALSE; + + result = H5Fset_jnl_config(file_id, &jnl_config); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fset_jnl_config() failed.\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( pass ) { + + if ( counters[0] != 1 ) + { + pass = FALSE; + failure_mssg = "incorrect number of callback calls(3)."; + } + else if ( callback_test_cache_is_dirty ) + { + pass = FALSE; + failure_mssg = "callback found dirty cache(3)."; + } + else if ( ( callback_test_invalid_cache_ptr ) || + ( callback_test_null_config_ptr ) || + ( callback_test_invalid_config ) || + ( callback_test_null_data_ptr ) ) + { + pass = FALSE; + failure_mssg = "Bad parameter(s) to callback(3)."; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + + /* 7) Perform some more writes to the file. */ + + if ( pass ) { + + dims[0] = 6; + dims[1] = 8; + dataspace_id = H5Screate_simple(2, dims, NULL); + + if ( dataspace_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Screate_simple() failed."; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( pass ) { + + /* Create the dataset. */ + dataset_id = H5Dcreate2(file_id, "/dset1", H5T_STD_I32BE, + dataspace_id, H5P_DEFAULT, + H5P_DEFAULT, H5P_DEFAULT); + + if ( dataspace_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Dcreate2() failed."; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( pass ) { + + /* close the data set, and the data space */ + if ( ( H5Dclose(dataset_id) < 0 ) || + ( H5Sclose(dataspace_id) < 0 ) ) + { + pass = FALSE; + failure_mssg = "data set, or data space close failed."; + } + } + + if ( pass ) { + + if ( cache_ptr->slist_len <= 0 ) { + + pass = FALSE; + failure_mssg = "cache isnt' dirty?!?"; + } + } + + + /* 8) 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. + */ + + if ( pass ) { + + jnl_config.version = H5AC__CURR_JNL_CONFIG_VER; + + result = H5Fget_jnl_config(file_id, &jnl_config); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fget_jnl_config() failed.\n"; + } + + /* set journaling config fields to taste */ + jnl_config.enable_journaling = TRUE; + + HDstrcpy(jnl_config.journal_file_path, journal_filename); + + 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_human_readable = TRUE; + + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( pass ) { + + counters[0] = 0; + callback_test_cache_ptr = cache_ptr; + callback_test_invalid_cache_ptr = FALSE; + callback_test_null_config_ptr = FALSE; + callback_test_invalid_config = FALSE; + callback_test_null_data_ptr = FALSE; + callback_test_cache_is_dirty = FALSE; + callback_test_null_data_ptr_count = 0; + + result = H5Fset_jnl_config(file_id, &jnl_config); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fset_jnl_config() failed.\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( pass ) { + + if ( counters[0] != 1 ) + { + pass = FALSE; + failure_mssg = "incorrect number of callback calls(4)."; + } + else if ( callback_test_cache_is_dirty ) + { + pass = FALSE; + failure_mssg = "callback found dirty cache(4)."; + } + else if ( ( callback_test_invalid_cache_ptr ) || + ( callback_test_null_config_ptr ) || + ( callback_test_invalid_config ) || + ( callback_test_null_data_ptr ) ) + { + pass = FALSE; + failure_mssg = "Bad parameter(s) to callback(4)."; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + + /* 9) Deregister the callback, and close the file. Recall that + * 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; + expected_num_entries = 0; + expected_max_idx = -1; + + verify_mdjsc_table_config(cache_ptr, expected_table_len, + expected_num_entries, expected_max_idx, + free_entries); + + if ( file_id >= 0 ) { + + if ( H5Fclose(file_id) < 0 ) { + + if ( pass ) { + + pass = FALSE; + failure_mssg = "file close failed."; + } + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d *cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + + + /* 10) Re-open the file with journaling disabled, and register + * several callbacks. Ensure that at least one has NULL + * data_ptr. + */ + + open_existing_file_without_journaling(filename, &file_id, + &file_ptr, &cache_ptr); + + + register_mdjsc_callback(file_ptr, cache_ptr, test_mdjsc_callback, + &(counters[0]), &(indicies[0])); + register_mdjsc_callback(file_ptr, cache_ptr, test_mdjsc_callback, + NULL, &(indicies[1])); + 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; + expected_num_entries += 3; + expected_max_idx = 2; + + verify_mdjsc_table_config(cache_ptr, expected_table_len, + expected_num_entries, expected_max_idx, + free_entries); + + + /* 11) Enable journaling. Verify that the callbacks are called. */ + + if ( pass ) { + + jnl_config.version = H5AC__CURR_JNL_CONFIG_VER; + + result = H5Fget_jnl_config(file_id, &jnl_config); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fget_jnl_config() failed.\n"; + } + + /* set journaling config fields to taste */ + jnl_config.enable_journaling = TRUE; + + HDstrcpy(jnl_config.journal_file_path, journal_filename); + + 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_human_readable = TRUE; + + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( pass ) { + + counters[0] = 0; + callback_test_cache_ptr = cache_ptr; + callback_test_invalid_cache_ptr = FALSE; + callback_test_null_config_ptr = FALSE; + callback_test_invalid_config = FALSE; + callback_test_null_data_ptr = FALSE; + callback_test_cache_is_dirty = FALSE; + callback_test_null_data_ptr_count = 0; + + + result = H5Fset_jnl_config(file_id, &jnl_config); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fset_jnl_config() failed.\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( pass ) { + + if ( ( counters[0] != 1 ) && + ( counters[1] != 0 ) && + ( counters[2] != 1 ) && + ( counters[3] != 0 ) ) + { + pass = FALSE; + failure_mssg = "incorrect number of callback calls(5)."; + } + else if ( callback_test_cache_is_dirty ) + { + pass = FALSE; + failure_mssg = "callback found dirty cache(5)."; + } + else if ( ( callback_test_invalid_cache_ptr ) || + ( callback_test_null_config_ptr ) || + ( callback_test_invalid_config ) ) + { + pass = FALSE; + failure_mssg = "Bad parameter(s) to callback(5)."; + } + else if ( ( ! callback_test_null_data_ptr ) || + ( callback_test_null_data_ptr_count != 1 ) ) + { + pass = FALSE; + failure_mssg = "incorrect null data_ptr callbacks.(5)"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + + /* 12) Perform some writes to the file. */ + + if ( pass ) { + + dims[0] = 8; + dims[1] = 10; + dataspace_id = H5Screate_simple(2, dims, NULL); + + if ( dataspace_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Screate_simple() failed."; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( pass ) { + + /* Create the dataset. */ + dataset_id = H5Dcreate2(file_id, "/dset2", H5T_STD_I32BE, + dataspace_id, H5P_DEFAULT, + H5P_DEFAULT, H5P_DEFAULT); + + if ( dataspace_id < 0 ) { + + pass = FALSE; + failure_mssg = "H5Dcreate2() failed."; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( pass ) { + + /* close the data set, and the data space */ + if ( ( H5Dclose(dataset_id) < 0 ) || + ( H5Sclose(dataspace_id) < 0 ) ) + { + pass = FALSE; + failure_mssg = "data set, or data space close failed."; + } + } + + if ( pass ) { + + if ( cache_ptr->slist_len <= 0 ) { + + pass = FALSE; + failure_mssg = "cache isnt' dirty?!?"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + + /* 13) Register a great number of callbacks. */ + + for ( i = 3; i < max_callbacks; i++ ) + { + if ( ( pass ) && ( free_entries[i] ) ) + { + register_mdjsc_callback(file_ptr, cache_ptr, test_mdjsc_callback, + &(counters[i]), &(indicies[i])); + + HDassert( indicies[i] == i ); + + free_entries[i] = FALSE; + expected_num_entries++; + + if ( i > expected_max_idx ) { + + expected_max_idx = i; + } + + if ( expected_num_entries > expected_table_len ) { + + expected_table_len *= 2; + } + + verify_mdjsc_table_config(cache_ptr, expected_table_len, + expected_num_entries, expected_max_idx, + free_entries); + } + } + + HDassert( expected_num_entries == max_callbacks ); + HDassert( expected_max_idx == (max_callbacks - 1) ); + HDassert( expected_table_len == max_callbacks ); + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + + /* 14) Disable journaling. Verify that the callbacks are called. */ + + if ( pass ) { + + jnl_config.version = H5AC__CURR_JNL_CONFIG_VER; + + result = H5Fget_jnl_config(file_id, &jnl_config); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fget_jnl_config() failed.\n"; + } + + /* set journaling config fields to taste */ + jnl_config.enable_journaling = FALSE; + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( pass ) { + + for ( i = 0; i < max_callbacks; i++ ) + { + counters[i] = 0; + } + callback_test_cache_ptr = cache_ptr; + callback_test_invalid_cache_ptr = FALSE; + callback_test_null_config_ptr = FALSE; + callback_test_invalid_config = FALSE; + callback_test_null_data_ptr = FALSE; + callback_test_cache_is_dirty = FALSE; + callback_test_null_data_ptr_count = 0; + + result = H5Fset_jnl_config(file_id, &jnl_config); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fset_jnl_config() failed.\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( pass ) { + int max_counter = 0; + int counter_sum = 0; + + for ( i = 0; i < max_callbacks; i++ ) + { + if ( counters[i] > max_counter ) + { + max_counter = counters[i]; + } + counter_sum += counters[i]; + } + + if ( ( counters[1] != 0 ) || + ( max_counter != 1 ) || + ( counter_sum != max_callbacks - 1 ) ) + { + pass = FALSE; + failure_mssg = "incorrect number of callback calls(6)."; + } + else if ( callback_test_cache_is_dirty ) + { + pass = FALSE; + failure_mssg = "callback found dirty cache(6)."; + } + else if ( ( callback_test_invalid_cache_ptr ) || + ( callback_test_null_config_ptr ) || + ( callback_test_invalid_config ) ) + { + pass = FALSE; + failure_mssg = "Bad parameter(s) to callback(6)."; + } + else if ( ( ! callback_test_null_data_ptr ) || + ( callback_test_null_data_ptr_count != 1 ) ) + { + pass = FALSE; + failure_mssg = "incorrect null data_ptr callbacks.(6)"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + + /* 15) Deregister some of the callbacks. */ + + /* working from the top downwards, de-register all entries with + * indicies not divisible by 8. + */ + + for ( i = max_callbacks - 1; i >= 0; i-- ) + { + if ( ( pass ) && ( ! free_entries[i] ) && ( (i % 8) != 0 ) ) + { + deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[i]); + + indicies[i] = -1; + free_entries[i] = TRUE; + expected_num_entries--; + + if ( i == expected_max_idx ) + { + double fraction_in_use; + + while ( ( expected_max_idx >= 0 ) && + ( free_entries[expected_max_idx] ) ) + { + expected_max_idx--; + } + + fraction_in_use = ((double)expected_num_entries) / + ((double)expected_table_len); + + while ( ( expected_max_idx < (expected_table_len / 2) ) + && + ( fraction_in_use < + H5C__MDJSC_CB_TBL_MIN_ACTIVE_RATIO ) + && + ( (expected_table_len / 2) >= + H5C__MIN_MDJSC_CB_TBL_LEN ) + ) + { + expected_table_len /= 2; + } + } + + verify_mdjsc_table_config(cache_ptr, expected_table_len, + expected_num_entries, + expected_max_idx, + free_entries); + } + } + + HDassert( expected_num_entries == max_callbacks / 8 ); + HDassert( expected_max_idx == (max_callbacks - 8) ); + HDassert( expected_table_len == max_callbacks ); + + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + + /* 16) Enable journaling. Verify that the remaining callbacks are + * called. + */ + + if ( pass ) { + + jnl_config.version = H5AC__CURR_JNL_CONFIG_VER; + + result = H5Fget_jnl_config(file_id, &jnl_config); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fget_jnl_config() failed.\n"; + } + + /* set journaling config fields to taste */ + jnl_config.enable_journaling = TRUE; + + HDstrcpy(jnl_config.journal_file_path, journal_filename); + + 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_human_readable = TRUE; + + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( pass ) { + + for ( i = 0; i < max_callbacks; i++ ) + { + counters[i] = 0; + } + callback_test_cache_ptr = cache_ptr; + callback_test_invalid_cache_ptr = FALSE; + callback_test_null_config_ptr = FALSE; + callback_test_invalid_config = FALSE; + callback_test_null_data_ptr = FALSE; + callback_test_cache_is_dirty = FALSE; + callback_test_null_data_ptr_count = 0; + + result = H5Fset_jnl_config(file_id, &jnl_config); + + if ( result < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fset_jnl_config() failed.\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( pass ) { + int max_counter = 0; + int counter_sum = 0; + + for ( i = 0; i < max_callbacks; i++ ) + { + if ( counters[i] > max_counter ) + { + max_counter = counters[i]; + } + counter_sum += counters[i]; + } + + if ( ( max_counter != 1 ) || + ( counter_sum != ( max_callbacks / 8 ) ) ) + { + pass = FALSE; + failure_mssg = "incorrect number of callback calls(7)."; + } + else if ( callback_test_cache_is_dirty ) + { + pass = FALSE; + failure_mssg = "callback found dirty cache(7)."; + } + else if ( ( callback_test_invalid_cache_ptr ) || + ( callback_test_null_config_ptr ) || + ( callback_test_invalid_config ) ) + { + pass = FALSE; + failure_mssg = "Bad parameter(s) to callback(7)."; + } + else if ( ( callback_test_null_data_ptr ) || + ( callback_test_null_data_ptr_count != 0 ) ) + { + pass = FALSE; + failure_mssg = "incorrect null data_ptr callbacks.(6)"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + + /* 17) Deregister the remaining callbacks, and then close and delete + * the file. + */ + + for ( i = max_callbacks - 1; i >= 0; i-- ) + { + if ( ( pass ) && ( ! free_entries[i] ) ) + { + deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[i]); + + indicies[i] = -1; + free_entries[i] = TRUE; + expected_num_entries--; + + if ( i == expected_max_idx ) + { + double fraction_in_use; + + while ( ( expected_max_idx >= 0 ) && + ( free_entries[expected_max_idx] ) ) + { + expected_max_idx--; + } + + fraction_in_use = ((double)expected_num_entries) / + ((double)expected_table_len); + + while ( ( expected_max_idx < (expected_table_len / 2) ) + && + ( fraction_in_use < + H5C__MDJSC_CB_TBL_MIN_ACTIVE_RATIO ) + && + ( (expected_table_len / 2) >= + H5C__MIN_MDJSC_CB_TBL_LEN ) + ) + { + expected_table_len /= 2; + } + } + + verify_mdjsc_table_config(cache_ptr, expected_table_len, + expected_num_entries, + expected_max_idx, + free_entries); + } + } + + HDassert( expected_num_entries == 0 ); + HDassert( expected_max_idx == -1 ); + HDassert( expected_table_len == H5C__MIN_MDJSC_CB_TBL_LEN ); + + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + + /* Close the file, and tidy up. + */ + + if ( pass ) { + + if ( H5Fclose(file_id) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fclose() failed."; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + /* delete the HDF5 file and journal file */ +#if 1 + HDremove(filename); + HDremove(journal_filename); +#endif + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d done.\n", + fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + return; + +} /* verify_mdjsc_callback_execution() */ + + +/*************************************************************************** + * + * Function: verify_mdjsc_callback_registration_deregistration() + * + * 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. + * + * If anything is not as it should be, set pass to FALSE, + * and set failure_mssg to the appropriate error message. + * + * Do nothing and return if pass is false on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 8/15/08 + * + **************************************************************************/ + +static void +verify_mdjsc_callback_registration_deregistration(void) +{ + const char * fcn_name = + "verify_mdjsc_callback_registration_deregistration():"; + char filename[512]; + char journal_filename[H5AC__MAX_JOURNAL_FILE_NAME_LEN + 1]; + const int max_callbacks = 1024 * H5C__MIN_MDJSC_CB_TBL_LEN; + int counters[1024 * H5C__MIN_MDJSC_CB_TBL_LEN]; + int i; + int j; + int expected_num_entries = 0; + int expected_table_len = H5C__MIN_MDJSC_CB_TBL_LEN; + int expected_max_idx = -1; + int32_t indicies[1024 * H5C__MIN_MDJSC_CB_TBL_LEN]; + hbool_t free_entries[1024 * H5C__MIN_MDJSC_CB_TBL_LEN]; + hbool_t show_progress = FALSE; + hbool_t verbose = FALSE; + int cp = 0; + hid_t file_id = -1; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + + for ( i = 0; i < max_callbacks; i++ ) + { + counters[i] = 0; + free_entries[i] = TRUE; + indicies[i] = -1; + } + + /* 1) Open a file for journaling. It doesn't matter whether + * journaling is enabled or not, as this test is directed purely + * at the issue of whether the callback table is managed correctly. + * + * 2) Register a callback. Verify that is is added correctly to + * the metadata journaling status change callback table. + * + * 3) Deregister the callback. Verify that it is deleted correctly + * from the metadata journaling status change callback table. + * + * 4) Register H5C__MIN_MDJSC_CB_TBL_LEN - 1 callbacks. Verify that + * they are all correctly added to the table, and that the table + * is of size H5C__MIN_MDJSC_CB_TBL_LEN, and that it contains + * the expected number of entries. + * + * 5) Register one more entry. Verify that it is registered + * correctly, and that the table is now full. + * + * 6) Register another entry. Verify that is is correctly registered, + * that the table has doubled in size. + * + * 7) In LIFO order, deregister (H5C__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 H5C__MIN_MDJSC_CB_TBL_LEN. + * + * 9) Deregister all callbacks. Verify that the table is empty. + * + * 10) Register 8 * H5C__MIN_MDJSC_CB_TBL_LEN + 1 callbacks. Verify + * that all callbacks are registered, and that the table lenght grows + * to 16 * H5C__MIN_MDJSC_CB_TBL_LEN. + * + * 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 + * 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 + * does not shrink until the last callback is de-registered. + * + * 14) Register 8 * H5C__MIN_MDJSC_CB_TBL_LEN + 1 callbacks. Verify + * that all callbacks are registered, and that the table length grows + * to 16 * H5C__MIN_MDJSC_CB_TBL_LEN. + * + * 15) Starting with the highest index, deregister all entries with + * index not divisible by H5C__MIN_MDJSC_CB_TBL_LEN / 2. Verify + * that the callbacks are de-registers, and that the table does + * not shrink + * + * 16) Register H5C__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 >= H5C__MIN_MDJSC_CB_TBL_LEN and not divisible + * by H5C__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 + * slots freed by the dergistrations in 17) above. + * + * 19) Starting with the highest index, deregister all callbacks. + * Verify that the table shrinks as expected. + * + * 20) Do a torture tests -- forcing the number of registered callbacks + * into the thousands. After each registration and deregistration, + * verify that the table is configured as expected. + */ + + + /* 1) Open a file for journaling. It doesn't matter whether + * journaling is enabled or not, as this test is directed purely + * at the issue of whether the callback table is managed correctly. + */ + + /* setup the file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, + sizeof(filename)) == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed (1).\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, pass, cp++); + HDfflush(stdout); + } + + if ( verbose ) { + HDfprintf(stdout, "%s filename = \"%s\".\n", fcn_name, filename); + HDfflush(stdout); + } + + /* setup the journal file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[3], H5P_DEFAULT, journal_filename, + sizeof(journal_filename)) == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed (2).\n"; + } + else if ( HDstrlen(journal_filename) >= + H5AC__MAX_JOURNAL_FILE_NAME_LEN ) { + + pass = FALSE; + failure_mssg = "journal file name too long.\n"; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( verbose ) { + HDfprintf(stdout, "%s journal filename = \"%s\".\n", + fcn_name, journal_filename); + HDfflush(stdout); + } + + /* clean out any existing journal file */ + HDremove(journal_filename); + setup_cache_for_journaling(filename, journal_filename, &file_id, + &file_ptr, &cache_ptr, TRUE, FALSE, FALSE); + + + /* 2) Register a callback. Verify that is is added correctly to + * the metadata journaling status change callback table. + */ + j = 0; + + register_mdjsc_callback(file_ptr, cache_ptr, test_mdjsc_callback, + &(counters[j]), &(indicies[j])); + + free_entries[j] = FALSE; + expected_num_entries++; + expected_max_idx = 0; + + verify_mdjsc_table_config(cache_ptr, expected_table_len, + expected_num_entries, expected_max_idx, + free_entries); + + j++; + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + + /* 3) Deregister the callback. Verify that it is deleted correctly + * from the metadata journaling status change callback table. + */ + j--; + + deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[j]); + + free_entries[j] = TRUE; + expected_num_entries--; + expected_max_idx = -1; + + verify_mdjsc_table_config(cache_ptr, expected_table_len, + expected_num_entries, expected_max_idx, + free_entries); + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + + /* 4) Register H5C__MIN_MDJSC_CB_TBL_LEN - 1 callbacks. Verify that + * they are all correctly added to the table, and that the table + * is of size H5C__MIN_MDJSC_CB_TBL_LEN, and that it contains + * the expected number of entries. + */ + for ( i = 0; i < H5C__MIN_MDJSC_CB_TBL_LEN - 1; i++ ) + { + register_mdjsc_callback(file_ptr, cache_ptr, test_mdjsc_callback, + &(counters[j]), &(indicies[j])); + + free_entries[j] = FALSE; + expected_num_entries++; + expected_max_idx++; + + verify_mdjsc_table_config(cache_ptr, expected_table_len, + expected_num_entries, expected_max_idx, + free_entries); + + j++; + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + + /* 5) Register one more entry. Verify that it is registered + * correctly, and that the table is now full. + */ + + register_mdjsc_callback(file_ptr, cache_ptr, test_mdjsc_callback, + &(counters[j]), &(indicies[j])); + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + free_entries[j] = FALSE; + expected_num_entries++; + expected_max_idx++; + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + verify_mdjsc_table_config(cache_ptr, expected_table_len, + expected_num_entries, expected_max_idx, + free_entries); + + j++; + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + if ( ( pass ) && ( expected_num_entries != expected_table_len ) ) + { + pass = FALSE; + failure_mssg = "Unexpected table len(1)"; + } + + + /* 6) Register another entry. Verify that is is correctly registered, + * that the table has doubled in size. + */ + + register_mdjsc_callback(file_ptr, cache_ptr, test_mdjsc_callback, + &(counters[j]), &(indicies[j])); + + free_entries[j] = FALSE; + expected_num_entries++; + expected_max_idx++; + expected_table_len *= 2; + + verify_mdjsc_table_config(cache_ptr, expected_table_len, + expected_num_entries, expected_max_idx, + free_entries); + + j++; + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + + /* 7) In LIFO order, deregister (H5C__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. + */ + + for ( i = 0; i < (H5C__MIN_MDJSC_CB_TBL_LEN / 2) + 1; i++ ) + { + j--; + + deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[j]); + + free_entries[j] = TRUE; + expected_num_entries--; + expected_max_idx--; + + verify_mdjsc_table_config(cache_ptr, expected_table_len, + expected_num_entries, expected_max_idx, + free_entries); + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + + /* 8) Again, in LIFO order, deregister another callback. Verify that + * the callback is deregistered, and that the table has been reduced + * in size to H5C__MIN_MDJSC_CB_TBL_LEN. + */ + + j--; + + deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[j]); + + free_entries[j] = TRUE; + expected_num_entries--; + expected_max_idx--; + expected_table_len /= 2; + + verify_mdjsc_table_config(cache_ptr, expected_table_len, + expected_num_entries, expected_max_idx, + free_entries); + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + + /* 9) Deregister all callbacks. Verify that the table is empty. + */ + + while ( expected_num_entries > 0 ) + { + j--; + + deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[j]); + + free_entries[j] = TRUE; + expected_num_entries--; + expected_max_idx--; + + verify_mdjsc_table_config(cache_ptr, expected_table_len, + expected_num_entries, expected_max_idx, + free_entries); + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + + /* 10) Register 8 * H5C__MIN_MDJSC_CB_TBL_LEN + 1 callbacks. Verify + * that all callbacks are registered, and that the table length grows + * to 16 * H5C__MIN_MDJSC_CB_TBL_LEN. + */ + + for ( i = 0; i < ((8 * H5C__MIN_MDJSC_CB_TBL_LEN) + 1); i++ ) + { + register_mdjsc_callback(file_ptr, cache_ptr, test_mdjsc_callback, + &(counters[i]), &(indicies[i])); + + HDassert( indicies[i] == i ); + + free_entries[i] = FALSE; + expected_num_entries++; + expected_max_idx++; + + if ( expected_num_entries > expected_table_len ) { + + expected_table_len *= 2; + } + + verify_mdjsc_table_config(cache_ptr, expected_table_len, + expected_num_entries, expected_max_idx, + free_entries); + } + + HDassert( expected_table_len == 16 * H5C__MIN_MDJSC_CB_TBL_LEN ); + HDassert( expected_table_len < 1024 ); + HDassert( expected_max_idx == 8 * H5C__MIN_MDJSC_CB_TBL_LEN ); + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + + /* 11) Deregister all callbacks with even indicies. Verify the + * deregistrations. Verify that the table does not shrink. + */ + + for ( i = 0; i < (8 * H5C__MIN_MDJSC_CB_TBL_LEN) + 1; i += 2 ) + { + deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[i]); + + indicies[i] = -1; + free_entries[i] = TRUE; + expected_num_entries--; + + if ( i == expected_max_idx ) { + expected_max_idx--; + } + + verify_mdjsc_table_config(cache_ptr, expected_table_len, + expected_num_entries, expected_max_idx, + free_entries); + + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + + /* 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 + * 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 * H5C__MIN_MDJSC_CB_TBL_LEN. + */ + + j = 8 * H5C__MIN_MDJSC_CB_TBL_LEN; + + register_mdjsc_callback(file_ptr, cache_ptr, test_mdjsc_callback, + &(counters[j]), &(indicies[j])); + + HDassert( indicies[j] == j ); /* see comment above */ + free_entries[j] = FALSE; + expected_num_entries++; + + if ( j > expected_max_idx ) { + + expected_max_idx = j; + } + + verify_mdjsc_table_config(cache_ptr, expected_table_len, + expected_num_entries, expected_max_idx, + free_entries); + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + + /* 13) Starting with the lowest index, deregister all the callbacks. + * Verify the deregistrations, and also verify that the table + * does not shrink until the last callback is de-registered. + */ + + for ( i = 0; i < (8 * H5C__MIN_MDJSC_CB_TBL_LEN) + 1; i++ ) + { + if ( ! free_entries[i] ) + { + deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[i]); + + indicies[i] = -1; + free_entries[i] = TRUE; + expected_num_entries--; + + if ( i == expected_max_idx ) + { + expected_max_idx = -1; + expected_table_len = H5C__MIN_MDJSC_CB_TBL_LEN; + } + + verify_mdjsc_table_config(cache_ptr, expected_table_len, + expected_num_entries, expected_max_idx, + free_entries); + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + + /* 14) Register 8 * H5C__MIN_MDJSC_CB_TBL_LEN + 1 callbacks. Verify + * that all callbacks are registered, and that the table length grows + * to 16 * H5C__MIN_MDJSC_CB_TBL_LEN. + */ + + for ( i = 0; i < ((8 * H5C__MIN_MDJSC_CB_TBL_LEN) + 1); i++ ) + { + register_mdjsc_callback(file_ptr, cache_ptr, test_mdjsc_callback, + &(counters[i]), &(indicies[i])); + + HDassert( indicies[i] == i ); + + free_entries[i] = FALSE; + expected_num_entries++; + expected_max_idx++; + + if ( expected_num_entries > expected_table_len ) { + + expected_table_len *= 2; + } + + verify_mdjsc_table_config(cache_ptr, expected_table_len, + expected_num_entries, expected_max_idx, + free_entries); + } + + HDassert( expected_table_len == 16 * H5C__MIN_MDJSC_CB_TBL_LEN ); + HDassert( expected_table_len < 1024 ); + HDassert( expected_max_idx == 8 * H5C__MIN_MDJSC_CB_TBL_LEN ); + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + + /* 15) Starting with the highest index, deregister all entries with + * index not divisible by H5C__MIN_MDJSC_CB_TBL_LEN / 2. Verify + * that the callbacks are de-registers, and that the table does + * not shrink + */ + + for ( i = (8 * H5C__MIN_MDJSC_CB_TBL_LEN); i >= 0; i-- ) + { + if ( ( ! free_entries[i] ) && + ( (i % (H5C__MIN_MDJSC_CB_TBL_LEN /2)) != 0 ) ) + { + deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[i]); + + indicies[i] = -1; + free_entries[i] = TRUE; + expected_num_entries--; + + if ( i == expected_max_idx ) + { + expected_max_idx = -1; + } + + verify_mdjsc_table_config(cache_ptr, expected_table_len, + expected_num_entries, expected_max_idx, + free_entries); + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + + /* 16) Register H5C__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 + * 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. + */ + + j = 1; + + for ( i = 0; i < H5C__MIN_MDJSC_CB_TBL_LEN / 2; i++ ) + { + while ( ! free_entries[j] ) + { + j++; + } + + register_mdjsc_callback(file_ptr, cache_ptr, test_mdjsc_callback, + &(counters[j]), &(indicies[j])); + + HDassert( indicies[j] == j ); /* see comment above */ + free_entries[j] = FALSE; + expected_num_entries++; + + if ( j > expected_max_idx ) { + + expected_max_idx = j; + } + + verify_mdjsc_table_config(cache_ptr, expected_table_len, + expected_num_entries, expected_max_idx, + free_entries); + } + + HDassert( j == (H5C__MIN_MDJSC_CB_TBL_LEN / 2) + 1 ); + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + + /* 17) Starting with the lowest index, deregister all entries with + * index with index >= H5C__MIN_MDJSC_CB_TBL_LEN and not divisible + * by H5C__MIN_MDJSC_CB_TBL_LEN. Verify that the callbacks are + * deregistered, and that the table does not shrink. + */ + + for ( i = H5C__MIN_MDJSC_CB_TBL_LEN; + i < (8 * H5C__MIN_MDJSC_CB_TBL_LEN) + 1; + i++ ) + { + if ( ( ! free_entries[i] ) && + ( (i % H5C__MIN_MDJSC_CB_TBL_LEN) != 0 ) ) + { + deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[i]); + + indicies[i] = -1; + free_entries[i] = TRUE; + expected_num_entries--; + + if ( i == expected_max_idx ) + { + expected_max_idx = -1; + } + + verify_mdjsc_table_config(cache_ptr, expected_table_len, + expected_num_entries, expected_max_idx, + free_entries); + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + + /* 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 + * 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 * H5C__MIN_MDJSC_CB_TBL_LEN) + + * (H5C__MIN_MDJSC_CB_TBL_LEN / 2). + */ + + j = (7 * H5C__MIN_MDJSC_CB_TBL_LEN) + (H5C__MIN_MDJSC_CB_TBL_LEN / 2); + + register_mdjsc_callback(file_ptr, cache_ptr, test_mdjsc_callback, + &(counters[j]), &(indicies[j])); + + HDassert( indicies[j] == j ); /* see comment above */ + free_entries[j] = FALSE; + expected_num_entries++; + + if ( j > expected_max_idx ) { + + expected_max_idx = j; + } + + verify_mdjsc_table_config(cache_ptr, expected_table_len, + expected_num_entries, expected_max_idx, + free_entries); + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + + /* 19) Starting with the highest index, deregister all callbacks. + * Verify that the table shrinks as expected. + */ + + for ( i = (8 * H5C__MIN_MDJSC_CB_TBL_LEN); i >= 0; i-- ) + { + if ( ( pass ) && ( ! free_entries[i] ) ) + { + deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[i]); + + indicies[i] = -1; + free_entries[i] = TRUE; + expected_num_entries--; + + if ( i == expected_max_idx ) + { + double fraction_in_use; + + while ( ( expected_max_idx >= 0 ) && + ( free_entries[expected_max_idx] ) ) + { + expected_max_idx--; + } + + fraction_in_use = ((double)expected_num_entries) / + ((double)expected_table_len); + + + if ( ( expected_max_idx < (expected_table_len / 2) ) + && + ( fraction_in_use < H5C__MDJSC_CB_TBL_MIN_ACTIVE_RATIO ) + && + ( (expected_table_len / 2) >= H5C__MIN_MDJSC_CB_TBL_LEN ) + ) + { + expected_table_len /= 2; + } + } + + verify_mdjsc_table_config(cache_ptr, expected_table_len, + expected_num_entries, expected_max_idx, + free_entries); + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + + /* 20) Do a torture tests -- forcing the number of registered callbacks + * into the thousands. After each registration and deregistration, + * verify that the table is configured as expected. + */ + + /* register half the maximum number of callbacks in this test */ + + for ( i = 0; i < (max_callbacks / 2); i++ ) + { + register_mdjsc_callback(file_ptr, cache_ptr, test_mdjsc_callback, + &(counters[i]), &(indicies[i])); + + HDassert( indicies[i] == i ); + + free_entries[i] = FALSE; + expected_num_entries++; + expected_max_idx++; + + if ( expected_num_entries > expected_table_len ) { + + expected_table_len *= 2; + } + + verify_mdjsc_table_config(cache_ptr, expected_table_len, + expected_num_entries, expected_max_idx, + free_entries); + } + + HDassert( expected_table_len == (max_callbacks / 2) ); + HDassert( expected_max_idx == ((max_callbacks / 2) - 1) ); + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + + /* 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-- ) + { + if ( ( pass ) && ( ! free_entries[i] ) && ( (i % 2) == 1 ) ) + { + deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[i]); + + indicies[i] = -1; + free_entries[i] = TRUE; + expected_num_entries--; + + if ( i == expected_max_idx ) + { + double fraction_in_use; + + while ( ( expected_max_idx >= 0 ) && + ( free_entries[expected_max_idx] ) ) + { + expected_max_idx--; + } + + fraction_in_use = ((double)expected_num_entries) / + ((double)expected_table_len); + + + if ( ( expected_max_idx < (expected_table_len / 2) ) + && + ( fraction_in_use < H5C__MDJSC_CB_TBL_MIN_ACTIVE_RATIO ) + && + ( (expected_table_len / 2) >= H5C__MIN_MDJSC_CB_TBL_LEN ) + ) + { + expected_table_len /= 2; + } + } + + verify_mdjsc_table_config(cache_ptr, expected_table_len, + expected_num_entries, expected_max_idx, + free_entries); + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + /* 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 + * the reverse of the order they were deregistered in. + */ + + for ( i = (max_callbacks / 8); i <= (3 * max_callbacks / 8); i++ ) + { + if ( ( pass ) && ( free_entries[i] ) && ( (i % 2) == 1 ) ) + { + register_mdjsc_callback(file_ptr, cache_ptr, test_mdjsc_callback, + &(counters[i]), &(indicies[i])); + + HDassert( indicies[i] == i ); + + free_entries[i] = FALSE; + expected_num_entries++; + + if ( i > expected_max_idx ) { + + expected_max_idx = i; + } + + if ( expected_num_entries > expected_table_len ) { + + expected_table_len *= 2; + } + + verify_mdjsc_table_config(cache_ptr, expected_table_len, + expected_num_entries, expected_max_idx, + free_entries); + } + } + + HDassert( expected_num_entries == (max_callbacks / 2) ); + HDassert( expected_max_idx == ((max_callbacks / 2) - 1) ); + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + /* now register more entries up to max_callbacks */ + + for ( i = (max_callbacks / 2); i < max_callbacks; i++ ) + { + if ( ( pass ) && ( free_entries[i] ) ) + { + register_mdjsc_callback(file_ptr, cache_ptr, test_mdjsc_callback, + &(counters[i]), &(indicies[i])); + + HDassert( indicies[i] == i ); + + free_entries[i] = FALSE; + expected_num_entries++; + + if ( i > expected_max_idx ) { + + expected_max_idx = i; + } + + if ( expected_num_entries > expected_table_len ) { + + expected_table_len *= 2; + } + + verify_mdjsc_table_config(cache_ptr, expected_table_len, + expected_num_entries, expected_max_idx, + free_entries); + } + } + + HDassert( expected_num_entries == max_callbacks ); + HDassert( expected_max_idx == (max_callbacks - 1) ); + HDassert( expected_table_len == max_callbacks ); + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + + /* deregister every other 200 callbacks on increasing index */ + for ( i = 0; i < max_callbacks; i += 200 ) + { + for ( j = i; ( ( i < j + 200 ) && ( j < max_callbacks ) ); j++ ) + { + if ( ( pass ) && ( ! free_entries[i] ) ) + { + deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[i]); + + indicies[i] = -1; + free_entries[i] = TRUE; + expected_num_entries--; + + if ( i == expected_max_idx ) + { + double fraction_in_use; + + while ( ( expected_max_idx >= 0 ) && + ( free_entries[expected_max_idx] ) ) + { + expected_max_idx--; + } + + fraction_in_use = ((double)expected_num_entries) / + ((double)expected_table_len); + + if ( ( expected_max_idx < (expected_table_len / 2) ) + && + ( fraction_in_use < + H5C__MDJSC_CB_TBL_MIN_ACTIVE_RATIO ) + && + ( (expected_table_len / 2) >= + H5C__MIN_MDJSC_CB_TBL_LEN ) + ) + { + expected_table_len /= 2; + } + } + + verify_mdjsc_table_config(cache_ptr, expected_table_len, + expected_num_entries, + expected_max_idx, + free_entries); + } + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + + /* working from the top downwards, de-register all entries with + * indicies not divisible by 3. + */ + + for ( i = max_callbacks - 1; i >= 0; i-- ) + { + if ( ( pass ) && ( ! free_entries[i] ) && ( (i % 3) != 0 ) ) + { + deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[i]); + + indicies[i] = -1; + free_entries[i] = TRUE; + expected_num_entries--; + + if ( i == expected_max_idx ) + { + double fraction_in_use; + + while ( ( expected_max_idx >= 0 ) && + ( free_entries[expected_max_idx] ) ) + { + expected_max_idx--; + } + + fraction_in_use = ((double)expected_num_entries) / + ((double)expected_table_len); + + while ( ( expected_max_idx < (expected_table_len / 2) ) + && + ( fraction_in_use < + H5C__MDJSC_CB_TBL_MIN_ACTIVE_RATIO ) + && + ( (expected_table_len / 2) >= + H5C__MIN_MDJSC_CB_TBL_LEN ) + ) + { + expected_table_len /= 2; + } + } + + verify_mdjsc_table_config(cache_ptr, expected_table_len, + expected_num_entries, + expected_max_idx, + free_entries); + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + + /* working from low index up, deregister all entries with index + * greater than (max_callbacks / 8). + */ + + for ( i = (max_callbacks / 8); i < max_callbacks; i++ ) + { + if ( ( pass ) && ( ! free_entries[i] ) ) + { + deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[i]); + + indicies[i] = -1; + free_entries[i] = TRUE; + expected_num_entries--; + + if ( i == expected_max_idx ) + { + double fraction_in_use; + + while ( ( expected_max_idx >= 0 ) && + ( free_entries[expected_max_idx] ) ) + { + expected_max_idx--; + } + + fraction_in_use = ((double)expected_num_entries) / + ((double)expected_table_len); + + while ( ( expected_max_idx < (expected_table_len / 2) ) + && + ( fraction_in_use < + H5C__MDJSC_CB_TBL_MIN_ACTIVE_RATIO ) + && + ( (expected_table_len / 2) >= + H5C__MIN_MDJSC_CB_TBL_LEN ) + ) + { + expected_table_len /= 2; + } + } + + verify_mdjsc_table_config(cache_ptr, expected_table_len, + expected_num_entries, + expected_max_idx, + free_entries); + } + } + + HDassert( expected_table_len == (max_callbacks / 8) ); + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + + /* working from the top down, deregister the remaining callbacks. */ + + for ( i = (max_callbacks / 8); i >= 0; i-- ) + { + if ( ( pass ) && ( ! free_entries[i] ) ) + { + deregister_mdjsc_callback(file_ptr, cache_ptr, indicies[i]); + + indicies[i] = -1; + free_entries[i] = TRUE; + expected_num_entries--; + + if ( i == expected_max_idx ) + { + double fraction_in_use; + + while ( ( expected_max_idx >= 0 ) && + ( free_entries[expected_max_idx] ) ) + { + expected_max_idx--; + } + + fraction_in_use = ((double)expected_num_entries) / + ((double)expected_table_len); + + while ( ( expected_max_idx < (expected_table_len / 2) ) + && + ( fraction_in_use < + H5C__MDJSC_CB_TBL_MIN_ACTIVE_RATIO ) + && + ( (expected_table_len / 2) >= + H5C__MIN_MDJSC_CB_TBL_LEN ) + ) + { + expected_table_len /= 2; + } + } + + verify_mdjsc_table_config(cache_ptr, expected_table_len, + expected_num_entries, + expected_max_idx, + free_entries); + } + } + + HDassert( expected_table_len == H5C__MIN_MDJSC_CB_TBL_LEN ); + HDassert( expected_num_entries == 0 ); + HDassert( expected_max_idx == -1 ); + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + + /* Close the file, and tidy up. + */ + + if ( pass ) { + + if ( H5Fclose(file_id) < 0 ) { + + pass = FALSE; + failure_mssg = "H5Fclose() failed."; + } + } + + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d.\n", fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + /* delete the HDF5 file and journal file */ +#if 1 + HDremove(filename); + HDremove(journal_filename); +#endif + if ( show_progress ) { + + HDfprintf(stdout, "%s%d cp = %d done.\n", + fcn_name, (int)pass, cp++); + HDfflush(stdout); + } + + return; + +} /* verify_mdjsc_callback_registration_deregistration() */ + + +/*************************************************************************** + * Function: check_buffer_writes + * + * Purpose: Verify the function H5C_jb__write_to_buffer properly writes + * messages of varying sizes into the journal buffers, and + * that the journal buffers properly flush out when filled. + * + * Return: void + * + * Programmer: Mike McGreevy + * Thursday, February 21, 2008 + * + * Changes: John Mainzer -- 4/16/09 + * Updated for the addition of new parameters to + * H5C_jb__init(). + * + **************************************************************************/ + +static void +check_buffer_writes(hbool_t use_aio) +{ + const char * fcn_name = "check_buffer_writes(): "; + char filename[512]; + int i; + herr_t result; + H5C_jbrb_t jbrb_struct; + FILE * readback; + hbool_t show_progress = FALSE; + int32_t checkpoint = 1; + char filldata[12][100]; + int repeatnum[12]; + + if ( use_aio ) { + + TESTING("metadata buffer & file aio writes"); + + } else { + + TESTING("metadata buffer & file sio writes"); + } + + pass = TRUE; + + /* Initialize data to get written as tests */ + HDmemcpy(filldata[0], "abcdefghijklmn\n", 16); + HDmemcpy(filldata[1], "ABCDEFGHIJKLMNO\n", 17); + HDmemcpy(filldata[2], "AaBbCcDdEeFfGgHh\n", 18); + 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", + 48); + 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); + HDassert(HDstrlen(filldata[2]) == 17); + HDassert(HDstrlen(filldata[3]) == 31); + HDassert(HDstrlen(filldata[4]) == 32); + HDassert(HDstrlen(filldata[5]) == 33); + HDassert(HDstrlen(filldata[6]) == 47); + HDassert(HDstrlen(filldata[7]) == 48); + HDassert(HDstrlen(filldata[8]) == 49); + HDassert(HDstrlen(filldata[9]) == 95); + HDassert(HDstrlen(filldata[10]) == 96); + HDassert(HDstrlen(filldata[11]) == 97); + + /* Give structure its magic number */ + jbrb_struct.magic = H5C__H5C_JBRB_T_MAGIC; + + if ( show_progress ) /* 1 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* setup the file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, sizeof(filename)) + == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 2 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Initialize H5C_jbrb_t structure. */ + if ( pass ) { + + /* Note that the sizeof_addr & sizeof_size parameters are + * ignored when human_readable is TRUE. + */ + + result = H5C_jb__init(/* H5C_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 */ use_aio, + /* human readable journal */ TRUE, + /* sizeof_addr */ 8, + /* sizeof_size */ 8); + + if ( result != 0) { + + pass = FALSE; + failure_mssg = "H5C_jb_init failed, check 1"; + + } /* end if */ + + } /* end if */ + + /* generate the header message manually */ + if ( pass ) { + + if ( H5C_jb__write_header_entry(&jbrb_struct) != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__write_header_entry failed"; + } + } + + if ( show_progress ) /* 3 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Flush and truncate journal file to get rid of the header + * message for subsequent tests. */ + if ( pass ) { + + if ( H5C_jb__flush(&jbrb_struct) != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb_flush failed"; + + } /* end if */ + + } /* end if */ + + /* Truncate journal file */ + if ( pass ) { + + if ( H5C_jb__trunc(&jbrb_struct) != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb_trunc failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 4 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* 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 + */ + + for (i=0; i<12; 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, + checkpoint++, (int)pass); + + } /* 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 + * H5C_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 + within the write_noflush_verify calls. */ + repeatnum[0] = 16; + repeatnum[1] = 6; + repeatnum[2] = 16; + repeatnum[3] = 16; + repeatnum[4] = 6; + repeatnum[5] = 16; + repeatnum[6] = 16; + repeatnum[7] = 6; + repeatnum[8] = 16; + repeatnum[9] = 16; + repeatnum[10] = 6; + repeatnum[11] = 16; + + for (i=0; i<12; i++) { + + write_noflush_verify(&jbrb_struct, + (int)HDstrlen(filldata[i]), + filldata[i], + readback, + repeatnum[i]); + + if ( show_progress ) + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + } /* end for */ + + /* close journal file pointer */ + fclose(readback); + + /* Truncate the journal file */ + if ( pass ) { + + if ( H5C_jb__trunc(&jbrb_struct) != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__trunc failed"; + + } /* end if */ + + } /* end if */ + + /* take down the journal file */ + if ( pass ) { + + if (H5C_jb__takedown(&jbrb_struct) != SUCCEED) { + + pass = FALSE; + failure_mssg = "H5C_jb__takedown failed"; + + } /* end if */ + + } /* end if */ + + /* report pass / failure information */ + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + failures++; + HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + + } + + return; + +} /* check_buffer_writes */ + + + +/*************************************************************************** + * Function: write_flush_verify + * + * 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. + * + * Return: void + * + * Programmer: Mike McGreevy + * Thursday, February 21, 2008 + * + **************************************************************************/ +static void +write_flush_verify(H5C_jbrb_t * struct_ptr, + int size, + char * data, + FILE * readback) +{ + char verify[150]; + + if ( pass ) { + + if ( H5C_jb__write_to_buffer(struct_ptr, (size_t)size, + data, 0, (uint64_t)0) != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__write_to_buffer failed"; + + } /* end if */ + + } /* end if */ + + if ( pass ) { + + if ( H5C_jb__flush(struct_ptr) != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb_flush failed"; + + } /* end if */ + + } /* end if */ + + if ( pass ) { + + fgets(verify, size+10, readback); + + if (HDstrcmp(verify, data) != 0) { + + pass = FALSE; + failure_mssg = "Journal entry not written correctly"; + + } /* end if */ + + } /* end if */ + + return; + +} /* write_flush_verify */ + + + +/*************************************************************************** + * Function: write_noflush_verify + * + * 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 + * called, and the data is read back from the journal file and + * verified for correctness. + * + * Return: void + * + * Programmer: Mike McGreevy + * Thursday, February 21, 2008 + * + **************************************************************************/ +static void +write_noflush_verify(H5C_jbrb_t * struct_ptr, + int size, + char * data, + FILE * readback, + int repeats) +{ + int i; + char verify[150]; + + for (i=0; i + * Tuesday, February 26, 2008 + * + * Changes: JRM -- 3/21/09 + * Updated test to handle the new journal creation time strings + * in which all white space is replaced with underscores. + * + * JRM -- 4/16/09 + * Updated for the addition of new parameters to + * H5C_jb__init(). + * + **************************************************************************/ +static void +check_message_format(void) +{ + const char * fcn_name = "check_message_format(): "; + char filename[512]; + char time_buf[32]; + char verify[9][500]; + char from_journal[9][500]; + char * p; + hbool_t show_progress = FALSE; + int32_t checkpoint = 1; + int i; + herr_t result; + FILE * readback; + H5C_jbrb_t jbrb_struct; + time_t current_date; + + TESTING("journal file message format"); + + pass = TRUE; + + /* setup the file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, sizeof(filename)) + == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed"; + + } /* end if */ + + } /* end if */ + + /* Give structure its magic number */ + jbrb_struct.magic = H5C__H5C_JBRB_T_MAGIC; + + /* Initialize H5C_jbrb_t structure. */ + if ( pass ) { + + /* Note that the sizeof_addr & sizeof_size parameters are + * ignored when human_readable is TRUE. + */ + + result = H5C_jb__init(/* H5C_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, + /* human readable journal */ TRUE, + /* sizeof_addr */ 8, + /* sizeof_size */ 8); + + if ( result != 0) { + + pass = FALSE; + failure_mssg = "H5C_jb_init failed, check 2"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 1 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Start a transaction */ + if ( pass ) { + + if ( H5C_jb__start_transaction(/* H5C_jbrb_t */ &jbrb_struct, + /* trans number */ (uint64_t)1) + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__start_transaction failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 2 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Write a journal entry */ + if ( pass ) { + + if ( H5C_jb__journal_entry(/* H5C_jbrb_t */ &jbrb_struct, + /* trans number */ (uint64_t)1, + /* base address */ (haddr_t)0, + /* data length */ 1, + /* data */ (const uint8_t *)"A") + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__journal_entry failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 3 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Write a journal entry */ + if ( pass ) { + + if ( H5C_jb__journal_entry(/* H5C_jbrb_t */ &jbrb_struct, + /* trans number */ (uint64_t)1, + /* base address */ (haddr_t)1, + /* data length */ 2, + /* data */ (const uint8_t *)"AB") + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__journal_entry failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 4 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Write a journal entry */ + if ( pass ) { + + if ( H5C_jb__journal_entry(/* H5C_jbrb_t */ &jbrb_struct, + /* trans number */ (uint64_t)1, + /* base address */ (haddr_t)3, + /* data length */ 4, + /* data */ (const uint8_t *)"CDEF") + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__journal_entry failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 5 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* End transaction */ + if ( pass ) { + if ( H5C_jb__end_transaction(/* H5C_jbrb_t */ &jbrb_struct, + /* trans number */ (uint64_t)1) + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__end_transaction failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 6 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Start a transaction */ + if ( pass ) { + + if ( H5C_jb__start_transaction(/* H5C_jbrb_t */ &jbrb_struct, + /* trans number */ (uint64_t)2) + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__start_transaction failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 7 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Write a journal entry */ + if ( pass ) { + + if ( H5C_jb__journal_entry(/* H5C_jbrb_t */ &jbrb_struct, + /* trans number */ (uint64_t)2, + /* base address */ (haddr_t)285, + /* data length */ 11, + /* data */ (const uint8_t *)"Test Data?!") + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__journal_entry failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 8 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* End transaction */ + if ( pass ) { + if ( H5C_jb__end_transaction(/* H5C_jbrb_t */ &jbrb_struct, + /* trans number */ (uint64_t)2) + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__end_transaction failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 9 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Flush the journal buffers. */ + if ( pass ) { + + if ( H5C_jb__flush(/* H5C_jbrb_t */ &jbrb_struct) + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__flush failed"; + + } /* end if */ + + } /* end if */ + + if ( pass ) { + + current_date = time(NULL); + + /* load ascii representation of current_date into time_buf[], + * replacing white space with underscores. + */ + time_buf[31] = '\0'; /* just to be safe */ + + if ( (p = HDctime(¤t_date)) == NULL ) { + + pass = FALSE; + failure_mssg = "HDctime() failed"; + + } else { + + /* copy the string into time_buf, replacing white space with + * underscores. + * + * Do this to make parsing the header easier. + */ + i = 0; + + while ( ( i < 31 ) && ( *p != '\0' ) ) { + + if ( isspace(*p) ) { + + time_buf[i] = '_'; + + } else { + + time_buf[i] = *p; + } + + i++; + p++; + } + + time_buf[i] = '\0'; + } + } + + if ( show_progress ) /* 10 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + if ( pass ) { + + /* Fill out verify array with expected messages */ + sprintf(verify[0], "0 ver_num 1 target_file_name HDF5.file journal_magic 123 creation_date %10.10s human_readable 1\n", time_buf); + sprintf(verify[1], "1 bgn_trans 1\n"); + sprintf(verify[2], "2 trans_num 1 length 1 base_addr 0x0 body 41 \n"); + sprintf(verify[3], "2 trans_num 1 length 2 base_addr 0x1 body 41 42 \n"); + sprintf(verify[4], "2 trans_num 1 length 4 base_addr 0x3 body 43 44 45 46 \n"); + sprintf(verify[5], "3 end_trans 1\n"); + sprintf(verify[6], "1 bgn_trans 2\n"); + sprintf(verify[7], "2 trans_num 2 length 11 base_addr 0x11d body 54 65 73 74 20 44 61 74 61 3f 21 \n"); + sprintf(verify[8], "3 end_trans 2\n"); + + /* verify that messages in journal are same as expected */ + readback = fopen(filename, "r"); + for (i = 0; i < 9; i++) { + + if ( pass) { + + fgets(from_journal[i], 300, readback); + + if ( HDstrcmp(verify[i], from_journal[i]) != 0) { + + if ( show_progress ) { + + HDfprintf(stdout, "verify[%d] = \"%s\"\n", + i, verify[i]); + HDfprintf(stdout, "from_journal[%d] = \"%s\"\n", + i, from_journal[i]); + } + + pass = FALSE; + failure_mssg = "journal file not written correctly 1"; + + } /* end if */ + + } /* end if */ + + } /* end for */ + + fclose(readback); + } + + /* Truncate the journal file */ + if ( pass ) { + + if ( H5C_jb__trunc(&jbrb_struct) != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__trunc failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 11 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Start a transaction */ + if ( pass ) { + + if ( H5C_jb__start_transaction(/* H5C_jbrb_t */ &jbrb_struct, + /* trans number */ (uint64_t)3) + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__start_transaction failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 12 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Write a journal entry */ + if ( pass ) { + + if ( H5C_jb__journal_entry(/* H5C_jbrb_t */ &jbrb_struct, + /* trans number */ (uint64_t)3, + /* base address */ (haddr_t)28591, + /* data length */ 6, + /* data */ (const uint8_t *)"#1nN`}") + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__journal_entry failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 13 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* End transaction */ + if ( pass ) { + if ( H5C_jb__end_transaction(/* H5C_jbrb_t */ &jbrb_struct, + /* trans number */ (uint64_t)3) + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__end_transaction failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 14 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Add a comment */ + if ( pass ) { + if ( H5C_jb__comment(/* H5C_jbrb_t */ &jbrb_struct, + /* comment message */ "This is a comment!") + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__comment failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 14 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Add a comment */ + if ( pass ) { + if ( H5C_jb__comment(/* H5C_jbrb_t */ &jbrb_struct, + /* comment message */ "This is another comment!") + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__comment failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 14 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Flush the journal buffers. */ + if ( pass ) { + + if ( H5C_jb__flush(/* H5C_jbrb_t */ &jbrb_struct) + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__flush failed"; + + } /* end if */ + + } /* end if */ + + if ( pass ) { + + current_date = time(NULL); + + /* load ascii representation of current_date into time_buf[], + * replacing white space with underscores. + */ + + time_buf[31] = '\0'; /* just to be safe */ + + if ( (p = HDctime(¤t_date)) == NULL ) { + + pass = FALSE; + failure_mssg = "HDctime() failed"; + + } else { + + /* copy the string into time_buf, replacing white space with + * underscores. + * + * Do this to make parsing the header easier. + */ + i = 0; + + while ( ( i < 31 ) && ( *p != '\0' ) ) { + + if ( isspace(*p) ) { + + time_buf[i] = '_'; + + } else { + + time_buf[i] = *p; + } + + i++; + p++; + } + + time_buf[i] = '\0'; + } + } + + if ( show_progress ) /* 15 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + if ( pass ) { + + /* Fill out verify array with expected messages */ + sprintf(verify[0], "0 ver_num 1 target_file_name HDF5.file journal_magic 123 creation_date %10.10s human_readable 1\n", time_buf); + sprintf(verify[1], "1 bgn_trans 3\n"); + sprintf(verify[2], "2 trans_num 3 length 6 base_addr 0x6faf body 23 31 6e 4e 60 7d \n"); + sprintf(verify[3], "3 end_trans 3\n"); + sprintf(verify[4], "C comment This is a comment!\n"); + sprintf(verify[5], "C comment This is another comment!\n"); + + /* verify that messages in journal are same as expected */ + readback = fopen(filename, "r"); + for (i = 0; i < 6; i++) { + + if ( pass) { + + fgets(from_journal[i], 300, readback); + + if ( HDstrcmp(verify[i], from_journal[i]) != 0) { + + if ( show_progress ) { + + HDfprintf(stdout, "verify[%d] = \"%s\"\n", + i, verify[i]); + HDfprintf(stdout, "from_journal[%d] = \"%s\"\n", + i, from_journal[i]); + } + + pass = FALSE; + failure_mssg = "journal file not written correctly 2"; + + } /* end if */ + + } /* end if */ + + } /* end for */ + + fclose(readback); + } + + /* Truncate the journal file */ + if ( pass ) { + + if ( H5C_jb__trunc(&jbrb_struct) != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__trunc failed"; + + } /* end if */ + + } /* end if */ + + /* take down the journal file */ + if ( pass ) { + + if (H5C_jb__takedown(&jbrb_struct) != SUCCEED) { + + pass = FALSE; + failure_mssg = "H5C_jb__takedown failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 16 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* report pass / failure information */ + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + failures++; + HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + + } + + return; + +} /* end check_message_format */ + + +/*************************************************************************** + * Function: check_binary_message_format + * + * 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 + * for the human readable journal messages. Unlike Mike's + * code, it also tests the eoa message. + * + * Return: void + * + * Programmer: John Mainzer + * 5/2/09 + * + * Changes: None. + * + **************************************************************************/ + +static void +check_binary_message_format(void) +{ + const char * fcn_name = "check_binary_message_format()"; + char filename[512]; + char time_buf[32]; + char * p; + hbool_t show_progress = FALSE; + int32_t checkpoint = 1; + int i; + int fd; + herr_t result; + H5C_jbrb_t jbrb_struct; + time_t current_date; + + TESTING("binary journal file message format"); + + pass = TRUE; + + /* setup the file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, sizeof(filename)) + == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed"; + + } /* end if */ + + } /* end if */ + + /* Give structure its magic number */ + jbrb_struct.magic = H5C__H5C_JBRB_T_MAGIC; + + /* Initialize H5C_jbrb_t structure. */ + if ( pass ) { + + /* Note that the sizeof_addr & sizeof_size parameters are + * ignored when human_readable is TRUE. + */ + + result = H5C_jb__init(/* H5C_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, + /* human readable journal */ FALSE, + /* sizeof_addr */ 8, + /* sizeof_size */ 8); + + if ( result != 0) { + + pass = FALSE; + failure_mssg = "H5C_jb_init failed, check 2"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 1 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Start a transaction */ + if ( pass ) { + + if ( H5C_jb__start_transaction(/* H5C_jbrb_t */ &jbrb_struct, + /* trans number */ (uint64_t)1) + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__start_transaction failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 2 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Write a journal entry */ + if ( pass ) { + + if ( H5C_jb__journal_entry(/* H5C_jbrb_t */ &jbrb_struct, + /* trans number */ (uint64_t)1, + /* base address */ (haddr_t)0, + /* data length */ 1, + /* data */ (const uint8_t *)"A") + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__journal_entry failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 3 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Write an eoa message */ + if ( pass ) { + + if ( H5C_jb__eoa(/* H5C_jbrb_t */ &jbrb_struct, + /* eoa */ (haddr_t)0x01020304) + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__eoa failed(1)"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 4 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Write a journal entry */ + if ( pass ) { + + if ( H5C_jb__journal_entry(/* H5C_jbrb_t */ &jbrb_struct, + /* trans number */ (uint64_t)1, + /* base address */ (haddr_t)1, + /* data length */ 2, + /* data */ (const uint8_t *)"AB") + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__journal_entry failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 5 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Write a journal entry */ + if ( pass ) { + + if ( H5C_jb__journal_entry(/* H5C_jbrb_t */ &jbrb_struct, + /* trans number */ (uint64_t)1, + /* base address */ (haddr_t)3, + /* data length */ 4, + /* data */ (const uint8_t *)"CDEF") + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__journal_entry failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 6 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* End transaction */ + if ( pass ) { + if ( H5C_jb__end_transaction(/* H5C_jbrb_t */ &jbrb_struct, + /* trans number */ (uint64_t)1) + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__end_transaction failed (1)"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 7 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Write an eoa message */ + if ( pass ) { + + if ( H5C_jb__eoa(/* H5C_jbrb_t */ &jbrb_struct, + /* eoa */ (haddr_t)0x0102030405) + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__eoa failed(2)"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 8 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Start a transaction */ + if ( pass ) { + + if ( H5C_jb__start_transaction(/* H5C_jbrb_t */ &jbrb_struct, + /* trans number */ (uint64_t)2) + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__start_transaction failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 9 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Write a journal entry */ + if ( pass ) { + + if ( H5C_jb__journal_entry(/* H5C_jbrb_t */ &jbrb_struct, + /* trans number */ (uint64_t)2, + /* base address */ (haddr_t)285, + /* data length */ 11, + /* data */ (const uint8_t *)"Test Data?!") + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__journal_entry failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 10 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* End transaction */ + if ( pass ) { + if ( H5C_jb__end_transaction(/* H5C_jbrb_t */ &jbrb_struct, + /* trans number */ (uint64_t)2) + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__end_transaction failed (2)"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 11 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Flush the journal buffers. */ + if ( pass ) { + + if ( H5C_jb__flush(/* H5C_jbrb_t */ &jbrb_struct) + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__flush failed"; + + } /* end if */ + + } /* end if */ + + if ( pass ) { + + current_date = time(NULL); + + /* load ascii representation of current_date into time_buf[], + * replacing white space with underscores. + */ + time_buf[31] = '\0'; /* just to be safe */ + + if ( (p = HDctime(¤t_date)) == NULL ) { + + pass = FALSE; + failure_mssg = "HDctime() failed"; + + } else { + + /* copy the string into time_buf, replacing white space with + * underscores. + * + * Do this to make parsing the header easier. + */ + i = 0; + + while ( ( i < 31 ) && ( *p != '\0' ) ) { + + if ( isspace(*p) ) { + + time_buf[i] = '_'; + + } else { + + time_buf[i] = *p; + } + + i++; + p++; + } + + time_buf[i] = '\0'; + } + } + + if ( show_progress ) /* 12 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + if ( pass ) { + + char expected_header[256]; + int expected_header_len; + + uint8_t expected_msg_1[] = + { + /* mssg 1: begin transaction 1 */ + /* header: */ 'b', 't', 'r', 'n', + /* version: */ 0x00, + /* trans num: */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }; + int expected_msg_1_len = 13; + + uint8_t expected_msg_2[] = + { + /* mssg 2: journal entry */ + /* header: */ 'j', 'e', 'n', 't', + /* 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, + /* body: */ 'A', + /* chksum: */ 0x7c, 0x5f, 0xad, 0xda + }; + int expected_msg_2_len = 34; + + uint8_t expected_msg_3[] = + { + /* mssg 3: eoas */ + /* header: */ 'e', 'o', 'a', 's', + /* version: */ 0x00, + /* trans num: */ 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00 + }; + int expected_msg_3_len = 13; + + uint8_t expected_msg_4[] = + { + /* mssg 4: journal entry */ + /* header: */ 'j', 'e', 'n', 't', + /* 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, + /* body: */ 'A', 'B', + /* chksum: */ 0x33, 0x93, 0x98, 0x21 + }; + int expected_msg_4_len = 35; + + uint8_t expected_msg_5[] = + { + /* mssg 5: journal entry */ + /* header: */ 'j', 'e', 'n', 't', + /* 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, + /* body: */ 'C', 'D', 'E', 'F', + /* chksum: */ 0x6e, 0x7d, 0xaf, 0x57 + }; + int expected_msg_5_len = 37; + + uint8_t expected_msg_6[] = + { + /* mssg 6: end transaction 1 */ + /* header: */ 'e', 't', 'r', 'n', + /* version: */ 0x00, + /* trans num: */ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }; + int expected_msg_6_len = 13; + + uint8_t expected_msg_7[] = + { + /* mssg 7: eoas */ + /* header: */ 'e', 'o', 'a', 's', + /* version: */ 0x00, + /* trans num: */ 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00 + }; + int expected_msg_7_len = 13; + + uint8_t expected_msg_8[] = + { + /* mssg 8: begin transaction 2 */ + /* header: */ 'b', 't', 'r', 'n', + /* version: */ 0x00, + /* trans num: */ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }; + int expected_msg_8_len = 13; + + uint8_t expected_msg_9[] = + { + /* mssg 9: journal entry */ + /* h9ader: */ 'j', 'e', 'n', 't', + /* 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', + 'a', '?', '!', + /* chksum: */ 0x01, 0x7f, 0xf3, 0x43 + }; + int expected_msg_9_len = 44; + + uint8_t expected_msg_10[] = + { + /* mssg 10: end transaction 2 */ + /* 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); + + if ( (fd = HDopen(filename, O_RDONLY, 0777)) == -1 ) { + + pass = FALSE; + failure_mssg = "Can't open journal file for test (1)."; + + } + + if ( pass ) { + + verify_journal_msg( + /* 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.", + /* read failure msg */ "error reading header.", + /* eof failure msg */ "encountered eof in header msg.", + /* not last msg failure */ NULL); + + verify_journal_msg( + /* 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.", + /* read failure msg */ "error reading msg 1.", + /* eof failure msg */ "encountered eof in msg 1.", + /* not last msg failure */ NULL); + + verify_journal_msg( + /* 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.", + /* read failure msg */ "error reading msg 2.", + /* eof failure msg */ "encountered eof in msg 2", + /* not last msg failure */ NULL); + + verify_journal_msg( + /* 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.", + /* read failure msg */ "error reading msg 3.", + /* eof failure msg */ "encountered eof in msg 3", + /* not last msg failure */ NULL); + + verify_journal_msg( + /* 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.", + /* read failure msg */ "error reading msg 4.", + /* eof failure msg */ "encountered eof in msg 4", + /* not last msg failure */ NULL); + + verify_journal_msg( + /* 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.", + /* read failure msg */ "error reading msg 5.", + /* eof failure msg */ "encountered eof in msg 5", + /* not last msg failure */ NULL); + + verify_journal_msg( + /* 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.", + /* read failure msg */ "error reading msg 6.", + /* eof failure msg */ "encountered eof in msg 6", + /* not last msg failure */ NULL); + + verify_journal_msg( + /* 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.", + /* read failure msg */ "error reading msg 7.", + /* eof failure msg */ "encountered eof in msg 7", + /* not last msg failure */ NULL); + + verify_journal_msg( + /* 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.", + /* read failure msg */ "error reading msg 8.", + /* eof failure msg */ "encountered eof in msg 8", + /* not last msg failure */ NULL); + + verify_journal_msg( + /* 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.", + /* read failure msg */ "error reading msg 9.", + /* eof failure msg */ "encountered eof in msg 9", + /* not last msg failure */ NULL); + + verify_journal_msg( + /* 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.", + /* read failure msg */ "error reading msg 10.", + /* eof failure msg */ "encountered eof in msg 10", + /* not last msg failure */ "msg 10 does not end file"); + + if ( HDclose(fd) != 0 ) { + + pass = FALSE; + failure_mssg = "Unable to close journal file (1)."; + } + } + } + + /* Truncate the journal file */ + if ( pass ) { + + if ( H5C_jb__trunc(&jbrb_struct) != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__trunc failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 13 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Write an eoa message */ + if ( pass ) { + + if ( H5C_jb__eoa(/* H5C_jbrb_t */ &jbrb_struct, + /* eoa */ (haddr_t)0x010203040506) + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__eoa failed(3)"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 14 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Start a transaction */ + if ( pass ) { + + if ( H5C_jb__start_transaction(/* H5C_jbrb_t */ &jbrb_struct, + /* trans number */ (uint64_t)3) + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__start_transaction failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 15 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Write a journal entry */ + if ( pass ) { + + if ( H5C_jb__journal_entry(/* H5C_jbrb_t */ &jbrb_struct, + /* trans number */ (uint64_t)3, + /* base address */ (haddr_t)28591, + /* data length */ 6, + /* data */ (const uint8_t *)"#1nN`}" ) + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__journal_entry failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 16 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* End transaction */ + if ( pass ) { + if ( H5C_jb__end_transaction(/* H5C_jbrb_t */ &jbrb_struct, + /* trans number */ (uint64_t)3) + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__end_transaction failed (3)"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 17 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Add a comment */ + if ( pass ) { + if ( H5C_jb__comment(/* H5C_jbrb_t */ &jbrb_struct, + /* comment message */ "This is a comment!") + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__comment failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 18 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Add a comment */ + if ( pass ) { + if ( H5C_jb__comment(/* H5C_jbrb_t */ &jbrb_struct, + /* comment message */ "This is another comment!") + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__comment failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 19 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Flush the journal buffers. */ + if ( pass ) { + + if ( H5C_jb__flush(/* H5C_jbrb_t */ &jbrb_struct) + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__flush failed"; + + } /* end if */ + + } /* end if */ + + if ( pass ) { + + current_date = time(NULL); + + /* load ascii representation of current_date into time_buf[], + * replacing white space with underscores. + */ + + time_buf[31] = '\0'; /* just to be safe */ + + if ( (p = HDctime(¤t_date)) == NULL ) { + + pass = FALSE; + failure_mssg = "HDctime() failed"; + + } else { + + /* copy the string into time_buf, replacing white space with + * underscores. + * + * Do this to make parsing the header easier. + */ + i = 0; + + while ( ( i < 31 ) && ( *p != '\0' ) ) { + + if ( isspace(*p) ) { + + time_buf[i] = '_'; + + } else { + + time_buf[i] = *p; + } + + i++; + p++; + } + + time_buf[i] = '\0'; + } + } + + if ( show_progress ) /* 20 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + if ( pass ) { + + char expected_header[256]; + int expected_header_len; + + uint8_t expected_msg_11[] = + { + /* mssg 11: eoas */ + /* header: */ 'e', 'o', 'a', 's', + /* version: */ 0x00, + /* trans num: */ 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00 + }; + int expected_msg_11_len = 13; + + + uint8_t expected_msg_12[] = + { + /* mssg 12: begin transaction 3 */ + /* header: */ 'b', 't', 'r', 'n', + /* version: */ 0x00, + /* trans num: */ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }; + int expected_msg_12_len = 13; + + uint8_t expected_msg_13[] = + { + /* mssg 13: journal entry */ + /* header: */ 'j', 'e', 'n', 't', + /* 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, + /* body: */ '#', '1', 'n', 'N', '`', '}', + /* chksum: */ 0x6b, 0x60, 0x0d, 0x6d + }; + int expected_msg_13_len = 39; + + uint8_t expected_msg_14[] = + { + /* mssg 14: end transaction 1 */ + /* 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); + + if ( (fd = HDopen(filename, O_RDONLY, 0777)) == -1 ) { + + pass = FALSE; + failure_mssg = "Can't open journal file for test (2)."; + + } + + if ( pass ) { + + verify_journal_msg( + /* 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.", + /* read failure msg */ "error reading header.", + /* eof failure msg */ "encountered eof in header msg.", + /* not last msg failure */ NULL); + + verify_journal_msg( + /* 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.", + /* read failure msg */ "error reading msg 11.", + /* eof failure msg */ "encountered eof in msg 11.", + /* not last msg failure */ NULL); + + verify_journal_msg( + /* 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.", + /* read failure msg */ "error reading msg 12.", + /* eof failure msg */ "encountered eof in msg 12", + /* not last msg failure */ NULL); + + verify_journal_msg( + /* 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.", + /* read failure msg */ "error reading msg 13.", + /* eof failure msg */ "encountered eof in msg 13", + /* not last msg failure */ NULL); + + verify_journal_msg( + /* 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.", + /* read failure msg */ "error reading msg 14.", + /* eof failure msg */ "encountered eof in msg 14", + /* not last msg failure */ "msg 14 does not end file"); + + + if ( HDclose(fd) != 0 ) { + + pass = FALSE; + failure_mssg = "Unable to close journal file (1)."; + } + } + } + + /* Truncate the journal file */ + if ( pass ) { + + if ( H5C_jb__trunc(&jbrb_struct) != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__trunc failed"; + + } /* end if */ + + } /* end if */ + + /* take down the journal file */ + if ( pass ) { + + if (H5C_jb__takedown(&jbrb_struct) != SUCCEED) { + + pass = FALSE; + failure_mssg = "H5C_jb__takedown failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 20 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* report pass / failure information */ + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + failures++; + HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + + } + + return; + +} /* check_binary_message_format() */ + + +/*************************************************************************** + * Function: verify_journal_msg + * + * 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 + * contents. If there is a mismatch, set pass to false + * and set the failure message as specified. + * + * Exit without any action if pass is false on entry. + * + * Return: void + * + * Programmer: J Mainzer + * + * Changes: None. + * + **************************************************************************/ + +static void +verify_journal_msg(int fd, + uint8_t expected_msg[], + int expected_msg_len, + hbool_t last_msg, + const char * mismatch_failure_msg, + const char * read_failure_msg, + const char * eof_failure_msg, + const char * not_last_msg_msg) +{ + const char * fcn_name = "verify_journal_msg()"; + hbool_t verbose = TRUE; + uint8_t ch; + int i = 0; + ssize_t ret_val; + + if ( pass ) { + + if ( ( fd < 0 ) || + ( expected_msg == NULL ) || + ( expected_msg_len <= 0 ) || + ( mismatch_failure_msg == NULL ) || + ( read_failure_msg == NULL ) || + ( eof_failure_msg == NULL ) || + ( ( last_msg) && ( not_last_msg_msg == NULL ) ) ) { + + pass = FALSE; + failure_mssg = "verify_journal_msg(): Bad params on entry."; + } + } + + while ( ( pass ) && ( i < expected_msg_len ) ) + { + ret_val = read(fd, (void *)(&ch), (size_t)1); + + if ( ret_val == 1 ) { + + if ( ch != expected_msg[i] ) { + + pass = FALSE; + failure_mssg = mismatch_failure_msg; + } + + } else if ( ret_val == -1 ) { + + if ( verbose ) { + + HDfprintf(stdout, "%s: read failed with errno = %d (%s).\n", + fcn_name, errno, strerror(errno)); + } + + pass = FALSE; + failure_mssg = mismatch_failure_msg; + + } else if ( ret_val == 0 ) { + + if ( verbose ) { + + HDfprintf(stdout, "%s: unexpected EOF.\n", fcn_name); + } + + pass = FALSE; + failure_mssg = eof_failure_msg; + + } else { + + if ( verbose ) { + + HDfprintf(stdout, "%s: read returned unexpected value (%d).\n", + fcn_name, (int)ret_val); + } + + pass = FALSE; + failure_mssg = "read returned unexpected value."; + + } + + i++; + + } + + if ( ( pass ) && ( last_msg ) ) { + + ret_val = read(fd, (void *)(&ch), (size_t)1); + + if ( ret_val != 0 ) { + + if ( verbose ) { + + HDfprintf(stdout, "%s: msg not at eof as expected.\n", fcn_name); + } + + pass = FALSE; + failure_mssg = not_last_msg_msg; + } + } + + return; + +} /* verify_journal_msg() */ + + +/*************************************************************************** + * Function: check_legal_calls + * + * Purpose: Verify that all H5C_jb functions prevent use when appropriate. + * + * Return: void + * + * Programmer: Mike McGreevy + * Tuesday, February 26, 2008 + * + * Changes: JRM -- 4/16/09 + * Updated for the addition of new parameters to + * H5C_jb__init(). + * + **************************************************************************/ + +static void +check_legal_calls(void) +{ + const char * fcn_name = "check_legal_calls(): "; + char filename[512]; + herr_t result; + H5C_jbrb_t jbrb_struct; + hbool_t show_progress = FALSE; + int32_t checkpoint = 1; + + TESTING("journaling routine compatibility"); + + pass = TRUE; + + /* Give structure its magic number */ + jbrb_struct.magic = H5C__H5C_JBRB_T_MAGIC; + + /* setup the file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, sizeof(filename)) + == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 1 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Initialize H5C_jbrb_t structure. This call should SUCCEED. */ + if ( pass ) { + + /* Note that the sizeof_addr & sizeof_size parameters are + * ignored when human_readable is TRUE. + */ + + result = H5C_jb__init(/* H5C_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, + /* human readable journal */ TRUE, + /* sizeof_addr */ 8, + /* sizeof_size */ 8); + + if ( result != SUCCEED) { + + pass = FALSE; + failure_mssg = "H5C_jb_init failed, check 3"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 2 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); +#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 + does not. */ + /* transaction numbers need not be sequential, only monitonically + * increasing -- thus this is not an error any more. + * -- JRM + */ + if ( pass ) { + + if ( H5C_jb__start_transaction(/* H5C_jbrb_t */ &jbrb_struct, + /* Transaction # */ (uint64_t)2) + == SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__start_transaction should have failed"; + + } /* end if */ + + } /* end if */ +#endif + if ( show_progress ) /* 3 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* End transaction 1. This should FAIL because transaction 1 has + not started yet. Ensure that it fails, and flag an error if it + does not. */ + if ( pass ) { + + if ( H5C_jb__end_transaction(/* H5C_jbrb_t */ &jbrb_struct, + /* Transaction # */ (uint64_t)1) + == SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__end_transaction should have failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 4 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Attempt to write a journal entry before transaction has started.. + This should FAIL because transaction 1 has not started yet. Ensure + that it fails, and flag an error if it does not. */ + if ( pass ) { + + if ( H5C_jb__journal_entry(/* H5C_jbrb_t */ &jbrb_struct, + /* Transaction # */ (uint64_t)1, + /* Base Address */ (haddr_t)123456789, + /* Length */ 16, + /* Body */ (const uint8_t *)"This should fail") + == SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__journal_entry should have failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 5 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Start transaction 1. This should SUCCEED. */ + if ( pass ) { + + if ( H5C_jb__start_transaction(/* H5C_jbrb_t */ &jbrb_struct, + /* Transaction # */ (uint64_t)1) + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__start_transaction failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 6 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* 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 ( pass ) { + + if ( H5C_jb__start_transaction(/* H5C_jbrb_t */ &jbrb_struct, + /* Transaction # */ (uint64_t)1) + == SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__start_transaction should have failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 7 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Attempt to end transaction 1. This should FAIL because no + journal entry has been written under this transaction. */ + if ( pass ) { + + if ( H5C_jb__end_transaction(/* H5C_jbrb_t */ &jbrb_struct, + /* Transaction # */ (uint64_t)1) + == SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__end_transaction should have failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 8 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Attempt to write a journal entry into the wrong transaction number. + This should FAIL because specified transaction number isn't in + progress. Ensure that it fails, and flag an error if it does not. */ + if ( pass ) { + + if ( H5C_jb__journal_entry(/* H5C_jbrb_t */ &jbrb_struct, + /* Transaction # */ (uint64_t)2, + /* Base Address */ (haddr_t)123456789, + /* Length */ 16, + /* Body */ (const uint8_t *)"This should fail") + == SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__journal_entry should have failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 9 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Write a journal entry during transaction 1. This should SUCCEED. */ + if ( pass ) { + + if ( H5C_jb__journal_entry(/* H5C_jbrb_t */ &jbrb_struct, + /* Transaction # */ (uint64_t)1, + /* Base Address */ (haddr_t)123456789, + /* Length */ 51, + /* Body */ (const uint8_t *)"This is the first transaction during transaction 1.") + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__journal_entry failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 10 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Attempt to flush buffers. This should FAIL because a transaction + is still in progress. Ensure that it fails, and flag an error + if it does not. */ + if ( pass ) { + + if ( H5C_jb__flush(/* H5C_jbrb_t */ &jbrb_struct) + == SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__flush should have failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 11 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* End transaction 1. This should SUCCEED. */ + if ( pass ) { + + if ( H5C_jb__end_transaction(/* H5C_jbrb_t */ &jbrb_struct, + /* Transaction # */ (uint64_t)1) + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__end_transaction failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 12 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Attempt to start transaction 1 again. This should FAIL because + transaction 1 has already occurred. Ensure that it fails, and flag + an error if it does not. */ + if ( pass ) { + + if ( H5C_jb__start_transaction(/* H5C_jbrb_t */ &jbrb_struct, + /* Transaction # */ (uint64_t)1) + == SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__start_transaction should have failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 13 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Start transaction 2. This should SUCCEED.*/ + if ( pass ) { + + if ( H5C_jb__start_transaction(/* H5C_jbrb_t */ &jbrb_struct, + /* Transaction # */ (uint64_t)2) + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__start_transaction failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 14 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Write a journal entry during transaction 2. This should SUCCEED. */ + if ( pass ) { + + if ( H5C_jb__journal_entry(/* H5C_jbrb_t */ &jbrb_struct, + /* Transaction # */ (uint64_t)2, + /* Base Address */ (haddr_t)7465, + /* Length */ 51, + /* Body */ (const uint8_t *)"This is the first transaction during transaction 2!") + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__journal_entry failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 15 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Write a journal entry during transaction 2. This should SUCCEED. */ + if ( pass ) { + + if ( H5C_jb__journal_entry(/* H5C_jbrb_t */ &jbrb_struct, + /* Transaction # */ (uint64_t)2, + /* Base Address */ (haddr_t)123456789, + /* Length */ 60, + /* Body */ (const uint8_t *)"... And here's your second transaction during transaction 2.") + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__journal_entry failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 16 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* End transaction 2. This should SUCCEED. */ + if ( pass ) { + + if ( H5C_jb__end_transaction(/* H5C_jbrb_t */ &jbrb_struct, + /* Transaction # */ (uint64_t)2) + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__end_transaction failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 17 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Attempt to truncate the journal file. 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 ( pass ) { + + if ( H5C_jb__trunc(/* H5C_jbrb_t */ &jbrb_struct) + == SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__trunc should have failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 18 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* 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 ( pass ) { + + if (H5C_jb__takedown(/* H5C_jbrb_t */ &jbrb_struct) + == SUCCEED) { + + pass = FALSE; + failure_mssg = "H5C_jb__takedown should have failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 19 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Flush the journal buffers. This should SUCCEED. */ + if ( pass ) { + + if ( H5C_jb__flush(/* H5C_jbrb_t */ &jbrb_struct) + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__flush failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 20 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* 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 ( pass ) { + + if (H5C_jb__takedown(/* H5C_jbrb_t */ &jbrb_struct) + == SUCCEED) { + + pass = FALSE; + failure_mssg = "H5C_jb__takedown should have failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 21 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Truncate the journal file. This should SUCCEED. */ + if ( pass ) { + + if ( H5C_jb__trunc(/* H5C_jbrb_t */ &jbrb_struct) + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__trunc failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 22 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Take down the journal file. This should SUCCEED. */ + if ( pass ) { + + if (H5C_jb__takedown(/* H5C_jbrb_t */ &jbrb_struct) + != SUCCEED) { + + pass = FALSE; + failure_mssg = "H5C_jb__takedown failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 23 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* report pass / failure information */ + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + failures++; + HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + + } + + return; + +} /* end check_legal_calls */ + + + +/*************************************************************************** + * Function: check_transaction_tracking + * + * Purpose: Verify that the ring buffer successfully tracks when + * transactions make it to disk. + * + * Return: void + * + * Programmer: Mike McGreevy + * Tuesday, February 26, 2008 + * + * Changes: JRM -- 4/16/09 + * Updated for the addition of new parameters to + * H5C_jb__init(). + * + **************************************************************************/ +static void +check_transaction_tracking(hbool_t use_aio) +{ + const char * fcn_name = "check_transaction_tracking(): "; + char filename[512]; + int i; + herr_t result; + H5C_jbrb_t jbrb_struct; + hbool_t show_progress = FALSE; + int32_t checkpoint = 1; + int expected_tval[12]; + + if ( use_aio ) { + + TESTING("aio journal file transaction tracking"); + + } else { + + TESTING("sio journal file transaction tracking"); + } + + pass = TRUE; + + /* setup the file name */ + if ( pass ) { + + if ( h5_fixname(FILENAMES[1], H5P_DEFAULT, filename, sizeof(filename)) + == NULL ) { + + pass = FALSE; + failure_mssg = "h5_fixname() failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 1 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Give structure its magic number */ + jbrb_struct.magic = H5C__H5C_JBRB_T_MAGIC; + + /* =================================================== + * First ring buffer configuration. + * 4 Buffers, each size 250. + * Writing transactions of size 100. + * 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 + * of the ring buffer. + * =================================================== */ + + /* Initialize H5C_jbrb_t structure. */ + if ( pass ) { + + /* Note that the sizeof_addr & sizeof_size parameters are + * ignored when human_readable is TRUE. + */ + + result = H5C_jb__init(/* H5C_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 */ use_aio, + /* human readable journal */ TRUE, + /* sizeof_addr */ 8, + /* sizeof_size */ 8); + + if ( result != SUCCEED) { + + pass = FALSE; + failure_mssg = "H5C_jb_init failed, check 4"; + + } /* end if */ + + } /* end if */ + + + /* H5C_jb__init() no longer generates the header message -- instead + * 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. + */ + if ( pass ) { + + if ( H5C_jb__write_header_entry(&jbrb_struct) != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__write_header_entry failed"; + } + } + + + if ( show_progress ) /* 2 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Flush the journal buffers. */ + if ( pass ) { + + if ( H5C_jb__flush(/* H5C_jbrb_t */ &jbrb_struct) + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__flush failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 3 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Write journal entries and verify that the transactions that get to + disk are accurately reported after each write. The following test the + case where multiple journal entries reside in each buffer before a flush + occurs. Also, the case when a transaction ends on a buffer boundary + 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; + expected_tval[4] = 2; + expected_tval[5] = 5; + expected_tval[6] = 5; + expected_tval[7] = 5; + expected_tval[8] = 7; + expected_tval[9] = 7; + expected_tval[10] = 10; + + /* write 20 messages and verify that expected values are as indicated in + the expected_tval array */ + for (i = 1; i < 11; i++) { + + write_verify_trans_num(/* H5C_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, + checkpoint++, (int)pass); + + /* Flush the journal buffers. */ + if ( pass ) { + + if ( H5C_jb__flush(/* H5C_jbrb_t */ &jbrb_struct) + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__flush failed"; + + } /* end if */ + + } /* end if */ + + /* Truncate the journal file. */ + if ( pass ) { + + if ( H5C_jb__trunc(/* H5C_jbrb_t */ &jbrb_struct) + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__trunc failed"; + + } /* end if */ + + } /* end if */ + + /* Take down the journal file. */ + if ( pass ) { + + if (H5C_jb__takedown(/* H5C_jbrb_t */ &jbrb_struct) + != SUCCEED) { + + pass = FALSE; + failure_mssg = "H5C_jb__takedown failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 5 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* =================================================== + * Second ring buffer configuration + * 4 Buffers, each size 100. + * Writing transactions of size 100. + * Test cases: + * - end transaction messages appear on buffer + * boundaries. + * =================================================== */ + + /* Initialize H5C_jbrb_t structure. */ + if ( pass ) { + + /* Note that the sizeof_addr & sizeof_size parameters are + * ignored when human_readable is TRUE. + */ + + result = H5C_jb__init(/* H5C_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, + /* human readable journal */ TRUE, + /* sizeof_addr */ 8, + /* sizeof_size */ 8); + + if ( result != SUCCEED) { + + pass = FALSE; + failure_mssg = "H5C_jb_init failed, check 5"; + + } /* end if */ + + } /* end if */ + + /* generate the header message manually */ + if ( pass ) { + + if ( H5C_jb__write_header_entry(&jbrb_struct) != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__write_header_entry failed"; + } + } + + /* Flush the journal buffers. */ + if ( pass ) { + + if ( H5C_jb__flush(/* H5C_jbrb_t */ &jbrb_struct) + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__flush failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 6 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* 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 + ring buffer. */ + for (i=1; i<20; i++) { + + write_verify_trans_num(/* H5C_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, + checkpoint++, (int)pass); + + /* Flush the journal buffers. */ + if ( pass ) { + + if ( H5C_jb__flush(/* H5C_jbrb_t */ &jbrb_struct) + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__flush failed"; + + } /* end if */ + + } /* end if */ + + /* Truncate the journal file. */ + if ( pass ) { + + if ( H5C_jb__trunc(/* H5C_jbrb_t */ &jbrb_struct) + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__trunc failed"; + + } /* end if */ + + } /* end if */ + + /* Take down the journal file. */ + if ( pass ) { + + if (H5C_jb__takedown(/* H5C_jbrb_t */ &jbrb_struct) + != SUCCEED) { + + pass = FALSE; + failure_mssg = "H5C_jb__takedown failed"; + + } /* end if */ + + } /* end if */ + + /* =================================================== + * Third ring buffer configuration + * 10 Buffers, each size 30. + * Writing transactions of size 100. + * Test cases: + * - end transaction messages start in one buffer + * and end in the following buffer. + * - end transaction messages start in the last + * buffer and loop around to the first buffer. + * - multiple buffers are filled between end + * transaction messages. + * =================================================== */ + + /* Initialize H5C_jbrb_t structure. */ + if ( pass ) { + + /* Note that the sizeof_addr & sizeof_size parameters are + * ignored when human_readable is TRUE. + */ + + result = H5C_jb__init(/* H5C_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, + /* human readable journal */ TRUE, + /* sizeof_addr */ 8, + /* sizeof_size */ 8); + + if ( result != SUCCEED) { + + pass = FALSE; + failure_mssg = "H5C_jb_init failed, check 6"; + + } /* end if */ + + } /* end if */ + + /* generate the header message manually */ + if ( pass ) { + + if ( H5C_jb__write_header_entry(&jbrb_struct) != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__write_header_entry failed"; + } + } + + + if ( show_progress ) /* 8 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* Flush the journal buffers. */ + if ( pass ) { + + if ( H5C_jb__flush(/* H5C_jbrb_t */ &jbrb_struct) + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__flush failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 9 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* 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 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, + (uint64_t)0, + (uint64_t)0); /* 1 in bufs, 0 on disk */ + 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, + (uint64_t)1, + (uint64_t)3); /* nothing in bufs, 3 on disk */ + H5C_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, + (uint64_t)3, + (uint64_t)5); /* 2 in bufs, 1 on disk */ + write_verify_trans_num(&jbrb_struct, + (uint64_t)6, + (uint64_t)5, + (uint64_t)5); /* nothing in bufs, 3 on disk */ + H5C_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, + (uint64_t)7, + (uint64_t)7); /* 2 in bufs, 1 on disk */ + write_verify_trans_num(&jbrb_struct, + (uint64_t)9, + (uint64_t)7, + (uint64_t)8); /* nothing in bufs, 3 on disk */ + H5C_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, + (uint64_t)9, + (uint64_t)10); /* 2 in bufs, 1 on disk */ + 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, + checkpoint++, (int)pass); + + /* Flush the journal buffers. */ + if ( pass ) { + + if ( H5C_jb__flush(/* H5C_jbrb_t */ &jbrb_struct) + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__flush failed"; + + } /* end if */ + + } /* end if */ + + /* Truncate the journal file. */ + if ( pass ) { + + if ( H5C_jb__trunc(/* H5C_jbrb_t */ &jbrb_struct) + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__trunc failed"; + + } /* end if */ + + } /* end if */ + + /* Take down the journal file. */ + if ( pass ) { + + if (H5C_jb__takedown(/* H5C_jbrb_t */ &jbrb_struct) + != SUCCEED) { + + pass = FALSE; + failure_mssg = "H5C_jb__takedown failed"; + + } /* end if */ + + } /* end if */ + + /* =================================================== + * Fourth ring buffer configuration + * 35 Buffers, each size 1. + * Writing transactions of size 100. + * 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 + * transaction message. + * =================================================== */ + + /* Initialize H5C_jbrb_t structure. */ + if ( pass ) { + + /* Note that the sizeof_addr & sizeof_size parameters are + * ignored when human_readable is TRUE. + */ + + result = H5C_jb__init(/* H5C_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, + /* human readable journal */ TRUE, + /* sizeof_addr */ 8, + /* sizeof_size */ 8); + + if ( result != SUCCEED) { + + pass = FALSE; + failure_mssg = "H5C_jb_init failed, check 7"; + + } /* end if */ + + } /* end if */ + + /* generate the header message manually */ + if ( pass ) { + + if ( H5C_jb__write_header_entry(&jbrb_struct) != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__write_header_entry failed"; + } + } + + + /* Flush the journal buffers. */ + if ( pass ) { + + if ( H5C_jb__flush(/* H5C_jbrb_t */ &jbrb_struct) + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__flush failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 11 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* 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 take up several journal buffers, and + ensures that the trans_tracking array is properly propogated */ + for (i=1; i<5; i++) { + + write_verify_trans_num(/* H5C_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, + checkpoint++, (int)pass); + + /* Flush the journal buffers. */ + if ( pass ) { + + if ( H5C_jb__flush(/* H5C_jbrb_t */ &jbrb_struct) + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__flush failed"; + + } /* end if */ + + } /* end if */ + + /* Truncate the journal file. */ + if ( pass ) { + + if ( H5C_jb__trunc(/* H5C_jbrb_t */ &jbrb_struct) + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__trunc failed"; + + } /* end if */ + + } /* end if */ + + /* Take down the journal file. */ + if ( pass ) { + + if (H5C_jb__takedown(/* H5C_jbrb_t */ &jbrb_struct) + != SUCCEED) { + + pass = FALSE; + failure_mssg = "H5C_jb__takedown failed"; + + } /* end if */ + + } /* end if */ + + if ( show_progress ) /* 13 */ + HDfprintf(stdout, "%s%0d -- pass = %d\n", fcn_name, + checkpoint++, (int)pass); + + /* report pass / failure information */ + if ( pass ) { PASSED(); } else { H5_FAILED(); } + + if ( ! pass ) { + + failures++; + HDfprintf(stdout, "%s: failure_mssg = \"%s\".\n", + fcn_name, failure_mssg); + + } + + return; + +} /* end check_transaction_tracking */ + + + +/*************************************************************************** + * Function: write_verify_trans_num + * + * 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. + * + * Return: void + * + * Programmer: Mike McGreevy + * 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(H5C_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 + * by three (two hex characters and a space). + */ + if ( pass ) { + + if ( H5C_jb__start_transaction(/* H5C_jbrb_t */ struct_ptr, + /* trans number */ trans_num) + != SUCCEED) { + + pass = FALSE; + failure_mssg = "H5C_jb__start_transaction failed"; + + } /* end if */ + + + if (trans_num < 10) { + + if ( H5C_jb__journal_entry(/* H5C_jbrb_t */ struct_ptr, + /* Transaction # */ trans_num, + /* Base Address */ (haddr_t)16, + /* Length */ 9, + /* Body */ (const uint8_t *)"XXXXXXXXX") + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__journal_entry failed"; + + } /* end if */ + + } /* end if */ + + else if (trans_num < 100) { + + if ( H5C_jb__journal_entry(/* H5C_jbrb_t */ struct_ptr, + /* Transaction # */ trans_num, + /* Base Address */ (haddr_t)16, + /* Length */ 8, + /* Body */ (const uint8_t *)"XXXXXXXX") + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__journal_entry failed"; + + } /* end if */ + + } /* end else if */ + + else { + + if ( H5C_jb__journal_entry(/* H5C_jbrb_t */ struct_ptr, + /* Transaction # */ trans_num, + /* Base Address */ (haddr_t)16, + /* Length */ 7, + /* Body */ (const uint8_t *)"XXXXXXX") + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__journal_entry failed"; + + } /* end if */ + + } /* end else */ + + if ( H5C_jb__end_transaction(/* H5C_jbrb_t */ struct_ptr, + /* Transaction # */ trans_num) + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__end_transaction failed"; + + } /* end if */ + + } /* end if */ + + /* Make sure the last transaction that's on disk is as expected. */ + if ( pass ) { + + if ( H5C_jb__get_last_transaction_on_disk( + /* H5C_jbrb_t */ struct_ptr, + /* trans number */ &trans_verify) + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__get_last_transaction_on_disk failed(1)"; + + } /* end if */ + + if ( struct_ptr->use_aio_fsync ) { + + if ( ( trans_verify < min_verify_val ) || + ( verify_val < trans_verify ) ) { + + pass = FALSE; + failure_mssg = "H5C_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 + * H5C_jb__get_last_transaction_on_disk(). + */ + + if ( ( pass ) && ( verify_val != trans_verify ) ) { + + if ( H5C_jb_aio__await_completion_of_all_pending_writes( + struct_ptr) != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb_aio__await_completion_of_all_pending_writes() failed."; + } + } + + if ( ( pass ) && ( verify_val != trans_verify ) ) { + + if ( H5C_jb_aio__await_completion_of_all_async_fsyncs( + struct_ptr) != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb_aio__await_completion_of_all_async_fsyncs() failed."; + } + } + + if ( ( pass ) && ( verify_val != trans_verify ) ) { + + if ( H5C_jb__get_last_transaction_on_disk( + /* H5C_jbrb_t */ struct_ptr, + /* trans number */ &trans_verify) + != SUCCEED ) { + + pass = FALSE; + failure_mssg = "H5C_jb__get_last_transaction_on_disk failed(2)"; + + } /* end if */ + } /* end if + + if ( ( pass ) && ( trans_verify != verify_val ) ) { + + pass = 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_mssg = "H5C_jb__get_last_transaction_on_disk returned the wrong transaction number!(1)"; + + } + } else { + if ( trans_verify != verify_val) { + + pass = FALSE; + failure_mssg = "H5C_jb__get_last_transaction_on_disk returned the wrong transaction number!(2)"; + + } /* end if */ + } /* end if */ + } /* end if */ + + return; + +} /* end write_verify_trans_num */ + + +/*------------------------------------------------------------------------- + * Function: main + * + * Purpose: Run tests on the cache code contained in H5C.c + * + * Return: Success: + * + * Failure: + * + * Programmer: John Mainzer + * 6/24/04 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ + +int +main(void) +{ + int express_test; + + failures = 0; + + H5open(); + + express_test = GetTestExpress(); + + if ( express_test >= 3 ) { + + skip_long_tests = TRUE; + + } else { + + skip_long_tests = 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 + + + /* SIO Binary readable smoke checks */ +#if 1 + mdj_smoke_check_00(FALSE, FALSE); +#endif +#if 1 + mdj_smoke_check_01(FALSE, FALSE); +#endif +#if 1 + mdj_smoke_check_02(FALSE, FALSE); +#endif +#if 1 + 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 + + + /* AIO Binary readable smoke checks */ +#if 1 + mdj_smoke_check_00(FALSE, TRUE); +#endif +#if 1 + mdj_smoke_check_01(FALSE, TRUE); +#endif +#if 1 + mdj_smoke_check_02(FALSE, TRUE); +#endif +#if 1 + mdj_api_example_test(FALSE, TRUE, 32, (16 * 1024)); +#endif + + + /* targeted tests */ +#if 1 + check_buffer_writes(FALSE); +#endif +#if 1 + check_buffer_writes(TRUE); +#endif +#if 1 + check_legal_calls(); +#endif +#if 1 + check_message_format(); +#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 +#if 1 + check_mdjsc_callbacks(); +#endif + + return(failures); + +} /* main() */ + diff --git a/test/lheap.c b/test/lheap.c index bf245d9..52af202 100644 --- a/test/lheap.c +++ b/test/lheap.c @@ -20,7 +20,7 @@ * Purpose: Test local heaps used by symbol tables (groups). */ #include "h5test.h" -#include "H5AC2private.h" +#include "H5ACprivate.h" #include "H5HLprivate.h" #include "H5Iprivate.h" @@ -86,7 +86,7 @@ main(void) H5Eprint2(H5E_DEFAULT, stdout); goto error; } - if (NULL == (heap = H5HL_protect(f, H5P_DATASET_XFER_DEFAULT, heap_addr, H5AC2_WRITE))) { + if (NULL == (heap = H5HL_protect(f, H5P_DATASET_XFER_DEFAULT, heap_addr, H5AC_WRITE))) { H5_FAILED(); H5Eprint2(H5E_DEFAULT, stdout); goto error; @@ -131,7 +131,7 @@ main(void) if(j > 4) buf[j] = '\0'; - if (NULL == (heap = H5HL_protect(f, H5P_DATASET_XFER_DEFAULT, heap_addr, H5AC2_READ))) { + if (NULL == (heap = H5HL_protect(f, H5P_DATASET_XFER_DEFAULT, heap_addr, H5AC_READ))) { H5_FAILED(); H5Eprint2(H5E_DEFAULT, stdout); goto error; diff --git a/test/ohdr.c b/test/ohdr.c index 3bd064b..0b74c2a 100644 --- a/test/ohdr.c +++ b/test/ohdr.c @@ -112,7 +112,7 @@ main(void) time_new = 11111111; if(H5O_msg_create(&oh_loc, H5O_MTIME_NEW_ID, 0, 0, &time_new, H5P_DATASET_XFER_DEFAULT) < 0) FAIL_STACK_ERROR - if(H5AC2_flush(f, H5P_DATASET_XFER_DEFAULT, TRUE) < 0) + if(H5AC_flush(f, H5P_DATASET_XFER_DEFAULT, TRUE) < 0) FAIL_STACK_ERROR if(NULL == H5O_msg_read(&oh_loc, H5O_MTIME_NEW_ID, &ro, H5P_DATASET_XFER_DEFAULT)) FAIL_STACK_ERROR @@ -128,7 +128,7 @@ main(void) time_new = 33333333; if(H5O_msg_write(&oh_loc, H5O_MTIME_NEW_ID, 0, 0, &time_new, H5P_DATASET_XFER_DEFAULT) < 0) FAIL_STACK_ERROR - if(H5AC2_flush(f, H5P_DATASET_XFER_DEFAULT, TRUE) < 0) + if(H5AC_flush(f, H5P_DATASET_XFER_DEFAULT, TRUE) < 0) FAIL_STACK_ERROR if(NULL == H5O_msg_read(&oh_loc, H5O_MTIME_NEW_ID, &ro, H5P_DATASET_XFER_DEFAULT)) FAIL_STACK_ERROR @@ -157,7 +157,7 @@ main(void) if(H5O_msg_create(&oh_loc, H5O_MTIME_ID, 0, 0, &time_new, H5P_DATASET_XFER_DEFAULT) < 0) FAIL_STACK_ERROR } /* end for */ - if(H5AC2_flush(f, H5P_DATASET_XFER_DEFAULT, TRUE) < 0) + if(H5AC_flush(f, H5P_DATASET_XFER_DEFAULT, TRUE) < 0) FAIL_STACK_ERROR /* Make certain that chunk #0 in the object header will be encoded with a 2-byte size */ @@ -205,7 +205,7 @@ main(void) time_new = (i + 1) * 1000 + 10; if(H5O_msg_create(&oh_loc, H5O_MTIME_NEW_ID, 0, 0, &time_new, H5P_DATASET_XFER_DEFAULT) < 0) FAIL_STACK_ERROR - if(H5AC2_flush(f, H5P_DATASET_XFER_DEFAULT, TRUE) < 0) + if(H5AC_flush(f, H5P_DATASET_XFER_DEFAULT, TRUE) < 0) FAIL_STACK_ERROR } /* end for */ PASSED(); @@ -233,7 +233,7 @@ main(void) time_new = 22222222; if(H5O_msg_create(&oh_loc, H5O_MTIME_NEW_ID, H5O_MSG_FLAG_CONSTANT, 0, &time_new, H5P_DATASET_XFER_DEFAULT) < 0) FAIL_STACK_ERROR - if(H5AC2_flush(f, H5P_DATASET_XFER_DEFAULT, TRUE) < 0) + if(H5AC_flush(f, H5P_DATASET_XFER_DEFAULT, TRUE) < 0) FAIL_STACK_ERROR if(NULL == H5O_msg_read(&oh_loc, H5O_MTIME_NEW_ID, &ro, H5P_DATASET_XFER_DEFAULT)) FAIL_STACK_ERROR diff --git a/test/testfiles/cache2_journal_bsc00_000.jnl.gz b/test/testfiles/cache2_journal_bsc00_000.jnl.gz deleted file mode 100755 index f6e9612..0000000 Binary files a/test/testfiles/cache2_journal_bsc00_000.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_bsc00_001.jnl.gz b/test/testfiles/cache2_journal_bsc00_001.jnl.gz deleted file mode 100755 index 36f79e0..0000000 Binary files a/test/testfiles/cache2_journal_bsc00_001.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_bsc00_002.jnl.gz b/test/testfiles/cache2_journal_bsc00_002.jnl.gz deleted file mode 100755 index f044a69..0000000 Binary files a/test/testfiles/cache2_journal_bsc00_002.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_bsc00_003.jnl.gz b/test/testfiles/cache2_journal_bsc00_003.jnl.gz deleted file mode 100755 index 4305745..0000000 Binary files a/test/testfiles/cache2_journal_bsc00_003.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_bsc00_004.jnl.gz b/test/testfiles/cache2_journal_bsc00_004.jnl.gz deleted file mode 100755 index fc99d59..0000000 Binary files a/test/testfiles/cache2_journal_bsc00_004.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_bsc00_005.jnl.gz b/test/testfiles/cache2_journal_bsc00_005.jnl.gz deleted file mode 100755 index 16e7eb1..0000000 Binary files a/test/testfiles/cache2_journal_bsc00_005.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_bsc00_006.jnl.gz b/test/testfiles/cache2_journal_bsc00_006.jnl.gz deleted file mode 100755 index 7744ea0..0000000 Binary files a/test/testfiles/cache2_journal_bsc00_006.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_bsc00_007.jnl.gz b/test/testfiles/cache2_journal_bsc00_007.jnl.gz deleted file mode 100755 index e1be66b..0000000 Binary files a/test/testfiles/cache2_journal_bsc00_007.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_bsc00_008.jnl.gz b/test/testfiles/cache2_journal_bsc00_008.jnl.gz deleted file mode 100755 index d852aad..0000000 Binary files a/test/testfiles/cache2_journal_bsc00_008.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_bsc00_009.jnl.gz b/test/testfiles/cache2_journal_bsc00_009.jnl.gz deleted file mode 100755 index 2429b98..0000000 Binary files a/test/testfiles/cache2_journal_bsc00_009.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_bsc00_010.jnl.gz b/test/testfiles/cache2_journal_bsc00_010.jnl.gz deleted file mode 100755 index b36ba56..0000000 Binary files a/test/testfiles/cache2_journal_bsc00_010.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_bsc00_011.jnl.gz b/test/testfiles/cache2_journal_bsc00_011.jnl.gz deleted file mode 100755 index 3727caa..0000000 Binary files a/test/testfiles/cache2_journal_bsc00_011.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_bsc00_012.jnl.gz b/test/testfiles/cache2_journal_bsc00_012.jnl.gz deleted file mode 100755 index 801d55b..0000000 Binary files a/test/testfiles/cache2_journal_bsc00_012.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_bsc00_013.jnl.gz b/test/testfiles/cache2_journal_bsc00_013.jnl.gz deleted file mode 100755 index e9212bd..0000000 Binary files a/test/testfiles/cache2_journal_bsc00_013.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_bsc00_014.jnl.gz b/test/testfiles/cache2_journal_bsc00_014.jnl.gz deleted file mode 100755 index e19f714..0000000 Binary files a/test/testfiles/cache2_journal_bsc00_014.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_bsc00_015.jnl.gz b/test/testfiles/cache2_journal_bsc00_015.jnl.gz deleted file mode 100755 index 3a06706..0000000 Binary files a/test/testfiles/cache2_journal_bsc00_015.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_bsc00_016.jnl.gz b/test/testfiles/cache2_journal_bsc00_016.jnl.gz deleted file mode 100755 index 67ed629..0000000 Binary files a/test/testfiles/cache2_journal_bsc00_016.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_bsc00_017.jnl.gz b/test/testfiles/cache2_journal_bsc00_017.jnl.gz deleted file mode 100755 index 2cbe6d6..0000000 Binary files a/test/testfiles/cache2_journal_bsc00_017.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_bsc00_018.jnl.gz b/test/testfiles/cache2_journal_bsc00_018.jnl.gz deleted file mode 100755 index b5aec5c..0000000 Binary files a/test/testfiles/cache2_journal_bsc00_018.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_bsc01_000.jnl.gz b/test/testfiles/cache2_journal_bsc01_000.jnl.gz deleted file mode 100755 index 956e8d9..0000000 Binary files a/test/testfiles/cache2_journal_bsc01_000.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_bsc01_001.jnl.gz b/test/testfiles/cache2_journal_bsc01_001.jnl.gz deleted file mode 100755 index 0ed6e7f..0000000 Binary files a/test/testfiles/cache2_journal_bsc01_001.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_bsc01_002.jnl.gz b/test/testfiles/cache2_journal_bsc01_002.jnl.gz deleted file mode 100755 index 0491c9a..0000000 Binary files a/test/testfiles/cache2_journal_bsc01_002.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_bsc01_003.jnl.gz b/test/testfiles/cache2_journal_bsc01_003.jnl.gz deleted file mode 100755 index 74fe661..0000000 Binary files a/test/testfiles/cache2_journal_bsc01_003.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_bsc01_004.jnl.gz b/test/testfiles/cache2_journal_bsc01_004.jnl.gz deleted file mode 100755 index 8a70e66..0000000 Binary files a/test/testfiles/cache2_journal_bsc01_004.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_bsc02_000.jnl.gz b/test/testfiles/cache2_journal_bsc02_000.jnl.gz deleted file mode 100755 index 3cb36c0..0000000 Binary files a/test/testfiles/cache2_journal_bsc02_000.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_bsc02_001.jnl.gz b/test/testfiles/cache2_journal_bsc02_001.jnl.gz deleted file mode 100755 index 63e166f..0000000 Binary files a/test/testfiles/cache2_journal_bsc02_001.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_bsc02_002.jnl.gz b/test/testfiles/cache2_journal_bsc02_002.jnl.gz deleted file mode 100755 index 6d993f5..0000000 Binary files a/test/testfiles/cache2_journal_bsc02_002.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_bsc02_003.jnl.gz b/test/testfiles/cache2_journal_bsc02_003.jnl.gz deleted file mode 100755 index 6b13820..0000000 Binary files a/test/testfiles/cache2_journal_bsc02_003.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_bsc02_004.jnl.gz b/test/testfiles/cache2_journal_bsc02_004.jnl.gz deleted file mode 100755 index cece9d6..0000000 Binary files a/test/testfiles/cache2_journal_bsc02_004.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_sc00_000.jnl.gz b/test/testfiles/cache2_journal_sc00_000.jnl.gz deleted file mode 100755 index ce4ca79..0000000 Binary files a/test/testfiles/cache2_journal_sc00_000.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_sc00_001.jnl.gz b/test/testfiles/cache2_journal_sc00_001.jnl.gz deleted file mode 100755 index 0cdb583..0000000 Binary files a/test/testfiles/cache2_journal_sc00_001.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_sc00_002.jnl.gz b/test/testfiles/cache2_journal_sc00_002.jnl.gz deleted file mode 100755 index 7681eef..0000000 Binary files a/test/testfiles/cache2_journal_sc00_002.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_sc00_003.jnl.gz b/test/testfiles/cache2_journal_sc00_003.jnl.gz deleted file mode 100755 index c3f043b..0000000 Binary files a/test/testfiles/cache2_journal_sc00_003.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_sc00_004.jnl.gz b/test/testfiles/cache2_journal_sc00_004.jnl.gz deleted file mode 100755 index 2863ec4..0000000 Binary files a/test/testfiles/cache2_journal_sc00_004.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_sc00_005.jnl.gz b/test/testfiles/cache2_journal_sc00_005.jnl.gz deleted file mode 100755 index 964b907..0000000 Binary files a/test/testfiles/cache2_journal_sc00_005.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_sc00_006.jnl.gz b/test/testfiles/cache2_journal_sc00_006.jnl.gz deleted file mode 100755 index 30e2d59..0000000 Binary files a/test/testfiles/cache2_journal_sc00_006.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_sc00_007.jnl.gz b/test/testfiles/cache2_journal_sc00_007.jnl.gz deleted file mode 100755 index 6cba834..0000000 Binary files a/test/testfiles/cache2_journal_sc00_007.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_sc00_008.jnl.gz b/test/testfiles/cache2_journal_sc00_008.jnl.gz deleted file mode 100755 index 890d489..0000000 Binary files a/test/testfiles/cache2_journal_sc00_008.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_sc00_009.jnl.gz b/test/testfiles/cache2_journal_sc00_009.jnl.gz deleted file mode 100755 index 001032e..0000000 Binary files a/test/testfiles/cache2_journal_sc00_009.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_sc00_010.jnl.gz b/test/testfiles/cache2_journal_sc00_010.jnl.gz deleted file mode 100755 index 2852c7c..0000000 Binary files a/test/testfiles/cache2_journal_sc00_010.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_sc00_011.jnl.gz b/test/testfiles/cache2_journal_sc00_011.jnl.gz deleted file mode 100755 index ef78f31..0000000 Binary files a/test/testfiles/cache2_journal_sc00_011.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_sc00_012.jnl.gz b/test/testfiles/cache2_journal_sc00_012.jnl.gz deleted file mode 100755 index 2e46ac9..0000000 Binary files a/test/testfiles/cache2_journal_sc00_012.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_sc00_013.jnl.gz b/test/testfiles/cache2_journal_sc00_013.jnl.gz deleted file mode 100755 index ccae1b1..0000000 Binary files a/test/testfiles/cache2_journal_sc00_013.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_sc00_014.jnl.gz b/test/testfiles/cache2_journal_sc00_014.jnl.gz deleted file mode 100755 index 5bb8595..0000000 Binary files a/test/testfiles/cache2_journal_sc00_014.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_sc00_015.jnl.gz b/test/testfiles/cache2_journal_sc00_015.jnl.gz deleted file mode 100755 index cc81a9f..0000000 Binary files a/test/testfiles/cache2_journal_sc00_015.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_sc00_016.jnl.gz b/test/testfiles/cache2_journal_sc00_016.jnl.gz deleted file mode 100755 index b610096..0000000 Binary files a/test/testfiles/cache2_journal_sc00_016.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_sc00_017.jnl.gz b/test/testfiles/cache2_journal_sc00_017.jnl.gz deleted file mode 100755 index 09ad5cd..0000000 Binary files a/test/testfiles/cache2_journal_sc00_017.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_sc00_018.jnl.gz b/test/testfiles/cache2_journal_sc00_018.jnl.gz deleted file mode 100755 index 8dbedc3..0000000 Binary files a/test/testfiles/cache2_journal_sc00_018.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_sc01_000.jnl.gz b/test/testfiles/cache2_journal_sc01_000.jnl.gz deleted file mode 100755 index 4ee061a..0000000 Binary files a/test/testfiles/cache2_journal_sc01_000.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_sc01_001.jnl.gz b/test/testfiles/cache2_journal_sc01_001.jnl.gz deleted file mode 100755 index ef9e210..0000000 Binary files a/test/testfiles/cache2_journal_sc01_001.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_sc01_002.jnl.gz b/test/testfiles/cache2_journal_sc01_002.jnl.gz deleted file mode 100755 index 81f0090..0000000 Binary files a/test/testfiles/cache2_journal_sc01_002.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_sc01_003.jnl.gz b/test/testfiles/cache2_journal_sc01_003.jnl.gz deleted file mode 100755 index 0b448d5..0000000 Binary files a/test/testfiles/cache2_journal_sc01_003.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_sc01_004.jnl.gz b/test/testfiles/cache2_journal_sc01_004.jnl.gz deleted file mode 100755 index 43d26ba..0000000 Binary files a/test/testfiles/cache2_journal_sc01_004.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_sc02_000.jnl.gz b/test/testfiles/cache2_journal_sc02_000.jnl.gz deleted file mode 100755 index 9eae67d..0000000 Binary files a/test/testfiles/cache2_journal_sc02_000.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_sc02_001.jnl.gz b/test/testfiles/cache2_journal_sc02_001.jnl.gz deleted file mode 100755 index b2f1ea4..0000000 Binary files a/test/testfiles/cache2_journal_sc02_001.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_sc02_002.jnl.gz b/test/testfiles/cache2_journal_sc02_002.jnl.gz deleted file mode 100755 index df42bd7..0000000 Binary files a/test/testfiles/cache2_journal_sc02_002.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_sc02_003.jnl.gz b/test/testfiles/cache2_journal_sc02_003.jnl.gz deleted file mode 100755 index 1fb5496..0000000 Binary files a/test/testfiles/cache2_journal_sc02_003.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache2_journal_sc02_004.jnl.gz b/test/testfiles/cache2_journal_sc02_004.jnl.gz deleted file mode 100755 index a537d91..0000000 Binary files a/test/testfiles/cache2_journal_sc02_004.jnl.gz and /dev/null differ diff --git a/test/testfiles/cache_journal_bsc00_000.jnl.gz b/test/testfiles/cache_journal_bsc00_000.jnl.gz new file mode 100755 index 0000000..f6e9612 Binary files /dev/null and b/test/testfiles/cache_journal_bsc00_000.jnl.gz differ diff --git a/test/testfiles/cache_journal_bsc00_001.jnl.gz b/test/testfiles/cache_journal_bsc00_001.jnl.gz new file mode 100755 index 0000000..36f79e0 Binary files /dev/null and b/test/testfiles/cache_journal_bsc00_001.jnl.gz differ diff --git a/test/testfiles/cache_journal_bsc00_002.jnl.gz b/test/testfiles/cache_journal_bsc00_002.jnl.gz new file mode 100755 index 0000000..f044a69 Binary files /dev/null and b/test/testfiles/cache_journal_bsc00_002.jnl.gz differ diff --git a/test/testfiles/cache_journal_bsc00_003.jnl.gz b/test/testfiles/cache_journal_bsc00_003.jnl.gz new file mode 100755 index 0000000..4305745 Binary files /dev/null and b/test/testfiles/cache_journal_bsc00_003.jnl.gz differ diff --git a/test/testfiles/cache_journal_bsc00_004.jnl.gz b/test/testfiles/cache_journal_bsc00_004.jnl.gz new file mode 100755 index 0000000..fc99d59 Binary files /dev/null and b/test/testfiles/cache_journal_bsc00_004.jnl.gz differ diff --git a/test/testfiles/cache_journal_bsc00_005.jnl.gz b/test/testfiles/cache_journal_bsc00_005.jnl.gz new file mode 100755 index 0000000..16e7eb1 Binary files /dev/null and b/test/testfiles/cache_journal_bsc00_005.jnl.gz differ diff --git a/test/testfiles/cache_journal_bsc00_006.jnl.gz b/test/testfiles/cache_journal_bsc00_006.jnl.gz new file mode 100755 index 0000000..7744ea0 Binary files /dev/null and b/test/testfiles/cache_journal_bsc00_006.jnl.gz differ diff --git a/test/testfiles/cache_journal_bsc00_007.jnl.gz b/test/testfiles/cache_journal_bsc00_007.jnl.gz new file mode 100755 index 0000000..e1be66b Binary files /dev/null and b/test/testfiles/cache_journal_bsc00_007.jnl.gz differ diff --git a/test/testfiles/cache_journal_bsc00_008.jnl.gz b/test/testfiles/cache_journal_bsc00_008.jnl.gz new file mode 100755 index 0000000..d852aad Binary files /dev/null and b/test/testfiles/cache_journal_bsc00_008.jnl.gz differ diff --git a/test/testfiles/cache_journal_bsc00_009.jnl.gz b/test/testfiles/cache_journal_bsc00_009.jnl.gz new file mode 100755 index 0000000..2429b98 Binary files /dev/null and b/test/testfiles/cache_journal_bsc00_009.jnl.gz differ diff --git a/test/testfiles/cache_journal_bsc00_010.jnl.gz b/test/testfiles/cache_journal_bsc00_010.jnl.gz new file mode 100755 index 0000000..b36ba56 Binary files /dev/null and b/test/testfiles/cache_journal_bsc00_010.jnl.gz differ diff --git a/test/testfiles/cache_journal_bsc00_011.jnl.gz b/test/testfiles/cache_journal_bsc00_011.jnl.gz new file mode 100755 index 0000000..3727caa Binary files /dev/null and b/test/testfiles/cache_journal_bsc00_011.jnl.gz differ diff --git a/test/testfiles/cache_journal_bsc00_012.jnl.gz b/test/testfiles/cache_journal_bsc00_012.jnl.gz new file mode 100755 index 0000000..801d55b Binary files /dev/null and b/test/testfiles/cache_journal_bsc00_012.jnl.gz differ diff --git a/test/testfiles/cache_journal_bsc00_013.jnl.gz b/test/testfiles/cache_journal_bsc00_013.jnl.gz new file mode 100755 index 0000000..e9212bd Binary files /dev/null and b/test/testfiles/cache_journal_bsc00_013.jnl.gz differ diff --git a/test/testfiles/cache_journal_bsc00_014.jnl.gz b/test/testfiles/cache_journal_bsc00_014.jnl.gz new file mode 100755 index 0000000..e19f714 Binary files /dev/null and b/test/testfiles/cache_journal_bsc00_014.jnl.gz differ diff --git a/test/testfiles/cache_journal_bsc00_015.jnl.gz b/test/testfiles/cache_journal_bsc00_015.jnl.gz new file mode 100755 index 0000000..3a06706 Binary files /dev/null and b/test/testfiles/cache_journal_bsc00_015.jnl.gz differ diff --git a/test/testfiles/cache_journal_bsc00_016.jnl.gz b/test/testfiles/cache_journal_bsc00_016.jnl.gz new file mode 100755 index 0000000..67ed629 Binary files /dev/null and b/test/testfiles/cache_journal_bsc00_016.jnl.gz differ diff --git a/test/testfiles/cache_journal_bsc00_017.jnl.gz b/test/testfiles/cache_journal_bsc00_017.jnl.gz new file mode 100755 index 0000000..2cbe6d6 Binary files /dev/null and b/test/testfiles/cache_journal_bsc00_017.jnl.gz differ diff --git a/test/testfiles/cache_journal_bsc00_018.jnl.gz b/test/testfiles/cache_journal_bsc00_018.jnl.gz new file mode 100755 index 0000000..b5aec5c Binary files /dev/null and b/test/testfiles/cache_journal_bsc00_018.jnl.gz differ diff --git a/test/testfiles/cache_journal_bsc01_000.jnl.gz b/test/testfiles/cache_journal_bsc01_000.jnl.gz new file mode 100755 index 0000000..956e8d9 Binary files /dev/null and b/test/testfiles/cache_journal_bsc01_000.jnl.gz differ diff --git a/test/testfiles/cache_journal_bsc01_001.jnl.gz b/test/testfiles/cache_journal_bsc01_001.jnl.gz new file mode 100755 index 0000000..0ed6e7f Binary files /dev/null and b/test/testfiles/cache_journal_bsc01_001.jnl.gz differ diff --git a/test/testfiles/cache_journal_bsc01_002.jnl.gz b/test/testfiles/cache_journal_bsc01_002.jnl.gz new file mode 100755 index 0000000..0491c9a Binary files /dev/null and b/test/testfiles/cache_journal_bsc01_002.jnl.gz differ diff --git a/test/testfiles/cache_journal_bsc01_003.jnl.gz b/test/testfiles/cache_journal_bsc01_003.jnl.gz new file mode 100755 index 0000000..74fe661 Binary files /dev/null and b/test/testfiles/cache_journal_bsc01_003.jnl.gz differ diff --git a/test/testfiles/cache_journal_bsc01_004.jnl.gz b/test/testfiles/cache_journal_bsc01_004.jnl.gz new file mode 100755 index 0000000..8a70e66 Binary files /dev/null and b/test/testfiles/cache_journal_bsc01_004.jnl.gz differ diff --git a/test/testfiles/cache_journal_bsc02_000.jnl.gz b/test/testfiles/cache_journal_bsc02_000.jnl.gz new file mode 100755 index 0000000..3cb36c0 Binary files /dev/null and b/test/testfiles/cache_journal_bsc02_000.jnl.gz differ diff --git a/test/testfiles/cache_journal_bsc02_001.jnl.gz b/test/testfiles/cache_journal_bsc02_001.jnl.gz new file mode 100755 index 0000000..63e166f Binary files /dev/null and b/test/testfiles/cache_journal_bsc02_001.jnl.gz differ diff --git a/test/testfiles/cache_journal_bsc02_002.jnl.gz b/test/testfiles/cache_journal_bsc02_002.jnl.gz new file mode 100755 index 0000000..6d993f5 Binary files /dev/null and b/test/testfiles/cache_journal_bsc02_002.jnl.gz differ diff --git a/test/testfiles/cache_journal_bsc02_003.jnl.gz b/test/testfiles/cache_journal_bsc02_003.jnl.gz new file mode 100755 index 0000000..6b13820 Binary files /dev/null and b/test/testfiles/cache_journal_bsc02_003.jnl.gz differ diff --git a/test/testfiles/cache_journal_bsc02_004.jnl.gz b/test/testfiles/cache_journal_bsc02_004.jnl.gz new file mode 100755 index 0000000..cece9d6 Binary files /dev/null and b/test/testfiles/cache_journal_bsc02_004.jnl.gz differ diff --git a/test/testfiles/cache_journal_sc00_000.jnl.gz b/test/testfiles/cache_journal_sc00_000.jnl.gz new file mode 100755 index 0000000..ce4ca79 Binary files /dev/null and b/test/testfiles/cache_journal_sc00_000.jnl.gz differ diff --git a/test/testfiles/cache_journal_sc00_001.jnl.gz b/test/testfiles/cache_journal_sc00_001.jnl.gz new file mode 100755 index 0000000..0cdb583 Binary files /dev/null and b/test/testfiles/cache_journal_sc00_001.jnl.gz differ diff --git a/test/testfiles/cache_journal_sc00_002.jnl.gz b/test/testfiles/cache_journal_sc00_002.jnl.gz new file mode 100755 index 0000000..7681eef Binary files /dev/null and b/test/testfiles/cache_journal_sc00_002.jnl.gz differ diff --git a/test/testfiles/cache_journal_sc00_003.jnl.gz b/test/testfiles/cache_journal_sc00_003.jnl.gz new file mode 100755 index 0000000..c3f043b Binary files /dev/null and b/test/testfiles/cache_journal_sc00_003.jnl.gz differ diff --git a/test/testfiles/cache_journal_sc00_004.jnl.gz b/test/testfiles/cache_journal_sc00_004.jnl.gz new file mode 100755 index 0000000..2863ec4 Binary files /dev/null and b/test/testfiles/cache_journal_sc00_004.jnl.gz differ diff --git a/test/testfiles/cache_journal_sc00_005.jnl.gz b/test/testfiles/cache_journal_sc00_005.jnl.gz new file mode 100755 index 0000000..964b907 Binary files /dev/null and b/test/testfiles/cache_journal_sc00_005.jnl.gz differ diff --git a/test/testfiles/cache_journal_sc00_006.jnl.gz b/test/testfiles/cache_journal_sc00_006.jnl.gz new file mode 100755 index 0000000..30e2d59 Binary files /dev/null and b/test/testfiles/cache_journal_sc00_006.jnl.gz differ diff --git a/test/testfiles/cache_journal_sc00_007.jnl.gz b/test/testfiles/cache_journal_sc00_007.jnl.gz new file mode 100755 index 0000000..6cba834 Binary files /dev/null and b/test/testfiles/cache_journal_sc00_007.jnl.gz differ diff --git a/test/testfiles/cache_journal_sc00_008.jnl.gz b/test/testfiles/cache_journal_sc00_008.jnl.gz new file mode 100755 index 0000000..890d489 Binary files /dev/null and b/test/testfiles/cache_journal_sc00_008.jnl.gz differ diff --git a/test/testfiles/cache_journal_sc00_009.jnl.gz b/test/testfiles/cache_journal_sc00_009.jnl.gz new file mode 100755 index 0000000..001032e Binary files /dev/null and b/test/testfiles/cache_journal_sc00_009.jnl.gz differ diff --git a/test/testfiles/cache_journal_sc00_010.jnl.gz b/test/testfiles/cache_journal_sc00_010.jnl.gz new file mode 100755 index 0000000..2852c7c Binary files /dev/null and b/test/testfiles/cache_journal_sc00_010.jnl.gz differ diff --git a/test/testfiles/cache_journal_sc00_011.jnl.gz b/test/testfiles/cache_journal_sc00_011.jnl.gz new file mode 100755 index 0000000..ef78f31 Binary files /dev/null and b/test/testfiles/cache_journal_sc00_011.jnl.gz differ diff --git a/test/testfiles/cache_journal_sc00_012.jnl.gz b/test/testfiles/cache_journal_sc00_012.jnl.gz new file mode 100755 index 0000000..2e46ac9 Binary files /dev/null and b/test/testfiles/cache_journal_sc00_012.jnl.gz differ diff --git a/test/testfiles/cache_journal_sc00_013.jnl.gz b/test/testfiles/cache_journal_sc00_013.jnl.gz new file mode 100755 index 0000000..ccae1b1 Binary files /dev/null and b/test/testfiles/cache_journal_sc00_013.jnl.gz differ diff --git a/test/testfiles/cache_journal_sc00_014.jnl.gz b/test/testfiles/cache_journal_sc00_014.jnl.gz new file mode 100755 index 0000000..5bb8595 Binary files /dev/null and b/test/testfiles/cache_journal_sc00_014.jnl.gz differ diff --git a/test/testfiles/cache_journal_sc00_015.jnl.gz b/test/testfiles/cache_journal_sc00_015.jnl.gz new file mode 100755 index 0000000..cc81a9f Binary files /dev/null and b/test/testfiles/cache_journal_sc00_015.jnl.gz differ diff --git a/test/testfiles/cache_journal_sc00_016.jnl.gz b/test/testfiles/cache_journal_sc00_016.jnl.gz new file mode 100755 index 0000000..b610096 Binary files /dev/null and b/test/testfiles/cache_journal_sc00_016.jnl.gz differ diff --git a/test/testfiles/cache_journal_sc00_017.jnl.gz b/test/testfiles/cache_journal_sc00_017.jnl.gz new file mode 100755 index 0000000..09ad5cd Binary files /dev/null and b/test/testfiles/cache_journal_sc00_017.jnl.gz differ diff --git a/test/testfiles/cache_journal_sc00_018.jnl.gz b/test/testfiles/cache_journal_sc00_018.jnl.gz new file mode 100755 index 0000000..8dbedc3 Binary files /dev/null and b/test/testfiles/cache_journal_sc00_018.jnl.gz differ diff --git a/test/testfiles/cache_journal_sc01_000.jnl.gz b/test/testfiles/cache_journal_sc01_000.jnl.gz new file mode 100755 index 0000000..4ee061a Binary files /dev/null and b/test/testfiles/cache_journal_sc01_000.jnl.gz differ diff --git a/test/testfiles/cache_journal_sc01_001.jnl.gz b/test/testfiles/cache_journal_sc01_001.jnl.gz new file mode 100755 index 0000000..ef9e210 Binary files /dev/null and b/test/testfiles/cache_journal_sc01_001.jnl.gz differ diff --git a/test/testfiles/cache_journal_sc01_002.jnl.gz b/test/testfiles/cache_journal_sc01_002.jnl.gz new file mode 100755 index 0000000..81f0090 Binary files /dev/null and b/test/testfiles/cache_journal_sc01_002.jnl.gz differ diff --git a/test/testfiles/cache_journal_sc01_003.jnl.gz b/test/testfiles/cache_journal_sc01_003.jnl.gz new file mode 100755 index 0000000..0b448d5 Binary files /dev/null and b/test/testfiles/cache_journal_sc01_003.jnl.gz differ diff --git a/test/testfiles/cache_journal_sc01_004.jnl.gz b/test/testfiles/cache_journal_sc01_004.jnl.gz new file mode 100755 index 0000000..43d26ba Binary files /dev/null and b/test/testfiles/cache_journal_sc01_004.jnl.gz differ diff --git a/test/testfiles/cache_journal_sc02_000.jnl.gz b/test/testfiles/cache_journal_sc02_000.jnl.gz new file mode 100755 index 0000000..9eae67d Binary files /dev/null and b/test/testfiles/cache_journal_sc02_000.jnl.gz differ diff --git a/test/testfiles/cache_journal_sc02_001.jnl.gz b/test/testfiles/cache_journal_sc02_001.jnl.gz new file mode 100755 index 0000000..b2f1ea4 Binary files /dev/null and b/test/testfiles/cache_journal_sc02_001.jnl.gz differ diff --git a/test/testfiles/cache_journal_sc02_002.jnl.gz b/test/testfiles/cache_journal_sc02_002.jnl.gz new file mode 100755 index 0000000..df42bd7 Binary files /dev/null and b/test/testfiles/cache_journal_sc02_002.jnl.gz differ diff --git a/test/testfiles/cache_journal_sc02_003.jnl.gz b/test/testfiles/cache_journal_sc02_003.jnl.gz new file mode 100755 index 0000000..1fb5496 Binary files /dev/null and b/test/testfiles/cache_journal_sc02_003.jnl.gz differ diff --git a/test/testfiles/cache_journal_sc02_004.jnl.gz b/test/testfiles/cache_journal_sc02_004.jnl.gz new file mode 100755 index 0000000..a537d91 Binary files /dev/null and b/test/testfiles/cache_journal_sc02_004.jnl.gz differ diff --git a/test/testfiles/err_compat_1 b/test/testfiles/err_compat_1 index f5215ed..b92cf4a 100644 --- a/test/testfiles/err_compat_1 +++ b/test/testfiles/err_compat_1 @@ -21,9 +21,9 @@ HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs): #001: (file name) line (number) in test_error(): H5Dwrite shouldn't succeed major: Error API minor: Write failed - #002: (file name) line (number) in H5Dwrite(): H5AC2_begin_transaction() failed. + #002: (file name) line (number) in H5Dwrite(): H5AC_begin_transaction() failed. major: Object cache minor: Unable to write to journal file - #003: (file name) line (number) in H5AC2_begin_transaction(): H5I_get_type() reports bad id + #003: (file name) line (number) in H5AC_begin_transaction(): H5I_get_type() reports bad id major: Invalid arguments to routine minor: Inappropriate type diff --git a/test/testfiles/error_test_1 b/test/testfiles/error_test_1 index 767340e..42bdfbf 100644 --- a/test/testfiles/error_test_1 +++ b/test/testfiles/error_test_1 @@ -15,10 +15,10 @@ Error Test-DIAG: Error detected in Error Program (1.0) thread (IDs): major: Error in API minor: Error in H5Eget_num HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs): - #000: (file name) line (number) in H5Dwrite(): H5AC2_begin_transaction() failed. + #000: (file name) line (number) in H5Dwrite(): H5AC_begin_transaction() failed. major: Object cache minor: Unable to write to journal file - #001: (file name) line (number) in H5AC2_begin_transaction(): H5I_get_type() reports bad id + #001: (file name) line (number) in H5AC_begin_transaction(): H5I_get_type() reports bad id major: Invalid arguments to routine minor: Inappropriate type Error Test-DIAG: Error detected in Error Program (1.0) thread (IDs): @@ -29,9 +29,9 @@ Error Test-DIAG: Error detected in Error Program (1.0) thread (IDs): major: Error in IO minor: Error in H5Dwrite HDF5-DIAG: Error detected in HDF5 (version (number)) thread (IDs): - #002: (file name) line (number) in H5Dwrite(): H5AC2_begin_transaction() failed. + #002: (file name) line (number) in H5Dwrite(): H5AC_begin_transaction() failed. major: Object cache minor: Unable to write to journal file - #003: (file name) line (number) in H5AC2_begin_transaction(): H5I_get_type() reports bad id + #003: (file name) line (number) in H5AC_begin_transaction(): H5I_get_type() reports bad id major: Invalid arguments to routine minor: Inappropriate type diff --git a/test/testjnlfilemarking.sh b/test/testjnlfilemarking.sh index 2d18b8f..01f64fd 100755 --- a/test/testjnlfilemarking.sh +++ b/test/testjnlfilemarking.sh @@ -15,7 +15,7 @@ # # Tests for journaling related marking and unmarking of HDF5 files. # -# These tests used to be in cache2_journal.c, but had to be moved +# These tests used to be in cache_journal.c, but had to be moved # out as the tests require simulated crashes, and it is difficult to # do this in a C program without using fork(). @@ -43,7 +43,7 @@ TEST() { TEST_ERR=$1 # The test name TEST_ERR_BIN=`pwd`/$TEST_ERR # The path of the test binary TEST_DESC=$2 - TEST_STDERR=cache2_jnl_file_marking.stderr + TEST_STDERR=cache_jnl_file_marking.stderr #Run the test: trap "" 6 @@ -93,12 +93,12 @@ echo "Tests to verify correct marking of journaling in progress status in a" echo "HDF5 file under various conditions -- most involving abnormal exits." echo "Thus the \"Aborted\" messages between tests are expected." -TEST cache2_jnl_file_marking file_marking_after_open -TEST cache2_jnl_file_marking file_marking_on_create -TEST cache2_jnl_file_marking file_marking_on_open -TEST cache2_jnl_file_marking file_unmarking_on_file_close -TEST cache2_jnl_file_marking file_unmarking_on_journaling_shutdown -TEST cache2_jnl_file_marking file_unmarking_on_recovery +TEST cache_jnl_file_marking file_marking_after_open +TEST cache_jnl_file_marking file_marking_on_create +TEST cache_jnl_file_marking file_marking_on_open +TEST cache_jnl_file_marking file_unmarking_on_file_close +TEST cache_jnl_file_marking file_unmarking_on_journaling_shutdown +TEST cache_jnl_file_marking file_unmarking_on_recovery if test $nerrors -eq 0 ; then echo "All journaling file marking tests passed." diff --git a/testpar/Makefile.am b/testpar/Makefile.am index 765e504..60c1685 100644 --- a/testpar/Makefile.am +++ b/testpar/Makefile.am @@ -25,7 +25,7 @@ INCLUDES=-I$(top_srcdir)/src -I$(top_srcdir)/test # Test programs and scripts. These are our main targets. # -TEST_PROG_PARA=t_mpi t_posix_compliant testphdf5 t_cache1 t_cache2 \ +TEST_PROG_PARA=t_mpi t_posix_compliant testphdf5 t_cache1 t_cache \ t_pflush1 t_pflush2 TEST_SCRIPT_PARA=testph5.sh diff --git a/testpar/Makefile.in b/testpar/Makefile.in index b12831b..f018401 100644 --- a/testpar/Makefile.in +++ b/testpar/Makefile.in @@ -65,16 +65,16 @@ CONFIG_HEADER = $(top_builddir)/src/H5config.h CONFIG_CLEAN_FILES = testph5.sh CONFIG_CLEAN_VPATH_FILES = am__EXEEXT_1 = t_mpi$(EXEEXT) t_posix_compliant$(EXEEXT) \ - testphdf5$(EXEEXT) t_cache1$(EXEEXT) t_cache2$(EXEEXT) \ + testphdf5$(EXEEXT) t_cache1$(EXEEXT) t_cache$(EXEEXT) \ t_pflush1$(EXEEXT) t_pflush2$(EXEEXT) +t_cache_SOURCES = t_cache.c +t_cache_OBJECTS = t_cache.$(OBJEXT) +t_cache_LDADD = $(LDADD) +t_cache_DEPENDENCIES = $(LIBH5TEST) $(LIBHDF5) t_cache1_SOURCES = t_cache1.c t_cache1_OBJECTS = t_cache1.$(OBJEXT) t_cache1_LDADD = $(LDADD) t_cache1_DEPENDENCIES = $(LIBH5TEST) $(LIBHDF5) -t_cache2_SOURCES = t_cache2.c -t_cache2_OBJECTS = t_cache2.$(OBJEXT) -t_cache2_LDADD = $(LDADD) -t_cache2_DEPENDENCIES = $(LIBH5TEST) $(LIBHDF5) t_mpi_SOURCES = t_mpi.c t_mpi_OBJECTS = t_mpi.$(OBJEXT) t_mpi_LDADD = $(LDADD) @@ -111,9 +111,9 @@ CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ -SOURCES = t_cache1.c t_cache2.c t_mpi.c t_pflush1.c t_pflush2.c \ +SOURCES = t_cache.c t_cache1.c t_mpi.c t_pflush1.c t_pflush2.c \ t_posix_compliant.c $(testphdf5_SOURCES) -DIST_SOURCES = t_cache1.c t_cache2.c t_mpi.c t_pflush1.c t_pflush2.c \ +DIST_SOURCES = t_cache.c t_cache1.c t_mpi.c t_pflush1.c t_pflush2.c \ t_posix_compliant.c $(testphdf5_SOURCES) ETAGS = etags CTAGS = ctags @@ -382,7 +382,7 @@ INCLUDES = -I$(top_srcdir)/src -I$(top_srcdir)/test # Test programs and scripts. These are our main targets. # -TEST_PROG_PARA = t_mpi t_posix_compliant testphdf5 t_cache1 t_cache2 \ +TEST_PROG_PARA = t_mpi t_posix_compliant testphdf5 t_cache1 t_cache \ t_pflush1 t_pflush2 TEST_SCRIPT_PARA = testph5.sh @@ -455,12 +455,12 @@ clean-checkPROGRAMS: list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list +t_cache$(EXEEXT): $(t_cache_OBJECTS) $(t_cache_DEPENDENCIES) + @rm -f t_cache$(EXEEXT) + $(LINK) $(t_cache_OBJECTS) $(t_cache_LDADD) $(LIBS) t_cache1$(EXEEXT): $(t_cache1_OBJECTS) $(t_cache1_DEPENDENCIES) @rm -f t_cache1$(EXEEXT) $(LINK) $(t_cache1_OBJECTS) $(t_cache1_LDADD) $(LIBS) -t_cache2$(EXEEXT): $(t_cache2_OBJECTS) $(t_cache2_DEPENDENCIES) - @rm -f t_cache2$(EXEEXT) - $(LINK) $(t_cache2_OBJECTS) $(t_cache2_LDADD) $(LIBS) t_mpi$(EXEEXT): $(t_mpi_OBJECTS) $(t_mpi_DEPENDENCIES) @rm -f t_mpi$(EXEEXT) $(LINK) $(t_mpi_OBJECTS) $(t_mpi_LDADD) $(LIBS) @@ -483,8 +483,8 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t_cache.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t_cache1.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t_cache2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t_chunk_alloc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t_coll_chunk.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t_dset.Po@am__quote@ diff --git a/testpar/t_cache.c b/testpar/t_cache.c new file mode 100644 index 0000000..aa2f282 --- /dev/null +++ b/testpar/t_cache.c @@ -0,0 +1,6114 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * Copyright by the Board of Trustees of the University of Illinois. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * Parallel metadata cache tests. + * + */ + +#include "h5test.h" +#include "testpar.h" +#include "H5Iprivate.h" +#include "H5MFprivate.h" + +#define H5C_PACKAGE /*suppress error about including H5Cpkg */ + +#include "H5Cpkg.h" + +#define H5AC_PACKAGE /*suppress error about including H5ACpkg */ + +#include "H5ACpkg.h" + +#define H5F_PACKAGE /*suppress error about including H5Fpkg */ + +#include "H5Fpkg.h" + +#define BASE_ADDR (haddr_t)1024 + + +int nerrors = 0; +int failures = 0; +hbool_t verbose = TRUE; /* used to control error messages */ +#if 1 +/* So far we haven't needed this, but that may change. + * Keep it around for now + */ +hid_t noblock_dxpl_id=(-1); +#endif + +#define NFILENAME 2 +#define PARATESTFILE filenames[0] +const char *FILENAME[NFILENAME]={"Cache2TestDummy", NULL}; +char filenames[NFILENAME][PATH_MAX]; +hid_t fapl; /* file access property list */ +haddr_t max_addr = 0; /* used to store the end of + * the address space used by + * the data array (see below). + */ +hbool_t callbacks_verbose = FALSE; /* flag used to control whether + * the callback functions are in + * verbose mode. + */ + + +int world_mpi_size = -1; +int world_mpi_rank = -1; +int world_server_mpi_rank = -1; +MPI_Comm world_mpi_comm = MPI_COMM_NULL; +int file_mpi_size = -1; +int file_mpi_rank = -1; +MPI_Comm file_mpi_comm = MPI_COMM_NULL; + + +/* the following globals are used to maintain rudementary statistics + * to check the validity of the statistics maintained by H5C.c + */ + +long datum_clears = 0; +long datum_pinned_clears = 0; +long datum_destroys = 0; +long datum_flushes = 0; +long datum_pinned_flushes = 0; +long datum_loads = 0; +long global_pins = 0; +long global_dirty_pins = 0; +long local_pins = 0; + + +/***************************************************************************** + * struct datum + * + * Instances of struct datum are used to store information on entries + * that may be loaded into the cache. The individual fields are + * discussed below: + * + * header: Instance of H5C_cache_entry_t used by the for its data. + * This field is only used on the file processes, not on the + * server process. + * + * This field MUST be the first entry in this structure. + * + * base_addr: Base address of the entry. + * + * len: Length of the entry. + * + * local_len: Length of the entry according to the cache. This + * value must be positive, and may not be larger than len. + * + * The field exists to allow us change the sizes of entries + * in the cache without upsetting the server. This value + * is only used locally, and is never sent to the server. + * + * ver: Version number of the entry. This number is initialize + * to zero, and incremented each time the entry is modified. + * + * dirty: Boolean flag indicating whether the entry is dirty. + * + * For current purposes, an entry is clean until it is + * modified, and dirty until written to the server (cache + * on process 0) or until it is marked clean (all other + * caches). + * + * valid: Boolean flag indicating whether the entry contains + * valid data. Attempts to read an entry whose valid + * flag is not set should trigger an error. + * + * locked: Boolean flag that is set to true iff the entry is in + * the cache and locked. + * + * global_pinned: Boolean flag that is set to true iff the entry has + * been pinned collectively in all caches. Since writes must + * be collective across all processes, only entries pinned + * in this fashion may be marked dirty. + * + * local_pinned: Boolean flag that is set to true iff the entry + * has been pinned in the local cache, but probably not all + * caches. Such pins will typically not be consistant across + * processes, and thus cannot be marked as dirty unless they + * happen to overlap some collective operation. + * + * index: Index of this instance of datum in the data_index[] array + * discussed below. + * + *****************************************************************************/ + +struct datum +{ + H5C_cache_entry_t header; + haddr_t base_addr; + size_t len; + size_t local_len; + int ver; + hbool_t dirty; + hbool_t valid; + hbool_t locked; + hbool_t global_pinned; + hbool_t local_pinned; + int index; +}; + +/***************************************************************************** + * data array + * + * The data array is an array of instances of datum of size + * NUM_DATA_ENTRIES that is used to track the particulars of all + * the entries that may be loaded into the cache. + * + * It exists on all processes, although the master copy is maintained + * by the server process. If the cache is performing correctly, all + * versions should be effectively identical. By that I mean that + * the data received from the server should always match that in + * the local version of the data array. + * + *****************************************************************************/ + +#define NUM_DATA_ENTRIES 100000 + +struct datum data[NUM_DATA_ENTRIES]; + + +/* Many tests use the size of data array as the size of test loops. + * On some machines, this results in unacceptably long test runs. + * + * To deal with this issue, I have introduced the virt_num_data_entries + * global, which can be set to a lower value to throtle the length of + * tests. + * + * Note that this value must always be divisible by 40, and must be an + * even divisor of NUM_DATA_ENTRIES. So far, all tests have been with + * powers of 10 that meet these criteria. + * + * Further, this value must be consistant across all processes. + */ + +#define STD_VIRT_NUM_DATA_ENTRIES NUM_DATA_ENTRIES +#define EXPRESS_VIRT_NUM_DATA_ENTRIES (NUM_DATA_ENTRIES / 10) +/* Use a smaller test size to avoid creating huge MPE logfiles. */ +#define MPE_VIRT_NUM_DATA_ENTIES (NUM_DATA_ENTRIES / 100) + +int virt_num_data_entries = NUM_DATA_ENTRIES; + + +/***************************************************************************** + * data_index array + * + * The data_index array is an array of integer used to maintain a list + * of instances of datum in the data array in increasing base_addr order. + * + * This array is necessary, as rename operations can swap the values + * of the base_addr fields of two instances of datum. Without this + * array, we would no longer be able to use a binary search on a sorted + * list to find the indexes of instances of datum given the values of + * their base_addr fields. + * + *****************************************************************************/ + +int data_index[NUM_DATA_ENTRIES]; + + +/***************************************************************************** + * struct mssg + * + * The mssg structure is used as a generic container for messages to + * and from the server. Not all fields are used in all cases. + * + * req: Integer field containing the type of the message. + * + * src: World communicator MPI rank of the sending process. + * + * dest: World communicator MPI rank of the destination process. + * + * mssg_num: Serial number assigned to the message by the sender. + * + * base_addr: Base address of a datum. Not used in all mssgs. + * + * len: Length of a datum (in bytes). Not used in all mssgs. + * + * ver: Version number of a datum. Not used in all mssgs. + * + * magic: Magic number for error detection. Must be set to + * MSSG_MAGIC. + * + *****************************************************************************/ + +#define DO_WRITE_REQ_ACK FALSE +#define DO_SYNC_AFTER_WRITE TRUE + +#define WRITE_REQ_CODE 0 +#define WRITE_REQ_ACK_CODE 1 +#define READ_REQ_CODE 2 +#define READ_REQ_REPLY_CODE 3 +#define SYNC_REQ_CODE 4 +#define SYNC_ACK_CODE 5 +#define DONE_REQ_CODE 6 +#define MAX_REQ_CODE 6 + +#define MSSG_MAGIC 0x1248 + +struct mssg_t +{ + int req; + int src; + int dest; + long int mssg_num; + haddr_t base_addr; + int len; + int ver; + unsigned magic; +}; + +MPI_Datatype mpi_mssg_t; /* for MPI derived type created from mssg */ + + +/*****************************************************************************/ +/************************** function declarations ****************************/ +/*****************************************************************************/ + +/* stats functions */ + +void print_stats(void); +void reset_stats(void); + +/* MPI setup functions */ + +hbool_t set_up_file_communicator(void); + + +/* data array manipulation functions */ + +int addr_to_datum_index(haddr_t base_addr); +void init_data(void); + + +/* test coodination related functions */ + +int do_express_test(void); +void do_sync(void); +int get_max_nerrors(void); + + +/* mssg xfer related functions */ + +hbool_t recv_mssg(struct mssg_t *mssg_ptr, int mssg_tag_offset); +hbool_t send_mssg(struct mssg_t *mssg_ptr, hbool_t add_req_to_tag); +hbool_t setup_derived_types(void); +hbool_t takedown_derived_types(void); + + +/* server functions */ + +hbool_t server_main(void); +hbool_t serve_read_request(struct mssg_t * mssg_ptr); +hbool_t serve_sync_request(struct mssg_t * mssg_ptr); +hbool_t serve_write_request(struct mssg_t * mssg_ptr); + + +/* call back functions & related data structures */ + +static herr_t datum_clear_dirty_bits(haddr_t addr, + size_t len, + void * thing); + +static void * datum_deserialize(haddr_t addr, + size_t len, + const void * image_ptr, + const void * udata_ptr, + hbool_t * dirty_ptr); + +static herr_t datum_image_len(void *thing, + size_t *image_len_ptr); + +static herr_t datum_serialize(const H5F_t *f, + hid_t dxpl_id, + haddr_t addr, + size_t len, + void * image_ptr, + void * thing, + unsigned * flags_ptr, + haddr_t * new_addr_ptr, + size_t * new_len_ptr, + void ** new_image_ptr_ptr); + +static herr_t datum_free_icr(haddr_t addr, + size_t len, + void * thing); + +#define DATUM_ENTRY_TYPE H5AC_TEST_ID + +#define NUMBER_OF_ENTRY_TYPES 1 + +const H5C_class_t types[NUMBER_OF_ENTRY_TYPES] = +{ + { + DATUM_ENTRY_TYPE, + "datum", + H5FD_MEM_DEFAULT, + (H5C_deserialize_func_t)datum_deserialize, + (H5C_image_len_func_t)datum_image_len, + (H5C_serialize_func_t)datum_serialize, + (H5C_free_icr_func_t)datum_free_icr, + (H5C_clear_dirty_bits_func_t)datum_clear_dirty_bits + } +}; + + +/* test utility functions */ + +void expunge_entry(H5C_t * cache_ptr, H5F_t * file_ptr, int32_t idx); +void insert_entry(H5C_t * cache_ptr, H5F_t * file_ptr, + int32_t idx, unsigned int flags); +void local_pin_and_unpin_random_entries(H5C_t * cache_ptr, H5F_t * file_ptr, + int min_idx, int max_idx, + int min_count, int max_count); +void local_pin_random_entry(H5C_t * cache_ptr, H5F_t * file_ptr, + int min_idx, int max_idx); +void local_unpin_all_entries(H5C_t * cache_ptr, H5F_t * file_ptr, + hbool_t via_unprotect); +int local_unpin_next_pinned_entry(H5C_t * cache_ptr, H5F_t * file_ptr, + int start_idx, hbool_t via_unprotect); +void lock_and_unlock_random_entries(H5C_t * cache_ptr, H5F_t * file_ptr, + int min_idx, int max_idx, + int min_count, int max_count); +void lock_and_unlock_random_entry(H5C_t * cache_ptr, H5F_t * file_ptr, + int min_idx, int max_idx); +void lock_entry(H5C_t * cache_ptr, H5F_t * file_ptr, int32_t idx); +void mark_pinned_entry_dirty(H5C_t * cache_ptr, H5F_t * file_ptr, + int32_t idx, hbool_t size_changed, size_t new_size); +void mark_pinned_or_protected_entry_dirty(H5C_t * cache_ptr, + H5F_t * file_ptr, + int32_t idx); +void pin_entry(H5C_t * cache_ptr, H5F_t * file_ptr, int32_t idx, + hbool_t global, hbool_t dirty); +void pin_protected_entry(H5C_t * cache_ptr, H5F_t * file_ptr, + int32_t idx, hbool_t global); +void rename_entry(H5C_t * cache_ptr, H5F_t * file_ptr, + int32_t old_idx, int32_t new_idx); +void resize_entry(H5C_t * cache_ptr, H5F_t * file_ptr, + int32_t idx, size_t new_size); +hbool_t setup_cache_for_test(hid_t * fid_ptr, H5F_t ** file_ptr_ptr, + H5C_t ** cache_ptr_ptr); +void setup_rand(void); +hbool_t take_down_cache(hid_t fid, H5C_t * cache_ptr); +void unlock_entry(H5C_t * cache_ptr, H5F_t * file_ptr, + int32_t type, unsigned int flags); +void unpin_entry(H5C_t * cache_ptr, H5F_t * file_ptr, int32_t idx, + hbool_t global, hbool_t dirty, hbool_t via_unprotect); + + +/* test functions */ + +hbool_t server_smoke_check(void); +hbool_t smoke_check_1(void); +hbool_t smoke_check_2(void); +hbool_t smoke_check_3(void); +hbool_t smoke_check_4(void); +hbool_t smoke_check_5(void); +hbool_t trace_file_check(void); + + +/*****************************************************************************/ +/****************************** stats functions ******************************/ +/*****************************************************************************/ + +/***************************************************************************** + * + * Function: print_stats() + * + * Purpose: Print the rudementary stats maintained by t_cache. + * + * This is a debugging function, which will not normally + * be run as part of t_cache. + * + * Return: void + * + * Programmer: JRM -- 4/17/06 + * + * Modifications: + * + * None. + * + *****************************************************************************/ + +void +print_stats(void) +{ + HDfprintf(stdout, + "%d: datum clears / pinned clears / destroys = %ld / %ld / %ld\n", + world_mpi_rank, datum_clears, datum_pinned_clears, + datum_destroys ); + HDfprintf(stdout, + "%d: datum flushes / pinned flushes / loads = %ld / %ld / %ld\n", + world_mpi_rank, datum_flushes, datum_pinned_flushes, + datum_loads ); + HDfprintf(stdout, + "%d: pins: global / global dirty / local = %ld / %ld / %ld\n", + world_mpi_rank, global_pins, global_dirty_pins, local_pins); + HDfflush(stdout); + + return; + +} /* print_stats() */ + +/***************************************************************************** + * + * Function: reset_stats() + * + * Purpose: Reset the rudementary stats maintained by t_cache. + * + * Return: void + * + * Programmer: JRM -- 4/17/06 + * + * Modifications: + * + * None. + * + *****************************************************************************/ + +void +reset_stats(void) +{ + datum_clears = 0; + datum_pinned_clears = 0; + datum_destroys = 0; + datum_flushes = 0; + datum_pinned_flushes = 0; + datum_loads = 0; + global_pins = 0; + global_dirty_pins = 0; + local_pins = 0; + + return; + +} /* reset_stats() */ + + +/*****************************************************************************/ +/**************************** MPI setup functions ****************************/ +/*****************************************************************************/ + +/***************************************************************************** + * + * Function: set_up_file_communicator() + * + * Purpose: Create the MPI communicator used to open a HDF5 file with. + * In passing, also initialize the file_mpi... globals. + * + * Return: Success: TRUE + * + * Failure: FALSE + * + * Programmer: JRM -- 11/16/05 + * + * Modifications: + * + * None. + * + *****************************************************************************/ + +hbool_t +set_up_file_communicator(void) +{ + const char * fcn_name = "set_up_file_communicator()"; + hbool_t success = TRUE; + int mpi_result; + int num_excluded_ranks; + int excluded_ranks[1]; + MPI_Group file_group; + MPI_Group world_group; + + if ( success ) { + + mpi_result = MPI_Comm_group(world_mpi_comm, &world_group); + + if ( mpi_result != MPI_SUCCESS ) { + + nerrors++; + success = FALSE; + if ( verbose ) { + fprintf(stdout, + "%d:%s: MPI_Comm_group() failed with error %d.\n", + world_mpi_rank, fcn_name, mpi_result); + } + } + } + + if ( success ) { + + num_excluded_ranks = 1; + excluded_ranks[0] = world_server_mpi_rank; + mpi_result = MPI_Group_excl(world_group, num_excluded_ranks, + excluded_ranks, &file_group); + + if ( mpi_result != MPI_SUCCESS ) { + + nerrors++; + success = FALSE; + if ( verbose ) { + fprintf(stdout, + "%d:%s: MPI_Group_excl() failed with error %d.\n", + world_mpi_rank, fcn_name, mpi_result); + } + } + } + + if ( success ) { + + mpi_result = MPI_Comm_create(world_mpi_comm, file_group, + &file_mpi_comm); + + if ( mpi_result != MPI_SUCCESS ) { + + nerrors++; + success = FALSE; + if ( verbose ) { + fprintf(stdout, + "%d:%s: MPI_Comm_create() failed with error %d.\n", + world_mpi_rank, fcn_name, mpi_result); + } + + } else { + + if ( world_mpi_rank != world_server_mpi_rank ) { + + if ( file_mpi_comm == MPI_COMM_NULL ) { + + nerrors++; + success = FALSE; + if ( verbose ) { + fprintf(stdout, + "%d:%s: file_mpi_comm == MPI_COMM_NULL.\n", + world_mpi_rank, fcn_name); + } + } + } else { + + file_mpi_size = world_mpi_size - 1; /* needed by the server */ + + if ( file_mpi_comm != MPI_COMM_NULL ) { + + nerrors++; + success = FALSE; + if ( verbose ) { + fprintf(stdout, + "%d:%s: file_mpi_comm != MPI_COMM_NULL.\n", + world_mpi_rank, fcn_name); + } + } + } + } + } + + if ( ( success ) && ( world_mpi_rank != world_server_mpi_rank ) ) { + + mpi_result = MPI_Comm_size(file_mpi_comm, &file_mpi_size); + + if ( mpi_result != MPI_SUCCESS ) { + + nerrors++; + success = FALSE; + if ( verbose ) { + fprintf(stdout, + "%d:%s: MPI_Comm_size() failed with error %d.\n", + world_mpi_rank, fcn_name, mpi_result); + } + } + } + + if ( ( success ) && ( world_mpi_rank != world_server_mpi_rank ) ) { + + mpi_result = MPI_Comm_rank(file_mpi_comm, &file_mpi_rank); + + if ( mpi_result != MPI_SUCCESS ) { + + nerrors++; + success = FALSE; + if ( verbose ) { + fprintf(stdout, + "%d:%s: MPI_Comm_rank() failed with error %d.\n", + world_mpi_rank, fcn_name, mpi_result); + } + } + } + + return(success); + +} /* set_up_file_communicator() */ + + +/*****************************************************************************/ +/******************** data array manipulation functions **********************/ +/*****************************************************************************/ + +/***************************************************************************** + * + * Function: addr_to_datum_index() + * + * Purpose: Given the base address of a datum, find and return its index + * in the data array. + * + * Return: Success: index of target datum. + * + * Failure: -1. + * + * Programmer: JRM -- 12/20/05 + * + * Modifications: + * + * None. + * + *****************************************************************************/ + +int +addr_to_datum_index(haddr_t base_addr) +{ + /* const char * fcn_name = "addr_to_datum_index()"; */ + int top = NUM_DATA_ENTRIES - 1; + int bottom = 0; + int middle = (NUM_DATA_ENTRIES - 1) / 2; + int ret_value = -1; + + while ( top >= bottom ) + { + if ( base_addr < data[data_index[middle]].base_addr ) { + + top = middle - 1; + middle = (top + bottom) / 2; + + } else if ( base_addr > data[data_index[middle]].base_addr ) { + + bottom = middle + 1; + middle = (top + bottom) / 2; + + } else /* ( base_addr == data[data_index[middle]].base_addr ) */ { + + ret_value = data_index[middle]; + bottom = top + 1; /* to force exit from while loop */ + + } + } + + return(ret_value); + +} /* addr_to_datum_index() */ + + +/***************************************************************************** + * + * Function: init_data() + * + * Purpose: Initialize the data array, from which cache entries are + * loaded. + * + * Return: Success: TRUE + * + * Failure: FALSE + * + * Programmer: JRM -- 12/20/05 + * + * Modifications: + * + * JRM -- 7/11/06 + * Added support for the local_len field. + * + *****************************************************************************/ + +void +init_data(void) +{ + /* const char * fcn_name = "init_data()"; */ + /* The set of address offsets is chosen so as to avoid allowing the + * base addresses to fall in a pattern of that will annoy the hash + * table, and to give a good range of entry sizes. + * + * At present, I am using the first 20 entries of the Fibonacci + * sequence multiplied by 2. We will see how it works. + */ + const int num_addr_offsets = 20; + const haddr_t addr_offsets[20] = { 2, 2, 4, 6, 10, + 16, 26, 42, 68, 110, + 178, 288, 466, 754, 1220, + 1974, 3194, 5168, 8362, 13539}; + int i; + int j = 0; + haddr_t addr = BASE_ADDR; + + /* this must hold so renames don't change entry size. */ + HDassert( (NUM_DATA_ENTRIES / 2) % 20 == 0 ); + HDassert( (virt_num_data_entries / 2) % 20 == 0 ); + + for ( i = 0; i < NUM_DATA_ENTRIES; i++ ) + { + data[i].base_addr = addr; + data[i].len = (size_t)(addr_offsets[j]); + data[i].local_len = (size_t)(addr_offsets[j]); + data[i].ver = 0; + data[i].dirty = FALSE; + data[i].valid = FALSE; + data[i].locked = FALSE; + data[i].global_pinned = FALSE; + data[i].local_pinned = FALSE; + data[i].index = i; + + data_index[i] = i; + + addr += addr_offsets[j]; + HDassert( addr > data[i].base_addr ); + + j = (j + 1) % num_addr_offsets; + } + + /* save the end of the address space used by the data array */ + max_addr = addr; + + return; + +} /* init_data() */ + + +/*****************************************************************************/ +/******************** test coodination related functions *********************/ +/*****************************************************************************/ + +/***************************************************************************** + * + * Function: do_express_test() + * + * Purpose: Do an MPI_Allreduce to obtain the maximum value returned + * by GetTestExpress() across all processes. Return this + * value. + * + * Envirmoment variables can be different across different + * processes. This function ensures that all processes agree + * on whether to do an express test. + * + * Return: Success: Maximum of the values returned by + * GetTestExpress() across all processes. + * + * Failure: -1 + * + * Programmer: JRM -- 4/25/06 + * + * Modifications: + * + * None. + * + *****************************************************************************/ + +int +do_express_test(void) +{ + const char * fcn_name = "do_express_test()"; + int express_test; + int max_express_test; + int result; + + express_test = GetTestExpress(); + + result = MPI_Allreduce((void *)&express_test, + (void *)&max_express_test, + 1, + MPI_INT, + MPI_MAX, + world_mpi_comm); + + if ( result != MPI_SUCCESS ) { + + nerrors++; + max_express_test = -1; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: MPI_Allreduce() failed.\n", + world_mpi_rank, fcn_name ); + } + } + + return(max_express_test); + +} /* do_express_test() */ + + +/***************************************************************************** + * + * Function: do_sync() + * + * Purpose: Ensure that all messages sent by this process have been + * processed before proceeding. + * + * Do this by exchanging sync req / sync ack messages with + * the server. + * + * Do nothing if nerrors is greater than zero. + * + * Return: void + * + * Programmer: JRM -- 5/10/06 + * + * Modifications: + * + * None. + * + *****************************************************************************/ + +void +do_sync(void) +{ + const char * fcn_name = "do_sync()"; + + struct mssg_t mssg; + + if ( nerrors <= 0 ) { + + /* compose the message */ + mssg.req = SYNC_REQ_CODE; + mssg.src = world_mpi_rank; + mssg.dest = world_server_mpi_rank; + mssg.mssg_num = -1; /* set by send function */ + mssg.base_addr = 0; + mssg.len = 0; + mssg.ver = 0; + mssg.magic = MSSG_MAGIC; + + if ( ! send_mssg(&mssg, FALSE) ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: send_mssg() failed.\n", + world_mpi_rank, fcn_name); + } + } + } + + if ( nerrors <= 0 ) { + + if ( ! recv_mssg(&mssg, SYNC_ACK_CODE) ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: recv_mssg() failed.\n", + world_mpi_rank, fcn_name); + } + } else if ( ( mssg.req != SYNC_ACK_CODE ) || + ( mssg.src != world_server_mpi_rank ) || + ( mssg.dest != world_mpi_rank ) || + ( mssg.magic != MSSG_MAGIC ) ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: Bad data in sync ack.\n", + world_mpi_rank, fcn_name); + } + } + } + + return; + +} /* do_sync() */ + + +/***************************************************************************** + * + * Function: get_max_nerrors() + * + * Purpose: Do an MPI_Allreduce to obtain the maximum value of nerrors + * across all processes. Return this value. + * + * Return: Success: Maximum of the nerrors global variables across + * all processes. + * + * Failure: -1 + * + * Programmer: JRM -- 1/3/06 + * + * Modifications: + * + * None. + * + *****************************************************************************/ + +int +get_max_nerrors(void) +{ + const char * fcn_name = "get_max_nerrors()"; + int max_nerrors; + int result; + + result = MPI_Allreduce((void *)&nerrors, + (void *)&max_nerrors, + 1, + MPI_INT, + MPI_MAX, + world_mpi_comm); + + if ( result != MPI_SUCCESS ) { + + nerrors++; + max_nerrors = -1; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: MPI_Allreduce() failed.\n", + world_mpi_rank, fcn_name ); + } + } + + return(max_nerrors); + +} /* get_max_nerrors() */ + + +/*****************************************************************************/ +/************************ mssg xfer related functions ************************/ +/*****************************************************************************/ + +/***************************************************************************** + * + * Function: recv_mssg() + * + * Purpose: Receive a message from any process in the provided instance + * of struct mssg. + * + * Return: Success: TRUE + * + * Failure: FALSE + * + * Programmer: JRM -- 12/22/05 + * + * Modifications: + * + * JRM -- 5/10/06 + * Added mssg_tag_offset parameter and supporting code. + * + *****************************************************************************/ + +#define CACHE_TEST_TAG 99 /* different from any used by the library */ + +hbool_t +recv_mssg(struct mssg_t *mssg_ptr, + int mssg_tag_offset) +{ + const char * fcn_name = "recv_mssg()"; + hbool_t success = TRUE; + int mssg_tag = CACHE_TEST_TAG; + int result; + MPI_Status status; + + if ( ( mssg_ptr == NULL ) || + ( mssg_tag_offset < 0 ) || + ( mssg_tag_offset> MAX_REQ_CODE ) ) { + + nerrors++; + success = FALSE; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: bad param(s) on entry.\n", + world_mpi_rank, fcn_name); + } + } else { + + mssg_tag += mssg_tag_offset; + } + + if ( success ) { + + result = MPI_Recv((void *)mssg_ptr, 1, mpi_mssg_t, MPI_ANY_SOURCE, + mssg_tag, world_mpi_comm, &status); + + if ( result != MPI_SUCCESS ) { + + nerrors++; + success = FALSE; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: MPI_Recv() failed.\n", + world_mpi_rank, fcn_name ); + } + } else if ( mssg_ptr->magic != MSSG_MAGIC ) { + + nerrors++; + success = FALSE; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: invalid magic.\n", world_mpi_rank, + fcn_name); + } + } else if ( mssg_ptr->src != status.MPI_SOURCE ) { + + nerrors++; + success = FALSE; + if ( verbose ) { + HDfprintf(stdout, + "%d:%s: mssg_ptr->src != status.MPI_SOURCE.\n", + world_mpi_rank, fcn_name); + } + } + } + + return(success); + +} /* recv_mssg() */ + + +/***************************************************************************** + * + * Function: send_mssg() + * + * Purpose: Send the provided instance of mssg to the indicated target. + * + * Note that all source and destination ranks are in the + * global communicator. + * + * Return: Success: TRUE + * + * Failure: FALSE + * + * Programmer: JRM -- 12/22/05 + * + * Modifications: + * + * JRM -- 5/10/06 + * Added the add_req_to_tag parameter and supporting code. + * + *****************************************************************************/ + +hbool_t +send_mssg(struct mssg_t *mssg_ptr, + hbool_t add_req_to_tag) +{ + const char * fcn_name = "send_mssg()"; + hbool_t success = TRUE; + int mssg_tag = CACHE_TEST_TAG; + int result; + static long mssg_num = 0; + + if ( ( mssg_ptr == NULL ) || + ( mssg_ptr->src != world_mpi_rank ) || + ( mssg_ptr->dest < 0 ) || + ( mssg_ptr->dest == mssg_ptr->src ) || + ( mssg_ptr->dest >= world_mpi_size ) || + ( mssg_ptr->req < 0 ) || + ( mssg_ptr->req > MAX_REQ_CODE ) || + ( mssg_ptr->magic != MSSG_MAGIC ) ) { + + nerrors++; + success = FALSE; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: Invalid mssg on entry.\n", + world_mpi_rank, fcn_name); + } + } + + if ( success ) { + + mssg_ptr->mssg_num = mssg_num++; + + if ( add_req_to_tag ) { + + mssg_tag += mssg_ptr->req; + } + + result = MPI_Send((void *)mssg_ptr, 1, mpi_mssg_t, + mssg_ptr->dest, mssg_tag, world_mpi_comm); + + if ( result != MPI_SUCCESS ) { + + nerrors++; + success = FALSE; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: MPI_Send() failed.\n", + world_mpi_rank, fcn_name); + } + } + } + + return(success); + +} /* send_mssg() */ + + +/***************************************************************************** + * + * Function: setup_derived_types() + * + * Purpose: Set up the derived types used by the test bed. At present, + * only the mpi_mssg derived type is needed. + * + * Return: Success: TRUE + * + * Failure: FALSE + * + * Programmer: JRM -- 12/22/05 + * + * Modifications: + * + * None. + * + *****************************************************************************/ + +hbool_t +setup_derived_types(void) +{ + const char * fcn_name = "setup_derived_types()"; + hbool_t success = TRUE; + int i; + int result; + MPI_Datatype mpi_types[8] = {MPI_INT, MPI_INT, MPI_INT, MPI_LONG, + HADDR_AS_MPI_TYPE, MPI_INT, MPI_INT, + MPI_UNSIGNED}; + int block_len[8] = {1, 1, 1, 1, 1, 1, 1, 1}; + MPI_Aint displs[8]; + struct mssg_t sample; /* used to compute displacements */ + + /* setup the displacements array */ + if ( ( MPI_SUCCESS != MPI_Address(&sample.req, &displs[0]) ) || + ( MPI_SUCCESS != MPI_Address(&sample.src, &displs[1]) ) || + ( MPI_SUCCESS != MPI_Address(&sample.dest, &displs[2]) ) || + ( MPI_SUCCESS != MPI_Address(&sample.mssg_num, &displs[3]) ) || + ( MPI_SUCCESS != MPI_Address(&sample.base_addr, &displs[4]) ) || + ( MPI_SUCCESS != MPI_Address(&sample.len, &displs[5]) ) || + ( MPI_SUCCESS != MPI_Address(&sample.ver, &displs[6]) ) || + ( MPI_SUCCESS != MPI_Address(&sample.magic, &displs[7]) ) ) { + + nerrors++; + success = FALSE; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: MPI_Address() call failed.\n", + world_mpi_rank, fcn_name); + } + + } else { + + /* Now calculate the actual displacements */ + for ( i = 7; i >= 0; --i) + { + displs[i] -= displs[0]; + } + } + + if ( success ) { + + result = MPI_Type_struct(8, block_len, displs, mpi_types, &mpi_mssg_t); + + if ( result != MPI_SUCCESS ) { + + nerrors++; + success = FALSE; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: MPI_Type_struct() call failed.\n", + world_mpi_rank, fcn_name); + } + } + } + + if ( success ) { + + result = MPI_Type_commit(&mpi_mssg_t); + + if ( result != MPI_SUCCESS) { + + nerrors++; + success = FALSE; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: MPI_Type_commit() call failed.\n", + world_mpi_rank, fcn_name); + } + } + } + + return(success); + +} /* setup_derived_types */ + + +/***************************************************************************** + * + * Function: takedown_derived_types() + * + * Purpose: take down the derived types used by the test bed. At present, + * only the mpi_mssg derived type is needed. + * + * Return: Success: TRUE + * + * Failure: FALSE + * + * Programmer: JRM -- 12/22/05 + * + * Modifications: + * + * None. + * + *****************************************************************************/ + +hbool_t +takedown_derived_types(void) +{ + const char * fcn_name = "takedown_derived_types()"; + hbool_t success = TRUE; + int result; + + result = MPI_Type_free(&mpi_mssg_t); + + if ( result != MPI_SUCCESS ) { + + nerrors++; + success = FALSE; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: MPI_Type_free() call failed.\n", + world_mpi_rank, fcn_name); + } + } + + return(success); + +} /* takedown_derived_types() */ + + +/*****************************************************************************/ +/***************************** server functions ******************************/ +/*****************************************************************************/ + +/***************************************************************************** + * + * Function: server_main() + * + * Purpose: Main function for the server process. This process exists + * to provide an independant view of the data array. + * + * The function handles request from the other processes in + * the test until the count of done messages received equals + * the number of client processes. + * + * Return: Success: TRUE + * + * Failure: FALSE + * + * Programmer: JRM -- 12/22/05 + * + * Modifications: + * + * JRM -- 5/10/06 + * Updated for sync message. + * + *****************************************************************************/ + +hbool_t +server_main(void) +{ + const char * fcn_name = "server_main()"; + hbool_t done = FALSE; + hbool_t success = TRUE; + int done_count = 0; + struct mssg_t mssg; + + if ( world_mpi_rank != world_server_mpi_rank ) { + + nerrors++; + success = FALSE; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: This isn't the server process?!?!?\n", + world_mpi_rank, fcn_name); + } + } + + + while ( ( success ) && ( ! done ) ) + { + success = recv_mssg(&mssg, 0); + + if ( success ) { + + switch ( mssg.req ) + { + case WRITE_REQ_CODE: + success = serve_write_request(&mssg); + break; + + case WRITE_REQ_ACK_CODE: + success = FALSE; + HDfprintf(stdout, "%s: Received write ack?!?.\n", fcn_name); + break; + + case READ_REQ_CODE: + success = serve_read_request(&mssg); + break; + + case READ_REQ_REPLY_CODE: + success = FALSE; + HDfprintf(stdout, "%s: Received read req reply?!?.\n", + fcn_name); + break; + + case SYNC_REQ_CODE: + success = serve_sync_request(&mssg); + break; + + case SYNC_ACK_CODE: + success = FALSE; + HDfprintf(stdout, "%s: Received sync ack?!?.\n", + fcn_name); + break; + + case DONE_REQ_CODE: + done_count++; + /* HDfprintf(stdout, "%d:%s: done_count = %d.\n", + world_mpi_rank, fcn_name, done_count); */ + if ( done_count >= file_mpi_size ) { + + done = TRUE; + } + break; + + default: + nerrors++; + success = FALSE; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: Unknown request code.\n", + world_mpi_rank, fcn_name); + } + break; + } + } + } + + return(success); + +} /* server_main() */ + + +/***************************************************************************** + * + * Function: serve_read_request() + * + * Purpose: Serve a read request. + * + * The function accepts a pointer to an instance of struct + * mssg_t as input. If all sanity checks pass, it sends + * a copy of the indicated datum from the data array to + * the requesting process. + * + * Return: Success: TRUE + * + * Failure: FALSE + * + * Programmer: JRM -- 12/22/05 + * + * Modifications: + * + * None. + * + *****************************************************************************/ + +hbool_t +serve_read_request(struct mssg_t * mssg_ptr) +{ + const char * fcn_name = "serve_read_request()"; + hbool_t success = TRUE; + int target_index; + haddr_t target_addr; + struct mssg_t reply; + + if ( ( mssg_ptr == NULL ) || + ( mssg_ptr->req != READ_REQ_CODE ) || + ( mssg_ptr->magic != MSSG_MAGIC ) ) { + + nerrors++; + success = FALSE; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: Bad mssg on entry.\n", + world_mpi_rank, fcn_name); + } + } + + if ( success ) { + + target_addr = mssg_ptr->base_addr; + target_index = addr_to_datum_index(target_addr); + + if ( target_index < 0 ) { + + nerrors++; + success = FALSE; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: addr lookup failed for %a.\n", + world_mpi_rank, fcn_name, target_addr); + } + } else if ( data[target_index].len != mssg_ptr->len ) { + + nerrors++; + success = FALSE; + if ( verbose ) { + HDfprintf(stdout, + "%d:%s: data[i].len = %Zu != mssg->len = %d.\n", + world_mpi_rank, fcn_name, + data[target_index].len, mssg_ptr->len); + } + } else if ( ! (data[target_index].valid) ) { + + nerrors++; + success = FALSE; + if ( verbose ) { + HDfprintf(stdout, + "%d:%s: proc %d read invalid entry. idx/base_addr = %d/%a.\n", + world_mpi_rank, fcn_name, + mssg_ptr->src, + target_index, + data[target_index].base_addr); + } + } else { + + /* compose the reply message */ + reply.req = READ_REQ_REPLY_CODE; + reply.src = world_mpi_rank; + reply.dest = mssg_ptr->src; + reply.mssg_num = -1; /* set by send function */ + reply.base_addr = data[target_index].base_addr; + reply.len = data[target_index].len; + reply.ver = data[target_index].ver; + reply.magic = MSSG_MAGIC; + } + } + + if ( success ) { + + success = send_mssg(&reply, TRUE); + } + + return(success); + +} /* serve_read_request() */ + + +/***************************************************************************** + * + * Function: serve_sync_request() + * + * Purpose: Serve a sync request. + * + * The function accepts a pointer to an instance of struct + * mssg_t as input. If all sanity checks pass, it sends a + * sync ack to the requesting process. + * + * This service exist to allow the sending process to ensure + * that all previous messages have been processed before + * proceeding. + * + * Return: Success: TRUE + * + * Failure: FALSE + * + * Programmer: JRM -- 5/10/06 + * + * Modifications: + * + * None. + * + *****************************************************************************/ + +hbool_t +serve_sync_request(struct mssg_t * mssg_ptr) +{ + const char * fcn_name = "serve_sync_request()"; + hbool_t success = TRUE; + struct mssg_t reply; + + if ( ( mssg_ptr == NULL ) || + ( mssg_ptr->req != SYNC_REQ_CODE ) || + ( mssg_ptr->magic != MSSG_MAGIC ) ) { + + nerrors++; + success = FALSE; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: Bad mssg on entry.\n", + world_mpi_rank, fcn_name); + } + } + + if ( success ) { + + /* compose the reply message */ + reply.req = SYNC_ACK_CODE; + reply.src = world_mpi_rank; + reply.dest = mssg_ptr->src; + reply.mssg_num = -1; /* set by send function */ + reply.base_addr = 0; + reply.len = 0; + reply.ver = 0; + reply.magic = MSSG_MAGIC; + } + + if ( success ) { + + success = send_mssg(&reply, TRUE); + } + + return(success); + +} /* serve_sync_request() */ + + +/***************************************************************************** + * + * Function: serve_write_request() + * + * Purpose: Serve a write request. + * + * The function accepts a pointer to an instance of struct + * mssg_t as input. If all sanity checks pass, it updates + * the version number of the target data array entry as + * specified in the message. + * + * Return: Success: TRUE + * + * Failure: FALSE + * + * Programmer: JRM -- 12/21/05 + * + * Modifications: + * + * JRM -- 5/9/06 + * Added code supporting a write ack message. This is a + * speculative fix to a bug observed on Cobalt. If it + * doesn't work, it will help narrow down the possibilities. + * + *****************************************************************************/ + +hbool_t +serve_write_request(struct mssg_t * mssg_ptr) +{ + const char * fcn_name = "serve_write_request()"; + hbool_t success = TRUE; + int target_index; + int new_ver_num; + haddr_t target_addr; +#if DO_WRITE_REQ_ACK + struct mssg_t reply; +#endif /* DO_WRITE_REQ_ACK */ + + if ( ( mssg_ptr == NULL ) || + ( mssg_ptr->req != WRITE_REQ_CODE ) || + ( mssg_ptr->magic != MSSG_MAGIC ) ) { + + nerrors++; + success = FALSE; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: Bad mssg on entry.\n", + world_mpi_rank, fcn_name); + } + } + + if ( success ) { + + target_addr = mssg_ptr->base_addr; + target_index = addr_to_datum_index(target_addr); + + if ( target_index < 0 ) { + + nerrors++; + success = FALSE; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: addr lookup failed for %a.\n", + world_mpi_rank, fcn_name, target_addr); + } + } else if ( data[target_index].len != mssg_ptr->len ) { + + nerrors++; + success = FALSE; + if ( verbose ) { + HDfprintf(stdout, + "%d:%s: data[i].len = %Zu != mssg->len = %d.\n", + world_mpi_rank, fcn_name, + data[target_index].len, mssg_ptr->len); + } + } + } + + if ( success ) { + + new_ver_num = mssg_ptr->ver; + + if ( new_ver_num <= data[target_index].ver ) { + + nerrors++; + success = FALSE; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: new ver = %d <= old ver = %d.\n", + world_mpi_rank, fcn_name, + new_ver_num, data[target_index].ver); + } + } + } + + if ( success ) { + + /* process the write */ + data[target_index].ver = new_ver_num; + data[target_index].valid = TRUE; + +#if DO_WRITE_REQ_ACK + + /* compose the reply message */ + reply.req = WRITE_REQ_ACK_CODE; + reply.src = world_mpi_rank; + reply.dest = mssg_ptr->src; + reply.mssg_num = -1; /* set by send function */ + reply.base_addr = data[target_index].base_addr; + reply.len = data[target_index].len; + reply.ver = data[target_index].ver; + reply.magic = MSSG_MAGIC; + + /* and send it */ + success = send_mssg(&reply, TRUE); + +#endif /* DO_WRITE_REQ_ACK */ + + } + + return(success); + +} /* serve_write_request() */ + + +/*****************************************************************************/ +/**************************** Call back functions ****************************/ +/*****************************************************************************/ + +/*------------------------------------------------------------------------- + * Function: datum_clear_dirty_bits + * + * Purpose: Clear the dirty bits of the target entry. + * + * Return: SUCCEED + * + * Programmer: John Mainzer + * 10/30/07 + * + * Modifications: + * + * None + * + *------------------------------------------------------------------------- + */ + +herr_t +datum_clear_dirty_bits(UNUSED haddr_t addr, + UNUSED size_t len, + void * thing) +{ + int idx; + struct datum * entry_ptr; + + HDassert( thing ); + + entry_ptr = (struct datum *)thing; + + idx = addr_to_datum_index(entry_ptr->base_addr); + + if ( callbacks_verbose ) { + + HDfprintf(stdout, + "%d: clear_dirty_bits() idx = %d, addr = %ld, len = %d.\n", + world_mpi_rank, idx, (long)addr, (int)len); + fflush(stdout); + } + + HDassert( idx >= 0 ); + HDassert( idx < NUM_DATA_ENTRIES ); + HDassert( idx < virt_num_data_entries ); + HDassert( &(data[idx]) == entry_ptr ); + + HDassert( entry_ptr->header.addr == entry_ptr->base_addr ); + HDassert( ( entry_ptr->header.size == entry_ptr->len ) || + ( entry_ptr->header.size == entry_ptr->local_len ) ); + + entry_ptr->dirty = FALSE; + + datum_clears++; + + if ( entry_ptr->header.is_pinned ) { + + datum_pinned_clears++; + HDassert( entry_ptr->global_pinned || entry_ptr->local_pinned ); + } + + return(SUCCEED); + +} /* datum_clear_dirty_bits() */ + + +/*------------------------------------------------------------------------- + * Function: datum_deserialize + * + * Purpose: deserialize the entry. + * + * Return: void * (pointer to the in core representation of the entry) + * + * Programmer: John Mainzer + * 9/20/07 + * + * Modifications: + * + * None + * + *------------------------------------------------------------------------- + */ + +void * +datum_deserialize(haddr_t addr, + UNUSED size_t len, + const void * image_ptr, + const UNUSED void * udata_ptr, + hbool_t * dirty_ptr) +{ + const char * fcn_name = "load_datum()"; + hbool_t success = TRUE; + int idx; + struct datum * entry_ptr = NULL; + struct mssg_t mssg; + + HDassert( image_ptr != NULL ); + + idx = addr_to_datum_index(addr); + + HDassert( idx >= 0 ); + HDassert( idx < NUM_DATA_ENTRIES ); + HDassert( idx < virt_num_data_entries ); + + entry_ptr = &(data[idx]); + + HDassert( addr == entry_ptr->base_addr ); + HDassert( ! entry_ptr->global_pinned ); + HDassert( ! entry_ptr->local_pinned ); + + if ( callbacks_verbose ) { + + HDfprintf(stdout, + "%d: deserialize() idx = %d, addr = %ld, len = %d, is_dirty = %d.\n", + world_mpi_rank, idx, (long)addr, (int)len, + (int)(entry_ptr->header.is_dirty)); + fflush(stdout); + } + + /* compose the read message */ + mssg.req = READ_REQ_CODE; + mssg.src = world_mpi_rank; + mssg.dest = world_server_mpi_rank; + mssg.mssg_num = -1; /* set by send function */ + mssg.base_addr = entry_ptr->base_addr; + mssg.len = entry_ptr->len; + mssg.ver = 0; /* bogus -- should be corrected by server */ + mssg.magic = MSSG_MAGIC; + + if ( ! send_mssg(&mssg, FALSE) ) { + + nerrors++; + success = FALSE; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: send_mssg() failed.\n", + world_mpi_rank, fcn_name); + } + } + + if ( success ) { + + if ( ! recv_mssg(&mssg, READ_REQ_REPLY_CODE) ) { + + nerrors++; + success = FALSE; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: recv_mssg() failed.\n", + world_mpi_rank, fcn_name); + } + } + } + + if ( success ) { + + if ( ( mssg.req != READ_REQ_REPLY_CODE ) || + ( mssg.src != world_server_mpi_rank ) || + ( mssg.dest != world_mpi_rank ) || + ( mssg.base_addr != entry_ptr->base_addr ) || + ( mssg.len != entry_ptr->len ) || + ( mssg.ver < entry_ptr->ver ) || + ( mssg.magic != MSSG_MAGIC ) ) { + + nerrors++; + success = FALSE; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: Bad data in read req reply.\n", + world_mpi_rank, fcn_name); + } +#if 0 /* This has been useful debugging code -- keep it for now. */ + if ( mssg.req != READ_REQ_REPLY_CODE ) { + + HDfprintf(stdout, "%d:%s: mssg.req != READ_REQ_REPLY_CODE.\n", + world_mpi_rank, fcn_name); + HDfprintf(stdout, "%d:%s: mssg.req = %d.\n", + world_mpi_rank, fcn_name, (int)(mssg.req)); + } + + if ( mssg.src != world_server_mpi_rank ) { + + HDfprintf(stdout, "%d:%s: mssg.src != world_server_mpi_rank.\n", + world_mpi_rank, fcn_name); + } + + if ( mssg.dest != world_mpi_rank ) { + + HDfprintf(stdout, "%d:%s: mssg.dest != world_mpi_rank.\n", + world_mpi_rank, fcn_name); + } + + if ( mssg.base_addr != entry_ptr->base_addr ) { + + HDfprintf(stdout, + "%d:%s: mssg.base_addr != entry_ptr->base_addr.\n", + world_mpi_rank, fcn_name); + HDfprintf(stdout, "%d:%s: mssg.base_addr = %a.\n", + world_mpi_rank, fcn_name, mssg.base_addr); + HDfprintf(stdout, "%d:%s: entry_ptr->base_addr = %a.\n", + world_mpi_rank, fcn_name, entry_ptr->base_addr); + } + + if ( mssg.len != entry_ptr->len ) { + + HDfprintf(stdout, "%d:%s: mssg.len != entry_ptr->len.\n", + world_mpi_rank, fcn_name); + HDfprintf(stdout, "%d:%s: mssg.len = %a.\n", + world_mpi_rank, fcn_name, mssg.len); + } + + if ( mssg.ver < entry_ptr->ver ) { + + HDfprintf(stdout, "%d:%s: mssg.ver < entry_ptr->ver.\n", + world_mpi_rank, fcn_name); + } + + if ( mssg.magic != MSSG_MAGIC ) { + + HDfprintf(stdout, "%d:%s: mssg.magic != MSSG_MAGIC.\n", + world_mpi_rank, fcn_name); + } +#endif /* JRM */ + } else { + + entry_ptr->ver = mssg.ver; + entry_ptr->dirty = FALSE; + *dirty_ptr = FALSE; + } + } + + if ( ! success ) { + + entry_ptr = NULL; + + } + + datum_loads++; + + return(entry_ptr); + +} /* deserialize() */ + + +/*------------------------------------------------------------------------- + * Function: datum_image_len + * + * Purpose: Return the real (and possibly reduced) length of the image. + * The helper functions verify that the correct version of + * deserialize is being called, and then call deserialize + * proper. + * + * Return: SUCCEED + * + * Programmer: John Mainzer + * 9/19/07 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +herr_t +datum_image_len(void *thing, + size_t *image_len_ptr) +{ + + + int idx; + struct datum * entry_ptr; + + HDassert( thing ); + HDassert( image_len_ptr ); + + entry_ptr = (struct datum *)thing; + + idx = addr_to_datum_index(entry_ptr->base_addr); + + HDassert( idx >= 0 ); + HDassert( idx < NUM_DATA_ENTRIES ); + HDassert( idx < virt_num_data_entries ); + HDassert( &(data[idx]) == entry_ptr ); + HDassert( entry_ptr->local_len > 0 ); + HDassert( entry_ptr->local_len <= entry_ptr->len ); + + if ( callbacks_verbose ) { + + HDfprintf(stdout, + "%d: image_len() idx = %d, addr = %ld, len = %d.\n", + world_mpi_rank, idx, (long)(entry_ptr->base_addr), + (int)(entry_ptr->local_len)); + fflush(stdout); + } + + HDassert( entry_ptr->header.addr == entry_ptr->base_addr ); + + *image_len_ptr = entry_ptr->local_len; + + return(SUCCEED); + +} /* datum_image_len() */ + + +/*------------------------------------------------------------------------- + * Function: datum_serialize + * + * Purpose: Serialize the supplied entry. + * + * Return: SUCCEED if successful, FAIL otherwise. + * + * Programmer: John Mainzer + * 10/30/07 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +herr_t +datum_serialize(const H5F_t UNUSED *f, + hid_t UNUSED dxpl_id, + haddr_t UNUSED addr, + size_t UNUSED len, + void * image_ptr, + void * thing, + unsigned * flags_ptr, + haddr_t * new_addr_ptr, + size_t * new_len_ptr, + void ** new_image_ptr_ptr) +{ + + const char * fcn_name = "datum_serialize()"; + herr_t ret_value = SUCCEED; + int idx; + struct datum * entry_ptr; + struct mssg_t mssg; + + HDassert( thing ); + HDassert( image_ptr ); + HDassert( flags_ptr ); + + *flags_ptr = 0; + + HDassert( new_addr_ptr ); + HDassert( new_len_ptr ); + HDassert( new_image_ptr_ptr ); + + entry_ptr = (struct datum *)thing; + + idx = addr_to_datum_index(entry_ptr->base_addr); + + HDassert( idx >= 0 ); + HDassert( idx < NUM_DATA_ENTRIES ); + HDassert( idx < virt_num_data_entries ); + HDassert( &(data[idx]) == entry_ptr ); + + if ( callbacks_verbose ) { + + HDfprintf(stdout, + "%d: serialize() idx = %d, addr = %ld, len = %d.\n", + world_mpi_rank, idx, (long)addr, (int)len); + fflush(stdout); + } + + HDassert( entry_ptr->header.addr == entry_ptr->base_addr ); + HDassert( ( entry_ptr->header.size == entry_ptr->len ) || + ( entry_ptr->header.size == entry_ptr->local_len ) ); + + HDassert( entry_ptr->header.is_dirty == entry_ptr->dirty ); + + if ( ( file_mpi_rank != 0 ) && ( entry_ptr->dirty ) ) { + + ret_value = FAIL; + HDfprintf(stdout, + "%d:%s: Flushed dirty entry from non-zero file process.", + world_mpi_rank, fcn_name); + } + + if ( ret_value == SUCCEED ) { + + if ( entry_ptr->header.is_dirty ) { + + /* compose the message */ + mssg.req = WRITE_REQ_CODE; + mssg.src = world_mpi_rank; + mssg.dest = world_server_mpi_rank; + mssg.mssg_num = -1; /* set by send function */ + mssg.base_addr = entry_ptr->base_addr; + mssg.len = entry_ptr->len; + mssg.ver = entry_ptr->ver; + mssg.magic = MSSG_MAGIC; + + if ( ! send_mssg(&mssg, FALSE) ) { + + nerrors++; + ret_value = FAIL; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: send_mssg() failed.\n", + world_mpi_rank, fcn_name); + } + } + else + { + entry_ptr->header.is_dirty = FALSE; + entry_ptr->dirty = FALSE; + } + } + } + +#if DO_WRITE_REQ_ACK + + if ( ( ret_value == SUCCEED ) && ( entry_ptr->header.is_dirty ) ) { + + if ( ! recv_mssg(&mssg, WRITE_REQ_ACK_CODE) ) { + + nerrors++; + ret_value = FAIL; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: recv_mssg() failed.\n", + world_mpi_rank, fcn_name); + } + } else if ( ( mssg.req != WRITE_REQ_ACK_CODE ) || + ( mssg.src != world_server_mpi_rank ) || + ( mssg.dest != world_mpi_rank ) || + ( mssg.base_addr != entry_ptr->base_addr ) || + ( mssg.len != entry_ptr->len ) || + ( mssg.ver != entry_ptr->ver ) || + ( mssg.magic != MSSG_MAGIC ) ) { + + nerrors++; + ret_value = FAIL; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: Bad data in write req ack.\n", + world_mpi_rank, fcn_name); + } + } + } + +#endif /* DO_WRITE_REQ_ACK */ + + datum_flushes++; + + if ( entry_ptr->header.is_pinned ) { + + datum_pinned_flushes++; + HDassert( entry_ptr->global_pinned || entry_ptr->local_pinned ); + } + + return(ret_value); + +} /* datum_serialize() */ + + +/*------------------------------------------------------------------------- + * Function: datum_free_icr + * + * Purpose: Nominally, this callback is supposed to free the + * in core representation of the entry. + * + * In the context of this test bed, we use it to do + * do all the processing we used to do on a destroy. + * + * Return: SUCCEED + * + * Programmer: John Mainzer + * 9/19/07 + * + * Modifications: + * + * None. + * + *------------------------------------------------------------------------- + */ + +herr_t +datum_free_icr(UNUSED haddr_t addr, + UNUSED size_t len, + void * thing) +{ + int idx; + struct datum * entry_ptr; + + HDassert( thing ); + + entry_ptr = (struct datum *)thing; + + idx = addr_to_datum_index(entry_ptr->base_addr); + + HDassert( idx >= 0 ); + HDassert( idx < NUM_DATA_ENTRIES ); + HDassert( idx < virt_num_data_entries ); + HDassert( &(data[idx]) == entry_ptr ); + + if ( callbacks_verbose ) { + + HDfprintf(stdout, + "%d: free_icr() idx = %d, addr = %ld, len = %d, dirty = %d.\n", + world_mpi_rank, idx, (long)addr, (int)len, + (int)(entry_ptr->dirty)); + fflush(stdout); + } + + HDassert( entry_ptr->header.addr == entry_ptr->base_addr ); + HDassert( ( entry_ptr->header.size == entry_ptr->len ) || + ( entry_ptr->header.size == entry_ptr->local_len ) ); + + HDassert( !(entry_ptr->dirty) ); + HDassert( !(entry_ptr->header.is_dirty) ); + HDassert( !(entry_ptr->global_pinned) ); + HDassert( !(entry_ptr->local_pinned) ); + HDassert( !(entry_ptr->header.is_pinned) ); + + datum_destroys++; + + return(SUCCEED); + +} /* datum_free_icr() */ + + +/*****************************************************************************/ +/************************** test utility functions ***************************/ +/*****************************************************************************/ + +/***************************************************************************** + * Function: expunge_entry() + * + * Purpose: Expunge the entry indicated by the type and index, mark it + * as clean, and don't increment its version number. + * + * Do nothing if nerrors is non-zero on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 07/11/06 + * + * Modifications: + * + * None. + * + *****************************************************************************/ + +void +expunge_entry(H5C_t * cache_ptr, + H5F_t * file_ptr, + int32_t idx) +{ + const char * fcn_name = "expunge_entry()"; + hbool_t in_cache; + herr_t result; + struct datum * entry_ptr; + + HDassert( cache_ptr ); + HDassert( file_ptr ); + HDassert( ( 0 <= idx ) && ( idx < NUM_DATA_ENTRIES ) ); + HDassert( idx < virt_num_data_entries ); + + entry_ptr = &(data[idx]); + + HDassert( !(entry_ptr->locked) ); + HDassert( !(entry_ptr->global_pinned) ); + HDassert( !(entry_ptr->local_pinned) ); + + entry_ptr->dirty = FALSE; + + if ( nerrors == 0 ) { + + result = H5AC_expunge_entry(file_ptr, -1, &(types[0]), + entry_ptr->header.addr); + + if ( result < 0 ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: Error in H5AC_expunge_entry().\n", + world_mpi_rank, fcn_name); + } + } + + HDassert( ((entry_ptr->header).type)->id == DATUM_ENTRY_TYPE ); + HDassert( ! ((entry_ptr->header).is_dirty) ); + + result = H5C_get_entry_status(file_ptr, entry_ptr->base_addr, + NULL, &in_cache, NULL, NULL, NULL); + + if ( result < 0 ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: Error in H5C_get_entry_status().\n", + world_mpi_rank, fcn_name); + } + } else if ( in_cache ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: Expunged entry still in cache?!?\n", + world_mpi_rank, fcn_name); + } + } + } + + return; + +} /* expunge_entry() */ + + +/***************************************************************************** + * Function: insert_entry() + * + * Purpose: Insert the entry indicated by the type and index, mark it + * as dirty, and increment its version number. + * + * Do nothing if nerrors is non-zero on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 01/04/06 + * + * Modifications: + * + * JRM -- 8/11/06 + * Updated code to reflect the fact that entries can now be + * inserted pinned. Note that since all inserts are dirty, + * any pins must be global pins. + * + *****************************************************************************/ + +void +insert_entry(H5C_t * cache_ptr, + H5F_t * file_ptr, + int32_t idx, + unsigned int flags) +{ + const char * fcn_name = "insert_entry()"; + hbool_t insert_pinned; + herr_t result; + struct datum * entry_ptr; + + HDassert( cache_ptr ); + HDassert( file_ptr ); + HDassert( ( 0 <= idx ) && ( idx < NUM_DATA_ENTRIES ) ); + HDassert( idx < virt_num_data_entries ); + + entry_ptr = &(data[idx]); + + HDassert( !(entry_ptr->locked) ); + + insert_pinned = ((flags & H5C__PIN_ENTRY_FLAG) != 0 ); + + if ( nerrors == 0 ) { + + (entry_ptr->ver)++; + entry_ptr->dirty = TRUE; + + result = H5AC_set(file_ptr, H5P_DATASET_XFER_DEFAULT, &(types[0]), + entry_ptr->base_addr, entry_ptr->local_len, + (void *)(&(entry_ptr->header)), flags); + + if ( ( result < 0 ) || + ( entry_ptr->header.type != &(types[0]) ) || + ( entry_ptr->len != entry_ptr->header.size ) || + ( entry_ptr->base_addr != entry_ptr->header.addr ) ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: Error in H5AC_set().\n", + world_mpi_rank, fcn_name); + } + } + + if ( ! (entry_ptr->header.is_dirty) ) { + + /* it is possible that we just exceeded the dirty bytes + * threshold, triggering a write of the newly inserted + * entry. Test for this, and only flag an error if this + * is not the case. + */ + + struct H5AC_aux_t * aux_ptr; + + aux_ptr = ((H5AC_aux_t *)(cache_ptr->aux_ptr)); + + if ( ! ( ( aux_ptr != NULL ) && + ( aux_ptr->magic == H5AC__H5AC_AUX_T_MAGIC ) && + ( aux_ptr->dirty_bytes == 0 ) ) ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: data[%d].header.is_dirty = %d.\n", + world_mpi_rank, fcn_name, idx, + (int)(data[idx].header.is_dirty)); + } + } + } + + if ( insert_pinned ) { + + HDassert( entry_ptr->header.is_pinned ); + entry_ptr->global_pinned = TRUE; + global_pins++; + + } else { + + HDassert( ! ( entry_ptr->header.is_pinned ) ); + entry_ptr->global_pinned = FALSE; + + } + + /* HDassert( entry_ptr->header.is_dirty ); */ + HDassert( ((entry_ptr->header).type)->id == DATUM_ENTRY_TYPE ); + } + + return; + +} /* insert_entry() */ + + +/***************************************************************************** + * Function: local_pin_and_unpin_random_entries() + * + * Purpose: Pin a random number of randomly selected entries in cache, and + * then unpin a random number of entries. + * + * Do nothing if nerrors is non-zero on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 4/12/06 + * + * Modifications: + * + *****************************************************************************/ + +void +local_pin_and_unpin_random_entries(H5C_t * cache_ptr, + H5F_t * file_ptr, + int min_idx, + int max_idx, + int min_count, + int max_count) +{ + /* const char * fcn_name = "local_pin_and_unpin_random_entries()"; */ + + if ( nerrors == 0 ) { + + hbool_t via_unprotect; + int count; + int i; + int idx; + + HDassert( cache_ptr ); + HDassert( file_ptr ); + HDassert( 0 <= min_idx ); + HDassert( min_idx < max_idx ); + HDassert( max_idx < NUM_DATA_ENTRIES ); + HDassert( max_idx < virt_num_data_entries ); + HDassert( 0 <= min_count ); + HDassert( min_count < max_count ); + + count = (HDrand() % (max_count - min_count)) + min_count; + + HDassert( min_count <= count ); + HDassert( count <= max_count ); + + for ( i = 0; i < count; i++ ) + { + local_pin_random_entry(cache_ptr, file_ptr, min_idx, max_idx); + } + + count = (HDrand() % (max_count - min_count)) + min_count; + + HDassert( min_count <= count ); + HDassert( count <= max_count ); + + i = 0; + idx = 0; + + while ( ( i < count ) && ( idx >= 0 ) ) + { + via_unprotect = ( (((unsigned)i) & 0x0001) == 0 ); + idx = local_unpin_next_pinned_entry(cache_ptr, file_ptr, + idx, via_unprotect); + i++; + } + } + + return; + +} /* local_pin_and_unpin_random_entries() */ + + +/***************************************************************************** + * Function: local_pin_random_entry() + * + * Purpose: Pin a randomly selected entry in cache, and mark the entry + * as being locally pinned. Since this entry will not in + * general be pinned in any other cache, we can't mark it + * dirty. + * + * Do nothing if nerrors is non-zero on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 4/12/06 + * + * Modifications: + * + *****************************************************************************/ + +void +local_pin_random_entry(H5C_t * cache_ptr, + H5F_t * file_ptr, + int min_idx, + int max_idx) +{ + /* const char * fcn_name = "local_pin_random_entry()"; */ + int idx; + + if ( nerrors == 0 ) { + + HDassert( cache_ptr ); + HDassert( file_ptr ); + HDassert( 0 <= min_idx ); + HDassert( min_idx < max_idx ); + HDassert( max_idx < NUM_DATA_ENTRIES ); + HDassert( max_idx < virt_num_data_entries ); + + do + { + idx = (HDrand() % (max_idx - min_idx)) + min_idx; + HDassert( min_idx <= idx ); + HDassert( idx <= max_idx ); + } + while ( data[idx].global_pinned || data[idx].local_pinned ); + + pin_entry(cache_ptr, file_ptr, idx, FALSE, FALSE); + } + + return; + +} /* local_pin_random_entry() */ + + +/***************************************************************************** + * Function: local_unpin_all_entries() + * + * Purpose: Unpin all local pinned entries. + * + * Do nothing if nerrors is non-zero on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 4/12/06 + * + * Modifications: + * + *****************************************************************************/ + +void +local_unpin_all_entries(H5C_t * cache_ptr, + H5F_t * file_ptr, + hbool_t via_unprotect) +{ + /* const char * fcn_name = "local_unpin_all_entries()"; */ + + if ( nerrors == 0 ) { + + int idx; + + HDassert( cache_ptr ); + HDassert( file_ptr ); + + idx = 0; + + while ( idx >= 0 ) + { + idx = local_unpin_next_pinned_entry(cache_ptr, file_ptr, + idx, via_unprotect); + } + } + + return; + +} /* local_unpin_all_entries() */ + + +/***************************************************************************** + * Function: local_unpin_next_pinned_entry() + * + * Purpose: Find the next locally pinned entry after the specified + * starting point, and unpin it. + * + * Do nothing if nerrors is non-zero on entry. + * + * Return: Index of the unpinned entry if there is one, or -1 if + * nerrors is non-zero on entry, or if there is no locally + * pinned entry. + * + * Programmer: John Mainzer + * 4/12/06 + * + * Modifications: + * + *****************************************************************************/ + +int +local_unpin_next_pinned_entry(H5C_t * cache_ptr, + H5F_t * file_ptr, + int start_idx, + hbool_t via_unprotect) +{ + /* const char * fcn_name = "local_unpin_next_pinned_entry()"; */ + int i = 0; + int idx = -1; + + if ( nerrors == 0 ) { + + HDassert( cache_ptr ); + HDassert( file_ptr ); + HDassert( 0 <= start_idx ); + HDassert( start_idx < NUM_DATA_ENTRIES ); + HDassert( start_idx < virt_num_data_entries ); + + idx = start_idx; + + while ( ( i < virt_num_data_entries ) && + ( ! ( data[idx].local_pinned ) ) ) + { + i++; + idx++; + if ( idx >= virt_num_data_entries ) { + idx = 0; + } + } + + if ( data[idx].local_pinned ) { + + unpin_entry(cache_ptr, file_ptr, idx, FALSE, FALSE, via_unprotect); + + } else { + + idx = -1; + } + } + + return(idx); + +} /* local_unpin_next_pinned_entry() */ + + +/***************************************************************************** + * Function: lock_and_unlock_random_entries() + * + * Purpose: Obtain a random number in the closed interval [min_count, + * max_count]. Then protect and unprotect that number of + * random entries. + * + * Do nothing if nerrors is non-zero on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 1/12/06 + * + * Modifications: + * + *****************************************************************************/ + +void +lock_and_unlock_random_entries(H5C_t * cache_ptr, + H5F_t * file_ptr, + int min_idx, + int max_idx, + int min_count, + int max_count) +{ + /* const char * fcn_name = "lock_and_unlock_random_entries()"; */ + int count; + int i; + + if ( nerrors == 0 ) { + + HDassert( cache_ptr ); + HDassert( file_ptr ); + HDassert( 0 <= min_count ); + HDassert( min_count < max_count ); + + count = (HDrand() % (max_count - min_count)) + min_count; + + HDassert( min_count <= count ); + HDassert( count <= max_count ); + + for ( i = 0; i < count; i++ ) + { + lock_and_unlock_random_entry(cache_ptr, file_ptr, min_idx, max_idx); + } + } + + return; + +} /* lock_and_unlock_random_entries() */ + + +/***************************************************************************** + * Function: lock_and_unlock_random_entry() + * + * Purpose: Protect and then unprotect a random entry with index in + * the data[] array in the close interval [min_idx, max_idx]. + * + * Do nothing if nerrors is non-zero on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 1/4/06 + * + * Modifications: + * + *****************************************************************************/ + +void +lock_and_unlock_random_entry(H5C_t * cache_ptr, + H5F_t * file_ptr, + int min_idx, + int max_idx) +{ + /* const char * fcn_name = "lock_and_unlock_random_entry()"; */ + int idx; + + if ( nerrors == 0 ) { + + HDassert( cache_ptr ); + HDassert( file_ptr ); + HDassert( 0 <= min_idx ); + HDassert( min_idx < max_idx ); + HDassert( max_idx < NUM_DATA_ENTRIES ); + HDassert( max_idx < virt_num_data_entries ); + + idx = (HDrand() % (max_idx - min_idx)) + min_idx; + + HDassert( min_idx <= idx ); + HDassert( idx <= max_idx ); + + lock_entry(cache_ptr, file_ptr, idx); + unlock_entry(cache_ptr, file_ptr, idx, H5AC__NO_FLAGS_SET); + } + + return; + +} /* lock_and_unlock_random_entry() */ + + +/***************************************************************************** + * Function: lock_entry() + * + * Purpose: Protect the entry indicated by the index. + * + * Do nothing if nerrors is non-zero on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 1/4/06 + * + * Modifications: + * + * JRM -- 7/11/06 + * Modified asserts to handle the new local_len field in + * datum. + * + *****************************************************************************/ + +void +lock_entry(H5C_t * cache_ptr, + H5F_t * file_ptr, + int32_t idx) +{ + const char * fcn_name = "lock_entry()"; + struct datum * entry_ptr; + H5C_cache_entry_t * cache_entry_ptr; + + if ( nerrors == 0 ) { + + HDassert( cache_ptr ); + HDassert( ( 0 <= idx ) && ( idx < NUM_DATA_ENTRIES ) ); + HDassert( idx < virt_num_data_entries ); + + entry_ptr = &(data[idx]); + + HDassert( ! (entry_ptr->locked) ); + + cache_entry_ptr = H5AC_protect(file_ptr, H5P_DATASET_XFER_DEFAULT, + &(types[0]), entry_ptr->base_addr, + entry_ptr->local_len, NULL, H5AC_WRITE); + + if ( ( cache_entry_ptr != (void *)(&(entry_ptr->header)) ) || + ( entry_ptr->header.type != &(types[0]) ) || + ( ( entry_ptr->len != entry_ptr->header.size ) && + ( entry_ptr->local_len != entry_ptr->header.size ) ) || + ( entry_ptr->base_addr != entry_ptr->header.addr ) ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: error in H5AC_protect().\n", + world_mpi_rank, fcn_name); + } + } else { + + entry_ptr->locked = TRUE; + + } + + HDassert( ((entry_ptr->header).type)->id == DATUM_ENTRY_TYPE ); + } + + return; + +} /* lock_entry() */ + + +/***************************************************************************** + * Function: mark_pinned_entry_dirty() + * + * Purpose: Mark dirty the entry indicated by the index, + * + * Do nothing if nerrors is non-zero on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 4/14/06 + * + * Modifications: + * + *****************************************************************************/ + +void +mark_pinned_entry_dirty(H5C_t * cache_ptr, + H5F_t * file_ptr, + int32_t idx, + hbool_t size_changed, + size_t new_size) +{ + const char * fcn_name = "mark_pinned_entry_dirty()"; + herr_t result; + struct datum * entry_ptr; + + if ( nerrors == 0 ) { + + HDassert( file_ptr ); + HDassert( cache_ptr ); + HDassert( ( 0 <= idx ) && ( idx < NUM_DATA_ENTRIES ) ); + HDassert( idx < virt_num_data_entries ); + + entry_ptr = &(data[idx]); + + HDassert ( entry_ptr->global_pinned ); + HDassert ( ! (entry_ptr->local_pinned) ); + + (entry_ptr->ver)++; + entry_ptr->dirty = TRUE; + + result = H5AC_mark_pinned_entry_dirty( (void *)entry_ptr, + size_changed, + new_size); + + if ( result < 0 ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, + "%d:%s: error in H5AC_mark_pinned_entry_dirty().\n", + world_mpi_rank, fcn_name); + } + } + else + { + global_dirty_pins++; + } + } + + return; + +} /* mark_pinned_entry_dirty() */ + + +/***************************************************************************** + * Function: mark_pinned_or_protected_entry_dirty() + * + * Purpose: Use the H5AC_mark_pinned_or_protected_entry_dirty() call to + * mark dirty the entry indicated by the index, + * + * Do nothing if nerrors is non-zero on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 5/18/06 + * + * Modifications: + * + *****************************************************************************/ + +void +mark_pinned_or_protected_entry_dirty(H5C_t * cache_ptr, + H5F_t * file_ptr, + int32_t idx) +{ + const char * fcn_name = "mark_pinned_or_protected_entry_dirty()"; + herr_t result; + struct datum * entry_ptr; + + if ( nerrors == 0 ) { + + HDassert( file_ptr ); + HDassert( cache_ptr ); + HDassert( ( 0 <= idx ) && ( idx < NUM_DATA_ENTRIES ) ); + HDassert( idx < virt_num_data_entries ); + + entry_ptr = &(data[idx]); + + HDassert ( entry_ptr->locked || entry_ptr->global_pinned ); + + (entry_ptr->ver)++; + entry_ptr->dirty = TRUE; + + result = H5AC_mark_pinned_or_protected_entry_dirty( (void *)entry_ptr); + + if ( result < 0 ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: error in %s.\n", + world_mpi_rank, fcn_name, + "H5AC_mark_pinned_or_protected_entry_dirty()"); + } + } + else if ( ! ( entry_ptr->locked ) ) + { + global_dirty_pins++; + } + } + + return; + +} /* mark_pinned_or_protected_entry_dirty() */ + + +/***************************************************************************** + * Function: pin_entry() + * + * Purpose: Pin the entry indicated by the index. + * + * Do nothing if nerrors is non-zero on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 4/11/06 + * + * Modifications: + * + *****************************************************************************/ + +void +pin_entry(H5C_t * cache_ptr, + H5F_t * file_ptr, + int32_t idx, + hbool_t global, + hbool_t dirty) +{ + /* const char * fcn_name = "pin_entry()"; */ + unsigned int flags = H5AC__PIN_ENTRY_FLAG; + struct datum * entry_ptr; + + if ( nerrors == 0 ) { + + HDassert( cache_ptr ); + HDassert( file_ptr ); + HDassert( ( 0 <= idx ) && ( idx < NUM_DATA_ENTRIES ) ); + HDassert( idx < virt_num_data_entries ); + + entry_ptr = &(data[idx]); + + HDassert ( ! (entry_ptr->global_pinned) ); + HDassert ( ! (entry_ptr->local_pinned) ); + HDassert ( ! ( dirty && ( ! global ) ) ); + + lock_entry(cache_ptr, file_ptr, idx); + + if ( dirty ) { + + flags |= H5AC__DIRTIED_FLAG; + } + + unlock_entry(cache_ptr, file_ptr, idx, flags); + + HDassert( (entry_ptr->header).is_pinned ); + HDassert( ( ! dirty ) || ( (entry_ptr->header).is_dirty ) ); + + if ( global ) { + + entry_ptr->global_pinned = TRUE; + + global_pins++; + + } else { + + entry_ptr->local_pinned = TRUE; + + local_pins++; + + } + } + + return; + +} /* pin_entry() */ + + +/***************************************************************************** + * Function: pin_protected_entry() + * + * Purpose: Insert the entry indicated by the type and index, mark it + * as dirty, and increment its version number. + * + * Do nothing if nerrors is non-zero on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 01/04/06 + * + * Modifications: + * + * None. + * + *****************************************************************************/ + +void +pin_protected_entry(H5C_t * cache_ptr, + H5F_t * file_ptr, + int32_t idx, + hbool_t global) +{ + const char * fcn_name = "pin_protected_entry()"; + herr_t result; + struct datum * entry_ptr; + + HDassert( cache_ptr ); + HDassert( file_ptr ); + HDassert( ( 0 <= idx ) && ( idx < NUM_DATA_ENTRIES ) ); + HDassert( idx < virt_num_data_entries ); + + entry_ptr = &(data[idx]); + + HDassert( entry_ptr->locked ); + + if ( nerrors == 0 ) { + + result = H5AC_pin_protected_entry((void *)entry_ptr); + + if ( ( result < 0 ) || + ( entry_ptr->header.type != &(types[0]) ) || + ( ( entry_ptr->len != entry_ptr->header.size ) && + ( entry_ptr->local_len != entry_ptr->header.size ) )|| + ( entry_ptr->base_addr != entry_ptr->header.addr ) || + ( ! ( (entry_ptr->header).is_pinned ) ) ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, + "%d:%s: Error in H5AC_pin_protected entry().\n", + world_mpi_rank, fcn_name); + } + } + + if ( global ) { + + entry_ptr->global_pinned = TRUE; + + global_pins++; + + } else { + + entry_ptr->local_pinned = TRUE; + + local_pins++; + + } + + HDassert( ((entry_ptr->header).type)->id == DATUM_ENTRY_TYPE ); + } + + return; + +} /* pin_protected_entry() */ + + +/***************************************************************************** + * Function: rename_entry() + * + * Purpose: Rename the entry indicated old_idx to the entry indicated + * by new_idex. Touch up the data array so that flush will + * not choke. + * + * Do nothing if nerrors isn't zero, or if old_idx equals + * new_idx. + * + * Return: void + * + * Programmer: John Mainzer + * 1/10/06 + * + * Modifications: + * + * 7/11/06 -- JRM + * Added support for the phony_len field in datum. + * + *****************************************************************************/ + +void +rename_entry(H5C_t * cache_ptr, + H5F_t * file_ptr, + int32_t old_idx, + int32_t new_idx) +{ + const char * fcn_name = "rename_entry()"; + herr_t result; + int tmp; + size_t tmp_len; + haddr_t old_addr = HADDR_UNDEF; + haddr_t new_addr = HADDR_UNDEF; + struct datum * old_entry_ptr; + struct datum * new_entry_ptr; + + if ( ( nerrors == 0 ) && ( old_idx != new_idx ) ) { + + HDassert( cache_ptr ); + HDassert( file_ptr ); + HDassert( ( 0 <= old_idx ) && ( old_idx < NUM_DATA_ENTRIES ) ); + HDassert( old_idx < virt_num_data_entries ); + HDassert( ( 0 <= new_idx ) && ( new_idx < NUM_DATA_ENTRIES ) ); + HDassert( new_idx < virt_num_data_entries ); + + old_entry_ptr = &(data[old_idx]); + new_entry_ptr = &(data[new_idx]); + + HDassert( ((old_entry_ptr->header).type)->id == DATUM_ENTRY_TYPE ); + HDassert( !(old_entry_ptr->header.is_protected) ); + HDassert( !(old_entry_ptr->locked) ); + HDassert( old_entry_ptr->len == new_entry_ptr->len ); + + old_addr = old_entry_ptr->base_addr; + new_addr = new_entry_ptr->base_addr; + + result = H5AC_rename(file_ptr, &(types[0]), old_addr, new_addr); + + if ( ( result < 0 ) || ( old_entry_ptr->header.addr != new_addr ) ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: H5AC_rename() failed.\n", + world_mpi_rank, fcn_name); + } + + } else { + + HDassert( ((old_entry_ptr->header).type)->id == DATUM_ENTRY_TYPE ); + HDassert( old_entry_ptr->header.is_dirty ); + old_entry_ptr->dirty = TRUE; + + /* touch up versions, base_addrs, and data_index */ + + if ( old_entry_ptr->ver < new_entry_ptr->ver ) { + + old_entry_ptr->ver = new_entry_ptr->ver; + + } else { + + (old_entry_ptr->ver)++; + + } + + old_entry_ptr->base_addr = new_addr; + new_entry_ptr->base_addr = old_addr; + + data_index[old_entry_ptr->index] = new_idx; + data_index[new_entry_ptr->index] = old_idx; + + tmp = old_entry_ptr->index; + old_entry_ptr->index = new_entry_ptr->index; + new_entry_ptr->index = tmp; + + if ( old_entry_ptr->local_len != new_entry_ptr->local_len ) { + + tmp_len = old_entry_ptr->local_len; + old_entry_ptr->local_len = new_entry_ptr->local_len; + new_entry_ptr->local_len = tmp_len; + } + } + } + + return; + +} /* rename_entry() */ + + +/***************************************************************************** + * Function: resize_entry() + * + * Purpose: Resize the pinned entry indicated by idx to the new_size. + * Note that new_size must be greater than 0, and must be + * less than or equal to the original size of the entry. + * + * Do nothing if nerrors isn't zero. + * + * Return: void + * + * Programmer: John Mainzer + * 7/11/06 + * + * Modifications: + * + * None + * + *****************************************************************************/ + +void +resize_entry(H5C_t * cache_ptr, + H5F_t * file_ptr, + int32_t idx, + size_t new_size) +{ + const char * fcn_name = "resize_entry()"; + herr_t result; + struct datum * entry_ptr; + + if ( nerrors == 0 ) { + + HDassert( cache_ptr ); + HDassert( file_ptr ); + HDassert( ( 0 <= idx ) && ( idx < NUM_DATA_ENTRIES ) ); + HDassert( idx < virt_num_data_entries ); + + entry_ptr = &(data[idx]); + + HDassert( ((entry_ptr->header).type)->id == DATUM_ENTRY_TYPE ); + HDassert( !(entry_ptr->header.is_protected) ); + HDassert( !(entry_ptr->locked) ); + HDassert( ( entry_ptr->global_pinned ) && + ( ! entry_ptr->local_pinned ) ); + HDassert( ( entry_ptr->header.size == entry_ptr->len ) || + ( entry_ptr->header.size == entry_ptr->local_len ) ); + HDassert( new_size > 0 ); + HDassert( new_size <= entry_ptr->len ); + + result = H5AC_resize_pinned_entry((void *)entry_ptr, new_size); + + if ( result < 0 ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: H5AC_rename() failed.\n", + world_mpi_rank, fcn_name); + } + + } else { + + HDassert( ((entry_ptr->header).type)->id == DATUM_ENTRY_TYPE ); + HDassert( entry_ptr->header.is_dirty ); + HDassert( entry_ptr->header.size == new_size ); + + entry_ptr->dirty = TRUE; + entry_ptr->local_len = new_size; + + /* touch up version. */ + + (entry_ptr->ver)++; + } + } + + return; + +} /* resize_entry() */ + + +/***************************************************************************** + * + * Function: setup_cache_for_test() + * + * Purpose: Setup the parallel cache for a test, and return the file id + * and a pointer to the cache's internal data structures. + * + * To do this, we must create a file, flush it (so that we + * don't have to worry about entries in the metadata cache), + * look up the address of the metadata cache, and then instruct + * the cache to omit sanity checks on dxpl IDs. + * + * Return: Success: TRUE + * + * Failure: FALSE + * + * Programmer: JRM -- 1/4/06 + * + * Modifications: + * + * None. + * + *****************************************************************************/ + +hbool_t +setup_cache_for_test(hid_t * fid_ptr, + H5F_t ** file_ptr_ptr, + H5C_t ** cache_ptr_ptr) +{ + const char * fcn_name = "setup_cache_for_test()"; + hbool_t success = FALSE; /* will set to TRUE if appropriate. */ + hbool_t enable_rpt_fcn = FALSE; + hid_t fid = -1; + H5AC_cache_config_t config; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + haddr_t actual_base_addr; + + HDassert ( fid_ptr != NULL ); + HDassert ( file_ptr_ptr != NULL ); + HDassert ( cache_ptr_ptr != NULL ); + + fid = H5Fcreate(filenames[0], H5F_ACC_TRUNC, H5P_DEFAULT, fapl); + + if ( fid < 0 ) { + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: H5Fcreate() failed.\n", + world_mpi_rank, fcn_name); + } + } else if ( H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0 ) { + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: H5Fflush() failed.\n", + world_mpi_rank, fcn_name); + } + } else { + file_ptr = (H5F_t *)H5I_object_verify(fid, H5I_FILE); + } + + if ( file_ptr == NULL ) { + + if ( verbose ) { + HDfprintf(stdout, "%d:%s: Can't get file_ptr.\n", + world_mpi_rank, fcn_name); + } + } else { + cache_ptr = file_ptr->shared->cache; + } + + if ( cache_ptr == NULL ) { + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: Can't get cache_ptr.\n", + world_mpi_rank, fcn_name); + } + } else if ( cache_ptr->magic != H5C__H5C_T_MAGIC ) { + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: Bad cache_ptr magic.\n", + world_mpi_rank, fcn_name); + } + } else { + *fid_ptr = fid; + *file_ptr_ptr = file_ptr; + *cache_ptr_ptr = cache_ptr; +#if 0 /* delete this eventually */ + H5C_set_skip_flags(cache_ptr, TRUE, TRUE); +#endif /* JRM */ + H5C_stats__reset(cache_ptr); + success = TRUE; + } + + if ( ( success ) && ( enable_rpt_fcn ) ) { + + config.version = H5AC__CURR_CACHE_CONFIG_VERSION; + + if ( H5AC_get_cache_auto_resize_config(cache_ptr, &config) + != SUCCEED ) { + + HDfprintf(stdout, + "%d:%s: H5AC_get_cache_auto_resize_config() failed.\n", + world_mpi_rank, fcn_name); + + } else { + + config.rpt_fcn_enabled = TRUE; + + if ( H5AC_set_cache_auto_resize_config(file_ptr, &config) + != SUCCEED ) { + + HDfprintf(stdout, + "%d:%s: H5AC_set_cache_auto_resize_config() failed.\n", + world_mpi_rank, fcn_name); + } else { + + HDfprintf(stdout, "%d:%s: rpt_fcn enabled.\n", + world_mpi_rank, fcn_name); + } + } + } + +#if DO_SYNC_AFTER_WRITE + + if ( success ) { + + if ( H5AC_set_write_done_callback(cache_ptr, do_sync) != SUCCEED ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, + "%d:%s: H5C_set_write_done_callback failed.\n", + world_mpi_rank, fcn_name); + } + } + } + +#endif /* DO_SYNC_AFTER_WRITE */ + + if ( success ) { /* allocate space for test entries */ + + actual_base_addr = H5MF_alloc(file_ptr, H5FD_MEM_DEFAULT, H5P_DEFAULT, + (hsize_t)(max_addr + BASE_ADDR)); + + if ( actual_base_addr == HADDR_UNDEF ) { + + success = FALSE; + nerrors++; + + if ( verbose ) { + HDfprintf(stdout, "%d:%s: H5MF_alloc() failed.\n", + world_mpi_rank, fcn_name); + } + + } else if ( actual_base_addr > BASE_ADDR ) { + + /* If this happens, must increase BASE_ADDR so that the + * actual_base_addr is <= BASE_ADDR. This should only happen + * if the size of the superblock is increase. + */ + success = FALSE; + nerrors++; + + if ( verbose ) { + HDfprintf(stdout, "%d:%s: actual_base_addr > BASE_ADDR.\n", + world_mpi_rank, fcn_name); + } + } + } + + return(success); + +} /* setup_cache_for_test() */ + + +/***************************************************************************** + * + * Function: setup_noblock_dxpl_id() + * + * Purpose: Setup the noblock_dxpl_id global. Increment nerrors if + * errors are detected. Do nothing if nerrors is non-zero + * on entry. + * + * Return: void. + * + * Programmer: JRM -- 1/5/06 + * + * Modifications: + * + * None. + * + *****************************************************************************/ +/* So far we haven't needed this, but that may change. + * Keep it around for now + */ +#if 0 +void +setup_noblock_dxpl_id(void) +{ + const char * fcn_name = "setup_noblock_dxpl_id()"; + H5P_genclass_t *xfer_pclass; /* Dataset transfer property list + * class object + */ + H5P_genplist_t *xfer_plist; /* Dataset transfer property list object */ + unsigned block_before_meta_write; /* "block before meta write" + * property value + */ + unsigned library_internal = 1; /* "library internal" property value */ + H5FD_mpio_xfer_t xfer_mode; /* I/O transfer mode property value */ + + /* Sanity check */ + HDassert(H5P_CLS_DATASET_XFER_g!=(-1)); + + /* Get the dataset transfer property list class object */ + if ( ( nerrors == 0 ) && + ( NULL == (xfer_pclass = H5I_object(H5P_CLS_DATASET_XFER_g)) ) ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: can't get property list class.\n", + world_mpi_rank, fcn_name); + } + } + + /* Get an ID for the non-blocking, collective H5AC dxpl */ + if ( ( nerrors == 0 ) && + ( (noblock_dxpl_id = H5P_create_id(xfer_pclass)) < 0 ) ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: can't register property list.\n", + world_mpi_rank, fcn_name); + } + } + + /* Get the property list object */ + if ( ( nerrors == 0 ) && + ( NULL == (xfer_plist = H5I_object(H5AC_noblock_dxpl_id)) ) ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: can't get new property list object.\n", + world_mpi_rank, fcn_name); + } + } + + /* Insert 'block before metadata write' property */ + block_before_meta_write=0; + if ( ( nerrors == 0 ) && + ( H5P_insert(xfer_plist, H5AC_BLOCK_BEFORE_META_WRITE_NAME, + H5AC_BLOCK_BEFORE_META_WRITE_SIZE, + &block_before_meta_write, + NULL, NULL, NULL, NULL, NULL, NULL) < 0 ) ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, + "%d:%s: can't insert metadata cache dxpl property 1.\n", + world_mpi_rank, fcn_name); + } + } + + /* Insert 'library internal' property */ + if ( ( nerrors == 0 ) && + ( H5P_insert(xfer_plist, H5AC_LIBRARY_INTERNAL_NAME, + H5AC_LIBRARY_INTERNAL_SIZE, &library_internal, + NULL, NULL, NULL, NULL, NULL, NULL ) < 0 ) ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, + "%d:%s: can't insert metadata cache dxpl property 2.\n", + world_mpi_rank, fcn_name); + } + } + + /* Set the transfer mode */ + xfer_mode = H5FD_MPIO_COLLECTIVE; + if ( ( nerrors == 0 ) && + ( H5P_set(xfer_plist, H5D_XFER_IO_XFER_MODE_NAME, &xfer_mode) < 0 ) ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: unable to set value.\n", world_mpi_rank, + fcn_name); + } + } + + return(success); + +} /* setup_noblock_dxpl_id() */ +#endif + + +/***************************************************************************** + * + * Function: setup_rand() + * + * Purpose: Use gettimeofday() to obtain a seed for rand(), print the + * seed to stdout, and then pass it to srand(). + * + * Increment nerrors if any errors are detected. + * + * Return: void. + * + * Programmer: JRM -- 1/12/06 + * + * Modifications: + * + * JRM -- 5/9/06 + * Modified function to facilitate setting predefined seeds. + * + *****************************************************************************/ + +void +setup_rand(void) +{ + const char * fcn_name = "setup_rand()"; + hbool_t use_predefined_seeds = FALSE; + int num_predefined_seeds = 3; + unsigned predefined_seeds[3] = {18669, 89925, 12577}; + unsigned seed; + struct timeval tv; + struct timezone tz; + + if ( ( use_predefined_seeds ) && + ( world_mpi_size == num_predefined_seeds ) ) { + + HDassert( world_mpi_rank >= 0 ); + HDassert( world_mpi_rank < world_mpi_size ); + + seed = predefined_seeds[world_mpi_rank]; + HDfprintf(stdout, "%d:%s: predefined_seed = %d.\n", + world_mpi_rank, fcn_name, seed); + fflush(stdout); + HDsrand(seed); + + } else { + + if ( HDgettimeofday(&tv, &tz) != 0 ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: gettimeofday() failed.\n", + world_mpi_rank, fcn_name); + } + } else { + seed = (unsigned)tv.tv_usec; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: seed = %d.\n", + world_mpi_rank, fcn_name, seed); + fflush(stdout); + } + HDsrand(seed); + } + } + + return; + +} /* setup_rand() */ + + +/***************************************************************************** + * + * Function: take_down_cache() + * + * Purpose: Take down the parallel cache after a test. + * + * To do this, we must close the file, and delete if if + * possible. + * + * Return: Success: TRUE + * + * Failure: FALSE + * + * Programmer: JRM -- 1/4/06 + * + * Modifications: + * + * None. + * + *****************************************************************************/ + +hbool_t +take_down_cache(hid_t fid, + H5C_t * cache_ptr) +{ + const char * fcn_name = "take_down_cache()"; + hbool_t show_progress = FALSE; + hbool_t success = FALSE; /* will set to TRUE if appropriate. */ + int mile_stone = 1; + + if ( show_progress ) { /* 1 */ + HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", + world_mpi_rank, fcn_name, mile_stone++, (int)success); + fflush(stdout); + } + + /* close the file and delete it */ + if ( H5Fclose(fid) < 0 ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: H5Fclose() failed.\n", + world_mpi_rank, fcn_name); + } + + } else if ( world_mpi_rank == world_server_mpi_rank ) { + + if ( HDremove(filenames[0]) < 0 ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: HDremove() failed.\n", + world_mpi_rank, fcn_name); + } + } else { + + success = TRUE; + } + } else { + + success = TRUE; + } + + if ( show_progress ) { /* 2 */ + HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", + world_mpi_rank, fcn_name, mile_stone++, (int)success); + fflush(stdout); + } + + return(success); + +} /* take_down_cache() */ + + +/***************************************************************************** + * Function: unlock_entry() + * + * Purpose: Unprotect the entry indicated by the index. + * + * Do nothing if nerrors is non-zero on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 1/4/06 + * + * Modifications: + * + * 7/11/06 + * Updated for the new local_len field in datum. + * + *****************************************************************************/ + +void +unlock_entry(H5C_t * cache_ptr, + H5F_t * file_ptr, + int32_t idx, + unsigned int flags) +{ + const char * fcn_name = "unlock_entry()"; + herr_t dirtied; + herr_t result; + struct datum * entry_ptr; + + if ( nerrors == 0 ) { + + HDassert( cache_ptr ); + HDassert( file_ptr ); + HDassert( ( 0 <= idx ) && ( idx < NUM_DATA_ENTRIES ) ); + HDassert( idx < virt_num_data_entries ); + + entry_ptr = &(data[idx]); + + HDassert( entry_ptr->locked ); + + dirtied = ((flags & H5AC__DIRTIED_FLAG) == H5AC__DIRTIED_FLAG ); + + if ( dirtied ) { + + (entry_ptr->ver)++; + entry_ptr->dirty = TRUE; + } + + result = H5AC_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT, &(types[0]), + entry_ptr->base_addr, entry_ptr->local_len, + (void *)(&(entry_ptr->header)), flags); + + if ( ( result < 0 ) || + ( entry_ptr->header.type != &(types[0]) ) || + ( ( entry_ptr->len != entry_ptr->header.size ) && + ( entry_ptr->local_len != entry_ptr->header.size ) ) || + ( entry_ptr->base_addr != entry_ptr->header.addr ) ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: error in H5C_unprotect().\n", + world_mpi_rank, fcn_name); + } + } else { + + entry_ptr->locked = FALSE; + + } + + HDassert( ((entry_ptr->header).type)->id == DATUM_ENTRY_TYPE ); + + if ( ( flags & H5AC__DIRTIED_FLAG ) != 0 + && ( (flags & H5C__DELETED_FLAG) == 0 ) ) { + + HDassert( entry_ptr->header.is_dirty ); + HDassert( entry_ptr->dirty ); + } + } + + return; + +} /* unlock_entry() */ + + +/***************************************************************************** + * Function: unpin_entry() + * + * Purpose: Unpin the entry indicated by the index. + * + * Do nothing if nerrors is non-zero on entry. + * + * Return: void + * + * Programmer: John Mainzer + * 4/12/06 + * + * Modifications: + * + * JRM -- 8/15/06 + * Added assertion that entry is pinned on entry. + * + *****************************************************************************/ + +void +unpin_entry(H5C_t * cache_ptr, + H5F_t * file_ptr, + int32_t idx, + hbool_t global, + hbool_t dirty, + hbool_t via_unprotect) +{ + const char * fcn_name = "unpin_entry()"; + herr_t result; + unsigned int flags = H5AC__UNPIN_ENTRY_FLAG; + struct datum * entry_ptr; + + if ( nerrors == 0 ) { + + HDassert( cache_ptr ); + HDassert( file_ptr ); + HDassert( ( 0 <= idx ) && ( idx < NUM_DATA_ENTRIES ) ); + HDassert( idx < virt_num_data_entries ); + + entry_ptr = &(data[idx]); + + HDassert( (entry_ptr->header).is_pinned ); + HDassert ( ! ( entry_ptr->global_pinned && entry_ptr->local_pinned) ); + HDassert ( ( global && entry_ptr->global_pinned ) || + ( ! global && entry_ptr->local_pinned ) ); + HDassert ( ! ( dirty && ( ! global ) ) ); + + if ( via_unprotect ) { + + lock_entry(cache_ptr, file_ptr, idx); + + if ( dirty ) { + + flags |= H5AC__DIRTIED_FLAG; + } + + unlock_entry(cache_ptr, file_ptr, idx, flags); + + } else { + + if ( dirty ) { + + mark_pinned_entry_dirty(cache_ptr, file_ptr, idx, FALSE, + (size_t)0); + + } + + result = H5AC_unpin_entry(entry_ptr); + + if ( result < 0 ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: error in H5AC_unpin_entry().\n", + world_mpi_rank, fcn_name); + } + } + } + + HDassert( ! ((entry_ptr->header).is_pinned) ); + + if ( global ) { + + entry_ptr->global_pinned = FALSE; + + } else { + + entry_ptr->local_pinned = FALSE; + + } + } + + return; + +} /* unpin_entry() */ + + +/*****************************************************************************/ +/****************************** test functions *******************************/ +/*****************************************************************************/ + +/***************************************************************************** + * + * Function: server_smoke_check() + * + * Purpose: Quick smoke check for the server process. + * + * Return: Success: TRUE + * + * Failure: FALSE + * + * Programmer: JRM -- 12/21/05 + * + * Modifications: + * + * JRM -- 5/9/06 + * Added code supporting the write request ack message. This + * message was added to eliminate one possible cause of a + * bug spotted on cobalt. If this doesn't fix the problem, + * it will narrow things down a bit. + * + * JRM -- 5/10/06 + * Added call to do_sync(). This is part of an attempt to + * optimize out the slowdown caused by the addition of the + * write request ack message. + * + *****************************************************************************/ + +hbool_t +server_smoke_check(void) +{ + const char * fcn_name = "server_smoke_check()"; + hbool_t success = TRUE; + int max_nerrors; + struct mssg_t mssg; + + if ( world_mpi_rank == 0 ) { + + TESTING("server smoke check"); + } + + nerrors = 0; + init_data(); + reset_stats(); + + if ( world_mpi_rank == world_server_mpi_rank ) { + + if ( ! server_main() ) { + + /* some error occured in the server -- report failure */ + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: server_main() failed.\n", + world_mpi_rank, fcn_name); + } + } + } + else /* run the clients */ + { + /* compose the write message */ + mssg.req = WRITE_REQ_CODE; + mssg.src = world_mpi_rank; + mssg.dest = world_server_mpi_rank; + mssg.mssg_num = -1; /* set by send function */ + mssg.base_addr = data[world_mpi_rank].base_addr; + mssg.len = data[world_mpi_rank].len; + mssg.ver = ++(data[world_mpi_rank].ver); + mssg.magic = MSSG_MAGIC; + + if ( ! ( success = send_mssg(&mssg, FALSE) ) ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: send_mssg() failed on write.\n", + world_mpi_rank, fcn_name); + } + } + +#if DO_WRITE_REQ_ACK + + /* try to receive the write ack from the server */ + if ( success ) { + + success = recv_mssg(&mssg, WRITE_REQ_ACK_CODE); + + if ( ! success ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: recv_mssg() failed.\n", + world_mpi_rank, fcn_name); + } + } + } + + /* verify that we received the expected ack message */ + if ( success ) { + + if ( ( mssg.req != WRITE_REQ_ACK_CODE ) || + ( mssg.src != world_server_mpi_rank ) || + ( mssg.dest != world_mpi_rank ) || + ( mssg.base_addr != data[world_mpi_rank].base_addr ) || + ( mssg.len != data[world_mpi_rank].len ) || + ( mssg.ver != data[world_mpi_rank].ver ) || + ( mssg.magic != MSSG_MAGIC ) ) { + + success = FALSE; + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: Bad data in write req ack.\n", + world_mpi_rank, fcn_name); + } + } + } + +#endif /* DO_WRITE_REQ_ACK */ + + do_sync(); + + /* compose the read message */ + mssg.req = READ_REQ_CODE; + mssg.src = world_mpi_rank; + mssg.dest = world_server_mpi_rank; + mssg.mssg_num = -1; /* set by send function */ + mssg.base_addr = data[world_mpi_rank].base_addr; + mssg.len = data[world_mpi_rank].len; + mssg.ver = 0; /* bogus -- should be corrected by server */ + mssg.magic = MSSG_MAGIC; + + if ( success ) { + + success = send_mssg(&mssg, FALSE); + + if ( ! success ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: send_mssg() failed on write.\n", + world_mpi_rank, fcn_name); + } + } + } + + /* try to receive the reply from the server */ + if ( success ) { + + success = recv_mssg(&mssg, READ_REQ_REPLY_CODE); + + if ( ! success ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: recv_mssg() failed.\n", + world_mpi_rank, fcn_name); + } + } + } + + /* verify that we got the expected result */ + if ( success ) { + + if ( ( mssg.req != READ_REQ_REPLY_CODE ) || + ( mssg.src != world_server_mpi_rank ) || + ( mssg.dest != world_mpi_rank ) || + ( mssg.base_addr != data[world_mpi_rank].base_addr ) || + ( mssg.len != data[world_mpi_rank].len ) || + ( mssg.ver != data[world_mpi_rank].ver ) || + ( mssg.magic != MSSG_MAGIC ) ) { + + success = FALSE; + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: Bad data in read req reply.\n", + world_mpi_rank, fcn_name); + } + } + } + + /* compose the done message */ + mssg.req = DONE_REQ_CODE; + mssg.src = world_mpi_rank; + mssg.dest = world_server_mpi_rank; + mssg.mssg_num = -1; /* set by send function */ + mssg.base_addr = 0; /* not used */ + mssg.len = 0; /* not used */ + mssg.ver = 0; /* not used */ + mssg.magic = MSSG_MAGIC; + + if ( success ) { + + success = send_mssg(&mssg, FALSE); + + if ( ! success ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: send_mssg() failed on done.\n", + world_mpi_rank, fcn_name); + } + } + } + } + + max_nerrors = get_max_nerrors(); + + if ( world_mpi_rank == 0 ) { + + if ( max_nerrors == 0 ) { + + PASSED(); + + } else { + + failures++; + H5_FAILED(); + } + } + + success = ( ( success ) && ( max_nerrors == 0 ) ); + + return(success); + +} /* server_smoke_check() */ + +/***************************************************************************** + * + * Function: smoke_check_1() + * + * Purpose: First smoke check for the parallel cache. + * + * Return: Success: TRUE + * + * Failure: FALSE + * + * Programmer: JRM -- 1/4/06 + * + * Modifications: + * + * None. + * + *****************************************************************************/ + +hbool_t +smoke_check_1(void) +{ + const char * fcn_name = "smoke_check_1()"; + hbool_t success = TRUE; + hbool_t show_progress = FALSE; + int i; + int max_nerrors; + int mile_stone = 1; + hid_t fid = -1; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + struct mssg_t mssg; + + if ( world_mpi_rank == 0 ) { + + TESTING("smoke check #1"); + } + + if ( show_progress ) { /* 1 */ + HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", + world_mpi_rank, fcn_name, mile_stone++, (int)success); + fflush(stdout); + } + + nerrors = 0; + init_data(); + reset_stats(); + + if ( world_mpi_rank == world_server_mpi_rank ) { + + if ( show_progress ) { /* 2s */ + HDfprintf(stdout, "%d:%s - %0ds -- success = %d\n", + world_mpi_rank, fcn_name, mile_stone++, (int)success); + fflush(stdout); + } + + if ( ! server_main() ) { + + /* some error occured in the server -- report failure */ + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: server_main() failed.\n", + world_mpi_rank, fcn_name); + } + } + + if ( show_progress ) { /* 3s */ + HDfprintf(stdout, "%d:%s - %0ds -- success = %d\n", + world_mpi_rank, fcn_name, mile_stone++, (int)success); + fflush(stdout); + } + } + else /* run the clients */ + { + + if ( show_progress ) { /* 2 */ + HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", + world_mpi_rank, fcn_name, mile_stone++, (int)success); + fflush(stdout); + } + + if ( ! setup_cache_for_test(&fid, &file_ptr, &cache_ptr) ) { + + nerrors++; + fid = -1; + cache_ptr = NULL; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: setup_cache_for_test() failed.\n", + world_mpi_rank, fcn_name); + } + } + + if ( show_progress ) { /* 3 */ + HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", + world_mpi_rank, fcn_name, mile_stone++, (int)success); + fflush(stdout); + } + + for ( i = 0; i < (virt_num_data_entries / 2); i++ ) + { + insert_entry(cache_ptr, file_ptr, i, H5AC__NO_FLAGS_SET); + } + + if ( show_progress ) { /* 4 */ + HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", + world_mpi_rank, fcn_name, mile_stone++, (int)success); + fflush(stdout); + } + + for ( i = (virt_num_data_entries / 2) - 1; i >= 0; i-- ) + { + lock_entry(cache_ptr, file_ptr, i); + unlock_entry(cache_ptr, file_ptr, i, H5AC__NO_FLAGS_SET); + } + + if ( show_progress ) { /* 5 */ + HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", + world_mpi_rank, fcn_name, mile_stone++, (int)success); + fflush(stdout); + } + + /* rename the first half of the entries... */ + for ( i = 0; i < (virt_num_data_entries / 2); i++ ) + { + lock_entry(cache_ptr, file_ptr, i); + unlock_entry(cache_ptr, file_ptr, i, H5AC__NO_FLAGS_SET); + rename_entry(cache_ptr, file_ptr, i, + (i + (virt_num_data_entries / 2))); + } + + if ( show_progress ) { /* 6 */ + HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", + world_mpi_rank, fcn_name, mile_stone++, (int)success); + fflush(stdout); + } + + /* ...and then rename them back. */ + for ( i = (virt_num_data_entries / 2) - 1; i >= 0; i-- ) + { + lock_entry(cache_ptr, file_ptr, i); + unlock_entry(cache_ptr, file_ptr, i, H5AC__NO_FLAGS_SET); + rename_entry(cache_ptr, file_ptr, i, + (i + (virt_num_data_entries / 2))); + } + + if ( show_progress ) { /* 7 */ + HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", + world_mpi_rank, fcn_name, mile_stone++, (int)success); + fflush(stdout); + } + + if ( fid >= 0 ) { + + if ( ! take_down_cache(fid, cache_ptr) ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: take_down_cache() failed.\n", + world_mpi_rank, fcn_name); + } + } + } + + if ( show_progress ) { /* 8 */ + HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", + world_mpi_rank, fcn_name, mile_stone++, (int)success); + fflush(stdout); + } + + /* verify that all instance of datum are back where the started + * and are clean. + */ + + for ( i = 0; i < NUM_DATA_ENTRIES; i++ ) + { + HDassert( data_index[i] == i ); + HDassert( ! (data[i].dirty) ); + } + + if ( show_progress ) { /* 9 */ + HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", + world_mpi_rank, fcn_name, mile_stone++, (int)success); + fflush(stdout); + } + + /* compose the done message */ + mssg.req = DONE_REQ_CODE; + mssg.src = world_mpi_rank; + mssg.dest = world_server_mpi_rank; + mssg.mssg_num = -1; /* set by send function */ + mssg.base_addr = 0; /* not used */ + mssg.len = 0; /* not used */ + mssg.ver = 0; /* not used */ + mssg.magic = MSSG_MAGIC; + + if ( success ) { + + success = send_mssg(&mssg, FALSE); + + if ( ! success ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: send_mssg() failed on done.\n", + world_mpi_rank, fcn_name); + } + } + } + + if ( show_progress ) { /* 10 */ + HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", + world_mpi_rank, fcn_name, mile_stone++, (int)success); + fflush(stdout); + } + } + + max_nerrors = get_max_nerrors(); + + if ( world_mpi_rank == 0 ) { + + if ( max_nerrors == 0 ) { + + PASSED(); + + } else { + + failures++; + H5_FAILED(); + } + } + + success = ( ( success ) && ( max_nerrors == 0 ) ); + + return(success); + +} /* smoke_check_1() */ + + +/***************************************************************************** + * + * Function: smoke_check_2() + * + * Purpose: Second smoke check for the parallel cache. + * + * Introduce random reads, but keep all processes with roughly + * the same work load. + * + * Return: Success: TRUE + * + * Failure: FALSE + * + * Programmer: JRM -- 1/12/06 + * + * Modifications: + * + * JRM -- 4/13/06 + * Added pinned entry tests. + * + * JRM -- 4/28/06 + * Modified test to rename pinned entries. + * + *****************************************************************************/ + +hbool_t +smoke_check_2(void) +{ + const char * fcn_name = "smoke_check_2()"; + hbool_t success = TRUE; + int i; + int max_nerrors; + hid_t fid = -1; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + struct mssg_t mssg; + + if ( world_mpi_rank == 0 ) { + + TESTING("smoke check #2"); + } + + nerrors = 0; + init_data(); + reset_stats(); + + if ( world_mpi_rank == world_server_mpi_rank ) { + + if ( ! server_main() ) { + + /* some error occured in the server -- report failure */ + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: server_main() failed.\n", + world_mpi_rank, fcn_name); + } + } + } + else /* run the clients */ + { + if ( ! setup_cache_for_test(&fid, &file_ptr, &cache_ptr) ) { + + nerrors++; + fid = -1; + cache_ptr = NULL; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: setup_cache_for_test() failed.\n", + world_mpi_rank, fcn_name); + } + } + + for ( i = 0; i < (virt_num_data_entries / 2); i++ ) + { + insert_entry(cache_ptr, file_ptr, i, H5AC__NO_FLAGS_SET); + + if ( i > 100 ) { + + lock_and_unlock_random_entries(cache_ptr, file_ptr, + (i - 100), i, 0, 10); + } + } + + for ( i = 0; i < (virt_num_data_entries / 2); i+=61 ) + { + /* Make sure we don't step on any locally pinned entries */ + if ( data[i].local_pinned ) { + unpin_entry(cache_ptr, file_ptr, i, FALSE, FALSE, FALSE); + } + + pin_entry(cache_ptr, file_ptr, i, TRUE, FALSE); + } + + for ( i = (virt_num_data_entries / 2) - 1; i >= 0; i-=2 ) + { + lock_entry(cache_ptr, file_ptr, i); + unlock_entry(cache_ptr, file_ptr, i, H5AC__NO_FLAGS_SET); + lock_and_unlock_random_entries(cache_ptr, file_ptr, 0, + (virt_num_data_entries / 20), + 0, 100); + local_pin_and_unpin_random_entries(cache_ptr, file_ptr, 0, + (virt_num_data_entries / 4), + 0, 3); + } + + for ( i = 0; i < (virt_num_data_entries / 2); i+=2 ) + { + lock_entry(cache_ptr, file_ptr, i); + unlock_entry(cache_ptr, file_ptr, i, H5AC__DIRTIED_FLAG); + lock_and_unlock_random_entries(cache_ptr, file_ptr, 0, + (virt_num_data_entries / 10), + 0, 100); + } + + /* we can't rename pinned entries, so release any local pins now. */ + local_unpin_all_entries(cache_ptr, file_ptr, FALSE); + + /* rename the first half of the entries... */ + for ( i = 0; i < (virt_num_data_entries / 2); i++ ) + { + lock_entry(cache_ptr, file_ptr, i); + unlock_entry(cache_ptr, file_ptr, i, H5AC__NO_FLAGS_SET); + rename_entry(cache_ptr, file_ptr, i, + (i + (virt_num_data_entries / 2))); + lock_and_unlock_random_entries(cache_ptr, file_ptr, 0, + ((virt_num_data_entries / 50) - 1), + 0, 100); + } + + /* ...and then rename them back. */ + for ( i = (virt_num_data_entries / 2) - 1; i >= 0; i-- ) + { + lock_entry(cache_ptr, file_ptr, i); + unlock_entry(cache_ptr, file_ptr, i, H5AC__DIRTIED_FLAG); + rename_entry(cache_ptr, file_ptr, i, + (i + (virt_num_data_entries / 2))); + lock_and_unlock_random_entries(cache_ptr, file_ptr, 0, + (virt_num_data_entries / 100), + 0, 100); + } + + for ( i = 0; i < (virt_num_data_entries / 2); i+=61 ) + { + hbool_t via_unprotect = ( (((unsigned)i) & 0x01) == 0 ); + hbool_t dirty = ( (((unsigned)i) & 0x02) == 0 ); + + unpin_entry(cache_ptr, file_ptr, i, TRUE, dirty, via_unprotect); + } + + if ( fid >= 0 ) { + + if ( ! take_down_cache(fid, cache_ptr) ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: take_down_cache() failed.\n", + world_mpi_rank, fcn_name); + } + } + } + + /* verify that all instance of datum are back where the started + * and are clean. + */ + + for ( i = 0; i < NUM_DATA_ENTRIES; i++ ) + { + HDassert( data_index[i] == i ); + HDassert( ! (data[i].dirty) ); + } + + /* compose the done message */ + mssg.req = DONE_REQ_CODE; + mssg.src = world_mpi_rank; + mssg.dest = world_server_mpi_rank; + mssg.mssg_num = -1; /* set by send function */ + mssg.base_addr = 0; /* not used */ + mssg.len = 0; /* not used */ + mssg.ver = 0; /* not used */ + mssg.magic = MSSG_MAGIC; + + if ( success ) { + + success = send_mssg(&mssg, FALSE); + + if ( ! success ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: send_mssg() failed on done.\n", + world_mpi_rank, fcn_name); + } + } + } + } + + max_nerrors = get_max_nerrors(); + + if ( world_mpi_rank == 0 ) { + + if ( max_nerrors == 0 ) { + + PASSED(); + + } else { + + failures++; + H5_FAILED(); + } + } + + success = ( ( success ) && ( max_nerrors == 0 ) ); + + return(success); + +} /* smoke_check_2() */ + + +/***************************************************************************** + * + * Function: smoke_check_3() + * + * Purpose: Third smoke check for the parallel cache. + * + * Use random reads to vary the loads on the diffferent + * processors. Also force different cache size adjustments. + * + * In this test, load process 0 heavily, and the other + * processes lightly. + * + * Return: Success: TRUE + * + * Failure: FALSE + * + * Programmer: JRM -- 1/13/06 + * + * Modifications: + * + * Added code intended to ensure correct operation with large + * numbers of processors. + * JRM - 1/31/06 + * + * Added pinned entry tests. JRM - 4/14/06 + * + *****************************************************************************/ + +hbool_t +smoke_check_3(void) +{ + const char * fcn_name = "smoke_check_3()"; + hbool_t success = TRUE; + int i; + int max_nerrors; + int min_count; + int max_count; + int min_idx; + int max_idx; + hid_t fid = -1; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + struct mssg_t mssg; + + if ( world_mpi_rank == 0 ) { + + TESTING("smoke check #3"); + } + + nerrors = 0; + init_data(); + reset_stats(); + + if ( world_mpi_rank == world_server_mpi_rank ) { + + if ( ! server_main() ) { + + /* some error occured in the server -- report failure */ + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: server_main() failed.\n", + world_mpi_rank, fcn_name); + } + } + } + else /* run the clients */ + { + if ( ! setup_cache_for_test(&fid, &file_ptr, &cache_ptr) ) { + + nerrors++; + fid = -1; + cache_ptr = NULL; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: setup_cache_for_test() failed.\n", + world_mpi_rank, fcn_name); + } + } + + min_count = 100 / ((file_mpi_rank + 1) * (file_mpi_rank + 1)); + max_count = min_count + 50; + + for ( i = 0; i < (virt_num_data_entries / 4); i++ ) + { + insert_entry(cache_ptr, file_ptr, i, H5AC__NO_FLAGS_SET); + + if ( i > 100 ) { + + lock_and_unlock_random_entries(cache_ptr, file_ptr, + (i - 100), i, + min_count, max_count); + } + } + + + min_count = 100 / ((file_mpi_rank + 2) * (file_mpi_rank + 2)); + max_count = min_count + 50; + + for ( i = (virt_num_data_entries / 4); + i < (virt_num_data_entries / 2); + i++ ) + { + + insert_entry(cache_ptr, file_ptr, i, H5AC__NO_FLAGS_SET); + + if ( i % 59 == 0 ) { + + hbool_t dirty = ( (i % 2) == 0); + + if ( data[i].local_pinned ) { + unpin_entry(cache_ptr, file_ptr, i, FALSE, FALSE, FALSE); + } + + pin_entry(cache_ptr, file_ptr, i, TRUE, dirty); + + HDassert( !dirty || data[i].header.is_dirty ); + HDassert( data[i].header.is_pinned ); + HDassert( data[i].global_pinned ); + HDassert( ! data[i].local_pinned ); + } + + if ( i > 100 ) { + + lock_and_unlock_random_entries(cache_ptr, file_ptr, + (i - 100), i, + min_count, max_count); + } + + local_pin_and_unpin_random_entries(cache_ptr, file_ptr, + 0, virt_num_data_entries / 4, + 0, (file_mpi_rank + 2)); + + } + + + /* flush the file to be sure that we have no problems flushing + * pinned entries + */ + if ( H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0 ) { + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: H5Fflush() failed.\n", + world_mpi_rank, fcn_name); + } + } + + + min_idx = 0; + max_idx = ((virt_num_data_entries / 10) / + ((file_mpi_rank + 1) * (file_mpi_rank + 1))) - 1; + if ( max_idx <= min_idx ) { + + max_idx = min_idx + 10; + } + + for ( i = (virt_num_data_entries / 2) - 1; i >= 0; i-- ) + { + if ( ( i >= (virt_num_data_entries / 4) ) && ( i % 59 == 0 ) ) { + + hbool_t via_unprotect = ( (((unsigned)i) & 0x02) == 0 ); + hbool_t dirty = ( (((unsigned)i) & 0x04) == 0 ); + + HDassert( data[i].global_pinned ); + HDassert( ! data[i].local_pinned ); + + unpin_entry(cache_ptr, file_ptr, i, TRUE, dirty, + via_unprotect); + } + if ( i % 2 == 0 ) { + + lock_entry(cache_ptr, file_ptr, i); + unlock_entry(cache_ptr, file_ptr, i, H5AC__NO_FLAGS_SET); + local_pin_and_unpin_random_entries(cache_ptr, file_ptr, 0, + virt_num_data_entries / 2, + 0, 2); + lock_and_unlock_random_entries(cache_ptr, file_ptr, + min_idx, max_idx, 0, 100); + } + } + + min_idx = 0; + max_idx = ((virt_num_data_entries / 10) / + ((file_mpi_rank + 3) * (file_mpi_rank + 3))) - 1; + if ( max_idx <= min_idx ) { + + max_idx = min_idx + 10; + } + + for ( i = 0; i < (virt_num_data_entries / 2); i+=2 ) + { + lock_entry(cache_ptr, file_ptr, i); + unlock_entry(cache_ptr, file_ptr, i, H5AC__DIRTIED_FLAG); + lock_and_unlock_random_entries(cache_ptr, file_ptr, + min_idx, max_idx, 0, 100); + } + + /* we can't rename pinned entries, so release any local pins now. */ + local_unpin_all_entries(cache_ptr, file_ptr, FALSE); + + min_count = 10 / (file_mpi_rank + 1); + max_count = min_count + 100; + + /* rename the first half of the entries... */ + for ( i = 0; i < (virt_num_data_entries / 2); i++ ) + { + lock_entry(cache_ptr, file_ptr, i); + unlock_entry(cache_ptr, file_ptr, i, H5AC__NO_FLAGS_SET); + rename_entry(cache_ptr, file_ptr, i, + (i + (virt_num_data_entries / 2))); + lock_and_unlock_random_entries(cache_ptr, file_ptr, 0, + (virt_num_data_entries / 20), + min_count, max_count); + } + + /* ...and then rename them back. */ + for ( i = (virt_num_data_entries / 2) - 1; i >= 0; i-- ) + { + lock_entry(cache_ptr, file_ptr, i); + unlock_entry(cache_ptr, file_ptr, i, H5AC__DIRTIED_FLAG); + rename_entry(cache_ptr, file_ptr, i, + (i + (virt_num_data_entries / 2))); + lock_and_unlock_random_entries(cache_ptr, file_ptr, 0, + (virt_num_data_entries / 40), + min_count, max_count); + } + + /* finally, do some dirty lock/unlocks while we give the cache + * a chance t reduce its size. + */ + min_count = 200 / ((file_mpi_rank + 1) * (file_mpi_rank + 1)); + max_count = min_count + 100; + + for ( i = 0; i < (virt_num_data_entries / 2); i+=2 ) + { + local_pin_and_unpin_random_entries(cache_ptr, file_ptr, 0, + (virt_num_data_entries / 2), + 0, 5); + + lock_entry(cache_ptr, file_ptr, i); + unlock_entry(cache_ptr, file_ptr, i, H5AC__DIRTIED_FLAG); + + if ( i > 100 ) { + + lock_and_unlock_random_entries(cache_ptr, file_ptr, + (i - 100), i, + min_count, max_count); + } + } + + /* release any local pins before we take down the cache. */ + local_unpin_all_entries(cache_ptr, file_ptr, FALSE); + + if ( fid >= 0 ) { + + if ( ! take_down_cache(fid, cache_ptr) ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: take_down_cache() failed.\n", + world_mpi_rank, fcn_name); + } + } + } + + /* verify that all instances of datum are back where the started + * and are clean. + */ + + for ( i = 0; i < NUM_DATA_ENTRIES; i++ ) + { + HDassert( data_index[i] == i ); + HDassert( ! (data[i].dirty) ); + } + + /* compose the done message */ + mssg.req = DONE_REQ_CODE; + mssg.src = world_mpi_rank; + mssg.dest = world_server_mpi_rank; + mssg.mssg_num = -1; /* set by send function */ + mssg.base_addr = 0; /* not used */ + mssg.len = 0; /* not used */ + mssg.ver = 0; /* not used */ + mssg.magic = MSSG_MAGIC; + + if ( success ) { + + + success = send_mssg(&mssg, FALSE); + + if ( ! success ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: send_mssg() failed on done.\n", + world_mpi_rank, fcn_name); + } + } + } + } + + max_nerrors = get_max_nerrors(); + + if ( world_mpi_rank == 0 ) { + + if ( max_nerrors == 0 ) { + + PASSED(); + + } else { + + failures++; + H5_FAILED(); + } + } + + success = ( ( success ) && ( max_nerrors == 0 ) ); + + return(success); + +} /* smoke_check_3() */ + + +/***************************************************************************** + * + * Function: smoke_check_4() + * + * Purpose: Fourth smoke check for the parallel cache. + * + * Use random reads to vary the loads on the diffferent + * processors. Also force different cache size adjustments. + * + * In this test, load process 0 lightly, and the other + * processes heavily. + * + * Return: Success: TRUE + * + * Failure: FALSE + * + * Programmer: JRM -- 1/13/06 + * + * Modifications: + * + * Added code intended to insure correct operation with large + * numbers of processors. + * JRM - 1/31/06 + * + * Added code testing pinned insertion of entries. + * + * JRM - 8/15/06 + * + *****************************************************************************/ + +hbool_t +smoke_check_4(void) +{ + const char * fcn_name = "smoke_check_4()"; + hbool_t success = TRUE; + int i; + int max_nerrors; + int min_count; + int max_count; + int min_idx; + int max_idx; + hid_t fid = -1; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + struct mssg_t mssg; + + if ( world_mpi_rank == 0 ) { + + TESTING("smoke check #4"); + } + + nerrors = 0; + init_data(); + reset_stats(); + + if ( world_mpi_rank == world_server_mpi_rank ) { + + if ( ! server_main() ) { + + /* some error occured in the server -- report failure */ + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: server_main() failed.\n", + world_mpi_rank, fcn_name); + } + } + } + else /* run the clients */ + { + if ( ! setup_cache_for_test(&fid, &file_ptr, &cache_ptr) ) { + + nerrors++; + fid = -1; + cache_ptr = NULL; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: setup_cache_for_test() failed.\n", + world_mpi_rank, fcn_name); + } + } + + + min_count = 100 * (file_mpi_rank % 4); + max_count = min_count + 50; + + for ( i = 0; i < (virt_num_data_entries / 4); i++ ) + { + insert_entry(cache_ptr, file_ptr, i, H5AC__NO_FLAGS_SET); + + if ( i > 100 ) { + + lock_and_unlock_random_entries(cache_ptr, file_ptr, + (i - 100), i, + min_count, max_count); + } + } + + min_count = 10 * (file_mpi_rank % 4); + max_count = min_count + 100; + + for ( i = (virt_num_data_entries / 4); + i < (virt_num_data_entries / 2); + i++ ) + { + if ( i % 2 == 0 ) { + + insert_entry(cache_ptr, file_ptr, i, H5AC__NO_FLAGS_SET); + + } else { + + /* Insert some entries pinned, and then unpin them + * immediately. We have tested pinned entries elsewhere, + * so it should be sufficient to verify that the + * entries are in fact pinned (which unpin_entry() should do). + */ + insert_entry(cache_ptr, file_ptr, i, H5C__PIN_ENTRY_FLAG); + unpin_entry(cache_ptr, file_ptr, i, TRUE, FALSE, FALSE); + } + + if ( i % 59 == 0 ) { + + hbool_t dirty = ( (i % 2) == 0); + + if ( data[i].local_pinned ) { + unpin_entry(cache_ptr, file_ptr, i, FALSE, FALSE, FALSE); + } + + pin_entry(cache_ptr, file_ptr, i, TRUE, dirty); + + HDassert( !dirty || data[i].header.is_dirty ); + HDassert( data[i].header.is_pinned ); + HDassert( data[i].global_pinned ); + HDassert( ! data[i].local_pinned ); + } + + if ( i > 100 ) { + + lock_and_unlock_random_entries(cache_ptr, file_ptr, + (i - 100), i, + min_count, max_count); + } + + local_pin_and_unpin_random_entries(cache_ptr, file_ptr, 0, + (virt_num_data_entries / 4), + 0, (file_mpi_rank + 2)); + } + + + /* flush the file to be sure that we have no problems flushing + * pinned entries + */ + if ( H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0 ) { + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: H5Fflush() failed.\n", + world_mpi_rank, fcn_name); + } + } + + + min_idx = 0; + max_idx = (((virt_num_data_entries / 10) / 4) * + ((file_mpi_rank % 4) + 1)) - 1; + + for ( i = (virt_num_data_entries / 2) - 1; i >= 0; i-- ) + { + if ( ( i >= (virt_num_data_entries / 4) ) && ( i % 59 == 0 ) ) { + + hbool_t via_unprotect = ( (((unsigned)i) & 0x02) == 0 ); + hbool_t dirty = ( (((unsigned)i) & 0x04) == 0 ); + + HDassert( data[i].global_pinned ); + HDassert( ! data[i].local_pinned ); + + unpin_entry(cache_ptr, file_ptr, i, TRUE, dirty, via_unprotect); + } + + if ( i % 2 == 0 ) { + + lock_entry(cache_ptr, file_ptr, i); + unlock_entry(cache_ptr, file_ptr, i, H5AC__NO_FLAGS_SET); + lock_and_unlock_random_entries(cache_ptr, file_ptr, + min_idx, max_idx, 0, 100); + } + } + + min_idx = 0; + max_idx = (((virt_num_data_entries / 10) / 8) * + ((file_mpi_rank % 4) + 1)) - 1; + + for ( i = 0; i < (virt_num_data_entries / 2); i+=2 ) + { + lock_entry(cache_ptr, file_ptr, i); + unlock_entry(cache_ptr, file_ptr, i, H5AC__DIRTIED_FLAG); + lock_and_unlock_random_entries(cache_ptr, file_ptr, + min_idx, max_idx, 0, 100); + } + + /* we can't rename pinned entries, so release any local pins now. */ + local_unpin_all_entries(cache_ptr, file_ptr, FALSE); + + min_count = 10 * (file_mpi_rank % 4); + max_count = min_count + 100; + + /* rename the first half of the entries... */ + for ( i = 0; i < (virt_num_data_entries / 2); i++ ) + { + lock_entry(cache_ptr, file_ptr, i); + unlock_entry(cache_ptr, file_ptr, i, H5AC__NO_FLAGS_SET); + rename_entry(cache_ptr, file_ptr, i, + (i + (virt_num_data_entries / 2))); + lock_and_unlock_random_entries(cache_ptr, file_ptr, 0, + (virt_num_data_entries / 20), + min_count, max_count); + } + + /* ...and then rename them back. */ + for ( i = (virt_num_data_entries / 2) - 1; i >= 0; i-- ) + { + lock_entry(cache_ptr, file_ptr, i); + unlock_entry(cache_ptr, file_ptr, i, H5AC__DIRTIED_FLAG); + rename_entry(cache_ptr, file_ptr, i, + (i + (virt_num_data_entries / 2))); + lock_and_unlock_random_entries(cache_ptr, file_ptr, 0, + (virt_num_data_entries / 40), + min_count, max_count); + } + + /* finally, do some dirty lock/unlocks while we give the cache + * a chance t reduce its size. + */ + min_count = 100 * (file_mpi_rank % 4); + max_count = min_count + 100; + + for ( i = 0; i < (virt_num_data_entries / 2); i+=2 ) + { + lock_entry(cache_ptr, file_ptr, i); + unlock_entry(cache_ptr, file_ptr, i, H5AC__DIRTIED_FLAG); + + if ( i > 100 ) { + + lock_and_unlock_random_entries(cache_ptr, file_ptr, + (i - 100), i, + min_count, max_count); + } + } + + if ( fid >= 0 ) { + + if ( ! take_down_cache(fid, cache_ptr) ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: take_down_cache() failed.\n", + world_mpi_rank, fcn_name); + } + } + } + + /* verify that all instance of datum are back where the started + * and are clean. + */ + + for ( i = 0; i < NUM_DATA_ENTRIES; i++ ) + { + HDassert( data_index[i] == i ); + HDassert( ! (data[i].dirty) ); + } + + /* compose the done message */ + mssg.req = DONE_REQ_CODE; + mssg.src = world_mpi_rank; + mssg.dest = world_server_mpi_rank; + mssg.mssg_num = -1; /* set by send function */ + mssg.base_addr = 0; /* not used */ + mssg.len = 0; /* not used */ + mssg.ver = 0; /* not used */ + mssg.magic = MSSG_MAGIC; + + if ( success ) { + + + success = send_mssg(&mssg, FALSE); + + if ( ! success ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: send_mssg() failed on done.\n", + world_mpi_rank, fcn_name); + } + } + } + } + + max_nerrors = get_max_nerrors(); + + if ( world_mpi_rank == 0 ) { + + if ( max_nerrors == 0 ) { + + PASSED(); + + } else { + + failures++; + H5_FAILED(); + } + } + + success = ( ( success ) && ( max_nerrors == 0 ) ); + + return(success); + +} /* smoke_check_4() */ + + +/***************************************************************************** + * + * Function: smoke_check_5() + * + * Purpose: Similar to smoke check 1, but modified to verify that + * H5AC_mark_pinned_or_protected_entry_dirty() works in + * the parallel case. + * + * Return: Success: TRUE + * + * Failure: FALSE + * + * Programmer: JRM -- 5/18/06 + * + * Modifications: + * + * JRM -- 7/12/06 + * Added test code for H5AC_expunge_entry() and + * H5AC_resize_pinned_entry(). + * + *****************************************************************************/ + +hbool_t +smoke_check_5(void) +{ + const char * fcn_name = "smoke_check_5()"; + hbool_t show_progress = FALSE; + hbool_t show_detailed_progress = FALSE; + hbool_t success = TRUE; + int i; + int max_nerrors; + int mile_stone = 1; + hid_t fid = -1; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + struct mssg_t mssg; + + if ( world_mpi_rank == 0 ) { + + TESTING("smoke check #5"); + } + + nerrors = 0; + init_data(); + reset_stats(); + + if ( show_progress ) { /* 1 */ + HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", + world_mpi_rank, fcn_name, mile_stone++, (int)success); + fflush(stdout); + } + + if ( world_mpi_rank == world_server_mpi_rank ) { + + if ( show_progress ) { /* 2 */ + HDfprintf(stdout, "%d:%s - %0ds -- success = %d\n", + world_mpi_rank, fcn_name, mile_stone++, (int)success); + fflush(stdout); + } + + if ( ! server_main() ) { + + /* some error occured in the server -- report failure */ + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: server_main() failed.\n", + world_mpi_rank, fcn_name); + } + } + + if ( show_progress ) { /* 3 */ + HDfprintf(stdout, "%d:%s - %0ds -- success = %d\n", + world_mpi_rank, fcn_name, mile_stone++, (int)success); + fflush(stdout); + } + } + else /* run the clients */ + { + if ( show_progress ) { /* 2 */ + HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", + world_mpi_rank, fcn_name, mile_stone++, (int)success); + fflush(stdout); + } + + if ( ! setup_cache_for_test(&fid, &file_ptr, &cache_ptr) ) { + + nerrors++; + fid = -1; + cache_ptr = NULL; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: setup_cache_for_test() failed.\n", + world_mpi_rank, fcn_name); + } + } + + if ( show_progress ) { /* 3 */ + HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", + world_mpi_rank, fcn_name, mile_stone++, (int)success); + fflush(stdout); + } + + for ( i = 0; i < (virt_num_data_entries / 2); i++ ) + { + insert_entry(cache_ptr, file_ptr, i, H5AC__NO_FLAGS_SET); + } + + if ( show_progress ) { /* 4 */ + HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", + world_mpi_rank, fcn_name, mile_stone++, (int)success); + fflush(stdout); + } + + /* flush the file so we can lock known clean entries. */ + if ( H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0 ) { + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: H5Fflush() failed.\n", + world_mpi_rank, fcn_name); + } + } + + if ( show_progress ) { /* 5 */ + HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", + world_mpi_rank, fcn_name, mile_stone++, (int)success); + fflush(stdout); + } + + for ( i = 0; i < (virt_num_data_entries / 4); i++ ) + { + if ( show_detailed_progress ) + { + HDfprintf(stdout, "%d:(lock %d)\n", world_mpi_rank, i); + fflush(stdout); + } + lock_entry(cache_ptr, file_ptr, i); + + if ( i % 2 == 0 ) + { + if ( show_detailed_progress ) + { + HDfprintf(stdout, "%d:(mpoped %d)\n", world_mpi_rank, i); + fflush(stdout); + } + mark_pinned_or_protected_entry_dirty(cache_ptr, file_ptr, i); + } + + if ( show_detailed_progress ) + { + HDfprintf(stdout, "%d:(unlock %d)\n", world_mpi_rank, i); + fflush(stdout); + } + unlock_entry(cache_ptr, file_ptr, i, H5AC__NO_FLAGS_SET); + + if ( i % 2 == 1 ) + { + if ( i % 4 == 1 ) { + + if ( show_detailed_progress ) + { + HDfprintf(stdout, "%d:(lock %d)\n", world_mpi_rank, i); + fflush(stdout); + } + lock_entry(cache_ptr, file_ptr, i); + if ( show_detailed_progress ) + { + HDfprintf(stdout, "%d:(unlock %d)\n", world_mpi_rank, i); + fflush(stdout); + } + unlock_entry(cache_ptr, file_ptr, i, H5AC__DIRTIED_FLAG); + } + + if ( show_detailed_progress ) + { + HDfprintf(stdout, "%d:(expunge %d)\n", world_mpi_rank, i); + fflush(stdout); + } + expunge_entry(cache_ptr, file_ptr, i); + } + } + + if ( show_progress ) { /* 6 */ + HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", + world_mpi_rank, fcn_name, mile_stone++, (int)success); + fflush(stdout); + } + + for ( i = (virt_num_data_entries / 2) - 1; + i >= (virt_num_data_entries / 4); + i-- ) + { + pin_entry(cache_ptr, file_ptr, i, TRUE, FALSE); + + if ( i % 2 == 0 ) + { + if ( i % 8 <= 4 ) { + + resize_entry(cache_ptr, file_ptr, i, data[i].len / 2); + } + + if ( i % 4 == 0 ) + { + mark_pinned_or_protected_entry_dirty(cache_ptr, + file_ptr, i); + } + else + { + mark_pinned_entry_dirty(cache_ptr, file_ptr, i, + FALSE, (size_t)0); + } + + if ( i % 8 <= 4 ) { + + resize_entry(cache_ptr, file_ptr, i, data[i].len); + } + } + + unpin_entry(cache_ptr, file_ptr, i, TRUE, FALSE, FALSE); + } + + if ( show_progress ) { /* 7 */ + HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", + world_mpi_rank, fcn_name, mile_stone++, (int)success); + fflush(stdout); + } + + if ( fid >= 0 ) { + + if ( ! take_down_cache(fid, cache_ptr) ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: take_down_cache() failed.\n", + world_mpi_rank, fcn_name); + } + } + } + + if ( show_progress ) { /* 8 */ + HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", + world_mpi_rank, fcn_name, mile_stone++, (int)success); + fflush(stdout); + } + + /* verify that all instance of datum are back where the started + * and are clean. + */ + + for ( i = 0; i < NUM_DATA_ENTRIES; i++ ) + { + HDassert( data_index[i] == i ); + HDassert( ! (data[i].dirty) ); + } + + if ( show_progress ) { /* 9 */ + HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", + world_mpi_rank, fcn_name, mile_stone++, (int)success); + fflush(stdout); + } + + /* compose the done message */ + mssg.req = DONE_REQ_CODE; + mssg.src = world_mpi_rank; + mssg.dest = world_server_mpi_rank; + mssg.mssg_num = -1; /* set by send function */ + mssg.base_addr = 0; /* not used */ + mssg.len = 0; /* not used */ + mssg.ver = 0; /* not used */ + mssg.magic = MSSG_MAGIC; + + if ( success ) { + + success = send_mssg(&mssg, FALSE); + + if ( ! success ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: send_mssg() failed on done.\n", + world_mpi_rank, fcn_name); + } + } + } + + if ( show_progress ) { /* 10 */ + HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", + world_mpi_rank, fcn_name, mile_stone++, (int)success); + fflush(stdout); + } + } + + max_nerrors = get_max_nerrors(); + + if ( world_mpi_rank == 0 ) { + + if ( max_nerrors == 0 ) { + + PASSED(); + + } else { + + failures++; + H5_FAILED(); + } + } + + success = ( ( success ) && ( max_nerrors == 0 ) ); + + return(success); + +} /* smoke_check_5() */ + + +/***************************************************************************** + * + * Function: trace_file_check() + * + * Purpose: A basic test of the trace file capability. In essence, + * we invoke all operations that generate trace file output, + * and then verify that the expected output was generated. + * + * Note that the trace file is currently implemented at the + * H5AC level, so all calls have to go through H5AC. Thus it + * is more convenient to test trace file capabilities in the + * parallel cache test which works at the H5AC level, instead + * of in the serial test code which does everything at the + * H5C level. + * + * The function must test trace file output in the following + * functions: + * + * - H5AC_flush() + * - H5AC_set() + * - H5AC_mark_pinned_entry_dirty() + * - H5AC_mark_pinned_or_protected_entry_dirty() + * H5AC_rename() + * - H5AC_pin_protected_entry() + * - H5AC_protect() + * - H5AC_unpin_entry() + * - H5AC_unprotect() + * - H5AC_set_cache_auto_resize_config() + * - H5AC_expunge_entry() + * - H5AC_resize_pinned_entry() + * + * This test is skipped if H5_METADATA_TRACE_FILE is undefined. + * + * Return: Success: TRUE + * + * Failure: FALSE + * + * Programmer: JRM -- 6/13/06 + * + * Modifications: + * + * JRM -- 7/11/06 + * Updated for H5AC_expunge_entry() and + * H5AC_resize_pinned_entry(). + * + * JRM -- 2/14/08 + * Updated for changes in H5AC_set_cache_auto_resize_config + * to support the new flash cache size increment code. + * + *****************************************************************************/ + +hbool_t +trace_file_check(void) +{ + hbool_t success = TRUE; + +#ifdef H5_METADATA_TRACE_FILE + + const char * fcn_name = "trace_file_check()"; + const char * expected_output[] = + { + "### HDF5 metadata cache trace file version 2 ###\n", + "H5AC_set_cache_auto_resize_config 1 0 1 0 \"t_cache_trace.txt\" 1 0 1048576 0.500000 16777216 1048576 50000 1 0.900000 2.000000 1 4194304 1 1.000000 0.250000 3 0.999000 0.900000 1 1048576 3 1 0.100000 262144 0\n", + "H5AC_set 0x400 2 16 0x0 2 0\n", + "H5AC_set 0x402 2 16 0x0 2 0\n", + "H5AC_set 0x404 4 16 0x0 4 0\n", + "H5AC_set 0x408 6 16 0x0 6 0\n", + "H5AC_protect 0x400 2 16 H5AC_WRITE 2 1\n", + "H5AC_mark_pinned_or_protected_entry_dirty 0x400 0\n", + "H5AC_unprotect 0x400 16 2 0 0\n", + "H5AC_protect 0x402 2 16 H5AC_WRITE 2 1\n", + "H5AC_pin_protected_entry 0x402 0\n", + "H5AC_unprotect 0x402 16 2 0 0\n", + "H5AC_unpin_entry 0x402 0\n", + "H5AC_expunge_entry 0x402 16 0\n", + "H5AC_protect 0x404 4 16 H5AC_WRITE 4 1\n", + "H5AC_pin_protected_entry 0x404 0\n", + "H5AC_unprotect 0x404 16 4 0 0\n", + "H5AC_mark_pinned_entry_dirty 0x404 0 0 0\n", + "H5AC_resize_pinned_entry 0x404 2 0\n", + "H5AC_resize_pinned_entry 0x404 4 0\n", + "H5AC_unpin_entry 0x404 0\n", + "H5AC_rename 0x400 0x8e65 16 0\n", + "H5AC_rename 0x8e65 0x400 16 0\n", + "H5AC_flush 0x0 0\n", + NULL + }; + char buffer[256]; + char trace_file_name[64]; + hbool_t done = FALSE; + int i; + int max_nerrors; + int expected_line_len; + int actual_line_len; + hid_t fid = -1; + H5F_t * file_ptr = NULL; + H5C_t * cache_ptr = NULL; + FILE * trace_file_ptr = NULL; + H5AC_cache_config_t config; + struct mssg_t mssg; + +#endif /* H5_METADATA_TRACE_FILE */ + + if ( world_mpi_rank == 0 ) { + + TESTING("trace file collection"); + } + +#ifdef H5_METADATA_TRACE_FILE + + nerrors = 0; + init_data(); + reset_stats(); + + if ( world_mpi_rank == world_server_mpi_rank ) { + + if ( ! server_main() ) { + + /* some error occured in the server -- report failure */ + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: server_main() failed.\n", + world_mpi_rank, fcn_name); + } + } + } + else /* run the clients */ + { + + if ( ! setup_cache_for_test(&fid, &file_ptr, &cache_ptr) ) { + + nerrors++; + fid = -1; + cache_ptr = NULL; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: setup_cache_for_test() failed.\n", + world_mpi_rank, fcn_name); + } + } + + if ( nerrors == 0 ) { + + config.version = H5AC__CURR_CACHE_CONFIG_VERSION; + + if ( H5AC_get_cache_auto_resize_config(cache_ptr, &config) + != SUCCEED ) { + + nerrors++; + HDfprintf(stdout, + "%d:%s: H5AC_get_cache_auto_resize_config() failed.\n", + world_mpi_rank, fcn_name); + + } else { + + config.open_trace_file = TRUE; + strcpy(config.trace_file_name, "t_cache_trace.txt"); + + if ( H5AC_set_cache_auto_resize_config(file_ptr, &config) + != SUCCEED ) { + + nerrors++; + HDfprintf(stdout, + "%d:%s: H5AC_set_cache_auto_resize_config() failed.\n", + world_mpi_rank, fcn_name); + } + } + } + + insert_entry(cache_ptr, file_ptr, 0, H5AC__NO_FLAGS_SET); + insert_entry(cache_ptr, file_ptr, 1, H5AC__NO_FLAGS_SET); + insert_entry(cache_ptr, file_ptr, 2, H5AC__NO_FLAGS_SET); + insert_entry(cache_ptr, file_ptr, 3, H5AC__NO_FLAGS_SET); + + lock_entry(cache_ptr, file_ptr, 0); + mark_pinned_or_protected_entry_dirty(cache_ptr, file_ptr, 0); + unlock_entry(cache_ptr, file_ptr, 0, H5AC__NO_FLAGS_SET); + + lock_entry(cache_ptr, file_ptr, 1); + pin_protected_entry(cache_ptr, file_ptr, 1, TRUE); + unlock_entry(cache_ptr, file_ptr, 1, H5AC__NO_FLAGS_SET); + unpin_entry(cache_ptr, file_ptr, 1, TRUE, FALSE, FALSE); + + expunge_entry(cache_ptr,file_ptr, 1); + + lock_entry(cache_ptr, file_ptr, 2); + pin_protected_entry(cache_ptr, file_ptr, 2, TRUE); + unlock_entry(cache_ptr, file_ptr, 2, H5AC__NO_FLAGS_SET); + mark_pinned_entry_dirty(cache_ptr, file_ptr, 2, FALSE, 0); + resize_entry(cache_ptr, file_ptr, 2, data[2].len / 2); + resize_entry(cache_ptr, file_ptr, 2, data[2].len); + unpin_entry(cache_ptr, file_ptr, 2, TRUE, FALSE, FALSE); + + rename_entry(cache_ptr, file_ptr, 0, 20); + rename_entry(cache_ptr, file_ptr, 0, 20); + + if ( H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0 ) { + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: H5Fflush() failed.\n", + world_mpi_rank, fcn_name); + } + } + + if ( nerrors == 0 ) { + + config.version = H5AC__CURR_CACHE_CONFIG_VERSION; + + if ( H5AC_get_cache_auto_resize_config(cache_ptr, &config) + != SUCCEED ) { + + nerrors++; + HDfprintf(stdout, + "%d:%s: H5AC_get_cache_auto_resize_config() failed.\n", + world_mpi_rank, fcn_name); + + } else { + + config.open_trace_file = FALSE; + config.close_trace_file = TRUE; + config.trace_file_name[0] = '\0'; + + if ( H5AC_set_cache_auto_resize_config(file_ptr, &config) + != SUCCEED ) { + + nerrors++; + HDfprintf(stdout, + "%d:%s: H5AC_set_cache_auto_resize_config() failed.\n", + world_mpi_rank, fcn_name); + } + } + } + + if ( fid >= 0 ) { + + if ( ! take_down_cache(fid, cache_ptr) ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: take_down_cache() failed.\n", + world_mpi_rank, fcn_name); + } + } + } + + /* verify that all instance of datum are back where the started + * and are clean. + */ + + for ( i = 0; i < NUM_DATA_ENTRIES; i++ ) + { + HDassert( data_index[i] == i ); + HDassert( ! (data[i].dirty) ); + } + + /* compose the done message */ + mssg.req = DONE_REQ_CODE; + mssg.src = world_mpi_rank; + mssg.dest = world_server_mpi_rank; + mssg.mssg_num = -1; /* set by send function */ + mssg.base_addr = 0; /* not used */ + mssg.len = 0; /* not used */ + mssg.ver = 0; /* not used */ + mssg.magic = MSSG_MAGIC; + + if ( success ) { + + success = send_mssg(&mssg, FALSE); + + if ( ! success ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: send_mssg() failed on done.\n", + world_mpi_rank, fcn_name); + } + } + } + + if ( nerrors == 0 ) { + + sprintf(trace_file_name, "t_cache_trace.txt.%d", + (int)file_mpi_rank); + + if ( (trace_file_ptr = HDfopen(trace_file_name, "r")) == NULL ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: HDfopen failed.\n", + world_mpi_rank, fcn_name); + } + } + } + + i = 0; + while ( ( nerrors == 0 ) && ( ! done ) ) + { + if ( expected_output[i] == NULL ) { + + expected_line_len = 0; + + } else { + + expected_line_len = HDstrlen(expected_output[i]); + } + + if ( HDfgets(buffer, 255, trace_file_ptr) != NULL ) { + + actual_line_len = strlen(buffer); + + } else { + + actual_line_len = 0; + } + + if ( ( actual_line_len == 0 ) && ( expected_line_len == 0 ) ) { + + done = TRUE; + + } else if ( ( actual_line_len != expected_line_len ) || + ( HDstrcmp(buffer, expected_output[i]) != 0 ) ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, + "%d:%s: Unexpected data in trace file line %d.\n", + world_mpi_rank, fcn_name, i); + HDfprintf(stdout, "%d:%s: expected = \"%s\" %d\n", + world_mpi_rank, fcn_name, expected_output[i], + expected_line_len); + HDfprintf(stdout, "%d:%s: actual = \"%s\" %d\n", + world_mpi_rank, fcn_name, buffer, + actual_line_len); + } + } else { + i++; + } + } + + if ( trace_file_ptr != NULL ) { + + HDfclose(trace_file_ptr); + trace_file_ptr = NULL; +#if 1 + HDremove(trace_file_name); +#endif + } + } + + max_nerrors = get_max_nerrors(); + + if ( world_mpi_rank == 0 ) { + + if ( max_nerrors == 0 ) { + + PASSED(); + + } else { + + failures++; + H5_FAILED(); + } + } + + success = ( ( success ) && ( max_nerrors == 0 ) ); + +#else /* H5_METADATA_TRACE_FILE */ + + if ( world_mpi_rank == 0 ) { + + SKIPPED(); + + HDfprintf(stdout, " trace file support disabled.\n"); + } + +#endif /* H5_METADATA_TRACE_FILE */ + + return(success); + +} /* trace_file_check() */ + + +/***************************************************************************** + * + * Function: main() + * + * Purpose: Main function for the parallel cache test. + * + * Return: Success: 0 + * + * Failure: 1 + * + * Programmer: JRM -- 12/23/05 + * + * Modifications: + * + * None. + * + *****************************************************************************/ + +int +main(int argc, char **argv) +{ + const char * fcn_name = "main()"; + int express_test; + unsigned u; + int mpi_size; + int mpi_rank; + int max_nerrors; + + MPI_Init(&argc, &argv); + MPI_Comm_size(MPI_COMM_WORLD, &mpi_size); + MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank); + + world_mpi_size = mpi_size; + world_mpi_rank = mpi_rank; + world_server_mpi_rank = mpi_size - 1; + world_mpi_comm = MPI_COMM_WORLD; + + H5open(); + + express_test = do_express_test(); +#if 0 /* JRM */ + express_test = 0; +#endif /* JRM */ + if ( express_test ) { + + virt_num_data_entries = EXPRESS_VIRT_NUM_DATA_ENTRIES; + + } else { + + virt_num_data_entries = STD_VIRT_NUM_DATA_ENTRIES; + } + +#ifdef H5_HAVE_MPE + if ( MAINPROCESS ) { printf(" Tests compiled for MPE.\n"); } + virt_num_data_entries = MPE_VIRT_NUM_DATA_ENTIES; +#endif /* H5_HAVE_MPE */ + + + if (MAINPROCESS){ + printf("===================================\n"); + printf("Parallel metadata cache tests\n"); + printf(" mpi_size = %d\n", mpi_size); + printf(" express_test = %d\n", express_test); + printf("===================================\n"); + } + + if ( mpi_size < 3 ) { + + if ( MAINPROCESS ) { + + printf(" Need at least 3 processes. Exiting.\n"); + } + goto finish; + } + + set_up_file_communicator(); + + setup_derived_types(); + + /* h5_fixname() will hang some processes don't participate. + * + * Thus we set up the fapl global with the world communicator, + * make our calls to h5_fixname(), discard the fapl, and then + * create it again with the file communicator. + */ + + /* setup file access property list with the world communicator */ + if ( FAIL == (fapl = H5Pcreate(H5P_FILE_ACCESS)) ) { + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: H5Pcreate() failed 1.\n", + world_mpi_rank, fcn_name); + } + } + + if ( H5Pset_fapl_mpio(fapl, world_mpi_comm, MPI_INFO_NULL) < 0 ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: H5Pset_fapl_mpio() failed 1.\n", + world_mpi_rank, fcn_name); + } + } + + /* fix the file names */ + for ( u = 0; u < sizeof(FILENAME) / sizeof(FILENAME[0]) - 1; ++u ) + { + if ( h5_fixname(FILENAME[u], fapl, filenames[u], + sizeof(filenames[u])) == NULL ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: h5_fixname() failed.\n", + world_mpi_rank, fcn_name); + } + break; + } + } + + /* close the fapl before we set it up again */ + if ( H5Pclose(fapl) < 0 ) { + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: H5Pclose() failed.\n", + world_mpi_rank, fcn_name); + } + } + + /* now create the fapl again, excluding the server process. */ + if ( world_mpi_rank != world_server_mpi_rank ) { + + /* setup file access property list */ + if ( FAIL == (fapl = H5Pcreate(H5P_FILE_ACCESS)) ) { + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: H5Pcreate() failed 2.\n", + world_mpi_rank, fcn_name); + } + } + + if ( H5Pset_fapl_mpio(fapl, file_mpi_comm, MPI_INFO_NULL) < 0 ) { + + nerrors++; + if ( verbose ) { + HDfprintf(stdout, "%d:%s: H5Pset_fapl_mpio() failed 2.\n", + world_mpi_rank, fcn_name); + } + } + } + + setup_rand(); + + max_nerrors = get_max_nerrors(); + + if ( max_nerrors != 0 ) { + + /* errors in setup -- no point in continuing */ + + if ( world_mpi_rank == 0 ) { + + HDfprintf(stdout, "Errors in test initialization. Exiting.\n"); + } + goto finish; + } + + /* run the tests */ +#if 1 + server_smoke_check(); +#endif +#if 1 + smoke_check_1(); +#endif +#if 1 + smoke_check_2(); +#endif +#if 1 + smoke_check_3(); +#endif +#if 1 + smoke_check_4(); +#endif +#if 1 + smoke_check_5(); +#endif +#if 1 + trace_file_check(); +#endif + +finish: + /* make sure all processes are finished before final report, cleanup + * and exit. + */ + MPI_Barrier(MPI_COMM_WORLD); + if (MAINPROCESS){ /* only process 0 reports */ + printf("===================================\n"); + if (failures){ + printf("***metadata cache tests detected %d failures***\n", + failures); + } + else{ + printf("metadata cache tests finished with no failures\n"); + } + printf("===================================\n"); + } + + /* close HDF5 library */ + H5close(); + + /* MPI_Finalize must be called AFTER H5close which may use MPI calls */ + MPI_Finalize(); + + /* cannot just return (failures) because exit code is limited to 1byte */ + return(failures != 0); +} + diff --git a/testpar/t_cache1.c b/testpar/t_cache1.c index add720a..a218a7d 100644 --- a/testpar/t_cache1.c +++ b/testpar/t_cache1.c @@ -3272,7 +3272,7 @@ setup_cache_for_test(hid_t * fid_ptr, world_mpi_rank, fcn_name); } } else { - cache_ptr = file_ptr->shared->cache; + cache_ptr = file_ptr->shared->cache1; } if ( cache_ptr == NULL ) { @@ -5283,7 +5283,7 @@ trace_file_check(void) const char * expected_output[] = { "### HDF5 metadata cache trace file version 1 ###\n", - "H5AC1_set_cache_auto_resize_config 1 0 1 0 \"t_cache_trace.txt\" 1 0 1048576 0.500000 16777216 1048576 50000 1 0.900000 2.000000 1 1.000000 0.250000 1 4194304 3 0.999000 0.900000 1 1048576 3 1 0.100000 262144 0\n", + "H5AC1_set_cache_auto_resize_config 1 0 1 0 \"t_cache1_trace.txt\" 1 0 1048576 0.500000 16777216 1048576 50000 1 0.900000 2.000000 1 1.000000 0.250000 1 4194304 3 0.999000 0.900000 1 1048576 3 1 0.100000 262144 0\n", "H5AC1_set 0x0 15 0x0 2 0\n", "H5AC1_set 0x2 15 0x0 2 0\n", "H5AC1_set 0x4 15 0x0 4 0\n", @@ -5376,7 +5376,7 @@ trace_file_check(void) } else { config.open_trace_file = TRUE; - strcpy(config.trace_file_name, "t_cache_trace.txt"); + strcpy(config.trace_file_name, "t_cache1_trace.txt"); if ( H5AC1_set_cache_auto_resize_config(cache_ptr, &config) != SUCCEED ) { @@ -5501,7 +5501,7 @@ trace_file_check(void) if ( nerrors == 0 ) { - sprintf(trace_file_name, "t_cache_trace.txt.%d", + sprintf(trace_file_name, "t_cache1_trace.txt.%d", (int)file_mpi_rank); if ( (trace_file_ptr = HDfopen(trace_file_name, "r")) == NULL ) { diff --git a/testpar/t_cache2.c b/testpar/t_cache2.c deleted file mode 100644 index 75c7ef9..0000000 --- a/testpar/t_cache2.c +++ /dev/null @@ -1,6115 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * Copyright by the Board of Trustees of the University of Illinois. * - * All rights reserved. * - * * - * This file is part of HDF5. The full HDF5 copyright notice, including * - * terms governing use, modification, and redistribution, is contained in * - * the files COPYING and Copyright.html. COPYING can be found at the root * - * of the source code distribution tree; Copyright.html can be found at the * - * root level of an installed copy of the electronic HDF5 document set and * - * is linked from the top-level documents page. It can also be found at * - * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * - * access to either file, you may request a copy from help@hdfgroup.org. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* - * Parallel metadata cache tests. - * - */ - -#include "h5test.h" -#include "testpar.h" -#include "H5Iprivate.h" -#include "H5MFprivate.h" -#include "H5AC2private.h" - -#define H5C2_PACKAGE /*suppress error about including H5C2pkg */ - -#include "H5C2pkg.h" - -#define H5AC2_PACKAGE /*suppress error about including H5AC2pkg */ - -#include "H5AC2pkg.h" - -#define H5F_PACKAGE /*suppress error about including H5Fpkg */ - -#include "H5Fpkg.h" - -#define BASE_ADDR (haddr_t)1024 - - -int nerrors = 0; -int failures = 0; -hbool_t verbose = TRUE; /* used to control error messages */ -#if 1 -/* So far we haven't needed this, but that may change. - * Keep it around for now - */ -hid_t noblock_dxpl_id=(-1); -#endif - -#define NFILENAME 2 -#define PARATESTFILE filenames[0] -const char *FILENAME[NFILENAME]={"Cache2TestDummy", NULL}; -char filenames[NFILENAME][PATH_MAX]; -hid_t fapl; /* file access property list */ -haddr_t max_addr = 0; /* used to store the end of - * the address space used by - * the data array (see below). - */ -hbool_t callbacks_verbose = FALSE; /* flag used to control whether - * the callback functions are in - * verbose mode. - */ - - -int world_mpi_size = -1; -int world_mpi_rank = -1; -int world_server_mpi_rank = -1; -MPI_Comm world_mpi_comm = MPI_COMM_NULL; -int file_mpi_size = -1; -int file_mpi_rank = -1; -MPI_Comm file_mpi_comm = MPI_COMM_NULL; - - -/* the following globals are used to maintain rudementary statistics - * to check the validity of the statistics maintained by H5C2.c - */ - -long datum_clears = 0; -long datum_pinned_clears = 0; -long datum_destroys = 0; -long datum_flushes = 0; -long datum_pinned_flushes = 0; -long datum_loads = 0; -long global_pins = 0; -long global_dirty_pins = 0; -long local_pins = 0; - - -/***************************************************************************** - * struct datum - * - * Instances of struct datum are used to store information on entries - * that may be loaded into the cache. The individual fields are - * discussed below: - * - * header: Instance of H5C2_cache_entry_t used by the for its data. - * This field is only used on the file processes, not on the - * server process. - * - * This field MUST be the first entry in this structure. - * - * base_addr: Base address of the entry. - * - * len: Length of the entry. - * - * local_len: Length of the entry according to the cache. This - * value must be positive, and may not be larger than len. - * - * The field exists to allow us change the sizes of entries - * in the cache without upsetting the server. This value - * is only used locally, and is never sent to the server. - * - * ver: Version number of the entry. This number is initialize - * to zero, and incremented each time the entry is modified. - * - * dirty: Boolean flag indicating whether the entry is dirty. - * - * For current purposes, an entry is clean until it is - * modified, and dirty until written to the server (cache - * on process 0) or until it is marked clean (all other - * caches). - * - * valid: Boolean flag indicating whether the entry contains - * valid data. Attempts to read an entry whose valid - * flag is not set should trigger an error. - * - * locked: Boolean flag that is set to true iff the entry is in - * the cache and locked. - * - * global_pinned: Boolean flag that is set to true iff the entry has - * been pinned collectively in all caches. Since writes must - * be collective across all processes, only entries pinned - * in this fashion may be marked dirty. - * - * local_pinned: Boolean flag that is set to true iff the entry - * has been pinned in the local cache, but probably not all - * caches. Such pins will typically not be consistant across - * processes, and thus cannot be marked as dirty unless they - * happen to overlap some collective operation. - * - * index: Index of this instance of datum in the data_index[] array - * discussed below. - * - *****************************************************************************/ - -struct datum -{ - H5C2_cache_entry_t header; - haddr_t base_addr; - size_t len; - size_t local_len; - int ver; - hbool_t dirty; - hbool_t valid; - hbool_t locked; - hbool_t global_pinned; - hbool_t local_pinned; - int index; -}; - -/***************************************************************************** - * data array - * - * The data array is an array of instances of datum of size - * NUM_DATA_ENTRIES that is used to track the particulars of all - * the entries that may be loaded into the cache. - * - * It exists on all processes, although the master copy is maintained - * by the server process. If the cache is performing correctly, all - * versions should be effectively identical. By that I mean that - * the data received from the server should always match that in - * the local version of the data array. - * - *****************************************************************************/ - -#define NUM_DATA_ENTRIES 100000 - -struct datum data[NUM_DATA_ENTRIES]; - - -/* Many tests use the size of data array as the size of test loops. - * On some machines, this results in unacceptably long test runs. - * - * To deal with this issue, I have introduced the virt_num_data_entries - * global, which can be set to a lower value to throtle the length of - * tests. - * - * Note that this value must always be divisible by 40, and must be an - * even divisor of NUM_DATA_ENTRIES. So far, all tests have been with - * powers of 10 that meet these criteria. - * - * Further, this value must be consistant across all processes. - */ - -#define STD_VIRT_NUM_DATA_ENTRIES NUM_DATA_ENTRIES -#define EXPRESS_VIRT_NUM_DATA_ENTRIES (NUM_DATA_ENTRIES / 10) -/* Use a smaller test size to avoid creating huge MPE logfiles. */ -#define MPE_VIRT_NUM_DATA_ENTIES (NUM_DATA_ENTRIES / 100) - -int virt_num_data_entries = NUM_DATA_ENTRIES; - - -/***************************************************************************** - * data_index array - * - * The data_index array is an array of integer used to maintain a list - * of instances of datum in the data array in increasing base_addr order. - * - * This array is necessary, as rename operations can swap the values - * of the base_addr fields of two instances of datum. Without this - * array, we would no longer be able to use a binary search on a sorted - * list to find the indexes of instances of datum given the values of - * their base_addr fields. - * - *****************************************************************************/ - -int data_index[NUM_DATA_ENTRIES]; - - -/***************************************************************************** - * struct mssg - * - * The mssg structure is used as a generic container for messages to - * and from the server. Not all fields are used in all cases. - * - * req: Integer field containing the type of the message. - * - * src: World communicator MPI rank of the sending process. - * - * dest: World communicator MPI rank of the destination process. - * - * mssg_num: Serial number assigned to the message by the sender. - * - * base_addr: Base address of a datum. Not used in all mssgs. - * - * len: Length of a datum (in bytes). Not used in all mssgs. - * - * ver: Version number of a datum. Not used in all mssgs. - * - * magic: Magic number for error detection. Must be set to - * MSSG_MAGIC. - * - *****************************************************************************/ - -#define DO_WRITE_REQ_ACK FALSE -#define DO_SYNC_AFTER_WRITE TRUE - -#define WRITE_REQ_CODE 0 -#define WRITE_REQ_ACK_CODE 1 -#define READ_REQ_CODE 2 -#define READ_REQ_REPLY_CODE 3 -#define SYNC_REQ_CODE 4 -#define SYNC_ACK_CODE 5 -#define DONE_REQ_CODE 6 -#define MAX_REQ_CODE 6 - -#define MSSG_MAGIC 0x1248 - -struct mssg_t -{ - int req; - int src; - int dest; - long int mssg_num; - haddr_t base_addr; - int len; - int ver; - unsigned magic; -}; - -MPI_Datatype mpi_mssg_t; /* for MPI derived type created from mssg */ - - -/*****************************************************************************/ -/************************** function declarations ****************************/ -/*****************************************************************************/ - -/* stats functions */ - -void print_stats(void); -void reset_stats(void); - -/* MPI setup functions */ - -hbool_t set_up_file_communicator(void); - - -/* data array manipulation functions */ - -int addr_to_datum_index(haddr_t base_addr); -void init_data(void); - - -/* test coodination related functions */ - -int do_express_test(void); -void do_sync(void); -int get_max_nerrors(void); - - -/* mssg xfer related functions */ - -hbool_t recv_mssg(struct mssg_t *mssg_ptr, int mssg_tag_offset); -hbool_t send_mssg(struct mssg_t *mssg_ptr, hbool_t add_req_to_tag); -hbool_t setup_derived_types(void); -hbool_t takedown_derived_types(void); - - -/* server functions */ - -hbool_t server_main(void); -hbool_t serve_read_request(struct mssg_t * mssg_ptr); -hbool_t serve_sync_request(struct mssg_t * mssg_ptr); -hbool_t serve_write_request(struct mssg_t * mssg_ptr); - - -/* call back functions & related data structures */ - -static herr_t datum_clear_dirty_bits(haddr_t addr, - size_t len, - void * thing); - -static void * datum_deserialize(haddr_t addr, - size_t len, - const void * image_ptr, - const void * udata_ptr, - hbool_t * dirty_ptr); - -static herr_t datum_image_len(void *thing, - size_t *image_len_ptr); - -static herr_t datum_serialize(const H5F_t *f, - hid_t dxpl_id, - haddr_t addr, - size_t len, - void * image_ptr, - void * thing, - unsigned * flags_ptr, - haddr_t * new_addr_ptr, - size_t * new_len_ptr, - void ** new_image_ptr_ptr); - -static herr_t datum_free_icr(haddr_t addr, - size_t len, - void * thing); - -#define DATUM_ENTRY_TYPE H5AC2_TEST_ID - -#define NUMBER_OF_ENTRY_TYPES 1 - -const H5C2_class_t types[NUMBER_OF_ENTRY_TYPES] = -{ - { - DATUM_ENTRY_TYPE, - "datum", - H5FD_MEM_DEFAULT, - (H5C2_deserialize_func_t)datum_deserialize, - (H5C2_image_len_func_t)datum_image_len, - (H5C2_serialize_func_t)datum_serialize, - (H5C2_free_icr_func_t)datum_free_icr, - (H5C2_clear_dirty_bits_func_t)datum_clear_dirty_bits - } -}; - - -/* test utility functions */ - -void expunge_entry(H5C2_t * cache_ptr, H5F_t * file_ptr, int32_t idx); -void insert_entry(H5C2_t * cache_ptr, H5F_t * file_ptr, - int32_t idx, unsigned int flags); -void local_pin_and_unpin_random_entries(H5C2_t * cache_ptr, H5F_t * file_ptr, - int min_idx, int max_idx, - int min_count, int max_count); -void local_pin_random_entry(H5C2_t * cache_ptr, H5F_t * file_ptr, - int min_idx, int max_idx); -void local_unpin_all_entries(H5C2_t * cache_ptr, H5F_t * file_ptr, - hbool_t via_unprotect); -int local_unpin_next_pinned_entry(H5C2_t * cache_ptr, H5F_t * file_ptr, - int start_idx, hbool_t via_unprotect); -void lock_and_unlock_random_entries(H5C2_t * cache_ptr, H5F_t * file_ptr, - int min_idx, int max_idx, - int min_count, int max_count); -void lock_and_unlock_random_entry(H5C2_t * cache_ptr, H5F_t * file_ptr, - int min_idx, int max_idx); -void lock_entry(H5C2_t * cache_ptr, H5F_t * file_ptr, int32_t idx); -void mark_pinned_entry_dirty(H5C2_t * cache_ptr, H5F_t * file_ptr, - int32_t idx, hbool_t size_changed, size_t new_size); -void mark_pinned_or_protected_entry_dirty(H5C2_t * cache_ptr, - H5F_t * file_ptr, - int32_t idx); -void pin_entry(H5C2_t * cache_ptr, H5F_t * file_ptr, int32_t idx, - hbool_t global, hbool_t dirty); -void pin_protected_entry(H5C2_t * cache_ptr, H5F_t * file_ptr, - int32_t idx, hbool_t global); -void rename_entry(H5C2_t * cache_ptr, H5F_t * file_ptr, - int32_t old_idx, int32_t new_idx); -void resize_entry(H5C2_t * cache_ptr, H5F_t * file_ptr, - int32_t idx, size_t new_size); -hbool_t setup_cache_for_test(hid_t * fid_ptr, H5F_t ** file_ptr_ptr, - H5C2_t ** cache_ptr_ptr); -void setup_rand(void); -hbool_t take_down_cache(hid_t fid, H5C2_t * cache_ptr); -void unlock_entry(H5C2_t * cache_ptr, H5F_t * file_ptr, - int32_t type, unsigned int flags); -void unpin_entry(H5C2_t * cache_ptr, H5F_t * file_ptr, int32_t idx, - hbool_t global, hbool_t dirty, hbool_t via_unprotect); - - -/* test functions */ - -hbool_t server_smoke_check(void); -hbool_t smoke_check_1(void); -hbool_t smoke_check_2(void); -hbool_t smoke_check_3(void); -hbool_t smoke_check_4(void); -hbool_t smoke_check_5(void); -hbool_t trace_file_check(void); - - -/*****************************************************************************/ -/****************************** stats functions ******************************/ -/*****************************************************************************/ - -/***************************************************************************** - * - * Function: print_stats() - * - * Purpose: Print the rudementary stats maintained by t_cache. - * - * This is a debugging function, which will not normally - * be run as part of t_cache. - * - * Return: void - * - * Programmer: JRM -- 4/17/06 - * - * Modifications: - * - * None. - * - *****************************************************************************/ - -void -print_stats(void) -{ - HDfprintf(stdout, - "%d: datum clears / pinned clears / destroys = %ld / %ld / %ld\n", - world_mpi_rank, datum_clears, datum_pinned_clears, - datum_destroys ); - HDfprintf(stdout, - "%d: datum flushes / pinned flushes / loads = %ld / %ld / %ld\n", - world_mpi_rank, datum_flushes, datum_pinned_flushes, - datum_loads ); - HDfprintf(stdout, - "%d: pins: global / global dirty / local = %ld / %ld / %ld\n", - world_mpi_rank, global_pins, global_dirty_pins, local_pins); - HDfflush(stdout); - - return; - -} /* print_stats() */ - -/***************************************************************************** - * - * Function: reset_stats() - * - * Purpose: Reset the rudementary stats maintained by t_cache. - * - * Return: void - * - * Programmer: JRM -- 4/17/06 - * - * Modifications: - * - * None. - * - *****************************************************************************/ - -void -reset_stats(void) -{ - datum_clears = 0; - datum_pinned_clears = 0; - datum_destroys = 0; - datum_flushes = 0; - datum_pinned_flushes = 0; - datum_loads = 0; - global_pins = 0; - global_dirty_pins = 0; - local_pins = 0; - - return; - -} /* reset_stats() */ - - -/*****************************************************************************/ -/**************************** MPI setup functions ****************************/ -/*****************************************************************************/ - -/***************************************************************************** - * - * Function: set_up_file_communicator() - * - * Purpose: Create the MPI communicator used to open a HDF5 file with. - * In passing, also initialize the file_mpi... globals. - * - * Return: Success: TRUE - * - * Failure: FALSE - * - * Programmer: JRM -- 11/16/05 - * - * Modifications: - * - * None. - * - *****************************************************************************/ - -hbool_t -set_up_file_communicator(void) -{ - const char * fcn_name = "set_up_file_communicator()"; - hbool_t success = TRUE; - int mpi_result; - int num_excluded_ranks; - int excluded_ranks[1]; - MPI_Group file_group; - MPI_Group world_group; - - if ( success ) { - - mpi_result = MPI_Comm_group(world_mpi_comm, &world_group); - - if ( mpi_result != MPI_SUCCESS ) { - - nerrors++; - success = FALSE; - if ( verbose ) { - fprintf(stdout, - "%d:%s: MPI_Comm_group() failed with error %d.\n", - world_mpi_rank, fcn_name, mpi_result); - } - } - } - - if ( success ) { - - num_excluded_ranks = 1; - excluded_ranks[0] = world_server_mpi_rank; - mpi_result = MPI_Group_excl(world_group, num_excluded_ranks, - excluded_ranks, &file_group); - - if ( mpi_result != MPI_SUCCESS ) { - - nerrors++; - success = FALSE; - if ( verbose ) { - fprintf(stdout, - "%d:%s: MPI_Group_excl() failed with error %d.\n", - world_mpi_rank, fcn_name, mpi_result); - } - } - } - - if ( success ) { - - mpi_result = MPI_Comm_create(world_mpi_comm, file_group, - &file_mpi_comm); - - if ( mpi_result != MPI_SUCCESS ) { - - nerrors++; - success = FALSE; - if ( verbose ) { - fprintf(stdout, - "%d:%s: MPI_Comm_create() failed with error %d.\n", - world_mpi_rank, fcn_name, mpi_result); - } - - } else { - - if ( world_mpi_rank != world_server_mpi_rank ) { - - if ( file_mpi_comm == MPI_COMM_NULL ) { - - nerrors++; - success = FALSE; - if ( verbose ) { - fprintf(stdout, - "%d:%s: file_mpi_comm == MPI_COMM_NULL.\n", - world_mpi_rank, fcn_name); - } - } - } else { - - file_mpi_size = world_mpi_size - 1; /* needed by the server */ - - if ( file_mpi_comm != MPI_COMM_NULL ) { - - nerrors++; - success = FALSE; - if ( verbose ) { - fprintf(stdout, - "%d:%s: file_mpi_comm != MPI_COMM_NULL.\n", - world_mpi_rank, fcn_name); - } - } - } - } - } - - if ( ( success ) && ( world_mpi_rank != world_server_mpi_rank ) ) { - - mpi_result = MPI_Comm_size(file_mpi_comm, &file_mpi_size); - - if ( mpi_result != MPI_SUCCESS ) { - - nerrors++; - success = FALSE; - if ( verbose ) { - fprintf(stdout, - "%d:%s: MPI_Comm_size() failed with error %d.\n", - world_mpi_rank, fcn_name, mpi_result); - } - } - } - - if ( ( success ) && ( world_mpi_rank != world_server_mpi_rank ) ) { - - mpi_result = MPI_Comm_rank(file_mpi_comm, &file_mpi_rank); - - if ( mpi_result != MPI_SUCCESS ) { - - nerrors++; - success = FALSE; - if ( verbose ) { - fprintf(stdout, - "%d:%s: MPI_Comm_rank() failed with error %d.\n", - world_mpi_rank, fcn_name, mpi_result); - } - } - } - - return(success); - -} /* set_up_file_communicator() */ - - -/*****************************************************************************/ -/******************** data array manipulation functions **********************/ -/*****************************************************************************/ - -/***************************************************************************** - * - * Function: addr_to_datum_index() - * - * Purpose: Given the base address of a datum, find and return its index - * in the data array. - * - * Return: Success: index of target datum. - * - * Failure: -1. - * - * Programmer: JRM -- 12/20/05 - * - * Modifications: - * - * None. - * - *****************************************************************************/ - -int -addr_to_datum_index(haddr_t base_addr) -{ - /* const char * fcn_name = "addr_to_datum_index()"; */ - int top = NUM_DATA_ENTRIES - 1; - int bottom = 0; - int middle = (NUM_DATA_ENTRIES - 1) / 2; - int ret_value = -1; - - while ( top >= bottom ) - { - if ( base_addr < data[data_index[middle]].base_addr ) { - - top = middle - 1; - middle = (top + bottom) / 2; - - } else if ( base_addr > data[data_index[middle]].base_addr ) { - - bottom = middle + 1; - middle = (top + bottom) / 2; - - } else /* ( base_addr == data[data_index[middle]].base_addr ) */ { - - ret_value = data_index[middle]; - bottom = top + 1; /* to force exit from while loop */ - - } - } - - return(ret_value); - -} /* addr_to_datum_index() */ - - -/***************************************************************************** - * - * Function: init_data() - * - * Purpose: Initialize the data array, from which cache entries are - * loaded. - * - * Return: Success: TRUE - * - * Failure: FALSE - * - * Programmer: JRM -- 12/20/05 - * - * Modifications: - * - * JRM -- 7/11/06 - * Added support for the local_len field. - * - *****************************************************************************/ - -void -init_data(void) -{ - /* const char * fcn_name = "init_data()"; */ - /* The set of address offsets is chosen so as to avoid allowing the - * base addresses to fall in a pattern of that will annoy the hash - * table, and to give a good range of entry sizes. - * - * At present, I am using the first 20 entries of the Fibonacci - * sequence multiplied by 2. We will see how it works. - */ - const int num_addr_offsets = 20; - const haddr_t addr_offsets[20] = { 2, 2, 4, 6, 10, - 16, 26, 42, 68, 110, - 178, 288, 466, 754, 1220, - 1974, 3194, 5168, 8362, 13539}; - int i; - int j = 0; - haddr_t addr = BASE_ADDR; - - /* this must hold so renames don't change entry size. */ - HDassert( (NUM_DATA_ENTRIES / 2) % 20 == 0 ); - HDassert( (virt_num_data_entries / 2) % 20 == 0 ); - - for ( i = 0; i < NUM_DATA_ENTRIES; i++ ) - { - data[i].base_addr = addr; - data[i].len = (size_t)(addr_offsets[j]); - data[i].local_len = (size_t)(addr_offsets[j]); - data[i].ver = 0; - data[i].dirty = FALSE; - data[i].valid = FALSE; - data[i].locked = FALSE; - data[i].global_pinned = FALSE; - data[i].local_pinned = FALSE; - data[i].index = i; - - data_index[i] = i; - - addr += addr_offsets[j]; - HDassert( addr > data[i].base_addr ); - - j = (j + 1) % num_addr_offsets; - } - - /* save the end of the address space used by the data array */ - max_addr = addr; - - return; - -} /* init_data() */ - - -/*****************************************************************************/ -/******************** test coodination related functions *********************/ -/*****************************************************************************/ - -/***************************************************************************** - * - * Function: do_express_test() - * - * Purpose: Do an MPI_Allreduce to obtain the maximum value returned - * by GetTestExpress() across all processes. Return this - * value. - * - * Envirmoment variables can be different across different - * processes. This function ensures that all processes agree - * on whether to do an express test. - * - * Return: Success: Maximum of the values returned by - * GetTestExpress() across all processes. - * - * Failure: -1 - * - * Programmer: JRM -- 4/25/06 - * - * Modifications: - * - * None. - * - *****************************************************************************/ - -int -do_express_test(void) -{ - const char * fcn_name = "do_express_test()"; - int express_test; - int max_express_test; - int result; - - express_test = GetTestExpress(); - - result = MPI_Allreduce((void *)&express_test, - (void *)&max_express_test, - 1, - MPI_INT, - MPI_MAX, - world_mpi_comm); - - if ( result != MPI_SUCCESS ) { - - nerrors++; - max_express_test = -1; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: MPI_Allreduce() failed.\n", - world_mpi_rank, fcn_name ); - } - } - - return(max_express_test); - -} /* do_express_test() */ - - -/***************************************************************************** - * - * Function: do_sync() - * - * Purpose: Ensure that all messages sent by this process have been - * processed before proceeding. - * - * Do this by exchanging sync req / sync ack messages with - * the server. - * - * Do nothing if nerrors is greater than zero. - * - * Return: void - * - * Programmer: JRM -- 5/10/06 - * - * Modifications: - * - * None. - * - *****************************************************************************/ - -void -do_sync(void) -{ - const char * fcn_name = "do_sync()"; - - struct mssg_t mssg; - - if ( nerrors <= 0 ) { - - /* compose the message */ - mssg.req = SYNC_REQ_CODE; - mssg.src = world_mpi_rank; - mssg.dest = world_server_mpi_rank; - mssg.mssg_num = -1; /* set by send function */ - mssg.base_addr = 0; - mssg.len = 0; - mssg.ver = 0; - mssg.magic = MSSG_MAGIC; - - if ( ! send_mssg(&mssg, FALSE) ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: send_mssg() failed.\n", - world_mpi_rank, fcn_name); - } - } - } - - if ( nerrors <= 0 ) { - - if ( ! recv_mssg(&mssg, SYNC_ACK_CODE) ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: recv_mssg() failed.\n", - world_mpi_rank, fcn_name); - } - } else if ( ( mssg.req != SYNC_ACK_CODE ) || - ( mssg.src != world_server_mpi_rank ) || - ( mssg.dest != world_mpi_rank ) || - ( mssg.magic != MSSG_MAGIC ) ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: Bad data in sync ack.\n", - world_mpi_rank, fcn_name); - } - } - } - - return; - -} /* do_sync() */ - - -/***************************************************************************** - * - * Function: get_max_nerrors() - * - * Purpose: Do an MPI_Allreduce to obtain the maximum value of nerrors - * across all processes. Return this value. - * - * Return: Success: Maximum of the nerrors global variables across - * all processes. - * - * Failure: -1 - * - * Programmer: JRM -- 1/3/06 - * - * Modifications: - * - * None. - * - *****************************************************************************/ - -int -get_max_nerrors(void) -{ - const char * fcn_name = "get_max_nerrors()"; - int max_nerrors; - int result; - - result = MPI_Allreduce((void *)&nerrors, - (void *)&max_nerrors, - 1, - MPI_INT, - MPI_MAX, - world_mpi_comm); - - if ( result != MPI_SUCCESS ) { - - nerrors++; - max_nerrors = -1; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: MPI_Allreduce() failed.\n", - world_mpi_rank, fcn_name ); - } - } - - return(max_nerrors); - -} /* get_max_nerrors() */ - - -/*****************************************************************************/ -/************************ mssg xfer related functions ************************/ -/*****************************************************************************/ - -/***************************************************************************** - * - * Function: recv_mssg() - * - * Purpose: Receive a message from any process in the provided instance - * of struct mssg. - * - * Return: Success: TRUE - * - * Failure: FALSE - * - * Programmer: JRM -- 12/22/05 - * - * Modifications: - * - * JRM -- 5/10/06 - * Added mssg_tag_offset parameter and supporting code. - * - *****************************************************************************/ - -#define CACHE_TEST_TAG 99 /* different from any used by the library */ - -hbool_t -recv_mssg(struct mssg_t *mssg_ptr, - int mssg_tag_offset) -{ - const char * fcn_name = "recv_mssg()"; - hbool_t success = TRUE; - int mssg_tag = CACHE_TEST_TAG; - int result; - MPI_Status status; - - if ( ( mssg_ptr == NULL ) || - ( mssg_tag_offset < 0 ) || - ( mssg_tag_offset> MAX_REQ_CODE ) ) { - - nerrors++; - success = FALSE; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: bad param(s) on entry.\n", - world_mpi_rank, fcn_name); - } - } else { - - mssg_tag += mssg_tag_offset; - } - - if ( success ) { - - result = MPI_Recv((void *)mssg_ptr, 1, mpi_mssg_t, MPI_ANY_SOURCE, - mssg_tag, world_mpi_comm, &status); - - if ( result != MPI_SUCCESS ) { - - nerrors++; - success = FALSE; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: MPI_Recv() failed.\n", - world_mpi_rank, fcn_name ); - } - } else if ( mssg_ptr->magic != MSSG_MAGIC ) { - - nerrors++; - success = FALSE; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: invalid magic.\n", world_mpi_rank, - fcn_name); - } - } else if ( mssg_ptr->src != status.MPI_SOURCE ) { - - nerrors++; - success = FALSE; - if ( verbose ) { - HDfprintf(stdout, - "%d:%s: mssg_ptr->src != status.MPI_SOURCE.\n", - world_mpi_rank, fcn_name); - } - } - } - - return(success); - -} /* recv_mssg() */ - - -/***************************************************************************** - * - * Function: send_mssg() - * - * Purpose: Send the provided instance of mssg to the indicated target. - * - * Note that all source and destination ranks are in the - * global communicator. - * - * Return: Success: TRUE - * - * Failure: FALSE - * - * Programmer: JRM -- 12/22/05 - * - * Modifications: - * - * JRM -- 5/10/06 - * Added the add_req_to_tag parameter and supporting code. - * - *****************************************************************************/ - -hbool_t -send_mssg(struct mssg_t *mssg_ptr, - hbool_t add_req_to_tag) -{ - const char * fcn_name = "send_mssg()"; - hbool_t success = TRUE; - int mssg_tag = CACHE_TEST_TAG; - int result; - static long mssg_num = 0; - - if ( ( mssg_ptr == NULL ) || - ( mssg_ptr->src != world_mpi_rank ) || - ( mssg_ptr->dest < 0 ) || - ( mssg_ptr->dest == mssg_ptr->src ) || - ( mssg_ptr->dest >= world_mpi_size ) || - ( mssg_ptr->req < 0 ) || - ( mssg_ptr->req > MAX_REQ_CODE ) || - ( mssg_ptr->magic != MSSG_MAGIC ) ) { - - nerrors++; - success = FALSE; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: Invalid mssg on entry.\n", - world_mpi_rank, fcn_name); - } - } - - if ( success ) { - - mssg_ptr->mssg_num = mssg_num++; - - if ( add_req_to_tag ) { - - mssg_tag += mssg_ptr->req; - } - - result = MPI_Send((void *)mssg_ptr, 1, mpi_mssg_t, - mssg_ptr->dest, mssg_tag, world_mpi_comm); - - if ( result != MPI_SUCCESS ) { - - nerrors++; - success = FALSE; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: MPI_Send() failed.\n", - world_mpi_rank, fcn_name); - } - } - } - - return(success); - -} /* send_mssg() */ - - -/***************************************************************************** - * - * Function: setup_derived_types() - * - * Purpose: Set up the derived types used by the test bed. At present, - * only the mpi_mssg derived type is needed. - * - * Return: Success: TRUE - * - * Failure: FALSE - * - * Programmer: JRM -- 12/22/05 - * - * Modifications: - * - * None. - * - *****************************************************************************/ - -hbool_t -setup_derived_types(void) -{ - const char * fcn_name = "setup_derived_types()"; - hbool_t success = TRUE; - int i; - int result; - MPI_Datatype mpi_types[8] = {MPI_INT, MPI_INT, MPI_INT, MPI_LONG, - HADDR_AS_MPI_TYPE, MPI_INT, MPI_INT, - MPI_UNSIGNED}; - int block_len[8] = {1, 1, 1, 1, 1, 1, 1, 1}; - MPI_Aint displs[8]; - struct mssg_t sample; /* used to compute displacements */ - - /* setup the displacements array */ - if ( ( MPI_SUCCESS != MPI_Address(&sample.req, &displs[0]) ) || - ( MPI_SUCCESS != MPI_Address(&sample.src, &displs[1]) ) || - ( MPI_SUCCESS != MPI_Address(&sample.dest, &displs[2]) ) || - ( MPI_SUCCESS != MPI_Address(&sample.mssg_num, &displs[3]) ) || - ( MPI_SUCCESS != MPI_Address(&sample.base_addr, &displs[4]) ) || - ( MPI_SUCCESS != MPI_Address(&sample.len, &displs[5]) ) || - ( MPI_SUCCESS != MPI_Address(&sample.ver, &displs[6]) ) || - ( MPI_SUCCESS != MPI_Address(&sample.magic, &displs[7]) ) ) { - - nerrors++; - success = FALSE; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: MPI_Address() call failed.\n", - world_mpi_rank, fcn_name); - } - - } else { - - /* Now calculate the actual displacements */ - for ( i = 7; i >= 0; --i) - { - displs[i] -= displs[0]; - } - } - - if ( success ) { - - result = MPI_Type_struct(8, block_len, displs, mpi_types, &mpi_mssg_t); - - if ( result != MPI_SUCCESS ) { - - nerrors++; - success = FALSE; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: MPI_Type_struct() call failed.\n", - world_mpi_rank, fcn_name); - } - } - } - - if ( success ) { - - result = MPI_Type_commit(&mpi_mssg_t); - - if ( result != MPI_SUCCESS) { - - nerrors++; - success = FALSE; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: MPI_Type_commit() call failed.\n", - world_mpi_rank, fcn_name); - } - } - } - - return(success); - -} /* setup_derived_types */ - - -/***************************************************************************** - * - * Function: takedown_derived_types() - * - * Purpose: take down the derived types used by the test bed. At present, - * only the mpi_mssg derived type is needed. - * - * Return: Success: TRUE - * - * Failure: FALSE - * - * Programmer: JRM -- 12/22/05 - * - * Modifications: - * - * None. - * - *****************************************************************************/ - -hbool_t -takedown_derived_types(void) -{ - const char * fcn_name = "takedown_derived_types()"; - hbool_t success = TRUE; - int result; - - result = MPI_Type_free(&mpi_mssg_t); - - if ( result != MPI_SUCCESS ) { - - nerrors++; - success = FALSE; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: MPI_Type_free() call failed.\n", - world_mpi_rank, fcn_name); - } - } - - return(success); - -} /* takedown_derived_types() */ - - -/*****************************************************************************/ -/***************************** server functions ******************************/ -/*****************************************************************************/ - -/***************************************************************************** - * - * Function: server_main() - * - * Purpose: Main function for the server process. This process exists - * to provide an independant view of the data array. - * - * The function handles request from the other processes in - * the test until the count of done messages received equals - * the number of client processes. - * - * Return: Success: TRUE - * - * Failure: FALSE - * - * Programmer: JRM -- 12/22/05 - * - * Modifications: - * - * JRM -- 5/10/06 - * Updated for sync message. - * - *****************************************************************************/ - -hbool_t -server_main(void) -{ - const char * fcn_name = "server_main()"; - hbool_t done = FALSE; - hbool_t success = TRUE; - int done_count = 0; - struct mssg_t mssg; - - if ( world_mpi_rank != world_server_mpi_rank ) { - - nerrors++; - success = FALSE; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: This isn't the server process?!?!?\n", - world_mpi_rank, fcn_name); - } - } - - - while ( ( success ) && ( ! done ) ) - { - success = recv_mssg(&mssg, 0); - - if ( success ) { - - switch ( mssg.req ) - { - case WRITE_REQ_CODE: - success = serve_write_request(&mssg); - break; - - case WRITE_REQ_ACK_CODE: - success = FALSE; - HDfprintf(stdout, "%s: Received write ack?!?.\n", fcn_name); - break; - - case READ_REQ_CODE: - success = serve_read_request(&mssg); - break; - - case READ_REQ_REPLY_CODE: - success = FALSE; - HDfprintf(stdout, "%s: Received read req reply?!?.\n", - fcn_name); - break; - - case SYNC_REQ_CODE: - success = serve_sync_request(&mssg); - break; - - case SYNC_ACK_CODE: - success = FALSE; - HDfprintf(stdout, "%s: Received sync ack?!?.\n", - fcn_name); - break; - - case DONE_REQ_CODE: - done_count++; - /* HDfprintf(stdout, "%d:%s: done_count = %d.\n", - world_mpi_rank, fcn_name, done_count); */ - if ( done_count >= file_mpi_size ) { - - done = TRUE; - } - break; - - default: - nerrors++; - success = FALSE; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: Unknown request code.\n", - world_mpi_rank, fcn_name); - } - break; - } - } - } - - return(success); - -} /* server_main() */ - - -/***************************************************************************** - * - * Function: serve_read_request() - * - * Purpose: Serve a read request. - * - * The function accepts a pointer to an instance of struct - * mssg_t as input. If all sanity checks pass, it sends - * a copy of the indicated datum from the data array to - * the requesting process. - * - * Return: Success: TRUE - * - * Failure: FALSE - * - * Programmer: JRM -- 12/22/05 - * - * Modifications: - * - * None. - * - *****************************************************************************/ - -hbool_t -serve_read_request(struct mssg_t * mssg_ptr) -{ - const char * fcn_name = "serve_read_request()"; - hbool_t success = TRUE; - int target_index; - haddr_t target_addr; - struct mssg_t reply; - - if ( ( mssg_ptr == NULL ) || - ( mssg_ptr->req != READ_REQ_CODE ) || - ( mssg_ptr->magic != MSSG_MAGIC ) ) { - - nerrors++; - success = FALSE; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: Bad mssg on entry.\n", - world_mpi_rank, fcn_name); - } - } - - if ( success ) { - - target_addr = mssg_ptr->base_addr; - target_index = addr_to_datum_index(target_addr); - - if ( target_index < 0 ) { - - nerrors++; - success = FALSE; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: addr lookup failed for %a.\n", - world_mpi_rank, fcn_name, target_addr); - } - } else if ( data[target_index].len != mssg_ptr->len ) { - - nerrors++; - success = FALSE; - if ( verbose ) { - HDfprintf(stdout, - "%d:%s: data[i].len = %Zu != mssg->len = %d.\n", - world_mpi_rank, fcn_name, - data[target_index].len, mssg_ptr->len); - } - } else if ( ! (data[target_index].valid) ) { - - nerrors++; - success = FALSE; - if ( verbose ) { - HDfprintf(stdout, - "%d:%s: proc %d read invalid entry. idx/base_addr = %d/%a.\n", - world_mpi_rank, fcn_name, - mssg_ptr->src, - target_index, - data[target_index].base_addr); - } - } else { - - /* compose the reply message */ - reply.req = READ_REQ_REPLY_CODE; - reply.src = world_mpi_rank; - reply.dest = mssg_ptr->src; - reply.mssg_num = -1; /* set by send function */ - reply.base_addr = data[target_index].base_addr; - reply.len = data[target_index].len; - reply.ver = data[target_index].ver; - reply.magic = MSSG_MAGIC; - } - } - - if ( success ) { - - success = send_mssg(&reply, TRUE); - } - - return(success); - -} /* serve_read_request() */ - - -/***************************************************************************** - * - * Function: serve_sync_request() - * - * Purpose: Serve a sync request. - * - * The function accepts a pointer to an instance of struct - * mssg_t as input. If all sanity checks pass, it sends a - * sync ack to the requesting process. - * - * This service exist to allow the sending process to ensure - * that all previous messages have been processed before - * proceeding. - * - * Return: Success: TRUE - * - * Failure: FALSE - * - * Programmer: JRM -- 5/10/06 - * - * Modifications: - * - * None. - * - *****************************************************************************/ - -hbool_t -serve_sync_request(struct mssg_t * mssg_ptr) -{ - const char * fcn_name = "serve_sync_request()"; - hbool_t success = TRUE; - struct mssg_t reply; - - if ( ( mssg_ptr == NULL ) || - ( mssg_ptr->req != SYNC_REQ_CODE ) || - ( mssg_ptr->magic != MSSG_MAGIC ) ) { - - nerrors++; - success = FALSE; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: Bad mssg on entry.\n", - world_mpi_rank, fcn_name); - } - } - - if ( success ) { - - /* compose the reply message */ - reply.req = SYNC_ACK_CODE; - reply.src = world_mpi_rank; - reply.dest = mssg_ptr->src; - reply.mssg_num = -1; /* set by send function */ - reply.base_addr = 0; - reply.len = 0; - reply.ver = 0; - reply.magic = MSSG_MAGIC; - } - - if ( success ) { - - success = send_mssg(&reply, TRUE); - } - - return(success); - -} /* serve_sync_request() */ - - -/***************************************************************************** - * - * Function: serve_write_request() - * - * Purpose: Serve a write request. - * - * The function accepts a pointer to an instance of struct - * mssg_t as input. If all sanity checks pass, it updates - * the version number of the target data array entry as - * specified in the message. - * - * Return: Success: TRUE - * - * Failure: FALSE - * - * Programmer: JRM -- 12/21/05 - * - * Modifications: - * - * JRM -- 5/9/06 - * Added code supporting a write ack message. This is a - * speculative fix to a bug observed on Cobalt. If it - * doesn't work, it will help narrow down the possibilities. - * - *****************************************************************************/ - -hbool_t -serve_write_request(struct mssg_t * mssg_ptr) -{ - const char * fcn_name = "serve_write_request()"; - hbool_t success = TRUE; - int target_index; - int new_ver_num; - haddr_t target_addr; -#if DO_WRITE_REQ_ACK - struct mssg_t reply; -#endif /* DO_WRITE_REQ_ACK */ - - if ( ( mssg_ptr == NULL ) || - ( mssg_ptr->req != WRITE_REQ_CODE ) || - ( mssg_ptr->magic != MSSG_MAGIC ) ) { - - nerrors++; - success = FALSE; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: Bad mssg on entry.\n", - world_mpi_rank, fcn_name); - } - } - - if ( success ) { - - target_addr = mssg_ptr->base_addr; - target_index = addr_to_datum_index(target_addr); - - if ( target_index < 0 ) { - - nerrors++; - success = FALSE; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: addr lookup failed for %a.\n", - world_mpi_rank, fcn_name, target_addr); - } - } else if ( data[target_index].len != mssg_ptr->len ) { - - nerrors++; - success = FALSE; - if ( verbose ) { - HDfprintf(stdout, - "%d:%s: data[i].len = %Zu != mssg->len = %d.\n", - world_mpi_rank, fcn_name, - data[target_index].len, mssg_ptr->len); - } - } - } - - if ( success ) { - - new_ver_num = mssg_ptr->ver; - - if ( new_ver_num <= data[target_index].ver ) { - - nerrors++; - success = FALSE; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: new ver = %d <= old ver = %d.\n", - world_mpi_rank, fcn_name, - new_ver_num, data[target_index].ver); - } - } - } - - if ( success ) { - - /* process the write */ - data[target_index].ver = new_ver_num; - data[target_index].valid = TRUE; - -#if DO_WRITE_REQ_ACK - - /* compose the reply message */ - reply.req = WRITE_REQ_ACK_CODE; - reply.src = world_mpi_rank; - reply.dest = mssg_ptr->src; - reply.mssg_num = -1; /* set by send function */ - reply.base_addr = data[target_index].base_addr; - reply.len = data[target_index].len; - reply.ver = data[target_index].ver; - reply.magic = MSSG_MAGIC; - - /* and send it */ - success = send_mssg(&reply, TRUE); - -#endif /* DO_WRITE_REQ_ACK */ - - } - - return(success); - -} /* serve_write_request() */ - - -/*****************************************************************************/ -/**************************** Call back functions ****************************/ -/*****************************************************************************/ - -/*------------------------------------------------------------------------- - * Function: datum_clear_dirty_bits - * - * Purpose: Clear the dirty bits of the target entry. - * - * Return: SUCCEED - * - * Programmer: John Mainzer - * 10/30/07 - * - * Modifications: - * - * None - * - *------------------------------------------------------------------------- - */ - -herr_t -datum_clear_dirty_bits(UNUSED haddr_t addr, - UNUSED size_t len, - void * thing) -{ - int idx; - struct datum * entry_ptr; - - HDassert( thing ); - - entry_ptr = (struct datum *)thing; - - idx = addr_to_datum_index(entry_ptr->base_addr); - - if ( callbacks_verbose ) { - - HDfprintf(stdout, - "%d: clear_dirty_bits() idx = %d, addr = %ld, len = %d.\n", - world_mpi_rank, idx, (long)addr, (int)len); - fflush(stdout); - } - - HDassert( idx >= 0 ); - HDassert( idx < NUM_DATA_ENTRIES ); - HDassert( idx < virt_num_data_entries ); - HDassert( &(data[idx]) == entry_ptr ); - - HDassert( entry_ptr->header.addr == entry_ptr->base_addr ); - HDassert( ( entry_ptr->header.size == entry_ptr->len ) || - ( entry_ptr->header.size == entry_ptr->local_len ) ); - - entry_ptr->dirty = FALSE; - - datum_clears++; - - if ( entry_ptr->header.is_pinned ) { - - datum_pinned_clears++; - HDassert( entry_ptr->global_pinned || entry_ptr->local_pinned ); - } - - return(SUCCEED); - -} /* datum_clear_dirty_bits() */ - - -/*------------------------------------------------------------------------- - * Function: datum_deserialize - * - * Purpose: deserialize the entry. - * - * Return: void * (pointer to the in core representation of the entry) - * - * Programmer: John Mainzer - * 9/20/07 - * - * Modifications: - * - * None - * - *------------------------------------------------------------------------- - */ - -void * -datum_deserialize(haddr_t addr, - UNUSED size_t len, - const void * image_ptr, - const UNUSED void * udata_ptr, - hbool_t * dirty_ptr) -{ - const char * fcn_name = "load_datum()"; - hbool_t success = TRUE; - int idx; - struct datum * entry_ptr = NULL; - struct mssg_t mssg; - - HDassert( image_ptr != NULL ); - - idx = addr_to_datum_index(addr); - - HDassert( idx >= 0 ); - HDassert( idx < NUM_DATA_ENTRIES ); - HDassert( idx < virt_num_data_entries ); - - entry_ptr = &(data[idx]); - - HDassert( addr == entry_ptr->base_addr ); - HDassert( ! entry_ptr->global_pinned ); - HDassert( ! entry_ptr->local_pinned ); - - if ( callbacks_verbose ) { - - HDfprintf(stdout, - "%d: deserialize() idx = %d, addr = %ld, len = %d, is_dirty = %d.\n", - world_mpi_rank, idx, (long)addr, (int)len, - (int)(entry_ptr->header.is_dirty)); - fflush(stdout); - } - - /* compose the read message */ - mssg.req = READ_REQ_CODE; - mssg.src = world_mpi_rank; - mssg.dest = world_server_mpi_rank; - mssg.mssg_num = -1; /* set by send function */ - mssg.base_addr = entry_ptr->base_addr; - mssg.len = entry_ptr->len; - mssg.ver = 0; /* bogus -- should be corrected by server */ - mssg.magic = MSSG_MAGIC; - - if ( ! send_mssg(&mssg, FALSE) ) { - - nerrors++; - success = FALSE; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: send_mssg() failed.\n", - world_mpi_rank, fcn_name); - } - } - - if ( success ) { - - if ( ! recv_mssg(&mssg, READ_REQ_REPLY_CODE) ) { - - nerrors++; - success = FALSE; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: recv_mssg() failed.\n", - world_mpi_rank, fcn_name); - } - } - } - - if ( success ) { - - if ( ( mssg.req != READ_REQ_REPLY_CODE ) || - ( mssg.src != world_server_mpi_rank ) || - ( mssg.dest != world_mpi_rank ) || - ( mssg.base_addr != entry_ptr->base_addr ) || - ( mssg.len != entry_ptr->len ) || - ( mssg.ver < entry_ptr->ver ) || - ( mssg.magic != MSSG_MAGIC ) ) { - - nerrors++; - success = FALSE; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: Bad data in read req reply.\n", - world_mpi_rank, fcn_name); - } -#if 0 /* This has been useful debugging code -- keep it for now. */ - if ( mssg.req != READ_REQ_REPLY_CODE ) { - - HDfprintf(stdout, "%d:%s: mssg.req != READ_REQ_REPLY_CODE.\n", - world_mpi_rank, fcn_name); - HDfprintf(stdout, "%d:%s: mssg.req = %d.\n", - world_mpi_rank, fcn_name, (int)(mssg.req)); - } - - if ( mssg.src != world_server_mpi_rank ) { - - HDfprintf(stdout, "%d:%s: mssg.src != world_server_mpi_rank.\n", - world_mpi_rank, fcn_name); - } - - if ( mssg.dest != world_mpi_rank ) { - - HDfprintf(stdout, "%d:%s: mssg.dest != world_mpi_rank.\n", - world_mpi_rank, fcn_name); - } - - if ( mssg.base_addr != entry_ptr->base_addr ) { - - HDfprintf(stdout, - "%d:%s: mssg.base_addr != entry_ptr->base_addr.\n", - world_mpi_rank, fcn_name); - HDfprintf(stdout, "%d:%s: mssg.base_addr = %a.\n", - world_mpi_rank, fcn_name, mssg.base_addr); - HDfprintf(stdout, "%d:%s: entry_ptr->base_addr = %a.\n", - world_mpi_rank, fcn_name, entry_ptr->base_addr); - } - - if ( mssg.len != entry_ptr->len ) { - - HDfprintf(stdout, "%d:%s: mssg.len != entry_ptr->len.\n", - world_mpi_rank, fcn_name); - HDfprintf(stdout, "%d:%s: mssg.len = %a.\n", - world_mpi_rank, fcn_name, mssg.len); - } - - if ( mssg.ver < entry_ptr->ver ) { - - HDfprintf(stdout, "%d:%s: mssg.ver < entry_ptr->ver.\n", - world_mpi_rank, fcn_name); - } - - if ( mssg.magic != MSSG_MAGIC ) { - - HDfprintf(stdout, "%d:%s: mssg.magic != MSSG_MAGIC.\n", - world_mpi_rank, fcn_name); - } -#endif /* JRM */ - } else { - - entry_ptr->ver = mssg.ver; - entry_ptr->dirty = FALSE; - *dirty_ptr = FALSE; - } - } - - if ( ! success ) { - - entry_ptr = NULL; - - } - - datum_loads++; - - return(entry_ptr); - -} /* deserialize() */ - - -/*------------------------------------------------------------------------- - * Function: datum_image_len - * - * Purpose: Return the real (and possibly reduced) length of the image. - * The helper functions verify that the correct version of - * deserialize is being called, and then call deserialize - * proper. - * - * Return: SUCCEED - * - * Programmer: John Mainzer - * 9/19/07 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -herr_t -datum_image_len(void *thing, - size_t *image_len_ptr) -{ - - - int idx; - struct datum * entry_ptr; - - HDassert( thing ); - HDassert( image_len_ptr ); - - entry_ptr = (struct datum *)thing; - - idx = addr_to_datum_index(entry_ptr->base_addr); - - HDassert( idx >= 0 ); - HDassert( idx < NUM_DATA_ENTRIES ); - HDassert( idx < virt_num_data_entries ); - HDassert( &(data[idx]) == entry_ptr ); - HDassert( entry_ptr->local_len > 0 ); - HDassert( entry_ptr->local_len <= entry_ptr->len ); - - if ( callbacks_verbose ) { - - HDfprintf(stdout, - "%d: image_len() idx = %d, addr = %ld, len = %d.\n", - world_mpi_rank, idx, (long)(entry_ptr->base_addr), - (int)(entry_ptr->local_len)); - fflush(stdout); - } - - HDassert( entry_ptr->header.addr == entry_ptr->base_addr ); - - *image_len_ptr = entry_ptr->local_len; - - return(SUCCEED); - -} /* datum_image_len() */ - - -/*------------------------------------------------------------------------- - * Function: datum_serialize - * - * Purpose: Serialize the supplied entry. - * - * Return: SUCCEED if successful, FAIL otherwise. - * - * Programmer: John Mainzer - * 10/30/07 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -herr_t -datum_serialize(const H5F_t UNUSED *f, - hid_t UNUSED dxpl_id, - haddr_t UNUSED addr, - size_t UNUSED len, - void * image_ptr, - void * thing, - unsigned * flags_ptr, - haddr_t * new_addr_ptr, - size_t * new_len_ptr, - void ** new_image_ptr_ptr) -{ - - const char * fcn_name = "datum_serialize()"; - herr_t ret_value = SUCCEED; - int idx; - struct datum * entry_ptr; - struct mssg_t mssg; - - HDassert( thing ); - HDassert( image_ptr ); - HDassert( flags_ptr ); - - *flags_ptr = 0; - - HDassert( new_addr_ptr ); - HDassert( new_len_ptr ); - HDassert( new_image_ptr_ptr ); - - entry_ptr = (struct datum *)thing; - - idx = addr_to_datum_index(entry_ptr->base_addr); - - HDassert( idx >= 0 ); - HDassert( idx < NUM_DATA_ENTRIES ); - HDassert( idx < virt_num_data_entries ); - HDassert( &(data[idx]) == entry_ptr ); - - if ( callbacks_verbose ) { - - HDfprintf(stdout, - "%d: serialize() idx = %d, addr = %ld, len = %d.\n", - world_mpi_rank, idx, (long)addr, (int)len); - fflush(stdout); - } - - HDassert( entry_ptr->header.addr == entry_ptr->base_addr ); - HDassert( ( entry_ptr->header.size == entry_ptr->len ) || - ( entry_ptr->header.size == entry_ptr->local_len ) ); - - HDassert( entry_ptr->header.is_dirty == entry_ptr->dirty ); - - if ( ( file_mpi_rank != 0 ) && ( entry_ptr->dirty ) ) { - - ret_value = FAIL; - HDfprintf(stdout, - "%d:%s: Flushed dirty entry from non-zero file process.", - world_mpi_rank, fcn_name); - } - - if ( ret_value == SUCCEED ) { - - if ( entry_ptr->header.is_dirty ) { - - /* compose the message */ - mssg.req = WRITE_REQ_CODE; - mssg.src = world_mpi_rank; - mssg.dest = world_server_mpi_rank; - mssg.mssg_num = -1; /* set by send function */ - mssg.base_addr = entry_ptr->base_addr; - mssg.len = entry_ptr->len; - mssg.ver = entry_ptr->ver; - mssg.magic = MSSG_MAGIC; - - if ( ! send_mssg(&mssg, FALSE) ) { - - nerrors++; - ret_value = FAIL; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: send_mssg() failed.\n", - world_mpi_rank, fcn_name); - } - } - else - { - entry_ptr->header.is_dirty = FALSE; - entry_ptr->dirty = FALSE; - } - } - } - -#if DO_WRITE_REQ_ACK - - if ( ( ret_value == SUCCEED ) && ( entry_ptr->header.is_dirty ) ) { - - if ( ! recv_mssg(&mssg, WRITE_REQ_ACK_CODE) ) { - - nerrors++; - ret_value = FAIL; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: recv_mssg() failed.\n", - world_mpi_rank, fcn_name); - } - } else if ( ( mssg.req != WRITE_REQ_ACK_CODE ) || - ( mssg.src != world_server_mpi_rank ) || - ( mssg.dest != world_mpi_rank ) || - ( mssg.base_addr != entry_ptr->base_addr ) || - ( mssg.len != entry_ptr->len ) || - ( mssg.ver != entry_ptr->ver ) || - ( mssg.magic != MSSG_MAGIC ) ) { - - nerrors++; - ret_value = FAIL; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: Bad data in write req ack.\n", - world_mpi_rank, fcn_name); - } - } - } - -#endif /* DO_WRITE_REQ_ACK */ - - datum_flushes++; - - if ( entry_ptr->header.is_pinned ) { - - datum_pinned_flushes++; - HDassert( entry_ptr->global_pinned || entry_ptr->local_pinned ); - } - - return(ret_value); - -} /* datum_serialize() */ - - -/*------------------------------------------------------------------------- - * Function: datum_free_icr - * - * Purpose: Nominally, this callback is supposed to free the - * in core representation of the entry. - * - * In the context of this test bed, we use it to do - * do all the processing we used to do on a destroy. - * - * Return: SUCCEED - * - * Programmer: John Mainzer - * 9/19/07 - * - * Modifications: - * - * None. - * - *------------------------------------------------------------------------- - */ - -herr_t -datum_free_icr(UNUSED haddr_t addr, - UNUSED size_t len, - void * thing) -{ - int idx; - struct datum * entry_ptr; - - HDassert( thing ); - - entry_ptr = (struct datum *)thing; - - idx = addr_to_datum_index(entry_ptr->base_addr); - - HDassert( idx >= 0 ); - HDassert( idx < NUM_DATA_ENTRIES ); - HDassert( idx < virt_num_data_entries ); - HDassert( &(data[idx]) == entry_ptr ); - - if ( callbacks_verbose ) { - - HDfprintf(stdout, - "%d: free_icr() idx = %d, addr = %ld, len = %d, dirty = %d.\n", - world_mpi_rank, idx, (long)addr, (int)len, - (int)(entry_ptr->dirty)); - fflush(stdout); - } - - HDassert( entry_ptr->header.addr == entry_ptr->base_addr ); - HDassert( ( entry_ptr->header.size == entry_ptr->len ) || - ( entry_ptr->header.size == entry_ptr->local_len ) ); - - HDassert( !(entry_ptr->dirty) ); - HDassert( !(entry_ptr->header.is_dirty) ); - HDassert( !(entry_ptr->global_pinned) ); - HDassert( !(entry_ptr->local_pinned) ); - HDassert( !(entry_ptr->header.is_pinned) ); - - datum_destroys++; - - return(SUCCEED); - -} /* datum_free_icr() */ - - -/*****************************************************************************/ -/************************** test utility functions ***************************/ -/*****************************************************************************/ - -/***************************************************************************** - * Function: expunge_entry() - * - * Purpose: Expunge the entry indicated by the type and index, mark it - * as clean, and don't increment its version number. - * - * Do nothing if nerrors is non-zero on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 07/11/06 - * - * Modifications: - * - * None. - * - *****************************************************************************/ - -void -expunge_entry(H5C2_t * cache_ptr, - H5F_t * file_ptr, - int32_t idx) -{ - const char * fcn_name = "expunge_entry()"; - hbool_t in_cache; - herr_t result; - struct datum * entry_ptr; - - HDassert( cache_ptr ); - HDassert( file_ptr ); - HDassert( ( 0 <= idx ) && ( idx < NUM_DATA_ENTRIES ) ); - HDassert( idx < virt_num_data_entries ); - - entry_ptr = &(data[idx]); - - HDassert( !(entry_ptr->locked) ); - HDassert( !(entry_ptr->global_pinned) ); - HDassert( !(entry_ptr->local_pinned) ); - - entry_ptr->dirty = FALSE; - - if ( nerrors == 0 ) { - - result = H5AC2_expunge_entry(file_ptr, -1, &(types[0]), - entry_ptr->header.addr); - - if ( result < 0 ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: Error in H5AC2_expunge_entry().\n", - world_mpi_rank, fcn_name); - } - } - - HDassert( ((entry_ptr->header).type)->id == DATUM_ENTRY_TYPE ); - HDassert( ! ((entry_ptr->header).is_dirty) ); - - result = H5C2_get_entry_status(file_ptr, entry_ptr->base_addr, - NULL, &in_cache, NULL, NULL, NULL); - - if ( result < 0 ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: Error in H5C2_get_entry_status().\n", - world_mpi_rank, fcn_name); - } - } else if ( in_cache ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: Expunged entry still in cache?!?\n", - world_mpi_rank, fcn_name); - } - } - } - - return; - -} /* expunge_entry() */ - - -/***************************************************************************** - * Function: insert_entry() - * - * Purpose: Insert the entry indicated by the type and index, mark it - * as dirty, and increment its version number. - * - * Do nothing if nerrors is non-zero on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 01/04/06 - * - * Modifications: - * - * JRM -- 8/11/06 - * Updated code to reflect the fact that entries can now be - * inserted pinned. Note that since all inserts are dirty, - * any pins must be global pins. - * - *****************************************************************************/ - -void -insert_entry(H5C2_t * cache_ptr, - H5F_t * file_ptr, - int32_t idx, - unsigned int flags) -{ - const char * fcn_name = "insert_entry()"; - hbool_t insert_pinned; - herr_t result; - struct datum * entry_ptr; - - HDassert( cache_ptr ); - HDassert( file_ptr ); - HDassert( ( 0 <= idx ) && ( idx < NUM_DATA_ENTRIES ) ); - HDassert( idx < virt_num_data_entries ); - - entry_ptr = &(data[idx]); - - HDassert( !(entry_ptr->locked) ); - - insert_pinned = ((flags & H5C2__PIN_ENTRY_FLAG) != 0 ); - - if ( nerrors == 0 ) { - - (entry_ptr->ver)++; - entry_ptr->dirty = TRUE; - - result = H5AC2_set(file_ptr, H5P_DATASET_XFER_DEFAULT, &(types[0]), - entry_ptr->base_addr, entry_ptr->local_len, - (void *)(&(entry_ptr->header)), flags); - - if ( ( result < 0 ) || - ( entry_ptr->header.type != &(types[0]) ) || - ( entry_ptr->len != entry_ptr->header.size ) || - ( entry_ptr->base_addr != entry_ptr->header.addr ) ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: Error in H5AC2_set().\n", - world_mpi_rank, fcn_name); - } - } - - if ( ! (entry_ptr->header.is_dirty) ) { - - /* it is possible that we just exceeded the dirty bytes - * threshold, triggering a write of the newly inserted - * entry. Test for this, and only flag an error if this - * is not the case. - */ - - struct H5AC2_aux_t * aux_ptr; - - aux_ptr = ((H5AC2_aux_t *)(cache_ptr->aux_ptr)); - - if ( ! ( ( aux_ptr != NULL ) && - ( aux_ptr->magic == H5AC2__H5AC2_AUX_T_MAGIC ) && - ( aux_ptr->dirty_bytes == 0 ) ) ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: data[%d].header.is_dirty = %d.\n", - world_mpi_rank, fcn_name, idx, - (int)(data[idx].header.is_dirty)); - } - } - } - - if ( insert_pinned ) { - - HDassert( entry_ptr->header.is_pinned ); - entry_ptr->global_pinned = TRUE; - global_pins++; - - } else { - - HDassert( ! ( entry_ptr->header.is_pinned ) ); - entry_ptr->global_pinned = FALSE; - - } - - /* HDassert( entry_ptr->header.is_dirty ); */ - HDassert( ((entry_ptr->header).type)->id == DATUM_ENTRY_TYPE ); - } - - return; - -} /* insert_entry() */ - - -/***************************************************************************** - * Function: local_pin_and_unpin_random_entries() - * - * Purpose: Pin a random number of randomly selected entries in cache, and - * then unpin a random number of entries. - * - * Do nothing if nerrors is non-zero on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 4/12/06 - * - * Modifications: - * - *****************************************************************************/ - -void -local_pin_and_unpin_random_entries(H5C2_t * cache_ptr, - H5F_t * file_ptr, - int min_idx, - int max_idx, - int min_count, - int max_count) -{ - /* const char * fcn_name = "local_pin_and_unpin_random_entries()"; */ - - if ( nerrors == 0 ) { - - hbool_t via_unprotect; - int count; - int i; - int idx; - - HDassert( cache_ptr ); - HDassert( file_ptr ); - HDassert( 0 <= min_idx ); - HDassert( min_idx < max_idx ); - HDassert( max_idx < NUM_DATA_ENTRIES ); - HDassert( max_idx < virt_num_data_entries ); - HDassert( 0 <= min_count ); - HDassert( min_count < max_count ); - - count = (HDrand() % (max_count - min_count)) + min_count; - - HDassert( min_count <= count ); - HDassert( count <= max_count ); - - for ( i = 0; i < count; i++ ) - { - local_pin_random_entry(cache_ptr, file_ptr, min_idx, max_idx); - } - - count = (HDrand() % (max_count - min_count)) + min_count; - - HDassert( min_count <= count ); - HDassert( count <= max_count ); - - i = 0; - idx = 0; - - while ( ( i < count ) && ( idx >= 0 ) ) - { - via_unprotect = ( (((unsigned)i) & 0x0001) == 0 ); - idx = local_unpin_next_pinned_entry(cache_ptr, file_ptr, - idx, via_unprotect); - i++; - } - } - - return; - -} /* local_pin_and_unpin_random_entries() */ - - -/***************************************************************************** - * Function: local_pin_random_entry() - * - * Purpose: Pin a randomly selected entry in cache, and mark the entry - * as being locally pinned. Since this entry will not in - * general be pinned in any other cache, we can't mark it - * dirty. - * - * Do nothing if nerrors is non-zero on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 4/12/06 - * - * Modifications: - * - *****************************************************************************/ - -void -local_pin_random_entry(H5C2_t * cache_ptr, - H5F_t * file_ptr, - int min_idx, - int max_idx) -{ - /* const char * fcn_name = "local_pin_random_entry()"; */ - int idx; - - if ( nerrors == 0 ) { - - HDassert( cache_ptr ); - HDassert( file_ptr ); - HDassert( 0 <= min_idx ); - HDassert( min_idx < max_idx ); - HDassert( max_idx < NUM_DATA_ENTRIES ); - HDassert( max_idx < virt_num_data_entries ); - - do - { - idx = (HDrand() % (max_idx - min_idx)) + min_idx; - HDassert( min_idx <= idx ); - HDassert( idx <= max_idx ); - } - while ( data[idx].global_pinned || data[idx].local_pinned ); - - pin_entry(cache_ptr, file_ptr, idx, FALSE, FALSE); - } - - return; - -} /* local_pin_random_entry() */ - - -/***************************************************************************** - * Function: local_unpin_all_entries() - * - * Purpose: Unpin all local pinned entries. - * - * Do nothing if nerrors is non-zero on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 4/12/06 - * - * Modifications: - * - *****************************************************************************/ - -void -local_unpin_all_entries(H5C2_t * cache_ptr, - H5F_t * file_ptr, - hbool_t via_unprotect) -{ - /* const char * fcn_name = "local_unpin_all_entries()"; */ - - if ( nerrors == 0 ) { - - int idx; - - HDassert( cache_ptr ); - HDassert( file_ptr ); - - idx = 0; - - while ( idx >= 0 ) - { - idx = local_unpin_next_pinned_entry(cache_ptr, file_ptr, - idx, via_unprotect); - } - } - - return; - -} /* local_unpin_all_entries() */ - - -/***************************************************************************** - * Function: local_unpin_next_pinned_entry() - * - * Purpose: Find the next locally pinned entry after the specified - * starting point, and unpin it. - * - * Do nothing if nerrors is non-zero on entry. - * - * Return: Index of the unpinned entry if there is one, or -1 if - * nerrors is non-zero on entry, or if there is no locally - * pinned entry. - * - * Programmer: John Mainzer - * 4/12/06 - * - * Modifications: - * - *****************************************************************************/ - -int -local_unpin_next_pinned_entry(H5C2_t * cache_ptr, - H5F_t * file_ptr, - int start_idx, - hbool_t via_unprotect) -{ - /* const char * fcn_name = "local_unpin_next_pinned_entry()"; */ - int i = 0; - int idx = -1; - - if ( nerrors == 0 ) { - - HDassert( cache_ptr ); - HDassert( file_ptr ); - HDassert( 0 <= start_idx ); - HDassert( start_idx < NUM_DATA_ENTRIES ); - HDassert( start_idx < virt_num_data_entries ); - - idx = start_idx; - - while ( ( i < virt_num_data_entries ) && - ( ! ( data[idx].local_pinned ) ) ) - { - i++; - idx++; - if ( idx >= virt_num_data_entries ) { - idx = 0; - } - } - - if ( data[idx].local_pinned ) { - - unpin_entry(cache_ptr, file_ptr, idx, FALSE, FALSE, via_unprotect); - - } else { - - idx = -1; - } - } - - return(idx); - -} /* local_unpin_next_pinned_entry() */ - - -/***************************************************************************** - * Function: lock_and_unlock_random_entries() - * - * Purpose: Obtain a random number in the closed interval [min_count, - * max_count]. Then protect and unprotect that number of - * random entries. - * - * Do nothing if nerrors is non-zero on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 1/12/06 - * - * Modifications: - * - *****************************************************************************/ - -void -lock_and_unlock_random_entries(H5C2_t * cache_ptr, - H5F_t * file_ptr, - int min_idx, - int max_idx, - int min_count, - int max_count) -{ - /* const char * fcn_name = "lock_and_unlock_random_entries()"; */ - int count; - int i; - - if ( nerrors == 0 ) { - - HDassert( cache_ptr ); - HDassert( file_ptr ); - HDassert( 0 <= min_count ); - HDassert( min_count < max_count ); - - count = (HDrand() % (max_count - min_count)) + min_count; - - HDassert( min_count <= count ); - HDassert( count <= max_count ); - - for ( i = 0; i < count; i++ ) - { - lock_and_unlock_random_entry(cache_ptr, file_ptr, min_idx, max_idx); - } - } - - return; - -} /* lock_and_unlock_random_entries() */ - - -/***************************************************************************** - * Function: lock_and_unlock_random_entry() - * - * Purpose: Protect and then unprotect a random entry with index in - * the data[] array in the close interval [min_idx, max_idx]. - * - * Do nothing if nerrors is non-zero on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 1/4/06 - * - * Modifications: - * - *****************************************************************************/ - -void -lock_and_unlock_random_entry(H5C2_t * cache_ptr, - H5F_t * file_ptr, - int min_idx, - int max_idx) -{ - /* const char * fcn_name = "lock_and_unlock_random_entry()"; */ - int idx; - - if ( nerrors == 0 ) { - - HDassert( cache_ptr ); - HDassert( file_ptr ); - HDassert( 0 <= min_idx ); - HDassert( min_idx < max_idx ); - HDassert( max_idx < NUM_DATA_ENTRIES ); - HDassert( max_idx < virt_num_data_entries ); - - idx = (HDrand() % (max_idx - min_idx)) + min_idx; - - HDassert( min_idx <= idx ); - HDassert( idx <= max_idx ); - - lock_entry(cache_ptr, file_ptr, idx); - unlock_entry(cache_ptr, file_ptr, idx, H5AC2__NO_FLAGS_SET); - } - - return; - -} /* lock_and_unlock_random_entry() */ - - -/***************************************************************************** - * Function: lock_entry() - * - * Purpose: Protect the entry indicated by the index. - * - * Do nothing if nerrors is non-zero on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 1/4/06 - * - * Modifications: - * - * JRM -- 7/11/06 - * Modified asserts to handle the new local_len field in - * datum. - * - *****************************************************************************/ - -void -lock_entry(H5C2_t * cache_ptr, - H5F_t * file_ptr, - int32_t idx) -{ - const char * fcn_name = "lock_entry()"; - struct datum * entry_ptr; - H5C2_cache_entry_t * cache_entry_ptr; - - if ( nerrors == 0 ) { - - HDassert( cache_ptr ); - HDassert( ( 0 <= idx ) && ( idx < NUM_DATA_ENTRIES ) ); - HDassert( idx < virt_num_data_entries ); - - entry_ptr = &(data[idx]); - - HDassert( ! (entry_ptr->locked) ); - - cache_entry_ptr = H5AC2_protect(file_ptr, H5P_DATASET_XFER_DEFAULT, - &(types[0]), entry_ptr->base_addr, - entry_ptr->local_len, NULL, H5AC2_WRITE); - - if ( ( cache_entry_ptr != (void *)(&(entry_ptr->header)) ) || - ( entry_ptr->header.type != &(types[0]) ) || - ( ( entry_ptr->len != entry_ptr->header.size ) && - ( entry_ptr->local_len != entry_ptr->header.size ) ) || - ( entry_ptr->base_addr != entry_ptr->header.addr ) ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: error in H5AC2_protect().\n", - world_mpi_rank, fcn_name); - } - } else { - - entry_ptr->locked = TRUE; - - } - - HDassert( ((entry_ptr->header).type)->id == DATUM_ENTRY_TYPE ); - } - - return; - -} /* lock_entry() */ - - -/***************************************************************************** - * Function: mark_pinned_entry_dirty() - * - * Purpose: Mark dirty the entry indicated by the index, - * - * Do nothing if nerrors is non-zero on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 4/14/06 - * - * Modifications: - * - *****************************************************************************/ - -void -mark_pinned_entry_dirty(H5C2_t * cache_ptr, - H5F_t * file_ptr, - int32_t idx, - hbool_t size_changed, - size_t new_size) -{ - const char * fcn_name = "mark_pinned_entry_dirty()"; - herr_t result; - struct datum * entry_ptr; - - if ( nerrors == 0 ) { - - HDassert( file_ptr ); - HDassert( cache_ptr ); - HDassert( ( 0 <= idx ) && ( idx < NUM_DATA_ENTRIES ) ); - HDassert( idx < virt_num_data_entries ); - - entry_ptr = &(data[idx]); - - HDassert ( entry_ptr->global_pinned ); - HDassert ( ! (entry_ptr->local_pinned) ); - - (entry_ptr->ver)++; - entry_ptr->dirty = TRUE; - - result = H5AC2_mark_pinned_entry_dirty( (void *)entry_ptr, - size_changed, - new_size); - - if ( result < 0 ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, - "%d:%s: error in H5AC2_mark_pinned_entry_dirty().\n", - world_mpi_rank, fcn_name); - } - } - else - { - global_dirty_pins++; - } - } - - return; - -} /* mark_pinned_entry_dirty() */ - - -/***************************************************************************** - * Function: mark_pinned_or_protected_entry_dirty() - * - * Purpose: Use the H5AC2_mark_pinned_or_protected_entry_dirty() call to - * mark dirty the entry indicated by the index, - * - * Do nothing if nerrors is non-zero on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 5/18/06 - * - * Modifications: - * - *****************************************************************************/ - -void -mark_pinned_or_protected_entry_dirty(H5C2_t * cache_ptr, - H5F_t * file_ptr, - int32_t idx) -{ - const char * fcn_name = "mark_pinned_or_protected_entry_dirty()"; - herr_t result; - struct datum * entry_ptr; - - if ( nerrors == 0 ) { - - HDassert( file_ptr ); - HDassert( cache_ptr ); - HDassert( ( 0 <= idx ) && ( idx < NUM_DATA_ENTRIES ) ); - HDassert( idx < virt_num_data_entries ); - - entry_ptr = &(data[idx]); - - HDassert ( entry_ptr->locked || entry_ptr->global_pinned ); - - (entry_ptr->ver)++; - entry_ptr->dirty = TRUE; - - result = H5AC2_mark_pinned_or_protected_entry_dirty( (void *)entry_ptr); - - if ( result < 0 ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: error in %s.\n", - world_mpi_rank, fcn_name, - "H5AC2_mark_pinned_or_protected_entry_dirty()"); - } - } - else if ( ! ( entry_ptr->locked ) ) - { - global_dirty_pins++; - } - } - - return; - -} /* mark_pinned_or_protected_entry_dirty() */ - - -/***************************************************************************** - * Function: pin_entry() - * - * Purpose: Pin the entry indicated by the index. - * - * Do nothing if nerrors is non-zero on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 4/11/06 - * - * Modifications: - * - *****************************************************************************/ - -void -pin_entry(H5C2_t * cache_ptr, - H5F_t * file_ptr, - int32_t idx, - hbool_t global, - hbool_t dirty) -{ - /* const char * fcn_name = "pin_entry()"; */ - unsigned int flags = H5AC2__PIN_ENTRY_FLAG; - struct datum * entry_ptr; - - if ( nerrors == 0 ) { - - HDassert( cache_ptr ); - HDassert( file_ptr ); - HDassert( ( 0 <= idx ) && ( idx < NUM_DATA_ENTRIES ) ); - HDassert( idx < virt_num_data_entries ); - - entry_ptr = &(data[idx]); - - HDassert ( ! (entry_ptr->global_pinned) ); - HDassert ( ! (entry_ptr->local_pinned) ); - HDassert ( ! ( dirty && ( ! global ) ) ); - - lock_entry(cache_ptr, file_ptr, idx); - - if ( dirty ) { - - flags |= H5AC2__DIRTIED_FLAG; - } - - unlock_entry(cache_ptr, file_ptr, idx, flags); - - HDassert( (entry_ptr->header).is_pinned ); - HDassert( ( ! dirty ) || ( (entry_ptr->header).is_dirty ) ); - - if ( global ) { - - entry_ptr->global_pinned = TRUE; - - global_pins++; - - } else { - - entry_ptr->local_pinned = TRUE; - - local_pins++; - - } - } - - return; - -} /* pin_entry() */ - - -/***************************************************************************** - * Function: pin_protected_entry() - * - * Purpose: Insert the entry indicated by the type and index, mark it - * as dirty, and increment its version number. - * - * Do nothing if nerrors is non-zero on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 01/04/06 - * - * Modifications: - * - * None. - * - *****************************************************************************/ - -void -pin_protected_entry(H5C2_t * cache_ptr, - H5F_t * file_ptr, - int32_t idx, - hbool_t global) -{ - const char * fcn_name = "pin_protected_entry()"; - herr_t result; - struct datum * entry_ptr; - - HDassert( cache_ptr ); - HDassert( file_ptr ); - HDassert( ( 0 <= idx ) && ( idx < NUM_DATA_ENTRIES ) ); - HDassert( idx < virt_num_data_entries ); - - entry_ptr = &(data[idx]); - - HDassert( entry_ptr->locked ); - - if ( nerrors == 0 ) { - - result = H5AC2_pin_protected_entry((void *)entry_ptr); - - if ( ( result < 0 ) || - ( entry_ptr->header.type != &(types[0]) ) || - ( ( entry_ptr->len != entry_ptr->header.size ) && - ( entry_ptr->local_len != entry_ptr->header.size ) )|| - ( entry_ptr->base_addr != entry_ptr->header.addr ) || - ( ! ( (entry_ptr->header).is_pinned ) ) ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, - "%d:%s: Error in H5AC2_pin_protected entry().\n", - world_mpi_rank, fcn_name); - } - } - - if ( global ) { - - entry_ptr->global_pinned = TRUE; - - global_pins++; - - } else { - - entry_ptr->local_pinned = TRUE; - - local_pins++; - - } - - HDassert( ((entry_ptr->header).type)->id == DATUM_ENTRY_TYPE ); - } - - return; - -} /* pin_protected_entry() */ - - -/***************************************************************************** - * Function: rename_entry() - * - * Purpose: Rename the entry indicated old_idx to the entry indicated - * by new_idex. Touch up the data array so that flush will - * not choke. - * - * Do nothing if nerrors isn't zero, or if old_idx equals - * new_idx. - * - * Return: void - * - * Programmer: John Mainzer - * 1/10/06 - * - * Modifications: - * - * 7/11/06 -- JRM - * Added support for the phony_len field in datum. - * - *****************************************************************************/ - -void -rename_entry(H5C2_t * cache_ptr, - H5F_t * file_ptr, - int32_t old_idx, - int32_t new_idx) -{ - const char * fcn_name = "rename_entry()"; - herr_t result; - int tmp; - size_t tmp_len; - haddr_t old_addr = HADDR_UNDEF; - haddr_t new_addr = HADDR_UNDEF; - struct datum * old_entry_ptr; - struct datum * new_entry_ptr; - - if ( ( nerrors == 0 ) && ( old_idx != new_idx ) ) { - - HDassert( cache_ptr ); - HDassert( file_ptr ); - HDassert( ( 0 <= old_idx ) && ( old_idx < NUM_DATA_ENTRIES ) ); - HDassert( old_idx < virt_num_data_entries ); - HDassert( ( 0 <= new_idx ) && ( new_idx < NUM_DATA_ENTRIES ) ); - HDassert( new_idx < virt_num_data_entries ); - - old_entry_ptr = &(data[old_idx]); - new_entry_ptr = &(data[new_idx]); - - HDassert( ((old_entry_ptr->header).type)->id == DATUM_ENTRY_TYPE ); - HDassert( !(old_entry_ptr->header.is_protected) ); - HDassert( !(old_entry_ptr->locked) ); - HDassert( old_entry_ptr->len == new_entry_ptr->len ); - - old_addr = old_entry_ptr->base_addr; - new_addr = new_entry_ptr->base_addr; - - result = H5AC2_rename(file_ptr, &(types[0]), old_addr, new_addr); - - if ( ( result < 0 ) || ( old_entry_ptr->header.addr != new_addr ) ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: H5AC2_rename() failed.\n", - world_mpi_rank, fcn_name); - } - - } else { - - HDassert( ((old_entry_ptr->header).type)->id == DATUM_ENTRY_TYPE ); - HDassert( old_entry_ptr->header.is_dirty ); - old_entry_ptr->dirty = TRUE; - - /* touch up versions, base_addrs, and data_index */ - - if ( old_entry_ptr->ver < new_entry_ptr->ver ) { - - old_entry_ptr->ver = new_entry_ptr->ver; - - } else { - - (old_entry_ptr->ver)++; - - } - - old_entry_ptr->base_addr = new_addr; - new_entry_ptr->base_addr = old_addr; - - data_index[old_entry_ptr->index] = new_idx; - data_index[new_entry_ptr->index] = old_idx; - - tmp = old_entry_ptr->index; - old_entry_ptr->index = new_entry_ptr->index; - new_entry_ptr->index = tmp; - - if ( old_entry_ptr->local_len != new_entry_ptr->local_len ) { - - tmp_len = old_entry_ptr->local_len; - old_entry_ptr->local_len = new_entry_ptr->local_len; - new_entry_ptr->local_len = tmp_len; - } - } - } - - return; - -} /* rename_entry() */ - - -/***************************************************************************** - * Function: resize_entry() - * - * Purpose: Resize the pinned entry indicated by idx to the new_size. - * Note that new_size must be greater than 0, and must be - * less than or equal to the original size of the entry. - * - * Do nothing if nerrors isn't zero. - * - * Return: void - * - * Programmer: John Mainzer - * 7/11/06 - * - * Modifications: - * - * None - * - *****************************************************************************/ - -void -resize_entry(H5C2_t * cache_ptr, - H5F_t * file_ptr, - int32_t idx, - size_t new_size) -{ - const char * fcn_name = "resize_entry()"; - herr_t result; - struct datum * entry_ptr; - - if ( nerrors == 0 ) { - - HDassert( cache_ptr ); - HDassert( file_ptr ); - HDassert( ( 0 <= idx ) && ( idx < NUM_DATA_ENTRIES ) ); - HDassert( idx < virt_num_data_entries ); - - entry_ptr = &(data[idx]); - - HDassert( ((entry_ptr->header).type)->id == DATUM_ENTRY_TYPE ); - HDassert( !(entry_ptr->header.is_protected) ); - HDassert( !(entry_ptr->locked) ); - HDassert( ( entry_ptr->global_pinned ) && - ( ! entry_ptr->local_pinned ) ); - HDassert( ( entry_ptr->header.size == entry_ptr->len ) || - ( entry_ptr->header.size == entry_ptr->local_len ) ); - HDassert( new_size > 0 ); - HDassert( new_size <= entry_ptr->len ); - - result = H5AC2_resize_pinned_entry((void *)entry_ptr, new_size); - - if ( result < 0 ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: H5AC2_rename() failed.\n", - world_mpi_rank, fcn_name); - } - - } else { - - HDassert( ((entry_ptr->header).type)->id == DATUM_ENTRY_TYPE ); - HDassert( entry_ptr->header.is_dirty ); - HDassert( entry_ptr->header.size == new_size ); - - entry_ptr->dirty = TRUE; - entry_ptr->local_len = new_size; - - /* touch up version. */ - - (entry_ptr->ver)++; - } - } - - return; - -} /* resize_entry() */ - - -/***************************************************************************** - * - * Function: setup_cache_for_test() - * - * Purpose: Setup the parallel cache for a test, and return the file id - * and a pointer to the cache's internal data structures. - * - * To do this, we must create a file, flush it (so that we - * don't have to worry about entries in the metadata cache), - * look up the address of the metadata cache, and then instruct - * the cache to omit sanity checks on dxpl IDs. - * - * Return: Success: TRUE - * - * Failure: FALSE - * - * Programmer: JRM -- 1/4/06 - * - * Modifications: - * - * None. - * - *****************************************************************************/ - -hbool_t -setup_cache_for_test(hid_t * fid_ptr, - H5F_t ** file_ptr_ptr, - H5C2_t ** cache_ptr_ptr) -{ - const char * fcn_name = "setup_cache_for_test()"; - hbool_t success = FALSE; /* will set to TRUE if appropriate. */ - hbool_t enable_rpt_fcn = FALSE; - hid_t fid = -1; - H5AC2_cache_config_t config; - H5F_t * file_ptr = NULL; - H5C2_t * cache_ptr = NULL; - haddr_t actual_base_addr; - - HDassert ( fid_ptr != NULL ); - HDassert ( file_ptr_ptr != NULL ); - HDassert ( cache_ptr_ptr != NULL ); - - fid = H5Fcreate(filenames[0], H5F_ACC_TRUNC, H5P_DEFAULT, fapl); - - if ( fid < 0 ) { - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: H5Fcreate() failed.\n", - world_mpi_rank, fcn_name); - } - } else if ( H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0 ) { - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: H5Fflush() failed.\n", - world_mpi_rank, fcn_name); - } - } else { - file_ptr = (H5F_t *)H5I_object_verify(fid, H5I_FILE); - } - - if ( file_ptr == NULL ) { - - if ( verbose ) { - HDfprintf(stdout, "%d:%s: Can't get file_ptr.\n", - world_mpi_rank, fcn_name); - } - } else { - cache_ptr = file_ptr->shared->cache2; - } - - if ( cache_ptr == NULL ) { - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: Can't get cache_ptr.\n", - world_mpi_rank, fcn_name); - } - } else if ( cache_ptr->magic != H5C2__H5C2_T_MAGIC ) { - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: Bad cache_ptr magic.\n", - world_mpi_rank, fcn_name); - } - } else { - *fid_ptr = fid; - *file_ptr_ptr = file_ptr; - *cache_ptr_ptr = cache_ptr; -#if 0 /* delete this eventually */ - H5C2_set_skip_flags(cache_ptr, TRUE, TRUE); -#endif /* JRM */ - H5C2_stats__reset(cache_ptr); - success = TRUE; - } - - if ( ( success ) && ( enable_rpt_fcn ) ) { - - config.version = H5AC2__CURR_CACHE_CONFIG_VERSION; - - if ( H5AC2_get_cache_auto_resize_config(cache_ptr, &config) - != SUCCEED ) { - - HDfprintf(stdout, - "%d:%s: H5AC2_get_cache_auto_resize_config() failed.\n", - world_mpi_rank, fcn_name); - - } else { - - config.rpt_fcn_enabled = TRUE; - - if ( H5AC2_set_cache_auto_resize_config(file_ptr, &config) - != SUCCEED ) { - - HDfprintf(stdout, - "%d:%s: H5AC2_set_cache_auto_resize_config() failed.\n", - world_mpi_rank, fcn_name); - } else { - - HDfprintf(stdout, "%d:%s: rpt_fcn enabled.\n", - world_mpi_rank, fcn_name); - } - } - } - -#if DO_SYNC_AFTER_WRITE - - if ( success ) { - - if ( H5AC2_set_write_done_callback(cache_ptr, do_sync) != SUCCEED ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, - "%d:%s: H5C2_set_write_done_callback failed.\n", - world_mpi_rank, fcn_name); - } - } - } - -#endif /* DO_SYNC_AFTER_WRITE */ - - if ( success ) { /* allocate space for test entries */ - - actual_base_addr = H5MF_alloc(file_ptr, H5FD_MEM_DEFAULT, H5P_DEFAULT, - (hsize_t)(max_addr + BASE_ADDR)); - - if ( actual_base_addr == HADDR_UNDEF ) { - - success = FALSE; - nerrors++; - - if ( verbose ) { - HDfprintf(stdout, "%d:%s: H5MF_alloc() failed.\n", - world_mpi_rank, fcn_name); - } - - } else if ( actual_base_addr > BASE_ADDR ) { - - /* If this happens, must increase BASE_ADDR so that the - * actual_base_addr is <= BASE_ADDR. This should only happen - * if the size of the superblock is increase. - */ - success = FALSE; - nerrors++; - - if ( verbose ) { - HDfprintf(stdout, "%d:%s: actual_base_addr > BASE_ADDR.\n", - world_mpi_rank, fcn_name); - } - } - } - - return(success); - -} /* setup_cache_for_test() */ - - -/***************************************************************************** - * - * Function: setup_noblock_dxpl_id() - * - * Purpose: Setup the noblock_dxpl_id global. Increment nerrors if - * errors are detected. Do nothing if nerrors is non-zero - * on entry. - * - * Return: void. - * - * Programmer: JRM -- 1/5/06 - * - * Modifications: - * - * None. - * - *****************************************************************************/ -/* So far we haven't needed this, but that may change. - * Keep it around for now - */ -#if 0 -void -setup_noblock_dxpl_id(void) -{ - const char * fcn_name = "setup_noblock_dxpl_id()"; - H5P_genclass_t *xfer_pclass; /* Dataset transfer property list - * class object - */ - H5P_genplist_t *xfer_plist; /* Dataset transfer property list object */ - unsigned block_before_meta_write; /* "block before meta write" - * property value - */ - unsigned library_internal = 1; /* "library internal" property value */ - H5FD_mpio_xfer_t xfer_mode; /* I/O transfer mode property value */ - - /* Sanity check */ - HDassert(H5P_CLS_DATASET_XFER_g!=(-1)); - - /* Get the dataset transfer property list class object */ - if ( ( nerrors == 0 ) && - ( NULL == (xfer_pclass = H5I_object(H5P_CLS_DATASET_XFER_g)) ) ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: can't get property list class.\n", - world_mpi_rank, fcn_name); - } - } - - /* Get an ID for the non-blocking, collective H5AC2 dxpl */ - if ( ( nerrors == 0 ) && - ( (noblock_dxpl_id = H5P_create_id(xfer_pclass)) < 0 ) ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: can't register property list.\n", - world_mpi_rank, fcn_name); - } - } - - /* Get the property list object */ - if ( ( nerrors == 0 ) && - ( NULL == (xfer_plist = H5I_object(H5AC2_noblock_dxpl_id)) ) ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: can't get new property list object.\n", - world_mpi_rank, fcn_name); - } - } - - /* Insert 'block before metadata write' property */ - block_before_meta_write=0; - if ( ( nerrors == 0 ) && - ( H5P_insert(xfer_plist, H5AC2_BLOCK_BEFORE_META_WRITE_NAME, - H5AC2_BLOCK_BEFORE_META_WRITE_SIZE, - &block_before_meta_write, - NULL, NULL, NULL, NULL, NULL, NULL) < 0 ) ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, - "%d:%s: can't insert metadata cache dxpl property 1.\n", - world_mpi_rank, fcn_name); - } - } - - /* Insert 'library internal' property */ - if ( ( nerrors == 0 ) && - ( H5P_insert(xfer_plist, H5AC2_LIBRARY_INTERNAL_NAME, - H5AC2_LIBRARY_INTERNAL_SIZE, &library_internal, - NULL, NULL, NULL, NULL, NULL, NULL ) < 0 ) ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, - "%d:%s: can't insert metadata cache dxpl property 2.\n", - world_mpi_rank, fcn_name); - } - } - - /* Set the transfer mode */ - xfer_mode = H5FD_MPIO_COLLECTIVE; - if ( ( nerrors == 0 ) && - ( H5P_set(xfer_plist, H5D_XFER_IO_XFER_MODE_NAME, &xfer_mode) < 0 ) ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: unable to set value.\n", world_mpi_rank, - fcn_name); - } - } - - return(success); - -} /* setup_noblock_dxpl_id() */ -#endif - - -/***************************************************************************** - * - * Function: setup_rand() - * - * Purpose: Use gettimeofday() to obtain a seed for rand(), print the - * seed to stdout, and then pass it to srand(). - * - * Increment nerrors if any errors are detected. - * - * Return: void. - * - * Programmer: JRM -- 1/12/06 - * - * Modifications: - * - * JRM -- 5/9/06 - * Modified function to facilitate setting predefined seeds. - * - *****************************************************************************/ - -void -setup_rand(void) -{ - const char * fcn_name = "setup_rand()"; - hbool_t use_predefined_seeds = FALSE; - int num_predefined_seeds = 3; - unsigned predefined_seeds[3] = {18669, 89925, 12577}; - unsigned seed; - struct timeval tv; - struct timezone tz; - - if ( ( use_predefined_seeds ) && - ( world_mpi_size == num_predefined_seeds ) ) { - - HDassert( world_mpi_rank >= 0 ); - HDassert( world_mpi_rank < world_mpi_size ); - - seed = predefined_seeds[world_mpi_rank]; - HDfprintf(stdout, "%d:%s: predefined_seed = %d.\n", - world_mpi_rank, fcn_name, seed); - fflush(stdout); - HDsrand(seed); - - } else { - - if ( HDgettimeofday(&tv, &tz) != 0 ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: gettimeofday() failed.\n", - world_mpi_rank, fcn_name); - } - } else { - seed = (unsigned)tv.tv_usec; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: seed = %d.\n", - world_mpi_rank, fcn_name, seed); - fflush(stdout); - } - HDsrand(seed); - } - } - - return; - -} /* setup_rand() */ - - -/***************************************************************************** - * - * Function: take_down_cache() - * - * Purpose: Take down the parallel cache after a test. - * - * To do this, we must close the file, and delete if if - * possible. - * - * Return: Success: TRUE - * - * Failure: FALSE - * - * Programmer: JRM -- 1/4/06 - * - * Modifications: - * - * None. - * - *****************************************************************************/ - -hbool_t -take_down_cache(hid_t fid, - H5C2_t * cache_ptr) -{ - const char * fcn_name = "take_down_cache()"; - hbool_t show_progress = FALSE; - hbool_t success = FALSE; /* will set to TRUE if appropriate. */ - int mile_stone = 1; - - if ( show_progress ) { /* 1 */ - HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", - world_mpi_rank, fcn_name, mile_stone++, (int)success); - fflush(stdout); - } - - /* close the file and delete it */ - if ( H5Fclose(fid) < 0 ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: H5Fclose() failed.\n", - world_mpi_rank, fcn_name); - } - - } else if ( world_mpi_rank == world_server_mpi_rank ) { - - if ( HDremove(filenames[0]) < 0 ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: HDremove() failed.\n", - world_mpi_rank, fcn_name); - } - } else { - - success = TRUE; - } - } else { - - success = TRUE; - } - - if ( show_progress ) { /* 2 */ - HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", - world_mpi_rank, fcn_name, mile_stone++, (int)success); - fflush(stdout); - } - - return(success); - -} /* take_down_cache() */ - - -/***************************************************************************** - * Function: unlock_entry() - * - * Purpose: Unprotect the entry indicated by the index. - * - * Do nothing if nerrors is non-zero on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 1/4/06 - * - * Modifications: - * - * 7/11/06 - * Updated for the new local_len field in datum. - * - *****************************************************************************/ - -void -unlock_entry(H5C2_t * cache_ptr, - H5F_t * file_ptr, - int32_t idx, - unsigned int flags) -{ - const char * fcn_name = "unlock_entry()"; - herr_t dirtied; - herr_t result; - struct datum * entry_ptr; - - if ( nerrors == 0 ) { - - HDassert( cache_ptr ); - HDassert( file_ptr ); - HDassert( ( 0 <= idx ) && ( idx < NUM_DATA_ENTRIES ) ); - HDassert( idx < virt_num_data_entries ); - - entry_ptr = &(data[idx]); - - HDassert( entry_ptr->locked ); - - dirtied = ((flags & H5AC2__DIRTIED_FLAG) == H5AC2__DIRTIED_FLAG ); - - if ( dirtied ) { - - (entry_ptr->ver)++; - entry_ptr->dirty = TRUE; - } - - result = H5AC2_unprotect(file_ptr, H5P_DATASET_XFER_DEFAULT, &(types[0]), - entry_ptr->base_addr, entry_ptr->local_len, - (void *)(&(entry_ptr->header)), flags); - - if ( ( result < 0 ) || - ( entry_ptr->header.type != &(types[0]) ) || - ( ( entry_ptr->len != entry_ptr->header.size ) && - ( entry_ptr->local_len != entry_ptr->header.size ) ) || - ( entry_ptr->base_addr != entry_ptr->header.addr ) ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: error in H5C2_unprotect().\n", - world_mpi_rank, fcn_name); - } - } else { - - entry_ptr->locked = FALSE; - - } - - HDassert( ((entry_ptr->header).type)->id == DATUM_ENTRY_TYPE ); - - if ( ( flags & H5AC2__DIRTIED_FLAG ) != 0 - && ( (flags & H5C2__DELETED_FLAG) == 0 ) ) { - - HDassert( entry_ptr->header.is_dirty ); - HDassert( entry_ptr->dirty ); - } - } - - return; - -} /* unlock_entry() */ - - -/***************************************************************************** - * Function: unpin_entry() - * - * Purpose: Unpin the entry indicated by the index. - * - * Do nothing if nerrors is non-zero on entry. - * - * Return: void - * - * Programmer: John Mainzer - * 4/12/06 - * - * Modifications: - * - * JRM -- 8/15/06 - * Added assertion that entry is pinned on entry. - * - *****************************************************************************/ - -void -unpin_entry(H5C2_t * cache_ptr, - H5F_t * file_ptr, - int32_t idx, - hbool_t global, - hbool_t dirty, - hbool_t via_unprotect) -{ - const char * fcn_name = "unpin_entry()"; - herr_t result; - unsigned int flags = H5AC2__UNPIN_ENTRY_FLAG; - struct datum * entry_ptr; - - if ( nerrors == 0 ) { - - HDassert( cache_ptr ); - HDassert( file_ptr ); - HDassert( ( 0 <= idx ) && ( idx < NUM_DATA_ENTRIES ) ); - HDassert( idx < virt_num_data_entries ); - - entry_ptr = &(data[idx]); - - HDassert( (entry_ptr->header).is_pinned ); - HDassert ( ! ( entry_ptr->global_pinned && entry_ptr->local_pinned) ); - HDassert ( ( global && entry_ptr->global_pinned ) || - ( ! global && entry_ptr->local_pinned ) ); - HDassert ( ! ( dirty && ( ! global ) ) ); - - if ( via_unprotect ) { - - lock_entry(cache_ptr, file_ptr, idx); - - if ( dirty ) { - - flags |= H5AC2__DIRTIED_FLAG; - } - - unlock_entry(cache_ptr, file_ptr, idx, flags); - - } else { - - if ( dirty ) { - - mark_pinned_entry_dirty(cache_ptr, file_ptr, idx, FALSE, - (size_t)0); - - } - - result = H5AC2_unpin_entry(entry_ptr); - - if ( result < 0 ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: error in H5AC2_unpin_entry().\n", - world_mpi_rank, fcn_name); - } - } - } - - HDassert( ! ((entry_ptr->header).is_pinned) ); - - if ( global ) { - - entry_ptr->global_pinned = FALSE; - - } else { - - entry_ptr->local_pinned = FALSE; - - } - } - - return; - -} /* unpin_entry() */ - - -/*****************************************************************************/ -/****************************** test functions *******************************/ -/*****************************************************************************/ - -/***************************************************************************** - * - * Function: server_smoke_check() - * - * Purpose: Quick smoke check for the server process. - * - * Return: Success: TRUE - * - * Failure: FALSE - * - * Programmer: JRM -- 12/21/05 - * - * Modifications: - * - * JRM -- 5/9/06 - * Added code supporting the write request ack message. This - * message was added to eliminate one possible cause of a - * bug spotted on cobalt. If this doesn't fix the problem, - * it will narrow things down a bit. - * - * JRM -- 5/10/06 - * Added call to do_sync(). This is part of an attempt to - * optimize out the slowdown caused by the addition of the - * write request ack message. - * - *****************************************************************************/ - -hbool_t -server_smoke_check(void) -{ - const char * fcn_name = "server_smoke_check()"; - hbool_t success = TRUE; - int max_nerrors; - struct mssg_t mssg; - - if ( world_mpi_rank == 0 ) { - - TESTING("server smoke check"); - } - - nerrors = 0; - init_data(); - reset_stats(); - - if ( world_mpi_rank == world_server_mpi_rank ) { - - if ( ! server_main() ) { - - /* some error occured in the server -- report failure */ - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: server_main() failed.\n", - world_mpi_rank, fcn_name); - } - } - } - else /* run the clients */ - { - /* compose the write message */ - mssg.req = WRITE_REQ_CODE; - mssg.src = world_mpi_rank; - mssg.dest = world_server_mpi_rank; - mssg.mssg_num = -1; /* set by send function */ - mssg.base_addr = data[world_mpi_rank].base_addr; - mssg.len = data[world_mpi_rank].len; - mssg.ver = ++(data[world_mpi_rank].ver); - mssg.magic = MSSG_MAGIC; - - if ( ! ( success = send_mssg(&mssg, FALSE) ) ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: send_mssg() failed on write.\n", - world_mpi_rank, fcn_name); - } - } - -#if DO_WRITE_REQ_ACK - - /* try to receive the write ack from the server */ - if ( success ) { - - success = recv_mssg(&mssg, WRITE_REQ_ACK_CODE); - - if ( ! success ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: recv_mssg() failed.\n", - world_mpi_rank, fcn_name); - } - } - } - - /* verify that we received the expected ack message */ - if ( success ) { - - if ( ( mssg.req != WRITE_REQ_ACK_CODE ) || - ( mssg.src != world_server_mpi_rank ) || - ( mssg.dest != world_mpi_rank ) || - ( mssg.base_addr != data[world_mpi_rank].base_addr ) || - ( mssg.len != data[world_mpi_rank].len ) || - ( mssg.ver != data[world_mpi_rank].ver ) || - ( mssg.magic != MSSG_MAGIC ) ) { - - success = FALSE; - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: Bad data in write req ack.\n", - world_mpi_rank, fcn_name); - } - } - } - -#endif /* DO_WRITE_REQ_ACK */ - - do_sync(); - - /* compose the read message */ - mssg.req = READ_REQ_CODE; - mssg.src = world_mpi_rank; - mssg.dest = world_server_mpi_rank; - mssg.mssg_num = -1; /* set by send function */ - mssg.base_addr = data[world_mpi_rank].base_addr; - mssg.len = data[world_mpi_rank].len; - mssg.ver = 0; /* bogus -- should be corrected by server */ - mssg.magic = MSSG_MAGIC; - - if ( success ) { - - success = send_mssg(&mssg, FALSE); - - if ( ! success ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: send_mssg() failed on write.\n", - world_mpi_rank, fcn_name); - } - } - } - - /* try to receive the reply from the server */ - if ( success ) { - - success = recv_mssg(&mssg, READ_REQ_REPLY_CODE); - - if ( ! success ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: recv_mssg() failed.\n", - world_mpi_rank, fcn_name); - } - } - } - - /* verify that we got the expected result */ - if ( success ) { - - if ( ( mssg.req != READ_REQ_REPLY_CODE ) || - ( mssg.src != world_server_mpi_rank ) || - ( mssg.dest != world_mpi_rank ) || - ( mssg.base_addr != data[world_mpi_rank].base_addr ) || - ( mssg.len != data[world_mpi_rank].len ) || - ( mssg.ver != data[world_mpi_rank].ver ) || - ( mssg.magic != MSSG_MAGIC ) ) { - - success = FALSE; - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: Bad data in read req reply.\n", - world_mpi_rank, fcn_name); - } - } - } - - /* compose the done message */ - mssg.req = DONE_REQ_CODE; - mssg.src = world_mpi_rank; - mssg.dest = world_server_mpi_rank; - mssg.mssg_num = -1; /* set by send function */ - mssg.base_addr = 0; /* not used */ - mssg.len = 0; /* not used */ - mssg.ver = 0; /* not used */ - mssg.magic = MSSG_MAGIC; - - if ( success ) { - - success = send_mssg(&mssg, FALSE); - - if ( ! success ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: send_mssg() failed on done.\n", - world_mpi_rank, fcn_name); - } - } - } - } - - max_nerrors = get_max_nerrors(); - - if ( world_mpi_rank == 0 ) { - - if ( max_nerrors == 0 ) { - - PASSED(); - - } else { - - failures++; - H5_FAILED(); - } - } - - success = ( ( success ) && ( max_nerrors == 0 ) ); - - return(success); - -} /* server_smoke_check() */ - -/***************************************************************************** - * - * Function: smoke_check_1() - * - * Purpose: First smoke check for the parallel cache. - * - * Return: Success: TRUE - * - * Failure: FALSE - * - * Programmer: JRM -- 1/4/06 - * - * Modifications: - * - * None. - * - *****************************************************************************/ - -hbool_t -smoke_check_1(void) -{ - const char * fcn_name = "smoke_check_1()"; - hbool_t success = TRUE; - hbool_t show_progress = FALSE; - int i; - int max_nerrors; - int mile_stone = 1; - hid_t fid = -1; - H5F_t * file_ptr = NULL; - H5C2_t * cache_ptr = NULL; - struct mssg_t mssg; - - if ( world_mpi_rank == 0 ) { - - TESTING("smoke check #1"); - } - - if ( show_progress ) { /* 1 */ - HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", - world_mpi_rank, fcn_name, mile_stone++, (int)success); - fflush(stdout); - } - - nerrors = 0; - init_data(); - reset_stats(); - - if ( world_mpi_rank == world_server_mpi_rank ) { - - if ( show_progress ) { /* 2s */ - HDfprintf(stdout, "%d:%s - %0ds -- success = %d\n", - world_mpi_rank, fcn_name, mile_stone++, (int)success); - fflush(stdout); - } - - if ( ! server_main() ) { - - /* some error occured in the server -- report failure */ - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: server_main() failed.\n", - world_mpi_rank, fcn_name); - } - } - - if ( show_progress ) { /* 3s */ - HDfprintf(stdout, "%d:%s - %0ds -- success = %d\n", - world_mpi_rank, fcn_name, mile_stone++, (int)success); - fflush(stdout); - } - } - else /* run the clients */ - { - - if ( show_progress ) { /* 2 */ - HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", - world_mpi_rank, fcn_name, mile_stone++, (int)success); - fflush(stdout); - } - - if ( ! setup_cache_for_test(&fid, &file_ptr, &cache_ptr) ) { - - nerrors++; - fid = -1; - cache_ptr = NULL; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: setup_cache_for_test() failed.\n", - world_mpi_rank, fcn_name); - } - } - - if ( show_progress ) { /* 3 */ - HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", - world_mpi_rank, fcn_name, mile_stone++, (int)success); - fflush(stdout); - } - - for ( i = 0; i < (virt_num_data_entries / 2); i++ ) - { - insert_entry(cache_ptr, file_ptr, i, H5AC2__NO_FLAGS_SET); - } - - if ( show_progress ) { /* 4 */ - HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", - world_mpi_rank, fcn_name, mile_stone++, (int)success); - fflush(stdout); - } - - for ( i = (virt_num_data_entries / 2) - 1; i >= 0; i-- ) - { - lock_entry(cache_ptr, file_ptr, i); - unlock_entry(cache_ptr, file_ptr, i, H5AC2__NO_FLAGS_SET); - } - - if ( show_progress ) { /* 5 */ - HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", - world_mpi_rank, fcn_name, mile_stone++, (int)success); - fflush(stdout); - } - - /* rename the first half of the entries... */ - for ( i = 0; i < (virt_num_data_entries / 2); i++ ) - { - lock_entry(cache_ptr, file_ptr, i); - unlock_entry(cache_ptr, file_ptr, i, H5AC2__NO_FLAGS_SET); - rename_entry(cache_ptr, file_ptr, i, - (i + (virt_num_data_entries / 2))); - } - - if ( show_progress ) { /* 6 */ - HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", - world_mpi_rank, fcn_name, mile_stone++, (int)success); - fflush(stdout); - } - - /* ...and then rename them back. */ - for ( i = (virt_num_data_entries / 2) - 1; i >= 0; i-- ) - { - lock_entry(cache_ptr, file_ptr, i); - unlock_entry(cache_ptr, file_ptr, i, H5AC2__NO_FLAGS_SET); - rename_entry(cache_ptr, file_ptr, i, - (i + (virt_num_data_entries / 2))); - } - - if ( show_progress ) { /* 7 */ - HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", - world_mpi_rank, fcn_name, mile_stone++, (int)success); - fflush(stdout); - } - - if ( fid >= 0 ) { - - if ( ! take_down_cache(fid, cache_ptr) ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: take_down_cache() failed.\n", - world_mpi_rank, fcn_name); - } - } - } - - if ( show_progress ) { /* 8 */ - HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", - world_mpi_rank, fcn_name, mile_stone++, (int)success); - fflush(stdout); - } - - /* verify that all instance of datum are back where the started - * and are clean. - */ - - for ( i = 0; i < NUM_DATA_ENTRIES; i++ ) - { - HDassert( data_index[i] == i ); - HDassert( ! (data[i].dirty) ); - } - - if ( show_progress ) { /* 9 */ - HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", - world_mpi_rank, fcn_name, mile_stone++, (int)success); - fflush(stdout); - } - - /* compose the done message */ - mssg.req = DONE_REQ_CODE; - mssg.src = world_mpi_rank; - mssg.dest = world_server_mpi_rank; - mssg.mssg_num = -1; /* set by send function */ - mssg.base_addr = 0; /* not used */ - mssg.len = 0; /* not used */ - mssg.ver = 0; /* not used */ - mssg.magic = MSSG_MAGIC; - - if ( success ) { - - success = send_mssg(&mssg, FALSE); - - if ( ! success ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: send_mssg() failed on done.\n", - world_mpi_rank, fcn_name); - } - } - } - - if ( show_progress ) { /* 10 */ - HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", - world_mpi_rank, fcn_name, mile_stone++, (int)success); - fflush(stdout); - } - } - - max_nerrors = get_max_nerrors(); - - if ( world_mpi_rank == 0 ) { - - if ( max_nerrors == 0 ) { - - PASSED(); - - } else { - - failures++; - H5_FAILED(); - } - } - - success = ( ( success ) && ( max_nerrors == 0 ) ); - - return(success); - -} /* smoke_check_1() */ - - -/***************************************************************************** - * - * Function: smoke_check_2() - * - * Purpose: Second smoke check for the parallel cache. - * - * Introduce random reads, but keep all processes with roughly - * the same work load. - * - * Return: Success: TRUE - * - * Failure: FALSE - * - * Programmer: JRM -- 1/12/06 - * - * Modifications: - * - * JRM -- 4/13/06 - * Added pinned entry tests. - * - * JRM -- 4/28/06 - * Modified test to rename pinned entries. - * - *****************************************************************************/ - -hbool_t -smoke_check_2(void) -{ - const char * fcn_name = "smoke_check_2()"; - hbool_t success = TRUE; - int i; - int max_nerrors; - hid_t fid = -1; - H5F_t * file_ptr = NULL; - H5C2_t * cache_ptr = NULL; - struct mssg_t mssg; - - if ( world_mpi_rank == 0 ) { - - TESTING("smoke check #2"); - } - - nerrors = 0; - init_data(); - reset_stats(); - - if ( world_mpi_rank == world_server_mpi_rank ) { - - if ( ! server_main() ) { - - /* some error occured in the server -- report failure */ - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: server_main() failed.\n", - world_mpi_rank, fcn_name); - } - } - } - else /* run the clients */ - { - if ( ! setup_cache_for_test(&fid, &file_ptr, &cache_ptr) ) { - - nerrors++; - fid = -1; - cache_ptr = NULL; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: setup_cache_for_test() failed.\n", - world_mpi_rank, fcn_name); - } - } - - for ( i = 0; i < (virt_num_data_entries / 2); i++ ) - { - insert_entry(cache_ptr, file_ptr, i, H5AC2__NO_FLAGS_SET); - - if ( i > 100 ) { - - lock_and_unlock_random_entries(cache_ptr, file_ptr, - (i - 100), i, 0, 10); - } - } - - for ( i = 0; i < (virt_num_data_entries / 2); i+=61 ) - { - /* Make sure we don't step on any locally pinned entries */ - if ( data[i].local_pinned ) { - unpin_entry(cache_ptr, file_ptr, i, FALSE, FALSE, FALSE); - } - - pin_entry(cache_ptr, file_ptr, i, TRUE, FALSE); - } - - for ( i = (virt_num_data_entries / 2) - 1; i >= 0; i-=2 ) - { - lock_entry(cache_ptr, file_ptr, i); - unlock_entry(cache_ptr, file_ptr, i, H5AC2__NO_FLAGS_SET); - lock_and_unlock_random_entries(cache_ptr, file_ptr, 0, - (virt_num_data_entries / 20), - 0, 100); - local_pin_and_unpin_random_entries(cache_ptr, file_ptr, 0, - (virt_num_data_entries / 4), - 0, 3); - } - - for ( i = 0; i < (virt_num_data_entries / 2); i+=2 ) - { - lock_entry(cache_ptr, file_ptr, i); - unlock_entry(cache_ptr, file_ptr, i, H5AC2__DIRTIED_FLAG); - lock_and_unlock_random_entries(cache_ptr, file_ptr, 0, - (virt_num_data_entries / 10), - 0, 100); - } - - /* we can't rename pinned entries, so release any local pins now. */ - local_unpin_all_entries(cache_ptr, file_ptr, FALSE); - - /* rename the first half of the entries... */ - for ( i = 0; i < (virt_num_data_entries / 2); i++ ) - { - lock_entry(cache_ptr, file_ptr, i); - unlock_entry(cache_ptr, file_ptr, i, H5AC2__NO_FLAGS_SET); - rename_entry(cache_ptr, file_ptr, i, - (i + (virt_num_data_entries / 2))); - lock_and_unlock_random_entries(cache_ptr, file_ptr, 0, - ((virt_num_data_entries / 50) - 1), - 0, 100); - } - - /* ...and then rename them back. */ - for ( i = (virt_num_data_entries / 2) - 1; i >= 0; i-- ) - { - lock_entry(cache_ptr, file_ptr, i); - unlock_entry(cache_ptr, file_ptr, i, H5AC2__DIRTIED_FLAG); - rename_entry(cache_ptr, file_ptr, i, - (i + (virt_num_data_entries / 2))); - lock_and_unlock_random_entries(cache_ptr, file_ptr, 0, - (virt_num_data_entries / 100), - 0, 100); - } - - for ( i = 0; i < (virt_num_data_entries / 2); i+=61 ) - { - hbool_t via_unprotect = ( (((unsigned)i) & 0x01) == 0 ); - hbool_t dirty = ( (((unsigned)i) & 0x02) == 0 ); - - unpin_entry(cache_ptr, file_ptr, i, TRUE, dirty, via_unprotect); - } - - if ( fid >= 0 ) { - - if ( ! take_down_cache(fid, cache_ptr) ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: take_down_cache() failed.\n", - world_mpi_rank, fcn_name); - } - } - } - - /* verify that all instance of datum are back where the started - * and are clean. - */ - - for ( i = 0; i < NUM_DATA_ENTRIES; i++ ) - { - HDassert( data_index[i] == i ); - HDassert( ! (data[i].dirty) ); - } - - /* compose the done message */ - mssg.req = DONE_REQ_CODE; - mssg.src = world_mpi_rank; - mssg.dest = world_server_mpi_rank; - mssg.mssg_num = -1; /* set by send function */ - mssg.base_addr = 0; /* not used */ - mssg.len = 0; /* not used */ - mssg.ver = 0; /* not used */ - mssg.magic = MSSG_MAGIC; - - if ( success ) { - - success = send_mssg(&mssg, FALSE); - - if ( ! success ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: send_mssg() failed on done.\n", - world_mpi_rank, fcn_name); - } - } - } - } - - max_nerrors = get_max_nerrors(); - - if ( world_mpi_rank == 0 ) { - - if ( max_nerrors == 0 ) { - - PASSED(); - - } else { - - failures++; - H5_FAILED(); - } - } - - success = ( ( success ) && ( max_nerrors == 0 ) ); - - return(success); - -} /* smoke_check_2() */ - - -/***************************************************************************** - * - * Function: smoke_check_3() - * - * Purpose: Third smoke check for the parallel cache. - * - * Use random reads to vary the loads on the diffferent - * processors. Also force different cache size adjustments. - * - * In this test, load process 0 heavily, and the other - * processes lightly. - * - * Return: Success: TRUE - * - * Failure: FALSE - * - * Programmer: JRM -- 1/13/06 - * - * Modifications: - * - * Added code intended to ensure correct operation with large - * numbers of processors. - * JRM - 1/31/06 - * - * Added pinned entry tests. JRM - 4/14/06 - * - *****************************************************************************/ - -hbool_t -smoke_check_3(void) -{ - const char * fcn_name = "smoke_check_3()"; - hbool_t success = TRUE; - int i; - int max_nerrors; - int min_count; - int max_count; - int min_idx; - int max_idx; - hid_t fid = -1; - H5F_t * file_ptr = NULL; - H5C2_t * cache_ptr = NULL; - struct mssg_t mssg; - - if ( world_mpi_rank == 0 ) { - - TESTING("smoke check #3"); - } - - nerrors = 0; - init_data(); - reset_stats(); - - if ( world_mpi_rank == world_server_mpi_rank ) { - - if ( ! server_main() ) { - - /* some error occured in the server -- report failure */ - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: server_main() failed.\n", - world_mpi_rank, fcn_name); - } - } - } - else /* run the clients */ - { - if ( ! setup_cache_for_test(&fid, &file_ptr, &cache_ptr) ) { - - nerrors++; - fid = -1; - cache_ptr = NULL; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: setup_cache_for_test() failed.\n", - world_mpi_rank, fcn_name); - } - } - - min_count = 100 / ((file_mpi_rank + 1) * (file_mpi_rank + 1)); - max_count = min_count + 50; - - for ( i = 0; i < (virt_num_data_entries / 4); i++ ) - { - insert_entry(cache_ptr, file_ptr, i, H5AC2__NO_FLAGS_SET); - - if ( i > 100 ) { - - lock_and_unlock_random_entries(cache_ptr, file_ptr, - (i - 100), i, - min_count, max_count); - } - } - - - min_count = 100 / ((file_mpi_rank + 2) * (file_mpi_rank + 2)); - max_count = min_count + 50; - - for ( i = (virt_num_data_entries / 4); - i < (virt_num_data_entries / 2); - i++ ) - { - - insert_entry(cache_ptr, file_ptr, i, H5AC2__NO_FLAGS_SET); - - if ( i % 59 == 0 ) { - - hbool_t dirty = ( (i % 2) == 0); - - if ( data[i].local_pinned ) { - unpin_entry(cache_ptr, file_ptr, i, FALSE, FALSE, FALSE); - } - - pin_entry(cache_ptr, file_ptr, i, TRUE, dirty); - - HDassert( !dirty || data[i].header.is_dirty ); - HDassert( data[i].header.is_pinned ); - HDassert( data[i].global_pinned ); - HDassert( ! data[i].local_pinned ); - } - - if ( i > 100 ) { - - lock_and_unlock_random_entries(cache_ptr, file_ptr, - (i - 100), i, - min_count, max_count); - } - - local_pin_and_unpin_random_entries(cache_ptr, file_ptr, - 0, virt_num_data_entries / 4, - 0, (file_mpi_rank + 2)); - - } - - - /* flush the file to be sure that we have no problems flushing - * pinned entries - */ - if ( H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0 ) { - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: H5Fflush() failed.\n", - world_mpi_rank, fcn_name); - } - } - - - min_idx = 0; - max_idx = ((virt_num_data_entries / 10) / - ((file_mpi_rank + 1) * (file_mpi_rank + 1))) - 1; - if ( max_idx <= min_idx ) { - - max_idx = min_idx + 10; - } - - for ( i = (virt_num_data_entries / 2) - 1; i >= 0; i-- ) - { - if ( ( i >= (virt_num_data_entries / 4) ) && ( i % 59 == 0 ) ) { - - hbool_t via_unprotect = ( (((unsigned)i) & 0x02) == 0 ); - hbool_t dirty = ( (((unsigned)i) & 0x04) == 0 ); - - HDassert( data[i].global_pinned ); - HDassert( ! data[i].local_pinned ); - - unpin_entry(cache_ptr, file_ptr, i, TRUE, dirty, - via_unprotect); - } - if ( i % 2 == 0 ) { - - lock_entry(cache_ptr, file_ptr, i); - unlock_entry(cache_ptr, file_ptr, i, H5AC2__NO_FLAGS_SET); - local_pin_and_unpin_random_entries(cache_ptr, file_ptr, 0, - virt_num_data_entries / 2, - 0, 2); - lock_and_unlock_random_entries(cache_ptr, file_ptr, - min_idx, max_idx, 0, 100); - } - } - - min_idx = 0; - max_idx = ((virt_num_data_entries / 10) / - ((file_mpi_rank + 3) * (file_mpi_rank + 3))) - 1; - if ( max_idx <= min_idx ) { - - max_idx = min_idx + 10; - } - - for ( i = 0; i < (virt_num_data_entries / 2); i+=2 ) - { - lock_entry(cache_ptr, file_ptr, i); - unlock_entry(cache_ptr, file_ptr, i, H5AC2__DIRTIED_FLAG); - lock_and_unlock_random_entries(cache_ptr, file_ptr, - min_idx, max_idx, 0, 100); - } - - /* we can't rename pinned entries, so release any local pins now. */ - local_unpin_all_entries(cache_ptr, file_ptr, FALSE); - - min_count = 10 / (file_mpi_rank + 1); - max_count = min_count + 100; - - /* rename the first half of the entries... */ - for ( i = 0; i < (virt_num_data_entries / 2); i++ ) - { - lock_entry(cache_ptr, file_ptr, i); - unlock_entry(cache_ptr, file_ptr, i, H5AC2__NO_FLAGS_SET); - rename_entry(cache_ptr, file_ptr, i, - (i + (virt_num_data_entries / 2))); - lock_and_unlock_random_entries(cache_ptr, file_ptr, 0, - (virt_num_data_entries / 20), - min_count, max_count); - } - - /* ...and then rename them back. */ - for ( i = (virt_num_data_entries / 2) - 1; i >= 0; i-- ) - { - lock_entry(cache_ptr, file_ptr, i); - unlock_entry(cache_ptr, file_ptr, i, H5AC2__DIRTIED_FLAG); - rename_entry(cache_ptr, file_ptr, i, - (i + (virt_num_data_entries / 2))); - lock_and_unlock_random_entries(cache_ptr, file_ptr, 0, - (virt_num_data_entries / 40), - min_count, max_count); - } - - /* finally, do some dirty lock/unlocks while we give the cache - * a chance t reduce its size. - */ - min_count = 200 / ((file_mpi_rank + 1) * (file_mpi_rank + 1)); - max_count = min_count + 100; - - for ( i = 0; i < (virt_num_data_entries / 2); i+=2 ) - { - local_pin_and_unpin_random_entries(cache_ptr, file_ptr, 0, - (virt_num_data_entries / 2), - 0, 5); - - lock_entry(cache_ptr, file_ptr, i); - unlock_entry(cache_ptr, file_ptr, i, H5AC2__DIRTIED_FLAG); - - if ( i > 100 ) { - - lock_and_unlock_random_entries(cache_ptr, file_ptr, - (i - 100), i, - min_count, max_count); - } - } - - /* release any local pins before we take down the cache. */ - local_unpin_all_entries(cache_ptr, file_ptr, FALSE); - - if ( fid >= 0 ) { - - if ( ! take_down_cache(fid, cache_ptr) ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: take_down_cache() failed.\n", - world_mpi_rank, fcn_name); - } - } - } - - /* verify that all instances of datum are back where the started - * and are clean. - */ - - for ( i = 0; i < NUM_DATA_ENTRIES; i++ ) - { - HDassert( data_index[i] == i ); - HDassert( ! (data[i].dirty) ); - } - - /* compose the done message */ - mssg.req = DONE_REQ_CODE; - mssg.src = world_mpi_rank; - mssg.dest = world_server_mpi_rank; - mssg.mssg_num = -1; /* set by send function */ - mssg.base_addr = 0; /* not used */ - mssg.len = 0; /* not used */ - mssg.ver = 0; /* not used */ - mssg.magic = MSSG_MAGIC; - - if ( success ) { - - - success = send_mssg(&mssg, FALSE); - - if ( ! success ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: send_mssg() failed on done.\n", - world_mpi_rank, fcn_name); - } - } - } - } - - max_nerrors = get_max_nerrors(); - - if ( world_mpi_rank == 0 ) { - - if ( max_nerrors == 0 ) { - - PASSED(); - - } else { - - failures++; - H5_FAILED(); - } - } - - success = ( ( success ) && ( max_nerrors == 0 ) ); - - return(success); - -} /* smoke_check_3() */ - - -/***************************************************************************** - * - * Function: smoke_check_4() - * - * Purpose: Fourth smoke check for the parallel cache. - * - * Use random reads to vary the loads on the diffferent - * processors. Also force different cache size adjustments. - * - * In this test, load process 0 lightly, and the other - * processes heavily. - * - * Return: Success: TRUE - * - * Failure: FALSE - * - * Programmer: JRM -- 1/13/06 - * - * Modifications: - * - * Added code intended to insure correct operation with large - * numbers of processors. - * JRM - 1/31/06 - * - * Added code testing pinned insertion of entries. - * - * JRM - 8/15/06 - * - *****************************************************************************/ - -hbool_t -smoke_check_4(void) -{ - const char * fcn_name = "smoke_check_4()"; - hbool_t success = TRUE; - int i; - int max_nerrors; - int min_count; - int max_count; - int min_idx; - int max_idx; - hid_t fid = -1; - H5F_t * file_ptr = NULL; - H5C2_t * cache_ptr = NULL; - struct mssg_t mssg; - - if ( world_mpi_rank == 0 ) { - - TESTING("smoke check #4"); - } - - nerrors = 0; - init_data(); - reset_stats(); - - if ( world_mpi_rank == world_server_mpi_rank ) { - - if ( ! server_main() ) { - - /* some error occured in the server -- report failure */ - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: server_main() failed.\n", - world_mpi_rank, fcn_name); - } - } - } - else /* run the clients */ - { - if ( ! setup_cache_for_test(&fid, &file_ptr, &cache_ptr) ) { - - nerrors++; - fid = -1; - cache_ptr = NULL; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: setup_cache_for_test() failed.\n", - world_mpi_rank, fcn_name); - } - } - - - min_count = 100 * (file_mpi_rank % 4); - max_count = min_count + 50; - - for ( i = 0; i < (virt_num_data_entries / 4); i++ ) - { - insert_entry(cache_ptr, file_ptr, i, H5AC2__NO_FLAGS_SET); - - if ( i > 100 ) { - - lock_and_unlock_random_entries(cache_ptr, file_ptr, - (i - 100), i, - min_count, max_count); - } - } - - min_count = 10 * (file_mpi_rank % 4); - max_count = min_count + 100; - - for ( i = (virt_num_data_entries / 4); - i < (virt_num_data_entries / 2); - i++ ) - { - if ( i % 2 == 0 ) { - - insert_entry(cache_ptr, file_ptr, i, H5AC2__NO_FLAGS_SET); - - } else { - - /* Insert some entries pinned, and then unpin them - * immediately. We have tested pinned entries elsewhere, - * so it should be sufficient to verify that the - * entries are in fact pinned (which unpin_entry() should do). - */ - insert_entry(cache_ptr, file_ptr, i, H5C2__PIN_ENTRY_FLAG); - unpin_entry(cache_ptr, file_ptr, i, TRUE, FALSE, FALSE); - } - - if ( i % 59 == 0 ) { - - hbool_t dirty = ( (i % 2) == 0); - - if ( data[i].local_pinned ) { - unpin_entry(cache_ptr, file_ptr, i, FALSE, FALSE, FALSE); - } - - pin_entry(cache_ptr, file_ptr, i, TRUE, dirty); - - HDassert( !dirty || data[i].header.is_dirty ); - HDassert( data[i].header.is_pinned ); - HDassert( data[i].global_pinned ); - HDassert( ! data[i].local_pinned ); - } - - if ( i > 100 ) { - - lock_and_unlock_random_entries(cache_ptr, file_ptr, - (i - 100), i, - min_count, max_count); - } - - local_pin_and_unpin_random_entries(cache_ptr, file_ptr, 0, - (virt_num_data_entries / 4), - 0, (file_mpi_rank + 2)); - } - - - /* flush the file to be sure that we have no problems flushing - * pinned entries - */ - if ( H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0 ) { - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: H5Fflush() failed.\n", - world_mpi_rank, fcn_name); - } - } - - - min_idx = 0; - max_idx = (((virt_num_data_entries / 10) / 4) * - ((file_mpi_rank % 4) + 1)) - 1; - - for ( i = (virt_num_data_entries / 2) - 1; i >= 0; i-- ) - { - if ( ( i >= (virt_num_data_entries / 4) ) && ( i % 59 == 0 ) ) { - - hbool_t via_unprotect = ( (((unsigned)i) & 0x02) == 0 ); - hbool_t dirty = ( (((unsigned)i) & 0x04) == 0 ); - - HDassert( data[i].global_pinned ); - HDassert( ! data[i].local_pinned ); - - unpin_entry(cache_ptr, file_ptr, i, TRUE, dirty, via_unprotect); - } - - if ( i % 2 == 0 ) { - - lock_entry(cache_ptr, file_ptr, i); - unlock_entry(cache_ptr, file_ptr, i, H5AC2__NO_FLAGS_SET); - lock_and_unlock_random_entries(cache_ptr, file_ptr, - min_idx, max_idx, 0, 100); - } - } - - min_idx = 0; - max_idx = (((virt_num_data_entries / 10) / 8) * - ((file_mpi_rank % 4) + 1)) - 1; - - for ( i = 0; i < (virt_num_data_entries / 2); i+=2 ) - { - lock_entry(cache_ptr, file_ptr, i); - unlock_entry(cache_ptr, file_ptr, i, H5AC2__DIRTIED_FLAG); - lock_and_unlock_random_entries(cache_ptr, file_ptr, - min_idx, max_idx, 0, 100); - } - - /* we can't rename pinned entries, so release any local pins now. */ - local_unpin_all_entries(cache_ptr, file_ptr, FALSE); - - min_count = 10 * (file_mpi_rank % 4); - max_count = min_count + 100; - - /* rename the first half of the entries... */ - for ( i = 0; i < (virt_num_data_entries / 2); i++ ) - { - lock_entry(cache_ptr, file_ptr, i); - unlock_entry(cache_ptr, file_ptr, i, H5AC2__NO_FLAGS_SET); - rename_entry(cache_ptr, file_ptr, i, - (i + (virt_num_data_entries / 2))); - lock_and_unlock_random_entries(cache_ptr, file_ptr, 0, - (virt_num_data_entries / 20), - min_count, max_count); - } - - /* ...and then rename them back. */ - for ( i = (virt_num_data_entries / 2) - 1; i >= 0; i-- ) - { - lock_entry(cache_ptr, file_ptr, i); - unlock_entry(cache_ptr, file_ptr, i, H5AC2__DIRTIED_FLAG); - rename_entry(cache_ptr, file_ptr, i, - (i + (virt_num_data_entries / 2))); - lock_and_unlock_random_entries(cache_ptr, file_ptr, 0, - (virt_num_data_entries / 40), - min_count, max_count); - } - - /* finally, do some dirty lock/unlocks while we give the cache - * a chance t reduce its size. - */ - min_count = 100 * (file_mpi_rank % 4); - max_count = min_count + 100; - - for ( i = 0; i < (virt_num_data_entries / 2); i+=2 ) - { - lock_entry(cache_ptr, file_ptr, i); - unlock_entry(cache_ptr, file_ptr, i, H5AC2__DIRTIED_FLAG); - - if ( i > 100 ) { - - lock_and_unlock_random_entries(cache_ptr, file_ptr, - (i - 100), i, - min_count, max_count); - } - } - - if ( fid >= 0 ) { - - if ( ! take_down_cache(fid, cache_ptr) ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: take_down_cache() failed.\n", - world_mpi_rank, fcn_name); - } - } - } - - /* verify that all instance of datum are back where the started - * and are clean. - */ - - for ( i = 0; i < NUM_DATA_ENTRIES; i++ ) - { - HDassert( data_index[i] == i ); - HDassert( ! (data[i].dirty) ); - } - - /* compose the done message */ - mssg.req = DONE_REQ_CODE; - mssg.src = world_mpi_rank; - mssg.dest = world_server_mpi_rank; - mssg.mssg_num = -1; /* set by send function */ - mssg.base_addr = 0; /* not used */ - mssg.len = 0; /* not used */ - mssg.ver = 0; /* not used */ - mssg.magic = MSSG_MAGIC; - - if ( success ) { - - - success = send_mssg(&mssg, FALSE); - - if ( ! success ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: send_mssg() failed on done.\n", - world_mpi_rank, fcn_name); - } - } - } - } - - max_nerrors = get_max_nerrors(); - - if ( world_mpi_rank == 0 ) { - - if ( max_nerrors == 0 ) { - - PASSED(); - - } else { - - failures++; - H5_FAILED(); - } - } - - success = ( ( success ) && ( max_nerrors == 0 ) ); - - return(success); - -} /* smoke_check_4() */ - - -/***************************************************************************** - * - * Function: smoke_check_5() - * - * Purpose: Similar to smoke check 1, but modified to verify that - * H5AC2_mark_pinned_or_protected_entry_dirty() works in - * the parallel case. - * - * Return: Success: TRUE - * - * Failure: FALSE - * - * Programmer: JRM -- 5/18/06 - * - * Modifications: - * - * JRM -- 7/12/06 - * Added test code for H5AC2_expunge_entry() and - * H5AC2_resize_pinned_entry(). - * - *****************************************************************************/ - -hbool_t -smoke_check_5(void) -{ - const char * fcn_name = "smoke_check_5()"; - hbool_t show_progress = FALSE; - hbool_t show_detailed_progress = FALSE; - hbool_t success = TRUE; - int i; - int max_nerrors; - int mile_stone = 1; - hid_t fid = -1; - H5F_t * file_ptr = NULL; - H5C2_t * cache_ptr = NULL; - struct mssg_t mssg; - - if ( world_mpi_rank == 0 ) { - - TESTING("smoke check #5"); - } - - nerrors = 0; - init_data(); - reset_stats(); - - if ( show_progress ) { /* 1 */ - HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", - world_mpi_rank, fcn_name, mile_stone++, (int)success); - fflush(stdout); - } - - if ( world_mpi_rank == world_server_mpi_rank ) { - - if ( show_progress ) { /* 2 */ - HDfprintf(stdout, "%d:%s - %0ds -- success = %d\n", - world_mpi_rank, fcn_name, mile_stone++, (int)success); - fflush(stdout); - } - - if ( ! server_main() ) { - - /* some error occured in the server -- report failure */ - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: server_main() failed.\n", - world_mpi_rank, fcn_name); - } - } - - if ( show_progress ) { /* 3 */ - HDfprintf(stdout, "%d:%s - %0ds -- success = %d\n", - world_mpi_rank, fcn_name, mile_stone++, (int)success); - fflush(stdout); - } - } - else /* run the clients */ - { - if ( show_progress ) { /* 2 */ - HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", - world_mpi_rank, fcn_name, mile_stone++, (int)success); - fflush(stdout); - } - - if ( ! setup_cache_for_test(&fid, &file_ptr, &cache_ptr) ) { - - nerrors++; - fid = -1; - cache_ptr = NULL; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: setup_cache_for_test() failed.\n", - world_mpi_rank, fcn_name); - } - } - - if ( show_progress ) { /* 3 */ - HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", - world_mpi_rank, fcn_name, mile_stone++, (int)success); - fflush(stdout); - } - - for ( i = 0; i < (virt_num_data_entries / 2); i++ ) - { - insert_entry(cache_ptr, file_ptr, i, H5AC2__NO_FLAGS_SET); - } - - if ( show_progress ) { /* 4 */ - HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", - world_mpi_rank, fcn_name, mile_stone++, (int)success); - fflush(stdout); - } - - /* flush the file so we can lock known clean entries. */ - if ( H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0 ) { - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: H5Fflush() failed.\n", - world_mpi_rank, fcn_name); - } - } - - if ( show_progress ) { /* 5 */ - HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", - world_mpi_rank, fcn_name, mile_stone++, (int)success); - fflush(stdout); - } - - for ( i = 0; i < (virt_num_data_entries / 4); i++ ) - { - if ( show_detailed_progress ) - { - HDfprintf(stdout, "%d:(lock %d)\n", world_mpi_rank, i); - fflush(stdout); - } - lock_entry(cache_ptr, file_ptr, i); - - if ( i % 2 == 0 ) - { - if ( show_detailed_progress ) - { - HDfprintf(stdout, "%d:(mpoped %d)\n", world_mpi_rank, i); - fflush(stdout); - } - mark_pinned_or_protected_entry_dirty(cache_ptr, file_ptr, i); - } - - if ( show_detailed_progress ) - { - HDfprintf(stdout, "%d:(unlock %d)\n", world_mpi_rank, i); - fflush(stdout); - } - unlock_entry(cache_ptr, file_ptr, i, H5AC2__NO_FLAGS_SET); - - if ( i % 2 == 1 ) - { - if ( i % 4 == 1 ) { - - if ( show_detailed_progress ) - { - HDfprintf(stdout, "%d:(lock %d)\n", world_mpi_rank, i); - fflush(stdout); - } - lock_entry(cache_ptr, file_ptr, i); - if ( show_detailed_progress ) - { - HDfprintf(stdout, "%d:(unlock %d)\n", world_mpi_rank, i); - fflush(stdout); - } - unlock_entry(cache_ptr, file_ptr, i, H5AC2__DIRTIED_FLAG); - } - - if ( show_detailed_progress ) - { - HDfprintf(stdout, "%d:(expunge %d)\n", world_mpi_rank, i); - fflush(stdout); - } - expunge_entry(cache_ptr, file_ptr, i); - } - } - - if ( show_progress ) { /* 6 */ - HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", - world_mpi_rank, fcn_name, mile_stone++, (int)success); - fflush(stdout); - } - - for ( i = (virt_num_data_entries / 2) - 1; - i >= (virt_num_data_entries / 4); - i-- ) - { - pin_entry(cache_ptr, file_ptr, i, TRUE, FALSE); - - if ( i % 2 == 0 ) - { - if ( i % 8 <= 4 ) { - - resize_entry(cache_ptr, file_ptr, i, data[i].len / 2); - } - - if ( i % 4 == 0 ) - { - mark_pinned_or_protected_entry_dirty(cache_ptr, - file_ptr, i); - } - else - { - mark_pinned_entry_dirty(cache_ptr, file_ptr, i, - FALSE, (size_t)0); - } - - if ( i % 8 <= 4 ) { - - resize_entry(cache_ptr, file_ptr, i, data[i].len); - } - } - - unpin_entry(cache_ptr, file_ptr, i, TRUE, FALSE, FALSE); - } - - if ( show_progress ) { /* 7 */ - HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", - world_mpi_rank, fcn_name, mile_stone++, (int)success); - fflush(stdout); - } - - if ( fid >= 0 ) { - - if ( ! take_down_cache(fid, cache_ptr) ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: take_down_cache() failed.\n", - world_mpi_rank, fcn_name); - } - } - } - - if ( show_progress ) { /* 8 */ - HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", - world_mpi_rank, fcn_name, mile_stone++, (int)success); - fflush(stdout); - } - - /* verify that all instance of datum are back where the started - * and are clean. - */ - - for ( i = 0; i < NUM_DATA_ENTRIES; i++ ) - { - HDassert( data_index[i] == i ); - HDassert( ! (data[i].dirty) ); - } - - if ( show_progress ) { /* 9 */ - HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", - world_mpi_rank, fcn_name, mile_stone++, (int)success); - fflush(stdout); - } - - /* compose the done message */ - mssg.req = DONE_REQ_CODE; - mssg.src = world_mpi_rank; - mssg.dest = world_server_mpi_rank; - mssg.mssg_num = -1; /* set by send function */ - mssg.base_addr = 0; /* not used */ - mssg.len = 0; /* not used */ - mssg.ver = 0; /* not used */ - mssg.magic = MSSG_MAGIC; - - if ( success ) { - - success = send_mssg(&mssg, FALSE); - - if ( ! success ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: send_mssg() failed on done.\n", - world_mpi_rank, fcn_name); - } - } - } - - if ( show_progress ) { /* 10 */ - HDfprintf(stdout, "%d:%s - %0d -- success = %d\n", - world_mpi_rank, fcn_name, mile_stone++, (int)success); - fflush(stdout); - } - } - - max_nerrors = get_max_nerrors(); - - if ( world_mpi_rank == 0 ) { - - if ( max_nerrors == 0 ) { - - PASSED(); - - } else { - - failures++; - H5_FAILED(); - } - } - - success = ( ( success ) && ( max_nerrors == 0 ) ); - - return(success); - -} /* smoke_check_5() */ - - -/***************************************************************************** - * - * Function: trace_file_check() - * - * Purpose: A basic test of the trace file capability. In essence, - * we invoke all operations that generate trace file output, - * and then verify that the expected output was generated. - * - * Note that the trace file is currently implemented at the - * H5AC2 level, so all calls have to go through H5AC2. Thus it - * is more convenient to test trace file capabilities in the - * parallel cache test which works at the H5AC2 level, instead - * of in the serial test code which does everything at the - * H5C2 level. - * - * The function must test trace file output in the following - * functions: - * - * - H5AC2_flush() - * - H5AC2_set() - * - H5AC2_mark_pinned_entry_dirty() - * - H5AC2_mark_pinned_or_protected_entry_dirty() - * H5AC2_rename() - * - H5AC2_pin_protected_entry() - * - H5AC2_protect() - * - H5AC2_unpin_entry() - * - H5AC2_unprotect() - * - H5AC2_set_cache_auto_resize_config() - * - H5AC2_expunge_entry() - * - H5AC2_resize_pinned_entry() - * - * This test is skipped if H5_METADATA_TRACE_FILE is undefined. - * - * Return: Success: TRUE - * - * Failure: FALSE - * - * Programmer: JRM -- 6/13/06 - * - * Modifications: - * - * JRM -- 7/11/06 - * Updated for H5AC2_expunge_entry() and - * H5AC2_resize_pinned_entry(). - * - * JRM -- 2/14/08 - * Updated for changes in H5AC2_set_cache_auto_resize_config - * to support the new flash cache size increment code. - * - *****************************************************************************/ - -hbool_t -trace_file_check(void) -{ - hbool_t success = TRUE; - -#ifdef H5_METADATA_TRACE_FILE - - const char * fcn_name = "trace_file_check()"; - const char * expected_output[] = - { - "### HDF5 metadata cache trace file version 2 ###\n", - "H5AC2_set_cache_auto_resize_config 1 0 1 0 \"t_cache2_trace.txt\" 1 0 1048576 0.500000 16777216 1048576 50000 1 0.900000 2.000000 1 4194304 1 1.000000 0.250000 3 0.999000 0.900000 1 1048576 3 1 0.100000 262144 0\n", - "H5AC2_set 0x400 2 16 0x0 2 0\n", - "H5AC2_set 0x402 2 16 0x0 2 0\n", - "H5AC2_set 0x404 4 16 0x0 4 0\n", - "H5AC2_set 0x408 6 16 0x0 6 0\n", - "H5AC2_protect 0x400 2 16 H5AC2_WRITE 2 1\n", - "H5AC2_mark_pinned_or_protected_entry_dirty 0x400 0\n", - "H5AC2_unprotect 0x400 16 2 0 0\n", - "H5AC2_protect 0x402 2 16 H5AC2_WRITE 2 1\n", - "H5AC2_pin_protected_entry 0x402 0\n", - "H5AC2_unprotect 0x402 16 2 0 0\n", - "H5AC2_unpin_entry 0x402 0\n", - "H5AC2_expunge_entry 0x402 16 0\n", - "H5AC2_protect 0x404 4 16 H5AC2_WRITE 4 1\n", - "H5AC2_pin_protected_entry 0x404 0\n", - "H5AC2_unprotect 0x404 16 4 0 0\n", - "H5AC2_mark_pinned_entry_dirty 0x404 0 0 0\n", - "H5AC2_resize_pinned_entry 0x404 2 0\n", - "H5AC2_resize_pinned_entry 0x404 4 0\n", - "H5AC2_unpin_entry 0x404 0\n", - "H5AC2_rename 0x400 0x8e65 16 0\n", - "H5AC2_rename 0x8e65 0x400 16 0\n", - "H5AC2_flush 0x0 0\n", - NULL - }; - char buffer[256]; - char trace_file_name[64]; - hbool_t done = FALSE; - int i; - int max_nerrors; - int expected_line_len; - int actual_line_len; - hid_t fid = -1; - H5F_t * file_ptr = NULL; - H5C2_t * cache_ptr = NULL; - FILE * trace_file_ptr = NULL; - H5AC2_cache_config_t config; - struct mssg_t mssg; - -#endif /* H5_METADATA_TRACE_FILE */ - - if ( world_mpi_rank == 0 ) { - - TESTING("trace file collection"); - } - -#ifdef H5_METADATA_TRACE_FILE - - nerrors = 0; - init_data(); - reset_stats(); - - if ( world_mpi_rank == world_server_mpi_rank ) { - - if ( ! server_main() ) { - - /* some error occured in the server -- report failure */ - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: server_main() failed.\n", - world_mpi_rank, fcn_name); - } - } - } - else /* run the clients */ - { - - if ( ! setup_cache_for_test(&fid, &file_ptr, &cache_ptr) ) { - - nerrors++; - fid = -1; - cache_ptr = NULL; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: setup_cache_for_test() failed.\n", - world_mpi_rank, fcn_name); - } - } - - if ( nerrors == 0 ) { - - config.version = H5AC2__CURR_CACHE_CONFIG_VERSION; - - if ( H5AC2_get_cache_auto_resize_config(cache_ptr, &config) - != SUCCEED ) { - - nerrors++; - HDfprintf(stdout, - "%d:%s: H5AC2_get_cache_auto_resize_config() failed.\n", - world_mpi_rank, fcn_name); - - } else { - - config.open_trace_file = TRUE; - strcpy(config.trace_file_name, "t_cache2_trace.txt"); - - if ( H5AC2_set_cache_auto_resize_config(file_ptr, &config) - != SUCCEED ) { - - nerrors++; - HDfprintf(stdout, - "%d:%s: H5AC2_set_cache_auto_resize_config() failed.\n", - world_mpi_rank, fcn_name); - } - } - } - - insert_entry(cache_ptr, file_ptr, 0, H5AC2__NO_FLAGS_SET); - insert_entry(cache_ptr, file_ptr, 1, H5AC2__NO_FLAGS_SET); - insert_entry(cache_ptr, file_ptr, 2, H5AC2__NO_FLAGS_SET); - insert_entry(cache_ptr, file_ptr, 3, H5AC2__NO_FLAGS_SET); - - lock_entry(cache_ptr, file_ptr, 0); - mark_pinned_or_protected_entry_dirty(cache_ptr, file_ptr, 0); - unlock_entry(cache_ptr, file_ptr, 0, H5AC2__NO_FLAGS_SET); - - lock_entry(cache_ptr, file_ptr, 1); - pin_protected_entry(cache_ptr, file_ptr, 1, TRUE); - unlock_entry(cache_ptr, file_ptr, 1, H5AC2__NO_FLAGS_SET); - unpin_entry(cache_ptr, file_ptr, 1, TRUE, FALSE, FALSE); - - expunge_entry(cache_ptr,file_ptr, 1); - - lock_entry(cache_ptr, file_ptr, 2); - pin_protected_entry(cache_ptr, file_ptr, 2, TRUE); - unlock_entry(cache_ptr, file_ptr, 2, H5AC2__NO_FLAGS_SET); - mark_pinned_entry_dirty(cache_ptr, file_ptr, 2, FALSE, 0); - resize_entry(cache_ptr, file_ptr, 2, data[2].len / 2); - resize_entry(cache_ptr, file_ptr, 2, data[2].len); - unpin_entry(cache_ptr, file_ptr, 2, TRUE, FALSE, FALSE); - - rename_entry(cache_ptr, file_ptr, 0, 20); - rename_entry(cache_ptr, file_ptr, 0, 20); - - if ( H5Fflush(fid, H5F_SCOPE_GLOBAL) < 0 ) { - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: H5Fflush() failed.\n", - world_mpi_rank, fcn_name); - } - } - - if ( nerrors == 0 ) { - - config.version = H5AC2__CURR_CACHE_CONFIG_VERSION; - - if ( H5AC2_get_cache_auto_resize_config(cache_ptr, &config) - != SUCCEED ) { - - nerrors++; - HDfprintf(stdout, - "%d:%s: H5AC2_get_cache_auto_resize_config() failed.\n", - world_mpi_rank, fcn_name); - - } else { - - config.open_trace_file = FALSE; - config.close_trace_file = TRUE; - config.trace_file_name[0] = '\0'; - - if ( H5AC2_set_cache_auto_resize_config(file_ptr, &config) - != SUCCEED ) { - - nerrors++; - HDfprintf(stdout, - "%d:%s: H5AC2_set_cache_auto_resize_config() failed.\n", - world_mpi_rank, fcn_name); - } - } - } - - if ( fid >= 0 ) { - - if ( ! take_down_cache(fid, cache_ptr) ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: take_down_cache() failed.\n", - world_mpi_rank, fcn_name); - } - } - } - - /* verify that all instance of datum are back where the started - * and are clean. - */ - - for ( i = 0; i < NUM_DATA_ENTRIES; i++ ) - { - HDassert( data_index[i] == i ); - HDassert( ! (data[i].dirty) ); - } - - /* compose the done message */ - mssg.req = DONE_REQ_CODE; - mssg.src = world_mpi_rank; - mssg.dest = world_server_mpi_rank; - mssg.mssg_num = -1; /* set by send function */ - mssg.base_addr = 0; /* not used */ - mssg.len = 0; /* not used */ - mssg.ver = 0; /* not used */ - mssg.magic = MSSG_MAGIC; - - if ( success ) { - - success = send_mssg(&mssg, FALSE); - - if ( ! success ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: send_mssg() failed on done.\n", - world_mpi_rank, fcn_name); - } - } - } - - if ( nerrors == 0 ) { - - sprintf(trace_file_name, "t_cache2_trace.txt.%d", - (int)file_mpi_rank); - - if ( (trace_file_ptr = HDfopen(trace_file_name, "r")) == NULL ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: HDfopen failed.\n", - world_mpi_rank, fcn_name); - } - } - } - - i = 0; - while ( ( nerrors == 0 ) && ( ! done ) ) - { - if ( expected_output[i] == NULL ) { - - expected_line_len = 0; - - } else { - - expected_line_len = HDstrlen(expected_output[i]); - } - - if ( HDfgets(buffer, 255, trace_file_ptr) != NULL ) { - - actual_line_len = strlen(buffer); - - } else { - - actual_line_len = 0; - } - - if ( ( actual_line_len == 0 ) && ( expected_line_len == 0 ) ) { - - done = TRUE; - - } else if ( ( actual_line_len != expected_line_len ) || - ( HDstrcmp(buffer, expected_output[i]) != 0 ) ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, - "%d:%s: Unexpected data in trace file line %d.\n", - world_mpi_rank, fcn_name, i); - HDfprintf(stdout, "%d:%s: expected = \"%s\" %d\n", - world_mpi_rank, fcn_name, expected_output[i], - expected_line_len); - HDfprintf(stdout, "%d:%s: actual = \"%s\" %d\n", - world_mpi_rank, fcn_name, buffer, - actual_line_len); - } - } else { - i++; - } - } - - if ( trace_file_ptr != NULL ) { - - HDfclose(trace_file_ptr); - trace_file_ptr = NULL; -#if 1 - HDremove(trace_file_name); -#endif - } - } - - max_nerrors = get_max_nerrors(); - - if ( world_mpi_rank == 0 ) { - - if ( max_nerrors == 0 ) { - - PASSED(); - - } else { - - failures++; - H5_FAILED(); - } - } - - success = ( ( success ) && ( max_nerrors == 0 ) ); - -#else /* H5_METADATA_TRACE_FILE */ - - if ( world_mpi_rank == 0 ) { - - SKIPPED(); - - HDfprintf(stdout, " trace file support disabled.\n"); - } - -#endif /* H5_METADATA_TRACE_FILE */ - - return(success); - -} /* trace_file_check() */ - - -/***************************************************************************** - * - * Function: main() - * - * Purpose: Main function for the parallel cache test. - * - * Return: Success: 0 - * - * Failure: 1 - * - * Programmer: JRM -- 12/23/05 - * - * Modifications: - * - * None. - * - *****************************************************************************/ - -int -main(int argc, char **argv) -{ - const char * fcn_name = "main()"; - int express_test; - unsigned u; - int mpi_size; - int mpi_rank; - int max_nerrors; - - MPI_Init(&argc, &argv); - MPI_Comm_size(MPI_COMM_WORLD, &mpi_size); - MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank); - - world_mpi_size = mpi_size; - world_mpi_rank = mpi_rank; - world_server_mpi_rank = mpi_size - 1; - world_mpi_comm = MPI_COMM_WORLD; - - H5open(); - - express_test = do_express_test(); -#if 0 /* JRM */ - express_test = 0; -#endif /* JRM */ - if ( express_test ) { - - virt_num_data_entries = EXPRESS_VIRT_NUM_DATA_ENTRIES; - - } else { - - virt_num_data_entries = STD_VIRT_NUM_DATA_ENTRIES; - } - -#ifdef H5_HAVE_MPE - if ( MAINPROCESS ) { printf(" Tests compiled for MPE.\n"); } - virt_num_data_entries = MPE_VIRT_NUM_DATA_ENTIES; -#endif /* H5_HAVE_MPE */ - - - if (MAINPROCESS){ - printf("===================================\n"); - printf("Parallel metadata cache tests\n"); - printf(" mpi_size = %d\n", mpi_size); - printf(" express_test = %d\n", express_test); - printf("===================================\n"); - } - - if ( mpi_size < 3 ) { - - if ( MAINPROCESS ) { - - printf(" Need at least 3 processes. Exiting.\n"); - } - goto finish; - } - - set_up_file_communicator(); - - setup_derived_types(); - - /* h5_fixname() will hang some processes don't participate. - * - * Thus we set up the fapl global with the world communicator, - * make our calls to h5_fixname(), discard the fapl, and then - * create it again with the file communicator. - */ - - /* setup file access property list with the world communicator */ - if ( FAIL == (fapl = H5Pcreate(H5P_FILE_ACCESS)) ) { - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: H5Pcreate() failed 1.\n", - world_mpi_rank, fcn_name); - } - } - - if ( H5Pset_fapl_mpio(fapl, world_mpi_comm, MPI_INFO_NULL) < 0 ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: H5Pset_fapl_mpio() failed 1.\n", - world_mpi_rank, fcn_name); - } - } - - /* fix the file names */ - for ( u = 0; u < sizeof(FILENAME) / sizeof(FILENAME[0]) - 1; ++u ) - { - if ( h5_fixname(FILENAME[u], fapl, filenames[u], - sizeof(filenames[u])) == NULL ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: h5_fixname() failed.\n", - world_mpi_rank, fcn_name); - } - break; - } - } - - /* close the fapl before we set it up again */ - if ( H5Pclose(fapl) < 0 ) { - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: H5Pclose() failed.\n", - world_mpi_rank, fcn_name); - } - } - - /* now create the fapl again, excluding the server process. */ - if ( world_mpi_rank != world_server_mpi_rank ) { - - /* setup file access property list */ - if ( FAIL == (fapl = H5Pcreate(H5P_FILE_ACCESS)) ) { - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: H5Pcreate() failed 2.\n", - world_mpi_rank, fcn_name); - } - } - - if ( H5Pset_fapl_mpio(fapl, file_mpi_comm, MPI_INFO_NULL) < 0 ) { - - nerrors++; - if ( verbose ) { - HDfprintf(stdout, "%d:%s: H5Pset_fapl_mpio() failed 2.\n", - world_mpi_rank, fcn_name); - } - } - } - - setup_rand(); - - max_nerrors = get_max_nerrors(); - - if ( max_nerrors != 0 ) { - - /* errors in setup -- no point in continuing */ - - if ( world_mpi_rank == 0 ) { - - HDfprintf(stdout, "Errors in test initialization. Exiting.\n"); - } - goto finish; - } - - /* run the tests */ -#if 1 - server_smoke_check(); -#endif -#if 1 - smoke_check_1(); -#endif -#if 1 - smoke_check_2(); -#endif -#if 1 - smoke_check_3(); -#endif -#if 1 - smoke_check_4(); -#endif -#if 1 - smoke_check_5(); -#endif -#if 1 - trace_file_check(); -#endif - -finish: - /* make sure all processes are finished before final report, cleanup - * and exit. - */ - MPI_Barrier(MPI_COMM_WORLD); - if (MAINPROCESS){ /* only process 0 reports */ - printf("===================================\n"); - if (failures){ - printf("***metadata cache tests detected %d failures***\n", - failures); - } - else{ - printf("metadata cache tests finished with no failures\n"); - } - printf("===================================\n"); - } - - /* close HDF5 library */ - H5close(); - - /* MPI_Finalize must be called AFTER H5close which may use MPI calls */ - MPI_Finalize(); - - /* cannot just return (failures) because exit code is limited to 1byte */ - return(failures != 0); -} - diff --git a/tools/h5recover/README b/tools/h5recover/README index 3ab469f..f376387 100644 --- a/tools/h5recover/README +++ b/tools/h5recover/README @@ -20,7 +20,7 @@ position of those error codes are out of sync with the error messages from the H5E system. For example, ======= non-standard error output =============== - H5C2_begin_journaling: H5C2_mark_journaling_in_progress() failed. - H5C2_begin_transaction H5C2_begin_journaling() failed. + H5C_begin_journaling: H5C_mark_journaling_in_progress() failed. + H5C_begin_transaction H5C_begin_journaling() failed. ======= end ============== -AKC 2008/6/17- diff --git a/tools/h5recover/enable_journaling.c b/tools/h5recover/enable_journaling.c index df83de8..297625c 100755 --- a/tools/h5recover/enable_journaling.c +++ b/tools/h5recover/enable_journaling.c @@ -79,10 +79,10 @@ helppage(void) int set_journal(hid_t faccpl, const char * journalname) { - H5AC2_jnl_config_t jnl_config; + H5AC_jnl_config_t jnl_config; /* get current journaling configuration */ - jnl_config.version = H5AC2__CURR_JNL_CONFIG_VER; + jnl_config.version = H5AC__CURR_JNL_CONFIG_VER; if ( H5Pget_jnl_config(faccpl, &jnl_config) < 0 ) { fprintf(stderr, "H5Pget_jnl_config on faccpl failed\n"); diff --git a/tools/h5recover/h5recover.c b/tools/h5recover/h5recover.c index 8f23a64..b2770be 100644 --- a/tools/h5recover/h5recover.c +++ b/tools/h5recover/h5recover.c @@ -15,9 +15,9 @@ #include +#define H5C_PACKAGE /* suppress error about including H5Cpkg */ #define H5F_PACKAGE /* suppress error about including H5Fpkg */ #define H5O_PACKAGE /* suppress error about including H5Opkg */ -#define H5C2_PACKAGE /* suppress error about including H5C2pkg */ #define _XOPEN_SOURCE 500 /* for pread() & pwrite() */ @@ -30,9 +30,9 @@ #include #include #include +#include "H5Cpkg.h" #include "H5Fpkg.h" #include "H5Opkg.h" -#include "H5C2pkg.h" #define H5F_MAX_SUPERBLOCK_SIZE 134 @@ -642,7 +642,7 @@ get_sb_base_addr(int fd, * * Note that the jnl_file_name_ptr parameter is presumed to * point to a buffer of char of length at least - * H5C2__MAX_JOURNAL_FILE_NAME_LEN + 1. + * H5C__MAX_JOURNAL_FILE_NAME_LEN + 1. * * Return: TRUE if the supplied path references an HDF5 file that * is marked as having journaling in progress. @@ -689,7 +689,7 @@ get_journaling_status(char * file_path_ptr, const char * fcn_name = "get_journaling_status():"; const char * indent1 = ""; const char * indent2 = "\t"; - char jnl_file_name[H5C2__MAX_JOURNAL_FILE_NAME_LEN + 1]; + char jnl_file_name[H5C__MAX_JOURNAL_FILE_NAME_LEN + 1]; hbool_t journaling_enabled = FALSE; hbool_t success = TRUE; FILE * err_file_ptr = stderr; @@ -2210,7 +2210,7 @@ get_mdj_msg_addr__scan_chunk(int fd, * * Note also that jnl_file_name is presumed to point to a * buffer of char of length at least - * H5C2__MAX_JOURNAL_FILE_NAME_LEN + 1. + * H5C__MAX_JOURNAL_FILE_NAME_LEN + 1. * * If any errors are detected, return FALSE. * In this case, *enabled_ptr, *magic_ptr and the @@ -2238,7 +2238,7 @@ get_mdj_msg_addr__scan_chunk(int fd, 4 + /* magic -- sizeof(int32_t) */ \ 4 ) /* jnl file path len -- sizeof(int32_t) */ -#define MAX_MDJ_MSG_LEN (MDJ_MSG_HDR_LEN + H5C2__MAX_JOURNAL_FILE_NAME_LEN + 1) +#define MAX_MDJ_MSG_LEN (MDJ_MSG_HDR_LEN + H5C__MAX_JOURNAL_FILE_NAME_LEN + 1) hbool_t get_mdj_msg_data(int fd, @@ -2358,7 +2358,7 @@ get_mdj_msg_data(int fd, } if ( ( path_len <= 0 ) || - ( path_len > H5C2__MAX_JOURNAL_FILE_NAME_LEN ) ) { + ( path_len > H5C__MAX_JOURNAL_FILE_NAME_LEN ) ) { success = FALSE; @@ -3119,7 +3119,7 @@ get_jnl_header_info(char * file_path_ptr, version_tag = HDstrtok(&(buf[1]), " "); if ( ( version_tag == NULL ) || - ( strcmp(version_tag, H5C2_JNL__VER_NUM_TAG) != 0 ) ) { + ( strcmp(version_tag, H5C_JNL__VER_NUM_TAG) != 0 ) ) { success = FALSE; @@ -3156,7 +3156,7 @@ get_jnl_header_info(char * file_path_ptr, target_file_tag = HDstrtok(NULL, " "); if ( ( target_file_tag == NULL ) || - ( strcmp(target_file_tag, H5C2_JNL__TGT_FILE_NAME_TAG) != 0 ) ) { + ( strcmp(target_file_tag, H5C_JNL__TGT_FILE_NAME_TAG) != 0 ) ) { success = FALSE; @@ -3199,7 +3199,7 @@ get_jnl_header_info(char * file_path_ptr, journal_magic_tag = HDstrtok(NULL, " "); if ( ( journal_magic_tag == NULL ) || - ( strcmp(journal_magic_tag, H5C2_JNL__JNL_MAGIC_TAG) != 0 ) ) { + ( strcmp(journal_magic_tag, H5C_JNL__JNL_MAGIC_TAG) != 0 ) ) { success = FALSE; @@ -3242,7 +3242,7 @@ get_jnl_header_info(char * file_path_ptr, creation_date_tag = HDstrtok(NULL, " "); if ( ( creation_date_tag == NULL ) || - ( strcmp(creation_date_tag, H5C2_JNL__CREATION_DATE_TAG) != 0 ) ) { + ( strcmp(creation_date_tag, H5C_JNL__CREATION_DATE_TAG) != 0 ) ) { success = FALSE; @@ -3273,7 +3273,7 @@ get_jnl_header_info(char * file_path_ptr, human_readable_tag = HDstrtok(NULL, " "); if ( ( human_readable_tag == NULL ) || - ( strcmp(human_readable_tag, H5C2_JNL__HUMAN_READABLE_TAG) + ( strcmp(human_readable_tag, H5C_JNL__HUMAN_READABLE_TAG) != 0 ) ) { success = FALSE; @@ -3329,7 +3329,7 @@ get_jnl_header_info(char * file_path_ptr, offset_width_tag = HDstrtok(NULL, " "); if ( ( offset_width_tag == NULL ) || - ( strcmp(offset_width_tag, H5C2_JNL__OFFSET_WIDTH_TAG) != 0 ) ) { + ( strcmp(offset_width_tag, H5C_JNL__OFFSET_WIDTH_TAG) != 0 ) ) { success = FALSE; @@ -3382,7 +3382,7 @@ get_jnl_header_info(char * file_path_ptr, length_width_tag = HDstrtok(NULL, " "); if ( ( length_width_tag == NULL ) || - ( strcmp(length_width_tag, H5C2_JNL__LENGTH_WIDTH_TAG) != 0 ) ) { + ( strcmp(length_width_tag, H5C_JNL__LENGTH_WIDTH_TAG) != 0 ) ) { success = FALSE; @@ -3846,7 +3846,7 @@ examine_files(char * hdf5_file_name, /* const char * fcn_name = "examine_files()"; */ const char * indent1 = "\t"; const char * indent2 = "\t\t"; - char jnl_file_name[H5C2__MAX_JOURNAL_FILE_NAME_LEN + 1]; + char jnl_file_name[H5C__MAX_JOURNAL_FILE_NAME_LEN + 1]; char jnl_target_file_name[MAX_PATH_LEN + 1]; hbool_t error = FALSE; hbool_t journal_can_be_run = FALSE; @@ -4077,7 +4077,7 @@ verify_files(char * hdf5_file_name, hbool_t * error_ptr) { const char * fcn_name = "verify_files()"; - char jnl_file_name[H5C2__MAX_JOURNAL_FILE_NAME_LEN + 1]; + char jnl_file_name[H5C__MAX_JOURNAL_FILE_NAME_LEN + 1]; char jnl_target_file_name[MAX_PATH_LEN + 1]; hbool_t proceed = TRUE; hbool_t journal_file_exists = FALSE; @@ -4774,7 +4774,7 @@ mark_hdf5_file_recovered(char * hdf5_file_path_ptr) hbool_t proceed = TRUE; hid_t fapl = -1; hid_t fid = -1; - H5AC2_jnl_config_t config; /* journaling configuration */ + H5AC_jnl_config_t config; /* journaling configuration */ if ( hdf5_file_path_ptr == NULL ) { @@ -4797,7 +4797,7 @@ mark_hdf5_file_recovered(char * hdf5_file_path_ptr) if ( proceed ) { - config.version = H5C2__CURR_AUTO_SIZE_CTL_VER; + config.version = H5C__CURR_AUTO_SIZE_CTL_VER; /* get H5AC1_cache_config_t configuration from fapl */ if ( H5Pget_jnl_config(fapl, &config) == -1) { @@ -6164,7 +6164,7 @@ bjf__load_next_msg(int fd, unsigned verbosity) { const char * fcn_name = "bjf__load_next_msg()"; - char sig_buf[H5C2_BJNL__SIG_LEN + 2]; + char sig_buf[H5C_BJNL__SIG_LEN + 2]; char msg_ver; hbool_t eof = FALSE; hbool_t proceed = TRUE; @@ -6189,7 +6189,7 @@ bjf__load_next_msg(int fd, proceed = load_buf_from_file(fd, file_len, offset, - (size_t)(H5C2_BJNL__SIG_LEN + 1), + (size_t)(H5C_BJNL__SIG_LEN + 1), (uint8_t *)sig_buf, verbosity, fcn_name, @@ -6214,8 +6214,8 @@ bjf__load_next_msg(int fd, if ( ( proceed ) && ( ! eof ) ) { - msg_ver = sig_buf[H5C2_BJNL__SIG_LEN]; - sig_buf[H5C2_BJNL__SIG_LEN] = '\0'; + msg_ver = sig_buf[H5C_BJNL__SIG_LEN]; + sig_buf[H5C_BJNL__SIG_LEN] = '\0'; if ( verbosity > 2 ) { @@ -6227,24 +6227,24 @@ bjf__load_next_msg(int fd, (unsigned long long)(offset)); } - if ( HDstrncmp(sig_buf, H5C2_BJNL__BEGIN_TRANS_SIG, - (size_t)(H5C2_BJNL__SIG_LEN)) == 0 ) { + if ( HDstrncmp(sig_buf, H5C_BJNL__BEGIN_TRANS_SIG, + (size_t)(H5C_BJNL__SIG_LEN)) == 0 ) { proceed = bjf__load_begin_trans_msg(fd, file_len, - offset + (off_t)(H5C2_BJNL__SIG_LEN + 1), + offset + (off_t)(H5C_BJNL__SIG_LEN + 1), new_offset_ptr, msg_type_ptr, msg_ver, trans_num_ptr, verbosity); - } else if ( HDstrncmp(sig_buf, H5C2_BJNL__JOURNAL_ENTRY_SIG, - (size_t)(H5C2_BJNL__SIG_LEN)) == 0 ) { + } else if ( HDstrncmp(sig_buf, H5C_BJNL__JOURNAL_ENTRY_SIG, + (size_t)(H5C_BJNL__SIG_LEN)) == 0 ) { proceed = bjf__load_jnl_entry_msg(fd, file_len, - offset + (off_t)(H5C2_BJNL__SIG_LEN + 1), + offset + (off_t)(H5C_BJNL__SIG_LEN + 1), new_offset_ptr, msg_type_ptr, msg_ver, @@ -6257,12 +6257,12 @@ bjf__load_next_msg(int fd, buf_len, verbosity); - } else if ( HDstrncmp(sig_buf, H5C2_BJNL__END_TRANS_SIG, - (size_t)(H5C2_BJNL__SIG_LEN)) == 0 ) { + } else if ( HDstrncmp(sig_buf, H5C_BJNL__END_TRANS_SIG, + (size_t)(H5C_BJNL__SIG_LEN)) == 0 ) { proceed = bjf__load_end_trans_msg(fd, file_len, - offset + (off_t)(H5C2_BJNL__SIG_LEN + 1), + offset + (off_t)(H5C_BJNL__SIG_LEN + 1), new_offset_ptr, msg_type_ptr, msg_ver, @@ -6270,12 +6270,12 @@ bjf__load_next_msg(int fd, verbosity); - } else if ( HDstrncmp(sig_buf, H5C2_BJNL__END_ADDR_SPACE_SIG, - (size_t)(H5C2_BJNL__SIG_LEN)) == 0 ) { + } else if ( HDstrncmp(sig_buf, H5C_BJNL__END_ADDR_SPACE_SIG, + (size_t)(H5C_BJNL__SIG_LEN)) == 0 ) { proceed = bjf__load_eoa_msg(fd, file_len, - offset + (off_t)(H5C2_BJNL__SIG_LEN + 1), + offset + (off_t)(H5C_BJNL__SIG_LEN + 1), new_offset_ptr, msg_type_ptr, msg_ver, @@ -6890,7 +6890,7 @@ main(int argc, char * p; /* pointer */ hbool_t custom_name = 0; /* bool indicating custom backup name */ hbool_t no_copy = 0; /* bool indicating not to make backup */ - H5AC2_jnl_config_t config; /* journaling configuration */ + H5AC_jnl_config_t config; /* journaling configuration */ hbool_t check_file = 1; /* boolean indicating whether to check */ uint8_t * compare_buf; /* buffer to read into from hdf5 file */ hid_t status = -1; /* status indicator for retval checking */ @@ -7670,7 +7670,7 @@ main(int argc, } /* end if */ - config.version = 1; /* should be H5C2__CURR_AUTO_SIZE_CTL_VER */ + config.version = 1; /* should be H5C__CURR_AUTO_SIZE_CTL_VER */ /* get H5AC1_cache_config_t configuration from fapl */ if ( H5Pget_jnl_config(fapl, &config) == -1) { diff --git a/tools/h5recover/trecover_writer.c b/tools/h5recover/trecover_writer.c index e5ebab6..f1bb4c5 100644 --- a/tools/h5recover/trecover_writer.c +++ b/tools/h5recover/trecover_writer.c @@ -54,7 +54,7 @@ journal_files(const char *filename, const char *ctl_filename, const char *jnl_fi * access properties. */ hid_t faccpl; /* file access property list handle */ - H5AC2_jnl_config_t jnl_config; + H5AC_jnl_config_t jnl_config; faccpl = H5Pcreate(H5P_FILE_ACCESS); /* Turn journaling on if not patch mode */ @@ -69,7 +69,7 @@ journal_files(const char *filename, const char *ctl_filename, const char *jnl_fi } /* get current journaling configuration */ - jnl_config.version = H5AC2__CURR_JNL_CONFIG_VER; + jnl_config.version = H5AC__CURR_JNL_CONFIG_VER; if ( H5Pget_jnl_config(faccpl, &jnl_config) < 0 ) { fprintf(stderr, "H5Pget_jnl_config on faccpl failed\n"); -- cgit v0.12