| 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) |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 #include "ui/gfx/native_widget_types.h" | 25 #include "ui/gfx/native_widget_types.h" |
| 26 | 26 |
| 27 #if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID) | 27 #if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID) |
| 28 #include "base/files/scoped_temp_dir.h" | 28 #include "base/files/scoped_temp_dir.h" |
| 29 #endif | 29 #endif |
| 30 | 30 |
| 31 #if defined(OS_WIN) | 31 #if defined(OS_WIN) |
| 32 #include "base/win/message_window.h" | 32 #include "base/win/message_window.h" |
| 33 #endif // defined(OS_WIN) | 33 #endif // defined(OS_WIN) |
| 34 | 34 |
| 35 namespace base { |
| 35 class CommandLine; | 36 class CommandLine; |
| 37 } |
| 36 | 38 |
| 37 // ProcessSingleton ---------------------------------------------------------- | 39 // ProcessSingleton ---------------------------------------------------------- |
| 38 // | 40 // |
| 39 // This class allows different browser processes to communicate with | 41 // This class allows different browser processes to communicate with |
| 40 // each other. It is named according to the user data directory, so | 42 // each other. It is named according to the user data directory, so |
| 41 // we can be sure that no more than one copy of the application can be | 43 // we can be sure that no more than one copy of the application can be |
| 42 // running at once with a given data directory. | 44 // running at once with a given data directory. |
| 43 // | 45 // |
| 44 // Implementation notes: | 46 // Implementation notes: |
| 45 // - the Windows implementation uses an invisible global message window; | 47 // - the Windows implementation uses an invisible global message window; |
| 46 // - the Linux implementation uses a Unix domain socket in the user data dir. | 48 // - the Linux implementation uses a Unix domain socket in the user data dir. |
| 47 | 49 |
| 48 class ProcessSingleton : public base::NonThreadSafe { | 50 class ProcessSingleton : public base::NonThreadSafe { |
| 49 public: | 51 public: |
| 50 enum NotifyResult { | 52 enum NotifyResult { |
| 51 PROCESS_NONE, | 53 PROCESS_NONE, |
| 52 PROCESS_NOTIFIED, | 54 PROCESS_NOTIFIED, |
| 53 PROFILE_IN_USE, | 55 PROFILE_IN_USE, |
| 54 LOCK_ERROR, | 56 LOCK_ERROR, |
| 55 }; | 57 }; |
| 56 | 58 |
| 57 // Implement this callback to handle notifications from other processes. The | 59 // Implement this callback to handle notifications from other processes. The |
| 58 // callback will receive the command line and directory with which the other | 60 // callback will receive the command line and directory with which the other |
| 59 // Chrome process was launched. Return true if the command line will be | 61 // Chrome process was launched. Return true if the command line will be |
| 60 // handled within the current browser instance or false if the remote process | 62 // handled within the current browser instance or false if the remote process |
| 61 // should handle it (i.e., because the current process is shutting down). | 63 // should handle it (i.e., because the current process is shutting down). |
| 62 typedef base::Callback<bool( | 64 typedef base::Callback<bool( |
| 63 const CommandLine& command_line, | 65 const base::CommandLine& command_line, |
| 64 const base::FilePath& current_directory)> NotificationCallback; | 66 const base::FilePath& current_directory)> NotificationCallback; |
| 65 | 67 |
| 66 ProcessSingleton(const base::FilePath& user_data_dir, | 68 ProcessSingleton(const base::FilePath& user_data_dir, |
| 67 const NotificationCallback& notification_callback); | 69 const NotificationCallback& notification_callback); |
| 68 ~ProcessSingleton(); | 70 ~ProcessSingleton(); |
| 69 | 71 |
| 70 // Notify another process, if available. Otherwise sets ourselves as the | 72 // Notify another process, if available. Otherwise sets ourselves as the |
| 71 // singleton instance. Returns PROCESS_NONE if we became the singleton | 73 // singleton instance. Returns PROCESS_NONE if we became the singleton |
| 72 // instance. Callers are guaranteed to either have notified an existing | 74 // instance. Callers are guaranteed to either have notified an existing |
| 73 // process or have grabbed the singleton (unless the profile is locked by an | 75 // process or have grabbed the singleton (unless the profile is locked by an |
| (...skipping 20 matching lines...) Expand all Loading... |
| 94 protected: | 96 protected: |
| 95 // Notify another process, if available. | 97 // Notify another process, if available. |
| 96 // Returns true if another process was found and notified, false if we should | 98 // Returns true if another process was found and notified, false if we should |
| 97 // continue with the current process. | 99 // continue with the current process. |
| 98 // On Windows, Create() has to be called before this. | 100 // On Windows, Create() has to be called before this. |
| 99 NotifyResult NotifyOtherProcess(); | 101 NotifyResult NotifyOtherProcess(); |
| 100 | 102 |
| 101 #if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID) | 103 #if defined(OS_POSIX) && !defined(OS_MACOSX) && !defined(OS_ANDROID) |
| 102 // Exposed for testing. We use a timeout on Linux, and in tests we want | 104 // Exposed for testing. We use a timeout on Linux, and in tests we want |
| 103 // this timeout to be short. | 105 // this timeout to be short. |
| 104 NotifyResult NotifyOtherProcessWithTimeout(const CommandLine& command_line, | 106 NotifyResult NotifyOtherProcessWithTimeout( |
| 105 int timeout_seconds, | 107 const base::CommandLine& command_line, |
| 106 bool kill_unresponsive); | 108 int timeout_seconds, |
| 109 bool kill_unresponsive); |
| 107 NotifyResult NotifyOtherProcessWithTimeoutOrCreate( | 110 NotifyResult NotifyOtherProcessWithTimeoutOrCreate( |
| 108 const CommandLine& command_line, | 111 const base::CommandLine& command_line, |
| 109 int timeout_seconds); | 112 int timeout_seconds); |
| 110 void OverrideCurrentPidForTesting(base::ProcessId pid); | 113 void OverrideCurrentPidForTesting(base::ProcessId pid); |
| 111 void OverrideKillCallbackForTesting( | 114 void OverrideKillCallbackForTesting( |
| 112 const base::Callback<void(int)>& callback); | 115 const base::Callback<void(int)>& callback); |
| 113 #endif | 116 #endif |
| 114 | 117 |
| 115 private: | 118 private: |
| 116 #if !defined(OS_MACOSX) | 119 #if !defined(OS_MACOSX) |
| 117 // Timeout for the current browser process to respond. 20 seconds should be | 120 // Timeout for the current browser process to respond. 20 seconds should be |
| 118 // enough. It's only used in Windows and Linux implementations. | 121 // enough. It's only used in Windows and Linux implementations. |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 175 // File descriptor associated with the lockfile, valid between | 178 // File descriptor associated with the lockfile, valid between |
| 176 // |Create()| and |Cleanup()|. Two instances cannot have a lock on | 179 // |Create()| and |Cleanup()|. Two instances cannot have a lock on |
| 177 // the same file at the same time. | 180 // the same file at the same time. |
| 178 int lock_fd_; | 181 int lock_fd_; |
| 179 #endif | 182 #endif |
| 180 | 183 |
| 181 DISALLOW_COPY_AND_ASSIGN(ProcessSingleton); | 184 DISALLOW_COPY_AND_ASSIGN(ProcessSingleton); |
| 182 }; | 185 }; |
| 183 | 186 |
| 184 #endif // CHROME_BROWSER_PROCESS_SINGLETON_H_ | 187 #endif // CHROME_BROWSER_PROCESS_SINGLETON_H_ |
| OLD | NEW |