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

Side by Side Diff: util/mach/mach_message_server.cc

Issue 777993002: MachMessageServer: eliminate argument redundancy (Closed) Base URL: https://chromium.googlesource.com/crashpad/crashpad@master
Patch Set: Rebase Created 6 years 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
« no previous file with comments | « util/mach/mach_message_server.h ('k') | util/mach/mach_message_server_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
109 notify_port, 109 notify_port,
110 run_even_if_expired); 110 run_even_if_expired);
111 } 111 }
112 112
113 } // namespace 113 } // namespace
114 114
115 // This method implements a server similar to 10.9.4 115 // This method implements a server similar to 10.9.4
116 // xnu-2422.110.17/libsyscall/mach/mach_msg.c mach_msg_server_once(). The server 116 // xnu-2422.110.17/libsyscall/mach/mach_msg.c mach_msg_server_once(). The server
117 // callback function and |max_size| parameter have been replaced with a C++ 117 // callback function and |max_size| parameter have been replaced with a C++
118 // interface. The |persistent| parameter has been added, allowing this method to 118 // interface. The |persistent| parameter has been added, allowing this method to
119 // serve as a stand-in for mach_msg_server(). The |nonblocking| parameter has 119 // serve as a stand-in for mach_msg_server(). The |timeout_ms| parameter has
120 // been added, allowing blocking to be controlled directly. The |timeout_ms| 120 // been added, allowing this function to not block indefinitely.
121 // parameter has been added, allowing this function to not block indefinitely.
122 // 121 //
123 // static 122 // static
124 mach_msg_return_t MachMessageServer::Run(Interface* interface, 123 mach_msg_return_t MachMessageServer::Run(Interface* interface,
125 mach_port_t receive_port, 124 mach_port_t receive_port,
126 mach_msg_options_t options, 125 mach_msg_options_t options,
127 Persistent persistent, 126 Persistent persistent,
128 Nonblocking nonblocking,
129 ReceiveLarge receive_large, 127 ReceiveLarge receive_large,
130 mach_msg_timeout_t timeout_ms) { 128 mach_msg_timeout_t timeout_ms) {
131 options &= ~(MACH_RCV_MSG | MACH_SEND_MSG); 129 options &= ~(MACH_RCV_MSG | MACH_SEND_MSG);
132 130
133 MachMessageDeadline deadline; 131 const MachMessageDeadline deadline =
134 if (nonblocking == kNonblocking) { 132 MachMessageDeadlineFromTimeout(timeout_ms);
135 deadline = kMachMessageNonblocking;
136 } else if (timeout_ms == MACH_MSG_TIMEOUT_NONE) {
137 deadline = kMachMessageWaitIndefinitely;
138 } else {
139 deadline = MachMessageDeadlineFromTimeout(timeout_ms);
140 }
141 133
142 if (receive_large == kReceiveLargeResize) { 134 if (receive_large == kReceiveLargeResize) {
143 options |= MACH_RCV_LARGE; 135 options |= MACH_RCV_LARGE;
144 } else { 136 } else {
145 options &= ~MACH_RCV_LARGE; 137 options &= ~MACH_RCV_LARGE;
146 } 138 }
147 139
148 const mach_msg_size_t trailer_alloc = REQUESTED_TRAILER_SIZE(options); 140 const mach_msg_size_t trailer_alloc = REQUESTED_TRAILER_SIZE(options);
149 const mach_msg_size_t expected_receive_size = 141 const mach_msg_size_t expected_receive_size =
150 round_msg(interface->MachMessageServerRequestSize()) + trailer_alloc; 142 round_msg(interface->MachMessageServerRequestSize()) + trailer_alloc;
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
252 } 244 }
253 245
254 if (reply_header->msgh_remote_port != MACH_PORT_NULL) { 246 if (reply_header->msgh_remote_port != MACH_PORT_NULL) {
255 // Avoid blocking indefinitely. This duplicates the logic in 10.9.5 247 // Avoid blocking indefinitely. This duplicates the logic in 10.9.5
256 // xnu-2422.115.4/libsyscall/mach/mach_msg.c mach_msg_server_once(), 248 // xnu-2422.115.4/libsyscall/mach/mach_msg.c mach_msg_server_once(),
257 // although the special provision for sending to a send-once right is not 249 // although the special provision for sending to a send-once right is not
258 // made, because kernel keeps sends to a send-once right on the fast path 250 // made, because kernel keeps sends to a send-once right on the fast path
259 // without considering the user-specified timeout. See 10.9.5 251 // without considering the user-specified timeout. See 10.9.5
260 // xnu-2422.115.4/osfmk/ipc/ipc_mqueue.c ipc_mqueue_send(). 252 // xnu-2422.115.4/osfmk/ipc/ipc_mqueue.c ipc_mqueue_send().
261 const MachMessageDeadline send_deadline = 253 const MachMessageDeadline send_deadline =
262 deadline == kMachMessageWaitIndefinitely ? kMachMessageNonblocking 254 deadline == kMachMessageDeadlineWaitIndefinitely
263 : deadline; 255 ? kMachMessageDeadlineNonblocking
256 : deadline;
264 257
265 kr = MachMessageWithDeadline(reply_header, 258 kr = MachMessageWithDeadline(reply_header,
266 options | MACH_SEND_MSG, 259 options | MACH_SEND_MSG,
267 0, 260 0,
268 MACH_PORT_NULL, 261 MACH_PORT_NULL,
269 send_deadline, 262 send_deadline,
270 MACH_PORT_NULL, 263 MACH_PORT_NULL,
271 true); 264 true);
272 265
273 if (kr != MACH_MSG_SUCCESS) { 266 if (kr != MACH_MSG_SUCCESS) {
274 if (kr == MACH_SEND_INVALID_DEST || 267 if (kr == MACH_SEND_INVALID_DEST ||
275 kr == MACH_SEND_TIMED_OUT || 268 kr == MACH_SEND_TIMED_OUT ||
276 kr == MACH_SEND_INTERRUPTED) { 269 kr == MACH_SEND_INTERRUPTED) {
277 mach_msg_destroy(reply_header); 270 mach_msg_destroy(reply_header);
278 } 271 }
279 return kr; 272 return kr;
280 } 273 }
281 } 274 }
282 } while (persistent == kPersistent || retry); 275 } while (persistent == kPersistent || retry);
283 276
284 return kr; 277 return kr;
285 } 278 }
286 279
287 } // namespace crashpad 280 } // namespace crashpad
OLDNEW
« no previous file with comments | « util/mach/mach_message_server.h ('k') | util/mach/mach_message_server_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698