mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-28 02:11:43 +00:00
[wpiutil] DataLog: Ensure file is written on shutdown (#6087)
Previously the thread could end without the file being written.
This commit is contained in:
@@ -179,7 +179,7 @@ DataLog::DataLog(wpi::Logger& msglog,
|
||||
DataLog::~DataLog() {
|
||||
{
|
||||
std::scoped_lock lock{m_mutex};
|
||||
m_state = kShutdown;
|
||||
m_shutdown = true;
|
||||
m_doFlush = true;
|
||||
}
|
||||
m_cond.notify_all();
|
||||
@@ -419,7 +419,7 @@ void DataLog::WriterThreadMain(std::string_view dir) {
|
||||
uintmax_t written = 0;
|
||||
|
||||
std::unique_lock lock{m_mutex};
|
||||
while (m_state != kShutdown) {
|
||||
do {
|
||||
bool doFlush = false;
|
||||
auto timeoutTime = std::chrono::steady_clock::now() + periodTime;
|
||||
if (m_cond.wait_until(lock, timeoutTime) == std::cv_status::timeout) {
|
||||
@@ -557,7 +557,7 @@ void DataLog::WriterThreadMain(std::string_view dir) {
|
||||
}
|
||||
toWrite.resize(0);
|
||||
}
|
||||
}
|
||||
} while (!m_shutdown);
|
||||
}
|
||||
|
||||
void DataLog::WriterThreadMain(
|
||||
@@ -580,7 +580,7 @@ void DataLog::WriterThreadMain(
|
||||
std::vector<Buffer> toWrite;
|
||||
|
||||
std::unique_lock lock{m_mutex};
|
||||
while (m_state != kShutdown) {
|
||||
do {
|
||||
bool doFlush = false;
|
||||
auto timeoutTime = std::chrono::steady_clock::now() + periodTime;
|
||||
if (m_cond.wait_until(lock, timeoutTime) == std::cv_status::timeout) {
|
||||
@@ -614,7 +614,7 @@ void DataLog::WriterThreadMain(
|
||||
}
|
||||
toWrite.resize(0);
|
||||
}
|
||||
}
|
||||
} while (!m_shutdown);
|
||||
|
||||
write({}); // indicate EOF
|
||||
}
|
||||
|
||||
@@ -486,12 +486,12 @@ class DataLog final {
|
||||
mutable wpi::mutex m_mutex;
|
||||
wpi::condition_variable m_cond;
|
||||
bool m_doFlush{false};
|
||||
bool m_shutdown{false};
|
||||
enum State {
|
||||
kStart,
|
||||
kActive,
|
||||
kPaused,
|
||||
kStopped,
|
||||
kShutdown,
|
||||
} m_state = kActive;
|
||||
double m_period;
|
||||
std::string m_extraHeader;
|
||||
|
||||
18
wpiutil/src/test/native/cpp/DataLogTest.cpp
Normal file
18
wpiutil/src/test/native/cpp/DataLogTest.cpp
Normal file
@@ -0,0 +1,18 @@
|
||||
// Copyright (c) FIRST and other WPILib contributors.
|
||||
// Open Source Software; you can modify and/or share it under the terms of
|
||||
// the WPILib BSD license file in the root directory of this project.
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include "wpi/DataLog.h"
|
||||
|
||||
TEST(DataLogTest, SimpleInt) {
|
||||
std::vector<uint8_t> data;
|
||||
{
|
||||
wpi::log::DataLog log{
|
||||
[&](auto out) { data.insert(data.end(), out.begin(), out.end()); }};
|
||||
int entry = log.Start("test", "int64");
|
||||
log.AppendInteger(entry, 1, 0);
|
||||
}
|
||||
ASSERT_EQ(data.size(), 66u);
|
||||
}
|
||||
Reference in New Issue
Block a user