| 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 5831423ef07875459b3f6bff18f0a33c50352b29..fd6b643cce4ff4d8464c1f0cb5a62ce224475b7e 100644
|
| --- a/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl
|
| +++ b/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl
|
| @@ -115,31 +115,33 @@ class {{class_name}}_{{method.name}}_ProxyToResponder
|
| : public {{class_name}}::{{method.name}}Callback::Runnable {
|
| public:
|
| virtual ~{{class_name}}_{{method.name}}_ProxyToResponder() {
|
| + // Is the Mojo application destroying the callback without running it
|
| + // and without first closing the pipe?
|
| + bool callback_was_dropped = responder_ && responder_->IsValid();
|
| + // If the Callback was dropped then deleting the responder will close
|
| + // the pipe so the calling application knows to stop waiting for a reply.
|
| 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.
|
| + MOJO_DCHECK(!callback_was_dropped) << "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::MessageReceiverWithStatus* responder)
|
| : request_id_(request_id),
|
| - responder_(responder),
|
| - was_run_(false) {
|
| + responder_(responder) {
|
| }
|
|
|
| void Run({{interface_macros.declare_params("in_", method.response_parameters)}}) const override;
|
|
|
| private:
|
| uint64_t request_id_;
|
| - mutable mojo::MessageReceiver* responder_;
|
| - mutable bool was_run_;
|
| + mutable mojo::MessageReceiverWithStatus* responder_;
|
| MOJO_DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_ProxyToResponder);
|
| };
|
| void {{class_name}}_{{method.name}}_ProxyToResponder::Run(
|
| {{interface_macros.declare_params("in_", method.response_parameters)}}) const {
|
| - was_run_ = true;
|
| {{struct_macros.get_serialized_size(response_params_struct, "in_%s")}}
|
| mojo::internal::ResponseMessageBuilder builder(
|
| {{message_name}}, size, request_id_);
|
| @@ -159,6 +161,8 @@ void {{class_name}}_{{method.name}}_ProxyToResponder::Run(
|
| : sink_(nullptr) {
|
| }
|
|
|
| +{{class_name}}Stub::~{{interface.name}}Stub() {}
|
| +
|
| {#--- Stub definition #}
|
|
|
| bool {{class_name}}Stub::Accept(mojo::Message* message) {
|
| @@ -188,7 +192,7 @@ bool {{class_name}}Stub::Accept(mojo::Message* message) {
|
| }
|
|
|
| bool {{class_name}}Stub::AcceptWithResponder(
|
| - mojo::Message* message, mojo::MessageReceiver* responder) {
|
| + mojo::Message* message, mojo::MessageReceiverWithStatus* responder) {
|
| {%- if interface.methods %}
|
| switch (message->header()->name) {
|
| {%- for method in interface.methods %}
|
|
|