Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(118)

Side by Side Diff: device/bluetooth/bluetooth_adapter_chromeos.cc

Issue 848613003: bluetooth: Shutdown BluetoothAdapter before DBus on ChromeOS. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@lkcr
Patch Set: Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "device/bluetooth/bluetooth_adapter_chromeos.h" 5 #include "device/bluetooth/bluetooth_adapter_chromeos.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/location.h" 10 #include "base/location.h"
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
65 } 65 }
66 66
67 namespace chromeos { 67 namespace chromeos {
68 68
69 // static 69 // static
70 base::WeakPtr<BluetoothAdapter> BluetoothAdapterChromeOS::CreateAdapter() { 70 base::WeakPtr<BluetoothAdapter> BluetoothAdapterChromeOS::CreateAdapter() {
71 BluetoothAdapterChromeOS* adapter = new BluetoothAdapterChromeOS(); 71 BluetoothAdapterChromeOS* adapter = new BluetoothAdapterChromeOS();
72 return adapter->weak_ptr_factory_.GetWeakPtr(); 72 return adapter->weak_ptr_factory_.GetWeakPtr();
73 } 73 }
74 74
75 void BluetoothAdapterChromeOS::Shutdown() {
76 if (is_shutdown_)
77 return;
78 is_shutdown_ = true;
armansito 2015/01/14 20:49:04 Here I would explicitly set present as false or at
scheib 2015/01/14 23:07:27 Done: reworked to call RemoveAdapter().
79 DCHECK(DBusThreadManager::IsInitialized())
80 << "Call BluetoothAdapterFactory::Shutdown() before "
81 "DBusThreadManager::Shutdown().";
82 DBusThreadManager::Get()->GetBluetoothAdapterClient()->RemoveObserver(this);
83 DBusThreadManager::Get()->GetBluetoothDeviceClient()->RemoveObserver(this);
84 DBusThreadManager::Get()->GetBluetoothInputClient()->RemoveObserver(this);
85
86 VLOG(1) << "Unregistering pairing agent";
87 DBusThreadManager::Get()->GetBluetoothAgentManagerClient()->UnregisterAgent(
88 dbus::ObjectPath(kAgentPath), base::Bind(&base::DoNothing),
89 base::Bind(&OnUnregisterAgentError));
90
91 agent_.reset();
92 STLDeleteValues(&devices_);
93 }
94
75 BluetoothAdapterChromeOS::BluetoothAdapterChromeOS() 95 BluetoothAdapterChromeOS::BluetoothAdapterChromeOS()
76 : num_discovery_sessions_(0), 96 : is_shutdown_(false),
97 num_discovery_sessions_(0),
77 discovery_request_pending_(false), 98 discovery_request_pending_(false),
78 weak_ptr_factory_(this) { 99 weak_ptr_factory_(this) {
79 ui_task_runner_ = base::ThreadTaskRunnerHandle::Get(); 100 ui_task_runner_ = base::ThreadTaskRunnerHandle::Get();
80 socket_thread_ = device::BluetoothSocketThread::Get(); 101 socket_thread_ = device::BluetoothSocketThread::Get();
81 102
82 DBusThreadManager::Get()->GetBluetoothAdapterClient()->AddObserver(this); 103 DBusThreadManager::Get()->GetBluetoothAdapterClient()->AddObserver(this);
83 DBusThreadManager::Get()->GetBluetoothDeviceClient()->AddObserver(this); 104 DBusThreadManager::Get()->GetBluetoothDeviceClient()->AddObserver(this);
84 DBusThreadManager::Get()->GetBluetoothInputClient()->AddObserver(this); 105 DBusThreadManager::Get()->GetBluetoothInputClient()->AddObserver(this);
85 106
86 // Register the pairing agent. 107 // Register the pairing agent.
87 dbus::Bus* system_bus = DBusThreadManager::Get()->GetSystemBus(); 108 dbus::Bus* system_bus = DBusThreadManager::Get()->GetSystemBus();
88 agent_.reset(BluetoothAgentServiceProvider::Create( 109 agent_.reset(BluetoothAgentServiceProvider::Create(
89 system_bus, dbus::ObjectPath(kAgentPath), this)); 110 system_bus, dbus::ObjectPath(kAgentPath), this));
90 DCHECK(agent_.get()); 111 DCHECK(agent_.get());
91 112
92 std::vector<dbus::ObjectPath> object_paths = 113 std::vector<dbus::ObjectPath> object_paths =
93 DBusThreadManager::Get()->GetBluetoothAdapterClient()->GetAdapters(); 114 DBusThreadManager::Get()->GetBluetoothAdapterClient()->GetAdapters();
94 115
95 if (!object_paths.empty()) { 116 if (!object_paths.empty()) {
96 VLOG(1) << object_paths.size() << " Bluetooth adapter(s) available."; 117 VLOG(1) << object_paths.size() << " Bluetooth adapter(s) available.";
97 SetAdapter(object_paths[0]); 118 SetAdapter(object_paths[0]);
98 } 119 }
99 } 120 }
100 121
101 BluetoothAdapterChromeOS::~BluetoothAdapterChromeOS() { 122 BluetoothAdapterChromeOS::~BluetoothAdapterChromeOS() {
102 DBusThreadManager::Get()->GetBluetoothAdapterClient()->RemoveObserver(this); 123 Shutdown();
103 DBusThreadManager::Get()->GetBluetoothDeviceClient()->RemoveObserver(this);
104 DBusThreadManager::Get()->GetBluetoothInputClient()->RemoveObserver(this);
105
106 VLOG(1) << "Unregistering pairing agent";
107 DBusThreadManager::Get()->GetBluetoothAgentManagerClient()->
108 UnregisterAgent(
109 dbus::ObjectPath(kAgentPath),
110 base::Bind(&base::DoNothing),
111 base::Bind(&OnUnregisterAgentError));
112 } 124 }
113 125
114 void BluetoothAdapterChromeOS::DeleteOnCorrectThread() const { 126 void BluetoothAdapterChromeOS::DeleteOnCorrectThread() const {
115 if (ui_task_runner_->RunsTasksOnCurrentThread() || 127 if (ui_task_runner_->RunsTasksOnCurrentThread() ||
116 !ui_task_runner_->DeleteSoon(FROM_HERE, this)) 128 !ui_task_runner_->DeleteSoon(FROM_HERE, this))
117 delete this; 129 delete this;
118 } 130 }
119 131
120 void BluetoothAdapterChromeOS::AddObserver( 132 void BluetoothAdapterChromeOS::AddObserver(
121 BluetoothAdapter::Observer* observer) { 133 BluetoothAdapter::Observer* observer) {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
168 weak_ptr_factory_.GetWeakPtr(), 180 weak_ptr_factory_.GetWeakPtr(),
169 callback, 181 callback,
170 error_callback)); 182 error_callback));
171 } 183 }
172 184
173 bool BluetoothAdapterChromeOS::IsInitialized() const { 185 bool BluetoothAdapterChromeOS::IsInitialized() const {
174 return true; 186 return true;
175 } 187 }
176 188
177 bool BluetoothAdapterChromeOS::IsPresent() const { 189 bool BluetoothAdapterChromeOS::IsPresent() const {
178 return !object_path_.value().empty(); 190 return !is_shutdown_ && !object_path_.value().empty();
179 } 191 }
180 192
181 bool BluetoothAdapterChromeOS::IsPowered() const { 193 bool BluetoothAdapterChromeOS::IsPowered() const {
182 if (!IsPresent()) 194 if (!IsPresent())
183 return false; 195 return false;
184 196
185 BluetoothAdapterClient::Properties* properties = 197 BluetoothAdapterClient::Properties* properties =
186 DBusThreadManager::Get()->GetBluetoothAdapterClient()-> 198 DBusThreadManager::Get()->GetBluetoothAdapterClient()->
187 GetProperties(object_path_); 199 GetProperties(object_path_);
188 200
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
245 GetProperties(object_path_); 257 GetProperties(object_path_);
246 258
247 return properties->discovering.value(); 259 return properties->discovering.value();
248 } 260 }
249 261
250 void BluetoothAdapterChromeOS::CreateRfcommService( 262 void BluetoothAdapterChromeOS::CreateRfcommService(
251 const BluetoothUUID& uuid, 263 const BluetoothUUID& uuid,
252 const ServiceOptions& options, 264 const ServiceOptions& options,
253 const CreateServiceCallback& callback, 265 const CreateServiceCallback& callback,
254 const CreateServiceErrorCallback& error_callback) { 266 const CreateServiceErrorCallback& error_callback) {
255 VLOG(1) << object_path_.value() << ": Creating RFCOMM service: " 267 VLOG(1) << object_path_.value() << ": Creating RFCOMM service: "
armansito 2015/01/14 19:52:43 Add check for IsPresent in all public API function
scheib 2015/01/14 23:07:27 Added a check for dbus_is_shutdown_ added. A test
256 << uuid.canonical_value(); 268 << uuid.canonical_value();
257 scoped_refptr<BluetoothSocketChromeOS> socket = 269 scoped_refptr<BluetoothSocketChromeOS> socket =
258 BluetoothSocketChromeOS::CreateBluetoothSocket( 270 BluetoothSocketChromeOS::CreateBluetoothSocket(
259 ui_task_runner_, socket_thread_); 271 ui_task_runner_, socket_thread_);
260 socket->Listen(this, 272 socket->Listen(this,
261 BluetoothSocketChromeOS::kRfcomm, 273 BluetoothSocketChromeOS::kRfcomm,
262 uuid, 274 uuid,
263 options, 275 options,
264 base::Bind(callback, socket), 276 base::Bind(callback, socket),
265 error_callback); 277 error_callback);
(...skipping 802 matching lines...) Expand 10 before | Expand all | Expand 10 after
1068 1080
1069 // If the queued request resulted in a pending call, then let it 1081 // If the queued request resulted in a pending call, then let it
1070 // asynchonously process the remaining queued requests once the pending 1082 // asynchonously process the remaining queued requests once the pending
1071 // call returns. 1083 // call returns.
1072 if (discovery_request_pending_) 1084 if (discovery_request_pending_)
1073 return; 1085 return;
1074 } 1086 }
1075 } 1087 }
1076 1088
1077 } // namespace chromeos 1089 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698