diff options
author | simonjam@chromium.org <simonjam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-10-24 02:44:11 +0000 |
---|---|---|
committer | simonjam@chromium.org <simonjam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-10-24 02:44:11 +0000 |
commit | 186468fbf2c44189588bdc5fd327ddcaf04abd9e (patch) | |
tree | 6a9463c3e02f23663b671bf96d2d8a46d80f0e0a /base/debug | |
parent | 6b56023c860329096154751d1c21fc18c18e7ced (diff) | |
download | chromium_src-186468fbf2c44189588bdc5fd327ddcaf04abd9e.zip chromium_src-186468fbf2c44189588bdc5fd327ddcaf04abd9e.tar.gz chromium_src-186468fbf2c44189588bdc5fd327ddcaf04abd9e.tar.bz2 |
[Tracing] Add support for forward looking or backwards looking async steps.
Renamed TRACE_EVENT_ASYNC_STEP to TRACE_EVENT_ASYNC_STEP_INTO and
added TRACE_EVENT_ASYNC_STEP_PAST. These are mutually exclusive. Users
must decide all of their steps are backwards or forwards looking for an
async event.
Updated callers to use the correct versions. Note that we had both!
BUG=None
TBR=nduca,mmenke,wjia,hclam
Review URL: https://codereview.chromium.org/25536014
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@230606 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/debug')
-rw-r--r-- | base/debug/trace_event.h | 56 | ||||
-rw-r--r-- | base/debug/trace_event_unittest.cc | 38 |
2 files changed, 64 insertions, 30 deletions
diff --git a/base/debug/trace_event.h b/base/debug/trace_event.h index 9bf9149..1cd43a3 100644 --- a/base/debug/trace_event.h +++ b/base/debug/trace_event.h @@ -520,12 +520,18 @@ // all match. |id| must either be a pointer or an integer value up to 64 bits. // If it's a pointer, the bits will be xored with a hash of the process ID so // that the same pointer on two different processes will not collide. +// // An asynchronous operation can consist of multiple phases. The first phase is // defined by the ASYNC_BEGIN calls. Additional phases can be defined using the -// ASYNC_STEP macros. When the operation completes, call ASYNC_END. -// An ASYNC trace typically occur on a single thread (if not, they will only be +// ASYNC_STEP_INTO or ASYNC_STEP_PAST macros. The ASYNC_STEP_INTO macro will +// annotate the block following the call. The ASYNC_STEP_PAST macro will +// annotate the block prior to the call. Note that any particular event must use +// only STEP_INTO or STEP_PAST macros; they can not mix and match. When the +// operation completes, call ASYNC_END. +// +// An ASYNC trace typically occurs on a single thread (if not, they will only be // drawn on the thread defined in the ASYNC_BEGIN event), but all events in that -// operation must use the same |name| and |id|. Each event can have its own +// operation must use the same |name| and |id|. Each step can have its own // args. #define TRACE_EVENT_ASYNC_BEGIN0(category_group, name, id) \ INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_BEGIN, \ @@ -553,27 +559,34 @@ category_group, name, id, TRACE_EVENT_FLAG_COPY, \ arg1_name, arg1_val, arg2_name, arg2_val) -// Records a single ASYNC_STEP event for |step| immediately. If the category -// is not enabled, then this does nothing. The |name| and |id| must match the -// ASYNC_BEGIN event above. The |step| param identifies this step within the -// async event. This should be called at the beginning of the next phase of an -// asynchronous operation. -#define TRACE_EVENT_ASYNC_STEP0(category_group, name, id, step) \ - INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_STEP, \ +// Records a single ASYNC_STEP_INTO event for |step| immediately. If the +// category is not enabled, then this does nothing. The |name| and |id| must +// match the ASYNC_BEGIN event above. The |step| param identifies this step +// within the async event. This should be called at the beginning of the next +// phase of an asynchronous operation. The ASYNC_BEGIN event must not have any +// ASYNC_STEP_PAST events. +#define TRACE_EVENT_ASYNC_STEP_INTO0(category_group, name, id, step) \ + INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_STEP_INTO, \ category_group, name, id, TRACE_EVENT_FLAG_NONE, "step", step) -#define TRACE_EVENT_ASYNC_STEP1(category_group, name, id, step, \ - arg1_name, arg1_val) \ - INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_STEP, \ +#define TRACE_EVENT_ASYNC_STEP_INTO1(category_group, name, id, step, \ + arg1_name, arg1_val) \ + INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_STEP_INTO, \ category_group, name, id, TRACE_EVENT_FLAG_NONE, "step", step, \ arg1_name, arg1_val) -#define TRACE_EVENT_COPY_ASYNC_STEP0(category_group, name, id, step) \ - INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_STEP, \ - category_group, name, id, TRACE_EVENT_FLAG_COPY, "step", step) -#define TRACE_EVENT_COPY_ASYNC_STEP1(category_group, name, id, step, \ - arg1_name, arg1_val) \ - INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_STEP, \ - category_group, name, id, TRACE_EVENT_FLAG_COPY, "step", step, \ +// Records a single ASYNC_STEP_PAST event for |step| immediately. If the +// category is not enabled, then this does nothing. The |name| and |id| must +// match the ASYNC_BEGIN event above. The |step| param identifies this step +// within the async event. This should be called at the beginning of the next +// phase of an asynchronous operation. The ASYNC_BEGIN event must not have any +// ASYNC_STEP_INTO events. +#define TRACE_EVENT_ASYNC_STEP_PAST0(category_group, name, id, step) \ + INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_STEP_PAST, \ + category_group, name, id, TRACE_EVENT_FLAG_NONE, "step", step) +#define TRACE_EVENT_ASYNC_STEP_PAST1(category_group, name, id, step, \ + arg1_name, arg1_val) \ + INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_STEP_PAST, \ + category_group, name, id, TRACE_EVENT_FLAG_NONE, "step", step, \ arg1_name, arg1_val) // Records a single ASYNC_END event for "name" immediately. If the category @@ -924,7 +937,8 @@ TRACE_EVENT_API_CLASS_EXPORT extern \ #define TRACE_EVENT_PHASE_COMPLETE ('X') #define TRACE_EVENT_PHASE_INSTANT ('i') #define TRACE_EVENT_PHASE_ASYNC_BEGIN ('S') -#define TRACE_EVENT_PHASE_ASYNC_STEP ('T') +#define TRACE_EVENT_PHASE_ASYNC_STEP_INTO ('T') +#define TRACE_EVENT_PHASE_ASYNC_STEP_PAST ('p') #define TRACE_EVENT_PHASE_ASYNC_END ('F') #define TRACE_EVENT_PHASE_FLOW_BEGIN ('s') #define TRACE_EVENT_PHASE_FLOW_STEP ('t') diff --git a/base/debug/trace_event_unittest.cc b/base/debug/trace_event_unittest.cc index 2364cff..8ee0884 100644 --- a/base/debug/trace_event_unittest.cc +++ b/base/debug/trace_event_unittest.cc @@ -400,10 +400,10 @@ void TraceWithAllMacroVariants(WaitableEvent* task_complete_event) { "name1", "value1", "name2", "value2"); - TRACE_EVENT_ASYNC_STEP0("all", "TRACE_EVENT_ASYNC_STEP0 call", - 5, "step1"); - TRACE_EVENT_ASYNC_STEP1("all", "TRACE_EVENT_ASYNC_STEP1 call", - 5, "step2", "name1", "value1"); + TRACE_EVENT_ASYNC_STEP_INTO0("all", "TRACE_EVENT_ASYNC_STEP_INTO0 call", + kAsyncId, "step_begin1"); + TRACE_EVENT_ASYNC_STEP_INTO1("all", "TRACE_EVENT_ASYNC_STEP_INTO1 call", + kAsyncId, "step_begin2", "name1", "value1"); TRACE_EVENT_ASYNC_END0("all", "TRACE_EVENT_ASYNC_END0 call", kAsyncId); TRACE_EVENT_ASYNC_END1("all", "TRACE_EVENT_ASYNC_END1 call", kAsyncId, @@ -438,6 +438,11 @@ void TraceWithAllMacroVariants(WaitableEvent* task_complete_event) { TRACE_EVENT_BEGIN_WITH_ID_TID_AND_TIMESTAMP0("all", "TRACE_EVENT_BEGIN_WITH_ID_TID_AND_TIMESTAMP0 call", kAsyncId2, kThreadId, 34567); + TRACE_EVENT_ASYNC_STEP_PAST0("all", "TRACE_EVENT_ASYNC_STEP_PAST0 call", + kAsyncId2, "step_end1"); + TRACE_EVENT_ASYNC_STEP_PAST1("all", "TRACE_EVENT_ASYNC_STEP_PAST1 call", + kAsyncId2, "step_end2", "name1", "value1"); + TRACE_EVENT_END_WITH_ID_TID_AND_TIMESTAMP0("all", "TRACE_EVENT_END_WITH_ID_TID_AND_TIMESTAMP0 call", kAsyncId2, kThreadId, 45678); @@ -557,14 +562,14 @@ void ValidateAllTraceMacrosCreatedData(const ListValue& trace_parsed) { EXPECT_SUB_FIND_("name2"); EXPECT_SUB_FIND_("value2"); - EXPECT_FIND_("TRACE_EVENT_ASYNC_STEP0 call"); + EXPECT_FIND_("TRACE_EVENT_ASYNC_STEP_INTO0 call"); EXPECT_SUB_FIND_("id"); EXPECT_SUB_FIND_(kAsyncIdStr); - EXPECT_SUB_FIND_("step1"); - EXPECT_FIND_("TRACE_EVENT_ASYNC_STEP1 call"); + EXPECT_SUB_FIND_("step_begin1"); + EXPECT_FIND_("TRACE_EVENT_ASYNC_STEP_INTO1 call"); EXPECT_SUB_FIND_("id"); EXPECT_SUB_FIND_(kAsyncIdStr); - EXPECT_SUB_FIND_("step2"); + EXPECT_SUB_FIND_("step_begin2"); EXPECT_SUB_FIND_("name1"); EXPECT_SUB_FIND_("value1"); @@ -709,6 +714,19 @@ void ValidateAllTraceMacrosCreatedData(const ListValue& trace_parsed) { EXPECT_EQ(kAsyncId2Str, id); } + EXPECT_FIND_("TRACE_EVENT_ASYNC_STEP_PAST0 call"); + { + EXPECT_SUB_FIND_("id"); + EXPECT_SUB_FIND_(kAsyncId2Str); + EXPECT_SUB_FIND_("step_end1"); + EXPECT_FIND_("TRACE_EVENT_ASYNC_STEP_PAST1 call"); + EXPECT_SUB_FIND_("id"); + EXPECT_SUB_FIND_(kAsyncId2Str); + EXPECT_SUB_FIND_("step_end2"); + EXPECT_SUB_FIND_("name1"); + EXPECT_SUB_FIND_("value1"); + } + EXPECT_FIND_("TRACE_EVENT_END_WITH_ID_TID_AND_TIMESTAMP0 call"); { int val; @@ -1222,10 +1240,11 @@ TEST_F(TraceEventTestFixture, AsyncBeginEndEvents) { unsigned long long id = 0xfeedbeeffeedbeefull; TRACE_EVENT_ASYNC_BEGIN0( "cat", "name1", id); - TRACE_EVENT_ASYNC_STEP0( "cat", "name1", id, "step1"); + TRACE_EVENT_ASYNC_STEP_INTO0( "cat", "name1", id, "step1"); TRACE_EVENT_ASYNC_END0("cat", "name1", id); TRACE_EVENT_BEGIN0( "cat", "name2"); TRACE_EVENT_ASYNC_BEGIN0( "cat", "name3", 0); + TRACE_EVENT_ASYNC_STEP_PAST0( "cat", "name3", 0, "step2"); EndTraceAndFlush(); @@ -1240,6 +1259,7 @@ TEST_F(TraceEventTestFixture, AsyncBeginEndEvents) { EXPECT_TRUE(FindNamePhaseKeyValue("name1", "T", "id", id_str.c_str())); EXPECT_TRUE(FindNamePhaseKeyValue("name1", "F", "id", id_str.c_str())); EXPECT_TRUE(FindNamePhaseKeyValue("name3", "S", "id", "0x0")); + EXPECT_TRUE(FindNamePhaseKeyValue("name3", "p", "id", "0x0")); // BEGIN events should not have id EXPECT_FALSE(FindNamePhaseKeyValue("name2", "B", "id", "0")); |