| // Copyright 2016 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 BASE_TRACE_EVENT_BLAME_CONTEXT_H_ | 
 | #define BASE_TRACE_EVENT_BLAME_CONTEXT_H_ | 
 |  | 
 | #include <inttypes.h> | 
 |  | 
 | #include "base/base_export.h" | 
 | #include "base/macros.h" | 
 | #include "base/threading/thread_checker.h" | 
 | #include "base/trace_event/trace_log.h" | 
 |  | 
 | namespace base { | 
 | namespace trace_event { | 
 | class TracedValue; | 
 | } | 
 |  | 
 | namespace trace_event { | 
 |  | 
 | // A blame context represents a logical unit to which we want to attribute | 
 | // different costs (e.g., CPU, network, or memory usage). An example of a blame | 
 | // context is an <iframe> element on a web page. Different subsystems can | 
 | // "enter" and "leave" blame contexts to indicate that they are doing work which | 
 | // should be accounted against this blame context. | 
 | // | 
 | // A blame context can optionally have a parent context, forming a blame context | 
 | // tree. When work is attributed to a particular blame context, it is considered | 
 | // to count against all of that context's children too. This is useful when work | 
 | // cannot be exactly attributed into a more specific context. For example, | 
 | // Javascript garbage collection generally needs to inspect all objects on a | 
 | // page instead looking at each <iframe> individually. In this case the work | 
 | // should be attributed to a blame context which is the parent of all <iframe> | 
 | // blame contexts. | 
 | class BASE_EXPORT BlameContext | 
 |     : public trace_event::TraceLog::AsyncEnabledStateObserver { | 
 |  public: | 
 |   // Construct a blame context belonging to the blame context tree |name|, using | 
 |   // the tracing category |category|, identified by |id| from the |scope| | 
 |   // namespace. |type| identifies the type of this object snapshot in the blame | 
 |   // context tree. |parent_context| is the parent of this blame context or | 
 |   // null. Note that all strings must have application lifetime. | 
 |   // | 
 |   // For example, a blame context which represents a specific <iframe> in a | 
 |   // browser frame tree could be specified with: | 
 |   // | 
 |   //   category="blink", | 
 |   //   name="FrameTree", | 
 |   //   type="IFrame", | 
 |   //   scope="IFrameIdentifier", | 
 |   //   id=1234. | 
 |   // | 
 |   // Each <iframe> blame context could have another <iframe> context as a | 
 |   // parent, or a top-level context which represents the entire browser: | 
 |   // | 
 |   //   category="blink", | 
 |   //   name="FrameTree", | 
 |   //   type="Browser", | 
 |   //   scope="BrowserIdentifier", | 
 |   //   id=1. | 
 |   // | 
 |   // Note that the |name| property is identical, signifying that both context | 
 |   // types are part of the same tree. | 
 |   // | 
 |   BlameContext(const char* category, | 
 |                const char* name, | 
 |                const char* type, | 
 |                const char* scope, | 
 |                int64_t id, | 
 |                const BlameContext* parent_context); | 
 |   ~BlameContext() override; | 
 |  | 
 |   // Initialize the blame context, automatically taking a snapshot if tracing is | 
 |   // enabled. Must be called before any other methods on this class. | 
 |   void Initialize(); | 
 |  | 
 |   // Indicate that the current thread is now doing work which should count | 
 |   // against this blame context.  This function is allowed to be called in a | 
 |   // thread different from where the blame context was created; However, any | 
 |   // client doing that must be fully responsible for ensuring thready safety. | 
 |   void Enter(); | 
 |  | 
 |   // Leave and stop doing work for a previously entered blame context. If | 
 |   // another blame context belonging to the same tree was entered prior to this | 
 |   // one, it becomes the active blame context for this thread again.  Similar | 
 |   // to Enter(), this function can be called in a thread different from where | 
 |   // the blame context was created, and the same requirement on thread safety | 
 |   // must be satisfied. | 
 |   void Leave(); | 
 |  | 
 |   // Record a snapshot of the blame context. This is normally only needed if a | 
 |   // blame context subclass defines custom properties (see AsValueInto) and one | 
 |   // or more of those properties have changed. | 
 |   void TakeSnapshot(); | 
 |  | 
 |   const char* category() const { return category_; } | 
 |   const char* name() const { return name_; } | 
 |   const char* type() const { return type_; } | 
 |   const char* scope() const { return scope_; } | 
 |   int64_t id() const { return id_; } | 
 |  | 
 |   // trace_event::TraceLog::EnabledStateObserver implementation: | 
 |   void OnTraceLogEnabled() override; | 
 |   void OnTraceLogDisabled() override; | 
 |  | 
 |  protected: | 
 |   // Serialize the properties of this blame context into |state|. Subclasses can | 
 |   // override this method to record additional properties (e.g, the URL for an | 
 |   // <iframe> blame context). Note that an overridden implementation must still | 
 |   // call this base method. | 
 |   virtual void AsValueInto(trace_event::TracedValue* state); | 
 |  | 
 |  private: | 
 |   bool WasInitialized() const; | 
 |  | 
 |   // The following string pointers have application lifetime. | 
 |   const char* category_; | 
 |   const char* name_; | 
 |   const char* type_; | 
 |   const char* scope_; | 
 |   const int64_t id_; | 
 |  | 
 |   const char* parent_scope_; | 
 |   const int64_t parent_id_; | 
 |  | 
 |   const unsigned char* category_group_enabled_; | 
 |  | 
 |   ThreadChecker thread_checker_; | 
 |   WeakPtrFactory<BlameContext> weak_factory_; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(BlameContext); | 
 | }; | 
 |  | 
 | }  // namespace trace_event | 
 | }  // namespace base | 
 |  | 
 | #endif  // BASE_TRACE_EVENT_BLAME_CONTEXT_H_ |