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

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

Issue 2766523002: mojo: MessageReceiver*::AcceptWithResponder() now take a unique_ptr to the responder (Closed)
Patch Set: comments Created 3 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 3
4 {%- set class_name = interface.name %} 4 {%- set class_name = interface.name %}
5 {%- set proxy_name = interface.name ~ "Proxy" %} 5 {%- set proxy_name = interface.name ~ "Proxy" %}
6 {%- set namespace_as_string = "%s"|format(namespace|replace(".","::")) %} 6 {%- set namespace_as_string = "%s"|format(namespace|replace(".","::")) %}
7 7
8 {%- macro alloc_params(struct, params, message, description) %} 8 {%- macro alloc_params(struct, params, message, description) %}
9 mojo::internal::SerializationContext serialization_context; 9 mojo::internal::SerializationContext serialization_context;
10 serialization_context.handles.Swap(({{message}})->mutable_handles()); 10 serialization_context.handles.Swap(({{message}})->mutable_handles());
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
162 162
163 mojo::internal::MessageBuilder builder( 163 mojo::internal::MessageBuilder builder(
164 {{message_name}}, 164 {{message_name}},
165 mojo::Message::kFlagIsSync | mojo::Message::kFlagExpectsResponse, 165 mojo::Message::kFlagIsSync | mojo::Message::kFlagExpectsResponse,
166 size, serialization_context.associated_endpoint_count); 166 size, serialization_context.associated_endpoint_count);
167 167
168 {{build_message(params_struct, "param_%s", params_description, 168 {{build_message(params_struct, "param_%s", params_description,
169 "&serialization_context")}} 169 "&serialization_context")}}
170 170
171 bool result = false; 171 bool result = false;
172 mojo::MessageReceiver* responder = 172 std::unique_ptr<mojo::MessageReceiver> responder(
173 new {{class_name}}_{{method.name}}_HandleSyncResponse( 173 new {{class_name}}_{{method.name}}_HandleSyncResponse(
174 &result 174 &result
175 {%- for param in method.response_parameters -%} 175 {%- for param in method.response_parameters -%}
176 , param_{{param.name}} 176 , param_{{param.name}}
177 {%- endfor %}); 177 {%- endfor %}));
178 if (!receiver_->AcceptWithResponder(builder.message(), responder)) 178 ignore_result(receiver_->AcceptWithResponder(builder.message(),
179 delete responder; 179 std::move(responder)));
180 return result; 180 return result;
181 } 181 }
182 {%- endif %} 182 {%- endif %}
183 183
184 void {{proxy_name}}::{{method.name}}( 184 void {{proxy_name}}::{{method.name}}(
185 {{interface_macros.declare_request_params("in_", method, use_once_callback)} }) { 185 {{interface_macros.declare_request_params("in_", method, use_once_callback)} }) {
186 mojo::internal::SerializationContext serialization_context; 186 mojo::internal::SerializationContext serialization_context;
187 {{struct_macros.get_serialized_size(params_struct, "in_%s", 187 {{struct_macros.get_serialized_size(params_struct, "in_%s",
188 "&serialization_context")}} 188 "&serialization_context")}}
189 189
190 {%- if method.response_parameters != None %} 190 {%- if method.response_parameters != None %}
191 constexpr uint32_t kFlags = mojo::Message::kFlagExpectsResponse; 191 constexpr uint32_t kFlags = mojo::Message::kFlagExpectsResponse;
192 {%- else %} 192 {%- else %}
193 constexpr uint32_t kFlags = 0; 193 constexpr uint32_t kFlags = 0;
194 {%- endif %} 194 {%- endif %}
195 mojo::internal::MessageBuilder builder( 195 mojo::internal::MessageBuilder builder(
196 {{message_name}}, kFlags, size, 196 {{message_name}}, kFlags, size,
197 serialization_context.associated_endpoint_count); 197 serialization_context.associated_endpoint_count);
198 198
199 {{build_message(params_struct, "in_%s", params_description, 199 {{build_message(params_struct, "in_%s", params_description,
200 "&serialization_context")}} 200 "&serialization_context")}}
201 201
202 {%- if method.response_parameters != None %} 202 {%- if method.response_parameters != None %}
203 mojo::MessageReceiver* responder = 203 std::unique_ptr<mojo::MessageReceiver> responder(
204 new {{class_name}}_{{method.name}}_ForwardToCallback(std::move(callback)); 204 new {{class_name}}_{{method.name}}_ForwardToCallback(
205 if (!receiver_->AcceptWithResponder(builder.message(), responder)) 205 std::move(callback)));
206 delete responder; 206 ignore_result(receiver_->AcceptWithResponder(builder.message(),
207 std::move(responder)));
207 {%- else %} 208 {%- else %}
208 bool ok = receiver_->Accept(builder.message()); 209 // This return value may be ignored as false implies the Connector has
209 // This return value may be ignored as !ok implies the Connector has
210 // encountered an error, which will be visible through other means. 210 // encountered an error, which will be visible through other means.
211 ALLOW_UNUSED_LOCAL(ok); 211 ignore_result(receiver_->Accept(builder.message()));
212 {%- endif %} 212 {%- endif %}
213 } 213 }
214 {%- endfor %} 214 {%- endfor %}
215 215
216 {#--- ProxyToResponder definition #} 216 {#--- ProxyToResponder definition #}
217 {%- for method in interface.methods -%} 217 {%- for method in interface.methods -%}
218 {%- if method.response_parameters != None %} 218 {%- if method.response_parameters != None %}
219 {%- set message_name = 219 {%- set message_name =
220 "internal::k%s_%s_Name"|format(interface.name, method.name) %} 220 "internal::k%s_%s_Name"|format(interface.name, method.name) %}
221 {%- set response_params_struct = method.response_param_struct %} 221 {%- set response_params_struct = method.response_param_struct %}
222 {%- set params_description = 222 {%- set params_description =
223 "%s.%s response"|format(interface.name, method.name) %} 223 "%s.%s response"|format(interface.name, method.name) %}
224 class {{class_name}}_{{method.name}}_ProxyToResponder { 224 class {{class_name}}_{{method.name}}_ProxyToResponder {
225 public: 225 public:
226 static {{class_name}}::{{method.name}}Callback CreateCallback( 226 static {{class_name}}::{{method.name}}Callback CreateCallback(
227 uint64_t request_id, 227 uint64_t request_id,
228 bool is_sync, 228 bool is_sync,
229 mojo::MessageReceiverWithStatus* responder) { 229 std::unique_ptr<mojo::MessageReceiverWithStatus> responder) {
230 std::unique_ptr<{{class_name}}_{{method.name}}_ProxyToResponder> proxy( 230 std::unique_ptr<{{class_name}}_{{method.name}}_ProxyToResponder> proxy(
231 new {{class_name}}_{{method.name}}_ProxyToResponder( 231 new {{class_name}}_{{method.name}}_ProxyToResponder(
232 request_id, is_sync, responder)); 232 request_id, is_sync, std::move(responder)));
233 return base::Bind(&{{class_name}}_{{method.name}}_ProxyToResponder::Run, 233 return base::Bind(&{{class_name}}_{{method.name}}_ProxyToResponder::Run,
234 base::Passed(&proxy)); 234 base::Passed(&proxy));
235 } 235 }
236 236
237 ~{{class_name}}_{{method.name}}_ProxyToResponder() { 237 ~{{class_name}}_{{method.name}}_ProxyToResponder() {
238 #if DCHECK_IS_ON() 238 #if DCHECK_IS_ON()
239 if (responder_) { 239 if (responder_) {
240 // Is the Service destroying the callback without running it 240 // Is the Service destroying the callback without running it
241 // and without first closing the pipe? 241 // and without first closing the pipe?
242 responder_->DCheckInvalid("The callback passed to " 242 responder_->DCheckInvalid("The callback passed to "
243 "{{class_name}}::{{method.name}}() was never run."); 243 "{{class_name}}::{{method.name}}() was never run.");
244 } 244 }
245 #endif 245 #endif
246 // If the Callback was dropped then deleting the responder will close 246 // If the Callback was dropped then deleting the responder will close
247 // the pipe so the calling application knows to stop waiting for a reply. 247 // the pipe so the calling application knows to stop waiting for a reply.
248 delete responder_; 248 responder_ = nullptr;
249 } 249 }
250 250
251 private: 251 private:
252 {{class_name}}_{{method.name}}_ProxyToResponder( 252 {{class_name}}_{{method.name}}_ProxyToResponder(
253 uint64_t request_id, 253 uint64_t request_id,
254 bool is_sync, 254 bool is_sync,
255 mojo::MessageReceiverWithStatus* responder) 255 std::unique_ptr<mojo::MessageReceiverWithStatus> responder)
256 : request_id_(request_id), 256 : request_id_(request_id),
257 is_sync_(is_sync), 257 is_sync_(is_sync),
258 responder_(responder) { 258 responder_(std::move(responder)) {
259 } 259 }
260 260
261 void Run( 261 void Run(
262 {{interface_macros.declare_responder_params( 262 {{interface_macros.declare_responder_params(
263 "in_", method.response_parameters, for_blink)}}); 263 "in_", method.response_parameters, for_blink)}});
264 264
265 uint64_t request_id_; 265 uint64_t request_id_;
266 bool is_sync_; 266 bool is_sync_;
267 mojo::MessageReceiverWithStatus* responder_; 267 std::unique_ptr<mojo::MessageReceiverWithStatus> responder_;
268 268
269 DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_ProxyToResponder); 269 DISALLOW_COPY_AND_ASSIGN({{class_name}}_{{method.name}}_ProxyToResponder);
270 }; 270 };
271 271
272 void {{class_name}}_{{method.name}}_ProxyToResponder::Run( 272 void {{class_name}}_{{method.name}}_ProxyToResponder::Run(
273 {{interface_macros.declare_responder_params( 273 {{interface_macros.declare_responder_params(
274 "in_", method.response_parameters, for_blink)}}) { 274 "in_", method.response_parameters, for_blink)}}) {
275 mojo::internal::SerializationContext serialization_context; 275 mojo::internal::SerializationContext serialization_context;
276 {{struct_macros.get_serialized_size(response_params_struct, "in_%s", 276 {{struct_macros.get_serialized_size(response_params_struct, "in_%s",
277 "&serialization_context")}} 277 "&serialization_context")}}
278 278
279 uint32_t flags = (is_sync_ ? mojo::Message::kFlagIsSync : 0) | 279 uint32_t flags = (is_sync_ ? mojo::Message::kFlagIsSync : 0) |
280 mojo::Message::kFlagIsResponse; 280 mojo::Message::kFlagIsResponse;
281 mojo::internal::MessageBuilder builder( 281 mojo::internal::MessageBuilder builder(
282 {{message_name}}, flags, size, 282 {{message_name}}, flags, size,
283 serialization_context.associated_endpoint_count); 283 serialization_context.associated_endpoint_count);
284 builder.message()->set_request_id(request_id_); 284 builder.message()->set_request_id(request_id_);
285 285
286 {{build_message(response_params_struct, "in_%s", params_description, 286 {{build_message(response_params_struct, "in_%s", params_description,
287 "&serialization_context")}} 287 "&serialization_context")}}
288 bool ok = responder_->Accept(builder.message()); 288 ignore_result(responder_->Accept(builder.message()));
289 ALLOW_UNUSED_LOCAL(ok); 289 // TODO(darin): Accept() returning false indicates a malformed message, and
290 // TODO(darin): !ok returned here indicates a malformed message, and that may 290 // that may be good reason to close the connection. However, we don't have a
291 // be good reason to close the connection. However, we don't have a way to do 291 // way to do that from here. We should add a way.
292 // that from here. We should add a way.
293 delete responder_;
294 responder_ = nullptr; 292 responder_ = nullptr;
295 } 293 }
296 {%- endif -%} 294 {%- endif -%}
297 {%- endfor %} 295 {%- endfor %}
298 296
299 {#--- StubDispatch definition #} 297 {#--- StubDispatch definition #}
300 298
301 // static 299 // static
302 bool {{class_name}}StubDispatch::Accept( 300 bool {{class_name}}StubDispatch::Accept(
303 {{interface.name}}* impl, 301 {{interface.name}}* impl,
(...skipping 23 matching lines...) Expand all
327 {%- endfor %} 325 {%- endfor %}
328 } 326 }
329 {%- endif %} 327 {%- endif %}
330 return false; 328 return false;
331 } 329 }
332 330
333 // static 331 // static
334 bool {{class_name}}StubDispatch::AcceptWithResponder( 332 bool {{class_name}}StubDispatch::AcceptWithResponder(
335 {{interface.name}}* impl, 333 {{interface.name}}* impl,
336 mojo::Message* message, 334 mojo::Message* message,
337 mojo::MessageReceiverWithStatus* responder) { 335 std::unique_ptr<mojo::MessageReceiverWithStatus> responder) {
338 {%- if interface.methods %} 336 {%- if interface.methods %}
339 switch (message->header()->name) { 337 switch (message->header()->name) {
340 {%- for method in interface.methods %} 338 {%- for method in interface.methods %}
341 case internal::k{{class_name}}_{{method.name}}_Name: { 339 case internal::k{{class_name}}_{{method.name}}_Name: {
342 {%- if method.response_parameters != None %} 340 {%- if method.response_parameters != None %}
343 internal::{{class_name}}_{{method.name}}_Params_Data* params = 341 internal::{{class_name}}_{{method.name}}_Params_Data* params =
344 reinterpret_cast<internal::{{class_name}}_{{method.name}}_Params_Data* >( 342 reinterpret_cast<internal::{{class_name}}_{{method.name}}_Params_Data* >(
345 message->mutable_payload()); 343 message->mutable_payload());
346 344
347 {%- set desc = class_name~"::"~method.name %} 345 {%- set desc = class_name~"::"~method.name %}
348 {{alloc_params(method.param_struct, "params", "message", desc)| 346 {{alloc_params(method.param_struct, "params", "message", desc)|
349 indent(4)}} 347 indent(4)}}
350 {{class_name}}::{{method.name}}Callback callback = 348 {{class_name}}::{{method.name}}Callback callback =
351 {{class_name}}_{{method.name}}_ProxyToResponder::CreateCallback( 349 {{class_name}}_{{method.name}}_ProxyToResponder::CreateCallback(
352 message->request_id(), 350 message->request_id(),
353 message->has_flag(mojo::Message::kFlagIsSync), responder); 351 message->has_flag(mojo::Message::kFlagIsSync),
352 std::move(responder));
354 // A null |impl| means no implementation was bound. 353 // A null |impl| means no implementation was bound.
355 assert(impl); 354 assert(impl);
356 TRACE_EVENT0("mojom", "{{class_name}}::{{method.name}}"); 355 TRACE_EVENT0("mojom", "{{class_name}}::{{method.name}}");
357 mojo::internal::MessageDispatchContext context(message); 356 mojo::internal::MessageDispatchContext context(message);
358 impl->{{method.name}}( 357 impl->{{method.name}}(
359 {%- if method.parameters -%}{{pass_params(method.parameters)}}, {% endif -%}std: :move(callback)); 358 {%- if method.parameters -%}{{pass_params(method.parameters)}}, {% endif -%}std: :move(callback));
360 return true; 359 return true;
361 {%- else %} 360 {%- else %}
362 break; 361 break;
363 {%- endif %} 362 {%- endif %}
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
440 break; 439 break;
441 } 440 }
442 441
443 // Unrecognized message. 442 // Unrecognized message.
444 ReportValidationError( 443 ReportValidationError(
445 &validation_context, 444 &validation_context,
446 mojo::internal::VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD); 445 mojo::internal::VALIDATION_ERROR_MESSAGE_HEADER_UNKNOWN_METHOD);
447 return false; 446 return false;
448 } 447 }
449 {%- endif -%} 448 {%- endif -%}
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698