blob: 075f8d4f5f386d331603f86bf5916502dfdd2ae7 [file] [log] [blame]
// 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_