// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CONTENT_BROWSER_TRACING_TRACING_SERVICE_CONTROLLER_H_
#define CONTENT_BROWSER_TRACING_TRACING_SERVICE_CONTROLLER_H_

#include <map>
#include <memory>

#include "base/functional/callback.h"
#include "base/no_destructor.h"
#include "base/process/process_handle.h"
#include "base/types/pass_key.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "services/tracing/public/mojom/traced_process.mojom.h"
#include "services/tracing/public/mojom/tracing_service.mojom.h"

namespace content {

// Processes participating in tracing must register themselves with the global
// instance of this object.
class TracingServiceController {
 public:
  // An object held for the duration of any client process's registration with
  // the tracing service.
  class ClientRegistration {
   public:
    ClientRegistration(base::PassKey<TracingServiceController>,
                       base::OnceClosure unregister);
    ~ClientRegistration();

   private:
    base::OnceClosure unregister_;
  };

  TracingServiceController(const TracingServiceController&) = delete;
  ~TracingServiceController();
  TracingServiceController& operator=(const TracingServiceController&) = delete;

  // Gets the global instance of this object. Safe to call from any sequence,
  // but see individual methods for other potential constraints.
  static TracingServiceController& Get();

  // A callback each process host must provide to implement how a TracedProcess
  // interface is bound in the corresponding client process. Callbacks are
  // always called from the UI thread.
  using EnableTracingCallback = base::RepeatingCallback<void(
      mojo::PendingReceiver<tracing::mojom::TracedProcess>)>;

  // Registers a new client process with the tracing system. Any time the
  // tracing service is started, |callback| will be invoked to connect the
  // client process to the service.
  //
  // The process will remain registered as long as the returned
  // ClientRegistration object remains alive.
  //
  // Safe to call from any sequence.
  std::unique_ptr<ClientRegistration> RegisterClient(
      base::ProcessId pid,
      EnableTracingCallback callback);

  // Retrieves a remote interface to the tracing service, which is started
  // lazily if needed. Public content API consumers can use
  // |content::GetTracingService()|.
  //
  // Must only be called on the UI thread.
  tracing::mojom::TracingService& GetService();

 private:
  friend class base::NoDestructor<TracingServiceController>;

  TracingServiceController();

  // Handles disconnection by the tracing service.
  void OnTracingServiceDisconnected();
  void RegisterClientOnUIThread(base::ProcessId pid,
                                EnableTracingCallback callback);
  void RemoveClient(base::ProcessId pid);

  // NOTE: This state is accessed only from the UI thread.
  mojo::Remote<tracing::mojom::TracingService> service_;
  std::map<base::ProcessId, EnableTracingCallback> clients_;
};

}  // namespace content

#endif  // CONTENT_BROWSER_TRACING_TRACING_SERVICE_CONTROLLER_H_
