[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