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

#ifndef BASE_MAC_MACH_PORT_BROKER_H_
#define BASE_MAC_MACH_PORT_BROKER_H_

#include <mach/mach.h>

#include <map>
#include <memory>
#include <string>

#include "base/base_export.h"
#include "base/mac/dispatch_source_mach.h"
#include "base/mac/scoped_mach_port.h"
#include "base/macros.h"
#include "base/process/port_provider_mac.h"
#include "base/process/process_handle.h"
#include "base/synchronization/lock.h"
#include "starboard/types.h"

namespace base {

// On OS X, the task port of a process is required to collect metrics about the
// process, and to insert Mach ports into the process. Running |task_for_pid()|
// is only allowed for privileged code. However, a process has port rights to
// all its subprocesses, so let the child processes send their Mach port to the
// parent over IPC.
//
// Mach ports can only be sent over Mach IPC, not over the |socketpair()| that
// the regular IPC system uses. Hence, the child processes opens a Mach
// connection shortly after launching and ipc their mach data to the parent
// process. A single |MachPortBroker| with a given name is expected to exist in
// the parent process.
//
// Since this data arrives over a separate channel, it is not available
// immediately after a child process has been started.
class BASE_EXPORT MachPortBroker : public base::PortProvider {
 public:
  // For use in child processes. This will send the task port of the current
  // process over Mach IPC to the port registered by name (via this class) in
  // the parent process. Returns true if the message was sent successfully
  // and false if otherwise.
  static bool ChildSendTaskPortToParent(const std::string& name);

  // Returns the Mach port name to use when sending or receiving messages.
  // Does the Right Thing in the browser and in child processes.
  static std::string GetMachPortName(const std::string& name, bool is_child);

  MachPortBroker(const std::string& name);
  ~MachPortBroker() override;

  // Performs any initialization work.
  bool Init();

  // Adds a placeholder to the map for the given pid with MACH_PORT_NULL.
  // Callers are expected to later update the port with FinalizePid(). Callers
  // MUST acquire the lock given by GetLock() before calling this method (and
  // release the lock afterwards).
  void AddPlaceholderForPid(base::ProcessHandle pid);

  // Removes |pid| from the task port map. Callers MUST acquire the lock given
  // by GetLock() before calling this method (and release the lock afterwards).
  void InvalidatePid(base::ProcessHandle pid);

  // The lock that protects this MachPortBroker object. Callers MUST acquire
  // and release this lock around calls to AddPlaceholderForPid(),
  // InvalidatePid(), and FinalizePid();
  base::Lock& GetLock() { return lock_; }

  // Implement |base::PortProvider|.
  mach_port_t TaskForPid(base::ProcessHandle process) const override;

 private:
  friend class MachPortBrokerTest;

  // Message handler that is invoked on |dispatch_source_| when an
  // incoming message needs to be received.
  void HandleRequest();

  // Updates the mapping for |pid| to include the given |mach_info|.  Does
  // nothing if PlaceholderForPid() has not already been called for the given
  // |pid|. Callers MUST acquire the lock given by GetLock() before calling
  // this method (and release the lock afterwards).
  void FinalizePid(base::ProcessHandle pid, mach_port_t task_port);

  // Name used to identify a particular port broker.
  const std::string name_;

  // The Mach port on which the server listens.
  base::mac::ScopedMachReceiveRight server_port_;

  // The dispatch source and queue on which Mach messages will be received.
  std::unique_ptr<base::DispatchSourceMach> dispatch_source_;

  // Stores mach info for every process in the broker.
  typedef std::map<base::ProcessHandle, mach_port_t> MachMap;
  MachMap mach_map_;

  // Mutex that guards |mach_map_|.
  mutable base::Lock lock_;

  DISALLOW_COPY_AND_ASSIGN(MachPortBroker);
};

}  // namespace base

#endif  // BASE_MAC_MACH_PORT_BROKER_H_
