Add StringView class and switch trace processor to use it

In the TraceProcessor most of the strings derived from
protos are not terminated. Instead of passing a pointer and
a length, just pass a StringView.

Test: perfetto_unittests --gtest_filter=StringViewTest.*
Change-Id: Ibd44f54b921fb0960e6cd06b89d625a0402757e3
diff --git a/src/trace_processor/proto_trace_parser.cc b/src/trace_processor/proto_trace_parser.cc
index 96472ce..f11ccc0 100644
--- a/src/trace_processor/proto_trace_parser.cc
+++ b/src/trace_processor/proto_trace_parser.cc
@@ -19,6 +19,7 @@
 #include <string>
 
 #include "perfetto/base/logging.h"
+#include "perfetto/base/string_view.h"
 #include "perfetto/base/utils.h"
 #include "perfetto/protozero/proto_decoder.h"
 #include "src/trace_processor/blob_reader.h"
@@ -136,24 +137,21 @@
 void ProtoTraceParser::ParseProcess(const uint8_t* data, size_t length) {
   ProtoDecoder decoder(data, length);
   uint32_t pid = 0;
-  const char* process_name = nullptr;
-  size_t process_name_len = 0;
+  base::StringView process_name;
   for (auto fld = decoder.ReadField(); fld.id != 0; fld = decoder.ReadField()) {
     switch (fld.id) {
       case protos::ProcessTree::Process::kPidFieldNumber:
         pid = fld.as_uint32();
         break;
       case protos::ProcessTree::Process::kCmdlineFieldNumber:
-        if (process_name == nullptr) {
-          process_name = fld.as_char_ptr();
-          process_name_len = fld.size();
-        }
+        if (process_name.empty())
+          process_name = fld.as_string();
         break;
       default:
         break;
     }
   }
-  context_->process_tracker->UpdateProcess(pid, process_name, process_name_len);
+  context_->process_tracker->UpdateProcess(pid, process_name);
 
   PERFETTO_DCHECK(decoder.IsEndOfBuffer());
 }
@@ -214,8 +212,7 @@
 
   uint32_t prev_pid = 0;
   uint32_t prev_state = 0;
-  const char* prev_comm = nullptr;
-  size_t prev_comm_len = 0;
+  base::StringView prev_comm;
   uint32_t next_pid = 0;
   for (auto fld = decoder.ReadField(); fld.id != 0; fld = decoder.ReadField()) {
     switch (fld.id) {
@@ -226,8 +223,7 @@
         prev_state = fld.as_uint32();
         break;
       case protos::SchedSwitchFtraceEvent::kPrevCommFieldNumber:
-        prev_comm = fld.as_char_ptr();
-        prev_comm_len = fld.size();
+        prev_comm = fld.as_string();
         break;
       case protos::SchedSwitchFtraceEvent::kNextPidFieldNumber:
         next_pid = fld.as_uint32();
@@ -237,7 +233,7 @@
     }
   }
   context_->sched_tracker->PushSchedSwitch(cpu, timestamp, prev_pid, prev_state,
-                                           prev_comm, prev_comm_len, next_pid);
+                                           prev_comm, next_pid);
 
   PERFETTO_DCHECK(decoder.IsEndOfBuffer());
 }