[Reproducers] Stop recording instead of deallocating

The command interpreter holds a pointer to a DataRecorder. After
generating the reproducer, we deallocated all the DataRecorders, causing
the command interpreter to hold a non-null reference to an invalid
object.

This patch changes the behavior of the command provider to stop the
DataRecorders when a reproducer is generated, rather than deallocating
them.

llvm-svn: 355940
This commit is contained in:
Jonas Devlieghere 2019-03-12 17:10:28 +00:00
parent 6c0bbfc0c9
commit 5650eb5b00
2 changed files with 10 additions and 2 deletions

View File

@ -115,7 +115,7 @@ class DataRecorder {
public:
DataRecorder(FileSpec filename, std::error_code &ec)
: m_filename(std::move(filename)),
m_os(m_filename.GetPath(), ec, llvm::sys::fs::F_Text) {}
m_os(m_filename.GetPath(), ec, llvm::sys::fs::F_Text), m_record(true) {}
static llvm::Expected<std::unique_ptr<DataRecorder>>
Create(FileSpec filename);
@ -128,9 +128,15 @@ public:
const FileSpec &GetFilename() { return m_filename; }
void Stop() {
assert(m_record);
m_record = false;
}
private:
FileSpec m_filename;
llvm::raw_fd_ostream m_os;
bool m_record;
};
struct CommandInfo {

View File

@ -247,8 +247,10 @@ DataRecorder *CommandProvider::GetNewDataRecorder() {
void CommandProvider::Keep() {
std::vector<std::string> files;
for (auto &recorder : m_data_recorders)
for (auto &recorder : m_data_recorders) {
recorder->Stop();
files.push_back(recorder->GetFilename().GetPath());
}
FileSpec file = GetRoot().CopyByAppendingPathComponent(info::file);
std::error_code ec;