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

Side by Side Diff: dbus/bus.cc

Issue 510863002: dbus::ObjectManager: Add a match rule for properties before GetManagedObjects. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased; updated BUILD.gn; fixed crash from latest RunLoop changes Created 6 years, 3 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
« no previous file with comments | « dbus/bus.h ('k') | dbus/dbus.gyp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/message_loop/message_loop_proxy.h" 10 #include "base/message_loop/message_loop_proxy.h"
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after
260 const base::Closure& callback) { 260 const base::Closure& callback) {
261 AssertOnOriginThread(); 261 AssertOnOriginThread();
262 262
263 // Check if we have the requested object proxy. 263 // Check if we have the requested object proxy.
264 const ObjectProxyTable::key_type key(service_name + object_path.value(), 264 const ObjectProxyTable::key_type key(service_name + object_path.value(),
265 options); 265 options);
266 ObjectProxyTable::iterator iter = object_proxy_table_.find(key); 266 ObjectProxyTable::iterator iter = object_proxy_table_.find(key);
267 if (iter != object_proxy_table_.end()) { 267 if (iter != object_proxy_table_.end()) {
268 scoped_refptr<ObjectProxy> object_proxy = iter->second; 268 scoped_refptr<ObjectProxy> object_proxy = iter->second;
269 object_proxy_table_.erase(iter); 269 object_proxy_table_.erase(iter);
270 // Object is present. Remove it now and Detach in the DBus thread. 270 // Object is present. Remove it now and Detach on the DBus thread.
271 GetDBusTaskRunner()->PostTask( 271 GetDBusTaskRunner()->PostTask(
272 FROM_HERE, 272 FROM_HERE,
273 base::Bind(&Bus::RemoveObjectProxyInternal, 273 base::Bind(&Bus::RemoveObjectProxyInternal,
274 this, object_proxy, callback)); 274 this, object_proxy, callback));
275 return true; 275 return true;
276 } 276 }
277 return false; 277 return false;
278 } 278 }
279 279
280 void Bus::RemoveObjectProxyInternal(scoped_refptr<ObjectProxy> object_proxy, 280 void Bus::RemoveObjectProxyInternal(scoped_refptr<ObjectProxy> object_proxy,
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
343 return iter->second.get(); 343 return iter->second.get();
344 } 344 }
345 345
346 scoped_refptr<ObjectManager> object_manager = 346 scoped_refptr<ObjectManager> object_manager =
347 new ObjectManager(this, service_name, object_path); 347 new ObjectManager(this, service_name, object_path);
348 object_manager_table_[key] = object_manager; 348 object_manager_table_[key] = object_manager;
349 349
350 return object_manager.get(); 350 return object_manager.get();
351 } 351 }
352 352
353 void Bus::RemoveObjectManager(const std::string& service_name, 353 bool Bus::RemoveObjectManager(const std::string& service_name,
354 const ObjectPath& object_path) { 354 const ObjectPath& object_path,
355 const base::Closure& callback) {
355 AssertOnOriginThread(); 356 AssertOnOriginThread();
357 DCHECK(!callback.is_null());
356 358
357 const ObjectManagerTable::key_type key(service_name + object_path.value()); 359 const ObjectManagerTable::key_type key(service_name + object_path.value());
358 ObjectManagerTable::iterator iter = object_manager_table_.find(key); 360 ObjectManagerTable::iterator iter = object_manager_table_.find(key);
359 if (iter == object_manager_table_.end()) 361 if (iter == object_manager_table_.end())
360 return; 362 return false;
361 363
364 // ObjectManager is present. Remove it now and CleanUp on the DBus thread.
362 scoped_refptr<ObjectManager> object_manager = iter->second; 365 scoped_refptr<ObjectManager> object_manager = iter->second;
363 object_manager_table_.erase(iter); 366 object_manager_table_.erase(iter);
367
368 GetDBusTaskRunner()->PostTask(
369 FROM_HERE,
370 base::Bind(&Bus::RemoveObjectManagerInternal,
371 this, object_manager, callback));
372
373 return true;
374 }
375
376 void Bus::RemoveObjectManagerInternal(
377 scoped_refptr<dbus::ObjectManager> object_manager,
378 const base::Closure& callback) {
379 AssertOnDBusThread();
380 DCHECK(object_manager.get());
381
382 object_manager->CleanUp();
383
384 // The ObjectManager has to be deleted on the origin thread since it was
385 // created there.
386 GetOriginTaskRunner()->PostTask(
387 FROM_HERE,
388 base::Bind(&Bus::RemoveObjectManagerInternalHelper,
389 this, object_manager, callback));
390 }
391
392 void Bus::RemoveObjectManagerInternalHelper(
393 scoped_refptr<dbus::ObjectManager> object_manager,
394 const base::Closure& callback) {
395 AssertOnOriginThread();
396 DCHECK(object_manager.get());
397
398 // Release the object manager and run the callback.
399 object_manager = NULL;
400 callback.Run();
364 } 401 }
365 402
366 void Bus::GetManagedObjects() { 403 void Bus::GetManagedObjects() {
367 for (ObjectManagerTable::iterator iter = object_manager_table_.begin(); 404 for (ObjectManagerTable::iterator iter = object_manager_table_.begin();
368 iter != object_manager_table_.end(); ++iter) { 405 iter != object_manager_table_.end(); ++iter) {
369 iter->second->GetManagedObjects(); 406 iter->second->GetManagedObjects();
370 } 407 }
371 } 408 }
372 409
373 bool Bus::Connect() { 410 bool Bus::Connect() {
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
453 LOG(ERROR) << "Failed to release all service names. # of services left: " 490 LOG(ERROR) << "Failed to release all service names. # of services left: "
454 << owned_service_names_.size(); 491 << owned_service_names_.size();
455 } 492 }
456 493
457 // Detach from the remote objects. 494 // Detach from the remote objects.
458 for (ObjectProxyTable::iterator iter = object_proxy_table_.begin(); 495 for (ObjectProxyTable::iterator iter = object_proxy_table_.begin();
459 iter != object_proxy_table_.end(); ++iter) { 496 iter != object_proxy_table_.end(); ++iter) {
460 iter->second->Detach(); 497 iter->second->Detach();
461 } 498 }
462 499
500 // Clean up the object managers.
501 for (ObjectManagerTable::iterator iter = object_manager_table_.begin();
502 iter != object_manager_table_.end(); ++iter) {
503 iter->second->CleanUp();
504 }
505
463 // Release object proxies and exported objects here. We should do this 506 // Release object proxies and exported objects here. We should do this
464 // here rather than in the destructor to avoid memory leaks due to 507 // here rather than in the destructor to avoid memory leaks due to
465 // cyclic references. 508 // cyclic references.
466 object_proxy_table_.clear(); 509 object_proxy_table_.clear();
467 exported_object_table_.clear(); 510 exported_object_table_.clear();
468 511
469 // Private connection should be closed. 512 // Private connection should be closed.
470 if (connection_) { 513 if (connection_) {
471 // Remove Disconnected watcher. 514 // Remove Disconnected watcher.
472 ScopedDBusError error; 515 ScopedDBusError error;
(...skipping 716 matching lines...) Expand 10 before | Expand all | Expand 10 after
1189 kNameOwnerChangedSignal)) { 1232 kNameOwnerChangedSignal)) {
1190 Bus* self = static_cast<Bus*>(data); 1233 Bus* self = static_cast<Bus*>(data);
1191 self->OnServiceOwnerChanged(message); 1234 self->OnServiceOwnerChanged(message);
1192 } 1235 }
1193 // Always return unhandled to let others, e.g. ObjectProxies, handle the same 1236 // Always return unhandled to let others, e.g. ObjectProxies, handle the same
1194 // signal. 1237 // signal.
1195 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; 1238 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
1196 } 1239 }
1197 1240
1198 } // namespace dbus 1241 } // namespace dbus
OLDNEW
« no previous file with comments | « dbus/bus.h ('k') | dbus/dbus.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698