blob: 664e07eef09237d8a60b89d23695d955b9388b72 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <trace-reader/file_reader.h>
namespace trace {
// static
bool FileReader::Create(const char* file_path,
RecordConsumer record_consumer,
ErrorHandler error_handler,
std::unique_ptr<FileReader>* out_reader) {
ZX_DEBUG_ASSERT(out_reader != nullptr);
FILE* f = fopen(file_path, "rb");
if (f == nullptr) {
return false;
}
out_reader->reset(new FileReader(f, std::move(record_consumer),
std::move(error_handler)));
return true;
}
FileReader::FileReader(FILE* file, RecordConsumer record_consumer,
ErrorHandler error_handler)
: TraceReader(std::move(record_consumer),
std::move(error_handler)),
file_(file) {
}
void FileReader::ReadFile() {
for (;;) {
size_t to_read = buffer_.size() - buffer_end_;
size_t actual = fread(buffer_.data() + buffer_end_, 1u, to_read, file_);
if (actual == 0) {
break;
}
buffer_end_ += actual;
size_t bytes_available = buffer_end_;
size_t bytes_consumed;
trace::Chunk chunk(reinterpret_cast<const uint64_t*>(buffer_.data()),
trace::BytesToWords(bytes_available));
if (!ReadRecords(chunk)) {
ReportError("Trace stream is corrupted");
break;
}
bytes_consumed =
bytes_available - trace::WordsToBytes(chunk.remaining_words());
bytes_available -= bytes_consumed;
memmove(buffer_.data(), buffer_.data() + bytes_consumed, bytes_available);
buffer_end_ = bytes_available;
}
}
} // namespace trace