OLD | NEW |
1 // Copyright 2014 The Crashpad Authors. All rights reserved. | 1 // Copyright 2014 The Crashpad Authors. All rights reserved. |
2 // | 2 // |
3 // Licensed under the Apache License, Version 2.0 (the "License"); | 3 // Licensed under the Apache License, Version 2.0 (the "License"); |
4 // you may not use this file except in compliance with the License. | 4 // you may not use this file except in compliance with the License. |
5 // You may obtain a copy of the License at | 5 // You may obtain a copy of the License at |
6 // | 6 // |
7 // http://www.apache.org/licenses/LICENSE-2.0 | 7 // http://www.apache.org/licenses/LICENSE-2.0 |
8 // | 8 // |
9 // Unless required by applicable law or agreed to in writing, software | 9 // Unless required by applicable law or agreed to in writing, software |
10 // distributed under the License is distributed on an "AS IS" BASIS, | 10 // distributed under the License is distributed on an "AS IS" BASIS, |
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
264 reply->Head.msgh_remote_port = request->header.msgh_remote_port; | 264 reply->Head.msgh_remote_port = request->header.msgh_remote_port; |
265 reply->Head.msgh_local_port = MACH_PORT_NULL; | 265 reply->Head.msgh_local_port = MACH_PORT_NULL; |
266 reply->Head.msgh_id = kReplyMessageId; | 266 reply->Head.msgh_id = kReplyMessageId; |
267 reply->NDR = NDR_record; | 267 reply->NDR = NDR_record; |
268 reply->RetCode = options_.server_mig_retcode; | 268 reply->RetCode = options_.server_mig_retcode; |
269 reply->number = replies_++; | 269 reply->number = replies_++; |
270 | 270 |
271 return true; | 271 return true; |
272 } | 272 } |
273 | 273 |
274 virtual mach_msg_size_t MachMessageServerRequestSize() override { | 274 mach_msg_size_t MachMessageServerRequestSize() override { |
275 return sizeof(RequestMessage); | 275 return sizeof(RequestMessage); |
276 } | 276 } |
277 | 277 |
278 virtual mach_msg_size_t MachMessageServerReplySize() override { | 278 mach_msg_size_t MachMessageServerReplySize() override { |
279 return sizeof(ReplyMessage); | 279 return sizeof(ReplyMessage); |
280 } | 280 } |
281 | 281 |
282 private: | 282 private: |
283 struct RequestMessage : public mach_msg_base_t { | 283 struct RequestMessage : public mach_msg_base_t { |
284 // If body.msgh_descriptor_count is 0, port_descriptor will still be | 284 // If body.msgh_descriptor_count is 0, port_descriptor will still be |
285 // present, but it will be zeroed out. It wouldn’t normally be present in a | 285 // present, but it will be zeroed out. It wouldn’t normally be present in a |
286 // message froma MIG-generated interface, but it’s harmless and simpler to | 286 // message froma MIG-generated interface, but it’s harmless and simpler to |
287 // leave it here and just treat it as more data. | 287 // leave it here and just treat it as more data. |
288 mach_msg_port_descriptor_t port_descriptor; | 288 mach_msg_port_descriptor_t port_descriptor; |
289 | 289 |
290 NDR_record_t ndr; | 290 NDR_record_t ndr; |
291 uint32_t number; | 291 uint32_t number; |
292 }; | 292 }; |
293 | 293 |
294 // LargeRequestMessage is larger enough than a regular RequestMessage to | 294 // LargeRequestMessage is larger enough than a regular RequestMessage to |
295 // ensure that whatever buffer was allocated to receive a RequestMessage is | 295 // ensure that whatever buffer was allocated to receive a RequestMessage is |
296 // not large enough to receive a LargeRequestMessage. | 296 // not large enough to receive a LargeRequestMessage. |
297 struct LargeRequestMessage : public RequestMessage { | 297 struct LargeRequestMessage : public RequestMessage { |
298 uint8_t data[4 * PAGE_SIZE]; | 298 uint8_t data[4 * PAGE_SIZE]; |
299 }; | 299 }; |
300 | 300 |
301 struct ReplyMessage : public mig_reply_error_t { | 301 struct ReplyMessage : public mig_reply_error_t { |
302 uint32_t number; | 302 uint32_t number; |
303 }; | 303 }; |
304 | 304 |
305 // MachMultiprocess: | 305 // MachMultiprocess: |
306 | 306 |
307 virtual void MachMultiprocessParent() override { | 307 void MachMultiprocessParent() override { |
308 mach_port_t local_port = LocalPort(); | 308 mach_port_t local_port = LocalPort(); |
309 | 309 |
310 kern_return_t kr; | 310 kern_return_t kr; |
311 if (options_.child_send_all_requests_before_receiving_any_replies) { | 311 if (options_.child_send_all_requests_before_receiving_any_replies) { |
312 // On Mac OS X 10.10, the queue limit of a new Mach port seems to be 2 | 312 // On Mac OS X 10.10, the queue limit of a new Mach port seems to be 2 |
313 // by default, which is below the value of MACH_PORT_QLIMIT_DEFAULT. Set | 313 // by default, which is below the value of MACH_PORT_QLIMIT_DEFAULT. Set |
314 // the port’s queue limit explicitly here. | 314 // the port’s queue limit explicitly here. |
315 mach_port_limits limits = {}; | 315 mach_port_limits limits = {}; |
316 limits.mpl_qlimit = MACH_PORT_QLIMIT_DEFAULT; | 316 limits.mpl_qlimit = MACH_PORT_QLIMIT_DEFAULT; |
317 kr = mach_port_set_attributes(mach_task_self(), | 317 kr = mach_port_set_attributes(mach_task_self(), |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
374 << MachErrorMessage(kr, "mach_port_type"); | 374 << MachErrorMessage(kr, "mach_port_type"); |
375 } | 375 } |
376 | 376 |
377 if (options_.child_wait_for_parent_pipe_late) { | 377 if (options_.child_wait_for_parent_pipe_late) { |
378 // Let the child know it’s safe to exit. | 378 // Let the child know it’s safe to exit. |
379 char c = '\0'; | 379 char c = '\0'; |
380 CheckedWriteFD(WritePipeFD(), &c, 1); | 380 CheckedWriteFD(WritePipeFD(), &c, 1); |
381 } | 381 } |
382 } | 382 } |
383 | 383 |
384 virtual void MachMultiprocessChild() override { | 384 void MachMultiprocessChild() override { |
385 if (options_.child_wait_for_parent_pipe_early) { | 385 if (options_.child_wait_for_parent_pipe_early) { |
386 // Wait until the parent is done setting things up on its end. | 386 // Wait until the parent is done setting things up on its end. |
387 char c; | 387 char c; |
388 CheckedReadFD(ReadPipeFD(), &c, 1); | 388 CheckedReadFD(ReadPipeFD(), &c, 1); |
389 EXPECT_EQ('\0', c); | 389 EXPECT_EQ('\0', c); |
390 } | 390 } |
391 | 391 |
392 for (size_t index = 0; | 392 for (size_t index = 0; |
393 index < options_.client_send_request_count; | 393 index < options_.client_send_request_count; |
394 ++index) { | 394 ++index) { |
(...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
824 TestMachMessageServer::Options options; | 824 TestMachMessageServer::Options options; |
825 options.server_options = MACH_RCV_LARGE; | 825 options.server_options = MACH_RCV_LARGE; |
826 options.client_send_large = true; | 826 options.client_send_large = true; |
827 TestMachMessageServer test_mach_message_server(options); | 827 TestMachMessageServer test_mach_message_server(options); |
828 test_mach_message_server.Test(); | 828 test_mach_message_server.Test(); |
829 } | 829 } |
830 | 830 |
831 } // namespace | 831 } // namespace |
832 } // namespace test | 832 } // namespace test |
833 } // namespace crashpad | 833 } // namespace crashpad |
OLD | NEW |