// 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_
