tools/profiler/TracedTaskCommon.cpp

changeset 0
6474c204b198
equal deleted inserted replaced
-1:000000000000 0:53438a2ca41b
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim:set ts=2 sw=2 sts=2 et cindent: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6
7 #include "GeckoTaskTracerImpl.h"
8 #include "TracedTaskCommon.h"
9
10 namespace mozilla {
11 namespace tasktracer {
12
13 TracedTaskCommon::TracedTaskCommon()
14 : mSourceEventId(0)
15 , mSourceEventType(SourceEventType::UNKNOWN)
16 {
17 Init();
18 }
19
20 void
21 TracedTaskCommon::Init()
22 {
23 TraceInfo* info = GetOrCreateTraceInfo();
24 NS_ENSURE_TRUE_VOID(info);
25
26 mTaskId = GenNewUniqueTaskId();
27 mSourceEventId = info->mCurTraceSourceId;
28 mSourceEventType = info->mCurTraceSourceType;
29
30 LogDispatch(mTaskId, info->mCurTaskId, mSourceEventId, mSourceEventType);
31 }
32
33 void
34 TracedTaskCommon::SetTraceInfo()
35 {
36 TraceInfo* info = GetOrCreateTraceInfo();
37 NS_ENSURE_TRUE_VOID(info);
38
39 info->mCurTraceSourceId = mSourceEventId;
40 info->mCurTraceSourceType = mSourceEventType;
41 info->mCurTaskId = mTaskId;
42 }
43
44 void
45 TracedTaskCommon::ClearTraceInfo()
46 {
47 TraceInfo* info = GetOrCreateTraceInfo();
48 NS_ENSURE_TRUE_VOID(info);
49
50 info->mCurTraceSourceId = 0;
51 info->mCurTraceSourceType = SourceEventType::UNKNOWN;
52 info->mCurTaskId = 0;
53 }
54
55 /**
56 * Implementation of class TracedRunnable.
57 */
58 TracedRunnable::TracedRunnable(nsIRunnable* aOriginalObj)
59 : TracedTaskCommon()
60 , mOriginalObj(aOriginalObj)
61 {
62 LogVirtualTablePtr(mTaskId, mSourceEventId, *(int**)(aOriginalObj));
63 }
64
65 NS_IMETHODIMP
66 TracedRunnable::Run()
67 {
68 LogBegin(mTaskId, mSourceEventId);
69
70 SetTraceInfo();
71 nsresult rv = mOriginalObj->Run();
72 ClearTraceInfo();
73
74 LogEnd(mTaskId, mSourceEventId);
75 return rv;
76 }
77
78 /**
79 * Implementation of class TracedTask.
80 */
81 TracedTask::TracedTask(Task* aOriginalObj)
82 : TracedTaskCommon()
83 , mOriginalObj(aOriginalObj)
84 {
85 LogVirtualTablePtr(mTaskId, mSourceEventId, *(int**)(aOriginalObj));
86 }
87
88 void
89 TracedTask::Run()
90 {
91 LogBegin(mTaskId, mSourceEventId);
92
93 SetTraceInfo();
94 mOriginalObj->Run();
95 ClearTraceInfo();
96
97 LogEnd(mTaskId, mSourceEventId);
98 }
99
100 FakeTracedTask::FakeTracedTask(int* aVptr)
101 : TracedTaskCommon()
102 {
103 LogVirtualTablePtr(mTaskId, mSourceEventId, aVptr);
104 }
105
106 FakeTracedTask::FakeTracedTask(const FakeTracedTask& aTask)
107 {
108 mTaskId = aTask.mTaskId;
109 mSourceEventId = aTask.mSourceEventId;
110 mSourceEventType = aTask.mSourceEventType;
111 }
112
113 void
114 FakeTracedTask::BeginFakeTracedTask()
115 {
116 LogBegin(mTaskId, mSourceEventId);
117 SetTraceInfo();
118 }
119
120 void
121 FakeTracedTask::EndFakeTracedTask()
122 {
123 ClearTraceInfo();
124 LogEnd(mTaskId, mSourceEventId);
125 }
126
127 AutoRunFakeTracedTask::AutoRunFakeTracedTask(FakeTracedTask* aFakeTracedTask)
128 : mInitialized(false)
129 {
130 if (aFakeTracedTask) {
131 mInitialized = true;
132 mFakeTracedTask = *aFakeTracedTask;
133 mFakeTracedTask.BeginFakeTracedTask();
134 }
135 }
136
137 AutoRunFakeTracedTask::~AutoRunFakeTracedTask()
138 {
139 if (mInitialized) {
140 mFakeTracedTask.EndFakeTracedTask();
141 }
142 }
143
144 /**
145 * CreateTracedRunnable() returns a TracedRunnable wrapping the original
146 * nsIRunnable object, aRunnable.
147 */
148 already_AddRefed<nsIRunnable>
149 CreateTracedRunnable(nsIRunnable* aRunnable)
150 {
151 nsCOMPtr<nsIRunnable> runnable = new TracedRunnable(aRunnable);
152 return runnable.forget();
153 }
154
155 /**
156 * CreateTracedTask() returns a TracedTask wrapping the original Task object,
157 * aTask.
158 */
159 Task*
160 CreateTracedTask(Task* aTask)
161 {
162 Task* task = new TracedTask(aTask);
163 return task;
164 }
165
166 /**
167 * CreateFakeTracedTask() returns a FakeTracedTask tracking the event which is
168 * not dispatched from its parent task directly, such as timer events.
169 */
170 FakeTracedTask*
171 CreateFakeTracedTask(int* aVptr)
172 {
173 nsAutoPtr<FakeTracedTask> task(new FakeTracedTask(aVptr));
174 return task.forget();
175 }
176
177 } // namespace tasktracer
178 } // namespace mozilla

mercurial