1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef MOJO_EDK_SYSTEM_BROKER_H_
6 #define MOJO_EDK_SYSTEM_BROKER_H_
7 
8 #include "base/macros.h"
9 #include "base/memory/ref_counted.h"
10 #include "base/synchronization/lock.h"
11 #include "mojo/edk/embedder/scoped_platform_handle.h"
12 
13 namespace mojo {
14 namespace edk {
15 
16 class PlatformSharedBuffer;
17 
18 // The Broker is a channel to the parent process, which allows synchronous IPCs.
19 class Broker {
20  public:
21   // Note: This is blocking, and will wait for the first message over
22   // |platform_handle|.
23   explicit Broker(ScopedPlatformHandle platform_handle);
24   ~Broker();
25 
26   // Returns the platform handle that should be used to establish a NodeChannel
27   // to the parent process.
28   ScopedPlatformHandle GetParentPlatformHandle();
29 
30   // Request a shared buffer from the parent process. Blocks the current thread.
31   scoped_refptr<PlatformSharedBuffer> GetSharedBuffer(size_t num_bytes);
32 
33  private:
34   // Handle to the parent process, used for synchronous IPCs.
35   ScopedPlatformHandle sync_channel_;
36 
37   // Handle to the parent process which is recieved in the first first message
38   // over |sync_channel_|.
39   ScopedPlatformHandle parent_channel_;
40 
41   // Lock to only allow one sync message at a time. This avoids having to deal
42   // with message ordering since we can only have one request at a time
43   // in-flight.
44   base::Lock lock_;
45 
46   DISALLOW_COPY_AND_ASSIGN(Broker);
47 };
48 
49 }  // namespace edk
50 }  // namespace mojo
51 
52 #endif  // MOJO_EDK_SYSTEM_BROKER_H_
53