| OLD | NEW |
| 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 #ifndef CHROME_BROWSER_PROCESS_SINGLETON_H_ | 5 #ifndef CHROME_BROWSER_PROCESS_SINGLETON_H_ |
| 6 #define CHROME_BROWSER_PROCESS_SINGLETON_H_ | 6 #define CHROME_BROWSER_PROCESS_SINGLETON_H_ |
| 7 | 7 |
| 8 #include "build/build_config.h" | 8 #include "build/build_config.h" |
| 9 | 9 |
| 10 #if defined(OS_WIN) | 10 #if defined(OS_WIN) |
| 11 #include <windows.h> | 11 #include <windows.h> |
| 12 #endif // defined(OS_WIN) | 12 #endif // defined(OS_WIN) |
| 13 | 13 |
| 14 #include <set> | 14 #include <set> |
| 15 #include <vector> | 15 #include <vector> |
| 16 | 16 |
| 17 #include "base/basictypes.h" | 17 #include "base/basictypes.h" |
| 18 #include "base/callback.h" | 18 #include "base/callback.h" |
| 19 #include "base/command_line.h" | 19 #include "base/command_line.h" |
| 20 #include "base/file_path.h" | 20 #include "base/file_path.h" |
| 21 #include "base/logging.h" | 21 #include "base/logging.h" |
| 22 #include "base/memory/ref_counted.h" | 22 #include "base/memory/ref_counted.h" |
| 23 #include "base/process.h" | 23 #include "base/process.h" |
| 24 #include "base/threading/non_thread_safe.h" | 24 #include "base/threading/non_thread_safe.h" |
| 25 #include "ui/gfx/native_widget_types.h" | 25 #include "ui/gfx/native_widget_types.h" |
| 26 | 26 |
| 27 #if defined(OS_POSIX) | |
| 28 #include "base/file_path.h" | |
| 29 #endif // defined(OS_POSIX) | |
| 30 | |
| 31 #if defined(OS_LINUX) || defined(OS_OPENBSD) | 27 #if defined(OS_LINUX) || defined(OS_OPENBSD) |
| 32 #include "base/files/scoped_temp_dir.h" | 28 #include "base/files/scoped_temp_dir.h" |
| 33 #endif // defined(OS_LINUX) || defined(OS_OPENBSD) | 29 #endif // defined(OS_LINUX) || defined(OS_OPENBSD) |
| 34 | 30 |
| 35 class CommandLine; | 31 class CommandLine; |
| 36 class FilePath; | |
| 37 | 32 |
| 38 // ProcessSingleton ---------------------------------------------------------- | 33 // ProcessSingleton ---------------------------------------------------------- |
| 39 // | 34 // |
| 40 // This class allows different browser processes to communicate with | 35 // This class allows different browser processes to communicate with |
| 41 // each other. It is named according to the user data directory, so | 36 // each other. It is named according to the user data directory, so |
| 42 // we can be sure that no more than one copy of the application can be | 37 // we can be sure that no more than one copy of the application can be |
| 43 // running at once with a given data directory. | 38 // running at once with a given data directory. |
| 44 // | 39 // |
| 45 // Implementation notes: | 40 // Implementation notes: |
| 46 // - the Windows implementation uses an invisible global message window; | 41 // - the Windows implementation uses an invisible global message window; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 63 typedef base::Callback< | 58 typedef base::Callback< |
| 64 bool(const CommandLine& command_line, const FilePath& current_directory)> | 59 bool(const CommandLine& command_line, const FilePath& current_directory)> |
| 65 NotificationCallback; | 60 NotificationCallback; |
| 66 | 61 |
| 67 explicit ProcessSingleton(const FilePath& user_data_dir); | 62 explicit ProcessSingleton(const FilePath& user_data_dir); |
| 68 ~ProcessSingleton(); | 63 ~ProcessSingleton(); |
| 69 | 64 |
| 70 // Notify another process, if available. Otherwise sets ourselves as the | 65 // Notify another process, if available. Otherwise sets ourselves as the |
| 71 // singleton instance and stores the provided callback for notification from | 66 // singleton instance and stores the provided callback for notification from |
| 72 // future processes. Returns PROCESS_NONE if we became the singleton | 67 // future processes. Returns PROCESS_NONE if we became the singleton |
| 73 // instance. | 68 // instance. Callers are guaranteed to either have notified an existing |
| 69 // process or have grabbed the singleton (unless the profile is locked by an |
| 70 // unreachable process). |
| 71 // TODO(brettw): Make the implementation of this method non-platform-specific |
| 72 // by making Linux re-use the Windows implementation. |
| 74 NotifyResult NotifyOtherProcessOrCreate( | 73 NotifyResult NotifyOtherProcessOrCreate( |
| 75 const NotificationCallback& notification_callback); | 74 const NotificationCallback& notification_callback); |
| 76 | 75 |
| 77 // Sets ourself up as the singleton instance. Returns true on success. If | 76 // Sets ourself up as the singleton instance. Returns true on success. If |
| 78 // false is returned, we are not the singleton instance and the caller must | 77 // false is returned, we are not the singleton instance and the caller must |
| 79 // exit. Otherwise, stores the provided callback for notification from | 78 // exit. Otherwise, stores the provided callback for notification from |
| 80 // future processes. | 79 // future processes. |
| 81 // NOTE: Most callers should generally prefer NotifyOtherProcessOrCreate() to | 80 // NOTE: Most callers should generally prefer NotifyOtherProcessOrCreate() to |
| 82 // this method, only callers for whom failure is prefered to notifying another | 81 // this method, only callers for whom failure is prefered to notifying another |
| 83 // process should call this directly. | 82 // process should call this directly. |
| (...skipping 29 matching lines...) Expand all Loading... |
| 113 #if defined(OS_WIN) | 112 #if defined(OS_WIN) |
| 114 LRESULT WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam); | 113 LRESULT WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam); |
| 115 #endif | 114 #endif |
| 116 | 115 |
| 117 #if defined(OS_LINUX) || defined(OS_OPENBSD) | 116 #if defined(OS_LINUX) || defined(OS_OPENBSD) |
| 118 static void DisablePromptForTesting(); | 117 static void DisablePromptForTesting(); |
| 119 #endif // defined(OS_LINUX) || defined(OS_OPENBSD) | 118 #endif // defined(OS_LINUX) || defined(OS_OPENBSD) |
| 120 | 119 |
| 121 protected: | 120 protected: |
| 122 // Notify another process, if available. | 121 // Notify another process, if available. |
| 123 // Returns true if another process was found and notified, false if we | 122 // Returns true if another process was found and notified, false if we should |
| 124 // should continue with this process. | 123 // continue with the current process. |
| 125 // Windows code roughly based on Mozilla. | 124 // On Windows, Create() has to be called before this. |
| 126 // | |
| 127 // TODO(brettw): this will not handle all cases. If two processes start up too | |
| 128 // close to each other, the Create() might not yet have happened for the | |
| 129 // first one, so this function won't find it. | |
| 130 NotifyResult NotifyOtherProcess(); | 125 NotifyResult NotifyOtherProcess(); |
| 131 | 126 |
| 132 #if defined(OS_LINUX) || defined(OS_OPENBSD) | 127 #if defined(OS_LINUX) || defined(OS_OPENBSD) |
| 133 // Exposed for testing. We use a timeout on Linux, and in tests we want | 128 // Exposed for testing. We use a timeout on Linux, and in tests we want |
| 134 // this timeout to be short. | 129 // this timeout to be short. |
| 135 NotifyResult NotifyOtherProcessWithTimeout(const CommandLine& command_line, | 130 NotifyResult NotifyOtherProcessWithTimeout(const CommandLine& command_line, |
| 136 int timeout_seconds, | 131 int timeout_seconds, |
| 137 bool kill_unresponsive); | 132 bool kill_unresponsive); |
| 138 NotifyResult NotifyOtherProcessWithTimeoutOrCreate( | 133 NotifyResult NotifyOtherProcessWithTimeoutOrCreate( |
| 139 const CommandLine& command_line, | 134 const CommandLine& command_line, |
| (...skipping 20 matching lines...) Expand all Loading... |
| 160 #if defined(OS_WIN) | 155 #if defined(OS_WIN) |
| 161 // This ugly behemoth handles startup commands sent from another process. | 156 // This ugly behemoth handles startup commands sent from another process. |
| 162 LRESULT OnCopyData(HWND hwnd, const COPYDATASTRUCT* cds); | 157 LRESULT OnCopyData(HWND hwnd, const COPYDATASTRUCT* cds); |
| 163 | 158 |
| 164 bool EscapeVirtualization(const FilePath& user_data_dir); | 159 bool EscapeVirtualization(const FilePath& user_data_dir); |
| 165 | 160 |
| 166 HWND remote_window_; // The HWND_MESSAGE of another browser. | 161 HWND remote_window_; // The HWND_MESSAGE of another browser. |
| 167 HWND window_; // The HWND_MESSAGE window. | 162 HWND window_; // The HWND_MESSAGE window. |
| 168 bool is_virtualized_; // Stuck inside Microsoft Softricity VM environment. | 163 bool is_virtualized_; // Stuck inside Microsoft Softricity VM environment. |
| 169 HANDLE lock_file_; | 164 HANDLE lock_file_; |
| 165 FilePath user_data_dir_; |
| 170 #elif defined(OS_LINUX) || defined(OS_OPENBSD) | 166 #elif defined(OS_LINUX) || defined(OS_OPENBSD) |
| 171 // Return true if the given pid is one of our child processes. | 167 // Return true if the given pid is one of our child processes. |
| 172 // Assumes that the current pid is the root of all pids of the current | 168 // Assumes that the current pid is the root of all pids of the current |
| 173 // instance. | 169 // instance. |
| 174 bool IsSameChromeInstance(pid_t pid); | 170 bool IsSameChromeInstance(pid_t pid); |
| 175 | 171 |
| 176 // Extract the process's pid from a symbol link path and if it is on | 172 // Extract the process's pid from a symbol link path and if it is on |
| 177 // the same host, kill the process, unlink the lock file and return true. | 173 // the same host, kill the process, unlink the lock file and return true. |
| 178 // If the process is part of the same chrome instance, unlink the lock file | 174 // If the process is part of the same chrome instance, unlink the lock file |
| 179 // and return true without killing it. | 175 // and return true without killing it. |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 217 #endif | 213 #endif |
| 218 | 214 |
| 219 // If messages are received in the locked state, the corresponding command | 215 // If messages are received in the locked state, the corresponding command |
| 220 // lines are saved here to be replayed later. | 216 // lines are saved here to be replayed later. |
| 221 std::vector<DelayedStartupMessage> saved_startup_messages_; | 217 std::vector<DelayedStartupMessage> saved_startup_messages_; |
| 222 | 218 |
| 223 DISALLOW_COPY_AND_ASSIGN(ProcessSingleton); | 219 DISALLOW_COPY_AND_ASSIGN(ProcessSingleton); |
| 224 }; | 220 }; |
| 225 | 221 |
| 226 #endif // CHROME_BROWSER_PROCESS_SINGLETON_H_ | 222 #endif // CHROME_BROWSER_PROCESS_SINGLETON_H_ |
| OLD | NEW |