Index: device/bluetooth/dbus/dbus_thread_manager_linux.cc |
diff --git a/device/bluetooth/dbus/dbus_thread_manager_linux.cc b/device/bluetooth/dbus/dbus_thread_manager_linux.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..adffe9b746a97bc3da48503b256e0bf45cb3941a |
--- /dev/null |
+++ b/device/bluetooth/dbus/dbus_thread_manager_linux.cc |
@@ -0,0 +1,72 @@ |
+// 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 "device/bluetooth/dbus/dbus_thread_manager_linux.h" |
+ |
+#include "base/threading/thread.h" |
+#include "dbus/bus.h" |
+ |
+namespace bluez { |
+ |
+static DBusThreadManagerLinux* g_linux_dbus_manager = NULL; |
+ |
+DBusThreadManagerLinux::DBusThreadManagerLinux() { |
+ base::Thread::Options thread_options; |
+ thread_options.message_loop_type = base::MessageLoop::TYPE_IO; |
+ dbus_thread_.reset(new base::Thread("D-Bus thread")); |
+ dbus_thread_->StartWithOptions(thread_options); |
+ |
+ // Create the connection to the system bus. |
+ dbus::Bus::Options system_bus_options; |
+ system_bus_options.bus_type = dbus::Bus::SYSTEM; |
+ system_bus_options.connection_type = dbus::Bus::PRIVATE; |
+ system_bus_options.dbus_task_runner = dbus_thread_->task_runner(); |
+ system_bus_ = new dbus::Bus(system_bus_options); |
+} |
+ |
+DBusThreadManagerLinux::~DBusThreadManagerLinux() { |
+ // Shut down the bus. During the browser shutdown, it's ok to shut down |
+ // the bus synchronously. |
+ if (system_bus_.get()) |
+ system_bus_->ShutdownOnDBusThreadAndBlock(); |
+ |
+ // Stop the D-Bus thread. |
+ if (dbus_thread_) |
+ dbus_thread_->Stop(); |
+ |
+ if (!g_linux_dbus_manager) |
+ return; // Called form Shutdown() or local test instance. |
+ |
+ // There should never be both a global instance and a local instance. |
+ CHECK(this == g_linux_dbus_manager); |
+} |
+ |
+dbus::Bus* DBusThreadManagerLinux::GetSystemBus() { |
+ return system_bus_.get(); |
+} |
+ |
+// static |
+void DBusThreadManagerLinux::Initialize() { |
+ CHECK(!g_linux_dbus_manager); |
+ g_linux_dbus_manager = new DBusThreadManagerLinux(); |
+} |
+ |
+// static |
+void DBusThreadManagerLinux::Shutdown() { |
+ // Ensure that we only shutdown LinuxDBusManager once. |
+ CHECK(g_linux_dbus_manager); |
+ DBusThreadManagerLinux* dbus_thread_manager = g_linux_dbus_manager; |
+ g_linux_dbus_manager = NULL; |
+ delete dbus_thread_manager; |
+ VLOG(1) << "LinuxDBusManager Shutdown completed"; |
+} |
+ |
+// static |
+DBusThreadManagerLinux* DBusThreadManagerLinux::Get() { |
+ CHECK(g_linux_dbus_manager) |
+ << "LinuxDBusManager::Get() called before Initialize()"; |
+ return g_linux_dbus_manager; |
+} |
+ |
+} // namespace bluez |