summaryrefslogtreecommitdiff
path: root/chromium/content/common/trace_utils.h
blob: 075f8d4f5f386d331603f86bf5916502dfdd2ae7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CONTENT_COMMON_TRACE_UTILS_H_
#define CONTENT_COMMON_TRACE_UTILS_H_

#include <string>

#include "base/trace_event/traced_value.h"

namespace content {

// This can't be a struct since in C++14 static constexpr structure members
// have external linkage. This has been fixed in C++17.
namespace tracing_category {
static constexpr const char kNavigation[] = "navigation";
}

// Class which facilitates annotating with traces all possible return paths
// from a function or a method. Setting the return reason is enforced by a
// CHECK at runtime to ensure that no return branches have been missed.
// Template usage is necessary since the tracing code requires the category to
// be constant at compile time.
//
// Example usage:
//
// void SomeMethod() {
//   TraceReturnReason<tracing_category::kNavigation> trace_return("Method");
//
//   if (condition) {
//     trace_return.set_return_reason("foo");
//     trace_return.traced_value()->SetBoolean("condition", true);
//     return;
//   }
//
//   trace_return.set_return_reason("default return");
//   return;
// }
//
template <const char* category>
class TraceReturnReason {
 public:
  explicit TraceReturnReason(const char* const name)
      : name_(name),
        traced_value_(std::make_unique<base::trace_event::TracedValue>()) {
    TRACE_EVENT_BEGIN0(category, name_);
  }

  ~TraceReturnReason() {
    CHECK(reason_set_);
    TRACE_EVENT_END1(category, name_, "return", std::move(traced_value_));
  }

  void set_return_reason(const std::string& reason) {
    reason_set_ = true;
    traced_value_->SetString("reason", reason);
  }

  // This method exposes the internal TracedValue member so usage of this
  // class allows easy addition of more data to the end of the event.
  base::trace_event::TracedValue* traced_value() { return traced_value_.get(); }

 private:
  const char* const name_;
  bool reason_set_ = false;
  std::unique_ptr<base::trace_event::TracedValue> traced_value_;
};

}  // namespace content

#endif  // CONTENT_COMMON_TRACE_UTILS_H_