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 "dbus/bus.h" | 5 #include "dbus/bus.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
322 } else if (dbus_message_get_type(response_message) == | 322 } else if (dbus_message_get_type(response_message) == |
323 DBUS_MESSAGE_TYPE_ERROR) { | 323 DBUS_MESSAGE_TYPE_ERROR) { |
324 // This will take |response_message| and release (unref) it. | 324 // This will take |response_message| and release (unref) it. |
325 scoped_ptr<ErrorResponse> error_response( | 325 scoped_ptr<ErrorResponse> error_response( |
326 ErrorResponse::FromRawMessage(response_message)); | 326 ErrorResponse::FromRawMessage(response_message)); |
327 error_callback.Run(error_response.get()); | 327 error_callback.Run(error_response.get()); |
328 // Delete the message on the D-Bus thread. See below for why. | 328 // Delete the message on the D-Bus thread. See below for why. |
329 bus_->GetDBusTaskRunner()->PostTask( | 329 bus_->GetDBusTaskRunner()->PostTask( |
330 FROM_HERE, | 330 FROM_HERE, |
331 base::Bind(&base::DeletePointer<ErrorResponse>, | 331 base::Bind(&base::DeletePointer<ErrorResponse>, |
332 error_response.release())); | 332 base::Passed(&error_response))); |
333 } else { | 333 } else { |
334 // This will take |response_message| and release (unref) it. | 334 // This will take |response_message| and release (unref) it. |
335 scoped_ptr<Response> response(Response::FromRawMessage(response_message)); | 335 scoped_ptr<Response> response(Response::FromRawMessage(response_message)); |
336 // The response is successfully received. | 336 // The response is successfully received. |
337 response_callback.Run(response.get()); | 337 response_callback.Run(response.get()); |
338 // The message should be deleted on the D-Bus thread for a complicated | 338 // The message should be deleted on the D-Bus thread for a complicated |
339 // reason: | 339 // reason: |
340 // | 340 // |
341 // libdbus keeps track of the number of bytes in the incoming message | 341 // libdbus keeps track of the number of bytes in the incoming message |
342 // queue to ensure that the data size in the queue is manageable. The | 342 // queue to ensure that the data size in the queue is manageable. The |
343 // bookkeeping is partly done via dbus_message_unref(), and immediately | 343 // bookkeeping is partly done via dbus_message_unref(), and immediately |
344 // asks the client code (Chrome) to stop monitoring the underlying | 344 // asks the client code (Chrome) to stop monitoring the underlying |
345 // socket, if the number of bytes exceeds a certian number, which is set | 345 // socket, if the number of bytes exceeds a certian number, which is set |
346 // to 63MB, per dbus-transport.cc: | 346 // to 63MB, per dbus-transport.cc: |
347 // | 347 // |
348 // /* Try to default to something that won't totally hose the system, | 348 // /* Try to default to something that won't totally hose the system, |
349 // * but doesn't impose too much of a limitation. | 349 // * but doesn't impose too much of a limitation. |
350 // */ | 350 // */ |
351 // transport->max_live_messages_size = _DBUS_ONE_MEGABYTE * 63; | 351 // transport->max_live_messages_size = _DBUS_ONE_MEGABYTE * 63; |
352 // | 352 // |
353 // The monitoring of the socket is done on the D-Bus thread (see Watch | 353 // The monitoring of the socket is done on the D-Bus thread (see Watch |
354 // class in bus.cc), hence we should stop the monitoring from D-Bus | 354 // class in bus.cc), hence we should stop the monitoring from D-Bus |
355 // thread, not from the current thread here, which is likely UI thread. | 355 // thread, not from the current thread here, which is likely UI thread. |
356 bus_->GetDBusTaskRunner()->PostTask( | 356 bus_->GetDBusTaskRunner()->PostTask( |
357 FROM_HERE, | 357 FROM_HERE, |
358 base::Bind(&base::DeletePointer<Response>, response.release())); | 358 base::Bind(&base::DeletePointer<Response>, base::Passed(&response))); |
359 | 359 |
360 method_call_successful = true; | 360 method_call_successful = true; |
361 // Record time spent for the method call. Don't include failures. | 361 // Record time spent for the method call. Don't include failures. |
362 UMA_HISTOGRAM_TIMES("DBus.AsyncMethodCallTime", | 362 UMA_HISTOGRAM_TIMES("DBus.AsyncMethodCallTime", |
363 base::TimeTicks::Now() - start_time); | 363 base::TimeTicks::Now() - start_time); |
364 } | 364 } |
365 // Record if the method call is successful, or not. 1 if successful. | 365 // Record if the method call is successful, or not. 1 if successful. |
366 UMA_HISTOGRAM_ENUMERATION("DBus.AsyncMethodCallSuccess", | 366 UMA_HISTOGRAM_ENUMERATION("DBus.AsyncMethodCallSuccess", |
367 method_call_successful, | 367 method_call_successful, |
368 kSuccessRatioHistogramMaxValue); | 368 kSuccessRatioHistogramMaxValue); |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
499 LOG(ERROR) << "Rejecting a message from a wrong sender."; | 499 LOG(ERROR) << "Rejecting a message from a wrong sender."; |
500 UMA_HISTOGRAM_COUNTS("DBus.RejectedSignalCount", 1); | 500 UMA_HISTOGRAM_COUNTS("DBus.RejectedSignalCount", 1); |
501 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; | 501 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; |
502 } | 502 } |
503 | 503 |
504 const base::TimeTicks start_time = base::TimeTicks::Now(); | 504 const base::TimeTicks start_time = base::TimeTicks::Now(); |
505 if (bus_->HasDBusThread()) { | 505 if (bus_->HasDBusThread()) { |
506 // Post a task to run the method in the origin thread. | 506 // Post a task to run the method in the origin thread. |
507 // Transfer the ownership of |signal| to RunMethod(). | 507 // Transfer the ownership of |signal| to RunMethod(). |
508 // |released_signal| will be deleted in RunMethod(). | 508 // |released_signal| will be deleted in RunMethod(). |
509 Signal* released_signal = signal.release(); | |
510 bus_->GetOriginTaskRunner()->PostTask(FROM_HERE, | 509 bus_->GetOriginTaskRunner()->PostTask(FROM_HERE, |
511 base::Bind(&ObjectProxy::RunMethod, | 510 base::Bind(&ObjectProxy::RunMethod, |
512 this, | 511 this, |
513 start_time, | 512 start_time, |
514 iter->second, | 513 iter->second, |
515 released_signal)); | 514 base::Passed(&signal))); |
516 } else { | 515 } else { |
517 const base::TimeTicks start_time = base::TimeTicks::Now(); | 516 const base::TimeTicks start_time = base::TimeTicks::Now(); |
518 // If the D-Bus thread is not used, just call the callback on the | 517 // If the D-Bus thread is not used, just call the callback on the |
519 // current thread. Transfer the ownership of |signal| to RunMethod(). | 518 // current thread. Transfer the ownership of |signal| to RunMethod(). |
520 Signal* released_signal = signal.release(); | 519 RunMethod(start_time, iter->second, signal.Pass()); |
521 RunMethod(start_time, iter->second, released_signal); | |
522 } | 520 } |
523 | 521 |
524 // We don't return DBUS_HANDLER_RESULT_HANDLED for signals because other | 522 // We don't return DBUS_HANDLER_RESULT_HANDLED for signals because other |
525 // objects may be interested in them. (e.g. Signals from org.freedesktop.DBus) | 523 // objects may be interested in them. (e.g. Signals from org.freedesktop.DBus) |
526 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; | 524 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; |
527 } | 525 } |
528 | 526 |
529 void ObjectProxy::RunMethod(base::TimeTicks start_time, | 527 void ObjectProxy::RunMethod(base::TimeTicks start_time, |
530 std::vector<SignalCallback> signal_callbacks, | 528 std::vector<SignalCallback> signal_callbacks, |
531 Signal* signal) { | 529 scoped_ptr<Signal> signal) { |
532 bus_->AssertOnOriginThread(); | 530 bus_->AssertOnOriginThread(); |
533 | 531 |
534 for (std::vector<SignalCallback>::iterator iter = signal_callbacks.begin(); | 532 for (std::vector<SignalCallback>::iterator iter = signal_callbacks.begin(); |
535 iter != signal_callbacks.end(); ++iter) | 533 iter != signal_callbacks.end(); ++iter) |
536 iter->Run(signal); | 534 iter->Run(signal.get()); |
537 | 535 |
538 // Delete the message on the D-Bus thread. See comments in | 536 // Delete the message on the D-Bus thread. See comments in |
539 // RunResponseCallback(). | 537 // RunResponseCallback(). |
540 bus_->GetDBusTaskRunner()->PostTask( | 538 bus_->GetDBusTaskRunner()->PostTask( |
541 FROM_HERE, | 539 FROM_HERE, |
542 base::Bind(&base::DeletePointer<Signal>, signal)); | 540 base::Bind(&base::DeletePointer<Signal>, base::Passed(&signal))); |
543 | 541 |
544 // Record time spent for handling the signal. | 542 // Record time spent for handling the signal. |
545 UMA_HISTOGRAM_TIMES("DBus.SignalHandleTime", | 543 UMA_HISTOGRAM_TIMES("DBus.SignalHandleTime", |
546 base::TimeTicks::Now() - start_time); | 544 base::TimeTicks::Now() - start_time); |
547 } | 545 } |
548 | 546 |
549 DBusHandlerResult ObjectProxy::HandleMessageThunk( | 547 DBusHandlerResult ObjectProxy::HandleMessageThunk( |
550 DBusConnection* connection, | 548 DBusConnection* connection, |
551 DBusMessage* raw_message, | 549 DBusMessage* raw_message, |
552 void* user_data) { | 550 void* user_data) { |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
700 bool service_is_available) { | 698 bool service_is_available) { |
701 bus_->AssertOnOriginThread(); | 699 bus_->AssertOnOriginThread(); |
702 | 700 |
703 std::vector<WaitForServiceToBeAvailableCallback> callbacks; | 701 std::vector<WaitForServiceToBeAvailableCallback> callbacks; |
704 callbacks.swap(wait_for_service_to_be_available_callbacks_); | 702 callbacks.swap(wait_for_service_to_be_available_callbacks_); |
705 for (size_t i = 0; i < callbacks.size(); ++i) | 703 for (size_t i = 0; i < callbacks.size(); ++i) |
706 callbacks[i].Run(service_is_available); | 704 callbacks[i].Run(service_is_available); |
707 } | 705 } |
708 | 706 |
709 } // namespace dbus | 707 } // namespace dbus |
OLD | NEW |