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

Unified Diff: mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl

Issue 1003773002: CPP bindings: DCHECK when a Callback is destructed without being invoked (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Fixed BUILD.gn file. Created 5 years, 9 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 side-by-side diff with in-line comments
Download patch
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.

Powered by Google App Engine
This is Rietveld 408576698