C++程序  |  53行  |  1.57 KB

// 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 MOJO_EDK_SYSTEM_BROKER_H_
#define MOJO_EDK_SYSTEM_BROKER_H_

#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/synchronization/lock.h"
#include "mojo/edk/embedder/scoped_platform_handle.h"

namespace mojo {
namespace edk {

class PlatformSharedBuffer;

// The Broker is a channel to the parent process, which allows synchronous IPCs.
class Broker {
 public:
  // Note: This is blocking, and will wait for the first message over
  // |platform_handle|.
  explicit Broker(ScopedPlatformHandle platform_handle);
  ~Broker();

  // Returns the platform handle that should be used to establish a NodeChannel
  // to the parent process.
  ScopedPlatformHandle GetParentPlatformHandle();

  // Request a shared buffer from the parent process. Blocks the current thread.
  scoped_refptr<PlatformSharedBuffer> GetSharedBuffer(size_t num_bytes);

 private:
  // Handle to the parent process, used for synchronous IPCs.
  ScopedPlatformHandle sync_channel_;

  // Handle to the parent process which is recieved in the first first message
  // over |sync_channel_|.
  ScopedPlatformHandle parent_channel_;

  // Lock to only allow one sync message at a time. This avoids having to deal
  // with message ordering since we can only have one request at a time
  // in-flight.
  base::Lock lock_;

  DISALLOW_COPY_AND_ASSIGN(Broker);
};

}  // namespace edk
}  // namespace mojo

#endif  // MOJO_EDK_SYSTEM_BROKER_H_