Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 // On Linux, when the user tries to launch a second copy of chrome, we check | 5 // On Linux, when the user tries to launch a second copy of chrome, we check |
| 6 // for a socket in the user's profile directory. If the socket file is open we | 6 // for a socket in the user's profile directory. If the socket file is open we |
| 7 // send a message to the first chrome browser process with the current | 7 // send a message to the first chrome browser process with the current |
| 8 // directory and second process command line flags. The second process then | 8 // directory and second process command line flags. The second process then |
| 9 // exits. | 9 // exits. |
| 10 // | 10 // |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 74 #include "base/strings/string_split.h" | 74 #include "base/strings/string_split.h" |
| 75 #include "base/strings/string_util.h" | 75 #include "base/strings/string_util.h" |
| 76 #include "base/strings/stringprintf.h" | 76 #include "base/strings/stringprintf.h" |
| 77 #include "base/strings/sys_string_conversions.h" | 77 #include "base/strings/sys_string_conversions.h" |
| 78 #include "base/strings/utf_string_conversions.h" | 78 #include "base/strings/utf_string_conversions.h" |
| 79 #include "base/threading/platform_thread.h" | 79 #include "base/threading/platform_thread.h" |
| 80 #include "base/time/time.h" | 80 #include "base/time/time.h" |
| 81 #include "base/timer/timer.h" | 81 #include "base/timer/timer.h" |
| 82 #include "build/build_config.h" | 82 #include "build/build_config.h" |
| 83 #include "chrome/common/chrome_constants.h" | 83 #include "chrome/common/chrome_constants.h" |
| 84 #include "chrome/common/chrome_switches.h" | |
| 84 #include "chrome/grit/chromium_strings.h" | 85 #include "chrome/grit/chromium_strings.h" |
| 85 #include "chrome/grit/generated_resources.h" | 86 #include "chrome/grit/generated_resources.h" |
| 86 #include "content/public/browser/browser_thread.h" | 87 #include "content/public/browser/browser_thread.h" |
| 87 #include "net/base/network_interfaces.h" | 88 #include "net/base/network_interfaces.h" |
| 88 #include "ui/base/l10n/l10n_util.h" | 89 #include "ui/base/l10n/l10n_util.h" |
| 89 | 90 |
| 90 #if defined(OS_LINUX) | 91 #if defined(OS_LINUX) |
| 91 #include "chrome/browser/ui/process_singleton_dialog_linux.h" | 92 #include "chrome/browser/ui/process_singleton_dialog_linux.h" |
| 92 #endif | 93 #endif |
| 93 | 94 |
| 95 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) | |
| 96 #include "ui/events/platform/x11/x11_event_source.h" | |
| 97 #endif | |
| 98 | |
| 94 #if defined(TOOLKIT_VIEWS) && defined(OS_LINUX) && !defined(OS_CHROMEOS) | 99 #if defined(TOOLKIT_VIEWS) && defined(OS_LINUX) && !defined(OS_CHROMEOS) |
| 95 #include "ui/views/linux_ui/linux_ui.h" | 100 #include "ui/views/linux_ui/linux_ui.h" |
| 96 #endif | 101 #endif |
| 97 | 102 |
| 98 using content::BrowserThread; | 103 using content::BrowserThread; |
| 99 | 104 |
| 100 namespace { | 105 namespace { |
| 101 | 106 |
| 102 // Timeout for the current browser process to respond. 20 seconds should be | 107 // Timeout for the current browser process to respond. 20 seconds should be |
| 103 // enough. | 108 // enough. |
| (...skipping 706 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 810 if (retries == retry_attempts) { | 815 if (retries == retry_attempts) { |
| 811 // Retries failed. Kill the unresponsive chrome process and continue. | 816 // Retries failed. Kill the unresponsive chrome process and continue. |
| 812 if (!kill_unresponsive || !KillProcessByLockPath()) | 817 if (!kill_unresponsive || !KillProcessByLockPath()) |
| 813 return PROFILE_IN_USE; | 818 return PROFILE_IN_USE; |
| 814 return PROCESS_NONE; | 819 return PROCESS_NONE; |
| 815 } | 820 } |
| 816 | 821 |
| 817 base::PlatformThread::Sleep(sleep_interval); | 822 base::PlatformThread::Sleep(sleep_interval); |
| 818 } | 823 } |
| 819 | 824 |
| 825 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) | |
| 826 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( | |
| 827 switches::kWmUserTimeMs, | |
| 828 base::Uint64ToString( | |
| 829 ui::X11EventSource::GetInstance()->UpdateServerTime())); | |
| 830 #endif | |
| 831 | |
|
Tom (Use chromium acct)
2016/05/06 20:42:00
This doesn't seem like the best place to put this.
Elliot Glaysher
2016/05/06 21:13:13
I agree that this is really not a good place for t
Tom (Use chromium acct)
2016/05/06 22:09:43
Done.
| |
| 820 timeval socket_timeout = TimeDeltaToTimeVal(timeout); | 832 timeval socket_timeout = TimeDeltaToTimeVal(timeout); |
| 821 setsockopt(socket.fd(), | 833 setsockopt(socket.fd(), |
| 822 SOL_SOCKET, | 834 SOL_SOCKET, |
| 823 SO_SNDTIMEO, | 835 SO_SNDTIMEO, |
| 824 &socket_timeout, | 836 &socket_timeout, |
| 825 sizeof(socket_timeout)); | 837 sizeof(socket_timeout)); |
| 826 | 838 |
| 827 // Found another process, prepare our command line | 839 // Found another process, prepare our command line |
| 828 // format is "START\0<current dir>\0<argv[0]>\0...\0<argv[n]>". | 840 // format is "START\0<current dir>\0<argv[0]>\0...\0<argv[n]>". |
| 829 std::string to_send(kStartToken); | 841 std::string to_send(kStartToken); |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1055 } | 1067 } |
| 1056 | 1068 |
| 1057 void ProcessSingleton::KillProcess(int pid) { | 1069 void ProcessSingleton::KillProcess(int pid) { |
| 1058 // TODO(james.su@gmail.com): Is SIGKILL ok? | 1070 // TODO(james.su@gmail.com): Is SIGKILL ok? |
| 1059 int rv = kill(static_cast<base::ProcessHandle>(pid), SIGKILL); | 1071 int rv = kill(static_cast<base::ProcessHandle>(pid), SIGKILL); |
| 1060 // ESRCH = No Such Process (can happen if the other process is already in | 1072 // ESRCH = No Such Process (can happen if the other process is already in |
| 1061 // progress of shutting down and finishes before we try to kill it). | 1073 // progress of shutting down and finishes before we try to kill it). |
| 1062 DCHECK(rv == 0 || errno == ESRCH) << "Error killing process: " | 1074 DCHECK(rv == 0 || errno == ESRCH) << "Error killing process: " |
| 1063 << base::safe_strerror(errno); | 1075 << base::safe_strerror(errno); |
| 1064 } | 1076 } |
| OLD | NEW |