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

Side by Side 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 unified diff | Download patch
OLDNEW
1 {%- import "interface_macros.tmpl" as interface_macros %} 1 {%- import "interface_macros.tmpl" as interface_macros %}
2 {%- import "struct_macros.tmpl" as struct_macros %} 2 {%- import "struct_macros.tmpl" as struct_macros %}
3 {%- set class_name = interface.name %} 3 {%- set class_name = interface.name %}
4 {%- set proxy_name = interface.name ~ "Proxy" %} 4 {%- set proxy_name = interface.name ~ "Proxy" %}
5 {%- set namespace_as_string = "%s"|format(namespace|replace(".","::")) %} 5 {%- set namespace_as_string = "%s"|format(namespace|replace(".","::")) %}
6 6
7 {%- macro alloc_params(struct) %} 7 {%- macro alloc_params(struct) %}
8 {%- for param in struct.packed.packed_fields_in_ordinal_order %} 8 {%- for param in struct.packed.packed_fields_in_ordinal_order %}
9 {{param.field.kind|cpp_result_type}} p_{{param.field.name}}{}; 9 {{param.field.kind|cpp_result_type}} p_{{param.field.name}}{};
10 {%- endfor %} 10 {%- endfor %}
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
109 {%- set message_name = 109 {%- set message_name =
110 "internal::k%s_%s_Name"|format(interface.name, method.name) %} 110 "internal::k%s_%s_Name"|format(interface.name, method.name) %}
111 {%- set response_params_struct = method|response_struct_from_method %} 111 {%- set response_params_struct = method|response_struct_from_method %}
112 {%- set params_description = 112 {%- set params_description =
113 "%s.%s response"|format(interface.name, method.name) %} 113 "%s.%s response"|format(interface.name, method.name) %}
114 class {{class_name}}_{{method.name}}_ProxyToResponder 114 class {{class_name}}_{{method.name}}_ProxyToResponder
115 : public {{class_name}}::{{method.name}}Callback::Runnable { 115 : public {{class_name}}::{{method.name}}Callback::Runnable {
116 public: 116 public:
117 virtual ~{{class_name}}_{{method.name}}_ProxyToResponder() { 117 virtual ~{{class_name}}_{{method.name}}_ProxyToResponder() {
118 delete responder_; 118 delete responder_;
119 // TODO(rudominer) DCHECK if |was_run_| is false and we don't have evidence 119 {{class_name}}Stub* stub = associated_stub_.value();
120 // that we are in a legitamte shutdown case such as the Connector detected 120 if (stub && !stub->connection_error_occurred() && !stub->closed()) {
121 // an error or Close() was invoked. 121 MOJO_DCHECK(was_run_) << "The callback passed to "
122 "{{class_name}}::{{method.name}}({%- if method.parameters -%}{{pass_pa rams(method.parameters)}}, {% endif -%}callback) "
123 "was never run.";
124 }
122 } 125 }
123 126
124 {{class_name}}_{{method.name}}_ProxyToResponder( 127 {{class_name}}_{{method.name}}_ProxyToResponder(
125 uint64_t request_id, 128 uint64_t request_id,
126 mojo::MessageReceiver* responder) 129 mojo::MessageReceiver* responder,
130 const ::mojo::internal::SharedData<{{class_name}}Stub*>& stub)
127 : request_id_(request_id), 131 : request_id_(request_id),
128 responder_(responder), 132 responder_(responder),
133 associated_stub_(stub),
129 was_run_(false) { 134 was_run_(false) {
130 } 135 }
131 136
132 virtual void Run({{interface_macros.declare_params("in_", method.response_para meters)}}) const override; 137 virtual void Run({{interface_macros.declare_params("in_", method.response_para meters)}}) const override;
133 138
134 private: 139 private:
135 uint64_t request_id_; 140 uint64_t request_id_;
136 mutable mojo::MessageReceiver* responder_; 141 mutable mojo::MessageReceiver* responder_;
142 ::mojo::internal::SharedData<{{class_name}}Stub*> associated_stub_;
137 mutable bool was_run_; 143 mutable bool was_run_;
138 MOJO_DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_ProxyToResponder) ; 144 MOJO_DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_ProxyToResponder) ;
139 }; 145 };
140 void {{class_name}}_{{method.name}}_ProxyToResponder::Run( 146 void {{class_name}}_{{method.name}}_ProxyToResponder::Run(
141 {{interface_macros.declare_params("in_", method.response_parameters)}}) cons t { 147 {{interface_macros.declare_params("in_", method.response_parameters)}}) cons t {
142 was_run_ = true; 148 was_run_ = true;
143 {{struct_macros.get_serialized_size(response_params_struct, "in_%s")}} 149 {{struct_macros.get_serialized_size(response_params_struct, "in_%s")}}
144 mojo::internal::ResponseMessageBuilder builder( 150 mojo::internal::ResponseMessageBuilder builder(
145 {{message_name}}, size, request_id_); 151 {{message_name}}, size, request_id_);
146 {{build_message(response_params_struct, params_description)}} 152 {{build_message(response_params_struct, params_description)}}
147 bool ok = responder_->Accept(&message); 153 bool ok = responder_->Accept(&message);
148 MOJO_ALLOW_UNUSED_LOCAL(ok); 154 MOJO_ALLOW_UNUSED_LOCAL(ok);
149 // TODO(darin): !ok returned here indicates a malformed message, and that may 155 // TODO(darin): !ok returned here indicates a malformed message, and that may
150 // be good reason to close the connection. However, we don't have a way to do 156 // be good reason to close the connection. However, we don't have a way to do
151 // that from here. We should add a way. 157 // that from here. We should add a way.
152 delete responder_; 158 delete responder_;
153 responder_ = nullptr; 159 responder_ = nullptr;
154 } 160 }
155 {%- endif -%} 161 {%- endif -%}
156 {%- endfor %} 162 {%- endfor %}
157 163
158 {{class_name}}Stub::{{class_name}}Stub() 164 {{class_name}}Stub::{{class_name}}Stub()
159 : sink_(nullptr) { 165 : sink_(nullptr), weak_self_(this), connection_error_occurred_(false),
166 closed_(false) {
167 }
168
169 {{class_name}}Stub::~{{interface.name}}Stub() {
170 weak_self_.set_value(nullptr);
160 } 171 }
161 172
162 {#--- Stub definition #} 173 {#--- Stub definition #}
163 174
164 bool {{class_name}}Stub::Accept(mojo::Message* message) { 175 bool {{class_name}}Stub::Accept(mojo::Message* message) {
165 {%- if interface.methods %} 176 {%- if interface.methods %}
166 switch (message->header()->name) { 177 switch (message->header()->name) {
167 {%- for method in interface.methods %} 178 {%- for method in interface.methods %}
168 case internal::k{{class_name}}_{{method.name}}_Name: { 179 case internal::k{{class_name}}_{{method.name}}_Name: {
169 {%- if method.response_parameters == None %} 180 {%- if method.response_parameters == None %}
(...skipping 24 matching lines...) Expand all
194 {%- for method in interface.methods %} 205 {%- for method in interface.methods %}
195 case internal::k{{class_name}}_{{method.name}}_Name: { 206 case internal::k{{class_name}}_{{method.name}}_Name: {
196 {%- if method.response_parameters != None %} 207 {%- if method.response_parameters != None %}
197 internal::{{class_name}}_{{method.name}}_Params_Data* params = 208 internal::{{class_name}}_{{method.name}}_Params_Data* params =
198 reinterpret_cast<internal::{{class_name}}_{{method.name}}_Params_Data* >( 209 reinterpret_cast<internal::{{class_name}}_{{method.name}}_Params_Data* >(
199 message->mutable_payload()); 210 message->mutable_payload());
200 211
201 params->DecodePointersAndHandles(message->mutable_handles()); 212 params->DecodePointersAndHandles(message->mutable_handles());
202 {{class_name}}::{{method.name}}Callback::Runnable* runnable = 213 {{class_name}}::{{method.name}}Callback::Runnable* runnable =
203 new {{class_name}}_{{method.name}}_ProxyToResponder( 214 new {{class_name}}_{{method.name}}_ProxyToResponder(
204 message->request_id(), responder); 215 message->request_id(), responder, weak_self_);
205 {{class_name}}::{{method.name}}Callback callback(runnable); 216 {{class_name}}::{{method.name}}Callback callback(runnable);
206 {{alloc_params(method|struct_from_method)|indent(4)}} 217 {{alloc_params(method|struct_from_method)|indent(4)}}
207 // A null |sink_| means no implementation was bound. 218 // A null |sink_| means no implementation was bound.
208 assert(sink_); 219 assert(sink_);
209 sink_->{{method.name}}( 220 sink_->{{method.name}}(
210 {%- if method.parameters -%}{{pass_params(method.parameters)}}, {% endif -%}call back); 221 {%- if method.parameters -%}{{pass_params(method.parameters)}}, {% endif -%}call back);
211 return true; 222 return true;
212 {%- else %} 223 {%- else %}
213 break; 224 break;
214 {%- endif %} 225 {%- endif %}
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
279 break; 290 break;
280 } 291 }
281 {%- endfor %} 292 {%- endfor %}
282 } 293 }
283 {%- endif %} 294 {%- endif %}
284 295
285 assert(sink_); 296 assert(sink_);
286 return sink_->Accept(message); 297 return sink_->Accept(message);
287 } 298 }
288 {%- endif -%} 299 {%- endif -%}
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698