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

#include "chrome/browser/chrome_process_singleton.h"

#include <utility>

#include "build/build_config.h"

#if BUILDFLAG(IS_WIN)
#include <windows.h>

#include "base/metrics/histogram_functions.h"
#include "chrome/common/chrome_features.h"
#include "components/app_launch_prefetch/app_launch_prefetch.h"
#endif

namespace {

ChromeProcessSingleton* g_chrome_process_singleton_ = nullptr;

}  // namespace

ChromeProcessSingleton::ChromeProcessSingleton(
    const base::FilePath& user_data_dir)
    : startup_lock_(
          base::BindRepeating(&ChromeProcessSingleton::NotificationCallback,
                              base::Unretained(this))),
      process_singleton_(user_data_dir,
                         startup_lock_.AsNotificationCallback()) {}

ChromeProcessSingleton::~ChromeProcessSingleton() = default;

ProcessSingleton::NotifyResult
    ChromeProcessSingleton::NotifyOtherProcessOrCreate() {
  CHECK(!is_singleton_instance_);
  ProcessSingleton::NotifyResult result =
      process_singleton_.NotifyOtherProcessOrCreate();
  if (result == ProcessSingleton::PROCESS_NONE) {
    is_singleton_instance_ = true;
  }
  return result;
}

void ChromeProcessSingleton::StartWatching() {
  process_singleton_.StartWatching();
}

void ChromeProcessSingleton::Cleanup() {
  if (is_singleton_instance_) {
    process_singleton_.Cleanup();
  }
}

void ChromeProcessSingleton::Unlock(
    const ProcessSingleton::NotificationCallback& notification_callback) {
  notification_callback_ = notification_callback;
  startup_lock_.Unlock();
}

#if BUILDFLAG(IS_WIN)
void ChromeProcessSingleton::InitializeFeatures() {
  // On Windows, App Launch Prefetch (ALPF) will monitor the disk accesses done
  // by processes launched, and load the resources used into memory before the
  // process needs them, if possible. Different Chrome process types use
  // different resources, and this is signaled to ALPF via the command line:
  // passing "/prefetch:N" on the command line with different numbers causes
  // ALPF to treat two launches placed in different buckets as separarate
  // applications for its purposes.
  //
  // Short lived browser processes occur on notification and rendezvous, both
  // cases where nearly nothing will be used from disk, and which are not
  // launched with `/prefetch`, and are thus considered "browser" processes
  // according to ALPF. This may be polluting the ALPF cache.
  //
  // The `::ProcessOverrideSubsequentPrefetchParameter` process information
  // attribute will change the behavior of ALPF to explicitly consider
  // subsequent launches while this singleton process is running (rendezvous,
  // toast) of Chrome which do not specify a prefetch bucket as if they had
  // specified the `kCatchAll` bucket.
  //
  // It is expected that this will overall improve the behavior of ALPF on
  // Windows, which should decrease startup time for ordinary browser processes.
  if (is_singleton_instance_ &&
      (wcsstr(::GetCommandLineW(), L"/prefetch:") == nullptr) &&
      base::FeatureList::IsEnabled(features::kOverridePrefetchOnSingleton)) {
    OVERRIDE_PREFETCH_PARAMETER prefetch_parameter = {};
    prefetch_parameter.Value = app_launch_prefetch::GetPrefetchBucket(
        app_launch_prefetch::SubprocessType::kCatchAll);
    // This is not fatal because it is an optimization and has no bearing on the
    // functionality of the browser. See crbug.com/380088804 for details. It has
    // been seen that occasionally (in CQ), this call fails with
    // ERROR_INTERNAL_ERROR.
    base::UmaHistogramSparse(
        "Startup.PrefetchOverrideErrorCode",
        ::SetProcessInformation(::GetCurrentProcess(),
                                ::ProcessOverrideSubsequentPrefetchParameter,
                                &prefetch_parameter, sizeof(prefetch_parameter))
            ? ERROR_SUCCESS
            : ::GetLastError());
  }
}
#endif

// static
void ChromeProcessSingleton::CreateInstance(
    const base::FilePath& user_data_dir) {
  DCHECK(!g_chrome_process_singleton_);
  DCHECK(!user_data_dir.empty());
  g_chrome_process_singleton_ = new ChromeProcessSingleton(user_data_dir);
}

// static
void ChromeProcessSingleton::DeleteInstance() {
  if (g_chrome_process_singleton_) {
    delete g_chrome_process_singleton_;
    g_chrome_process_singleton_ = nullptr;
  }
}

// static
ChromeProcessSingleton* ChromeProcessSingleton::GetInstance() {
  CHECK(g_chrome_process_singleton_);
  return g_chrome_process_singleton_;
}

// static
bool ChromeProcessSingleton::IsSingletonInstance() {
  return g_chrome_process_singleton_ &&
         g_chrome_process_singleton_->is_singleton_instance_;
}

bool ChromeProcessSingleton::NotificationCallback(
    base::CommandLine command_line,
    const base::FilePath& current_directory) {
  DCHECK(notification_callback_);
  return notification_callback_.Run(std::move(command_line), current_directory);
}
