| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 | 4 |
| 5 #include "chromeos/dbus/debug_daemon_client.h" | 5 #include "chromeos/dbus/debug_daemon_client.h" |
| 6 | 6 |
| 7 #include <fcntl.h> | 7 #include <fcntl.h> |
| 8 #include <unistd.h> | 8 #include <unistd.h> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <vector> | 10 #include <vector> |
| 11 | 11 |
| 12 #include "base/bind.h" | 12 #include "base/bind.h" |
| 13 #include "base/bind_helpers.h" | 13 #include "base/bind_helpers.h" |
| 14 #include "base/files/file_path.h" | 14 #include "base/files/file_path.h" |
| 15 #include "base/location.h" | 15 #include "base/location.h" |
| 16 #include "base/message_loop/message_loop.h" | 16 #include "base/message_loop/message_loop.h" |
| 17 #include "base/posix/eintr_wrapper.h" | 17 #include "base/posix/eintr_wrapper.h" |
| 18 #include "base/strings/string_util.h" | 18 #include "base/strings/string_util.h" |
| 19 #include "base/task_runner_util.h" | 19 #include "base/task_runner_util.h" |
| 20 #include "chromeos/dbus/pipe_reader.h" | 20 #include "chromeos/dbus/pipe_reader.h" |
| 21 #include "dbus/bus.h" | 21 #include "dbus/bus.h" |
| 22 #include "dbus/message.h" | 22 #include "dbus/message.h" |
| 23 #include "dbus/object_path.h" | 23 #include "dbus/object_path.h" |
| 24 #include "dbus/object_proxy.h" | 24 #include "dbus/object_proxy.h" |
| 25 | 25 |
| 26 namespace { | 26 namespace { |
| 27 | 27 |
| 28 // Used in DebugDaemonClient::EmptySystemStopTracingCallback(). | 28 // Used in DebugDaemonClient::EmptyStopAgentTracingCallback(). |
| 29 void EmptyStopSystemTracingCallbackBody( | 29 void EmptyStopAgentTracingCallbackBody( |
| 30 const scoped_refptr<base::RefCountedString>& unused_result) { | 30 const std::string& agent_name, |
| 31 } | 31 const scoped_refptr<base::RefCountedString>& unused_result) {} |
| 32 | 32 |
| 33 } // namespace | 33 } // namespace |
| 34 | 34 |
| 35 namespace chromeos { | 35 namespace chromeos { |
| 36 | 36 |
| 37 // The DebugDaemonClient implementation used in production. | 37 // The DebugDaemonClient implementation used in production. |
| 38 class DebugDaemonClientImpl : public DebugDaemonClient { | 38 class DebugDaemonClientImpl : public DebugDaemonClient { |
| 39 public: | 39 public: |
| 40 DebugDaemonClientImpl() : debugdaemon_proxy_(NULL), weak_ptr_factory_(this) {} | 40 DebugDaemonClientImpl() : debugdaemon_proxy_(NULL), weak_ptr_factory_(this) {} |
| 41 | 41 |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 187 dbus::MethodCall method_call(debugd::kDebugdInterface, | 187 dbus::MethodCall method_call(debugd::kDebugdInterface, |
| 188 debugd::kGetUserLogFiles); | 188 debugd::kGetUserLogFiles); |
| 189 debugdaemon_proxy_->CallMethod( | 189 debugdaemon_proxy_->CallMethod( |
| 190 &method_call, | 190 &method_call, |
| 191 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, | 191 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, |
| 192 base::Bind(&DebugDaemonClientImpl::OnGetUserLogFiles, | 192 base::Bind(&DebugDaemonClientImpl::OnGetUserLogFiles, |
| 193 weak_ptr_factory_.GetWeakPtr(), | 193 weak_ptr_factory_.GetWeakPtr(), |
| 194 callback)); | 194 callback)); |
| 195 } | 195 } |
| 196 | 196 |
| 197 void StartSystemTracing() override { | 197 std::string GetTracingAgentName() override { return kCrOSTracingAgentName; } |
| 198 |
| 199 bool StartAgentTracing( |
| 200 const base::trace_event::TraceConfig& trace_config) override { |
| 198 dbus::MethodCall method_call( | 201 dbus::MethodCall method_call( |
| 199 debugd::kDebugdInterface, | 202 debugd::kDebugdInterface, |
| 200 debugd::kSystraceStart); | 203 debugd::kSystraceStart); |
| 201 dbus::MessageWriter writer(&method_call); | 204 dbus::MessageWriter writer(&method_call); |
| 202 writer.AppendString("all"); // TODO(sleffler) parameterize category list | 205 writer.AppendString("all"); // TODO(sleffler) parameterize category list |
| 203 | 206 |
| 204 DVLOG(1) << "Requesting a systrace start"; | 207 DVLOG(1) << "Requesting a systrace start"; |
| 205 debugdaemon_proxy_->CallMethod( | 208 debugdaemon_proxy_->CallMethod( |
| 206 &method_call, | 209 &method_call, |
| 207 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, | 210 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, |
| 208 base::Bind(&DebugDaemonClientImpl::OnStartMethod, | 211 base::Bind(&DebugDaemonClientImpl::OnStartMethod, |
| 209 weak_ptr_factory_.GetWeakPtr())); | 212 weak_ptr_factory_.GetWeakPtr())); |
| 213 return true; |
| 210 } | 214 } |
| 211 | 215 |
| 212 bool RequestStopSystemTracing( | 216 void StopAgentTracing(const StopAgentTracingCallback& callback) override { |
| 213 scoped_refptr<base::TaskRunner> task_runner, | 217 DCHECK(stop_agent_tracing_task_runner_); |
| 214 const StopSystemTracingCallback& callback) override { | |
| 215 if (pipe_reader_ != NULL) { | 218 if (pipe_reader_ != NULL) { |
| 216 LOG(ERROR) << "Busy doing StopSystemTracing"; | 219 LOG(ERROR) << "Busy doing StopSystemTracing"; |
| 217 return false; | 220 return; |
| 218 } | 221 } |
| 219 | 222 |
| 220 pipe_reader_.reset(new PipeReaderForString( | 223 pipe_reader_.reset( |
| 221 task_runner, | 224 new PipeReaderForString(stop_agent_tracing_task_runner_, |
| 222 base::Bind(&DebugDaemonClientImpl::OnIOComplete, | 225 base::Bind(&DebugDaemonClientImpl::OnIOComplete, |
| 223 weak_ptr_factory_.GetWeakPtr()))); | 226 weak_ptr_factory_.GetWeakPtr()))); |
| 224 | 227 |
| 225 base::File pipe_write_end = pipe_reader_->StartIO(); | 228 base::File pipe_write_end = pipe_reader_->StartIO(); |
| 226 // Create dbus::FileDescriptor on the worker thread; on return we'll | 229 // Create dbus::FileDescriptor on the worker thread; on return we'll |
| 227 // issue the D-Bus request to stop tracing and collect results. | 230 // issue the D-Bus request to stop tracing and collect results. |
| 228 base::PostTaskAndReplyWithResult( | 231 base::PostTaskAndReplyWithResult( |
| 229 task_runner.get(), | 232 stop_agent_tracing_task_runner_.get(), FROM_HERE, |
| 230 FROM_HERE, | |
| 231 base::Bind( | 233 base::Bind( |
| 232 &DebugDaemonClientImpl::CreateFileDescriptorToStopSystemTracing, | 234 &DebugDaemonClientImpl::CreateFileDescriptorToStopSystemTracing, |
| 233 base::Passed(&pipe_write_end)), | 235 base::Passed(&pipe_write_end)), |
| 234 base::Bind( | 236 base::Bind( |
| 235 &DebugDaemonClientImpl::OnCreateFileDescriptorRequestStopSystem, | 237 &DebugDaemonClientImpl::OnCreateFileDescriptorRequestStopSystem, |
| 236 weak_ptr_factory_.GetWeakPtr(), | 238 weak_ptr_factory_.GetWeakPtr(), callback)); |
| 237 callback)); | 239 } |
| 238 return true; | 240 |
| 241 bool SupportsExplicitClockSync() override { return false; } |
| 242 |
| 243 void RecordClockSyncMarker( |
| 244 scoped_ptr<base::DictionaryValue> marker) override { |
| 245 DCHECK(SupportsExplicitClockSync()); |
| 246 } |
| 247 |
| 248 void IssueClockSyncMarker() override { DCHECK(SupportsExplicitClockSync()); } |
| 249 |
| 250 void SetStopAgentTracingTaskRunner( |
| 251 scoped_refptr<base::TaskRunner> task_runner) override { |
| 252 stop_agent_tracing_task_runner_ = task_runner; |
| 239 } | 253 } |
| 240 | 254 |
| 241 void TestICMP(const std::string& ip_address, | 255 void TestICMP(const std::string& ip_address, |
| 242 const TestICMPCallback& callback) override { | 256 const TestICMPCallback& callback) override { |
| 243 dbus::MethodCall method_call(debugd::kDebugdInterface, | 257 dbus::MethodCall method_call(debugd::kDebugdInterface, |
| 244 debugd::kTestICMP); | 258 debugd::kTestICMP); |
| 245 dbus::MessageWriter writer(&method_call); | 259 dbus::MessageWriter writer(&method_call); |
| 246 writer.AppendString(ip_address); | 260 writer.AppendString(ip_address); |
| 247 debugdaemon_proxy_->CallMethod( | 261 debugdaemon_proxy_->CallMethod( |
| 248 &method_call, | 262 &method_call, |
| (...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 550 // TODO(sleffler) if this fails AppendFileDescriptor will abort | 564 // TODO(sleffler) if this fails AppendFileDescriptor will abort |
| 551 } | 565 } |
| 552 scoped_ptr<dbus::FileDescriptor> file_descriptor(new dbus::FileDescriptor); | 566 scoped_ptr<dbus::FileDescriptor> file_descriptor(new dbus::FileDescriptor); |
| 553 file_descriptor->PutValue(pipe_write_end.TakePlatformFile()); | 567 file_descriptor->PutValue(pipe_write_end.TakePlatformFile()); |
| 554 file_descriptor->CheckValidity(); | 568 file_descriptor->CheckValidity(); |
| 555 return file_descriptor.Pass(); | 569 return file_descriptor.Pass(); |
| 556 } | 570 } |
| 557 | 571 |
| 558 // Called when a CheckValidity response is received. | 572 // Called when a CheckValidity response is received. |
| 559 void OnCreateFileDescriptorRequestStopSystem( | 573 void OnCreateFileDescriptorRequestStopSystem( |
| 560 const StopSystemTracingCallback& callback, | 574 const StopAgentTracingCallback& callback, |
| 561 scoped_ptr<dbus::FileDescriptor> file_descriptor) { | 575 scoped_ptr<dbus::FileDescriptor> file_descriptor) { |
| 562 DCHECK(file_descriptor); | 576 DCHECK(file_descriptor); |
| 563 | 577 |
| 564 // Issue the dbus request to stop system tracing | 578 // Issue the dbus request to stop system tracing |
| 565 dbus::MethodCall method_call( | 579 dbus::MethodCall method_call( |
| 566 debugd::kDebugdInterface, | 580 debugd::kDebugdInterface, |
| 567 debugd::kSystraceStop); | 581 debugd::kSystraceStop); |
| 568 dbus::MessageWriter writer(&method_call); | 582 dbus::MessageWriter writer(&method_call); |
| 569 writer.AppendFileDescriptor(*file_descriptor); | 583 writer.AppendFileDescriptor(*file_descriptor); |
| 570 | 584 |
| 571 callback_ = callback; | 585 callback_ = callback; |
| 572 | 586 |
| 573 DVLOG(1) << "Requesting a systrace stop"; | 587 DVLOG(1) << "Requesting a systrace stop"; |
| 574 debugdaemon_proxy_->CallMethod( | 588 debugdaemon_proxy_->CallMethod( |
| 575 &method_call, | 589 &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, |
| 576 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, | 590 base::Bind(&DebugDaemonClientImpl::OnStopAgentTracing, |
| 577 base::Bind(&DebugDaemonClientImpl::OnRequestStopSystemTracing, | |
| 578 weak_ptr_factory_.GetWeakPtr())); | 591 weak_ptr_factory_.GetWeakPtr())); |
| 579 } | 592 } |
| 580 | 593 |
| 581 // Called when a response for RequestStopSystemTracing() is received. | 594 // Called when a response for StopAgentTracing() is received. |
| 582 void OnRequestStopSystemTracing(dbus::Response* response) { | 595 void OnStopAgentTracing(dbus::Response* response) { |
| 583 if (!response) { | 596 if (!response) { |
| 584 LOG(ERROR) << "Failed to request systrace stop"; | 597 LOG(ERROR) << "Failed to request systrace stop"; |
| 585 // If debugd crashes or completes I/O before this message is processed | 598 // If debugd crashes or completes I/O before this message is processed |
| 586 // then pipe_reader_ can be NULL, see OnIOComplete(). | 599 // then pipe_reader_ can be NULL, see OnIOComplete(). |
| 587 if (pipe_reader_.get()) | 600 if (pipe_reader_.get()) |
| 588 pipe_reader_->OnDataReady(-1); // terminate data stream | 601 pipe_reader_->OnDataReady(-1); // terminate data stream |
| 589 } | 602 } |
| 590 // NB: requester is signaled when i/o completes | 603 // NB: requester is signaled when i/o completes |
| 591 } | 604 } |
| 592 | 605 |
| 593 void OnTestICMP(const TestICMPCallback& callback, dbus::Response* response) { | 606 void OnTestICMP(const TestICMPCallback& callback, dbus::Response* response) { |
| 594 std::string status; | 607 std::string status; |
| 595 if (response && dbus::MessageReader(response).PopString(&status)) | 608 if (response && dbus::MessageReader(response).PopString(&status)) |
| 596 callback.Run(true, status); | 609 callback.Run(true, status); |
| 597 else | 610 else |
| 598 callback.Run(false, ""); | 611 callback.Run(false, ""); |
| 599 } | 612 } |
| 600 | 613 |
| 601 // Called when pipe i/o completes; pass data on and delete the instance. | 614 // Called when pipe i/o completes; pass data on and delete the instance. |
| 602 void OnIOComplete() { | 615 void OnIOComplete() { |
| 603 std::string pipe_data; | 616 std::string pipe_data; |
| 604 pipe_reader_->GetData(&pipe_data); | 617 pipe_reader_->GetData(&pipe_data); |
| 605 callback_.Run(base::RefCountedString::TakeString(&pipe_data)); | 618 callback_.Run(GetTracingAgentName(), |
| 619 base::RefCountedString::TakeString(&pipe_data)); |
| 606 pipe_reader_.reset(); | 620 pipe_reader_.reset(); |
| 607 } | 621 } |
| 608 | 622 |
| 609 dbus::ObjectProxy* debugdaemon_proxy_; | 623 dbus::ObjectProxy* debugdaemon_proxy_; |
| 610 scoped_ptr<PipeReaderForString> pipe_reader_; | 624 scoped_ptr<PipeReaderForString> pipe_reader_; |
| 611 StopSystemTracingCallback callback_; | 625 StopAgentTracingCallback callback_; |
| 626 scoped_refptr<base::TaskRunner> stop_agent_tracing_task_runner_; |
| 612 base::WeakPtrFactory<DebugDaemonClientImpl> weak_ptr_factory_; | 627 base::WeakPtrFactory<DebugDaemonClientImpl> weak_ptr_factory_; |
| 613 | 628 |
| 614 DISALLOW_COPY_AND_ASSIGN(DebugDaemonClientImpl); | 629 DISALLOW_COPY_AND_ASSIGN(DebugDaemonClientImpl); |
| 615 }; | 630 }; |
| 616 | 631 |
| 617 DebugDaemonClient::DebugDaemonClient() { | 632 DebugDaemonClient::DebugDaemonClient() { |
| 618 } | 633 } |
| 619 | 634 |
| 620 DebugDaemonClient::~DebugDaemonClient() { | 635 DebugDaemonClient::~DebugDaemonClient() { |
| 621 } | 636 } |
| 622 | 637 |
| 623 // static | 638 // static |
| 624 DebugDaemonClient::StopSystemTracingCallback | 639 DebugDaemonClient::StopAgentTracingCallback |
| 625 DebugDaemonClient::EmptyStopSystemTracingCallback() { | 640 DebugDaemonClient::EmptyStopAgentTracingCallback() { |
| 626 return base::Bind(&EmptyStopSystemTracingCallbackBody); | 641 return base::Bind(&EmptyStopAgentTracingCallbackBody); |
| 627 } | 642 } |
| 628 | 643 |
| 629 // static | 644 // static |
| 630 DebugDaemonClient* DebugDaemonClient::Create() { | 645 DebugDaemonClient* DebugDaemonClient::Create() { |
| 631 return new DebugDaemonClientImpl(); | 646 return new DebugDaemonClientImpl(); |
| 632 } | 647 } |
| 633 | 648 |
| 634 } // namespace chromeos | 649 } // namespace chromeos |
| OLD | NEW |