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

Side by Side Diff: base/trace_event/trace_event_impl.h

Issue 1641513004: Update //base to chromium 9659b08ea5a34f889dc4166217f438095ddc10d2 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 4 years, 10 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 unified diff | Download patch
« no previous file with comments | « base/trace_event/trace_event_etw_export_win.cc ('k') | base/trace_event/trace_event_impl.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 5
6 #ifndef BASE_TRACE_EVENT_TRACE_EVENT_IMPL_H_ 6 #ifndef BASE_TRACE_EVENT_TRACE_EVENT_IMPL_H_
7 #define BASE_TRACE_EVENT_TRACE_EVENT_IMPL_H_ 7 #define BASE_TRACE_EVENT_TRACE_EVENT_IMPL_H_
8 8
9 #include <stack> 9 #include <stack>
10 #include <string> 10 #include <string>
11 #include <vector> 11 #include <vector>
12 12
13 #include "base/atomicops.h" 13 #include "base/atomicops.h"
14 #include "base/base_export.h" 14 #include "base/base_export.h"
15 #include "base/callback.h" 15 #include "base/callback.h"
16 #include "base/containers/hash_tables.h" 16 #include "base/containers/hash_tables.h"
17 #include "base/gtest_prod_util.h" 17 #include "base/gtest_prod_util.h"
18 #include "base/memory/ref_counted_memory.h" 18 #include "base/memory/ref_counted_memory.h"
19 #include "base/memory/scoped_vector.h" 19 #include "base/memory/scoped_vector.h"
20 #include "base/observer_list.h" 20 #include "base/observer_list.h"
21 #include "base/single_thread_task_runner.h" 21 #include "base/single_thread_task_runner.h"
22 #include "base/strings/string_util.h" 22 #include "base/strings/string_util.h"
23 #include "base/synchronization/condition_variable.h" 23 #include "base/synchronization/condition_variable.h"
24 #include "base/synchronization/lock.h" 24 #include "base/synchronization/lock.h"
25 #include "base/threading/thread.h" 25 #include "base/threading/thread.h"
26 #include "base/threading/thread_local.h" 26 #include "base/threading/thread_local.h"
27 #include "base/trace_event/memory_dump_provider.h"
27 #include "base/trace_event/trace_config.h" 28 #include "base/trace_event/trace_config.h"
29 #include "base/trace_event/trace_event_memory_overhead.h"
28 30
29 // Older style trace macros with explicit id and extra data 31 // Older style trace macros with explicit id and extra data
30 // Only these macros result in publishing data to ETW as currently implemented. 32 // Only these macros result in publishing data to ETW as currently implemented.
31 // TODO(georgesak): Update/replace these with new ETW macros. 33 // TODO(georgesak): Update/replace these with new ETW macros.
32 #define TRACE_EVENT_BEGIN_ETW(name, id, extra) \ 34 #define TRACE_EVENT_BEGIN_ETW(name, id, extra) \
33 base::trace_event::TraceLog::AddTraceEventEtw( \ 35 base::trace_event::TraceLog::AddTraceEventEtw( \
34 TRACE_EVENT_PHASE_BEGIN, \ 36 TRACE_EVENT_PHASE_BEGIN, \
35 name, reinterpret_cast<const void*>(id), extra) 37 name, reinterpret_cast<const void*>(id), extra)
36 38
37 #define TRACE_EVENT_END_ETW(name, id, extra) \ 39 #define TRACE_EVENT_END_ETW(name, id, extra) \
(...skipping 20 matching lines...) Expand all
58 // class must implement this interface. 60 // class must implement this interface.
59 class BASE_EXPORT ConvertableToTraceFormat 61 class BASE_EXPORT ConvertableToTraceFormat
60 : public RefCounted<ConvertableToTraceFormat> { 62 : public RefCounted<ConvertableToTraceFormat> {
61 public: 63 public:
62 // Append the class info to the provided |out| string. The appended 64 // Append the class info to the provided |out| string. The appended
63 // data must be a valid JSON object. Strings must be properly quoted, and 65 // data must be a valid JSON object. Strings must be properly quoted, and
64 // escaped. There is no processing applied to the content after it is 66 // escaped. There is no processing applied to the content after it is
65 // appended. 67 // appended.
66 virtual void AppendAsTraceFormat(std::string* out) const = 0; 68 virtual void AppendAsTraceFormat(std::string* out) const = 0;
67 69
70 virtual void EstimateTraceMemoryOverhead(TraceEventMemoryOverhead* overhead);
71
68 std::string ToString() const { 72 std::string ToString() const {
69 std::string result; 73 std::string result;
70 AppendAsTraceFormat(&result); 74 AppendAsTraceFormat(&result);
71 return result; 75 return result;
72 } 76 }
73 77
74 protected: 78 protected:
75 virtual ~ConvertableToTraceFormat() {} 79 virtual ~ConvertableToTraceFormat() {}
76 80
77 private: 81 private:
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
110 ThreadTicks thread_timestamp, 114 ThreadTicks thread_timestamp,
111 char phase, 115 char phase,
112 const unsigned char* category_group_enabled, 116 const unsigned char* category_group_enabled,
113 const char* name, 117 const char* name,
114 unsigned long long id, 118 unsigned long long id,
115 int num_args, 119 int num_args,
116 const char** arg_names, 120 const char** arg_names,
117 const unsigned char* arg_types, 121 const unsigned char* arg_types,
118 const unsigned long long* arg_values, 122 const unsigned long long* arg_values,
119 const scoped_refptr<ConvertableToTraceFormat>* convertable_values, 123 const scoped_refptr<ConvertableToTraceFormat>* convertable_values,
120 unsigned char flags); 124 unsigned int flags);
121 125
122 void Reset(); 126 void Reset();
123 127
124 void UpdateDuration(const TraceTicks& now, const ThreadTicks& thread_now); 128 void UpdateDuration(const TraceTicks& now, const ThreadTicks& thread_now);
125 129
130 void EstimateTraceMemoryOverhead(TraceEventMemoryOverhead*);
131
126 // Serialize event data to JSON 132 // Serialize event data to JSON
127 typedef base::Callback<bool(const char* category_group_name, 133 typedef base::Callback<bool(const char* category_group_name,
128 const char* event_name)> ArgumentFilterPredicate; 134 const char* event_name)> ArgumentFilterPredicate;
129 void AppendAsJSON( 135 void AppendAsJSON(
130 std::string* out, 136 std::string* out,
131 const ArgumentFilterPredicate& argument_filter_predicate) const; 137 const ArgumentFilterPredicate& argument_filter_predicate) const;
132 void AppendPrettyPrinted(std::ostringstream* out) const; 138 void AppendPrettyPrinted(std::ostringstream* out) const;
133 139
134 static void AppendValueAsJSON(unsigned char type, 140 static void AppendValueAsJSON(unsigned char type,
135 TraceValue value, 141 TraceValue value,
136 std::string* out); 142 std::string* out);
137 143
138 TraceTicks timestamp() const { return timestamp_; } 144 TraceTicks timestamp() const { return timestamp_; }
139 ThreadTicks thread_timestamp() const { return thread_timestamp_; } 145 ThreadTicks thread_timestamp() const { return thread_timestamp_; }
140 char phase() const { return phase_; } 146 char phase() const { return phase_; }
141 int thread_id() const { return thread_id_; } 147 int thread_id() const { return thread_id_; }
142 TimeDelta duration() const { return duration_; } 148 TimeDelta duration() const { return duration_; }
143 TimeDelta thread_duration() const { return thread_duration_; } 149 TimeDelta thread_duration() const { return thread_duration_; }
144 unsigned long long id() const { return id_; } 150 unsigned long long id() const { return id_; }
145 unsigned char flags() const { return flags_; } 151 unsigned int flags() const { return flags_; }
146 152
147 // Exposed for unittesting: 153 // Exposed for unittesting:
148 154
149 const base::RefCountedString* parameter_copy_storage() const { 155 const base::RefCountedString* parameter_copy_storage() const {
150 return parameter_copy_storage_.get(); 156 return parameter_copy_storage_.get();
151 } 157 }
152 158
153 const unsigned char* category_group_enabled() const { 159 const unsigned char* category_group_enabled() const {
154 return category_group_enabled_; 160 return category_group_enabled_;
155 } 161 }
156 162
157 const char* name() const { return name_; } 163 const char* name() const { return name_; }
158 164
159 #if defined(OS_ANDROID) 165 #if defined(OS_ANDROID)
160 void SendToATrace(); 166 void SendToATrace();
161 #endif 167 #endif
162 168
163 private: 169 private:
164 // Note: these are ordered by size (largest first) for optimal packing. 170 // Note: these are ordered by size (largest first) for optimal packing.
165 TraceTicks timestamp_; 171 TraceTicks timestamp_;
166 ThreadTicks thread_timestamp_; 172 ThreadTicks thread_timestamp_;
167 TimeDelta duration_; 173 TimeDelta duration_;
168 TimeDelta thread_duration_; 174 TimeDelta thread_duration_;
169 // id_ can be used to store phase-specific data. 175 // id_ can be used to store phase-specific data.
170 unsigned long long id_; 176 unsigned long long id_;
177 scoped_ptr<TraceEventMemoryOverhead> cached_memory_overhead_estimate_;
171 TraceValue arg_values_[kTraceMaxNumArgs]; 178 TraceValue arg_values_[kTraceMaxNumArgs];
172 const char* arg_names_[kTraceMaxNumArgs]; 179 const char* arg_names_[kTraceMaxNumArgs];
173 scoped_refptr<ConvertableToTraceFormat> convertable_values_[kTraceMaxNumArgs]; 180 scoped_refptr<ConvertableToTraceFormat> convertable_values_[kTraceMaxNumArgs];
174 const unsigned char* category_group_enabled_; 181 const unsigned char* category_group_enabled_;
175 const char* name_; 182 const char* name_;
176 scoped_refptr<base::RefCountedString> parameter_copy_storage_; 183 scoped_refptr<base::RefCountedString> parameter_copy_storage_;
177 int thread_id_; 184 int thread_id_;
178 char phase_; 185 char phase_;
179 unsigned char flags_; 186 unsigned int flags_;
180 unsigned char arg_types_[kTraceMaxNumArgs]; 187 unsigned char arg_types_[kTraceMaxNumArgs];
181 188
182 DISALLOW_COPY_AND_ASSIGN(TraceEvent); 189 DISALLOW_COPY_AND_ASSIGN(TraceEvent);
183 }; 190 };
184 191
185 // TraceBufferChunk is the basic unit of TraceBuffer. 192 // TraceBufferChunk is the basic unit of TraceBuffer.
186 class BASE_EXPORT TraceBufferChunk { 193 class BASE_EXPORT TraceBufferChunk {
187 public: 194 public:
188 explicit TraceBufferChunk(uint32 seq) 195 explicit TraceBufferChunk(uint32 seq);
189 : next_free_(0), 196 ~TraceBufferChunk();
190 seq_(seq) {
191 }
192 197
193 void Reset(uint32 new_seq); 198 void Reset(uint32 new_seq);
194 TraceEvent* AddTraceEvent(size_t* event_index); 199 TraceEvent* AddTraceEvent(size_t* event_index);
195 bool IsFull() const { return next_free_ == kTraceBufferChunkSize; } 200 bool IsFull() const { return next_free_ == kTraceBufferChunkSize; }
196 201
197 uint32 seq() const { return seq_; } 202 uint32 seq() const { return seq_; }
198 size_t capacity() const { return kTraceBufferChunkSize; } 203 size_t capacity() const { return kTraceBufferChunkSize; }
199 size_t size() const { return next_free_; } 204 size_t size() const { return next_free_; }
200 205
201 TraceEvent* GetEventAt(size_t index) { 206 TraceEvent* GetEventAt(size_t index) {
202 DCHECK(index < size()); 207 DCHECK(index < size());
203 return &chunk_[index]; 208 return &chunk_[index];
204 } 209 }
205 const TraceEvent* GetEventAt(size_t index) const { 210 const TraceEvent* GetEventAt(size_t index) const {
206 DCHECK(index < size()); 211 DCHECK(index < size());
207 return &chunk_[index]; 212 return &chunk_[index];
208 } 213 }
209 214
210 scoped_ptr<TraceBufferChunk> Clone() const; 215 scoped_ptr<TraceBufferChunk> Clone() const;
211 216
217 void EstimateTraceMemoryOverhead(TraceEventMemoryOverhead* overhead);
218
212 static const size_t kTraceBufferChunkSize = 64; 219 static const size_t kTraceBufferChunkSize = 64;
213 220
214 private: 221 private:
215 size_t next_free_; 222 size_t next_free_;
223 scoped_ptr<TraceEventMemoryOverhead> cached_overhead_estimate_when_full_;
216 TraceEvent chunk_[kTraceBufferChunkSize]; 224 TraceEvent chunk_[kTraceBufferChunkSize];
217 uint32 seq_; 225 uint32 seq_;
218 }; 226 };
219 227
220 // TraceBuffer holds the events as they are collected. 228 // TraceBuffer holds the events as they are collected.
221 class BASE_EXPORT TraceBuffer { 229 class BASE_EXPORT TraceBuffer {
222 public: 230 public:
223 virtual ~TraceBuffer() {} 231 virtual ~TraceBuffer() {}
224 232
225 virtual scoped_ptr<TraceBufferChunk> GetChunk(size_t *index) = 0; 233 virtual scoped_ptr<TraceBufferChunk> GetChunk(size_t *index) = 0;
226 virtual void ReturnChunk(size_t index, 234 virtual void ReturnChunk(size_t index,
227 scoped_ptr<TraceBufferChunk> chunk) = 0; 235 scoped_ptr<TraceBufferChunk> chunk) = 0;
228 236
229 virtual bool IsFull() const = 0; 237 virtual bool IsFull() const = 0;
230 virtual size_t Size() const = 0; 238 virtual size_t Size() const = 0;
231 virtual size_t Capacity() const = 0; 239 virtual size_t Capacity() const = 0;
232 virtual TraceEvent* GetEventByHandle(TraceEventHandle handle) = 0; 240 virtual TraceEvent* GetEventByHandle(TraceEventHandle handle) = 0;
233 241
234 // For iteration. Each TraceBuffer can only be iterated once. 242 // For iteration. Each TraceBuffer can only be iterated once.
235 virtual const TraceBufferChunk* NextChunk() = 0; 243 virtual const TraceBufferChunk* NextChunk() = 0;
236 244
237 virtual scoped_ptr<TraceBuffer> CloneForIteration() const = 0; 245 virtual scoped_ptr<TraceBuffer> CloneForIteration() const = 0;
246
247 // Computes an estimate of the size of the buffer, including all the retained
248 // objects.
249 virtual void EstimateTraceMemoryOverhead(
250 TraceEventMemoryOverhead* overhead) = 0;
238 }; 251 };
239 252
240 // TraceResultBuffer collects and converts trace fragments returned by TraceLog 253 // TraceResultBuffer collects and converts trace fragments returned by TraceLog
241 // to JSON output. 254 // to JSON output.
242 class BASE_EXPORT TraceResultBuffer { 255 class BASE_EXPORT TraceResultBuffer {
243 public: 256 public:
244 typedef base::Callback<void(const std::string&)> OutputCallback; 257 typedef base::Callback<void(const std::string&)> OutputCallback;
245 258
246 // If you don't need to stream JSON chunks out efficiently, and just want to 259 // If you don't need to stream JSON chunks out efficiently, and just want to
247 // get a complete JSON string after calling Finish, use this struct to collect 260 // get a complete JSON string after calling Finish, use this struct to collect
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
282 295
283 class TraceSamplingThread; 296 class TraceSamplingThread;
284 297
285 struct BASE_EXPORT TraceLogStatus { 298 struct BASE_EXPORT TraceLogStatus {
286 TraceLogStatus(); 299 TraceLogStatus();
287 ~TraceLogStatus(); 300 ~TraceLogStatus();
288 size_t event_capacity; 301 size_t event_capacity;
289 size_t event_count; 302 size_t event_count;
290 }; 303 };
291 304
292 class BASE_EXPORT TraceLog { 305 class BASE_EXPORT TraceLog : public MemoryDumpProvider {
293 public: 306 public:
294 enum Mode { 307 enum Mode {
295 DISABLED = 0, 308 DISABLED = 0,
296 RECORDING_MODE, 309 RECORDING_MODE,
297 MONITORING_MODE, 310 MONITORING_MODE,
298 }; 311 };
299 312
300 // The pointer returned from GetCategoryGroupEnabledInternal() points to a 313 // The pointer returned from GetCategoryGroupEnabledInternal() points to a
301 // value with zero or more of the following bits. Used in this class only. 314 // value with zero or more of the following bits. Used in this class only.
302 // The TRACE_EVENT macros should only use the value as a bool. 315 // The TRACE_EVENT macros should only use the value as a bool.
(...skipping 11 matching lines...) Expand all
314 327
315 static TraceLog* GetInstance(); 328 static TraceLog* GetInstance();
316 329
317 // Get set of known category groups. This can change as new code paths are 330 // Get set of known category groups. This can change as new code paths are
318 // reached. The known category groups are inserted into |category_groups|. 331 // reached. The known category groups are inserted into |category_groups|.
319 void GetKnownCategoryGroups(std::vector<std::string>* category_groups); 332 void GetKnownCategoryGroups(std::vector<std::string>* category_groups);
320 333
321 // Retrieves a copy (for thread-safety) of the current TraceConfig. 334 // Retrieves a copy (for thread-safety) of the current TraceConfig.
322 TraceConfig GetCurrentTraceConfig() const; 335 TraceConfig GetCurrentTraceConfig() const;
323 336
337 // Initializes the thread-local event buffer, if not already initialized and
338 // if the current thread supports that (has a message loop).
339 void InitializeThreadLocalEventBufferIfSupported();
340
324 // Enables normal tracing (recording trace events in the trace buffer). 341 // Enables normal tracing (recording trace events in the trace buffer).
325 // See TraceConfig comments for details on how to control what categories 342 // See TraceConfig comments for details on how to control what categories
326 // will be traced. If tracing has already been enabled, |category_filter| will 343 // will be traced. If tracing has already been enabled, |category_filter| will
327 // be merged into the current category filter. 344 // be merged into the current category filter.
328 void SetEnabled(const TraceConfig& trace_config, Mode mode); 345 void SetEnabled(const TraceConfig& trace_config, Mode mode);
329 346
330 // Disables normal tracing for all categories. 347 // Disables normal tracing for all categories.
331 void SetDisabled(); 348 void SetDisabled();
332 349
333 bool IsEnabled() { return mode_ != DISABLED; } 350 bool IsEnabled() { return mode_ != DISABLED; }
334 351
335 // The number of times we have begun recording traces. If tracing is off, 352 // The number of times we have begun recording traces. If tracing is off,
336 // returns -1. If tracing is on, then it returns the number of times we have 353 // returns -1. If tracing is on, then it returns the number of times we have
337 // recorded a trace. By watching for this number to increment, you can 354 // recorded a trace. By watching for this number to increment, you can
338 // passively discover when a new trace has begun. This is then used to 355 // passively discover when a new trace has begun. This is then used to
339 // implement the TRACE_EVENT_IS_NEW_TRACE() primitive. 356 // implement the TRACE_EVENT_IS_NEW_TRACE() primitive.
340 int GetNumTracesRecorded(); 357 int GetNumTracesRecorded();
341 358
342 #if defined(OS_ANDROID) 359 #if defined(OS_ANDROID)
343 void StartATrace(); 360 void StartATrace();
344 void StopATrace(); 361 void StopATrace();
345 void AddClockSyncMetadataEvent(); 362 void AddClockSyncMetadataEvent();
346 #endif 363 #endif
347 364
348 // Enabled state listeners give a callback when tracing is enabled or 365 // Enabled state listeners give a callback when tracing is enabled or
349 // disabled. This can be used to tie into other library's tracing systems 366 // disabled. This can be used to tie into other library's tracing systems
350 // on-demand. 367 // on-demand.
351 class BASE_EXPORT EnabledStateObserver { 368 class BASE_EXPORT EnabledStateObserver {
352 public: 369 public:
370 virtual ~EnabledStateObserver() = default;
371
353 // Called just after the tracing system becomes enabled, outside of the 372 // Called just after the tracing system becomes enabled, outside of the
354 // |lock_|. TraceLog::IsEnabled() is true at this point. 373 // |lock_|. TraceLog::IsEnabled() is true at this point.
355 virtual void OnTraceLogEnabled() = 0; 374 virtual void OnTraceLogEnabled() = 0;
356 375
357 // Called just after the tracing system disables, outside of the |lock_|. 376 // Called just after the tracing system disables, outside of the |lock_|.
358 // TraceLog::IsEnabled() is false at this point. 377 // TraceLog::IsEnabled() is false at this point.
359 virtual void OnTraceLogDisabled() = 0; 378 virtual void OnTraceLogDisabled() = 0;
360 }; 379 };
361 void AddEnabledStateObserver(EnabledStateObserver* listener); 380 void AddEnabledStateObserver(EnabledStateObserver* listener);
362 void RemoveEnabledStateObserver(EnabledStateObserver* listener); 381 void RemoveEnabledStateObserver(EnabledStateObserver* listener);
363 bool HasEnabledStateObserver(EnabledStateObserver* listener) const; 382 bool HasEnabledStateObserver(EnabledStateObserver* listener) const;
364 383
365 TraceLogStatus GetStatus() const; 384 TraceLogStatus GetStatus() const;
366 bool BufferIsFull() const; 385 bool BufferIsFull() const;
367 386
387 // Computes an estimate of the size of the TraceLog including all the retained
388 // objects.
389 void EstimateTraceMemoryOverhead(TraceEventMemoryOverhead* overhead);
390
368 // Not using base::Callback because of its limited by 7 parameters. 391 // Not using base::Callback because of its limited by 7 parameters.
369 // Also, using primitive type allows directly passing callback from WebCore. 392 // Also, using primitive type allows directly passing callback from WebCore.
370 // WARNING: It is possible for the previously set callback to be called 393 // WARNING: It is possible for the previously set callback to be called
371 // after a call to SetEventCallbackEnabled() that replaces or a call to 394 // after a call to SetEventCallbackEnabled() that replaces or a call to
372 // SetEventCallbackDisabled() that disables the callback. 395 // SetEventCallbackDisabled() that disables the callback.
373 // This callback may be invoked on any thread. 396 // This callback may be invoked on any thread.
374 // For TRACE_EVENT_PHASE_COMPLETE events, the client will still receive pairs 397 // For TRACE_EVENT_PHASE_COMPLETE events, the client will still receive pairs
375 // of TRACE_EVENT_PHASE_BEGIN and TRACE_EVENT_PHASE_END events to keep the 398 // of TRACE_EVENT_PHASE_BEGIN and TRACE_EVENT_PHASE_END events to keep the
376 // interface simple. 399 // interface simple.
377 typedef void (*EventCallback)(TraceTicks timestamp, 400 typedef void (*EventCallback)(TraceTicks timestamp,
378 char phase, 401 char phase,
379 const unsigned char* category_group_enabled, 402 const unsigned char* category_group_enabled,
380 const char* name, 403 const char* name,
381 unsigned long long id, 404 unsigned long long id,
382 int num_args, 405 int num_args,
383 const char* const arg_names[], 406 const char* const arg_names[],
384 const unsigned char arg_types[], 407 const unsigned char arg_types[],
385 const unsigned long long arg_values[], 408 const unsigned long long arg_values[],
386 unsigned char flags); 409 unsigned int flags);
387 410
388 // Enable tracing for EventCallback. 411 // Enable tracing for EventCallback.
389 void SetEventCallbackEnabled(const TraceConfig& trace_config, 412 void SetEventCallbackEnabled(const TraceConfig& trace_config,
390 EventCallback cb); 413 EventCallback cb);
391 void SetEventCallbackDisabled(); 414 void SetEventCallbackDisabled();
392 void SetArgumentFilterPredicate( 415 void SetArgumentFilterPredicate(
393 const TraceEvent::ArgumentFilterPredicate& argument_filter_predicate); 416 const TraceEvent::ArgumentFilterPredicate& argument_filter_predicate);
394 417
395 // Flush all collected events to the given output callback. The callback will 418 // Flush all collected events to the given output callback. The callback will
396 // be called one or more times either synchronously or asynchronously from 419 // be called one or more times either synchronously or asynchronously from
397 // the current thread with IPC-bite-size chunks. The string format is 420 // the current thread with IPC-bite-size chunks. The string format is
398 // undefined. Use TraceResultBuffer to convert one or more trace strings to 421 // undefined. Use TraceResultBuffer to convert one or more trace strings to
399 // JSON. The callback can be null if the caller doesn't want any data. 422 // JSON. The callback can be null if the caller doesn't want any data.
400 // Due to the implementation of thread-local buffers, flush can't be 423 // Due to the implementation of thread-local buffers, flush can't be
401 // done when tracing is enabled. If called when tracing is enabled, the 424 // done when tracing is enabled. If called when tracing is enabled, the
402 // callback will be called directly with (empty_string, false) to indicate 425 // callback will be called directly with (empty_string, false) to indicate
403 // the end of this unsuccessful flush. Flush does the serialization 426 // the end of this unsuccessful flush. Flush does the serialization
404 // on the same thread if the caller doesn't set use_worker_thread explicitly. 427 // on the same thread if the caller doesn't set use_worker_thread explicitly.
405 typedef base::Callback<void(const scoped_refptr<base::RefCountedString>&, 428 typedef base::Callback<void(const scoped_refptr<base::RefCountedString>&,
406 bool has_more_events)> OutputCallback; 429 bool has_more_events)> OutputCallback;
407 void Flush(const OutputCallback& cb, bool use_worker_thread = false); 430 void Flush(const OutputCallback& cb, bool use_worker_thread = false);
408 void FlushButLeaveBufferIntact(const OutputCallback& flush_output_callback); 431 void FlushButLeaveBufferIntact(const OutputCallback& flush_output_callback);
409 432
433 // Cancels tracing and discards collected data.
434 void CancelTracing(const OutputCallback& cb);
435
410 // Called by TRACE_EVENT* macros, don't call this directly. 436 // Called by TRACE_EVENT* macros, don't call this directly.
411 // The name parameter is a category group for example: 437 // The name parameter is a category group for example:
412 // TRACE_EVENT0("renderer,webkit", "WebViewImpl::HandleInputEvent") 438 // TRACE_EVENT0("renderer,webkit", "WebViewImpl::HandleInputEvent")
413 static const unsigned char* GetCategoryGroupEnabled(const char* name); 439 static const unsigned char* GetCategoryGroupEnabled(const char* name);
414 static const char* GetCategoryGroupName( 440 static const char* GetCategoryGroupName(
415 const unsigned char* category_group_enabled); 441 const unsigned char* category_group_enabled);
416 442
417 // Called by TRACE_EVENT* macros, don't call this directly. 443 // Called by TRACE_EVENT* macros, don't call this directly.
418 // If |copy| is set, |name|, |arg_name1| and |arg_name2| will be deep copied 444 // If |copy| is set, |name|, |arg_name1| and |arg_name2| will be deep copied
419 // into the event; see "Memory scoping note" and TRACE_EVENT_COPY_XXX above. 445 // into the event; see "Memory scoping note" and TRACE_EVENT_COPY_XXX above.
420 TraceEventHandle AddTraceEvent( 446 TraceEventHandle AddTraceEvent(
421 char phase, 447 char phase,
422 const unsigned char* category_group_enabled, 448 const unsigned char* category_group_enabled,
423 const char* name, 449 const char* name,
424 unsigned long long id, 450 unsigned long long id,
425 int num_args, 451 int num_args,
426 const char** arg_names, 452 const char** arg_names,
427 const unsigned char* arg_types, 453 const unsigned char* arg_types,
428 const unsigned long long* arg_values, 454 const unsigned long long* arg_values,
429 const scoped_refptr<ConvertableToTraceFormat>* convertable_values, 455 const scoped_refptr<ConvertableToTraceFormat>* convertable_values,
430 unsigned char flags); 456 unsigned int flags);
431 TraceEventHandle AddTraceEventWithThreadIdAndTimestamp( 457 TraceEventHandle AddTraceEventWithThreadIdAndTimestamp(
432 char phase, 458 char phase,
433 const unsigned char* category_group_enabled, 459 const unsigned char* category_group_enabled,
434 const char* name, 460 const char* name,
435 unsigned long long id, 461 unsigned long long id,
436 int thread_id, 462 int thread_id,
437 const TraceTicks& timestamp, 463 const TraceTicks& timestamp,
438 int num_args, 464 int num_args,
439 const char** arg_names, 465 const char** arg_names,
440 const unsigned char* arg_types, 466 const unsigned char* arg_types,
441 const unsigned long long* arg_values, 467 const unsigned long long* arg_values,
442 const scoped_refptr<ConvertableToTraceFormat>* convertable_values, 468 const scoped_refptr<ConvertableToTraceFormat>* convertable_values,
443 unsigned char flags); 469 unsigned int flags);
444 static void AddTraceEventEtw(char phase, 470 static void AddTraceEventEtw(char phase,
445 const char* category_group, 471 const char* category_group,
446 const void* id, 472 const void* id,
447 const char* extra); 473 const char* extra);
448 static void AddTraceEventEtw(char phase, 474 static void AddTraceEventEtw(char phase,
449 const char* category_group, 475 const char* category_group,
450 const void* id, 476 const void* id,
451 const std::string& extra); 477 const std::string& extra);
452 478
453 void UpdateTraceEventDuration(const unsigned char* category_group_enabled, 479 void UpdateTraceEventDuration(const unsigned char* category_group_enabled,
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
521 TraceBufferVectorReportFull); 547 TraceBufferVectorReportFull);
522 FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture, 548 FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture,
523 ConvertTraceConfigToInternalOptions); 549 ConvertTraceConfigToInternalOptions);
524 FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture, 550 FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture,
525 TraceRecordAsMuchAsPossibleMode); 551 TraceRecordAsMuchAsPossibleMode);
526 552
527 // This allows constructor and destructor to be private and usable only 553 // This allows constructor and destructor to be private and usable only
528 // by the Singleton class. 554 // by the Singleton class.
529 friend struct DefaultSingletonTraits<TraceLog>; 555 friend struct DefaultSingletonTraits<TraceLog>;
530 556
557 // MemoryDumpProvider implementation.
558 bool OnMemoryDump(ProcessMemoryDump* pmd) override;
559
531 // Enable/disable each category group based on the current mode_, 560 // Enable/disable each category group based on the current mode_,
532 // category_filter_, event_callback_ and event_callback_category_filter_. 561 // category_filter_, event_callback_ and event_callback_category_filter_.
533 // Enable the category group in the enabled mode if category_filter_ matches 562 // Enable the category group in the enabled mode if category_filter_ matches
534 // the category group, or event_callback_ is not null and 563 // the category group, or event_callback_ is not null and
535 // event_callback_category_filter_ matches the category group. 564 // event_callback_category_filter_ matches the category group.
536 void UpdateCategoryGroupEnabledFlags(); 565 void UpdateCategoryGroupEnabledFlags();
537 void UpdateCategoryGroupEnabledFlag(size_t category_index); 566 void UpdateCategoryGroupEnabledFlag(size_t category_index);
538 567
539 // Configure synthetic delays based on the values set in the current 568 // Configure synthetic delays based on the values set in the current
540 // trace config. 569 // trace config.
541 void UpdateSyntheticDelaysFromTraceConfig(); 570 void UpdateSyntheticDelaysFromTraceConfig();
542 571
543 InternalTraceOptions GetInternalOptionsFromTraceConfig( 572 InternalTraceOptions GetInternalOptionsFromTraceConfig(
544 const TraceConfig& config); 573 const TraceConfig& config);
545 574
546 class ThreadLocalEventBuffer; 575 class ThreadLocalEventBuffer;
547 class OptionalAutoLock; 576 class OptionalAutoLock;
548 577
549 TraceLog(); 578 TraceLog();
550 ~TraceLog(); 579 ~TraceLog() override;
551 const unsigned char* GetCategoryGroupEnabledInternal(const char* name); 580 const unsigned char* GetCategoryGroupEnabledInternal(const char* name);
552 void AddMetadataEventsWhileLocked(); 581 void AddMetadataEventsWhileLocked();
553 582
554 InternalTraceOptions trace_options() const { 583 InternalTraceOptions trace_options() const {
555 return static_cast<InternalTraceOptions>( 584 return static_cast<InternalTraceOptions>(
556 subtle::NoBarrier_Load(&trace_options_)); 585 subtle::NoBarrier_Load(&trace_options_));
557 } 586 }
558 587
559 TraceBuffer* trace_buffer() const { return logged_events_.get(); } 588 TraceBuffer* trace_buffer() const { return logged_events_.get(); }
560 TraceBuffer* CreateTraceBuffer(); 589 TraceBuffer* CreateTraceBuffer();
561 TraceBuffer* CreateTraceBufferVectorOfSize(size_t max_chunks); 590 TraceBuffer* CreateTraceBufferVectorOfSize(size_t max_chunks);
562 591
563 std::string EventToConsoleMessage(unsigned char phase, 592 std::string EventToConsoleMessage(unsigned char phase,
564 const TraceTicks& timestamp, 593 const TraceTicks& timestamp,
565 TraceEvent* trace_event); 594 TraceEvent* trace_event);
566 595
567 TraceEvent* AddEventToThreadSharedChunkWhileLocked(TraceEventHandle* handle, 596 TraceEvent* AddEventToThreadSharedChunkWhileLocked(TraceEventHandle* handle,
568 bool check_buffer_is_full); 597 bool check_buffer_is_full);
569 void CheckIfBufferIsFullWhileLocked(); 598 void CheckIfBufferIsFullWhileLocked();
570 void SetDisabledWhileLocked(); 599 void SetDisabledWhileLocked();
571 600
572 TraceEvent* GetEventByHandleInternal(TraceEventHandle handle, 601 TraceEvent* GetEventByHandleInternal(TraceEventHandle handle,
573 OptionalAutoLock* lock); 602 OptionalAutoLock* lock);
574 603
604 void FlushInternal(const OutputCallback& cb,
605 bool use_worker_thread,
606 bool discard_events);
607
575 // |generation| is used in the following callbacks to check if the callback 608 // |generation| is used in the following callbacks to check if the callback
576 // is called for the flush of the current |logged_events_|. 609 // is called for the flush of the current |logged_events_|.
577 void FlushCurrentThread(int generation); 610 void FlushCurrentThread(int generation, bool discard_events);
578 // Usually it runs on a different thread. 611 // Usually it runs on a different thread.
579 static void ConvertTraceEventsToTraceFormat( 612 static void ConvertTraceEventsToTraceFormat(
580 scoped_ptr<TraceBuffer> logged_events, 613 scoped_ptr<TraceBuffer> logged_events,
581 const TraceLog::OutputCallback& flush_output_callback, 614 const TraceLog::OutputCallback& flush_output_callback,
582 const TraceEvent::ArgumentFilterPredicate& argument_filter_predicate); 615 const TraceEvent::ArgumentFilterPredicate& argument_filter_predicate);
583 void FinishFlush(int generation); 616 void FinishFlush(int generation, bool discard_events);
584 void OnFlushTimeout(int generation); 617 void OnFlushTimeout(int generation, bool discard_events);
585 618
586 int generation() const { 619 int generation() const {
587 return static_cast<int>(subtle::NoBarrier_Load(&generation_)); 620 return static_cast<int>(subtle::NoBarrier_Load(&generation_));
588 } 621 }
589 bool CheckGeneration(int generation) const { 622 bool CheckGeneration(int generation) const {
590 return generation == this->generation(); 623 return generation == this->generation();
591 } 624 }
592 void UseNextTraceBuffer(); 625 void UseNextTraceBuffer();
593 626
594 TraceTicks OffsetNow() const { 627 TraceTicks OffsetNow() const {
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
675 subtle::AtomicWord generation_; 708 subtle::AtomicWord generation_;
676 bool use_worker_thread_; 709 bool use_worker_thread_;
677 710
678 DISALLOW_COPY_AND_ASSIGN(TraceLog); 711 DISALLOW_COPY_AND_ASSIGN(TraceLog);
679 }; 712 };
680 713
681 } // namespace trace_event 714 } // namespace trace_event
682 } // namespace base 715 } // namespace base
683 716
684 #endif // BASE_TRACE_EVENT_TRACE_EVENT_IMPL_H_ 717 #endif // BASE_TRACE_EVENT_TRACE_EVENT_IMPL_H_
OLDNEW
« no previous file with comments | « base/trace_event/trace_event_etw_export_win.cc ('k') | base/trace_event/trace_event_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698