OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_PTR_H_ | 5 #ifndef MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_PTR_H_ |
6 #define MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_PTR_H_ | 6 #define MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_PTR_H_ |
7 | 7 |
8 #include <algorithm> | 8 #include <algorithm> |
| 9 #include <cstddef> |
9 | 10 |
10 #include "mojo/public/cpp/bindings/callback.h" | 11 #include "mojo/public/cpp/bindings/callback.h" |
11 #include "mojo/public/cpp/bindings/interface_ptr_info.h" | 12 #include "mojo/public/cpp/bindings/interface_ptr_info.h" |
12 #include "mojo/public/cpp/bindings/lib/interface_ptr_internal.h" | 13 #include "mojo/public/cpp/bindings/lib/interface_ptr_internal.h" |
13 #include "mojo/public/cpp/environment/environment.h" | 14 #include "mojo/public/cpp/environment/environment.h" |
14 #include "mojo/public/cpp/system/macros.h" | 15 #include "mojo/public/cpp/system/macros.h" |
15 | 16 |
16 namespace mojo { | 17 namespace mojo { |
17 | 18 |
18 // A pointer to a local proxy of a remote Interface implementation. Uses a | 19 // A pointer to a local proxy of a remote Interface implementation. Uses a |
19 // message pipe to communicate with the remote implementation, and automatically | 20 // message pipe to communicate with the remote implementation, and automatically |
20 // closes the pipe and deletes the proxy on destruction. The pointer must be | 21 // closes the pipe and deletes the proxy on destruction. The pointer must be |
21 // bound to a message pipe before the interface methods can be called. | 22 // bound to a message pipe before the interface methods can be called. |
22 // | 23 // |
23 // This class is thread hostile, as is the local proxy it manages. All calls to | 24 // This class is thread hostile, as is the local proxy it manages. All calls to |
24 // this class or the proxy should be from the same thread that created it. If | 25 // this class or the proxy should be from the same thread that created it. If |
25 // you need to move the proxy to a different thread, extract the | 26 // you need to move the proxy to a different thread, extract the |
26 // InterfacePtrInfo (containing just the message pipe and any version | 27 // InterfacePtrInfo (containing just the message pipe and any version |
27 // information) using PassInterface(), pass it to a different thread, and | 28 // information) using PassInterface(), pass it to a different thread, and |
28 // create and bind a new InterfacePtr from that thread. | 29 // create and bind a new InterfacePtr from that thread. |
29 template <typename Interface> | 30 template <typename Interface> |
30 class InterfacePtr { | 31 class InterfacePtr { |
31 public: | 32 public: |
32 // Constructs an unbound InterfacePtr. | 33 // Constructs an unbound InterfacePtr. |
33 InterfacePtr() {} | 34 InterfacePtr() {} |
34 InterfacePtr(decltype(nullptr)) {} | 35 InterfacePtr(std::nullptr_t) {} |
35 | 36 |
36 // Takes over the binding of another InterfacePtr. | 37 // Takes over the binding of another InterfacePtr. |
37 InterfacePtr(InterfacePtr&& other) { | 38 InterfacePtr(InterfacePtr&& other) { |
38 internal_state_.Swap(&other.internal_state_); | 39 internal_state_.Swap(&other.internal_state_); |
39 } | 40 } |
40 | 41 |
41 // Takes over the binding of another InterfacePtr, and closes any message pipe | 42 // Takes over the binding of another InterfacePtr, and closes any message pipe |
42 // already bound to this pointer. | 43 // already bound to this pointer. |
43 InterfacePtr& operator=(InterfacePtr&& other) { | 44 InterfacePtr& operator=(InterfacePtr&& other) { |
44 reset(); | 45 reset(); |
45 internal_state_.Swap(&other.internal_state_); | 46 internal_state_.Swap(&other.internal_state_); |
46 return *this; | 47 return *this; |
47 } | 48 } |
48 | 49 |
49 // Assigning nullptr to this class causes it to close the currently bound | 50 // Assigning nullptr to this class causes it to close the currently bound |
50 // message pipe (if any) and returns the pointer to the unbound state. | 51 // message pipe (if any) and returns the pointer to the unbound state. |
51 InterfacePtr& operator=(decltype(nullptr)) { | 52 InterfacePtr& operator=(std::nullptr_t) { |
52 reset(); | 53 reset(); |
53 return *this; | 54 return *this; |
54 } | 55 } |
55 | 56 |
56 // Closes the bound message pipe (if any) on destruction. | 57 // Closes the bound message pipe (if any) on destruction. |
57 ~InterfacePtr() {} | 58 ~InterfacePtr() {} |
58 | 59 |
59 // Binds the InterfacePtr to a remote implementation of Interface. The | 60 // Binds the InterfacePtr to a remote implementation of Interface. The |
60 // |waiter| is used for receiving notifications when there is data to read | 61 // |waiter| is used for receiving notifications when there is data to read |
61 // from the message pipe. For most callers, the default |waiter| will be | 62 // from the message pipe. For most callers, the default |waiter| will be |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
180 const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) { | 181 const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) { |
181 InterfacePtr<Interface> ptr; | 182 InterfacePtr<Interface> ptr; |
182 if (info.is_valid()) | 183 if (info.is_valid()) |
183 ptr.Bind(info.Pass(), waiter); | 184 ptr.Bind(info.Pass(), waiter); |
184 return ptr; | 185 return ptr; |
185 } | 186 } |
186 | 187 |
187 } // namespace mojo | 188 } // namespace mojo |
188 | 189 |
189 #endif // MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_PTR_H_ | 190 #endif // MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_PTR_H_ |
OLD | NEW |