| // 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 <lib/zircon-internal/ktrace.h> |
| |
| #include "garnet/bin/ktrace_provider/reader.h" |
| |
| namespace ktrace_provider { |
| |
| Reader::Reader(const char* buffer, size_t buffer_size) |
| : current_(buffer), |
| marker_(buffer), |
| end_(buffer + buffer_size) { |
| } |
| |
| const ktrace_header_t* Reader::ReadNextRecord() { |
| if (AvailableBytes() < sizeof(ktrace_header_t)) { |
| ReadMoreData(); |
| } |
| |
| if (AvailableBytes() < sizeof(ktrace_header_t)) { |
| FXL_VLOG(10) << "No more records"; |
| return nullptr; |
| } |
| |
| auto record = reinterpret_cast<const ktrace_header_t*>(current_); |
| |
| if (AvailableBytes() < KTRACE_LEN(record->tag)) { |
| ReadMoreData(); |
| } |
| |
| if (AvailableBytes() < KTRACE_LEN(record->tag)) { |
| FXL_VLOG(10) << "No more records, incomplete last record"; |
| return nullptr; |
| } |
| |
| record = reinterpret_cast<const ktrace_header_t*>(current_); |
| current_ += KTRACE_LEN(record->tag); |
| |
| number_bytes_read_ += KTRACE_LEN(record->tag); |
| number_records_read_ += 1; |
| |
| FXL_VLOG(10) << "Importing ktrace event 0x" << std::hex |
| << KTRACE_EVENT(record->tag) << ", size " << std::dec |
| << KTRACE_LEN(record->tag); |
| |
| return record; |
| } |
| |
| } // namespace ktrace_provider |