Index: mojo/public/cpp/bindings/lib/interface_impl_internal.h |
diff --git a/mojo/public/cpp/bindings/lib/interface_impl_internal.h b/mojo/public/cpp/bindings/lib/interface_impl_internal.h |
index 1c912661fd96a95d41661add0ad664f05ce063b3..de83ee909b090fb7860fae68f42a29fdfb631f24 100644 |
--- a/mojo/public/cpp/bindings/lib/interface_impl_internal.h |
+++ b/mojo/public/cpp/bindings/lib/interface_impl_internal.h |
@@ -13,6 +13,7 @@ |
#include "mojo/public/cpp/system/macros.h" |
namespace mojo { |
+ |
darin (slow to review)
2014/07/15 06:10:38
nit: no new line here is OK, right?
|
namespace internal { |
template <typename Interface> |
@@ -29,8 +30,7 @@ class InterfaceImplState : public ErrorHandler { |
typedef typename Interface::Client Client; |
explicit InterfaceImplState(InterfaceImplBase<Interface>* instance) |
- : router_(NULL), |
- proxy_(NULL) { |
+ : router_(NULL), proxy_(NULL), delete_on_error_(false) { |
assert(instance); |
stub_.set_sink(instance); |
} |
@@ -48,11 +48,12 @@ class InterfaceImplState : public ErrorHandler { |
const MojoAsyncWaiter* waiter = Environment::GetDefaultAsyncWaiter()) { |
MessagePipe pipe; |
ptr->Bind(pipe.handle0.Pass(), waiter); |
- Bind(pipe.handle1.Pass(), waiter); |
+ Bind(pipe.handle1.Pass(), waiter, true /* delete_on_error */); |
} |
void Bind(ScopedMessagePipeHandle handle, |
- const MojoAsyncWaiter* waiter) { |
+ const MojoAsyncWaiter* waiter, |
+ bool delete_on_error) { |
assert(!router_); |
FilterChain filters; |
@@ -65,6 +66,7 @@ class InterfaceImplState : public ErrorHandler { |
router_->set_error_handler(this); |
proxy_ = new typename Client::Proxy_(router_); |
+ delete_on_error_ = delete_on_error; |
instance()->OnConnectionEstablished(); |
} |
@@ -83,12 +85,20 @@ class InterfaceImplState : public ErrorHandler { |
} |
virtual void OnConnectionError() MOJO_OVERRIDE { |
+ // If the connection error behavior is not delete_on_error_ the instance |
+ // might choose to delete itself in the OnConnectionError handler, which |
+ // would in turn delete this. Save the error behavior before invoking the |
+ // error handler so we can correctly decide what to do. |
+ bool delete_on_error = delete_on_error_; |
instance()->OnConnectionError(); |
+ if (delete_on_error) |
darin (slow to review)
2014/07/15 06:10:38
It might be useful to add some debug assertions th
jamesr
2014/07/15 18:07:22
I added a !NDEBUG-only boolean member that I set b
|
+ delete instance(); |
} |
Router* router_; |
typename Client::Proxy_* proxy_; |
typename Interface::Stub_ stub_; |
+ bool delete_on_error_; |
MOJO_DISALLOW_COPY_AND_ASSIGN(InterfaceImplState); |
}; |