| Index: chrome/browser/lifetime/application_lifetime.cc
|
| diff --git a/chrome/browser/lifetime/application_lifetime.cc b/chrome/browser/lifetime/application_lifetime.cc
|
| index 21b9e3bda36e273f8b1bb21e662c098a55279e8c..38eaa56ceab8b01fd4740e33b29d61bfe65ad98c 100644
|
| --- a/chrome/browser/lifetime/application_lifetime.cc
|
| +++ b/chrome/browser/lifetime/application_lifetime.cc
|
| @@ -11,6 +11,7 @@
|
| #include "base/logging.h"
|
| #include "base/memory/scoped_ptr.h"
|
| #include "base/message_loop/message_loop.h"
|
| +#include "base/metrics/field_trial.h"
|
| #include "base/prefs/pref_service.h"
|
| #include "base/process/kill.h"
|
| #include "base/process/process.h"
|
| @@ -249,6 +250,16 @@ void ExitCleanly() {
|
| }
|
| #endif
|
|
|
| +namespace {
|
| +
|
| +bool ExperimentUseBrokenSynchronization() {
|
| + const std::string group_name =
|
| + base::FieldTrialList::FindFullName("WindowsLogoffRace");
|
| + return group_name == "BrokenSynchronization";
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| void SessionEnding() {
|
| // This is a time-limited shutdown where we need to write as much to
|
| // disk as we can as soon as we can, and where we must kill the
|
| @@ -280,25 +291,27 @@ void SessionEnding() {
|
|
|
| #if defined(OS_WIN)
|
| base::win::SetShouldCrashOnProcessDetach(false);
|
| +#endif
|
|
|
| - // On Windows 7 and later, the system will consider the process ripe for
|
| - // termination as soon as it hides or destroys its windows. Since any
|
| - // execution past that point will be non-deterministically cut short, we
|
| - // might as well put ourselves out of that misery deterministically.
|
| - base::KillProcess(base::Process::Current().handle(), 0, false);
|
| -#else
|
| - CloseAllBrowsers();
|
| + if (!ExperimentUseBrokenSynchronization()) {
|
| + // On Windows 7 and later, the system will consider the process ripe for
|
| + // termination as soon as it hides or destroys its windows. Since any
|
| + // execution past that point will be non-deterministically cut short, we
|
| + // might as well put ourselves out of that misery deterministically.
|
| + base::KillProcess(base::Process::Current().handle(), 0, false);
|
| + } else {
|
| + CloseAllBrowsers();
|
|
|
| - // Send out notification. This is used during testing so that the test harness
|
| - // can properly shutdown before we exit.
|
| - content::NotificationService::current()->Notify(
|
| - chrome::NOTIFICATION_SESSION_END,
|
| - content::NotificationService::AllSources(),
|
| - content::NotificationService::NoDetails());
|
| + // Send out notification. This is used during testing so that the test
|
| + // harness can properly shutdown before we exit.
|
| + content::NotificationService::current()->Notify(
|
| + chrome::NOTIFICATION_SESSION_END,
|
| + content::NotificationService::AllSources(),
|
| + content::NotificationService::NoDetails());
|
|
|
| - // This will end by terminating the process.
|
| - content::ImmediateShutdownAndExitProcess();
|
| -#endif // defined(OS_WIN)
|
| + // This will end by terminating the process.
|
| + content::ImmediateShutdownAndExitProcess();
|
| + }
|
| }
|
|
|
| void IncrementKeepAliveCount() {
|
|
|