summaryrefslogtreecommitdiffstats
path: root/base
diff options
context:
space:
mode:
authorharaken@chromium.org <haraken@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-04 08:54:07 +0000
committerharaken@chromium.org <haraken@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-04 08:54:07 +0000
commitfc8bde1a25bbd6176ecffa1c845d5ed561cc315c (patch)
treecc8376c17f362795728cc9ea36fd5b7024722a29 /base
parent5e019f20cd6e09c85bcb07f83f7bcfad58505692 (diff)
downloadchromium_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.h82
-rw-r--r--base/debug/trace_event_impl.cc10
-rw-r--r--base/debug/trace_event_unittest.cc46
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 {