Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2725)

Unified Diff: base/debug/trace_event.h

Issue 9213013: Split up trace_event.h into trace_event_impl.h and add webkitplatform support. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: removed webkit changes Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « base/base.gypi ('k') | base/debug/trace_event.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/debug/trace_event.h
diff --git a/base/debug/trace_event.h b/base/debug/trace_event.h
index a1fff3e66d78645080008dc19dc75bda57e9b673..21d1b32b7e74481bbf19ca2bf14ac69c67964268 100644
--- a/base/debug/trace_event.h
+++ b/base/debug/trace_event.h
@@ -2,6 +2,13 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+// This header is designed to give you trace_event macros without specifying
+// how the events actually get collected and stored. If you need to expose trace
+// event to some other universe, you can copy-and-paste this file,
+// implement the TRACE_EVENT_API macros, and do any other necessary fixup for
+// the target platform. The end result is that multiple libraries can funnel
+// events through to a shared trace event collector.
+
// Trace events are for tracking application performance and resource usage.
// Macros are provided to track:
// Begin and end of function calls
@@ -147,87 +154,16 @@
#define BASE_DEBUG_TRACE_EVENT_H_
#pragma once
-#include "build/build_config.h"
-
#include <string>
-#include <vector>
-
-#include "base/callback.h"
-#include "base/hash_tables.h"
-#include "base/memory/ref_counted_memory.h"
-#include "base/string_util.h"
-#include "base/synchronization/lock.h"
-#include "base/third_party/dynamic_annotations/dynamic_annotations.h"
-#include "base/timer.h"
-////////////////////////////////////////////////////////////////////////////////
-// TODO(jbates): split this into a separate header.
-// This header is designed to be give you trace_event macros without specifying
-// how the events actually get collected and stored. If you need to expose trace
-// event to some other universe, you can copy-and-paste this file and just
-// implement these API macros.
-
-// unsigned char*
-// TRACE_EVENT_API_GET_CATEGORY_ENABLED(const char* category_name)
-#define TRACE_EVENT_API_GET_CATEGORY_ENABLED \
- base::debug::TraceLog::GetCategoryEnabled
-
-// Returns the threshold_begin_id used by TRACE_IF_LONGER_THAN macros.
-// int TRACE_EVENT_API_ADD_TRACE_EVENT(
-// char phase,
-// const unsigned char* category_enabled,
-// const char* name,
-// unsigned long long id,
-// int num_args,
-// const char** arg_names,
-// const unsigned char* arg_types,
-// const unsigned long long* arg_values,
-// int threshold_begin_id,
-// long long threshold,
-// unsigned char flags)
-#define TRACE_EVENT_API_ADD_TRACE_EVENT \
- base::debug::TraceLog::GetInstance()->AddTraceEvent
-
-// void TRACE_EVENT_API_ADD_COUNTER_EVENT(
-// const unsigned char* category_enabled,
-// const char* name,
-// unsigned long long id,
-// const char* arg1_name, int arg1_val,
-// const char* arg2_name, int arg2_val,
-// unsigned char flags)
-#define TRACE_EVENT_API_ADD_COUNTER_EVENT \
- base::debug::TraceLog::GetInstance()->AddCounterEvent
-
-// Mangle |pointer| with a process ID hash so that if |pointer| occurs on more
-// than one process, it will not collide in the trace data.
-// unsigned long long TRACE_EVENT_API_GET_ID_FROM_POINTER(void* pointer)
-#define TRACE_EVENT_API_GET_ID_FROM_POINTER \
- base::debug::TraceLog::GetInstance()->GetInterProcessID
-
-////////////////////////////////////////////////////////////////////////////////
+#include "build/build_config.h"
+#include "base/debug/trace_event_impl.h"
// By default, const char* argument values are assumed to have long-lived scope
// and will not be copied. Use this macro to force a const char* to be copied.
#define TRACE_STR_COPY(str) \
trace_event_internal::TraceStringWithCopy(str)
-// Older style trace macros with explicit id and extra data
-// Only these macros result in publishing data to ETW as currently implemented.
-#define TRACE_EVENT_BEGIN_ETW(name, id, extra) \
- base::debug::TraceLog::AddTraceEventEtw( \
- TRACE_EVENT_PHASE_BEGIN, \
- name, reinterpret_cast<const void*>(id), extra)
-
-#define TRACE_EVENT_END_ETW(name, id, extra) \
- base::debug::TraceLog::AddTraceEventEtw( \
- TRACE_EVENT_PHASE_END, \
- name, reinterpret_cast<const void*>(id), extra)
-
-#define TRACE_EVENT_INSTANT_ETW(name, id, extra) \
- base::debug::TraceLog::AddTraceEventEtw( \
- TRACE_EVENT_PHASE_INSTANT, \
- name, reinterpret_cast<const void*>(id), extra)
-
// Records a pair of begin and end events called "name" for the current
// scope, with 0, 1 or 2 associated arguments. If the category is not
// enabled, then this does nothing.
@@ -377,9 +313,13 @@
// - category and name strings must have application lifetime (statics or
// literals). They may not include " chars.
#define TRACE_COUNTER1(category, name, value) \
- TRACE_COUNTER2(category, name, "value", value, NULL, 0)
+ INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_COUNTER, \
+ category, name, TRACE_EVENT_FLAG_NONE, \
+ "value", static_cast<int>(value))
#define TRACE_COPY_COUNTER1(category, name, value) \
- TRACE_COPY_COUNTER2(category, name, "value", value, NULL, 0)
+ INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_COUNTER, \
+ category, name, TRACE_EVENT_FLAG_COPY, \
+ "value", static_cast<int>(value))
// Records the values of a multi-parted counter called "name" immediately.
// The UI will treat value1 and value2 as parts of a whole, displaying their
@@ -388,16 +328,16 @@
// literals). They may not include " chars.
#define TRACE_COUNTER2(category, name, value1_name, value1_val, \
value2_name, value2_val) \
- INTERNAL_TRACE_EVENT_ADD_COUNTER( \
- category, name, trace_event_internal::kNoEventId, \
- value1_name, value1_val, value2_name, value2_val, \
- TRACE_EVENT_FLAG_NONE)
+ INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_COUNTER, \
+ category, name, TRACE_EVENT_FLAG_NONE, \
+ value1_name, static_cast<int>(value1_val), \
+ value2_name, static_cast<int>(value2_val))
#define TRACE_COPY_COUNTER2(category, name, value1_name, value1_val, \
value2_name, value2_val) \
- INTERNAL_TRACE_EVENT_ADD_COUNTER( \
- category, name, trace_event_internal::kNoEventId, \
- value1_name, value1_val, value2_name, value2_val, \
- TRACE_EVENT_FLAG_COPY)
+ INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_COUNTER, \
+ category, name, TRACE_EVENT_FLAG_COPY, \
+ value1_name, static_cast<int>(value1_val), \
+ value2_name, static_cast<int>(value2_val))
// Records the value of a counter called "name" immediately. Value
// must be representable as a 32 bit integer.
@@ -408,9 +348,13 @@
// will be xored with a hash of the process ID so that the same pointer on
// two different processes will not collide.
#define TRACE_COUNTER_ID1(category, name, id, value) \
- TRACE_COUNTER_ID2(category, name, id, "value", value, NULL, 0)
+ INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_COUNTER, \
+ category, name, id, TRACE_EVENT_FLAG_HAS_ID, \
+ "value", static_cast<int>(value))
#define TRACE_COPY_COUNTER_ID1(category, name, id, value) \
- TRACE_COPY_COUNTER_ID2(category, name, id, "value", value, NULL, 0)
+ INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_COUNTER, \
+ category, name, id, TRACE_EVENT_FLAG_COPY | TRACE_EVENT_FLAG_HAS_ID, \
+ "value", static_cast<int>(value))
// Records the values of a multi-parted counter called "name" immediately.
// The UI will treat value1 and value2 as parts of a whole, displaying their
@@ -423,16 +367,16 @@
// two different processes will not collide.
#define TRACE_COUNTER_ID2(category, name, id, value1_name, value1_val, \
value2_name, value2_val) \
- INTERNAL_TRACE_EVENT_ADD_COUNTER( \
- category, name, id, value1_name, value1_val, value2_name, value2_val, \
- TRACE_EVENT_FLAG_HAS_ID)
+ INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_COUNTER, \
+ category, name, id, TRACE_EVENT_FLAG_HAS_ID, \
+ value1_name, static_cast<int>(value1_val), \
+ value2_name, static_cast<int>(value2_val))
#define TRACE_COPY_COUNTER_ID2(category, name, id, value1_name, value1_val, \
value2_name, value2_val) \
- INTERNAL_TRACE_EVENT_ADD_COUNTER( \
- category, name, id, \
- value1_name, value1_val, \
- value2_name, value2_val, \
- TRACE_EVENT_FLAG_COPY|TRACE_EVENT_FLAG_HAS_ID)
+ INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_COUNTER, \
+ category, name, id, TRACE_EVENT_FLAG_COPY | TRACE_EVENT_FLAG_HAS_ID, \
+ value1_name, static_cast<int>(value1_val), \
+ value2_name, static_cast<int>(value2_val))
// Records a single START event called "name" immediately, with 0, 1 or 2
@@ -495,6 +439,48 @@
arg1_name, arg1_val, arg2_name, arg2_val)
+////////////////////////////////////////////////////////////////////////////////
+// Implementation specific tracing API definitions.
+
+// const unsigned char*
+// TRACE_EVENT_API_GET_CATEGORY_ENABLED(const char* category_name)
+#define TRACE_EVENT_API_GET_CATEGORY_ENABLED \
+ base::debug::TraceLog::GetCategoryEnabled
+
+// Returns the threshold_begin_id used by TRACE_IF_LONGER_THAN macros.
+// int TRACE_EVENT_API_ADD_TRACE_EVENT(
+// char phase,
+// const unsigned char* category_enabled,
+// const char* name,
+// unsigned long long id,
+// int num_args,
+// const char** arg_names,
+// const unsigned char* arg_types,
+// const unsigned long long* arg_values,
+// int threshold_begin_id,
+// long long threshold,
+// unsigned char flags)
+#define TRACE_EVENT_API_ADD_TRACE_EVENT \
+ base::debug::TraceLog::GetInstance()->AddTraceEvent
+
+// void TRACE_EVENT_API_ADD_COUNTER_EVENT(
+// const unsigned char* category_enabled,
+// const char* name,
+// unsigned long long id,
+// const char* arg1_name, int arg1_val,
+// const char* arg2_name, int arg2_val,
+// unsigned char flags)
+#define TRACE_EVENT_API_ADD_COUNTER_EVENT \
+ base::debug::TraceLog::GetInstance()->AddCounterEvent
+
+// Mangle |pointer| with a process ID hash so that if |pointer| occurs on more
+// than one process, it will not collide in the trace data.
+// unsigned long long TRACE_EVENT_API_GET_ID_FROM_POINTER(void* pointer)
+#define TRACE_EVENT_API_GET_ID_FROM_POINTER \
+ base::debug::TraceLog::GetInstance()->GetInterProcessID
+
+////////////////////////////////////////////////////////////////////////////////
+
// Implementation detail: trace event macros create temporary variables
// to keep instrumentation overhead low. These macros give each temporary
// variable a unique name based on the line number to prevent name collissions.
@@ -525,18 +511,6 @@
trace_event_internal::kNoEventId, flags, ##__VA_ARGS__); \
}
-// Implementation detail: internal macro to create static category and
-// add the counter event if it is enabled.
-#define INTERNAL_TRACE_EVENT_ADD_COUNTER( \
- category, name, id, arg1_name, arg1_val, arg2_name, arg2_val, flags) \
- INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category); \
- if (*INTERNAL_TRACE_EVENT_UID(catstatic)) { \
- TRACE_EVENT_API_ADD_COUNTER_EVENT( \
- INTERNAL_TRACE_EVENT_UID(catstatic), \
- name, trace_event_internal::TraceID(id).data(), \
- arg1_name, arg1_val, arg2_name, arg2_val, flags); \
- }
-
// Implementation detail: internal macro to create static category and add begin
// event if the category is enabled. Also adds the end event when the scope
// ends.
@@ -586,17 +560,6 @@
##__VA_ARGS__); \
}
-template <typename Type>
-struct StaticMemorySingletonTraits;
-
-namespace base {
-
-class RefCountedString;
-
-namespace debug {
-
-const int kTraceMaxNumArgs = 2;
-
// Notes regarding the following definitions:
// New values can be added and propagated to third party libraries, but existing
// definitions must never be changed, because third party libraries may use old
@@ -625,275 +588,6 @@ const int kTraceMaxNumArgs = 2;
#define TRACE_VALUE_TYPE_STRING (static_cast<unsigned char>(6))
#define TRACE_VALUE_TYPE_COPY_STRING (static_cast<unsigned char>(7))
-// Output records are "Events" and can be obtained via the
-// OutputCallback whenever the tracing system decides to flush. This
-// can happen at any time, on any thread, or you can programatically
-// force it to happen.
-class BASE_EXPORT TraceEvent {
- public:
- union TraceValue {
- bool as_bool;
- unsigned long long as_uint;
- long long as_int;
- double as_double;
- const void* as_pointer;
- const char* as_string;
- };
-
- TraceEvent();
- TraceEvent(int thread_id,
- TimeTicks timestamp,
- char phase,
- const unsigned char* category_enabled,
- const char* name,
- unsigned long long id,
- int num_args,
- const char** arg_names,
- const unsigned char* arg_types,
- const unsigned long long* arg_values,
- unsigned char flags);
- ~TraceEvent();
-
- // Serialize event data to JSON
- static void AppendEventsAsJSON(const std::vector<TraceEvent>& events,
- size_t start,
- size_t count,
- std::string* out);
- void AppendAsJSON(std::string* out) const;
-
- TimeTicks timestamp() const { return timestamp_; }
-
- // Exposed for unittesting:
-
- const base::RefCountedString* parameter_copy_storage() const {
- return parameter_copy_storage_.get();
- }
-
- const char* name() const { return name_; }
-
- private:
- // Note: these are ordered by size (largest first) for optimal packing.
- TimeTicks timestamp_;
- // id_ can be used to store phase-specific data.
- unsigned long long id_;
- TraceValue arg_values_[kTraceMaxNumArgs];
- const char* arg_names_[kTraceMaxNumArgs];
- const unsigned char* category_enabled_;
- const char* name_;
- scoped_refptr<base::RefCountedString> parameter_copy_storage_;
- int thread_id_;
- char phase_;
- unsigned char flags_;
- unsigned char arg_types_[kTraceMaxNumArgs];
-};
-
-
-// TraceResultBuffer collects and converts trace fragments returned by TraceLog
-// to JSON output.
-class BASE_EXPORT TraceResultBuffer {
- public:
- typedef base::Callback<void(const std::string&)> OutputCallback;
-
- // If you don't need to stream JSON chunks out efficiently, and just want to
- // get a complete JSON string after calling Finish, use this struct to collect
- // JSON trace output.
- struct BASE_EXPORT SimpleOutput {
- OutputCallback GetCallback();
- void Append(const std::string& json_string);
-
- // Do what you want with the json_output_ string after calling
- // TraceResultBuffer::Finish.
- std::string json_output;
- };
-
- TraceResultBuffer();
- ~TraceResultBuffer();
-
- // Set callback. The callback will be called during Start with the initial
- // JSON output and during AddFragment and Finish with following JSON output
- // chunks. The callback target must live past the last calls to
- // TraceResultBuffer::Start/AddFragment/Finish.
- void SetOutputCallback(const OutputCallback& json_chunk_callback);
-
- // Start JSON output. This resets all internal state, so you can reuse
- // the TraceResultBuffer by calling Start.
- void Start();
-
- // Call AddFragment 0 or more times to add trace fragments from TraceLog.
- void AddFragment(const std::string& trace_fragment);
-
- // When all fragments have been added, call Finish to complete the JSON
- // formatted output.
- void Finish();
-
- private:
- OutputCallback output_callback_;
- bool append_comma_;
-};
-
-
-class BASE_EXPORT TraceLog {
- public:
- static TraceLog* GetInstance();
-
- // Get set of known categories. This can change as new code paths are reached.
- // The known categories are inserted into |categories|.
- void GetKnownCategories(std::vector<std::string>* categories);
-
- // Enable tracing for provided list of categories. If tracing is already
- // enabled, this method does nothing -- changing categories during trace is
- // not supported.
- // If both included_categories and excluded_categories are empty,
- // all categories are traced.
- // Else if included_categories is non-empty, only those are traced.
- // Else if excluded_categories is non-empty, everything but those are traced.
- // Wildcards * and ? are supported (see MatchPattern in string_util.h).
- void SetEnabled(const std::vector<std::string>& included_categories,
- const std::vector<std::string>& excluded_categories);
-
- // |categories| is a comma-delimited list of category wildcards.
- // A category can have an optional '-' prefix to make it an excluded category.
- // All the same rules apply above, so for example, having both included and
- // excluded categories in the same list would not be supported.
- //
- // Example: SetEnabled("test_MyTest*");
- // Example: SetEnabled("test_MyTest*,test_OtherStuff");
- // Example: SetEnabled("-excluded_category1,-excluded_category2");
- void SetEnabled(const std::string& categories);
-
- // Retieves the categories set via a prior call to SetEnabled(). Only
- // meaningful if |IsEnabled()| is true.
- void GetEnabledTraceCategories(std::vector<std::string>* included_out,
- std::vector<std::string>* excluded_out);
-
- // Disable tracing for all categories.
- void SetDisabled();
- // Helper method to enable/disable tracing for all categories.
- void SetEnabled(bool enabled);
- bool IsEnabled() { return enabled_; }
-
- float GetBufferPercentFull() const;
-
- // When enough events are collected, they are handed (in bulk) to
- // the output callback. If no callback is set, the output will be
- // silently dropped. The callback must be thread safe. The string format is
- // undefined. Use TraceResultBuffer to convert one or more trace strings to
- // JSON.
- typedef RefCountedData<std::string> RefCountedString;
- typedef base::Callback<void(const scoped_refptr<RefCountedString>&)>
- OutputCallback;
- void SetOutputCallback(const OutputCallback& cb);
-
- // The trace buffer does not flush dynamically, so when it fills up,
- // subsequent trace events will be dropped. This callback is generated when
- // the trace buffer is full. The callback must be thread safe.
- typedef base::Callback<void(void)> BufferFullCallback;
- void SetBufferFullCallback(const BufferFullCallback& cb);
-
- // Flushes all logged data to the callback.
- void Flush();
-
- // Called by TRACE_EVENT* macros, don't call this directly.
- static const unsigned char* GetCategoryEnabled(const char* name);
- static const char* GetCategoryName(const unsigned char* category_enabled);
-
- // Called by TRACE_EVENT* macros, don't call this directly.
- // Returns the index in the internal vector of the event if it was added, or
- // -1 if the event was not added.
- // On end events, the return value of the begin event can be specified along
- // with a threshold in microseconds. If the elapsed time between begin and end
- // is less than the threshold, the begin/end event pair is dropped.
- // If |copy| is set, |name|, |arg_name1| and |arg_name2| will be deep copied
- // into the event; see "Memory scoping note" and TRACE_EVENT_COPY_XXX above.
- int AddTraceEvent(char phase,
- const unsigned char* category_enabled,
- const char* name,
- unsigned long long id,
- int num_args,
- const char** arg_names,
- const unsigned char* arg_types,
- const unsigned long long* arg_values,
- int threshold_begin_id,
- long long threshold,
- unsigned char flags);
- static void AddTraceEventEtw(char phase,
- const char* name,
- const void* id,
- const char* extra);
- static void AddTraceEventEtw(char phase,
- const char* name,
- const void* id,
- const std::string& extra);
-
- // A wrapper around AddTraceEvent used by TRACE_COUNTERx macros
- // that allows only integer values for the counters.
- void AddCounterEvent(const unsigned char* category_enabled,
- const char* name,
- unsigned long long id,
- const char* arg1_name, int arg1_val,
- const char* arg2_name, int arg2_val,
- unsigned char flags);
-
- // Mangle |ptr| with a hash based on the process ID so that if |ptr| occurs on
- // more than one process, it will not collide.
- unsigned long long GetInterProcessID(void* ptr) const {
- return static_cast<unsigned long long>(reinterpret_cast<uintptr_t>(ptr)) ^
- process_id_hash_;
- }
-
- int process_id() const { return process_id_; }
-
- // Exposed for unittesting:
-
- // Allows deleting our singleton instance.
- static void DeleteForTesting();
-
- // Allows resurrecting our singleton instance post-AtExit processing.
- static void Resurrect();
-
- // Allow tests to inspect TraceEvents.
- size_t GetEventsSize() const { return logged_events_.size(); }
- const TraceEvent& GetEventAt(size_t index) const {
- DCHECK(index < logged_events_.size());
- return logged_events_[index];
- }
-
- void SetProcessID(int process_id);
-
- private:
- // This allows constructor and destructor to be private and usable only
- // by the Singleton class.
- friend struct StaticMemorySingletonTraits<TraceLog>;
-
- TraceLog();
- ~TraceLog();
- const unsigned char* GetCategoryEnabledInternal(const char* name);
- void AddThreadNameMetadataEvents();
- void AddClockSyncMetadataEvents();
-
- // TODO(nduca): switch to per-thread trace buffers to reduce thread
- // synchronization.
- Lock lock_;
- bool enabled_;
- OutputCallback output_callback_;
- BufferFullCallback buffer_full_callback_;
- std::vector<TraceEvent> logged_events_;
- std::vector<std::string> included_categories_;
- std::vector<std::string> excluded_categories_;
-
- base::hash_map<int, std::string> thread_names_;
-
- // XORed with TraceID to make it unlikely to collide with other processes.
- unsigned long long process_id_hash_;
-
- int process_id_;
-
- DISALLOW_COPY_AND_ASSIGN(TraceLog);
-};
-
-} // namespace debug
-} // namespace base
-
namespace trace_event_internal {
// Specify these values when the corresponding argument of AddTraceEvent is not
« no previous file with comments | « base/base.gypi ('k') | base/debug/trace_event.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698