replay: avoid recursion when adding subscriptions

readAndAddSubscription uses nextDataMessage to find the first
corresponding data and nextDataMessage calls readAndAddSubscription
when it finds a new message definition.
This commit is contained in:
bresch 2025-03-03 14:47:06 +01:00 committed by Daniel Agar
parent 38a794260c
commit 71d514d359

View File

@ -721,10 +721,6 @@ Replay::nextDataMessage(std::ifstream &file, Subscription &subscription, int msg
}
switch (message_header.msg_type) {
case (int)ULogMessageType::ADD_LOGGED_MSG:
readAndAddSubscription(file, message_header.msg_size);
break;
case (int)ULogMessageType::DATA:
file.read((char *)&file_msg_id, sizeof(file_msg_id));
@ -751,6 +747,7 @@ Replay::nextDataMessage(std::ifstream &file, Subscription &subscription, int msg
break;
case (int)ULogMessageType::REMOVE_LOGGED_MSG: //skip these
case (int)ULogMessageType::ADD_LOGGED_MSG:
case (int)ULogMessageType::PARAMETER:
case (int)ULogMessageType::DROPOUT:
case (int)ULogMessageType::INFO:
@ -907,19 +904,26 @@ Replay::run()
ulog_message_header_s message_header;
replay_file.seekg(_data_section_start);
//we know the next message must be an ADD_LOGGED_MSG
ReadAndAndAddSubResult res;
do {
while (true) {
//we are in the Definition & Data Section Message Header section
replay_file.read((char *)&message_header, ULOG_MSG_HEADER_LEN);
res = readAndAddSubscription(replay_file, message_header.msg_size);
if (res == ReadAndAndAddSubResult::kFailure) {
PX4_ERR("Failed to read subscription");
return;
if (!replay_file) {
break;
}
} while (res != ReadAndAndAddSubResult::kSuccess);
if (message_header.msg_type == (int)ULogMessageType::ADD_LOGGED_MSG) {
readAndAddSubscription(replay_file, message_header.msg_size);
} else if (message_header.msg_type == (int)ULogMessageType::DATA) {
// End of Definition & Data Section Message Header section
break;
} else {
// Not important for now, skip
replay_file.seekg(message_header.msg_size, ios::cur);
}
}
const uint64_t timestamp_offset = getTimestampOffset();
uint32_t nr_published_messages = 0;