blob: 606f3ec04a2f69d71033eb218a8b3786ca5e7a22 [file] [log] [blame]
// Copyright 2017 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 "garnet/bin/ktrace_provider/reader.h"
#include <fcntl.h>
#include <limits.h>
#include <sys/stat.h>
#include <unistd.h>
#include "lib/fxl/files/eintr_wrapper.h"
namespace ktrace_provider {
namespace {
constexpr char kTraceDev[] = "/dev/misc/ktrace";
} // namespace
Reader::Reader() : fd_(open(kTraceDev, O_RDONLY)) {}
ktrace_header_t* Reader::ReadNextRecord() {
if (AvailableBytes() < sizeof(ktrace_header_t))
ReadMoreData();
if (AvailableBytes() < sizeof(ktrace_header_t))
return nullptr;
auto record = reinterpret_cast<ktrace_header_t*>(current_);
if (AvailableBytes() < KTRACE_LEN(record->tag))
ReadMoreData();
if (AvailableBytes() < KTRACE_LEN(record->tag))
return nullptr;
record = reinterpret_cast<ktrace_header_t*>(current_);
current_ += KTRACE_LEN(record->tag);
return record;
}
void Reader::ReadMoreData() {
memcpy(buffer_, current_, AvailableBytes());
marker_ = buffer_ + AvailableBytes();
while (marker_ < end_) {
int bytes_read =
HANDLE_EINTR(read(fd_.get(), marker_, std::distance(marker_, end_)));
if (bytes_read <= 0)
break;
marker_ += bytes_read;
}
current_ = buffer_;
}
} // namespace ktrace_provider