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"
28 // Older style trace macros with explicit id and extra data
29 // Only these macros result in publishing data to ETW as currently implemented.
30 // TODO(georgesak): Update/replace these with new ETW macros.
31 #define TRACE_EVENT_BEGIN_ETW(name, id, extra) \
32 base::trace_event::TraceLog::AddTraceEventEtw( \
33 TRACE_EVENT_PHASE_BEGIN, \
34 name, reinterpret_cast<const void*>(id), extra)
36 #define TRACE_EVENT_END_ETW(name, id, extra) \
37 base::trace_event::TraceLog::AddTraceEventEtw( \
38 TRACE_EVENT_PHASE_END, \
39 name, reinterpret_cast<const void*>(id), extra)
41 #define TRACE_EVENT_INSTANT_ETW(name, id, extra) \
42 base::trace_event::TraceLog::AddTraceEventEtw( \
43 TRACE_EVENT_PHASE_INSTANT, \
44 name, reinterpret_cast<const void*>(id), extra)
46 template <typename Type
>
47 struct DefaultSingletonTraits
;
54 namespace trace_event
{
56 // For any argument of type TRACE_VALUE_TYPE_CONVERTABLE the provided
57 // class must implement this interface.
58 class BASE_EXPORT ConvertableToTraceFormat
59 : public RefCounted
<ConvertableToTraceFormat
> {
61 // Append the class info to the provided |out| string. The appended
62 // data must be a valid JSON object. Strings must be properly quoted, and
63 // escaped. There is no processing applied to the content after it is
65 virtual void AppendAsTraceFormat(std::string
* out
) const = 0;
67 std::string
ToString() const {
69 AppendAsTraceFormat(&result
);
74 virtual ~ConvertableToTraceFormat() {}
77 friend class RefCounted
<ConvertableToTraceFormat
>;
80 struct TraceEventHandle
{
86 const int kTraceMaxNumArgs
= 2;
88 class BASE_EXPORT TraceEvent
{
92 unsigned long long as_uint
;
95 const void* as_pointer
;
96 const char* as_string
;
102 // We don't need to copy TraceEvent except when TraceEventBuffer is cloned.
103 // Use explicit copy method to avoid accidentally misuse of copy.
104 void CopyFrom(const TraceEvent
& other
);
109 TimeTicks thread_timestamp
,
111 const unsigned char* category_group_enabled
,
113 unsigned long long id
,
115 const char** arg_names
,
116 const unsigned char* arg_types
,
117 const unsigned long long* arg_values
,
118 const scoped_refptr
<ConvertableToTraceFormat
>* convertable_values
,
119 unsigned char flags
);
123 void UpdateDuration(const TimeTicks
& now
, const TimeTicks
& thread_now
);
125 // Serialize event data to JSON
126 void AppendAsJSON(std::string
* out
) const;
127 void AppendPrettyPrinted(std::ostringstream
* out
) const;
129 static void AppendValueAsJSON(unsigned char type
,
133 TimeTicks
timestamp() const { return timestamp_
; }
134 TimeTicks
thread_timestamp() const { return thread_timestamp_
; }
135 char phase() const { return phase_
; }
136 int thread_id() const { return thread_id_
; }
137 TimeDelta
duration() const { return duration_
; }
138 TimeDelta
thread_duration() const { return thread_duration_
; }
139 unsigned long long id() const { return id_
; }
140 unsigned char flags() const { return flags_
; }
142 // Exposed for unittesting:
144 const base::RefCountedString
* parameter_copy_storage() const {
145 return parameter_copy_storage_
.get();
148 const unsigned char* category_group_enabled() const {
149 return category_group_enabled_
;
152 const char* name() const { return name_
; }
154 #if defined(OS_ANDROID)
159 // Note: these are ordered by size (largest first) for optimal packing.
160 TimeTicks timestamp_
;
161 TimeTicks thread_timestamp_
;
163 TimeDelta thread_duration_
;
164 // id_ can be used to store phase-specific data.
165 unsigned long long id_
;
166 TraceValue arg_values_
[kTraceMaxNumArgs
];
167 const char* arg_names_
[kTraceMaxNumArgs
];
168 scoped_refptr
<ConvertableToTraceFormat
> convertable_values_
[kTraceMaxNumArgs
];
169 const unsigned char* category_group_enabled_
;
171 scoped_refptr
<base::RefCountedString
> parameter_copy_storage_
;
174 unsigned char flags_
;
175 unsigned char arg_types_
[kTraceMaxNumArgs
];
177 DISALLOW_COPY_AND_ASSIGN(TraceEvent
);
180 // TraceBufferChunk is the basic unit of TraceBuffer.
181 class BASE_EXPORT TraceBufferChunk
{
183 explicit TraceBufferChunk(uint32 seq
)
188 void Reset(uint32 new_seq
);
189 TraceEvent
* AddTraceEvent(size_t* event_index
);
190 bool IsFull() const { return next_free_
== kTraceBufferChunkSize
; }
192 uint32
seq() const { return seq_
; }
193 size_t capacity() const { return kTraceBufferChunkSize
; }
194 size_t size() const { return next_free_
; }
196 TraceEvent
* GetEventAt(size_t index
) {
197 DCHECK(index
< size());
198 return &chunk_
[index
];
200 const TraceEvent
* GetEventAt(size_t index
) const {
201 DCHECK(index
< size());
202 return &chunk_
[index
];
205 scoped_ptr
<TraceBufferChunk
> Clone() const;
207 static const size_t kTraceBufferChunkSize
= 64;
211 TraceEvent chunk_
[kTraceBufferChunkSize
];
215 // TraceBuffer holds the events as they are collected.
216 class BASE_EXPORT TraceBuffer
{
218 virtual ~TraceBuffer() {}
220 virtual scoped_ptr
<TraceBufferChunk
> GetChunk(size_t *index
) = 0;
221 virtual void ReturnChunk(size_t index
,
222 scoped_ptr
<TraceBufferChunk
> chunk
) = 0;
224 virtual bool IsFull() const = 0;
225 virtual size_t Size() const = 0;
226 virtual size_t Capacity() const = 0;
227 virtual TraceEvent
* GetEventByHandle(TraceEventHandle handle
) = 0;
229 // For iteration. Each TraceBuffer can only be iterated once.
230 virtual const TraceBufferChunk
* NextChunk() = 0;
232 virtual scoped_ptr
<TraceBuffer
> CloneForIteration() const = 0;
235 // TraceResultBuffer collects and converts trace fragments returned by TraceLog
237 class BASE_EXPORT TraceResultBuffer
{
239 typedef base::Callback
<void(const std::string
&)> OutputCallback
;
241 // If you don't need to stream JSON chunks out efficiently, and just want to
242 // get a complete JSON string after calling Finish, use this struct to collect
243 // JSON trace output.
244 struct BASE_EXPORT SimpleOutput
{
245 OutputCallback
GetCallback();
246 void Append(const std::string
& json_string
);
248 // Do what you want with the json_output_ string after calling
249 // TraceResultBuffer::Finish.
250 std::string json_output
;
254 ~TraceResultBuffer();
256 // Set callback. The callback will be called during Start with the initial
257 // JSON output and during AddFragment and Finish with following JSON output
258 // chunks. The callback target must live past the last calls to
259 // TraceResultBuffer::Start/AddFragment/Finish.
260 void SetOutputCallback(const OutputCallback
& json_chunk_callback
);
262 // Start JSON output. This resets all internal state, so you can reuse
263 // the TraceResultBuffer by calling Start.
266 // Call AddFragment 0 or more times to add trace fragments from TraceLog.
267 void AddFragment(const std::string
& trace_fragment
);
269 // When all fragments have been added, call Finish to complete the JSON
274 OutputCallback output_callback_
;
278 class BASE_EXPORT CategoryFilter
{
280 typedef std::vector
<std::string
> StringList
;
282 // The default category filter, used when none is provided.
283 // Allows all categories through, except if they end in the suffix 'Debug' or
285 static const char kDefaultCategoryFilterString
[];
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.
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.
298 // Category filters can also be used to configure synthetic delays.
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
305 // Example: CategoryFilter("DELAY(gpu.PresentingFrame;16;alternating)");
306 // would make swap buffers take at least 16 ms every other time it
308 explicit CategoryFilter(const std::string
& filter_string
);
312 CategoryFilter(const CategoryFilter
& cf
);
316 CategoryFilter
& operator=(const CategoryFilter
& rhs
);
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;
325 // Returns true if at least one category in the list is enabled by this
327 bool IsCategoryGroupEnabled(const char* category_group
) const;
329 // Return a list of the synthetic delays specified in this category filter.
330 const StringList
& GetSyntheticDelayValues() const;
332 // Merges nested_filter with the current CategoryFilter
333 void Merge(const CategoryFilter
& nested_filter
);
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().
339 // When using an empty filter, all categories are considered included as we
340 // are not excluding anything.
344 FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture
, CategoryFilter
);
346 // Returns true if category is enable according to this filter.
347 bool IsCategoryEnabled(const char* category_name
) const;
349 static bool IsEmptyOrContainsLeadingOrTrailingWhitespace(
350 const std::string
& str
);
352 void Initialize(const std::string
& filter_string
);
353 void WriteString(const StringList
& values
,
355 bool included
) const;
356 void WriteString(const StringList
& delays
, std::string
* out
) const;
357 bool HasIncludedPatterns() const;
359 StringList included_
;
360 StringList disabled_
;
361 StringList excluded_
;
365 class TraceSamplingThread
;
367 // Options determines how the trace buffer stores data.
368 enum TraceRecordMode
{
369 // Record until the trace buffer is full.
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.
376 // Echo to console. Events are discarded.
379 // Record until the trace buffer is full, but with a huge buffer size.
380 RECORD_AS_MUCH_AS_POSSIBLE
383 struct BASE_EXPORT TraceOptions
{
385 : record_mode(RECORD_UNTIL_FULL
),
386 enable_sampling(false),
387 enable_systrace(false) {}
389 explicit TraceOptions(TraceRecordMode record_mode
)
390 : record_mode(record_mode
),
391 enable_sampling(false),
392 enable_systrace(false) {}
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.
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
406 // If |options_string| is invalid, the final state of trace_options is
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.
415 // Returns true on success.
416 bool SetFromString(const std::string
& options_string
);
418 std::string
ToString() const;
420 TraceRecordMode record_mode
;
421 bool enable_sampling
;
422 bool enable_systrace
;
425 struct BASE_EXPORT TraceLogStatus
{
428 size_t event_capacity
;
432 class BASE_EXPORT TraceLog
{
440 // The pointer returned from GetCategoryGroupEnabledInternal() points to a
441 // value with zero or more of the following bits. Used in this class only.
442 // The TRACE_EVENT macros should only use the value as a bool.
443 // These values must be in sync with macro values in TraceEvent.h in Blink.
444 enum CategoryGroupEnabledFlags
{
445 // Category group enabled for the recording mode.
446 ENABLED_FOR_RECORDING
= 1 << 0,
447 // Category group enabled for the monitoring mode.
448 ENABLED_FOR_MONITORING
= 1 << 1,
449 // Category group enabled by SetEventCallbackEnabled().
450 ENABLED_FOR_EVENT_CALLBACK
= 1 << 2,
451 // Category group enabled to export events to ETW.
452 ENABLED_FOR_ETW_EXPORT
= 1 << 3
455 static TraceLog
* GetInstance();
457 // 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|.
459 void GetKnownCategoryGroups(std::vector
<std::string
>* category_groups
);
461 // Retrieves a copy (for thread-safety) of the current CategoryFilter.
462 CategoryFilter
GetCurrentCategoryFilter();
464 // Retrieves a copy (for thread-safety) of the current TraceOptions.
465 TraceOptions
GetCurrentTraceOptions() const;
467 // Enables normal tracing (recording trace events in the trace buffer).
468 // See CategoryFilter comments for details on how to control what categories
469 // will be traced. If tracing has already been enabled, |category_filter| will
470 // be merged into the current category filter.
471 void SetEnabled(const CategoryFilter
& category_filter
,
472 Mode mode
, const TraceOptions
& options
);
474 // Disables normal tracing for all categories.
477 bool IsEnabled() { return mode_
!= DISABLED
; }
479 // 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
481 // 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
483 // implement the TRACE_EVENT_IS_NEW_TRACE() primitive.
484 int GetNumTracesRecorded();
486 #if defined(OS_ANDROID)
489 void AddClockSyncMetadataEvent();
492 // Enabled state listeners give a callback when tracing is enabled or
493 // disabled. This can be used to tie into other library's tracing systems
495 class BASE_EXPORT EnabledStateObserver
{
497 // Called just after the tracing system becomes enabled, outside of the
498 // |lock_|. TraceLog::IsEnabled() is true at this point.
499 virtual void OnTraceLogEnabled() = 0;
501 // Called just after the tracing system disables, outside of the |lock_|.
502 // TraceLog::IsEnabled() is false at this point.
503 virtual void OnTraceLogDisabled() = 0;
505 void AddEnabledStateObserver(EnabledStateObserver
* listener
);
506 void RemoveEnabledStateObserver(EnabledStateObserver
* listener
);
507 bool HasEnabledStateObserver(EnabledStateObserver
* listener
) const;
509 TraceLogStatus
GetStatus() const;
510 bool BufferIsFull() const;
512 // Not using base::Callback because of its limited by 7 parameters.
513 // Also, using primitive type allows directly passing callback from WebCore.
514 // WARNING: It is possible for the previously set callback to be called
515 // after a call to SetEventCallbackEnabled() that replaces or a call to
516 // SetEventCallbackDisabled() that disables the callback.
517 // This callback may be invoked on any thread.
518 // 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
521 typedef void (*EventCallback
)(TimeTicks timestamp
,
523 const unsigned char* category_group_enabled
,
525 unsigned long long id
,
527 const char* const arg_names
[],
528 const unsigned char arg_types
[],
529 const unsigned long long arg_values
[],
530 unsigned char flags
);
532 // Enable tracing for EventCallback.
533 void SetEventCallbackEnabled(const CategoryFilter
& category_filter
,
535 void SetEventCallbackDisabled();
537 // Flush all collected events to the given output callback. The callback will
538 // be called one or more times either synchronously or asynchronously from
539 // the current thread with IPC-bite-size chunks. The string format is
540 // 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.
542 // 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
544 // callback will be called directly with (empty_string, false) to indicate
545 // the end of this unsuccessful flush. Flush does the serialization
546 // on the same thread if the caller doesn't set use_worker_thread explicitly.
547 typedef base::Callback
<void(const scoped_refptr
<base::RefCountedString
>&,
548 bool has_more_events
)> OutputCallback
;
549 void Flush(const OutputCallback
& cb
, bool use_worker_thread
= false);
550 void FlushButLeaveBufferIntact(const OutputCallback
& flush_output_callback
);
552 // Called by TRACE_EVENT* macros, don't call this directly.
553 // The name parameter is a category group for example:
554 // TRACE_EVENT0("renderer,webkit", "WebViewImpl::HandleInputEvent")
555 static const unsigned char* GetCategoryGroupEnabled(const char* name
);
556 static const char* GetCategoryGroupName(
557 const unsigned char* category_group_enabled
);
559 // Called by TRACE_EVENT* macros, don't call this directly.
560 // If |copy| is set, |name|, |arg_name1| and |arg_name2| will be deep copied
561 // into the event; see "Memory scoping note" and TRACE_EVENT_COPY_XXX above.
562 TraceEventHandle
AddTraceEvent(
564 const unsigned char* category_group_enabled
,
566 unsigned long long id
,
568 const char** arg_names
,
569 const unsigned char* arg_types
,
570 const unsigned long long* arg_values
,
571 const scoped_refptr
<ConvertableToTraceFormat
>* convertable_values
,
572 unsigned char flags
);
573 TraceEventHandle
AddTraceEventWithThreadIdAndTimestamp(
575 const unsigned char* category_group_enabled
,
577 unsigned long long id
,
579 const TimeTicks
& timestamp
,
581 const char** arg_names
,
582 const unsigned char* arg_types
,
583 const unsigned long long* arg_values
,
584 const scoped_refptr
<ConvertableToTraceFormat
>* convertable_values
,
585 unsigned char flags
);
586 static void AddTraceEventEtw(char phase
,
587 const char* category_group
,
590 static void AddTraceEventEtw(char phase
,
591 const char* category_group
,
593 const std::string
& extra
);
595 void UpdateTraceEventDuration(const unsigned char* category_group_enabled
,
597 TraceEventHandle handle
);
599 // For every matching event, the callback will be called.
600 typedef base::Callback
<void()> WatchEventCallback
;
601 void SetWatchEvent(const std::string
& category_name
,
602 const std::string
& event_name
,
603 const WatchEventCallback
& callback
);
604 // Cancel the watch event. If tracing is enabled, this may race with the
605 // watch event notification firing.
606 void CancelWatchEvent();
608 int process_id() const { return process_id_
; }
610 uint64
MangleEventId(uint64 id
);
612 // Exposed for unittesting:
614 void WaitSamplingEventForTesting();
616 // Allows deleting our singleton instance.
617 static void DeleteForTesting();
619 // Allow tests to inspect TraceEvents.
620 TraceEvent
* GetEventByHandle(TraceEventHandle handle
);
622 void SetProcessID(int process_id
);
624 // Process sort indices, if set, override the order of a process will appear
625 // relative to other processes in the trace viewer. Processes are sorted first
626 // on their sort index, ascending, then by their name, and then tid.
627 void SetProcessSortIndex(int sort_index
);
629 // Sets the name of the process.
630 void SetProcessName(const std::string
& process_name
);
632 // 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.
634 void UpdateProcessLabel(int label_id
, const std::string
& current_label
);
635 void RemoveProcessLabel(int label_id
);
637 // 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
639 // sort index, ascending, then by their name, and then tid.
640 void SetThreadSortIndex(PlatformThreadId
, int sort_index
);
642 // Allow setting an offset between the current TimeTicks time and the time
643 // that should be reported.
644 void SetTimeOffset(TimeDelta offset
);
646 size_t GetObserverCountForTest() const;
648 // 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
650 // may not handle the flush request in time causing lost of unflushed events.
651 void SetCurrentThreadBlocksMessageLoop();
654 typedef unsigned int InternalTraceOptions
;
656 FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture
,
657 TraceBufferRingBufferGetReturnChunk
);
658 FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture
,
659 TraceBufferRingBufferHalfIteration
);
660 FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture
,
661 TraceBufferRingBufferFullIteration
);
662 FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture
,
663 TraceBufferVectorReportFull
);
664 FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture
,
665 ConvertTraceOptionsToInternalOptions
);
666 FRIEND_TEST_ALL_PREFIXES(TraceEventTestFixture
,
667 TraceRecordAsMuchAsPossibleMode
);
669 // This allows constructor and destructor to be private and usable only
670 // by the Singleton class.
671 friend struct DefaultSingletonTraits
<TraceLog
>;
673 // Enable/disable each category group based on the current mode_,
674 // category_filter_, event_callback_ and event_callback_category_filter_.
675 // Enable the category group in the enabled mode if category_filter_ matches
676 // the category group, or event_callback_ is not null and
677 // event_callback_category_filter_ matches the category group.
678 void UpdateCategoryGroupEnabledFlags();
679 void UpdateCategoryGroupEnabledFlag(size_t category_index
);
681 // Configure synthetic delays based on the values set in the current
683 void UpdateSyntheticDelaysFromCategoryFilter();
685 InternalTraceOptions
GetInternalOptionsFromTraceOptions(
686 const TraceOptions
& options
);
688 class ThreadLocalEventBuffer
;
689 class OptionalAutoLock
;
693 const unsigned char* GetCategoryGroupEnabledInternal(const char* name
);
694 void AddMetadataEventsWhileLocked();
696 InternalTraceOptions
trace_options() const {
697 return static_cast<InternalTraceOptions
>(
698 subtle::NoBarrier_Load(&trace_options_
));
701 TraceBuffer
* trace_buffer() const { return logged_events_
.get(); }
702 TraceBuffer
* CreateTraceBuffer();
703 TraceBuffer
* CreateTraceBufferVectorOfSize(size_t max_chunks
);
705 std::string
EventToConsoleMessage(unsigned char phase
,
706 const TimeTicks
& timestamp
,
707 TraceEvent
* trace_event
);
709 TraceEvent
* AddEventToThreadSharedChunkWhileLocked(TraceEventHandle
* handle
,
710 bool check_buffer_is_full
);
711 void CheckIfBufferIsFullWhileLocked();
712 void SetDisabledWhileLocked();
714 TraceEvent
* GetEventByHandleInternal(TraceEventHandle handle
,
715 OptionalAutoLock
* lock
);
717 // |generation| is used in the following callbacks to check if the callback
718 // is called for the flush of the current |logged_events_|.
719 void FlushCurrentThread(int generation
);
720 // Usually it runs on a different thread.
721 static void ConvertTraceEventsToTraceFormat(
722 scoped_ptr
<TraceBuffer
> logged_events
,
723 const TraceLog::OutputCallback
& flush_output_callback
);
724 void FinishFlush(int generation
);
725 void OnFlushTimeout(int generation
);
727 int generation() const {
728 return static_cast<int>(subtle::NoBarrier_Load(&generation_
));
730 bool CheckGeneration(int generation
) const {
731 return generation
== this->generation();
733 void UseNextTraceBuffer();
735 TimeTicks
OffsetNow() const {
736 return OffsetTimestamp(TimeTicks::NowFromSystemTraceTime());
738 TimeTicks
OffsetTimestamp(const TimeTicks
& timestamp
) const {
739 return timestamp
- time_offset_
;
742 // Internal representation of trace options since we store the currently used
743 // trace option as an AtomicWord.
744 static const InternalTraceOptions kInternalNone
;
745 static const InternalTraceOptions kInternalRecordUntilFull
;
746 static const InternalTraceOptions kInternalRecordContinuously
;
747 static const InternalTraceOptions kInternalEchoToConsole
;
748 static const InternalTraceOptions kInternalEnableSampling
;
749 static const InternalTraceOptions kInternalRecordAsMuchAsPossible
;
751 // This lock protects TraceLog member accesses (except for members protected
752 // by thread_info_lock_) from arbitrary threads.
754 // This lock protects accesses to thread_names_, thread_event_start_times_
755 // and thread_colors_.
756 Lock thread_info_lock_
;
758 int num_traces_recorded_
;
759 scoped_ptr
<TraceBuffer
> logged_events_
;
760 subtle::AtomicWord
/* EventCallback */ event_callback_
;
761 bool dispatching_to_observer_list_
;
762 std::vector
<EnabledStateObserver
*> enabled_state_observer_list_
;
764 std::string process_name_
;
765 base::hash_map
<int, std::string
> process_labels_
;
766 int process_sort_index_
;
767 base::hash_map
<int, int> thread_sort_indices_
;
768 base::hash_map
<int, std::string
> thread_names_
;
770 // The following two maps are used only when ECHO_TO_CONSOLE.
771 base::hash_map
<int, std::stack
<TimeTicks
> > thread_event_start_times_
;
772 base::hash_map
<std::string
, int> thread_colors_
;
774 TimeTicks buffer_limit_reached_timestamp_
;
776 // XORed with TraceID to make it unlikely to collide with other processes.
777 unsigned long long process_id_hash_
;
781 TimeDelta time_offset_
;
783 // Allow tests to wake up when certain events occur.
784 WatchEventCallback watch_event_callback_
;
785 subtle::AtomicWord
/* const unsigned char* */ watch_category_
;
786 std::string watch_event_name_
;
788 subtle::AtomicWord
/* Options */ trace_options_
;
790 // Sampling thread handles.
791 scoped_ptr
<TraceSamplingThread
> sampling_thread_
;
792 PlatformThreadHandle sampling_thread_handle_
;
794 CategoryFilter category_filter_
;
795 CategoryFilter event_callback_category_filter_
;
797 ThreadLocalPointer
<ThreadLocalEventBuffer
> thread_local_event_buffer_
;
798 ThreadLocalBoolean thread_blocks_message_loop_
;
799 ThreadLocalBoolean thread_is_in_trace_event_
;
801 // Contains the message loops of threads that have had at least one event
802 // added into the local event buffer. Not using SingleThreadTaskRunner
803 // because we need to know the life time of the message loops.
804 hash_set
<MessageLoop
*> thread_message_loops_
;
806 // For events which can't be added into the thread local buffer, e.g. events
807 // from threads without a message loop.
808 scoped_ptr
<TraceBufferChunk
> thread_shared_chunk_
;
809 size_t thread_shared_chunk_index_
;
811 // Set when asynchronous Flush is in progress.
812 OutputCallback flush_output_callback_
;
813 scoped_refptr
<SingleThreadTaskRunner
> flush_task_runner_
;
814 subtle::AtomicWord generation_
;
815 bool use_worker_thread_
;
817 DISALLOW_COPY_AND_ASSIGN(TraceLog
);
820 } // namespace trace_event
823 #endif // BASE_TRACE_EVENT_TRACE_EVENT_IMPL_H_