Skip to content
Snippets Groups Projects

Fix Segfault caused by std::bad_alloc in RobotUnitModuleLogging

Merged Christoph Pohl requested to merge fix/RobotUnitModuleLogging_BadAlloc into master
2 files
+ 73
74
Compare changes
  • Side-by-side
  • Inline
Files
2
@@ -249,8 +249,8 @@ namespace armarx::RobotUnitModule {
throw LogicError{"writeRecentIterationsToFile could not open filestream for '" +
pb.getPath() + ".messages'"};
}
ARMARX_INFO << "writing the last " << backlog.size() << " iterations to " << pb.getPath()
<< ".{csv, messages}";
// ARMARX_INFO << "writing the last " << backlog.size() << " iterations to " << pb.getPath()
// << ".{csv, messages}";
//write csv header
{
outCSV << "iteration;timestamp";
@@ -269,58 +269,58 @@ namespace armarx::RobotUnitModule {
outCSV << std::endl;
}
for (const ::armarx::detail::ControlThreadOutputBufferEntry &iteration: backlog) {
//write csv data
{
outCSV << iteration.iteration << ";" << iteration.sensorValuesTimestamp;
//sens
{
for (const SensorValueBase *val: iteration.sensors) {
for (std::size_t idxField = 0; idxField < val->getNumberOfDataFields();
++idxField) {
std::string s;
val->getDataFieldAs(idxField, s);
outCSV << ";" << s;
}
}
}
//ctrl
{
for (const auto &vals: iteration.control) {
for (const ControlTargetBase *val: vals) {
for (std::size_t idxField = 0; idxField < val->getNumberOfDataFields();
++idxField) {
std::string s;
val->getDataFieldAs(idxField, s);
outCSV << ";" << s;
}
}
}
}
outCSV << std::endl;
}
//write message data
{
bool atLeastOneMessage = false;
for (const ::armarx::detail::RtMessageLogEntryBase *msg:
iteration.messages.getEntries()) {
if (!msg) {
break;
}
outMsg << "[" << msg->getTime().toDateTime() << "] iteration "
<< iteration.iteration << ":\n"
<< msg->format() << std::endl;
atLeastOneMessage = true;
}
if (atLeastOneMessage) {
outMsg << "\nmessages lost: " << iteration.messages.messagesLost
<< " (required additional "
<< iteration.messages.requiredAdditionalBufferSpace << " bytes, "
<< iteration.messages.requiredAdditionalEntries << " message entries)\n"
<< std::endl;
}
}
}
// for (const ::armarx::detail::ControlThreadOutputBufferEntry &iteration: backlog) {
// //write csv data
// {
// outCSV << iteration.iteration << ";" << iteration.sensorValuesTimestamp;
// //sens
// {
// for (const SensorValueBase *val: iteration.sensors) {
// for (std::size_t idxField = 0; idxField < val->getNumberOfDataFields();
// ++idxField) {
// std::string s;
// val->getDataFieldAs(idxField, s);
// outCSV << ";" << s;
// }
// }
// }
// //ctrl
// {
// for (const auto &vals: iteration.control) {
// for (const ControlTargetBase *val: vals) {
// for (std::size_t idxField = 0; idxField < val->getNumberOfDataFields();
// ++idxField) {
// std::string s;
// val->getDataFieldAs(idxField, s);
// outCSV << ";" << s;
// }
// }
// }
// }
// outCSV << std::endl;
// }
// //write message data
// {
// bool atLeastOneMessage = false;
// for (const ::armarx::detail::RtMessageLogEntryBase *msg:
// iteration.messages.getEntries()) {
// if (!msg) {
// break;
// }
// outMsg << "[" << msg->getTime().toDateTime() << "] iteration "
// << iteration.iteration << ":\n"
// << msg->format() << std::endl;
// atLeastOneMessage = true;
// }
// if (atLeastOneMessage) {
// outMsg << "\nmessages lost: " << iteration.messages.messagesLost
// << " (required additional "
// << iteration.messages.requiredAdditionalBufferSpace << " bytes, "
// << iteration.messages.requiredAdditionalEntries << " message entries)\n"
// << std::endl;
// }
// }
// }
}
RobotUnitDataStreaming::DataStreamingDescription
@@ -491,10 +491,10 @@ namespace armarx::RobotUnitModule {
//remove backlog entries
const auto start_time_remove_backlog_entries = IceUtil::Time::now();
{
while (!backlog.empty() &&
backlog.front().writeTimestamp + rtLoggingBacklogRetentionTime < now) {
backlog.pop_front();
}
// while (!backlog.empty() &&
// backlog.front().writeTimestamp + rtLoggingBacklogRetentionTime < now) {
// backlog.pop_front();
// }
}
//log all
const auto start_time_log_all = IceUtil::Time::now();
@@ -527,8 +527,8 @@ namespace armarx::RobotUnitModule {
}
}
ARMARX_DEBUG << ::deactivateSpam() << "the last " << backlog.size()
<< " iterations are stored";
// ARMARX_DEBUG << ::deactivateSpam() << "the last " << backlog.size()
// << " iterations are stored";
//flush all files
const auto start_time_flush_all_files = IceUtil::Time::now();
{
@@ -675,9 +675,9 @@ namespace armarx::RobotUnitModule {
}
if (!rtDataStreamingEntry.empty()) {
durations.sens_stream.start();
for (auto &[_, data]: rtDataStreamingEntry) {
for (auto &[_, streamingEntry]: rtDataStreamingEntry) {
durations.sens_stream_elem.start();
data.processSens(*val, idxDev, idxField);
streamingEntry.processSens(*val, idxDev, idxField);
durations.sens_stream_elem.stop();
}
durations.sens_stream.stop();
@@ -712,9 +712,9 @@ namespace armarx::RobotUnitModule {
}
if (!rtDataStreamingEntry.empty()) {
durations.ctrl_stream.start();
for (auto &[_, data]: rtDataStreamingEntry) {
for (auto &[_, streamingEntry]: rtDataStreamingEntry) {
durations.ctrl_stream_elem.start();
data.processCtrl(*val, idxDev, idxVal, idxField);
streamingEntry.processCtrl(*val, idxDev, idxVal, idxField);
durations.ctrl_stream_elem.stop();
}
durations.ctrl_stream.stop();
@@ -730,14 +730,14 @@ namespace armarx::RobotUnitModule {
//finish processing
{
//store data to backlog
{
durations.backlog.start();
ARMARX_TRACE;
if (data.writeTimestamp + rtLoggingBacklogRetentionTime >= now) {
backlog.emplace_back(data, true); //true for minimal copy
}
durations.backlog.stop();
}
// {
// durations.backlog.start();
// ARMARX_TRACE;
// if (data.writeTimestamp + rtLoggingBacklogRetentionTime >= now) {
// backlog.emplace_back(data, true); //true for minimal copy
// }
// durations.backlog.stop();
// }
//print + reset messages
{
durations.msg.start();
@@ -788,7 +788,6 @@ namespace armarx::RobotUnitModule {
rtLoggingBacklogRetentionTime =
IceUtil::Time::milliSeconds(getProperty<std::size_t>("RTLogging_KeepIterationsForMs"));
ARMARX_CHECK_GREATER(getControlThreadTargetPeriod().toMicroSeconds(), 0);
}
Loading