diff options
author | Quincey Koziol <koziol@hdfgroup.org> | 2017-01-29 07:21:22 (GMT) |
---|---|---|
committer | Quincey Koziol <koziol@hdfgroup.org> | 2017-01-29 07:21:22 (GMT) |
commit | 3ad18072eba378ca1f598d33cc83587e8a76880f (patch) | |
tree | 63f600947a8d56c26a7b850ebb41fb8e688ecab9 /src/H5Cprefetched.c | |
parent | 1949d5756d424be0b23fc127fc99140374a7dd13 (diff) | |
download | hdf5-3ad18072eba378ca1f598d33cc83587e8a76880f.zip hdf5-3ad18072eba378ca1f598d33cc83587e8a76880f.tar.gz hdf5-3ad18072eba378ca1f598d33cc83587e8a76880f.tar.bz2 |
Add missing files
Diffstat (limited to 'src/H5Cprefetched.c')
-rw-r--r-- | src/H5Cprefetched.c | 352 |
1 files changed, 352 insertions, 0 deletions
diff --git a/src/H5Cprefetched.c b/src/H5Cprefetched.c new file mode 100644 index 0000000..9b11006 --- /dev/null +++ b/src/H5Cprefetched.c @@ -0,0 +1,352 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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: H5Cprefetched.c + * December 28 2016 + * Quincey Koziol + * + * Purpose: Metadata cache prefetched entry callbacks. + * + *------------------------------------------------------------------------- + */ + + +/***********/ +/* Headers */ +/***********/ +#include "H5private.h" /* Generic Functions */ +#include "H5ACprivate.h" /* Metadata cache */ +#include "H5FLprivate.h" /* Free Lists */ +#include "H5MMprivate.h" /* Memory management */ + + +/****************/ +/* Local Macros */ +/****************/ + + +/******************/ +/* Local Typedefs */ +/******************/ + + +/********************/ +/* Local Prototypes */ +/********************/ + +/**************************************************************************** + * + * Declarations for prefetched cache entry callbacks. + * + ****************************************************************************/ +static herr_t H5C__prefetched_entry_get_initial_load_size(void *udata_ptr, + size_t *image_len_ptr); +static herr_t H5C__prefetched_entry_get_final_load_size(const void *image_ptr, + size_t image_len, void *udata_ptr, size_t *actual_len_ptr); +static htri_t H5C__prefetched_entry_verify_chksum(const void *image_ptr, + size_t len, void *udata_ptr); +static void * H5C__prefetched_entry_deserialize(const void *image_ptr, + size_t len, void *udata, hbool_t *dirty_ptr); +static herr_t H5C__prefetched_entry_image_len(const void *thing, + size_t *image_len_ptr); +static herr_t H5C__prefetched_entry_pre_serialize(H5F_t *f, + hid_t dxpl_id, void *thing, haddr_t addr, size_t len, + haddr_t *new_addr_ptr, size_t *new_len_ptr, unsigned *flags_ptr); +static herr_t H5C__prefetched_entry_serialize(const H5F_t *f, void *image_ptr, + size_t len, void *thing); +static herr_t H5C__prefetched_entry_notify(H5C_notify_action_t action, + void *thing); +static herr_t H5C__prefetched_entry_free_icr(void *thing); +static herr_t H5C__prefetched_entry_fsf_size(const void *thing, + size_t *fsf_size_ptr); + + +/*********************/ +/* Package Variables */ +/*********************/ + +/* Declare external the free list for H5C_cache_entry_t's */ +H5FL_EXTERN(H5C_cache_entry_t); + + +/*****************************/ +/* Library Private Variables */ +/*****************************/ + + +/*******************/ +/* Local Variables */ +/*******************/ + + +const H5AC_class_t H5AC_PREFETCHED_ENTRY[1] = {{ + /* id = */ H5AC_PREFETCHED_ENTRY_ID, + /* name = */ "prefetched entry", + /* mem_type = */ H5FD_MEM_DEFAULT, /* value doesn't matter */ + /* flags = */ H5AC__CLASS_NO_FLAGS_SET, + /* get_initial_load_size = */ H5C__prefetched_entry_get_initial_load_size, + /* get_final_load_size = */ H5C__prefetched_entry_get_final_load_size, + /* verify_chksum = */ H5C__prefetched_entry_verify_chksum, + /* deserialize = */ H5C__prefetched_entry_deserialize, + /* image_len = */ H5C__prefetched_entry_image_len, + /* pre_serialize = */ H5C__prefetched_entry_pre_serialize, + /* serialize = */ H5C__prefetched_entry_serialize, + /* notify = */ H5C__prefetched_entry_notify, + /* free_icr = */ H5C__prefetched_entry_free_icr, + /* fsf_size = */ H5C__prefetched_entry_fsf_size, +}}; + + + +/*************************************************************************** + * With two exceptions, these functions should never be called, and thus + * there is little point in documenting them separately as they all simply + * throw an error. + * + * See header comments for the two exceptions (free_icr and notify). + * + * JRM - 8/13/15 + * + ***************************************************************************/ + +static herr_t +H5C__prefetched_entry_get_initial_load_size(void H5_ATTR_UNUSED *udata_ptr, + size_t H5_ATTR_UNUSED *image_len_ptr) +{ + FUNC_ENTER_STATIC_NOERR /* Yes, even though this pushes an error on the stack */ + + HERROR(H5E_CACHE, H5E_SYSTEM, "called unreachable fcn."); + + FUNC_LEAVE_NOAPI(FAIL) +} /* end H5C__prefetched_entry_get_initial_load_size() */ + +static herr_t +H5C__prefetched_entry_get_final_load_size(const void H5_ATTR_UNUSED *image_ptr, + size_t H5_ATTR_UNUSED image_len, void H5_ATTR_UNUSED *udata_ptr, + size_t H5_ATTR_UNUSED *actual_len_ptr) +{ + FUNC_ENTER_STATIC_NOERR /* Yes, even though this pushes an error on the stack */ + + HERROR(H5E_CACHE, H5E_SYSTEM, "called unreachable fcn."); + + FUNC_LEAVE_NOAPI(FAIL) +} /* end H5C__prefetched_entry_get_final_load_size() */ + +static htri_t +H5C__prefetched_entry_verify_chksum(const void H5_ATTR_UNUSED *image_ptr, + size_t H5_ATTR_UNUSED len, void H5_ATTR_UNUSED *udata_ptr) +{ + FUNC_ENTER_STATIC_NOERR /* Yes, even though this pushes an error on the stack */ + + HERROR(H5E_CACHE, H5E_SYSTEM, "called unreachable fcn."); + + FUNC_LEAVE_NOAPI(FAIL) +} /* end H5C__prefetched_verify_chksum() */ + + +static void * +H5C__prefetched_entry_deserialize(const void H5_ATTR_UNUSED * image_ptr, + size_t H5_ATTR_UNUSED len, void H5_ATTR_UNUSED * udata, + hbool_t H5_ATTR_UNUSED * dirty_ptr) +{ + FUNC_ENTER_STATIC_NOERR /* Yes, even though this pushes an error on the stack */ + + HERROR(H5E_CACHE, H5E_SYSTEM, "called unreachable fcn."); + + FUNC_LEAVE_NOAPI(NULL) +} /* end H5C__prefetched_entry_deserialize() */ + + +static herr_t +H5C__prefetched_entry_image_len(const void H5_ATTR_UNUSED *thing, + size_t H5_ATTR_UNUSED *image_len_ptr) +{ + FUNC_ENTER_STATIC_NOERR /* Yes, even though this pushes an error on the stack */ + + HERROR(H5E_CACHE, H5E_SYSTEM, "called unreachable fcn."); + + FUNC_LEAVE_NOAPI(FAIL) +} /* end H5C__prefetched_entry_image_len() */ + + +static herr_t +H5C__prefetched_entry_pre_serialize(H5F_t H5_ATTR_UNUSED *f, + hid_t H5_ATTR_UNUSED dxpl_id, void H5_ATTR_UNUSED *thing, + haddr_t H5_ATTR_UNUSED addr, size_t H5_ATTR_UNUSED len, + haddr_t H5_ATTR_UNUSED *new_addr_ptr, + size_t H5_ATTR_UNUSED *new_len_ptr, + unsigned H5_ATTR_UNUSED *flags_ptr) +{ + FUNC_ENTER_STATIC_NOERR /* Yes, even though this pushes an error on the stack */ + + HERROR(H5E_CACHE, H5E_SYSTEM, "called unreachable fcn."); + + FUNC_LEAVE_NOAPI(FAIL) +} /* end H5C__prefetched_entry_pre_serialize() */ + + +static herr_t +H5C__prefetched_entry_serialize(const H5F_t H5_ATTR_UNUSED *f, + void H5_ATTR_UNUSED *image_ptr, + size_t H5_ATTR_UNUSED len, void H5_ATTR_UNUSED *thing) +{ + FUNC_ENTER_STATIC_NOERR /* Yes, even though this pushes an error on the stack */ + + HERROR(H5E_CACHE, H5E_SYSTEM, "called unreachable fcn."); + + FUNC_LEAVE_NOAPI(FAIL) +} /* end H5C__prefetched_entry_serialize() */ + + +/*------------------------------------------------------------------------- + * Function: H5C__prefetched_entry_notify + * + * Purpose: On H5AC_NOTIFY_ACTION_BEFORE_EVICT, check to see if the + * target entry is a child in a flush dependency relationship. + * If it is, destroy that flush dependency relationship. + * + * Ignore on all other notifications. + * + * Return: Success: SUCCEED + * Failure: FAIL + * + * Programmer: John Mainzer + * 8/13/15 + * + *------------------------------------------------------------------------- + */ +static herr_t +H5C__prefetched_entry_notify(H5C_notify_action_t action, void *_thing) +{ + H5C_cache_entry_t * entry_ptr = (H5C_cache_entry_t *)_thing; + unsigned u; + herr_t ret_value = SUCCEED; + + FUNC_ENTER_STATIC + + /* Sanity checks */ + HDassert(entry_ptr); + HDassert(entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC); + HDassert(entry_ptr->prefetched); + + switch(action) { + case H5C_NOTIFY_ACTION_AFTER_INSERT: + case H5C_NOTIFY_ACTION_AFTER_LOAD: + case H5C_NOTIFY_ACTION_AFTER_FLUSH: + case H5C_NOTIFY_ACTION_ENTRY_DIRTIED: + case H5C_NOTIFY_ACTION_ENTRY_CLEANED: + case H5C_NOTIFY_ACTION_CHILD_DIRTIED: + case H5C_NOTIFY_ACTION_CHILD_CLEANED: + case H5C_NOTIFY_ACTION_CHILD_UNSERIALIZED: + case H5C_NOTIFY_ACTION_CHILD_SERIALIZED: + /* do nothing */ + break; + + case H5C_NOTIFY_ACTION_BEFORE_EVICT: + for(u = 0; u < entry_ptr->flush_dep_nparents; u++) { + H5C_cache_entry_t * parent_ptr; + + /* Sanity checks */ + HDassert(entry_ptr->flush_dep_parent); + parent_ptr = entry_ptr->flush_dep_parent[u]; + HDassert(parent_ptr); + HDassert(parent_ptr->magic == H5C__H5C_CACHE_ENTRY_T_MAGIC); + HDassert(parent_ptr->flush_dep_nchildren > 0); + + /* Destroy flush dependency with flush dependency parent */ + if(H5C_destroy_flush_dependency(parent_ptr, entry_ptr) < 0) + HGOTO_ERROR(H5E_CACHE, H5E_CANTUNDEPEND, FAIL, "unable to destroy prefetched entry flush dependency") + + if(parent_ptr->prefetched) { + /* In prefetched entries, the fd_child_count field is + * used in sanity checks elsewhere. Thus update this + * field to reflect the destruction of the flush + * dependency relationship. + */ + HDassert(parent_ptr->fd_child_count > 0); + (parent_ptr->fd_child_count)--; + } /* end if */ + } /* end for */ + break; + + default: + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "unknown action from metadata cache") + break; + } /* end switch */ + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5C__prefetched_entry_notify() */ + + +/*------------------------------------------------------------------------- + * Function: H5C__prefetched_entry_free_icr + * + * Purpose: Free the in core representation of the prefetched entry. + * Verify that the image buffer associated with the entry + * has been either transferred or freed. + * + * Return: Success: SUCCEED + * Failure: FAIL + * + * Programmer: John Mainzer + * 8/13/15 + * + *------------------------------------------------------------------------- + */ +static herr_t +H5C__prefetched_entry_free_icr(void *_thing) +{ + H5C_cache_entry_t *entry_ptr = (H5C_cache_entry_t *)_thing; + herr_t ret_value = SUCCEED; + + FUNC_ENTER_STATIC + + /* Sanity checks */ + HDassert(entry_ptr); + HDassert(entry_ptr->magic == H5C__H5C_CACHE_ENTRY_T_BAD_MAGIC); + HDassert(entry_ptr->prefetched); + + /* Release array for flush dependency parent addresses */ + if(entry_ptr->fd_parent_addrs != NULL) { + HDassert(entry_ptr->fd_parent_count > 0); + entry_ptr->fd_parent_addrs = (haddr_t *)H5MM_xfree((void *)entry_ptr->fd_parent_addrs); + } /* end if */ + else + HDassert(entry_ptr->fd_parent_count == 0); + + if(entry_ptr->image_ptr != NULL) + HGOTO_ERROR(H5E_CACHE, H5E_SYSTEM, FAIL, "prefetched entry image buffer still attatched?") + + entry_ptr = H5FL_FREE(H5C_cache_entry_t, entry_ptr); + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5C__prefetched_entry_free_icr() */ + + +static herr_t +H5C__prefetched_entry_fsf_size(const void H5_ATTR_UNUSED *thing, + size_t H5_ATTR_UNUSED *fsf_size_ptr) +{ + FUNC_ENTER_STATIC_NOERR /* Yes, even though this pushes an error on the stack */ + + HERROR(H5E_CACHE, H5E_SYSTEM, "called unreachable fcn."); + + FUNC_LEAVE_NOAPI(FAIL) +} /* end H5C__prefetched_entry_fsf_size() */ + |