diff options
author | haraken@chromium.org <haraken@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-04 08:54:07 +0000 |
---|---|---|
committer | haraken@chromium.org <haraken@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-04 08:54:07 +0000 |
commit | fc8bde1a25bbd6176ecffa1c845d5ed561cc315c (patch) | |
tree | cc8376c17f362795728cc9ea36fd5b7024722a29 /base | |
parent | 5e019f20cd6e09c85bcb07f83f7bcfad58505692 (diff) | |
download | chromium_src-fc8bde1a25bbd6176ecffa1c845d5ed561cc315c.zip chromium_src-fc8bde1a25bbd6176ecffa1c845d5ed561cc315c.tar.gz chromium_src-fc8bde1a25bbd6176ecffa1c845d5ed561cc315c.tar.bz2 |
Add a sampling tracing to RenderWidget::DoDeferredUpdate
- This CL implements TraceEventSamplingState0Scope for scoped sampling. The implementation is the same as TraceEvent.h in Blink.
- This CL renames TRACE_EVENT_SAMPLE_STATE to TRACE_EVENT_SAMPLING_STATE, to make the name consistent with the macros in Blink.
TEST=TraceEventTestFixture.TraceSamplingScope
BUG=241743
Review URL: https://chromiumcodereview.appspot.com/18587004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@210160 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base')
-rw-r--r-- | base/debug/trace_event.h | 82 | ||||
-rw-r--r-- | base/debug/trace_event_impl.cc | 10 | ||||
-rw-r--r-- | base/debug/trace_event_unittest.cc | 46 |
3 files changed, 120 insertions, 18 deletions
diff --git a/base/debug/trace_event.h b/base/debug/trace_event.h index aa4cc75..c162b39 100644 --- a/base/debug/trace_event.h +++ b/base/debug/trace_event.h @@ -299,10 +299,34 @@ // want the inconsistency/expense of storing two pointers. // |thread_bucket| is [0..2] and is used to statically isolate samples in one // thread from others. -#define TRACE_EVENT_SAMPLE_STATE(thread_bucket, category, name) \ - TRACE_EVENT_API_ATOMIC_STORE( \ - TRACE_EVENT_API_THREAD_BUCKET(thread_bucket), \ - reinterpret_cast<TRACE_EVENT_API_ATOMIC_WORD>(category "\0" name)); +#define TRACE_EVENT_SET_SAMPLING_STATE_FOR_BUCKET( \ + bucket_number, category, name) \ + trace_event_internal:: \ + TraceEventSamplingStateScope<bucket_number>::Set(category "\0" name) + +// Returns a current sampling state of the given bucket. +#define TRACE_EVENT_GET_SAMPLING_STATE_FOR_BUCKET(bucket_number) \ + trace_event_internal::TraceEventSamplingStateScope<bucket_number>::Current() + +// Creates a scope of a sampling state of the given bucket. +// +// { // The sampling state is set within this scope. +// TRACE_EVENT_SAMPLING_STATE_SCOPE_FOR_BUCKET(0, "category", "name"); +// ...; +// } +#define TRACE_EVENT_SCOPED_SAMPLING_STATE_FOR_BUCKET( \ + bucket_number, category, name) \ + trace_event_internal::TraceEventSamplingStateScope<bucket_number> \ + traceEventSamplingScope(category "\0" name); + +// Syntactic sugars for the sampling tracing in the main thread. +#define TRACE_EVENT_SCOPED_SAMPLING_STATE(category, name) \ + TRACE_EVENT_SCOPED_SAMPLING_STATE_FOR_BUCKET(0, category, name) +#define TRACE_EVENT_GET_SAMPLING_STATE() \ + TRACE_EVENT_GET_SAMPLING_STATE_FOR_BUCKET(0) +#define TRACE_EVENT_SET_SAMPLING_STATE(category, name) \ + TRACE_EVENT_SET_SAMPLING_STATE_FOR_BUCKET(0, category, name) + // Records a single BEGIN event called "name" immediately, with 0, 1 or 2 // associated arguments. If the category is not enabled, then this @@ -755,14 +779,15 @@ // Defines visibility for classes in trace_event.h #define TRACE_EVENT_API_CLASS_EXPORT BASE_EXPORT -// Not supported in split-dll build. http://crbug.com/237249 +// Not supported in split-dll build. http://crbug.com/256965 #if !defined(CHROME_SPLIT_DLL) // The thread buckets for the sampling profiler. -TRACE_EVENT_API_CLASS_EXPORT extern TRACE_EVENT_API_ATOMIC_WORD g_trace_state0; -TRACE_EVENT_API_CLASS_EXPORT extern TRACE_EVENT_API_ATOMIC_WORD g_trace_state1; -TRACE_EVENT_API_CLASS_EXPORT extern TRACE_EVENT_API_ATOMIC_WORD g_trace_state2; +TRACE_EVENT_API_CLASS_EXPORT extern \ + TRACE_EVENT_API_ATOMIC_WORD g_trace_state[3]; + #define TRACE_EVENT_API_THREAD_BUCKET(thread_bucket) \ - g_trace_state##thread_bucket + g_trace_state[thread_bucket] + #endif //////////////////////////////////////////////////////////////////////////////// @@ -1439,6 +1464,45 @@ class TRACE_EVENT_API_CLASS_EXPORT ScopedTrace { #define TRACE_EVENT_BINARY_EFFICIENT0(category_group, name) \ INTERNAL_TRACE_EVENT_BINARY_EFFICIENT_ADD_SCOPED(category_group, name) +// TraceEventSamplingStateScope records the current sampling state +// and sets a new sampling state. When the scope exists, it restores +// the sampling state having recorded. +template<size_t BucketNumber> +class TraceEventSamplingStateScope { + public: + TraceEventSamplingStateScope(const char* category_and_name) { + previous_state_ = TraceEventSamplingStateScope<BucketNumber>::Current(); + TraceEventSamplingStateScope<BucketNumber>::Set(category_and_name); + } + + ~TraceEventSamplingStateScope() { + TraceEventSamplingStateScope<BucketNumber>::Set(previous_state_); + } + + static inline const char* Current() { +// Not supported in split-dll build. http://crbug.com/256965 +#if !defined(CHROME_SPLIT_DLL) + return reinterpret_cast<const char*>(TRACE_EVENT_API_ATOMIC_LOAD( + g_trace_state[BucketNumber])); +#else + return NULL; +#endif + } + + static inline void Set(const char* category_and_name) { +// Not supported in split-dll build. http://crbug.com/256965 +#if !defined(CHROME_SPLIT_DLL) + TRACE_EVENT_API_ATOMIC_STORE( + g_trace_state[BucketNumber], + reinterpret_cast<TRACE_EVENT_API_ATOMIC_WORD>( + const_cast<char*>(category_and_name))); +#endif + } + + private: + const char* previous_state_; +}; + } // namespace trace_event_internal namespace base { diff --git a/base/debug/trace_event_impl.cc b/base/debug/trace_event_impl.cc index d97c461..27195f9 100644 --- a/base/debug/trace_event_impl.cc +++ b/base/debug/trace_event_impl.cc @@ -43,9 +43,7 @@ class DeleteTraceLogForTesting { // Not supported in split-dll build. http://crbug.com/237249 #if !defined(CHROME_SPLIT_DLL) // The thread buckets for the sampling profiler. -BASE_EXPORT TRACE_EVENT_API_ATOMIC_WORD g_trace_state0; -BASE_EXPORT TRACE_EVENT_API_ATOMIC_WORD g_trace_state1; -BASE_EXPORT TRACE_EVENT_API_ATOMIC_WORD g_trace_state2; +BASE_EXPORT TRACE_EVENT_API_ATOMIC_WORD g_trace_state[3]; #endif namespace base { @@ -948,15 +946,15 @@ void TraceLog::SetEnabled(const CategoryFilter& category_filter, if (options & ENABLE_SAMPLING) { sampling_thread_.reset(new TraceSamplingThread); sampling_thread_->RegisterSampleBucket( - &g_trace_state0, + &g_trace_state[0], "bucket0", Bind(&TraceSamplingThread::DefaultSampleCallback)); sampling_thread_->RegisterSampleBucket( - &g_trace_state1, + &g_trace_state[1], "bucket1", Bind(&TraceSamplingThread::DefaultSampleCallback)); sampling_thread_->RegisterSampleBucket( - &g_trace_state2, + &g_trace_state[2], "bucket2", Bind(&TraceSamplingThread::DefaultSampleCallback)); if (!PlatformThread::Create( diff --git a/base/debug/trace_event_unittest.cc b/base/debug/trace_event_unittest.cc index 000097e..83f98d2 100644 --- a/base/debug/trace_event_unittest.cc +++ b/base/debug/trace_event_unittest.cc @@ -1788,7 +1788,7 @@ TEST_F(TraceEventTestFixture, TraceOptionsParsing) { "record-continuously,enable-sampling")); } -// Not supported in split dll build. http://crbug.com/237249 +// Not supported in split dll build. http://crbug.com/256965 #if !defined(CHROME_SPLIT_DLL) TEST_F(TraceEventTestFixture, TraceSampling) { ManualTestSetUp(); @@ -1802,9 +1802,9 @@ TEST_F(TraceEventTestFixture, TraceSampling) { WaitableEvent* sampled = new WaitableEvent(false, false); TraceLog::GetInstance()->InstallWaitableEventForSamplingTesting(sampled); - TRACE_EVENT_SAMPLE_STATE(1, "cc", "Stuff"); + TRACE_EVENT_SET_SAMPLING_STATE_FOR_BUCKET(1, "cc", "Stuff"); sampled->Wait(); - TRACE_EVENT_SAMPLE_STATE(1, "cc", "Things"); + TRACE_EVENT_SET_SAMPLING_STATE_FOR_BUCKET(1, "cc", "Things"); sampled->Wait(); EndTraceAndFlush(); @@ -1813,6 +1813,46 @@ TEST_F(TraceEventTestFixture, TraceSampling) { EXPECT_TRUE(FindNamePhase("Stuff", "P")); EXPECT_TRUE(FindNamePhase("Things", "P")); } + +TEST_F(TraceEventTestFixture, TraceSamplingScope) { + ManualTestSetUp(); + + event_watch_notification_ = 0; + TraceLog::GetInstance()->SetEnabled( + CategoryFilter("*"), + TraceLog::Options(TraceLog::RECORD_UNTIL_FULL | + TraceLog::ENABLE_SAMPLING)); + + WaitableEvent* sampled = new WaitableEvent(false, false); + TraceLog::GetInstance()->InstallWaitableEventForSamplingTesting(sampled); + + TRACE_EVENT_SCOPED_SAMPLING_STATE("AAA", "name"); + sampled->Wait(); + { + EXPECT_STREQ(TRACE_EVENT_GET_SAMPLING_STATE(), "AAA"); + TRACE_EVENT_SCOPED_SAMPLING_STATE("BBB", "name"); + sampled->Wait(); + EXPECT_STREQ(TRACE_EVENT_GET_SAMPLING_STATE(), "BBB"); + } + sampled->Wait(); + { + EXPECT_STREQ(TRACE_EVENT_GET_SAMPLING_STATE(), "AAA"); + TRACE_EVENT_SCOPED_SAMPLING_STATE("CCC", "name"); + sampled->Wait(); + EXPECT_STREQ(TRACE_EVENT_GET_SAMPLING_STATE(), "CCC"); + } + sampled->Wait(); + { + EXPECT_STREQ(TRACE_EVENT_GET_SAMPLING_STATE(), "AAA"); + TRACE_EVENT_SET_SAMPLING_STATE("DDD", "name"); + sampled->Wait(); + EXPECT_STREQ(TRACE_EVENT_GET_SAMPLING_STATE(), "DDD"); + } + sampled->Wait(); + EXPECT_STREQ(TRACE_EVENT_GET_SAMPLING_STATE(), "DDD"); + + EndTraceAndFlush(); +} #endif // !CHROME_SPLIT_DLL class MyData : public base::debug::ConvertableToTraceFormat { |