[ismrmrd] 126/177: first steps in pushing HDF5 errors onto ISMRMRD error stack
Ghislain Vaillant
ghisvail-guest at moszumanska.debian.org
Wed Jan 14 20:02:10 UTC 2015
This is an automated email from the git hooks/post-receive script.
ghisvail-guest pushed a commit to annotated tag v1.1.0.beta.1
in repository ismrmrd.
commit 24b4e669ecc9d26fbc5f7fe1a66a6a955e8c2bbf
Author: Joseph Naegele <joseph.naegele at gmail.com>
Date: Tue Sep 30 14:00:29 2014 -0400
first steps in pushing HDF5 errors onto ISMRMRD error stack
---
include/ismrmrd/ismrmrd.h | 1 +
libsrc/dataset.c | 37 ++++++++++++++++++++++++++++---------
libsrc/ismrmrd.c | 3 ++-
libsrc/ismrmrd.cpp | 30 ++++++++++++++++++------------
4 files changed, 49 insertions(+), 22 deletions(-)
diff --git a/include/ismrmrd/ismrmrd.h b/include/ismrmrd/ismrmrd.h
index 26d983f..b424206 100644
--- a/include/ismrmrd/ismrmrd.h
+++ b/include/ismrmrd/ismrmrd.h
@@ -106,6 +106,7 @@ enum ISMRMRD_ErrorCodes {
ISMRMRD_FILEERROR,
ISMRMRD_TYPEERROR,
ISMRMRD_RUNTIMEERROR,
+ ISMRMRD_HDF5ERROR,
ISMRMRD_ENDERROR
};
diff --git a/libsrc/dataset.c b/libsrc/dataset.c
index f5a60b9..61d5132 100644
--- a/libsrc/dataset.c
+++ b/libsrc/dataset.c
@@ -451,7 +451,15 @@ static hid_t get_hdf5type_ndarray(uint16_t data_type) {
}
return hdfdatatype;
}
-
+
+static herr_t walk_hdf5_errors(unsigned int n, const H5E_error2_t *desc, void *client_data)
+{
+ (void)n;
+ (void)client_data;
+ ismrmrd_push_error(desc->file_name, desc->line, desc->func_name, ISMRMRD_HDF5ERROR, desc->desc);
+ return 0;
+}
+
uint32_t get_number_of_elements(const ISMRMRD_Dataset *dset, const char * path)
{
if (dset) {
@@ -600,6 +608,8 @@ int append_element(const ISMRMRD_Dataset * dset, const char * path, void * elem,
/* Public functions */
/********************/
int ismrmrd_init_dataset(ISMRMRD_Dataset *dset, const char *filename, const char *groupname) {
+ /* Disable HDF5 automatic error printing */
+ H5Eset_auto2(H5E_DEFAULT, NULL, NULL);
if (dset) {
dset->filename = (char *) malloc(strlen(filename) + 1);
if (dset->filename == NULL) {
@@ -617,7 +627,7 @@ int ismrmrd_init_dataset(ISMRMRD_Dataset *dset, const char *filename, const char
return ISMRMRD_NOERROR;
}
else {
- return ISMRMRD_RUNTIMEERROR;
+ return ISMRMRD_PUSH_ERR(ISMRMRD_RUNTIMEERROR, "Dataset pointer should not be NULL");
}
}
@@ -629,14 +639,15 @@ int ismrmrd_open_dataset(ISMRMRD_Dataset *dset, const bool create_if_needed) {
/* Try opening the file */
/* Note the is_hdf5 function doesn't work well when trying to open multiple files */
/* Suppress errors with the try macro. */
- H5E_BEGIN_TRY {
+ /* H5E_BEGIN_TRY { */
fileid = H5Fopen(dset->filename, H5F_ACC_RDWR, H5P_DEFAULT);
- } H5E_END_TRY
+ /* } H5E_END_TRY */
if (fileid > 0) {
dset->fileid = fileid;
}
else if (create_if_needed == false) {
+ H5Ewalk2(H5E_DEFAULT, H5E_WALK_UPWARD, walk_hdf5_errors, NULL);
/* Some sort of error opening the file */
/* Maybe it doesn't exist? */
return ISMRMRD_PUSH_ERR(ISMRMRD_FILEERROR, "Failed to open file.");
@@ -746,11 +757,16 @@ char * ismrmrd_read_header(const ISMRMRD_Dataset *dset) {
path = make_path(dset, "xml");
if (link_exists(dset, path)) {
- void *buff[1];
+ void *buff[1] = { NULL };
dataset = H5Dopen2(dset->fileid, path, H5P_DEFAULT);
datatype = get_hdf5type_xmlheader();
/* Read it into a 1D buffer*/
h5status = H5Dread(dataset, datatype, H5S_ALL, H5S_ALL, H5P_DEFAULT, buff);
+ if (h5status < 0 || buff[0] == NULL) {
+ ISMRMRD_PUSH_ERR(ISMRMRD_FILEERROR, "Failed to read header.");
+ free(path);
+ return NULL;
+ }
/* Unpack */
xmlstring = (char *) malloc(strlen(buff[0])+1);
@@ -762,14 +778,17 @@ char * ismrmrd_read_header(const ISMRMRD_Dataset *dset) {
/* Clean up */
h5status = H5Tclose(datatype);
+ if (h5status < 0) {
+ ISMRMRD_PUSH_ERR(ISMRMRD_FILEERROR, "Failed to close XML header HDF5 datatype.");
+ return NULL;
+ }
h5status = H5Dclose(dataset);
- free(path);
-
if (h5status < 0) {
- ISMRMRD_PUSH_ERR(ISMRMRD_FILEERROR, "Failed to read header.");
+ ISMRMRD_PUSH_ERR(ISMRMRD_FILEERROR, "Failed to close XML header HDF5 dataset.");
return NULL;
}
-
+
+ free(path);
return xmlstring;
}
else {
diff --git a/libsrc/ismrmrd.c b/libsrc/ismrmrd.c
index f208c2a..4a0c791 100644
--- a/libsrc/ismrmrd.c
+++ b/libsrc/ismrmrd.c
@@ -695,7 +695,8 @@ char *ismrmrd_strerror(int code) {
"Memory Error",
"File Error",
"Type Error",
- "Runtime Error"
+ "Runtime Error",
+ "HDF5 Error",
};
return error_messages[code];
}
diff --git a/libsrc/ismrmrd.cpp b/libsrc/ismrmrd.cpp
index 66051c2..6cda6f3 100644
--- a/libsrc/ismrmrd.cpp
+++ b/libsrc/ismrmrd.cpp
@@ -7,18 +7,6 @@
namespace ISMRMRD {
-std::string build_exception_string(void)
-{
- char *file = NULL, *func = NULL, *msg = NULL;
- int line = 0, code = 0;
- std::stringstream stream;
- while (ismrmrd_pop_error(&file, &line, &func, &code, &msg)) {
- stream << "ISMRMRD " << ismrmrd_strerror(code) << " in " << func <<
- " (" << file << ":" << line << ": " << msg << std::endl;
- }
- return stream.str();
-}
-
//
// AcquisitionHeader class implementation
//
@@ -1055,4 +1043,22 @@ template EXPORTISMRMRD class NDArray<double>;
template EXPORTISMRMRD class NDArray<complex_float_t>;
template EXPORTISMRMRD class NDArray<complex_double_t>;
+
+// Helper function for generating exception message from ISMRMRD error stack
+std::string build_exception_string(void)
+{
+ char *file = NULL, *func = NULL, *msg = NULL;
+ int line = 0, code = 0;
+ std::stringstream stream;
+ for (int i = 0; ismrmrd_pop_error(&file, &line, &func, &code, &msg); ++i) {
+ if (i > 0) {
+ stream << std::endl;
+ }
+ stream << "ISMRMRD " << ismrmrd_strerror(code) << " in " << func <<
+ " (" << file << ":" << line << ": " << msg;
+ }
+ return stream.str();
+}
+
+
} // namespace ISMRMRD
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/ismrmrd.git
More information about the debian-science-commits
mailing list