Add ICU message format support
[chromium-blink-merge.git] / base / trace_event / trace_event_impl.h
blob8e9b3b0a96e51a1dc85a11394f1455b64dda3462
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
6 #ifndef BASE_TRACE_EVENT_TRACE_EVENT_IMPL_H_
7 #define BASE_TRACE_EVENT_TRACE_EVENT_IMPL_H_
9 #include <stack>
10 #include <string>
11 #include <vector>
13 #include "base/atomicops.h"
14 #include "base/base_export.h"
15 #include "base/callback.h"
16 #include "base/containers/hash_tables.h"
17 #include "base/gtest_prod_util.h"
18 #include "base/memory/ref_counted_memory.h"
19 #include "base/memory/scoped_vector.h"
20 #include "base/observer_list.h"
21 #include "base/single_thread_task_runner.h"
22 #include "base/strings/string_util.h"
23 #include "base/synchronization/condition_variable.h"
24 #include "base/synchronization/lock.h"
25 #include "base/threading/thread.h"
26 #include "base/threading/thread_local.h"
27 #include "base/trace_event/trace_event_memory_overhead.h"
29 namespace base {
31 class WaitableEvent;
32 class MessageLoop;
34 namespace trace_event {
36 typedef base::Callback<bool(const char* category_group_name,
37 const char* event_name)> ArgumentFilterPredicate;
39 // For any argument of type TRACE_VALUE_TYPE_CONVERTABLE the provided
40 // class must implement this interface.
41 class BASE_EXPORT ConvertableToTraceFormat
42 : public RefCounted<ConvertableToTraceFormat> {
43 public:
44 // Append the class info to the provided |out| string. The appended
45 // data must be a valid JSON object. Strings must be properly quoted, and
46 // escaped. There is no processing applied to the content after it is
47 // appended.
48 virtual void AppendAsTraceFormat(std::string* out) const = 0;
50 virtual void EstimateTraceMemoryOverhead(TraceEventMemoryOverhead* overhead);
52 std::string ToString() const {
53 std::string result;
54 AppendAsTraceFormat(&result);
55 return result;
58 protected:
59 virtual ~ConvertableToTraceFormat() {}
61 private:
62 friend class RefCounted<ConvertableToTraceFormat>;
65 const int kTraceMaxNumArgs = 2;
67 struct TraceEventHandle {
68 uint32 chunk_seq;
69 uint16 chunk_index;
70 uint16 event_index;
73 class BASE_EXPORT TraceEvent {
74 public:
75 union TraceValue {
76 bool as_bool;
77 unsigned long long as_uint;
78 long long as_int;
79 double as_double;
80 const void* as_pointer;
81 const char* as_string;
84 TraceEvent();
85 ~TraceEvent();
87 // We don't need to copy TraceEvent except when TraceEventBuffer is cloned.
88 // Use explicit copy method to avoid accidentally misuse of copy.
89 void CopyFrom(const TraceEvent& other);
91 void Initialize(
92 int thread_id,
93 TraceTicks timestamp,
94 ThreadTicks thread_timestamp,
95 char phase,
96 const unsigned char* category_group_enabled,
97 const char* name,
98 unsigned long long id,
99 unsigned long long context_id,
100 unsigned long long bind_id,
101 int num_args,
102 const char** arg_names,
103 const unsigned char* arg_types,
104 const unsigned long long* arg_values,
105 const scoped_refptr<ConvertableToTraceFormat>* convertable_values,
106 unsigned int flags);
108 void Reset();
110 void UpdateDuration(const TraceTicks& now, const ThreadTicks& thread_now);
112 void EstimateTraceMemoryOverhead(TraceEventMemoryOverhead*);
114 // Serialize event data to JSON
115 void AppendAsJSON(
116 std::string* out,
117 const ArgumentFilterPredicate& argument_filter_predicate) const;
118 void AppendPrettyPrinted(std::ostringstream* out) const;
120 static void AppendValueAsJSON(unsigned char type,
121 TraceValue value,
122 std::string* out);
124 TraceTicks timestamp() const { return timestamp_; }
125 ThreadTicks thread_timestamp() const { return thread_timestamp_; }
126 char phase() const { return phase_; }
127 int thread_id() const { return thread_id_; }
128 TimeDelta duration() const { return duration_; }
129 TimeDelta thread_duration() const { return thread_duration_; }
130 unsigned long long id() const { return id_; }
131 unsigned long long context_id() const { return context_id_; }
132 unsigned int flags() const { return flags_; }
134 // Exposed for unittesting:
136 const base::RefCountedString* parameter_copy_storage() const {
137 return parameter_copy_storage_.get();
140 const unsigned char* category_group_enabled() const {
141 return category_group_enabled_;
144 const char* name() const { return name_; }
146 #if defined(OS_ANDROID)
147 void SendToATrace();
148 #endif
150 private:
151 // Note: these are ordered by size (largest first) for optimal packing.
152 TraceTicks timestamp_;
153 ThreadTicks thread_timestamp_;
154 TimeDelta duration_;
155 TimeDelta thread_duration_;
156 // id_ can be used to store phase-specific data.
157 unsigned long long id_;
158 // context_id_ is used to store context information.
159 unsigned long long context_id_;
160 TraceValue arg_values_[kTraceMaxNumArgs];
161 const char* arg_names_[kTraceMaxNumArgs];
162 scoped_refptr<ConvertableToTraceFormat> convertable_values_[kTraceMaxNumArgs];
163 const unsigned char* category_group_enabled_;
164 const char* name_;
165 scoped_refptr<base::RefCountedString> parameter_copy_storage_;
166 int thread_id_;
167 char phase_;
168 unsigned int flags_;
169 unsigned long long bind_id_;
170 unsigned char arg_types_[kTraceMaxNumArgs];
172 DISALLOW_COPY_AND_ASSIGN(TraceEvent);
175 } // namespace trace_event
176 } // namespace base
178 #endif // BASE_TRACE_EVENT_TRACE_EVENT_IMPL_H_