// 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 #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 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 class TraceReturnReason { public: explicit TraceReturnReason(const char* const name) : name_(name), traced_value_(std::make_unique()) { 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 traced_value_; }; } // namespace content #endif // CONTENT_COMMON_TRACE_UTILS_H_