| Index: chrome/browser/chromeos/dbus/debug_daemon_client.cc
|
| diff --git a/chrome/browser/chromeos/dbus/debug_daemon_client.cc b/chrome/browser/chromeos/dbus/debug_daemon_client.cc
|
| deleted file mode 100644
|
| index c9c5822b86b74f71d6d1927d23c1e6e42c63003c..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/chromeos/dbus/debug_daemon_client.cc
|
| +++ /dev/null
|
| @@ -1,280 +0,0 @@
|
| -// Copyright (c) 2012 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 <fcntl.h>
|
| -#include <unistd.h>
|
| -
|
| -#include "chrome/browser/chromeos/dbus/debug_daemon_client.h"
|
| -
|
| -#include "base/bind.h"
|
| -#include "base/callback.h"
|
| -#include "base/chromeos/chromeos_version.h"
|
| -#include "base/eintr_wrapper.h"
|
| -#include "base/memory/ref_counted_memory.h"
|
| -#include "base/platform_file.h"
|
| -#include "base/string_util.h"
|
| -#include "content/public/browser/browser_thread.h"
|
| -#include "dbus/bus.h"
|
| -#include "dbus/message.h"
|
| -#include "dbus/object_path.h"
|
| -#include "dbus/object_proxy.h"
|
| -#include "net/base/file_stream.h"
|
| -#include "net/base/io_buffer.h"
|
| -#include "net/base/net_errors.h"
|
| -#include "third_party/cros_system_api/dbus/service_constants.h"
|
| -
|
| -using content::BrowserThread;
|
| -
|
| -namespace {
|
| -
|
| -// Used in DebugDaemonClient::EmptySystemStopTracingCallback().
|
| -void EmptyStopSystemTracingCallbackBody(
|
| - const scoped_refptr<base::RefCountedString>& unused_result) {
|
| -}
|
| -
|
| -// Simple class to encapsulate collecting data from a pipe into a
|
| -// string. To use, instantiate the class, start i/o, and then delete
|
| -// the instance on callback. The data should be retrieved before
|
| -// delete and extracted or copied.
|
| -//
|
| -// TODO(sleffler) move data collection to a sub-class so this
|
| -// can be reused to process data as it is received
|
| -class PipeReader {
|
| - public:
|
| - typedef base::Callback<void(void)>IOCompleteCallback;
|
| -
|
| - explicit PipeReader(IOCompleteCallback callback)
|
| - : data_stream_(NULL),
|
| - io_buffer_(new net::IOBufferWithSize(4096)),
|
| - weak_ptr_factory_(this),
|
| - callback_(callback) {
|
| - pipe_fd_[0] = pipe_fd_[1] = -1;
|
| - }
|
| -
|
| - virtual ~PipeReader() {
|
| - if (pipe_fd_[0] != -1)
|
| - if (HANDLE_EINTR(close(pipe_fd_[0])) < 0)
|
| - PLOG(ERROR) << "close[0]";
|
| - if (pipe_fd_[1] != -1)
|
| - if (HANDLE_EINTR(close(pipe_fd_[1])) < 0)
|
| - PLOG(ERROR) << "close[1]";
|
| - }
|
| -
|
| - // Returns descriptor for the writeable side of the pipe.
|
| - int GetWriteFD() { return pipe_fd_[1]; }
|
| -
|
| - // Closes writeable descriptor; normally used in parent process after fork.
|
| - void CloseWriteFD() {
|
| - if (pipe_fd_[1] != -1) {
|
| - if (HANDLE_EINTR(close(pipe_fd_[1])) < 0)
|
| - PLOG(ERROR) << "close";
|
| - pipe_fd_[1] = -1;
|
| - }
|
| - }
|
| -
|
| - // Returns collected data.
|
| - std::string* data() { return &data_; }
|
| -
|
| - // Starts data collection. Returns true if stream was setup correctly.
|
| - // On success data will automatically be accumulated into a string that
|
| - // can be retrieved with PipeReader::data(). To shutdown collection delete
|
| - // the instance and/or use PipeReader::OnDataReady(-1).
|
| - bool StartIO() {
|
| - // Use a pipe to collect data
|
| - const int status = HANDLE_EINTR(pipe(pipe_fd_));
|
| - if (status < 0) {
|
| - PLOG(ERROR) << "pipe";
|
| - return false;
|
| - }
|
| - base::PlatformFile data_file_ = pipe_fd_[0]; // read side
|
| - data_stream_.reset(new net::FileStream(data_file_,
|
| - base::PLATFORM_FILE_READ | base::PLATFORM_FILE_ASYNC,
|
| - NULL));
|
| -
|
| - // Post an initial async read to setup data collection
|
| - int rv = data_stream_->Read(io_buffer_.get(), io_buffer_->size(),
|
| - base::Bind(&PipeReader::OnDataReady, weak_ptr_factory_.GetWeakPtr()));
|
| - if (rv != net::ERR_IO_PENDING) {
|
| - LOG(ERROR) << "Unable to post initial read";
|
| - return false;
|
| - }
|
| - return true;
|
| - }
|
| -
|
| - // Called when pipe data are available. Can also be used to shutdown
|
| - // data collection by passing -1 for |byte_count|.
|
| - void OnDataReady(int byte_count) {
|
| - DVLOG(1) << "OnDataReady byte_count " << byte_count;
|
| - if (byte_count <= 0) {
|
| - callback_.Run(); // signal creator to take data and delete us
|
| - return;
|
| - }
|
| - data_.append(io_buffer_->data(), byte_count);
|
| -
|
| - // Post another read
|
| - int rv = data_stream_->Read(io_buffer_.get(), io_buffer_->size(),
|
| - base::Bind(&PipeReader::OnDataReady, weak_ptr_factory_.GetWeakPtr()));
|
| - if (rv != net::ERR_IO_PENDING) {
|
| - LOG(ERROR) << "Unable to post another read";
|
| - // TODO(sleffler) do something more intelligent?
|
| - }
|
| - }
|
| -
|
| - private:
|
| - friend class base::RefCounted<PipeReader>;
|
| -
|
| - int pipe_fd_[2];
|
| - scoped_ptr<net::FileStream> data_stream_;
|
| - scoped_refptr<net::IOBufferWithSize> io_buffer_;
|
| - base::WeakPtrFactory<PipeReader> weak_ptr_factory_;
|
| - std::string data_;
|
| - IOCompleteCallback callback_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(PipeReader);
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -namespace chromeos {
|
| -
|
| -// The DebugDaemonClient implementation used in production.
|
| -class DebugDaemonClientImpl : public DebugDaemonClient {
|
| - public:
|
| - explicit DebugDaemonClientImpl(dbus::Bus* bus)
|
| - : debugdaemon_proxy_(NULL),
|
| - weak_ptr_factory_(this),
|
| - pipe_reader_(NULL) {
|
| - debugdaemon_proxy_ = bus->GetObjectProxy(
|
| - debugd::kDebugdServiceName,
|
| - dbus::ObjectPath(debugd::kDebugdServicePath));
|
| - }
|
| -
|
| - virtual ~DebugDaemonClientImpl() {}
|
| -
|
| - // DebugDaemonClient override.
|
| - virtual void StartSystemTracing() OVERRIDE {
|
| - dbus::MethodCall method_call(
|
| - debugd::kDebugdInterface,
|
| - debugd::kSystraceStart);
|
| - dbus::MessageWriter writer(&method_call);
|
| - writer.AppendString("all"); // TODO(sleffler) parameterize category list
|
| -
|
| - DVLOG(1) << "Requesting a systrace start";
|
| - debugdaemon_proxy_->CallMethod(
|
| - &method_call,
|
| - dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
|
| - base::Bind(&DebugDaemonClientImpl::OnStartSystemTracing,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| - }
|
| -
|
| - virtual bool RequestStopSystemTracing(const StopSystemTracingCallback&
|
| - callback) OVERRIDE {
|
| - if (pipe_reader_ != NULL) {
|
| - LOG(ERROR) << "Busy doing StopSystemTracing";
|
| - return false;
|
| - }
|
| -
|
| - pipe_reader_.reset(new PipeReader(
|
| - base::Bind(&DebugDaemonClientImpl::OnIOComplete,
|
| - weak_ptr_factory_.GetWeakPtr())));
|
| - int write_fd = -1;
|
| - if (!pipe_reader_->StartIO()) {
|
| - LOG(ERROR) << "Cannot create pipe reader";
|
| - // NB: continue anyway to shutdown tracing; toss trace data
|
| - write_fd = HANDLE_EINTR(open("/dev/null", O_WRONLY));
|
| - // TODO(sleffler) if this fails AppendFileDescriptor will abort
|
| - } else {
|
| - write_fd = pipe_reader_->GetWriteFD();
|
| - }
|
| -
|
| - DCHECK(callback.is_null());
|
| - callback_ = callback;
|
| -
|
| - // Issue the dbus request to stop system tracing
|
| - dbus::MethodCall method_call(
|
| - debugd::kDebugdInterface,
|
| - debugd::kSystraceStop);
|
| - dbus::MessageWriter writer(&method_call);
|
| - dbus::FileDescriptor temp(write_fd); // NB: explicit temp for C++98
|
| - writer.AppendFileDescriptor(temp);
|
| -
|
| - DVLOG(1) << "Requesting a systrace stop";
|
| - debugdaemon_proxy_->CallMethod(
|
| - &method_call,
|
| - dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
|
| - base::Bind(&DebugDaemonClientImpl::OnRequestStopSystemTracing,
|
| - weak_ptr_factory_.GetWeakPtr()));
|
| -
|
| - pipe_reader_->CloseWriteFD(); // close our copy of fd after send
|
| -
|
| - return true;
|
| - }
|
| -
|
| - private:
|
| - // Called when a response for StartSystemTracing() is received.
|
| - void OnStartSystemTracing(dbus::Response* response) {
|
| - if (!response) {
|
| - LOG(ERROR) << "Failed to request systrace start";
|
| - return;
|
| - }
|
| - }
|
| -
|
| - // Called when a response for RequestStopSystemTracing() is received.
|
| - void OnRequestStopSystemTracing(dbus::Response* response) {
|
| - if (!response) {
|
| - LOG(ERROR) << "Failed to request systrace stop";
|
| - pipe_reader_->OnDataReady(-1); // terminate data stream
|
| - }
|
| - // NB: requester is signaled when i/o completes
|
| - }
|
| -
|
| - // Called when pipe i/o completes; pass data on and delete the instance.
|
| - void OnIOComplete() {
|
| - callback_.Run(base::RefCountedString::TakeString(pipe_reader_->data()));
|
| - pipe_reader_.reset();
|
| - }
|
| -
|
| - dbus::ObjectProxy* debugdaemon_proxy_;
|
| - base::WeakPtrFactory<DebugDaemonClientImpl> weak_ptr_factory_;
|
| - scoped_ptr<PipeReader> pipe_reader_;
|
| - StopSystemTracingCallback callback_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(DebugDaemonClientImpl);
|
| -};
|
| -
|
| -// The DebugDaemonClient implementation used on Linux desktop,
|
| -// which does nothing.
|
| -class DebugDaemonClientStubImpl : public DebugDaemonClient {
|
| - // DebugDaemonClient overrides.
|
| - virtual void StartSystemTracing() OVERRIDE {}
|
| - virtual bool RequestStopSystemTracing(const StopSystemTracingCallback&
|
| - callback) OVERRIDE {
|
| - std::string no_data;
|
| - callback.Run(base::RefCountedString::TakeString(&no_data));
|
| - return true;
|
| - }
|
| -};
|
| -
|
| -DebugDaemonClient::DebugDaemonClient() {
|
| -}
|
| -
|
| -DebugDaemonClient::~DebugDaemonClient() {
|
| -}
|
| -
|
| -// static
|
| -DebugDaemonClient::StopSystemTracingCallback
|
| -DebugDaemonClient::EmptyStopSystemTracingCallback() {
|
| - return base::Bind(&EmptyStopSystemTracingCallbackBody);
|
| -}
|
| -
|
| -// static
|
| -DebugDaemonClient* DebugDaemonClient::Create(DBusClientImplementationType type,
|
| - dbus::Bus* bus) {
|
| - if (type == REAL_DBUS_CLIENT_IMPLEMENTATION)
|
| - return new DebugDaemonClientImpl(bus);
|
| - DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type);
|
| - return new DebugDaemonClientStubImpl();
|
| -}
|
| -
|
| -} // namespace chromeos
|
|
|