Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(142)

Unified Diff: services/shell/standalone/tracer.cc

Issue 2419723002: Move services/shell to services/service_manager (Closed)
Patch Set: rebase Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « services/shell/standalone/tracer.h ('k') | services/shell/switches.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: services/shell/standalone/tracer.cc
diff --git a/services/shell/standalone/tracer.cc b/services/shell/standalone/tracer.cc
deleted file mode 100644
index 84564b4049c17d4e53e0e0cbae1e7cf814cbfb0a..0000000000000000000000000000000000000000
--- a/services/shell/standalone/tracer.cc
+++ /dev/null
@@ -1,165 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "services/shell/standalone/tracer.h"
-
-#include <stddef.h>
-#include <stdio.h>
-#include <string.h>
-#include <utility>
-
-#include "base/message_loop/message_loop.h"
-#include "base/single_thread_task_runner.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/threading/thread.h"
-#include "base/threading/thread_task_runner_handle.h"
-#include "base/trace_event/trace_config.h"
-#include "base/trace_event/trace_event.h"
-
-namespace shell {
-
-Tracer::Tracer()
- : tracing_(false), first_chunk_written_(false), trace_file_(nullptr) {}
-
-Tracer::~Tracer() {
- StopAndFlushToFile();
-}
-
-void Tracer::Start(const std::string& categories,
- const std::string& duration_seconds_str,
- const std::string& filename) {
- tracing_ = true;
- trace_filename_ = filename;
- categories_ = categories;
- base::trace_event::TraceConfig config(categories,
- base::trace_event::RECORD_UNTIL_FULL);
- base::trace_event::TraceLog::GetInstance()->SetEnabled(
- config, base::trace_event::TraceLog::RECORDING_MODE);
-
- int trace_duration_secs = 5;
- if (!duration_seconds_str.empty()) {
- CHECK(base::StringToInt(duration_seconds_str, &trace_duration_secs))
- << "Could not parse --trace-startup-duration value "
- << duration_seconds_str;
- }
- base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
- FROM_HERE,
- base::Bind(&Tracer::StopAndFlushToFile, base::Unretained(this)),
- base::TimeDelta::FromSeconds(trace_duration_secs));
-}
-
-void Tracer::StartCollectingFromTracingService(
- tracing::mojom::CollectorPtr coordinator) {
- coordinator_ = std::move(coordinator);
- mojo::DataPipe data_pipe;
- coordinator_->Start(std::move(data_pipe.producer_handle), categories_);
- drainer_.reset(new mojo::common::DataPipeDrainer(
- this, std::move(data_pipe.consumer_handle)));
-}
-
-void Tracer::StopAndFlushToFile() {
- if (tracing_)
- StopTracingAndFlushToDisk();
-}
-
-void Tracer::ConnectToProvider(tracing::mojom::ProviderRequest request) {
- provider_.Bind(std::move(request));
-}
-
-void Tracer::StopTracingAndFlushToDisk() {
- tracing_ = false;
- trace_file_ = fopen(trace_filename_.c_str(), "w+");
- PCHECK(trace_file_);
- static const char kStart[] = "{\"traceEvents\":[";
- PCHECK(fwrite(kStart, 1, strlen(kStart), trace_file_) == strlen(kStart));
-
- // At this point we might be connected to the tracing service, in which case
- // we want to tell it to stop tracing and we will send the data we've
- // collected in process to it.
- if (coordinator_) {
- coordinator_->StopAndFlush();
- } else {
- // Or we might not be connected. If we aren't connected to the tracing
- // service we want to collect the tracing data gathered ourselves and flush
- // it to disk. We do this in a blocking fashion (for this thread) so we can
- // gather as much data as possible on shutdown.
- base::trace_event::TraceLog::GetInstance()->SetDisabled();
- {
- base::WaitableEvent flush_complete_event(
- base::WaitableEvent::ResetPolicy::AUTOMATIC,
- base::WaitableEvent::InitialState::NOT_SIGNALED);
- // TraceLog::Flush requires a message loop but we've already shut ours
- // down.
- // Spin up a new thread to flush things out.
- base::Thread flush_thread("mojo_runner_trace_event_flush");
- flush_thread.Start();
- flush_thread.task_runner()->PostTask(
- FROM_HERE,
- base::Bind(&Tracer::EndTraceAndFlush, base::Unretained(this),
- trace_filename_,
- base::Bind(&base::WaitableEvent::Signal,
- base::Unretained(&flush_complete_event))));
- base::trace_event::TraceLog::GetInstance()
- ->SetCurrentThreadBlocksMessageLoop();
- flush_complete_event.Wait();
- }
- }
-}
-
-void Tracer::WriteFooterAndClose() {
- static const char kEnd[] = "]}";
- PCHECK(fwrite(kEnd, 1, strlen(kEnd), trace_file_) == strlen(kEnd));
- PCHECK(fclose(trace_file_) == 0);
- trace_file_ = nullptr;
- LOG(ERROR) << "Wrote trace data to " << trace_filename_;
-}
-
-void Tracer::EndTraceAndFlush(const std::string& filename,
- const base::Closure& done_callback) {
- base::trace_event::TraceLog::GetInstance()->SetDisabled();
- base::trace_event::TraceLog::GetInstance()->Flush(base::Bind(
- &Tracer::WriteTraceDataCollected, base::Unretained(this), done_callback));
-}
-
-void Tracer::WriteTraceDataCollected(
- const base::Closure& done_callback,
- const scoped_refptr<base::RefCountedString>& events_str,
- bool has_more_events) {
- if (events_str->size()) {
- WriteCommaIfNeeded();
-
- PCHECK(fwrite(events_str->data().c_str(), 1, events_str->data().length(),
- trace_file_) == events_str->data().length());
- }
-
- if (!has_more_events && !done_callback.is_null())
- done_callback.Run();
-}
-
-void Tracer::OnDataAvailable(const void* data, size_t num_bytes) {
- const char* chars = static_cast<const char*>(data);
- trace_service_data_.append(chars, num_bytes);
-}
-
-void Tracer::OnDataComplete() {
- if (!trace_service_data_.empty()) {
- WriteCommaIfNeeded();
- const char* const chars = trace_service_data_.data();
- size_t num_bytes = trace_service_data_.length();
- PCHECK(fwrite(chars, 1, num_bytes, trace_file_) == num_bytes);
- trace_service_data_ = std::string();
- }
- drainer_.reset();
- coordinator_.reset();
- WriteFooterAndClose();
-}
-
-void Tracer::WriteCommaIfNeeded() {
- if (first_chunk_written_)
- PCHECK(fwrite(",", 1, 1, trace_file_) == 1);
- first_chunk_written_ = true;
-}
-
-} // namespace shell
« no previous file with comments | « services/shell/standalone/tracer.h ('k') | services/shell/switches.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698