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