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..ae04ae353782c8fe7a4730e31f273b8adb98e67d 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()) { |
+ 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(); |
+ } else { |
+ // 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); |
+ } |
} |
void IncrementKeepAliveCount() { |