| Index: mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl
|
| diff --git a/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl
|
| index 44d1428d00340edc9472a5e6f2bcba0a5854eca5..8cfe8e5f550b9420190387248e3284d7d590bd19 100644
|
| --- a/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl
|
| +++ b/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl
|
| @@ -116,16 +116,21 @@ class {{class_name}}_{{method.name}}_ProxyToResponder
|
| public:
|
| virtual ~{{class_name}}_{{method.name}}_ProxyToResponder() {
|
| delete responder_;
|
| - // TODO(rudominer) DCHECK if |was_run_| is false and we don't have evidence
|
| - // that we are in a legitamte shutdown case such as the Connector detected
|
| - // an error or Close() was invoked.
|
| + {{class_name}}Stub* stub = associated_stub_.value();
|
| + if (stub && !stub->connection_error_occurred() && !stub->closed()) {
|
| + MOJO_DCHECK(was_run_) << "The callback passed to "
|
| + "{{class_name}}::{{method.name}}({%- if method.parameters -%}{{pass_params(method.parameters)}}, {% endif -%}callback) "
|
| + "was never run.";
|
| + }
|
| }
|
|
|
| {{class_name}}_{{method.name}}_ProxyToResponder(
|
| uint64_t request_id,
|
| - mojo::MessageReceiver* responder)
|
| + mojo::MessageReceiver* responder,
|
| + const ::mojo::internal::SharedData<{{class_name}}Stub*>& stub)
|
| : request_id_(request_id),
|
| responder_(responder),
|
| + associated_stub_(stub),
|
| was_run_(false) {
|
| }
|
|
|
| @@ -134,6 +139,7 @@ class {{class_name}}_{{method.name}}_ProxyToResponder
|
| private:
|
| uint64_t request_id_;
|
| mutable mojo::MessageReceiver* responder_;
|
| + ::mojo::internal::SharedData<{{class_name}}Stub*> associated_stub_;
|
| mutable bool was_run_;
|
| MOJO_DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_ProxyToResponder);
|
| };
|
| @@ -156,7 +162,12 @@ void {{class_name}}_{{method.name}}_ProxyToResponder::Run(
|
| {%- endfor %}
|
|
|
| {{class_name}}Stub::{{class_name}}Stub()
|
| - : sink_(nullptr) {
|
| + : sink_(nullptr), weak_self_(this), connection_error_occurred_(false),
|
| + closed_(false) {
|
| +}
|
| +
|
| +{{class_name}}Stub::~{{interface.name}}Stub() {
|
| + weak_self_.set_value(nullptr);
|
| }
|
|
|
| {#--- Stub definition #}
|
| @@ -201,7 +212,7 @@ bool {{class_name}}Stub::AcceptWithResponder(
|
| params->DecodePointersAndHandles(message->mutable_handles());
|
| {{class_name}}::{{method.name}}Callback::Runnable* runnable =
|
| new {{class_name}}_{{method.name}}_ProxyToResponder(
|
| - message->request_id(), responder);
|
| + message->request_id(), responder, weak_self_);
|
| {{class_name}}::{{method.name}}Callback callback(runnable);
|
| {{alloc_params(method|struct_from_method)|indent(4)}}
|
| // A null |sink_| means no implementation was bound.
|
|
|