From f0b956017fa9515beaf4e25a735412787e5d2d5d Mon Sep 17 00:00:00 2001 From: Daniel Weindl Date: Tue, 26 Nov 2024 17:21:49 +0100 Subject: [PATCH] ..... --- src/hdf5.cpp | 47 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 7 deletions(-) diff --git a/src/hdf5.cpp b/src/hdf5.cpp index 7ab8274e0f..249f2dc90a 100644 --- a/src/hdf5.cpp +++ b/src/hdf5.cpp @@ -696,6 +696,13 @@ void writeReturnDataDiagnosis( ); } +// work-around for macos segfaults, use struct without std::string +struct LogItemCStr { + int severity; + const char* identifier; + const char* message; +}; + void writeLogItemsToHDF5( H5::H5File const& file, std::vector const& logItems, std::string const& hdf5Location @@ -707,26 +714,52 @@ void writeLogItemsToHDF5( hsize_t dims[1] = {logItems.size()}; H5::DataSpace dataspace(1, dims); + /* // Create a compound datatype for the LogItem struct. H5::CompType logItemType(sizeof(amici::LogItem)); logItemType.insertMember( "severity", HOFFSET(amici::LogItem, severity), H5::PredType::NATIVE_INT ); - // crashes on macos? - /* + auto vlstr_type = H5::StrType(H5::PredType::C_S1, H5T_VARIABLE); logItemType.insertMember( - "identifier", HOFFSET(amici::LogItem, identifier), - H5::StrType(H5::PredType::C_S1, H5T_VARIABLE) + "identifier", HOFFSET(amici::LogItem, identifier), vlstr_type ); logItemType.insertMember( - "message", HOFFSET(amici::LogItem, message), - H5::StrType(H5::PredType::C_S1, H5T_VARIABLE) + "message", HOFFSET(amici::LogItem, message), vlstr_type ); - */ H5::DataSet dataset = file.createDataSet(hdf5Location, logItemType, dataspace); + + // works on Ubuntu, but segfaultson macos dataset.write(logItems.data(), logItemType); + */ + + H5::CompType logItemType(sizeof(LogItemCStr)); + logItemType.insertMember( + "severity", HOFFSET(LogItemCStr, severity), + H5::PredType::NATIVE_INT + ); + auto vlstr_type = H5::StrType(H5::PredType::C_S1, H5T_VARIABLE); + logItemType.insertMember( + "identifier", HOFFSET(LogItemCStr, identifier), vlstr_type + ); + logItemType.insertMember( + "message", HOFFSET(LogItemCStr, message), vlstr_type + ); + H5::DataSet dataset + = file.createDataSet(hdf5Location, logItemType, dataspace); + + // Convert std::vector to std::vector + std::vector buffer(logItems.size()); + for (size_t i = 0; i < logItems.size(); ++i) { + buffer[i].severity = static_cast(logItems[i].severity); + buffer[i].identifier = logItems[i].identifier.c_str(); + buffer[i].message = logItems[i].message.c_str(); + } + + // Write the data to the dataset. + dataset.write(buffer.data(), logItemType); } catch (H5::Exception& e) { throw AmiException(e.getCDetailMsg()); }