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 22:32:55 -05:00
committed by Daniel Agar
parent 38a794260c
commit 71d514d359
+17 -13
View File
@@ -721,10 +721,6 @@ Replay::nextDataMessage(std::ifstream &file, Subscription &subscription, int msg
} }
switch (message_header.msg_type) { switch (message_header.msg_type) {
case (int)ULogMessageType::ADD_LOGGED_MSG:
readAndAddSubscription(file, message_header.msg_size);
break;
case (int)ULogMessageType::DATA: case (int)ULogMessageType::DATA:
file.read((char *)&file_msg_id, sizeof(file_msg_id)); file.read((char *)&file_msg_id, sizeof(file_msg_id));
@@ -751,6 +747,7 @@ Replay::nextDataMessage(std::ifstream &file, Subscription &subscription, int msg
break; break;
case (int)ULogMessageType::REMOVE_LOGGED_MSG: //skip these case (int)ULogMessageType::REMOVE_LOGGED_MSG: //skip these
case (int)ULogMessageType::ADD_LOGGED_MSG:
case (int)ULogMessageType::PARAMETER: case (int)ULogMessageType::PARAMETER:
case (int)ULogMessageType::DROPOUT: case (int)ULogMessageType::DROPOUT:
case (int)ULogMessageType::INFO: case (int)ULogMessageType::INFO:
@@ -907,19 +904,26 @@ Replay::run()
ulog_message_header_s message_header; ulog_message_header_s message_header;
replay_file.seekg(_data_section_start); replay_file.seekg(_data_section_start);
//we know the next message must be an ADD_LOGGED_MSG while (true) {
ReadAndAndAddSubResult res; //we are in the Definition & Data Section Message Header section
do {
replay_file.read((char *)&message_header, ULOG_MSG_HEADER_LEN); replay_file.read((char *)&message_header, ULOG_MSG_HEADER_LEN);
res = readAndAddSubscription(replay_file, message_header.msg_size);
if (res == ReadAndAndAddSubResult::kFailure) { if (!replay_file) {
PX4_ERR("Failed to read subscription"); break;
return;
} }
} 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(); const uint64_t timestamp_offset = getTimestampOffset();
uint32_t nr_published_messages = 0; uint32_t nr_published_messages = 0;