Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(550)

Side by Side Diff: mojo/public/cpp/bindings/interface_ptr.h

Issue 400043004: InterfacePtr: not configure proxy until actual read/write is needed. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 <assert.h> 8 #include <assert.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
53 bool WaitForIncomingMethodCall() { 53 bool WaitForIncomingMethodCall() {
54 return internal_state_.WaitForIncomingMethodCall(); 54 return internal_state_.WaitForIncomingMethodCall();
55 } 55 }
56 56
57 // This method configures the InterfacePtr<..> to be a proxy to a remote 57 // This method configures the InterfacePtr<..> to be a proxy to a remote
58 // object on the other end of the given pipe. 58 // object on the other end of the given pipe.
59 // 59 //
60 // The proxy is bound to the current thread, which means its methods may 60 // The proxy is bound to the current thread, which means its methods may
61 // only be called on the current thread. 61 // only be called on the current thread.
62 // 62 //
63 // To move a bound InterfacePtr<..> to another thread, call 63 // To move a bound InterfacePtr<..> to another thread, call PassMessagePipe().
64 // ResetAndReturnMessagePipe. Then create a new InterfacePtr<..> on another 64 // Then create a new InterfacePtr<..> on another thread, and bind the new
65 // thread, and bind the new InterfacePtr<..> to the message pipe on that 65 // InterfacePtr<..> to the message pipe on that thread.
66 // thread.
67 void Bind( 66 void Bind(
68 ScopedMessagePipeHandle handle, 67 ScopedMessagePipeHandle handle,
69 const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) { 68 const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) {
70 reset(); 69 reset();
71 internal_state_.ConfigureProxy(handle.Pass(), waiter); 70 internal_state_.Bind(handle.Pass(), waiter);
72 } 71 }
73 72
74 // The client interface may only be set after this InterfacePtr<..> is bound. 73 // The client interface may only be set after this InterfacePtr<..> is bound.
75 void set_client(typename Interface::Client* client) { 74 void set_client(typename Interface::Client* client) {
76 internal_state_.set_client(client); 75 internal_state_.set_client(client);
77 } 76 }
78 77
79 // This method may be called to query if the underlying pipe has encountered 78 // This method may be called to query if the underlying pipe has encountered
80 // an error. If true, this means method calls made on this interface will be 79 // an error. If true, this means method calls made on this interface will be
81 // dropped (and may have already been dropped) on the floor. 80 // dropped (and may have already been dropped) on the floor.
82 bool encountered_error() const { 81 bool encountered_error() const {
83 assert(internal_state_.router()); 82 return internal_state_.encountered_error();
84 return internal_state_.router()->encountered_error();
85 } 83 }
86 84
87 // This method may be called to register an ErrorHandler to observe a 85 // This method may be called to register an ErrorHandler to observe a
88 // connection error on the underlying pipe. The callback runs asynchronously 86 // connection error on the underlying pipe. It must only be called on a bound
89 // from the current message loop. 87 // object.
88 // The callback runs asynchronously from the current message loop.
90 void set_error_handler(ErrorHandler* error_handler) { 89 void set_error_handler(ErrorHandler* error_handler) {
91 assert(internal_state_.router()); 90 internal_state_.set_error_handler(error_handler);
92 internal_state_.router()->set_error_handler(error_handler);
93 } 91 }
94 92
95 // Returns the underlying message pipe handle (if any) and resets the 93 // Returns the underlying message pipe handle (if any) and resets the
96 // InterfacePtr<..> to its uninitialized state. This method is helpful if you 94 // InterfacePtr<..> to its uninitialized state. This method is helpful if you
97 // need to move a proxy to another thread. See related notes for Bind. 95 // need to move a proxy to another thread. See related notes for Bind.
98 ScopedMessagePipeHandle PassMessagePipe() { 96 ScopedMessagePipeHandle PassMessagePipe() {
99 State state; 97 State state;
100 internal_state_.Swap(&state); 98 internal_state_.Swap(&state);
101 return state.router() ? 99 return state.PassMessagePipe();
102 state.router()->PassMessagePipe() : ScopedMessagePipeHandle();
103 } 100 }
104 101
105 // DO NOT USE. Exposed only for internal use and for testing. 102 // DO NOT USE. Exposed only for internal use and for testing.
106 internal::InterfacePtrState<Interface>* internal_state() { 103 internal::InterfacePtrState<Interface>* internal_state() {
107 return &internal_state_; 104 return &internal_state_;
108 } 105 }
109 106
110 private: 107 private:
111 typedef internal::InterfacePtrState<Interface> State; 108 typedef internal::InterfacePtrState<Interface> State;
112 State internal_state_; 109 mutable State internal_state_;
113 }; 110 };
114 111
115 // Takes a handle to the proxy end-point of a pipe. On the other end is 112 // Takes a handle to the proxy end-point of a pipe. On the other end is
116 // presumed to be an interface implementation of type |Interface|. Returns a 113 // presumed to be an interface implementation of type |Interface|. Returns a
117 // generated proxy to that interface, which may be used on the current thread. 114 // generated proxy to that interface, which may be used on the current thread.
118 // It is valid to call set_client on the returned InterfacePtr<..> to set an 115 // It is valid to call set_client on the returned InterfacePtr<..> to set an
119 // instance of Interface::Client. 116 // instance of Interface::Client.
120 template <typename Interface> 117 template <typename Interface>
121 InterfacePtr<Interface> MakeProxy( 118 InterfacePtr<Interface> MakeProxy(
122 ScopedMessagePipeHandle handle, 119 ScopedMessagePipeHandle handle,
123 const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) { 120 const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) {
124 InterfacePtr<Interface> ptr; 121 InterfacePtr<Interface> ptr;
125 if (handle.is_valid()) 122 if (handle.is_valid())
126 ptr.Bind(handle.Pass(), waiter); 123 ptr.Bind(handle.Pass(), waiter);
127 return ptr.Pass(); 124 return ptr.Pass();
128 } 125 }
129 126
130 } // namespace mojo 127 } // namespace mojo
131 128
132 #endif // MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_PTR_H_ 129 #endif // MOJO_PUBLIC_CPP_BINDINGS_INTERFACE_PTR_H_
OLDNEW
« no previous file with comments | « mojo/apps/js/test/js_to_cpp_unittest.cc ('k') | mojo/public/cpp/bindings/lib/interface_ptr_internal.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698