Index: chrome/browser/chromeos/dbus/cros_dbus_service.cc |
diff --git a/chrome/browser/chromeos/dbus/cros_dbus_service.cc b/chrome/browser/chromeos/dbus/cros_dbus_service.cc |
index 2843aa0b6a5c4208f5ddf1977b022822fcf5ffe0..aefccdb9b43a958b72cdd3adce9bd791e6a90c76 100644 |
--- a/chrome/browser/chromeos/dbus/cros_dbus_service.cc |
+++ b/chrome/browser/chromeos/dbus/cros_dbus_service.cc |
@@ -49,7 +49,16 @@ class CrosDBusServiceImpl : public CrosDBusService { |
if (service_started_) |
return; |
+ // There are some situations, described in http://crbug.com/234382#c27, |
+ // where processes on Linux can wind up stuck in an uninterruptible state |
+ // for tens of seconds. If this happens when Chrome is trying to exit, |
+ // this unkillable process can wind up clinging to ownership of |
+ // kLibCrosServiceName while the system is trying to restart the browser. |
+ // This leads to a fatal situation if we don't allow the new browser |
+ // instance to replace the old as the owner of kLibCrosServiceName as seen |
+ // in http://crbug.com/234382. Hence, REQUIRE_PRIMARY_ALLOW_REPLACEMENT. |
bus_->RequestOwnership(kLibCrosServiceName, |
+ dbus::Bus::REQUIRE_PRIMARY_ALLOW_REPLACEMENT, |
base::Bind(&CrosDBusServiceImpl::OnOwnership, |
base::Unretained(this))); |