OLD | NEW |
---|---|
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 #include "content/browser/tracing/tracing_controller_impl.h" | 4 #include "content/browser/tracing/tracing_controller_impl.h" |
5 | 5 |
6 #include "base/bind.h" | 6 #include "base/bind.h" |
7 #include "base/files/file_util.h" | 7 #include "base/files/file_util.h" |
8 #include "base/json/json_writer.h" | 8 #include "base/json/json_writer.h" |
9 #include "content/public/browser/browser_thread.h" | 9 #include "content/public/browser/browser_thread.h" |
10 #include "third_party/zlib/zlib.h" | 10 #include "third_party/zlib/zlib.h" |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
124 | 124 |
125 AddTraceChunkAndPassToEndpoint(trace_string); | 125 AddTraceChunkAndPassToEndpoint(trace_string); |
126 } | 126 } |
127 | 127 |
128 void AddTraceChunkAndPassToEndpoint(const std::string& chunk) { | 128 void AddTraceChunkAndPassToEndpoint(const std::string& chunk) { |
129 trace_ += chunk; | 129 trace_ += chunk; |
130 | 130 |
131 endpoint_->ReceiveTraceChunk(chunk); | 131 endpoint_->ReceiveTraceChunk(chunk); |
132 } | 132 } |
133 | 133 |
134 void SetSystemTrace(const std::string& data) override { | |
135 system_trace_ = data; | |
136 } | |
137 | |
138 void SetPowerTrace(const std::string& data) override { power_trace_ = data; } | |
139 | |
140 void Close() override { | 134 void Close() override { |
141 AddTraceChunkAndPassToEndpoint("]"); | 135 AddTraceChunkAndPassToEndpoint("]"); |
142 if (!system_trace_.empty()) | 136 |
143 AddTraceChunkAndPassToEndpoint(",\"systemTraceEvents\": " + | 137 for (base::DictionaryValue::Iterator it(GetAdditionalTracingAgentTrace()); |
144 system_trace_); | 138 !it.IsAtEnd(); it.Advance()) { |
139 std::string trace; | |
140 DCHECK(it.value().GetAsString(&trace)); | |
141 if (it.key() == base::trace_event::TracingAgent::kCrOSTracingAgentName || | |
shatch
2015/11/27 19:29:18
Don't need to do this now but could probably go fu
Zhen Wang
2015/12/01 00:14:32
Done.
| |
142 it.key() == base::trace_event::TracingAgent::kETWTracingAgentName) { | |
143 AddTraceChunkAndPassToEndpoint(",\"systemTraceEvents\": " + trace); | |
144 } else if (it.key() == | |
145 base::trace_event::TracingAgent::kPowerTracingAgentName) { | |
146 AddTraceChunkAndPassToEndpoint(",\"powerTraceAsString\": " + trace); | |
147 } | |
148 } | |
149 | |
145 std::string metadataJSON; | 150 std::string metadataJSON; |
146 if (base::JSONWriter::Write(GetMetadata(), &metadataJSON) && | 151 if (base::JSONWriter::Write(GetMetadata(), &metadataJSON) && |
147 !metadataJSON.empty()) | 152 !metadataJSON.empty()) |
148 AddTraceChunkAndPassToEndpoint(",\"metadata\": " + metadataJSON); | 153 AddTraceChunkAndPassToEndpoint(",\"metadata\": " + metadataJSON); |
149 if (!power_trace_.empty()) { | |
150 AddTraceChunkAndPassToEndpoint(",\"powerTraceAsString\": " + | |
151 power_trace_); | |
152 } | |
153 | 154 |
154 AddTraceChunkAndPassToEndpoint("}"); | 155 AddTraceChunkAndPassToEndpoint("}"); |
155 | 156 |
156 scoped_ptr<const base::DictionaryValue> metadata(GetMetadata().DeepCopy()); | 157 scoped_ptr<const base::DictionaryValue> metadata(GetMetadata().DeepCopy()); |
157 endpoint_->ReceiveTraceFinalContents(metadata.Pass(), trace_); | 158 endpoint_->ReceiveTraceFinalContents(metadata.Pass(), trace_); |
158 } | 159 } |
159 | 160 |
160 private: | 161 private: |
161 ~StringTraceDataSink() override {} | 162 ~StringTraceDataSink() override {} |
162 | 163 |
163 scoped_refptr<TracingController::TraceDataEndpoint> endpoint_; | 164 scoped_refptr<TracingController::TraceDataEndpoint> endpoint_; |
164 std::string trace_; | 165 std::string trace_; |
165 std::string system_trace_; | |
166 std::string power_trace_; | |
167 | 166 |
168 DISALLOW_COPY_AND_ASSIGN(StringTraceDataSink); | 167 DISALLOW_COPY_AND_ASSIGN(StringTraceDataSink); |
169 }; | 168 }; |
170 | 169 |
171 class CompressedStringTraceDataSink : public TracingController::TraceDataSink { | 170 class CompressedStringTraceDataSink : public TracingController::TraceDataSink { |
172 public: | 171 public: |
173 explicit CompressedStringTraceDataSink( | 172 explicit CompressedStringTraceDataSink( |
174 scoped_refptr<TracingController::TraceDataEndpoint> endpoint) | 173 scoped_refptr<TracingController::TraceDataEndpoint> endpoint) |
175 : endpoint_(endpoint), already_tried_open_(false) {} | 174 : endpoint_(endpoint), already_tried_open_(false) {} |
176 | 175 |
177 void AddTraceChunk(const std::string& chunk) override { | 176 void AddTraceChunk(const std::string& chunk) override { |
178 std::string tmp = chunk; | 177 std::string tmp = chunk; |
179 scoped_refptr<base::RefCountedString> chunk_ptr = | 178 scoped_refptr<base::RefCountedString> chunk_ptr = |
180 base::RefCountedString::TakeString(&tmp); | 179 base::RefCountedString::TakeString(&tmp); |
181 BrowserThread::PostTask( | 180 BrowserThread::PostTask( |
182 BrowserThread::FILE, FROM_HERE, | 181 BrowserThread::FILE, FROM_HERE, |
183 base::Bind(&CompressedStringTraceDataSink::AddTraceChunkOnFileThread, | 182 base::Bind(&CompressedStringTraceDataSink::AddTraceChunkOnFileThread, |
184 this, chunk_ptr)); | 183 this, chunk_ptr)); |
185 } | 184 } |
186 | 185 |
187 void SetSystemTrace(const std::string& data) override { | |
188 system_trace_ = data; | |
189 } | |
190 | |
191 void SetPowerTrace(const std::string& data) override { power_trace_ = data; } | |
192 | |
193 void Close() override { | 186 void Close() override { |
194 BrowserThread::PostTask( | 187 BrowserThread::PostTask( |
195 BrowserThread::FILE, FROM_HERE, | 188 BrowserThread::FILE, FROM_HERE, |
196 base::Bind(&CompressedStringTraceDataSink::CloseOnFileThread, this)); | 189 base::Bind(&CompressedStringTraceDataSink::CloseOnFileThread, this)); |
197 } | 190 } |
198 | 191 |
199 private: | 192 private: |
200 ~CompressedStringTraceDataSink() override {} | 193 ~CompressedStringTraceDataSink() override {} |
201 | 194 |
202 bool OpenZStreamOnFileThread() { | 195 bool OpenZStreamOnFileThread() { |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
266 | 259 |
267 void CloseOnFileThread() { | 260 void CloseOnFileThread() { |
268 DCHECK_CURRENTLY_ON(BrowserThread::FILE); | 261 DCHECK_CURRENTLY_ON(BrowserThread::FILE); |
269 if (!OpenZStreamOnFileThread()) | 262 if (!OpenZStreamOnFileThread()) |
270 return; | 263 return; |
271 | 264 |
272 if (compressed_trace_data_.empty()) | 265 if (compressed_trace_data_.empty()) |
273 AddTraceChunkAndCompressOnFileThread("{\"traceEvents\":[", false); | 266 AddTraceChunkAndCompressOnFileThread("{\"traceEvents\":[", false); |
274 | 267 |
275 AddTraceChunkAndCompressOnFileThread("]", false); | 268 AddTraceChunkAndCompressOnFileThread("]", false); |
276 if (!system_trace_.empty()) { | 269 |
277 AddTraceChunkAndCompressOnFileThread( | 270 for (base::DictionaryValue::Iterator it(GetAdditionalTracingAgentTrace()); |
278 ",\"systemTraceEvents\": " + system_trace_, false); | 271 !it.IsAtEnd(); it.Advance()) { |
272 std::string trace; | |
273 DCHECK(it.value().GetAsString(&trace)); | |
274 if (it.key() == base::trace_event::TracingAgent::kCrOSTracingAgentName || | |
275 it.key() == base::trace_event::TracingAgent::kETWTracingAgentName) { | |
276 AddTraceChunkAndCompressOnFileThread( | |
277 ",\"systemTraceEvents\": " + trace, false); | |
278 } else if (it.key() == | |
279 base::trace_event::TracingAgent::kPowerTracingAgentName) { | |
280 AddTraceChunkAndCompressOnFileThread( | |
281 ",\"powerTraceAsString\": " + trace, false); | |
282 } | |
279 } | 283 } |
284 | |
280 std::string metadataJSON; | 285 std::string metadataJSON; |
281 if (base::JSONWriter::Write(GetMetadata(), &metadataJSON) && | 286 if (base::JSONWriter::Write(GetMetadata(), &metadataJSON) && |
282 !metadataJSON.empty()) { | 287 !metadataJSON.empty()) { |
283 AddTraceChunkAndCompressOnFileThread(",\"metadata\": " + metadataJSON, | 288 AddTraceChunkAndCompressOnFileThread(",\"metadata\": " + metadataJSON, |
284 false); | 289 false); |
285 } | 290 } |
286 if (!power_trace_.empty()) { | |
287 AddTraceChunkAndCompressOnFileThread( | |
288 ",\"powerTraceAsString\": " + power_trace_, false); | |
289 } | |
290 AddTraceChunkAndCompressOnFileThread("}", true); | 291 AddTraceChunkAndCompressOnFileThread("}", true); |
291 | 292 |
292 deflateEnd(stream_.get()); | 293 deflateEnd(stream_.get()); |
293 stream_.reset(); | 294 stream_.reset(); |
294 | 295 |
295 scoped_ptr<const base::DictionaryValue> metadata(GetMetadata().DeepCopy()); | 296 scoped_ptr<const base::DictionaryValue> metadata(GetMetadata().DeepCopy()); |
296 endpoint_->ReceiveTraceFinalContents(metadata.Pass(), | 297 endpoint_->ReceiveTraceFinalContents(metadata.Pass(), |
297 compressed_trace_data_); | 298 compressed_trace_data_); |
298 } | 299 } |
299 | 300 |
300 scoped_refptr<TracingController::TraceDataEndpoint> endpoint_; | 301 scoped_refptr<TracingController::TraceDataEndpoint> endpoint_; |
301 scoped_ptr<z_stream> stream_; | 302 scoped_ptr<z_stream> stream_; |
302 bool already_tried_open_; | 303 bool already_tried_open_; |
303 std::string compressed_trace_data_; | 304 std::string compressed_trace_data_; |
304 std::string system_trace_; | |
305 std::string power_trace_; | |
306 | 305 |
307 DISALLOW_COPY_AND_ASSIGN(CompressedStringTraceDataSink); | 306 DISALLOW_COPY_AND_ASSIGN(CompressedStringTraceDataSink); |
308 }; | 307 }; |
309 | 308 |
310 } // namespace | 309 } // namespace |
311 | 310 |
311 void TracingController::TraceDataSink::AddAdditionalTracingAgentTrace( | |
312 const std::string& agent_name, | |
313 const std::string& trace_data) { | |
314 additional_tracing_agent_trace_.SetString(agent_name, trace_data); | |
315 } | |
316 | |
317 const base::DictionaryValue& | |
318 TracingController::TraceDataSink::GetAdditionalTracingAgentTrace() const { | |
319 return additional_tracing_agent_trace_; | |
320 } | |
321 | |
312 void TracingController::TraceDataSink::AddMetadata( | 322 void TracingController::TraceDataSink::AddMetadata( |
313 const base::DictionaryValue& data) { | 323 const base::DictionaryValue& data) { |
314 metadata_.MergeDictionary(&data); | 324 metadata_.MergeDictionary(&data); |
315 } | 325 } |
316 | 326 |
317 const base::DictionaryValue& | 327 const base::DictionaryValue& |
318 TracingController::TraceDataSink::GetMetadata() const { | 328 TracingController::TraceDataSink::GetMetadata() const { |
319 return metadata_; | 329 return metadata_; |
320 } | 330 } |
321 | 331 |
(...skipping 24 matching lines...) Expand all Loading... | |
346 return new StringTraceDataEndpoint(callback); | 356 return new StringTraceDataEndpoint(callback); |
347 } | 357 } |
348 | 358 |
349 scoped_refptr<TracingController::TraceDataEndpoint> | 359 scoped_refptr<TracingController::TraceDataEndpoint> |
350 TracingController::CreateFileEndpoint(const base::FilePath& file_path, | 360 TracingController::CreateFileEndpoint(const base::FilePath& file_path, |
351 const base::Closure& callback) { | 361 const base::Closure& callback) { |
352 return new FileTraceDataEndpoint(file_path, callback); | 362 return new FileTraceDataEndpoint(file_path, callback); |
353 } | 363 } |
354 | 364 |
355 } // namespace content | 365 } // namespace content |
OLD | NEW |