| // Copyright 2013 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CHROME_BROWSER_CHROME_PROCESS_SINGLETON_H_ |
| #define CHROME_BROWSER_CHROME_PROCESS_SINGLETON_H_ |
| |
| #include "base/files/file_path.h" |
| #include "base/functional/callback.h" |
| #include "chrome/browser/process_singleton.h" |
| #include "chrome/browser/process_singleton_startup_lock.h" |
| |
| // Composes a `ProcessSingleton` with a `ProcessSingletonStartupLock`. |
| // |
| // Notifications from `ProcessSingleton` will be queued up until `Unlock()` is |
| // called. Once unlocked, notifications will be passed to the |
| // `NotificationCallback` passed to `Unlock()`. |
| class ChromeProcessSingleton { |
| public: |
| explicit ChromeProcessSingleton(const base::FilePath& user_data_dir); |
| |
| ChromeProcessSingleton(const ChromeProcessSingleton&) = delete; |
| ChromeProcessSingleton& operator=(const ChromeProcessSingleton&) = delete; |
| |
| ~ChromeProcessSingleton(); |
| |
| // Notify another process, if available. Otherwise sets ourselves as the |
| // singleton instance. Returns PROCESS_NONE if we became the singleton |
| // instance. Callers are guaranteed to either have notified an existing |
| // process or have grabbed the singleton (unless the profile is locked by an |
| // unreachable process). |
| ProcessSingleton::NotifyResult NotifyOtherProcessOrCreate(); |
| |
| // Start watching for notifications from other processes. After this call, |
| // the notifications sent by other process can be processed. This call |
| // requires the browser threads (UI / IO) to be created. Requests that occur |
| // before calling StartWatching(...) will be blocked and may timeout. |
| void StartWatching(); |
| |
| // Clear any lock state during shutdown. |
| void Cleanup(); |
| |
| // Executes previously queued command-line invocations and allows future |
| // invocations to be executed immediately. |
| // This only has an effect the first time it is called. |
| void Unlock( |
| const ProcessSingleton::NotificationCallback& notification_callback); |
| |
| bool IsSingletonInstanceForTesting() const { return is_singleton_instance_; } |
| |
| #if BUILDFLAG(IS_WIN) |
| // Must only be called both after initialization of FeatureList and |
| // NotifyOtherProcessOrCreate(). |
| void InitializeFeatures(); |
| #endif |
| |
| // Create the chrome process singleton instance for the current process. |
| static void CreateInstance(const base::FilePath& user_data_dir); |
| // Delete the chrome process singleton instance. |
| static void DeleteInstance(); |
| // Retrieve the chrome process singleton instance for the current process. |
| static ChromeProcessSingleton* GetInstance(); |
| |
| // Returns true if this process is the singleton instance (i.e., a |
| // ProcessSingleton has been created and NotifyOtherProcessOrCreate() has |
| // returned PROCESS_NONE). |
| static bool IsSingletonInstance(); |
| |
| private: |
| bool NotificationCallback(base::CommandLine command_line, |
| const base::FilePath& current_directory); |
| |
| // Whether or not this instance is the running single instance. |
| bool is_singleton_instance_ = false; |
| |
| // We compose these two locks with the client-supplied notification callback. |
| // First |modal_dialog_lock_| will discard any notifications that arrive while |
| // a modal dialog is active. Otherwise, it will pass the notification to |
| // |startup_lock_|, which will queue notifications until |Unlock()| is called. |
| // Notifications passing through both locks are finally delivered to our |
| // client. |
| ProcessSingletonStartupLock startup_lock_; |
| |
| // The basic ProcessSingleton |
| ProcessSingleton process_singleton_; |
| ProcessSingleton::NotificationCallback notification_callback_; |
| }; |
| |
| #endif // CHROME_BROWSER_CHROME_PROCESS_SINGLETON_H_ |