| // 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" |
| #include "starboard/types.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_ |