Skip to content

Commit

Permalink
.....
Browse files Browse the repository at this point in the history
  • Loading branch information
dweindl committed Nov 26, 2024
1 parent 3c9ffd7 commit f0b9560
Showing 1 changed file with 40 additions and 7 deletions.
47 changes: 40 additions & 7 deletions src/hdf5.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<amici::LogItem> const& logItems,
std::string const& hdf5Location
Expand All @@ -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<LogItem> to std::vector<LogItemCStr>
std::vector<LogItemCStr> buffer(logItems.size());
for (size_t i = 0; i < logItems.size(); ++i) {
buffer[i].severity = static_cast<int>(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());
}
Expand Down

0 comments on commit f0b9560

Please sign in to comment.