| Index: content/browser/tracing/tracing_controller_impl_data_sinks.cc
|
| diff --git a/content/browser/tracing/tracing_controller_impl_data_sinks.cc b/content/browser/tracing/tracing_controller_impl_data_sinks.cc
|
| index 8a2a2bf66393e9e90ca65263e17af42cd3ceba58..05795f4602f6b376afec9a9be745c4a045261f3e 100644
|
| --- a/content/browser/tracing/tracing_controller_impl_data_sinks.cc
|
| +++ b/content/browser/tracing/tracing_controller_impl_data_sinks.cc
|
| @@ -12,45 +12,63 @@ namespace content {
|
|
|
| namespace {
|
|
|
| -class FileTraceDataSink : public TracingController::TraceDataSink {
|
| +class StringTraceDataEndpoint : public TracingController::TraceDataEndpoint {
|
| public:
|
| - explicit FileTraceDataSink(const base::FilePath& trace_file_path,
|
| - const base::Closure& callback)
|
| + typedef base::Callback<void(base::RefCountedString*)> CompletionCallback;
|
| +
|
| + explicit StringTraceDataEndpoint(CompletionCallback callback)
|
| + : completion_callback_(callback) {}
|
| +
|
| + void ReceiveTraceFinalContents(const std::string& contents) override {
|
| + std::string tmp = contents;
|
| + scoped_refptr<base::RefCountedString> str =
|
| + base::RefCountedString::TakeString(&tmp);
|
| +
|
| + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
|
| + base::Bind(completion_callback_, str));
|
| + }
|
| +
|
| + private:
|
| + ~StringTraceDataEndpoint() override {}
|
| +
|
| + CompletionCallback completion_callback_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(StringTraceDataEndpoint);
|
| +};
|
| +
|
| +class FileTraceDataEndpoint : public TracingController::TraceDataEndpoint {
|
| + public:
|
| + explicit FileTraceDataEndpoint(const base::FilePath& trace_file_path,
|
| + const base::Closure& callback)
|
| : file_path_(trace_file_path),
|
| completion_callback_(callback),
|
| file_(NULL) {}
|
|
|
| - void AddTraceChunk(const std::string& chunk) override {
|
| + void ReceiveTraceChunk(const std::string& chunk) override {
|
| std::string tmp = chunk;
|
| scoped_refptr<base::RefCountedString> chunk_ptr =
|
| base::RefCountedString::TakeString(&tmp);
|
| BrowserThread::PostTask(
|
| - BrowserThread::FILE,
|
| - FROM_HERE,
|
| - base::Bind(
|
| - &FileTraceDataSink::AddTraceChunkOnFileThread, this, chunk_ptr));
|
| - }
|
| - void SetSystemTrace(const std::string& data) override {
|
| - system_trace_ = data;
|
| + BrowserThread::FILE, FROM_HERE,
|
| + base::Bind(&FileTraceDataEndpoint::ReceiveTraceChunkOnFileThread, this,
|
| + chunk_ptr));
|
| }
|
| - void Close() override {
|
| +
|
| + void ReceiveTraceFinalContents(const std::string& contents) override {
|
| BrowserThread::PostTask(
|
| - BrowserThread::FILE,
|
| - FROM_HERE,
|
| - base::Bind(&FileTraceDataSink::CloseOnFileThread, this));
|
| + BrowserThread::FILE, FROM_HERE,
|
| + base::Bind(&FileTraceDataEndpoint::CloseOnFileThread, this));
|
| }
|
|
|
| private:
|
| - ~FileTraceDataSink() override { DCHECK(file_ == NULL); }
|
| + ~FileTraceDataEndpoint() override { DCHECK(file_ == NULL); }
|
|
|
| - void AddTraceChunkOnFileThread(
|
| + void ReceiveTraceChunkOnFileThread(
|
| const scoped_refptr<base::RefCountedString> chunk) {
|
| - if (file_ != NULL)
|
| - fputc(',', file_);
|
| - else if (!OpenFileIfNeededOnFileThread())
|
| + if (!OpenFileIfNeededOnFileThread())
|
| return;
|
| - ignore_result(fwrite(chunk->data().c_str(), strlen(chunk->data().c_str()),
|
| - 1, file_));
|
| + ignore_result(
|
| + fwrite(chunk->data().c_str(), chunk->data().size(), 1, file_));
|
| }
|
|
|
| bool OpenFileIfNeededOnFileThread() {
|
| @@ -61,29 +79,17 @@ class FileTraceDataSink : public TracingController::TraceDataSink {
|
| LOG(ERROR) << "Failed to open " << file_path_.value();
|
| return false;
|
| }
|
| - const char preamble[] = "{\"traceEvents\": [";
|
| - ignore_result(fwrite(preamble, strlen(preamble), 1, file_));
|
| return true;
|
| }
|
|
|
| void CloseOnFileThread() {
|
| if (OpenFileIfNeededOnFileThread()) {
|
| - fputc(']', file_);
|
| - if (!system_trace_.empty()) {
|
| - const char systemTraceEvents[] = ",\"systemTraceEvents\": ";
|
| - ignore_result(fwrite(systemTraceEvents, strlen(systemTraceEvents),
|
| - 1, file_));
|
| - ignore_result(fwrite(system_trace_.c_str(),
|
| - strlen(system_trace_.c_str()), 1, file_));
|
| - }
|
| - fputc('}', file_);
|
| base::CloseFile(file_);
|
| file_ = NULL;
|
| }
|
| BrowserThread::PostTask(
|
| - BrowserThread::UI,
|
| - FROM_HERE,
|
| - base::Bind(&FileTraceDataSink::FinalizeOnUIThread, this));
|
| + BrowserThread::UI, FROM_HERE,
|
| + base::Bind(&FileTraceDataEndpoint::FinalizeOnUIThread, this));
|
| }
|
|
|
| void FinalizeOnUIThread() { completion_callback_.Run(); }
|
| @@ -91,50 +97,61 @@ class FileTraceDataSink : public TracingController::TraceDataSink {
|
| base::FilePath file_path_;
|
| base::Closure completion_callback_;
|
| FILE* file_;
|
| - std::string system_trace_;
|
|
|
| - DISALLOW_COPY_AND_ASSIGN(FileTraceDataSink);
|
| + DISALLOW_COPY_AND_ASSIGN(FileTraceDataEndpoint);
|
| };
|
|
|
| class StringTraceDataSink : public TracingController::TraceDataSink {
|
| public:
|
| - typedef base::Callback<void(base::RefCountedString*)> CompletionCallback;
|
| -
|
| - explicit StringTraceDataSink(CompletionCallback callback)
|
| - : completion_callback_(callback) {}
|
| + explicit StringTraceDataSink(
|
| + scoped_refptr<TracingController::TraceDataEndpoint> endpoint)
|
| + : endpoint_(endpoint) {}
|
|
|
| - // TracingController::TraceDataSink implementation
|
| void AddTraceChunk(const std::string& chunk) override {
|
| - if (!trace_.empty())
|
| - trace_ += ",";
|
| + std::string trace_string;
|
| + if (trace_.empty())
|
| + trace_string = "{\"traceEvents\":[";
|
| + else
|
| + trace_string = ",";
|
| + trace_string += chunk;
|
| +
|
| + AddTraceChunkAndPassToEndpoint(trace_string);
|
| + }
|
| +
|
| + void AddTraceChunkAndPassToEndpoint(const std::string& chunk) {
|
| trace_ += chunk;
|
| +
|
| + endpoint_->ReceiveTraceChunk(chunk);
|
| }
|
| +
|
| void SetSystemTrace(const std::string& data) override {
|
| system_trace_ = data;
|
| }
|
| +
|
| void Close() override {
|
| - std::string result = "{\"traceEvents\":[" + trace_ + "]";
|
| + AddTraceChunkAndPassToEndpoint("]");
|
| if (!system_trace_.empty())
|
| - result += ",\"systemTraceEvents\": " + system_trace_;
|
| - result += "}";
|
| + AddTraceChunkAndPassToEndpoint(",\"systemTraceEvents\": " +
|
| + system_trace_);
|
| + AddTraceChunkAndPassToEndpoint("}");
|
|
|
| - scoped_refptr<base::RefCountedString> str =
|
| - base::RefCountedString::TakeString(&result);
|
| - completion_callback_.Run(str.get());
|
| + endpoint_->ReceiveTraceFinalContents(trace_);
|
| }
|
|
|
| private:
|
| ~StringTraceDataSink() override {}
|
|
|
| + scoped_refptr<TracingController::TraceDataEndpoint> endpoint_;
|
| std::string trace_;
|
| std::string system_trace_;
|
| - CompletionCallback completion_callback_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(StringTraceDataSink);
|
| };
|
|
|
| class CompressedStringTraceDataSink : public TracingController::TraceDataSink {
|
| public:
|
| + const int kChunkSize = 0x4000;
|
| +
|
| explicit CompressedStringTraceDataSink(
|
| scoped_refptr<TracingController::TraceDataEndpoint> endpoint)
|
| : endpoint_(endpoint), already_tried_open_(false) {}
|
| @@ -203,8 +220,6 @@ class CompressedStringTraceDataSink : public TracingController::TraceDataSink {
|
| if (!OpenZStreamOnFileThread())
|
| return;
|
|
|
| - const int kChunkSize = 0x4000;
|
| -
|
| char buffer[kChunkSize];
|
| int err;
|
| stream_->avail_in = chunk.size();
|
| @@ -262,7 +277,7 @@ class CompressedStringTraceDataSink : public TracingController::TraceDataSink {
|
| scoped_refptr<TracingController::TraceDataSink>
|
| TracingController::CreateStringSink(
|
| const base::Callback<void(base::RefCountedString*)>& callback) {
|
| - return new StringTraceDataSink(callback);
|
| + return new StringTraceDataSink(new StringTraceDataEndpoint(callback));
|
| }
|
|
|
| scoped_refptr<TracingController::TraceDataSink>
|
| @@ -274,7 +289,13 @@ TracingController::CreateCompressedStringSink(
|
| scoped_refptr<TracingController::TraceDataSink>
|
| TracingController::CreateFileSink(const base::FilePath& file_path,
|
| const base::Closure& callback) {
|
| - return new FileTraceDataSink(file_path, callback);
|
| + return new StringTraceDataSink(CreateFileEndpoint(file_path, callback));
|
| +}
|
| +
|
| +scoped_refptr<TracingController::TraceDataEndpoint>
|
| +TracingController::CreateFileEndpoint(const base::FilePath& file_path,
|
| + const base::Closure& callback) {
|
| + return new FileTraceDataEndpoint(file_path, callback);
|
| }
|
|
|
| } // namespace content
|
|
|