summaryrefslogtreecommitdiffstats
path: root/cc/output
diff options
context:
space:
mode:
authormithro <mithro@mithis.com>2014-12-01 18:19:15 -0800
committerCommit bot <commit-bot@chromium.org>2014-12-02 02:19:53 +0000
commit06d1f3bfeece8b32c67bc41d4b4d7d6dcec01b32 (patch)
treeaf9e0d08b38b6fe67a94e053719d50abdea8c1a9 /cc/output
parent35a0b6ecedfd37e34aef8f927ad49a8b9e99cf5a (diff)
downloadchromium_src-06d1f3bfeece8b32c67bc41d4b4d7d6dcec01b32.zip
chromium_src-06d1f3bfeece8b32c67bc41d4b4d7d6dcec01b32.tar.gz
chromium_src-06d1f3bfeece8b32c67bc41d4b4d7d6dcec01b32.tar.bz2
cc: Adding creation location to debug BeginFrameArgs objects.
This allows easy tracing of a BeginFrameArgs object back to the BeginFrameSource that created it. This is very useful as we have multiple BeginFrameSources in the system now. The Primary / Background sources being a perfect example. While location tracking is highly optimised (as it is used in every base::Bind calls) it doubles the size of BeginFrameArgs objects. Hence we only enable location tracking in debug builds. In release builds we make sure to never create the Location objects in the first place, so no extra strings are found in the binary. This can be checked with the strings tool. BUG=346230 DEPS=742683002 Review URL: https://codereview.chromium.org/735723005 Cr-Commit-Position: refs/heads/master@{#306326}
Diffstat (limited to 'cc/output')
-rw-r--r--cc/output/begin_frame_args.cc12
-rw-r--r--cc/output/begin_frame_args.h28
-rw-r--r--cc/output/begin_frame_args_unittest.cc43
3 files changed, 67 insertions, 16 deletions
diff --git a/cc/output/begin_frame_args.cc b/cc/output/begin_frame_args.cc
index 0be9318..5744d9d 100644
--- a/cc/output/begin_frame_args.cc
+++ b/cc/output/begin_frame_args.cc
@@ -41,12 +41,19 @@ BeginFrameArgs::BeginFrameArgs(base::TimeTicks frame_time,
type(type) {
}
-BeginFrameArgs BeginFrameArgs::Create(base::TimeTicks frame_time,
+BeginFrameArgs BeginFrameArgs::Create(BeginFrameArgs::CreationLocation location,
+ base::TimeTicks frame_time,
base::TimeTicks deadline,
base::TimeDelta interval,
BeginFrameArgs::BeginFrameArgsType type) {
DCHECK_NE(type, BeginFrameArgs::INVALID);
+#ifdef NDEBUG
return BeginFrameArgs(frame_time, deadline, interval, type);
+#else
+ BeginFrameArgs args = BeginFrameArgs(frame_time, deadline, interval, type);
+ args.created_from = location;
+ return args;
+#endif
}
scoped_refptr<base::debug::ConvertableToTraceFormat> BeginFrameArgs::AsValue()
@@ -63,6 +70,9 @@ void BeginFrameArgs::AsValueInto(base::debug::TracedValue* state) const {
state->SetDouble("frame_time_us", frame_time.ToInternalValue());
state->SetDouble("deadline_us", deadline.ToInternalValue());
state->SetDouble("interval_us", interval.InMicroseconds());
+#ifndef NDEBUG
+ state->SetString("created_from", created_from.ToString());
+#endif
}
// This is a hard-coded deadline adjustment that assumes 60Hz, to be used in
diff --git a/cc/output/begin_frame_args.h b/cc/output/begin_frame_args.h
index 0be5241..ba29523 100644
--- a/cc/output/begin_frame_args.h
+++ b/cc/output/begin_frame_args.h
@@ -5,6 +5,7 @@
#ifndef CC_OUTPUT_BEGIN_FRAME_ARGS_H_
#define CC_OUTPUT_BEGIN_FRAME_ARGS_H_
+#include "base/location.h"
#include "base/memory/ref_counted.h"
#include "base/time/time.h"
#include "base/values.h"
@@ -17,6 +18,22 @@ class TracedValue;
}
}
+/**
+ * In debug builds we trace the creation origin of BeginFrameArgs objects. We
+ * reuse the tracked_objects::Location system to do that.
+ *
+ * However, in release builds we don't want this as it doubles the size of the
+ * BeginFrameArgs object. As well it adds a number of largish strings to the
+ * binary. Despite the argument being unused, most compilers are unable to
+ * optimise it away even when unused. Instead we use the BEGINFRAME_FROM_HERE
+ * macro to prevent the data even getting referenced.
+ */
+#ifdef NDEBUG
+#define BEGINFRAME_FROM_HERE nullptr
+#else
+#define BEGINFRAME_FROM_HERE FROM_HERE
+#endif
+
namespace cc {
struct CC_EXPORT BeginFrameArgs {
@@ -31,9 +48,18 @@ struct CC_EXPORT BeginFrameArgs {
// Creates an invalid set of values.
BeginFrameArgs();
+#ifdef NDEBUG
+ typedef const void* CreationLocation;
+#else
+ typedef const tracked_objects::Location& CreationLocation;
+ tracked_objects::Location created_from;
+#endif
+
// You should be able to find all instances where a BeginFrame has been
// created by searching for "BeginFrameArgs::Create".
- static BeginFrameArgs Create(base::TimeTicks frame_time,
+ // The location argument should **always** be BEGINFRAME_FROM_HERE macro.
+ static BeginFrameArgs Create(CreationLocation location,
+ base::TimeTicks frame_time,
base::TimeTicks deadline,
base::TimeDelta interval,
BeginFrameArgsType type);
diff --git a/cc/output/begin_frame_args_unittest.cc b/cc/output/begin_frame_args_unittest.cc
index 9d77a45d..877a857 100644
--- a/cc/output/begin_frame_args_unittest.cc
+++ b/cc/output/begin_frame_args_unittest.cc
@@ -15,26 +15,29 @@ namespace {
TEST(BeginFrameArgsTest, Helpers) {
// Quick create methods work
- BeginFrameArgs args0 = CreateBeginFrameArgsForTesting();
+ BeginFrameArgs args0 = CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE);
EXPECT_TRUE(args0.IsValid()) << args0;
- BeginFrameArgs args1 = CreateBeginFrameArgsForTesting(0, 0, -1);
+ BeginFrameArgs args1 =
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 0, -1);
EXPECT_FALSE(args1.IsValid()) << args1;
- BeginFrameArgs args2 = CreateBeginFrameArgsForTesting(1, 2, 3);
+ BeginFrameArgs args2 =
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 1, 2, 3);
EXPECT_TRUE(args2.IsValid()) << args2;
EXPECT_EQ(1, args2.frame_time.ToInternalValue());
EXPECT_EQ(2, args2.deadline.ToInternalValue());
EXPECT_EQ(3, args2.interval.ToInternalValue());
EXPECT_EQ(BeginFrameArgs::NORMAL, args2.type);
- BeginFrameArgs args3 = CreateExpiredBeginFrameArgsForTesting();
+ BeginFrameArgs args3 =
+ CreateExpiredBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE);
EXPECT_TRUE(args3.IsValid()) << args3;
EXPECT_GT(gfx::FrameTime::Now(), args3.deadline);
EXPECT_EQ(BeginFrameArgs::NORMAL, args3.type);
- BeginFrameArgs args4 =
- CreateBeginFrameArgsForTesting(1, 2, 3, BeginFrameArgs::MISSED);
+ BeginFrameArgs args4 = CreateBeginFrameArgsForTesting(
+ BEGINFRAME_FROM_HERE, 1, 2, 3, BeginFrameArgs::MISSED);
EXPECT_TRUE(args4.IsValid()) << args4;
EXPECT_EQ(1, args4.frame_time.ToInternalValue());
EXPECT_EQ(2, args4.deadline.ToInternalValue());
@@ -42,16 +45,19 @@ TEST(BeginFrameArgsTest, Helpers) {
EXPECT_EQ(BeginFrameArgs::MISSED, args4.type);
// operator==
- EXPECT_EQ(CreateBeginFrameArgsForTesting(4, 5, 6),
- CreateBeginFrameArgsForTesting(4, 5, 6));
+ EXPECT_EQ(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 4, 5, 6),
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 4, 5, 6));
EXPECT_NONFATAL_FAILURE(
- EXPECT_EQ(CreateBeginFrameArgsForTesting(7, 8, 9, BeginFrameArgs::MISSED),
- CreateBeginFrameArgsForTesting(7, 8, 9)),
+ EXPECT_EQ(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 7, 8, 9,
+ BeginFrameArgs::MISSED),
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 7, 8, 9)),
+ "");
+
+ EXPECT_NONFATAL_FAILURE(
+ EXPECT_EQ(CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 4, 5, 6),
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 7, 8, 9)),
"");
- EXPECT_NONFATAL_FAILURE(EXPECT_EQ(CreateBeginFrameArgsForTesting(4, 5, 6),
- CreateBeginFrameArgsForTesting(7, 8, 9)),
- "");
// operator<<
std::stringstream out1;
@@ -74,7 +80,7 @@ TEST(BeginFrameArgsTest, Create) {
EXPECT_FALSE(args1.IsValid()) << args1;
BeginFrameArgs args2 = BeginFrameArgs::Create(
- base::TimeTicks::FromInternalValue(1),
+ BEGINFRAME_FROM_HERE, base::TimeTicks::FromInternalValue(1),
base::TimeTicks::FromInternalValue(2),
base::TimeDelta::FromInternalValue(3), BeginFrameArgs::NORMAL);
EXPECT_TRUE(args2.IsValid()) << args2;
@@ -84,5 +90,14 @@ TEST(BeginFrameArgsTest, Create) {
EXPECT_EQ(BeginFrameArgs::NORMAL, args2.type) << args2;
}
+#ifndef NDEBUG
+TEST(BeginFrameArgsTest, Location) {
+ tracked_objects::Location expected_location = BEGINFRAME_FROM_HERE;
+
+ BeginFrameArgs args = CreateBeginFrameArgsForTesting(expected_location);
+ EXPECT_EQ(expected_location.ToString(), args.created_from.ToString());
+}
+#endif
+
} // namespace
} // namespace cc