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. |