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

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

Issue 1180693002: Update from https://crrev.com/333737 (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: rebased Created 5 years, 6 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/trace_config.h"
27 28
28 // Older style trace macros with explicit id and extra data 29 // Older style trace macros with explicit id and extra data
29 // Only these macros result in publishing data to ETW as currently implemented. 30 // Only these macros result in publishing data to ETW as currently implemented.
30 // TODO(georgesak): Update/replace these with new ETW macros. 31 // TODO(georgesak): Update/replace these with new ETW macros.
31 #define TRACE_EVENT_BEGIN_ETW(name, id, extra) \ 32 #define TRACE_EVENT_BEGIN_ETW(name, id, extra) \
32 base::trace_event::TraceLog::AddTraceEventEtw( \ 33 base::trace_event::TraceLog::AddTraceEventEtw( \
33 TRACE_EVENT_PHASE_BEGIN, \ 34 TRACE_EVENT_PHASE_BEGIN, \
34 name, reinterpret_cast<const void*>(id), extra) 35 name, reinterpret_cast<const void*>(id), extra)
35 36
36 #define TRACE_EVENT_END_ETW(name, id, extra) \ 37 #define TRACE_EVENT_END_ETW(name, id, extra) \
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
98 99
99 TraceEvent(); 100 TraceEvent();
100 ~TraceEvent(); 101 ~TraceEvent();
101 102
102 // We don't need to copy TraceEvent except when TraceEventBuffer is cloned. 103 // We don't need to copy TraceEvent except when TraceEventBuffer is cloned.
103 // Use explicit copy method to avoid accidentally misuse of copy. 104 // Use explicit copy method to avoid accidentally misuse of copy.
104 void CopyFrom(const TraceEvent& other); 105 void CopyFrom(const TraceEvent& other);
105 106
106 void Initialize( 107 void Initialize(
107 int thread_id, 108 int thread_id,
108 TimeTicks timestamp, 109 TraceTicks timestamp,
109 TimeTicks thread_timestamp, 110 ThreadTicks thread_timestamp,
110 char phase, 111 char phase,
111 const unsigned char* category_group_enabled, 112 const unsigned char* category_group_enabled,
112 const char* name, 113 const char* name,
113 unsigned long long id, 114 unsigned long long id,
114 int num_args, 115 int num_args,
115 const char** arg_names, 116 const char** arg_names,
116 const unsigned char* arg_types, 117 const unsigned char* arg_types,
117 const unsigned long long* arg_values, 118 const unsigned long long* arg_values,
118 const scoped_refptr<ConvertableToTraceFormat>* convertable_values, 119 const scoped_refptr<ConvertableToTraceFormat>* convertable_values,
119 unsigned char flags); 120 unsigned char flags);
120 121
121 void Reset(); 122 void Reset();
122 123
123 void UpdateDuration(const TimeTicks& now, const TimeTicks& thread_now); 124 void UpdateDuration(const TraceTicks& now, const ThreadTicks& thread_now);
124 125
125 // Serialize event data to JSON 126 // Serialize event data to JSON
126 void AppendAsJSON(std::string* out) const; 127 typedef base::Callback<bool(const char* category_group_name,
128 const char* event_name)> ArgumentFilterPredicate;
129 void AppendAsJSON(
130 std::string* out,
131 const ArgumentFilterPredicate& argument_filter_predicate) const;
127 void AppendPrettyPrinted(std::ostringstream* out) const; 132 void AppendPrettyPrinted(std::ostringstream* out) const;
128 133
129 static void AppendValueAsJSON(unsigned char type, 134 static void AppendValueAsJSON(unsigned char type,
130 TraceValue value, 135 TraceValue value,
131 std::string* out); 136 std::string* out);
132 137
133 TimeTicks timestamp() const { return timestamp_; } 138 TraceTicks timestamp() const { return timestamp_; }
134 TimeTicks thread_timestamp() const { return thread_timestamp_; } 139 ThreadTicks thread_timestamp() const { return thread_timestamp_; }
135 char phase() const { return phase_; } 140 char phase() const { return phase_; }
136 int thread_id() const { return thread_id_; } 141 int thread_id() const { return thread_id_; }
137 TimeDelta duration() const { return duration_; } 142 TimeDelta duration() const { return duration_; }
138 TimeDelta thread_duration() const { return thread_duration_; } 143 TimeDelta thread_duration() const { return thread_duration_; }
139 unsigned long long id() const { return id_; } 144 unsigned long long id() const { return id_; }
140 unsigned char flags() const { return flags_; } 145 unsigned char flags() const { return flags_; }
141 146
142 // Exposed for unittesting: 147 // Exposed for unittesting:
143 148
144 const base::RefCountedString* parameter_copy_storage() const { 149 const base::RefCountedString* parameter_copy_storage() const {
145 return parameter_copy_storage_.get(); 150 return parameter_copy_storage_.get();
146 } 151 }
147 152
148 const unsigned char* category_group_enabled() const { 153 const unsigned char* category_group_enabled() const {
149 return category_group_enabled_; 154 return category_group_enabled_;
150 } 155 }
151 156
152 const char* name() const { return name_; } 157 const char* name() const { return name_; }
153 158
154 #if defined(OS_ANDROID) 159 #if defined(OS_ANDROID)
155 void SendToATrace(); 160 void SendToATrace();
156 #endif 161 #endif
157 162
158 private: 163 private:
159 // Note: these are ordered by size (largest first) for optimal packing. 164 // Note: these are ordered by size (largest first) for optimal packing.
160 TimeTicks timestamp_; 165 TraceTicks timestamp_;
161 TimeTicks thread_timestamp_; 166 ThreadTicks thread_timestamp_;
162 TimeDelta duration_; 167 TimeDelta duration_;
163 TimeDelta thread_duration_; 168 TimeDelta thread_duration_;
164 // id_ can be used to store phase-specific data. 169 // id_ can be used to store phase-specific data.
165 unsigned long long id_; 170 unsigned long long id_;
166 TraceValue arg_values_[kTraceMaxNumArgs]; 171 TraceValue arg_values_[kTraceMaxNumArgs];
167 const char* arg_names_[kTraceMaxNumArgs]; 172 const char* arg_names_[kTraceMaxNumArgs];
168 scoped_refptr<ConvertableToTraceFormat> convertable_values_[kTraceMaxNumArgs]; 173 scoped_refptr<ConvertableToTraceFormat> convertable_values_[kTraceMaxNumArgs];
169 const unsigned char* category_group_enabled_; 174 const unsigned char* category_group_enabled_;
170 const char* name_; 175 const char* name_;
171 scoped_refptr<base::RefCountedString> parameter_copy_storage_; 176 scoped_refptr<base::RefCountedString> parameter_copy_storage_;
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
268 273
269 // When all fragments have been added, call Finish to complete the JSON 274 // When all fragments have been added, call Finish to complete the JSON
270 // formatted output. 275 // formatted output.
271 void Finish(); 276 void Finish();
272 277
273 private: 278 private:
274 OutputCallback output_callback_; 279 OutputCallback output_callback_;
275 bool append_comma_; 280 bool append_comma_;
276 }; 281 };
277 282
278 class BASE_EXPORT CategoryFilter {
279 public:
280 typedef std::vector<std::string> StringList;
281
282 // The default category filter, used when none is provided.
283 // Allows all categories through, except if they end in the suffix 'Debug' or
284 // 'Test'.
285 static const char kDefaultCategoryFilterString[];
286
287 // |filter_string| is a comma-delimited list of category wildcards.
288 // A category can have an optional '-' prefix to make it an excluded category.
289 // All the same rules apply above, so for example, having both included and
290 // excluded categories in the same list would not be supported.
291 //
292 // Example: CategoryFilter"test_MyTest*");
293 // Example: CategoryFilter("test_MyTest*,test_OtherStuff");
294 // Example: CategoryFilter("-excluded_category1,-excluded_category2");
295 // Example: CategoryFilter("-*,webkit"); would disable everything but webkit.
296 // Example: CategoryFilter("-webkit"); would enable everything but webkit.
297 //
298 // Category filters can also be used to configure synthetic delays.
299 //
300 // Example: CategoryFilter("DELAY(gpu.PresentingFrame;16)"); would make swap
301 // buffers always take at least 16 ms.
302 // Example: CategoryFilter("DELAY(gpu.PresentingFrame;16;oneshot)"); would
303 // make swap buffers take at least 16 ms the first time it is
304 // called.
305 // Example: CategoryFilter("DELAY(gpu.PresentingFrame;16;alternating)");
306 // would make swap buffers take at least 16 ms every other time it
307 // is called.
308 explicit CategoryFilter(const std::string& filter_string);
309
310 CategoryFilter();
311
312 CategoryFilter(const CategoryFilter& cf);
313
314 ~CategoryFilter();
315
316 CategoryFilter& operator=(const CategoryFilter& rhs);
317
318 // Writes the string representation of the CategoryFilter. This is a comma
319 // separated string, similar in nature to the one used to determine
320 // enabled/disabled category patterns, except here there is an arbitrary
321 // order, included categories go first, then excluded categories. Excluded
322 // categories are distinguished from included categories by the prefix '-'.
323 std::string ToString() const;
324
325 // Returns true if at least one category in the list is enabled by this
326 // category filter.
327 bool IsCategoryGroupEnabled(const char* category_group) const;
328
329 // Return a list of the synthetic delays specified in this category filter.
330 const StringList& GetSyntheticDelayValues() const;
331
332 // Merges nested_filter with the current CategoryFilter
333 void Merge(const CategoryFilter& nested_filter);
334
335 // Clears both included/excluded pattern lists. This would be equivalent to
336 // creating a CategoryFilter with an empty string, through the constructor.
337 // i.e: CategoryFilter().
338 //
339 // When using an empty filter, all categories are considered included as we
340 // are not excluding anything.
341 void Clear();
342
343 private:
344 FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture, CategoryFilter);
345
346 // Returns true if category is enable according to this filter.
347 bool IsCategoryEnabled(const char* category_name) const;
348
349 static bool IsEmptyOrContainsLeadingOrTrailingWhitespace(
350 const std::string& str);
351
352 void Initialize(const std::string& filter_string);
353 void WriteString(const StringList& values,
354 std::string* out,
355 bool included) const;
356 void WriteString(const StringList& delays, std::string* out) const;
357 bool HasIncludedPatterns() const;
358
359 StringList included_;
360 StringList disabled_;
361 StringList excluded_;
362 StringList delays_;
363 };
364
365 class TraceSamplingThread; 283 class TraceSamplingThread;
366 284
367 // Options determines how the trace buffer stores data.
368 enum TraceRecordMode {
369 // Record until the trace buffer is full.
370 RECORD_UNTIL_FULL,
371
372 // Record until the user ends the trace. The trace buffer is a fixed size
373 // and we use it as a ring buffer during recording.
374 RECORD_CONTINUOUSLY,
375
376 // Echo to console. Events are discarded.
377 ECHO_TO_CONSOLE,
378
379 // Record until the trace buffer is full, but with a huge buffer size.
380 RECORD_AS_MUCH_AS_POSSIBLE
381 };
382
383 struct BASE_EXPORT TraceOptions {
384 TraceOptions()
385 : record_mode(RECORD_UNTIL_FULL),
386 enable_sampling(false),
387 enable_systrace(false) {}
388
389 explicit TraceOptions(TraceRecordMode record_mode)
390 : record_mode(record_mode),
391 enable_sampling(false),
392 enable_systrace(false) {}
393
394 // |options_string| is a comma-delimited list of trace options.
395 // Possible options are: "record-until-full", "record-continuously",
396 // "trace-to-console", "enable-sampling" and "enable-systrace".
397 // The first 3 options are trace recoding modes and hence
398 // mutually exclusive. If more than one trace recording modes appear in the
399 // options_string, the last one takes precedence. If none of the trace
400 // recording mode is specified, recording mode is RECORD_UNTIL_FULL.
401 //
402 // The trace option will first be reset to the default option
403 // (record_mode set to RECORD_UNTIL_FULL, enable_sampling and enable_systrace
404 // set to false) before options parsed from |options_string| are applied on
405 // it.
406 // If |options_string| is invalid, the final state of trace_options is
407 // undefined.
408 //
409 // Example: trace_options.SetFromString("record-until-full")
410 // Example: trace_options.SetFromString(
411 // "record-continuously, enable-sampling")
412 // Example: trace_options.SetFromString("record-until-full, trace-to-console")
413 // will set ECHO_TO_CONSOLE as the recording mode.
414 //
415 // Returns true on success.
416 bool SetFromString(const std::string& options_string);
417
418 std::string ToString() const;
419
420 TraceRecordMode record_mode;
421 bool enable_sampling;
422 bool enable_systrace;
423 };
424
425 struct BASE_EXPORT TraceLogStatus { 285 struct BASE_EXPORT TraceLogStatus {
426 TraceLogStatus(); 286 TraceLogStatus();
427 ~TraceLogStatus(); 287 ~TraceLogStatus();
428 size_t event_capacity; 288 size_t event_capacity;
429 size_t event_count; 289 size_t event_count;
430 }; 290 };
431 291
432 class BASE_EXPORT TraceLog { 292 class BASE_EXPORT TraceLog {
433 public: 293 public:
434 enum Mode { 294 enum Mode {
(...skipping 16 matching lines...) Expand all
451 // Category group enabled to export events to ETW. 311 // Category group enabled to export events to ETW.
452 ENABLED_FOR_ETW_EXPORT = 1 << 3 312 ENABLED_FOR_ETW_EXPORT = 1 << 3
453 }; 313 };
454 314
455 static TraceLog* GetInstance(); 315 static TraceLog* GetInstance();
456 316
457 // Get set of known category groups. This can change as new code paths are 317 // Get set of known category groups. This can change as new code paths are
458 // reached. The known category groups are inserted into |category_groups|. 318 // reached. The known category groups are inserted into |category_groups|.
459 void GetKnownCategoryGroups(std::vector<std::string>* category_groups); 319 void GetKnownCategoryGroups(std::vector<std::string>* category_groups);
460 320
461 // Retrieves a copy (for thread-safety) of the current CategoryFilter. 321 // Retrieves a copy (for thread-safety) of the current TraceConfig.
462 CategoryFilter GetCurrentCategoryFilter(); 322 TraceConfig GetCurrentTraceConfig() const;
463
464 // Retrieves a copy (for thread-safety) of the current TraceOptions.
465 TraceOptions GetCurrentTraceOptions() const;
466 323
467 // Enables normal tracing (recording trace events in the trace buffer). 324 // Enables normal tracing (recording trace events in the trace buffer).
468 // See CategoryFilter comments for details on how to control what categories 325 // See TraceConfig comments for details on how to control what categories
469 // will be traced. If tracing has already been enabled, |category_filter| will 326 // will be traced. If tracing has already been enabled, |category_filter| will
470 // be merged into the current category filter. 327 // be merged into the current category filter.
471 void SetEnabled(const CategoryFilter& category_filter, 328 void SetEnabled(const TraceConfig& trace_config, Mode mode);
472 Mode mode, const TraceOptions& options);
473 329
474 // Disables normal tracing for all categories. 330 // Disables normal tracing for all categories.
475 void SetDisabled(); 331 void SetDisabled();
476 332
477 bool IsEnabled() { return mode_ != DISABLED; } 333 bool IsEnabled() { return mode_ != DISABLED; }
478 334
479 // The number of times we have begun recording traces. If tracing is off, 335 // The number of times we have begun recording traces. If tracing is off,
480 // returns -1. If tracing is on, then it returns the number of times we have 336 // returns -1. If tracing is on, then it returns the number of times we have
481 // recorded a trace. By watching for this number to increment, you can 337 // recorded a trace. By watching for this number to increment, you can
482 // passively discover when a new trace has begun. This is then used to 338 // passively discover when a new trace has begun. This is then used to
(...skipping 28 matching lines...) Expand all
511 367
512 // Not using base::Callback because of its limited by 7 parameters. 368 // Not using base::Callback because of its limited by 7 parameters.
513 // Also, using primitive type allows directly passing callback from WebCore. 369 // Also, using primitive type allows directly passing callback from WebCore.
514 // WARNING: It is possible for the previously set callback to be called 370 // WARNING: It is possible for the previously set callback to be called
515 // after a call to SetEventCallbackEnabled() that replaces or a call to 371 // after a call to SetEventCallbackEnabled() that replaces or a call to
516 // SetEventCallbackDisabled() that disables the callback. 372 // SetEventCallbackDisabled() that disables the callback.
517 // This callback may be invoked on any thread. 373 // This callback may be invoked on any thread.
518 // For TRACE_EVENT_PHASE_COMPLETE events, the client will still receive pairs 374 // For TRACE_EVENT_PHASE_COMPLETE events, the client will still receive pairs
519 // of TRACE_EVENT_PHASE_BEGIN and TRACE_EVENT_PHASE_END events to keep the 375 // of TRACE_EVENT_PHASE_BEGIN and TRACE_EVENT_PHASE_END events to keep the
520 // interface simple. 376 // interface simple.
521 typedef void (*EventCallback)(TimeTicks timestamp, 377 typedef void (*EventCallback)(TraceTicks timestamp,
522 char phase, 378 char phase,
523 const unsigned char* category_group_enabled, 379 const unsigned char* category_group_enabled,
524 const char* name, 380 const char* name,
525 unsigned long long id, 381 unsigned long long id,
526 int num_args, 382 int num_args,
527 const char* const arg_names[], 383 const char* const arg_names[],
528 const unsigned char arg_types[], 384 const unsigned char arg_types[],
529 const unsigned long long arg_values[], 385 const unsigned long long arg_values[],
530 unsigned char flags); 386 unsigned char flags);
531 387
532 // Enable tracing for EventCallback. 388 // Enable tracing for EventCallback.
533 void SetEventCallbackEnabled(const CategoryFilter& category_filter, 389 void SetEventCallbackEnabled(const TraceConfig& trace_config,
534 EventCallback cb); 390 EventCallback cb);
535 void SetEventCallbackDisabled(); 391 void SetEventCallbackDisabled();
392 void SetArgumentFilterPredicate(
393 const TraceEvent::ArgumentFilterPredicate& argument_filter_predicate);
536 394
537 // Flush all collected events to the given output callback. The callback will 395 // Flush all collected events to the given output callback. The callback will
538 // be called one or more times either synchronously or asynchronously from 396 // be called one or more times either synchronously or asynchronously from
539 // the current thread with IPC-bite-size chunks. The string format is 397 // the current thread with IPC-bite-size chunks. The string format is
540 // undefined. Use TraceResultBuffer to convert one or more trace strings to 398 // undefined. Use TraceResultBuffer to convert one or more trace strings to
541 // JSON. The callback can be null if the caller doesn't want any data. 399 // JSON. The callback can be null if the caller doesn't want any data.
542 // Due to the implementation of thread-local buffers, flush can't be 400 // Due to the implementation of thread-local buffers, flush can't be
543 // done when tracing is enabled. If called when tracing is enabled, the 401 // done when tracing is enabled. If called when tracing is enabled, the
544 // callback will be called directly with (empty_string, false) to indicate 402 // callback will be called directly with (empty_string, false) to indicate
545 // the end of this unsuccessful flush. Flush does the serialization 403 // the end of this unsuccessful flush. Flush does the serialization
(...skipping 23 matching lines...) Expand all
569 const unsigned char* arg_types, 427 const unsigned char* arg_types,
570 const unsigned long long* arg_values, 428 const unsigned long long* arg_values,
571 const scoped_refptr<ConvertableToTraceFormat>* convertable_values, 429 const scoped_refptr<ConvertableToTraceFormat>* convertable_values,
572 unsigned char flags); 430 unsigned char flags);
573 TraceEventHandle AddTraceEventWithThreadIdAndTimestamp( 431 TraceEventHandle AddTraceEventWithThreadIdAndTimestamp(
574 char phase, 432 char phase,
575 const unsigned char* category_group_enabled, 433 const unsigned char* category_group_enabled,
576 const char* name, 434 const char* name,
577 unsigned long long id, 435 unsigned long long id,
578 int thread_id, 436 int thread_id,
579 const TimeTicks& timestamp, 437 const TraceTicks& timestamp,
580 int num_args, 438 int num_args,
581 const char** arg_names, 439 const char** arg_names,
582 const unsigned char* arg_types, 440 const unsigned char* arg_types,
583 const unsigned long long* arg_values, 441 const unsigned long long* arg_values,
584 const scoped_refptr<ConvertableToTraceFormat>* convertable_values, 442 const scoped_refptr<ConvertableToTraceFormat>* convertable_values,
585 unsigned char flags); 443 unsigned char flags);
586 static void AddTraceEventEtw(char phase, 444 static void AddTraceEventEtw(char phase,
587 const char* category_group, 445 const char* category_group,
588 const void* id, 446 const void* id,
589 const char* extra); 447 const char* extra);
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
632 // Processes can have labels in addition to their names. Use labels, for 490 // Processes can have labels in addition to their names. Use labels, for
633 // instance, to list out the web page titles that a process is handling. 491 // instance, to list out the web page titles that a process is handling.
634 void UpdateProcessLabel(int label_id, const std::string& current_label); 492 void UpdateProcessLabel(int label_id, const std::string& current_label);
635 void RemoveProcessLabel(int label_id); 493 void RemoveProcessLabel(int label_id);
636 494
637 // Thread sort indices, if set, override the order of a thread will appear 495 // Thread sort indices, if set, override the order of a thread will appear
638 // within its process in the trace viewer. Threads are sorted first on their 496 // within its process in the trace viewer. Threads are sorted first on their
639 // sort index, ascending, then by their name, and then tid. 497 // sort index, ascending, then by their name, and then tid.
640 void SetThreadSortIndex(PlatformThreadId , int sort_index); 498 void SetThreadSortIndex(PlatformThreadId , int sort_index);
641 499
642 // Allow setting an offset between the current TimeTicks time and the time 500 // Allow setting an offset between the current TraceTicks time and the time
643 // that should be reported. 501 // that should be reported.
644 void SetTimeOffset(TimeDelta offset); 502 void SetTimeOffset(TimeDelta offset);
645 503
646 size_t GetObserverCountForTest() const; 504 size_t GetObserverCountForTest() const;
647 505
648 // Call this method if the current thread may block the message loop to 506 // Call this method if the current thread may block the message loop to
649 // prevent the thread from using the thread-local buffer because the thread 507 // prevent the thread from using the thread-local buffer because the thread
650 // may not handle the flush request in time causing lost of unflushed events. 508 // may not handle the flush request in time causing lost of unflushed events.
651 void SetCurrentThreadBlocksMessageLoop(); 509 void SetCurrentThreadBlocksMessageLoop();
652 510
653 private: 511 private:
654 typedef unsigned int InternalTraceOptions; 512 typedef unsigned int InternalTraceOptions;
655 513
656 FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture, 514 FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture,
657 TraceBufferRingBufferGetReturnChunk); 515 TraceBufferRingBufferGetReturnChunk);
658 FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture, 516 FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture,
659 TraceBufferRingBufferHalfIteration); 517 TraceBufferRingBufferHalfIteration);
660 FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture, 518 FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture,
661 TraceBufferRingBufferFullIteration); 519 TraceBufferRingBufferFullIteration);
662 FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture, 520 FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture,
663 TraceBufferVectorReportFull); 521 TraceBufferVectorReportFull);
664 FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture, 522 FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture,
665 ConvertTraceOptionsToInternalOptions); 523 ConvertTraceConfigToInternalOptions);
666 FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture, 524 FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture,
667 TraceRecordAsMuchAsPossibleMode); 525 TraceRecordAsMuchAsPossibleMode);
668 526
669 // This allows constructor and destructor to be private and usable only 527 // This allows constructor and destructor to be private and usable only
670 // by the Singleton class. 528 // by the Singleton class.
671 friend struct DefaultSingletonTraits<TraceLog>; 529 friend struct DefaultSingletonTraits<TraceLog>;
672 530
673 // Enable/disable each category group based on the current mode_, 531 // Enable/disable each category group based on the current mode_,
674 // category_filter_, event_callback_ and event_callback_category_filter_. 532 // category_filter_, event_callback_ and event_callback_category_filter_.
675 // Enable the category group in the enabled mode if category_filter_ matches 533 // Enable the category group in the enabled mode if category_filter_ matches
676 // the category group, or event_callback_ is not null and 534 // the category group, or event_callback_ is not null and
677 // event_callback_category_filter_ matches the category group. 535 // event_callback_category_filter_ matches the category group.
678 void UpdateCategoryGroupEnabledFlags(); 536 void UpdateCategoryGroupEnabledFlags();
679 void UpdateCategoryGroupEnabledFlag(size_t category_index); 537 void UpdateCategoryGroupEnabledFlag(size_t category_index);
680 538
681 // Configure synthetic delays based on the values set in the current 539 // Configure synthetic delays based on the values set in the current
682 // category filter. 540 // trace config.
683 void UpdateSyntheticDelaysFromCategoryFilter(); 541 void UpdateSyntheticDelaysFromTraceConfig();
684 542
685 InternalTraceOptions GetInternalOptionsFromTraceOptions( 543 InternalTraceOptions GetInternalOptionsFromTraceConfig(
686 const TraceOptions& options); 544 const TraceConfig& config);
687 545
688 class ThreadLocalEventBuffer; 546 class ThreadLocalEventBuffer;
689 class OptionalAutoLock; 547 class OptionalAutoLock;
690 548
691 TraceLog(); 549 TraceLog();
692 ~TraceLog(); 550 ~TraceLog();
693 const unsigned char* GetCategoryGroupEnabledInternal(const char* name); 551 const unsigned char* GetCategoryGroupEnabledInternal(const char* name);
694 void AddMetadataEventsWhileLocked(); 552 void AddMetadataEventsWhileLocked();
695 553
696 InternalTraceOptions trace_options() const { 554 InternalTraceOptions trace_options() const {
697 return static_cast<InternalTraceOptions>( 555 return static_cast<InternalTraceOptions>(
698 subtle::NoBarrier_Load(&trace_options_)); 556 subtle::NoBarrier_Load(&trace_options_));
699 } 557 }
700 558
701 TraceBuffer* trace_buffer() const { return logged_events_.get(); } 559 TraceBuffer* trace_buffer() const { return logged_events_.get(); }
702 TraceBuffer* CreateTraceBuffer(); 560 TraceBuffer* CreateTraceBuffer();
703 TraceBuffer* CreateTraceBufferVectorOfSize(size_t max_chunks); 561 TraceBuffer* CreateTraceBufferVectorOfSize(size_t max_chunks);
704 562
705 std::string EventToConsoleMessage(unsigned char phase, 563 std::string EventToConsoleMessage(unsigned char phase,
706 const TimeTicks& timestamp, 564 const TraceTicks& timestamp,
707 TraceEvent* trace_event); 565 TraceEvent* trace_event);
708 566
709 TraceEvent* AddEventToThreadSharedChunkWhileLocked(TraceEventHandle* handle, 567 TraceEvent* AddEventToThreadSharedChunkWhileLocked(TraceEventHandle* handle,
710 bool check_buffer_is_full); 568 bool check_buffer_is_full);
711 void CheckIfBufferIsFullWhileLocked(); 569 void CheckIfBufferIsFullWhileLocked();
712 void SetDisabledWhileLocked(); 570 void SetDisabledWhileLocked();
713 571
714 TraceEvent* GetEventByHandleInternal(TraceEventHandle handle, 572 TraceEvent* GetEventByHandleInternal(TraceEventHandle handle,
715 OptionalAutoLock* lock); 573 OptionalAutoLock* lock);
716 574
717 // |generation| is used in the following callbacks to check if the callback 575 // |generation| is used in the following callbacks to check if the callback
718 // is called for the flush of the current |logged_events_|. 576 // is called for the flush of the current |logged_events_|.
719 void FlushCurrentThread(int generation); 577 void FlushCurrentThread(int generation);
720 // Usually it runs on a different thread. 578 // Usually it runs on a different thread.
721 static void ConvertTraceEventsToTraceFormat( 579 static void ConvertTraceEventsToTraceFormat(
722 scoped_ptr<TraceBuffer> logged_events, 580 scoped_ptr<TraceBuffer> logged_events,
723 const TraceLog::OutputCallback& flush_output_callback); 581 const TraceLog::OutputCallback& flush_output_callback,
582 const TraceEvent::ArgumentFilterPredicate& argument_filter_predicate);
724 void FinishFlush(int generation); 583 void FinishFlush(int generation);
725 void OnFlushTimeout(int generation); 584 void OnFlushTimeout(int generation);
726 585
727 int generation() const { 586 int generation() const {
728 return static_cast<int>(subtle::NoBarrier_Load(&generation_)); 587 return static_cast<int>(subtle::NoBarrier_Load(&generation_));
729 } 588 }
730 bool CheckGeneration(int generation) const { 589 bool CheckGeneration(int generation) const {
731 return generation == this->generation(); 590 return generation == this->generation();
732 } 591 }
733 void UseNextTraceBuffer(); 592 void UseNextTraceBuffer();
734 593
735 TimeTicks OffsetNow() const { 594 TraceTicks OffsetNow() const {
736 return OffsetTimestamp(TimeTicks::NowFromSystemTraceTime()); 595 return OffsetTimestamp(TraceTicks::Now());
737 } 596 }
738 TimeTicks OffsetTimestamp(const TimeTicks& timestamp) const { 597 TraceTicks OffsetTimestamp(const TraceTicks& timestamp) const {
739 return timestamp - time_offset_; 598 return timestamp - time_offset_;
740 } 599 }
741 600
742 // Internal representation of trace options since we store the currently used 601 // Internal representation of trace options since we store the currently used
743 // trace option as an AtomicWord. 602 // trace option as an AtomicWord.
744 static const InternalTraceOptions kInternalNone; 603 static const InternalTraceOptions kInternalNone;
745 static const InternalTraceOptions kInternalRecordUntilFull; 604 static const InternalTraceOptions kInternalRecordUntilFull;
746 static const InternalTraceOptions kInternalRecordContinuously; 605 static const InternalTraceOptions kInternalRecordContinuously;
747 static const InternalTraceOptions kInternalEchoToConsole; 606 static const InternalTraceOptions kInternalEchoToConsole;
748 static const InternalTraceOptions kInternalEnableSampling; 607 static const InternalTraceOptions kInternalEnableSampling;
749 static const InternalTraceOptions kInternalRecordAsMuchAsPossible; 608 static const InternalTraceOptions kInternalRecordAsMuchAsPossible;
609 static const InternalTraceOptions kInternalEnableArgumentFilter;
750 610
751 // This lock protects TraceLog member accesses (except for members protected 611 // This lock protects TraceLog member accesses (except for members protected
752 // by thread_info_lock_) from arbitrary threads. 612 // by thread_info_lock_) from arbitrary threads.
753 mutable Lock lock_; 613 mutable Lock lock_;
754 // This lock protects accesses to thread_names_, thread_event_start_times_ 614 // This lock protects accesses to thread_names_, thread_event_start_times_
755 // and thread_colors_. 615 // and thread_colors_.
756 Lock thread_info_lock_; 616 Lock thread_info_lock_;
757 Mode mode_; 617 Mode mode_;
758 int num_traces_recorded_; 618 int num_traces_recorded_;
759 scoped_ptr<TraceBuffer> logged_events_; 619 scoped_ptr<TraceBuffer> logged_events_;
760 subtle::AtomicWord /* EventCallback */ event_callback_; 620 subtle::AtomicWord /* EventCallback */ event_callback_;
761 bool dispatching_to_observer_list_; 621 bool dispatching_to_observer_list_;
762 std::vector<EnabledStateObserver*> enabled_state_observer_list_; 622 std::vector<EnabledStateObserver*> enabled_state_observer_list_;
763 623
764 std::string process_name_; 624 std::string process_name_;
765 base::hash_map<int, std::string> process_labels_; 625 base::hash_map<int, std::string> process_labels_;
766 int process_sort_index_; 626 int process_sort_index_;
767 base::hash_map<int, int> thread_sort_indices_; 627 base::hash_map<int, int> thread_sort_indices_;
768 base::hash_map<int, std::string> thread_names_; 628 base::hash_map<int, std::string> thread_names_;
769 629
770 // The following two maps are used only when ECHO_TO_CONSOLE. 630 // The following two maps are used only when ECHO_TO_CONSOLE.
771 base::hash_map<int, std::stack<TimeTicks> > thread_event_start_times_; 631 base::hash_map<int, std::stack<TraceTicks> > thread_event_start_times_;
772 base::hash_map<std::string, int> thread_colors_; 632 base::hash_map<std::string, int> thread_colors_;
773 633
774 TimeTicks buffer_limit_reached_timestamp_; 634 TraceTicks buffer_limit_reached_timestamp_;
775 635
776 // XORed with TraceID to make it unlikely to collide with other processes. 636 // XORed with TraceID to make it unlikely to collide with other processes.
777 unsigned long long process_id_hash_; 637 unsigned long long process_id_hash_;
778 638
779 int process_id_; 639 int process_id_;
780 640
781 TimeDelta time_offset_; 641 TimeDelta time_offset_;
782 642
783 // Allow tests to wake up when certain events occur. 643 // Allow tests to wake up when certain events occur.
784 WatchEventCallback watch_event_callback_; 644 WatchEventCallback watch_event_callback_;
785 subtle::AtomicWord /* const unsigned char* */ watch_category_; 645 subtle::AtomicWord /* const unsigned char* */ watch_category_;
786 std::string watch_event_name_; 646 std::string watch_event_name_;
787 647
788 subtle::AtomicWord /* Options */ trace_options_; 648 subtle::AtomicWord /* Options */ trace_options_;
789 649
790 // Sampling thread handles. 650 // Sampling thread handles.
791 scoped_ptr<TraceSamplingThread> sampling_thread_; 651 scoped_ptr<TraceSamplingThread> sampling_thread_;
792 PlatformThreadHandle sampling_thread_handle_; 652 PlatformThreadHandle sampling_thread_handle_;
793 653
794 CategoryFilter category_filter_; 654 TraceConfig trace_config_;
795 CategoryFilter event_callback_category_filter_; 655 TraceConfig event_callback_trace_config_;
796 656
797 ThreadLocalPointer<ThreadLocalEventBuffer> thread_local_event_buffer_; 657 ThreadLocalPointer<ThreadLocalEventBuffer> thread_local_event_buffer_;
798 ThreadLocalBoolean thread_blocks_message_loop_; 658 ThreadLocalBoolean thread_blocks_message_loop_;
799 ThreadLocalBoolean thread_is_in_trace_event_; 659 ThreadLocalBoolean thread_is_in_trace_event_;
800 660
801 // Contains the message loops of threads that have had at least one event 661 // Contains the message loops of threads that have had at least one event
802 // added into the local event buffer. Not using SingleThreadTaskRunner 662 // added into the local event buffer. Not using SingleThreadTaskRunner
803 // because we need to know the life time of the message loops. 663 // because we need to know the life time of the message loops.
804 hash_set<MessageLoop*> thread_message_loops_; 664 hash_set<MessageLoop*> thread_message_loops_;
805 665
806 // For events which can't be added into the thread local buffer, e.g. events 666 // For events which can't be added into the thread local buffer, e.g. events
807 // from threads without a message loop. 667 // from threads without a message loop.
808 scoped_ptr<TraceBufferChunk> thread_shared_chunk_; 668 scoped_ptr<TraceBufferChunk> thread_shared_chunk_;
809 size_t thread_shared_chunk_index_; 669 size_t thread_shared_chunk_index_;
810 670
811 // Set when asynchronous Flush is in progress. 671 // Set when asynchronous Flush is in progress.
812 OutputCallback flush_output_callback_; 672 OutputCallback flush_output_callback_;
813 scoped_refptr<SingleThreadTaskRunner> flush_task_runner_; 673 scoped_refptr<SingleThreadTaskRunner> flush_task_runner_;
674 TraceEvent::ArgumentFilterPredicate argument_filter_predicate_;
814 subtle::AtomicWord generation_; 675 subtle::AtomicWord generation_;
815 bool use_worker_thread_; 676 bool use_worker_thread_;
816 677
817 DISALLOW_COPY_AND_ASSIGN(TraceLog); 678 DISALLOW_COPY_AND_ASSIGN(TraceLog);
818 }; 679 };
819 680
820 } // namespace trace_event 681 } // namespace trace_event
821 } // namespace base 682 } // namespace base
822 683
823 #endif // BASE_TRACE_EVENT_TRACE_EVENT_IMPL_H_ 684 #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