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_
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"
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
> {
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
48 virtual void AppendAsTraceFormat(std::string
* out
) const = 0;
50 virtual void EstimateTraceMemoryOverhead(TraceEventMemoryOverhead
* overhead
);
52 std::string
ToString() const {
54 AppendAsTraceFormat(&result
);
59 virtual ~ConvertableToTraceFormat() {}
62 friend class RefCounted
<ConvertableToTraceFormat
>;
65 const int kTraceMaxNumArgs
= 2;
67 struct TraceEventHandle
{
73 class BASE_EXPORT TraceEvent
{
77 unsigned long long as_uint
;
80 const void* as_pointer
;
81 const char* as_string
;
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
);
94 ThreadTicks thread_timestamp
,
96 const unsigned char* category_group_enabled
,
98 unsigned long long id
,
99 unsigned long long context_id
,
100 unsigned long long bind_id
,
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
,
110 void UpdateDuration(const TraceTicks
& now
, const ThreadTicks
& thread_now
);
112 void EstimateTraceMemoryOverhead(TraceEventMemoryOverhead
*);
114 // Serialize event data to JSON
117 const ArgumentFilterPredicate
& argument_filter_predicate
) const;
118 void AppendPrettyPrinted(std::ostringstream
* out
) const;
120 static void AppendValueAsJSON(unsigned char type
,
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)
151 // Note: these are ordered by size (largest first) for optimal packing.
152 TraceTicks timestamp_
;
153 ThreadTicks thread_timestamp_
;
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_
;
165 scoped_refptr
<base::RefCountedString
> parameter_copy_storage_
;
169 unsigned long long bind_id_
;
170 unsigned char arg_types_
[kTraceMaxNumArgs
];
172 DISALLOW_COPY_AND_ASSIGN(TraceEvent
);
175 } // namespace trace_event
178 #endif // BASE_TRACE_EVENT_TRACE_EVENT_IMPL_H_