aboutsummaryrefslogtreecommitdiff
path: root/src/trace_processor/importers/fuchsia/fuchsia_trace_tokenizer.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/trace_processor/importers/fuchsia/fuchsia_trace_tokenizer.cc')
-rw-r--r--src/trace_processor/importers/fuchsia/fuchsia_trace_tokenizer.cc37
1 files changed, 18 insertions, 19 deletions
diff --git a/src/trace_processor/importers/fuchsia/fuchsia_trace_tokenizer.cc b/src/trace_processor/importers/fuchsia/fuchsia_trace_tokenizer.cc
index a78e89681..6628c41c6 100644
--- a/src/trace_processor/importers/fuchsia/fuchsia_trace_tokenizer.cc
+++ b/src/trace_processor/importers/fuchsia/fuchsia_trace_tokenizer.cc
@@ -16,11 +16,11 @@
#include "src/trace_processor/importers/fuchsia/fuchsia_trace_tokenizer.h"
-#include <inttypes.h>
-#include <unordered_map>
+#include <cinttypes>
#include "perfetto/base/logging.h"
#include "perfetto/ext/base/string_view.h"
+#include "perfetto/trace_processor/trace_blob.h"
#include "src/trace_processor/importers/common/process_tracker.h"
#include "src/trace_processor/importers/common/slice_tracker.h"
#include "src/trace_processor/importers/fuchsia/fuchsia_record.h"
@@ -70,8 +70,9 @@ FuchsiaTraceTokenizer::FuchsiaTraceTokenizer(TraceProcessorContext* context)
FuchsiaTraceTokenizer::~FuchsiaTraceTokenizer() = default;
-util::Status FuchsiaTraceTokenizer::Parse(std::unique_ptr<uint8_t[]> data,
- size_t size) {
+util::Status FuchsiaTraceTokenizer::Parse(TraceBlobView blob) {
+ size_t size = blob.size();
+
// The relevant internal state is |leftover_bytes_|. Each call to Parse should
// maintain the following properties, unless a fatal error occurs in which
// case it should return false and no assumptions should be made about the
@@ -95,8 +96,8 @@ util::Status FuchsiaTraceTokenizer::Parse(std::unique_ptr<uint8_t[]> data,
if (leftover_bytes_.size() + size < 8) {
// Even with the new bytes, we can't even read the header of the next
// record, so just add the new bytes to |leftover_bytes_| and return.
- leftover_bytes_.insert(leftover_bytes_.end(), data.get() + byte_offset,
- data.get() + size);
+ leftover_bytes_.insert(leftover_bytes_.end(), blob.data() + byte_offset,
+ blob.data() + size);
return util::OkStatus();
}
if (!leftover_bytes_.empty()) {
@@ -106,8 +107,8 @@ util::Status FuchsiaTraceTokenizer::Parse(std::unique_ptr<uint8_t[]> data,
// Copy bytes into |leftover_bytes_| so that the whole header is present,
// and update |byte_offset| and |size| accordingly.
size_t needed_bytes = 8 - leftover_bytes_.size();
- leftover_bytes_.insert(leftover_bytes_.end(), data.get() + byte_offset,
- data.get() + needed_bytes);
+ leftover_bytes_.insert(leftover_bytes_.end(), blob.data() + byte_offset,
+ blob.data() + needed_bytes);
byte_offset += needed_bytes;
size -= needed_bytes;
}
@@ -128,25 +129,24 @@ util::Status FuchsiaTraceTokenizer::Parse(std::unique_ptr<uint8_t[]> data,
if (missing_bytes <= size) {
// We have enough bytes to complete the partial record. Create a new
// buffer for that record.
- std::unique_ptr<uint8_t[]> buf(new uint8_t[record_len_bytes]);
- memcpy(&buf[0], leftover_bytes_.data(), leftover_bytes_.size());
- memcpy(&buf[leftover_bytes_.size()], &data[byte_offset], missing_bytes);
+ TraceBlob buf = TraceBlob::Allocate(record_len_bytes);
+ memcpy(buf.data(), leftover_bytes_.data(), leftover_bytes_.size());
+ memcpy(buf.data() + leftover_bytes_.size(), blob.data() + byte_offset,
+ missing_bytes);
byte_offset += missing_bytes;
size -= missing_bytes;
leftover_bytes_.clear();
-
- TraceBlobView leftover_record(std::move(buf), 0, record_len_bytes);
- ParseRecord(std::move(leftover_record));
+ ParseRecord(TraceBlobView(std::move(buf)));
} else {
// There are not enough bytes for the full record. Add all the bytes we
// have to leftover_bytes_ and wait for more.
- leftover_bytes_.insert(leftover_bytes_.end(), data.get() + byte_offset,
- data.get() + byte_offset + size);
+ leftover_bytes_.insert(leftover_bytes_.end(), blob.data() + byte_offset,
+ blob.data() + byte_offset + size);
return util::OkStatus();
}
}
- TraceBlobView full_view(std::move(data), byte_offset, size);
+ TraceBlobView full_view = blob.slice_off(byte_offset, size);
// |record_offset| is a number of bytes past |byte_offset| where the record
// under consideration starts. As a result, it must always be in the range [0,
@@ -164,8 +164,7 @@ util::Status FuchsiaTraceTokenizer::Parse(std::unique_ptr<uint8_t[]> data,
if (record_offset + record_len_bytes > size)
break;
- TraceBlobView record =
- full_view.slice(byte_offset + record_offset, record_len_bytes);
+ TraceBlobView record = full_view.slice_off(record_offset, record_len_bytes);
ParseRecord(std::move(record));
record_offset += record_len_bytes;