mirror of
https://github.com/HDFGroup/hdf5.git
synced 2025-03-31 17:10:47 +08:00
Merge branch 'develop' of https://bitbucket.hdfgroup.org/scm/~lrknox/hdf5_lrk into develop
This commit is contained in:
commit
d2624dae03
@ -481,6 +481,15 @@ if (HDF5_MEMORY_ALLOC_SANITY_CHECK)
|
||||
set (H5_MEMORY_ALLOC_SANITY_CHECK 1)
|
||||
endif ()
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# Option to enable/disable using pread/pwrite for VFDs
|
||||
#-----------------------------------------------------------------------------
|
||||
option (HDF5_ENABLE_PREADWRITE "Use pread/pwrite in sec2/log/core VFDs in place of read/write (when available)" ON)
|
||||
mark_as_advanced (HDF5_ENABLE_PREADWRITE)
|
||||
if (HDF5_ENABLE_PREADWRITE AND H5_HAVE_PREAD AND H5_HAVE_PWRITE)
|
||||
set (H5_HAVE_PREADWRITE 1)
|
||||
endif ()
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
# Option to use deprecated public API symbols
|
||||
#-----------------------------------------------------------------------------
|
||||
|
@ -267,6 +267,9 @@
|
||||
/* Define if we have parallel support */
|
||||
#cmakedefine H5_HAVE_PARALLEL @H5_HAVE_PARALLEL@
|
||||
|
||||
/* Define if both pread and pwrite exist. */
|
||||
#cmakedefine H5_HAVE_PREADWRITE @H5_HAVE_PREADWRITE@
|
||||
|
||||
/* Define to 1 if you have the <pthread.h> header file. */
|
||||
#cmakedefine H5_HAVE_PTHREAD_H @H5_HAVE_PTHREAD_H@
|
||||
|
||||
|
@ -274,10 +274,12 @@ if (NOT WINDOWS)
|
||||
# functionality so clock_gettime and CLOCK_MONOTONIC are defined
|
||||
# correctly. This was later updated to 200112L so that
|
||||
# posix_memalign() is visible for the direct VFD code on Linux
|
||||
# systems.
|
||||
# systems. Even later, this was changed to 200809L to support
|
||||
# pread/pwrite in VFDs.
|
||||
#
|
||||
# POSIX feature information can be found in the gcc manual at:
|
||||
# http://www.gnu.org/s/libc/manual/html_node/Feature-Test-Macros.html
|
||||
set (HDF_EXTRA_C_FLAGS -D_POSIX_C_SOURCE=200112L)
|
||||
set (HDF_EXTRA_C_FLAGS -D_POSIX_C_SOURCE=200809L)
|
||||
|
||||
# Need to add this so that O_DIRECT is visible for the direct
|
||||
# VFD on Linux systems.
|
||||
@ -506,6 +508,8 @@ CHECK_FUNCTION_EXISTS (lround ${HDF_PREFIX}_HAVE_LROUND)
|
||||
CHECK_FUNCTION_EXISTS (lroundf ${HDF_PREFIX}_HAVE_LROUNDF)
|
||||
CHECK_FUNCTION_EXISTS (lstat ${HDF_PREFIX}_HAVE_LSTAT)
|
||||
|
||||
CHECK_FUNCTION_EXISTS (pread ${HDF_PREFIX}_HAVE_PREAD)
|
||||
CHECK_FUNCTION_EXISTS (pwrite ${HDF_PREFIX}_HAVE_PWRITE)
|
||||
CHECK_FUNCTION_EXISTS (rand_r ${HDF_PREFIX}_HAVE_RAND_R)
|
||||
CHECK_FUNCTION_EXISTS (random ${HDF_PREFIX}_HAVE_RANDOM)
|
||||
CHECK_FUNCTION_EXISTS (round ${HDF_PREFIX}_HAVE_ROUND)
|
||||
|
46
configure.ac
46
configure.ac
@ -1130,11 +1130,12 @@ case "$host_cpu-$host_vendor-$host_os" in
|
||||
## functionality so clock_gettime and CLOCK_MONOTONIC are defined
|
||||
## correctly. This was later updated to 200112L so that
|
||||
## posix_memalign() is visible for the direct VFD code on Linux
|
||||
## systems.
|
||||
## systems. Even later, this was changed to 200809L to support
|
||||
## pread/pwrite in VFDs.
|
||||
##
|
||||
## POSIX feature information can be found in the gcc manual at:
|
||||
## http://www.gnu.org/s/libc/manual/html_node/Feature-Test-Macros.html
|
||||
H5_CPPFLAGS="-D_POSIX_C_SOURCE=200112L $H5_CPPFLAGS"
|
||||
H5_CPPFLAGS="-D_POSIX_C_SOURCE=200809L $H5_CPPFLAGS"
|
||||
|
||||
## Need to add this so that O_DIRECT is visible for the direct
|
||||
## VFD on Linux systems.
|
||||
@ -3265,6 +3266,47 @@ case "X-$STRICT_FORMAT_CHECKS" in
|
||||
esac
|
||||
|
||||
|
||||
## ----------------------------------------------------------------------
|
||||
## Enable use of pread/pwrite instead of read/write in certain VFDs.
|
||||
##
|
||||
AC_SUBST([PREADWRITE])
|
||||
|
||||
## Check these first to avoid interspersed output in the AC_ARG_ENABLE line
|
||||
## below. (Probably overkill to check for both, but we'll be extra careful)
|
||||
PREADWRITE_HAVE_BOTH=yes
|
||||
AC_CHECK_FUNC([pread], [], [PREADWRITE_HAVE_BOTH=no])
|
||||
AC_CHECK_FUNC([pwrite], [], [PREADWRITE_HAVE_BOTH=no])
|
||||
|
||||
AC_MSG_CHECKING([whether to use pread/pwrite instead of read/write in certain VFDs])
|
||||
AC_ARG_ENABLE([preadwrite],
|
||||
[AS_HELP_STRING([--enable-preadwrite],
|
||||
[Enable using pread/pwrite instead of read/write in sec2/log/core VFDs.
|
||||
[default=yes if pread/pwrite are present]])],
|
||||
[PREADWRITE=$enableval])
|
||||
|
||||
## Set the default level.
|
||||
if test "X-$PREADWRITE" = X- ; then
|
||||
PREADWRITE=yes
|
||||
fi
|
||||
|
||||
case "X-$PREADWRITE" in
|
||||
X-yes)
|
||||
if test "X-$PREADWRITE_HAVE_BOTH" = "X-yes"; then
|
||||
AC_DEFINE([HAVE_PREADWRITE], [1], [Define if both pread and pwrite exist.])
|
||||
AC_MSG_RESULT([yes])
|
||||
else
|
||||
AC_MSG_RESULT([no])
|
||||
fi
|
||||
;;
|
||||
X-no)
|
||||
AC_MSG_RESULT([no])
|
||||
;;
|
||||
*)
|
||||
AC_MSG_ERROR([Unrecognized value: $PREADWRITE])
|
||||
;;
|
||||
esac
|
||||
|
||||
|
||||
## ----------------------------------------------------------------------
|
||||
## Enable embedded library information
|
||||
##
|
||||
|
@ -1612,7 +1612,7 @@ H5AC_unprotect(H5F_t *f, const H5AC_class_t *type, haddr_t addr, void *thing,
|
||||
done:
|
||||
/* If currently logging, generate a message */
|
||||
if(f->shared->cache->log_info->logging)
|
||||
if(H5C_log_write_unprotect_entry_msg(f->shared->cache, (H5AC_info_t *)thing, type->id, flags, ret_value) < 0)
|
||||
if(H5C_log_write_unprotect_entry_msg(f->shared->cache, addr, type->id, flags, ret_value) < 0)
|
||||
HDONE_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "unable to emit log message")
|
||||
|
||||
FUNC_LEAVE_NOAPI(ret_value)
|
||||
|
@ -887,7 +887,7 @@ done:
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
herr_t
|
||||
H5C_log_write_unprotect_entry_msg(H5C_t *cache, const H5C_cache_entry_t *entry,
|
||||
H5C_log_write_unprotect_entry_msg(H5C_t *cache, haddr_t address,
|
||||
int type_id, unsigned flags, herr_t fxn_ret_value)
|
||||
{
|
||||
herr_t ret_value = SUCCEED;
|
||||
@ -898,9 +898,8 @@ H5C_log_write_unprotect_entry_msg(H5C_t *cache, const H5C_cache_entry_t *entry,
|
||||
HDassert(cache);
|
||||
|
||||
/* Write a log message */
|
||||
HDassert(entry);
|
||||
if(cache->log_info->cls->write_unprotect_entry_log_msg)
|
||||
if(cache->log_info->cls->write_unprotect_entry_log_msg(cache->log_info->udata, entry, type_id, flags, fxn_ret_value) < 0)
|
||||
if(cache->log_info->cls->write_unprotect_entry_log_msg(cache->log_info->udata, address, type_id, flags, fxn_ret_value) < 0)
|
||||
HGOTO_ERROR(H5E_CACHE, H5E_LOGGING, FAIL, "log-specific unprotect entry call failed")
|
||||
|
||||
done:
|
||||
|
@ -59,7 +59,7 @@ typedef struct H5C_log_class_t {
|
||||
herr_t (*write_resize_entry_log_msg)(void *udata, const H5C_cache_entry_t *entry, size_t new_size, herr_t fxn_ret_value);
|
||||
herr_t (*write_unpin_entry_log_msg)(void *udata, const H5C_cache_entry_t *entry, herr_t fxn_ret_value);
|
||||
herr_t (*write_destroy_fd_log_msg)(void *udata, const H5C_cache_entry_t *parent, const H5C_cache_entry_t *child, herr_t fxn_ret_value);
|
||||
herr_t (*write_unprotect_entry_log_msg)(void *udata, const H5C_cache_entry_t *entry, int type_id, unsigned flags, herr_t fxn_ret_value);
|
||||
herr_t (*write_unprotect_entry_log_msg)(void *udata, haddr_t address, int type_id, unsigned flags, herr_t fxn_ret_value);
|
||||
herr_t (*write_set_cache_config_log_msg)(void *udata, const H5AC_cache_config_t *config, herr_t fxn_ret_value);
|
||||
herr_t (*write_remove_entry_log_msg)(void *udata, const H5C_cache_entry_t *entry, herr_t fxn_ret_value);
|
||||
|
||||
@ -102,7 +102,7 @@ H5_DLL herr_t H5C_log_write_protect_entry_msg(H5C_t *cache, const H5C_cache_entr
|
||||
H5_DLL herr_t H5C_log_write_resize_entry_msg(H5C_t *cache, const H5C_cache_entry_t *entry, size_t new_size, herr_t fxn_ret_value);
|
||||
H5_DLL herr_t H5C_log_write_unpin_entry_msg(H5C_t *cache, const H5C_cache_entry_t *entry, herr_t fxn_ret_value);
|
||||
H5_DLL herr_t H5C_log_write_destroy_fd_msg(H5C_t *cache, const H5C_cache_entry_t *parent, const H5C_cache_entry_t *child, herr_t fxn_ret_value);
|
||||
H5_DLL herr_t H5C_log_write_unprotect_entry_msg(H5C_t *cache, const H5C_cache_entry_t *entry, int type_id, unsigned flags, herr_t fxn_ret_value);
|
||||
H5_DLL herr_t H5C_log_write_unprotect_entry_msg(H5C_t *cache, haddr_t address, int type_id, unsigned flags, herr_t fxn_ret_value);
|
||||
H5_DLL herr_t H5C_log_write_set_cache_config_msg(H5C_t *cache, const H5AC_cache_config_t *config, herr_t fxn_ret_value);
|
||||
H5_DLL herr_t H5C_log_write_remove_entry_msg(H5C_t *cache, const H5C_cache_entry_t *entry, herr_t fxn_ret_value);
|
||||
|
||||
|
@ -41,7 +41,7 @@
|
||||
/****************/
|
||||
|
||||
/* Max log message size */
|
||||
#define H5C_MAX_JSON_LOG_MSG_SIZE 128
|
||||
#define H5C_MAX_JSON_LOG_MSG_SIZE 1024
|
||||
|
||||
|
||||
/******************/
|
||||
@ -87,7 +87,7 @@ static herr_t H5C__json_write_protect_entry_log_msg(void *udata, const H5C_cache
|
||||
static herr_t H5C__json_write_resize_entry_log_msg(void *udata, const H5C_cache_entry_t *entry, size_t new_size, herr_t fxn_ret_value);
|
||||
static herr_t H5C__json_write_unpin_entry_log_msg(void *udata, const H5C_cache_entry_t *entry, herr_t fxn_ret_value);
|
||||
static herr_t H5C__json_write_destroy_fd_log_msg(void *udata, const H5C_cache_entry_t *parent, const H5C_cache_entry_t *child, herr_t fxn_ret_value);
|
||||
static herr_t H5C__json_write_unprotect_entry_log_msg(void *udata, const H5C_cache_entry_t *entry, int type_id, unsigned flags, herr_t fxn_ret_value);
|
||||
static herr_t H5C__json_write_unprotect_entry_log_msg(void *udata, haddr_t address, int type_id, unsigned flags, herr_t fxn_ret_value);
|
||||
static herr_t H5C__json_write_set_cache_config_log_msg(void *udata, const H5AC_cache_config_t *config, herr_t fxn_ret_value);
|
||||
static herr_t H5C__json_write_remove_entry_log_msg(void *udata, const H5C_cache_entry_t *entry, herr_t fxn_ret_value);
|
||||
|
||||
@ -1232,7 +1232,7 @@ done:
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
static herr_t
|
||||
H5C__json_write_unprotect_entry_log_msg(void *udata, const H5C_cache_entry_t *entry,
|
||||
H5C__json_write_unprotect_entry_log_msg(void *udata, haddr_t address,
|
||||
int type_id, unsigned flags, herr_t fxn_ret_value)
|
||||
{
|
||||
H5C_log_json_udata_t *json_udata = (H5C_log_json_udata_t *)(udata);
|
||||
@ -1243,7 +1243,6 @@ H5C__json_write_unprotect_entry_log_msg(void *udata, const H5C_cache_entry_t *en
|
||||
/* Sanity checks */
|
||||
HDassert(json_udata);
|
||||
HDassert(json_udata->message);
|
||||
HDassert(entry);
|
||||
|
||||
/* Create the log message string */
|
||||
HDsnprintf(json_udata->message, H5C_MAX_JSON_LOG_MSG_SIZE,
|
||||
@ -1257,7 +1256,7 @@ H5C__json_write_unprotect_entry_log_msg(void *udata, const H5C_cache_entry_t *en
|
||||
\"returned\":%d\
|
||||
},\n\
|
||||
"
|
||||
, (long long)HDtime(NULL), (unsigned long)entry->addr,
|
||||
, (long long)HDtime(NULL), (unsigned long)address,
|
||||
type_id, flags, (int)fxn_ret_value);
|
||||
|
||||
/* Write the log message to the file */
|
||||
|
@ -82,7 +82,7 @@ static herr_t H5C__trace_write_protect_entry_log_msg(void *udata, const H5C_cach
|
||||
static herr_t H5C__trace_write_resize_entry_log_msg(void *udata, const H5C_cache_entry_t *entry, size_t new_size, herr_t fxn_ret_value);
|
||||
static herr_t H5C__trace_write_unpin_entry_log_msg(void *udata, const H5C_cache_entry_t *entry, herr_t fxn_ret_value);
|
||||
static herr_t H5C__trace_write_destroy_fd_log_msg(void *udata, const H5C_cache_entry_t *parent, const H5C_cache_entry_t *child, herr_t fxn_ret_value);
|
||||
static herr_t H5C__trace_write_unprotect_entry_log_msg(void *udata, const H5C_cache_entry_t *entry, int type_id, unsigned flags, herr_t fxn_ret_value);
|
||||
static herr_t H5C__trace_write_unprotect_entry_log_msg(void *udata, haddr_t address, int type_id, unsigned flags, herr_t fxn_ret_value);
|
||||
static herr_t H5C__trace_write_set_cache_config_log_msg(void *udata, const H5AC_cache_config_t *config, herr_t fxn_ret_value);
|
||||
static herr_t H5C__trace_write_remove_entry_log_msg(void *udata, const H5C_cache_entry_t *entry, herr_t fxn_ret_value);
|
||||
|
||||
@ -872,7 +872,7 @@ done:
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
static herr_t
|
||||
H5C__trace_write_unprotect_entry_log_msg(void *udata, const H5C_cache_entry_t *entry,
|
||||
H5C__trace_write_unprotect_entry_log_msg(void *udata, haddr_t address,
|
||||
int type_id, unsigned flags, herr_t fxn_ret_value)
|
||||
{
|
||||
H5C_log_trace_udata_t *trace_udata = (H5C_log_trace_udata_t *)(udata);
|
||||
@ -883,11 +883,10 @@ H5C__trace_write_unprotect_entry_log_msg(void *udata, const H5C_cache_entry_t *e
|
||||
/* Sanity checks */
|
||||
HDassert(trace_udata);
|
||||
HDassert(trace_udata->message);
|
||||
HDassert(entry);
|
||||
|
||||
/* Create the log message string */
|
||||
HDsnprintf(trace_udata->message, H5C_MAX_TRACE_LOG_MSG_SIZE, "H5AC_unprotect 0x%lx %d 0x%x %d\n",
|
||||
(unsigned long)(entry->addr), type_id, flags, (int)fxn_ret_value);
|
||||
(unsigned long)(address), type_id, flags, (int)fxn_ret_value);
|
||||
|
||||
/* Write the log message to the file */
|
||||
if(H5C__trace_write_log_message(trace_udata) < 0)
|
||||
|
@ -1031,16 +1031,13 @@ H5D__typeinfo_init(const H5D_t *dset, hid_t mem_type_id, hbool_t do_write,
|
||||
if(type_info->request_nelmts == 0)
|
||||
HGOTO_ERROR(H5E_DATASET, H5E_CANTINIT, FAIL, "temporary buffer max size is too small")
|
||||
|
||||
/*
|
||||
* Get a temporary buffer for type conversion unless the app has already
|
||||
/* Get a temporary buffer for type conversion unless the app has already
|
||||
* supplied one through the xfer properties. Instead of allocating a
|
||||
* buffer which is the exact size, we allocate the target size. The
|
||||
* malloc() is usually less resource-intensive if we allocate/free the
|
||||
* same size over and over.
|
||||
* buffer which is the exact size, we allocate the target size.
|
||||
*/
|
||||
if(NULL == (type_info->tconv_buf = (uint8_t *)tconv_buf)) {
|
||||
/* Allocate temporary buffer */
|
||||
if(NULL == (type_info->tconv_buf = H5FL_BLK_MALLOC(type_conv, target_size)))
|
||||
if(NULL == (type_info->tconv_buf = H5FL_BLK_CALLOC(type_conv, target_size)))
|
||||
HGOTO_ERROR(H5E_RESOURCE, H5E_NOSPACE, FAIL, "memory allocation failed for type conversion")
|
||||
type_info->tconv_buf_allocated = TRUE;
|
||||
} /* end if */
|
||||
|
@ -348,14 +348,17 @@ H5FD__core_write_to_bstore(H5FD_core_t *file, haddr_t addr, size_t size)
|
||||
|
||||
HDassert(file);
|
||||
|
||||
/* Write to backing store */
|
||||
if((off_t)addr != HDlseek(file->fd, (off_t)addr, SEEK_SET))
|
||||
#ifndef H5_HAVE_PREADWRITE
|
||||
/* Seek to the correct location (if we don't have pwrite) */
|
||||
if((HDoff_t)addr != HDlseek(file->fd, (off_t)addr, SEEK_SET))
|
||||
HGOTO_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "error seeking in backing store")
|
||||
#endif /* H5_HAVE_PREADWRITE */
|
||||
|
||||
while (size > 0) {
|
||||
|
||||
h5_posix_io_t bytes_in = 0; /* # of bytes to write */
|
||||
h5_posix_io_ret_t bytes_wrote = -1; /* # of bytes written */
|
||||
HDoff_t offset = (HDoff_t)addr;
|
||||
|
||||
/* Trying to write more bytes than the return type can handle is
|
||||
* undefined behavior in POSIX.
|
||||
@ -366,15 +369,21 @@ H5FD__core_write_to_bstore(H5FD_core_t *file, haddr_t addr, size_t size)
|
||||
bytes_in = (h5_posix_io_t)size;
|
||||
|
||||
do {
|
||||
#ifdef H5_HAVE_PREADWRITE
|
||||
bytes_wrote = HDpwrite(file->fd, ptr, bytes_in, offset);
|
||||
offset += bytes_wrote;
|
||||
#else
|
||||
bytes_wrote = HDwrite(file->fd, ptr, bytes_in);
|
||||
#endif /* H5_HAVE_PREADWRITE */
|
||||
} while(-1 == bytes_wrote && EINTR == errno);
|
||||
|
||||
if(-1 == bytes_wrote) { /* error */
|
||||
int myerrno = errno;
|
||||
time_t mytime = HDtime(NULL);
|
||||
HDoff_t myoffset = HDlseek(file->fd, (HDoff_t)0, SEEK_CUR);
|
||||
|
||||
HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "write to backing store failed: time = %s, filename = '%s', file descriptor = %d, errno = %d, error message = '%s', ptr = %p, total write size = %llu, bytes this sub-write = %llu, bytes actually written = %llu, offset = %llu", HDctime(&mytime), file->name, file->fd, myerrno, HDstrerror(myerrno), ptr, (unsigned long long)size, (unsigned long long)bytes_in, (unsigned long long)bytes_wrote, (unsigned long long)myoffset);
|
||||
offset = HDlseek(file->fd, (HDoff_t)0, SEEK_CUR);
|
||||
|
||||
HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "write to backing store failed: time = %s, filename = '%s', file descriptor = %d, errno = %d, error message = '%s', ptr = %p, total write size = %llu, bytes this sub-write = %llu, bytes actually written = %llu, offset = %llu", HDctime(&mytime), file->name, file->fd, myerrno, HDstrerror(myerrno), ptr, (unsigned long long)size, (unsigned long long)bytes_in, (unsigned long long)bytes_wrote, (unsigned long long)offset);
|
||||
} /* end if */
|
||||
|
||||
HDassert(bytes_wrote > 0);
|
||||
@ -852,6 +861,7 @@ H5FD__core_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr
|
||||
while(size > 0) {
|
||||
h5_posix_io_t bytes_in = 0; /* # of bytes to read */
|
||||
h5_posix_io_ret_t bytes_read = -1; /* # of bytes actually read */
|
||||
HDoff_t offset = (HDoff_t)0;
|
||||
|
||||
/* Trying to read more bytes than the return type can handle is
|
||||
* undefined behavior in POSIX.
|
||||
@ -862,15 +872,21 @@ H5FD__core_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr
|
||||
bytes_in = (h5_posix_io_t)size;
|
||||
|
||||
do {
|
||||
#ifdef H5_HAVE_PREADWRITE
|
||||
bytes_read = HDpread(file->fd, mem, bytes_in, offset);
|
||||
offset += bytes_read;
|
||||
#else
|
||||
bytes_read = HDread(file->fd, mem, bytes_in);
|
||||
#endif /* H5_HAVE_PREADWRITE */
|
||||
} while(-1 == bytes_read && EINTR == errno);
|
||||
|
||||
if(-1 == bytes_read) { /* error */
|
||||
int myerrno = errno;
|
||||
time_t mytime = HDtime(NULL);
|
||||
HDoff_t myoffset = HDlseek(file->fd, (HDoff_t)0, SEEK_CUR);
|
||||
|
||||
HGOTO_ERROR(H5E_IO, H5E_READERROR, NULL, "file read failed: time = %s, filename = '%s', file descriptor = %d, errno = %d, error message = '%s', file->mem = %p, total read size = %llu, bytes this sub-read = %llu, bytes actually read = %llu, offset = %llu", HDctime(&mytime), file->name, file->fd, myerrno, HDstrerror(myerrno), file->mem, (unsigned long long)size, (unsigned long long)bytes_in, (unsigned long long)bytes_read, (unsigned long long)myoffset);
|
||||
offset = HDlseek(file->fd, (HDoff_t)0, SEEK_CUR);
|
||||
|
||||
HGOTO_ERROR(H5E_IO, H5E_READERROR, NULL, "file read failed: time = %s, filename = '%s', file descriptor = %d, errno = %d, error message = '%s', file->mem = %p, total read size = %llu, bytes this sub-read = %llu, bytes actually read = %llu, offset = %llu", HDctime(&mytime), file->name, file->fd, myerrno, HDstrerror(myerrno), file->mem, (unsigned long long)size, (unsigned long long)bytes_in, (unsigned long long)bytes_read, (unsigned long long)offset);
|
||||
} /* end if */
|
||||
|
||||
HDassert(bytes_read >= 0);
|
||||
|
@ -1191,7 +1191,8 @@ H5FD_log_read(H5FD_t *_file, H5FD_mem_t type, hid_t H5_ATTR_UNUSED dxpl_id, hadd
|
||||
} /* end if */
|
||||
} /* end if */
|
||||
|
||||
/* Seek to the correct location */
|
||||
#ifndef H5_HAVE_PREADWRITE
|
||||
/* Seek to the correct location (if we don't have pread) */
|
||||
if(addr != file->pos || OP_READ != file->op) {
|
||||
#ifdef H5_HAVE_GETTIMEOFDAY
|
||||
if(file->fa.flags & H5FD_LOG_TIME_SEEK)
|
||||
@ -1234,6 +1235,7 @@ H5FD_log_read(H5FD_t *_file, H5FD_mem_t type, hid_t H5_ATTR_UNUSED dxpl_id, hadd
|
||||
#endif /* H5_HAVE_GETTIMEOFDAY */
|
||||
} /* end if */
|
||||
} /* end if */
|
||||
#endif /* H5_HAVE_PREADWRITE */
|
||||
|
||||
/*
|
||||
* Read data, being careful of interrupted system calls, partial results,
|
||||
@ -1247,6 +1249,7 @@ H5FD_log_read(H5FD_t *_file, H5FD_mem_t type, hid_t H5_ATTR_UNUSED dxpl_id, hadd
|
||||
|
||||
h5_posix_io_t bytes_in = 0; /* # of bytes to read */
|
||||
h5_posix_io_ret_t bytes_read = -1; /* # of bytes actually read */
|
||||
HDoff_t offset = (HDoff_t)addr;
|
||||
|
||||
/* Trying to read more bytes than the return type can handle is
|
||||
* undefined behavior in POSIX.
|
||||
@ -1257,18 +1260,24 @@ H5FD_log_read(H5FD_t *_file, H5FD_mem_t type, hid_t H5_ATTR_UNUSED dxpl_id, hadd
|
||||
bytes_in = (h5_posix_io_t)size;
|
||||
|
||||
do {
|
||||
#ifdef H5_HAVE_PREADWRITE
|
||||
bytes_read = HDpread(file->fd, buf, bytes_in, offset);
|
||||
offset += bytes_read;
|
||||
#else
|
||||
bytes_read = HDread(file->fd, buf, bytes_in);
|
||||
#endif /* H5_HAVE_PREADWRITE */
|
||||
} while(-1 == bytes_read && EINTR == errno);
|
||||
|
||||
if(-1 == bytes_read) { /* error */
|
||||
int myerrno = errno;
|
||||
time_t mytime = HDtime(NULL);
|
||||
HDoff_t myoffset = HDlseek(file->fd, (HDoff_t)0, SEEK_CUR);
|
||||
|
||||
offset = HDlseek(file->fd, (HDoff_t)0, SEEK_CUR);
|
||||
|
||||
if(file->fa.flags & H5FD_LOG_LOC_READ)
|
||||
HDfprintf(file->logfp, "Error! Reading: %10a-%10a (%10Zu bytes)\n", orig_addr, (orig_addr + orig_size) - 1, orig_size);
|
||||
|
||||
HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "file read failed: time = %s, filename = '%s', file descriptor = %d, errno = %d, error message = '%s', buf = %p, total read size = %llu, bytes this sub-read = %llu, bytes actually read = %llu, offset = %llu", HDctime(&mytime), file->filename, file->fd, myerrno, HDstrerror(myerrno), buf, (unsigned long long)size, (unsigned long long)bytes_in, (unsigned long long)bytes_read, (unsigned long long)myoffset);
|
||||
HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "file read failed: time = %s, filename = '%s', file descriptor = %d, errno = %d, error message = '%s', buf = %p, total read size = %llu, bytes this sub-read = %llu, bytes actually read = %llu, offset = %llu", HDctime(&mytime), file->filename, file->fd, myerrno, HDstrerror(myerrno), buf, (unsigned long long)size, (unsigned long long)bytes_in, (unsigned long long)bytes_read, (unsigned long long)offset);
|
||||
} /* end if */
|
||||
|
||||
if(0 == bytes_read) {
|
||||
@ -1398,7 +1407,8 @@ H5FD_log_write(H5FD_t *_file, H5FD_mem_t type, hid_t H5_ATTR_UNUSED dxpl_id, had
|
||||
file->nwrite[tmp_addr++]++;
|
||||
} /* end if */
|
||||
|
||||
/* Seek to the correct location */
|
||||
#ifndef H5_HAVE_PREADWRITE
|
||||
/* Seek to the correct location (if we don't have pwrite) */
|
||||
if(addr != file->pos || OP_WRITE != file->op) {
|
||||
#ifdef H5_HAVE_GETTIMEOFDAY
|
||||
if(file->fa.flags & H5FD_LOG_TIME_SEEK)
|
||||
@ -1441,6 +1451,7 @@ H5FD_log_write(H5FD_t *_file, H5FD_mem_t type, hid_t H5_ATTR_UNUSED dxpl_id, had
|
||||
#endif /* H5_HAVE_GETTIMEOFDAY */
|
||||
} /* end if */
|
||||
} /* end if */
|
||||
#endif /* H5_HAVE_PREADWRITE */
|
||||
|
||||
/*
|
||||
* Write the data, being careful of interrupted system calls and partial
|
||||
@ -1454,6 +1465,7 @@ H5FD_log_write(H5FD_t *_file, H5FD_mem_t type, hid_t H5_ATTR_UNUSED dxpl_id, had
|
||||
|
||||
h5_posix_io_t bytes_in = 0; /* # of bytes to write */
|
||||
h5_posix_io_ret_t bytes_wrote = -1; /* # of bytes written */
|
||||
HDoff_t offset = (HDoff_t)addr;
|
||||
|
||||
/* Trying to write more bytes than the return type can handle is
|
||||
* undefined behavior in POSIX.
|
||||
@ -1464,18 +1476,24 @@ H5FD_log_write(H5FD_t *_file, H5FD_mem_t type, hid_t H5_ATTR_UNUSED dxpl_id, had
|
||||
bytes_in = (h5_posix_io_t)size;
|
||||
|
||||
do {
|
||||
#ifdef H5_HAVE_PREADWRITE
|
||||
bytes_wrote = HDpwrite(file->fd, buf, bytes_in, offset);
|
||||
offset += bytes_wrote;
|
||||
#else
|
||||
bytes_wrote = HDwrite(file->fd, buf, bytes_in);
|
||||
#endif /* H5_HAVE_PREADWRITE */
|
||||
} while(-1 == bytes_wrote && EINTR == errno);
|
||||
|
||||
if(-1 == bytes_wrote) { /* error */
|
||||
int myerrno = errno;
|
||||
time_t mytime = HDtime(NULL);
|
||||
HDoff_t myoffset = HDlseek(file->fd, (HDoff_t)0, SEEK_CUR);
|
||||
|
||||
offset = HDlseek(file->fd, (HDoff_t)0, SEEK_CUR);
|
||||
|
||||
if(file->fa.flags & H5FD_LOG_LOC_WRITE)
|
||||
HDfprintf(file->logfp, "Error! Writing: %10a-%10a (%10Zu bytes)\n", orig_addr, (orig_addr + orig_size) - 1, orig_size);
|
||||
|
||||
HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "file write failed: time = %s, filename = '%s', file descriptor = %d, errno = %d, error message = '%s', buf = %p, total write size = %llu, bytes this sub-write = %llu, bytes actually written = %llu, offset = %llu", HDctime(&mytime), file->filename, file->fd, myerrno, HDstrerror(myerrno), buf, (unsigned long long)size, (unsigned long long)bytes_in, (unsigned long long)bytes_wrote, (unsigned long long)myoffset);
|
||||
HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "file write failed: time = %s, filename = '%s', file descriptor = %d, errno = %d, error message = '%s', buf = %p, total write size = %llu, bytes this sub-write = %llu, bytes actually written = %llu, offset = %llu", HDctime(&mytime), file->filename, file->fd, myerrno, HDstrerror(myerrno), buf, (unsigned long long)size, (unsigned long long)bytes_in, (unsigned long long)bytes_wrote, (unsigned long long)offset);
|
||||
} /* end if */
|
||||
|
||||
HDassert(bytes_wrote > 0);
|
||||
|
@ -682,11 +682,13 @@ H5FD_sec2_read(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UNUS
|
||||
if(REGION_OVERFLOW(addr, size))
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, FAIL, "addr overflow, addr = %llu", (unsigned long long)addr)
|
||||
|
||||
/* Seek to the correct location */
|
||||
#ifndef H5_HAVE_PREADWRITE
|
||||
/* Seek to the correct location (if we don't have pread) */
|
||||
if(addr != file->pos || OP_READ != file->op) {
|
||||
if(HDlseek(file->fd, (HDoff_t)addr, SEEK_SET) < 0)
|
||||
HSYS_GOTO_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "unable to seek to proper position")
|
||||
} /* end if */
|
||||
#endif /* H5_HAVE_PREADWRITE */
|
||||
|
||||
/* Read data, being careful of interrupted system calls, partial results,
|
||||
* and the end of the file.
|
||||
@ -694,7 +696,8 @@ H5FD_sec2_read(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UNUS
|
||||
while(size > 0) {
|
||||
|
||||
h5_posix_io_t bytes_in = 0; /* # of bytes to read */
|
||||
h5_posix_io_ret_t bytes_read = -1; /* # of bytes actually read */
|
||||
h5_posix_io_ret_t bytes_read = -1; /* # of bytes actually read */
|
||||
HDoff_t offset = (HDoff_t)addr;
|
||||
|
||||
/* Trying to read more bytes than the return type can handle is
|
||||
* undefined behavior in POSIX.
|
||||
@ -705,15 +708,21 @@ H5FD_sec2_read(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UNUS
|
||||
bytes_in = (h5_posix_io_t)size;
|
||||
|
||||
do {
|
||||
#ifdef H5_HAVE_PREADWRITE
|
||||
bytes_read = HDpread(file->fd, buf, bytes_in, offset);
|
||||
offset += bytes_read;
|
||||
#else
|
||||
bytes_read = HDread(file->fd, buf, bytes_in);
|
||||
#endif /* H5_HAVE_PREADWRITE */
|
||||
} while(-1 == bytes_read && EINTR == errno);
|
||||
|
||||
if(-1 == bytes_read) { /* error */
|
||||
int myerrno = errno;
|
||||
time_t mytime = HDtime(NULL);
|
||||
HDoff_t myoffset = HDlseek(file->fd, (HDoff_t)0, SEEK_CUR);
|
||||
|
||||
HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "file read failed: time = %s, filename = '%s', file descriptor = %d, errno = %d, error message = '%s', buf = %p, total read size = %llu, bytes this sub-read = %llu, bytes actually read = %llu, offset = %llu", HDctime(&mytime), file->filename, file->fd, myerrno, HDstrerror(myerrno), buf, (unsigned long long)size, (unsigned long long)bytes_in, (unsigned long long)bytes_read, (unsigned long long)myoffset);
|
||||
offset = HDlseek(file->fd, (HDoff_t)0, SEEK_CUR);
|
||||
|
||||
HGOTO_ERROR(H5E_IO, H5E_READERROR, FAIL, "file read failed: time = %s, filename = '%s', file descriptor = %d, errno = %d, error message = '%s', buf = %p, total read size = %llu, bytes this sub-read = %llu, bytes actually read = %llu, offset = %llu", HDctime(&mytime), file->filename, file->fd, myerrno, HDstrerror(myerrno), buf, (unsigned long long)size, (unsigned long long)bytes_in, (unsigned long long)bytes_read, (unsigned long long)offset);
|
||||
} /* end if */
|
||||
|
||||
if(0 == bytes_read) {
|
||||
@ -777,11 +786,13 @@ H5FD_sec2_write(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UNU
|
||||
if(REGION_OVERFLOW(addr, size))
|
||||
HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, FAIL, "addr overflow, addr = %llu, size = %llu", (unsigned long long)addr, (unsigned long long)size)
|
||||
|
||||
/* Seek to the correct location */
|
||||
#ifndef H5_HAVE_PREADWRITE
|
||||
/* Seek to the correct location (if we don't have pwrite) */
|
||||
if(addr != file->pos || OP_WRITE != file->op) {
|
||||
if(HDlseek(file->fd, (HDoff_t)addr, SEEK_SET) < 0)
|
||||
HSYS_GOTO_ERROR(H5E_IO, H5E_SEEKERROR, FAIL, "unable to seek to proper position")
|
||||
} /* end if */
|
||||
#endif /* H5_HAVE_PREADWRITE */
|
||||
|
||||
/* Write the data, being careful of interrupted system calls and partial
|
||||
* results
|
||||
@ -790,6 +801,7 @@ H5FD_sec2_write(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UNU
|
||||
|
||||
h5_posix_io_t bytes_in = 0; /* # of bytes to write */
|
||||
h5_posix_io_ret_t bytes_wrote = -1; /* # of bytes written */
|
||||
HDoff_t offset = (HDoff_t)addr;
|
||||
|
||||
/* Trying to write more bytes than the return type can handle is
|
||||
* undefined behavior in POSIX.
|
||||
@ -800,15 +812,21 @@ H5FD_sec2_write(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UNU
|
||||
bytes_in = (h5_posix_io_t)size;
|
||||
|
||||
do {
|
||||
#ifdef H5_HAVE_PREADWRITE
|
||||
bytes_wrote = HDpwrite(file->fd, buf, bytes_in, offset);
|
||||
offset += bytes_wrote;
|
||||
#else
|
||||
bytes_wrote = HDwrite(file->fd, buf, bytes_in);
|
||||
#endif /* H5_HAVE_PREADWRITE */
|
||||
} while(-1 == bytes_wrote && EINTR == errno);
|
||||
|
||||
if(-1 == bytes_wrote) { /* error */
|
||||
int myerrno = errno;
|
||||
time_t mytime = HDtime(NULL);
|
||||
HDoff_t myoffset = HDlseek(file->fd, (HDoff_t)0, SEEK_CUR);
|
||||
|
||||
HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "file write failed: time = %s, filename = '%s', file descriptor = %d, errno = %d, error message = '%s', buf = %p, total write size = %llu, bytes this sub-write = %llu, bytes actually written = %llu, offset = %llu", HDctime(&mytime), file->filename, file->fd, myerrno, HDstrerror(myerrno), buf, (unsigned long long)size, (unsigned long long)bytes_in, (unsigned long long)bytes_wrote, (unsigned long long)myoffset);
|
||||
offset = HDlseek(file->fd, (HDoff_t)0, SEEK_CUR);
|
||||
|
||||
HGOTO_ERROR(H5E_IO, H5E_WRITEERROR, FAIL, "file write failed: time = %s, filename = '%s', file descriptor = %d, errno = %d, error message = '%s', buf = %p, total write size = %llu, bytes this sub-write = %llu, bytes actually written = %llu, offset = %llu", HDctime(&mytime), file->filename, file->fd, myerrno, HDstrerror(myerrno), buf, (unsigned long long)size, (unsigned long long)bytes_in, (unsigned long long)bytes_wrote, (unsigned long long)offset);
|
||||
} /* end if */
|
||||
|
||||
HDassert(bytes_wrote > 0);
|
||||
|
@ -1156,6 +1156,9 @@ typedef off_t h5_stat_size_t;
|
||||
#ifndef HDpowf
|
||||
#define HDpowf(X,Y) powf(X,Y)
|
||||
#endif /* HDpowf */
|
||||
#ifndef HDpread
|
||||
#define HDpread(F,B,C,O) pread(F,B,C,O)
|
||||
#endif /* HDpread */
|
||||
#ifndef HDprintf
|
||||
#define HDprintf(...) HDfprintf(stdout, __VA_ARGS__)
|
||||
#endif /* HDprintf */
|
||||
@ -1168,6 +1171,9 @@ typedef off_t h5_stat_size_t;
|
||||
#ifndef HDputs
|
||||
#define HDputs(S) puts(S)
|
||||
#endif /* HDputs */
|
||||
#ifndef HDpwrite
|
||||
#define HDpwrite(F,B,C,O) pwrite(F,B,C,O)
|
||||
#endif /* HDpwrite */
|
||||
#ifndef HDqsort
|
||||
#define HDqsort(M,N,Z,F) qsort(M,N,Z,F)
|
||||
#endif /* HDqsort*/
|
||||
|
Loading…
x
Reference in New Issue
Block a user