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

Side by Side Diff: mojo/system/core.cc

Issue 419973005: Convert WriteMessage...() to use the new user pointer handling (see r285350). (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 4 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | mojo/system/core_test_base.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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "mojo/system/core.h" 5 #include "mojo/system/core.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/time/time.h" 10 #include "base/time/time.h"
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
193 UserPointer<const void> bytes, 193 UserPointer<const void> bytes,
194 uint32_t num_bytes, 194 uint32_t num_bytes,
195 UserPointer<const MojoHandle> handles, 195 UserPointer<const MojoHandle> handles,
196 uint32_t num_handles, 196 uint32_t num_handles,
197 MojoWriteMessageFlags flags) { 197 MojoWriteMessageFlags flags) {
198 scoped_refptr<Dispatcher> dispatcher(GetDispatcher(message_pipe_handle)); 198 scoped_refptr<Dispatcher> dispatcher(GetDispatcher(message_pipe_handle));
199 if (!dispatcher) 199 if (!dispatcher)
200 return MOJO_RESULT_INVALID_ARGUMENT; 200 return MOJO_RESULT_INVALID_ARGUMENT;
201 201
202 // Easy case: not sending any handles. 202 // Easy case: not sending any handles.
203 if (num_handles == 0) { 203 if (num_handles == 0)
204 return dispatcher->WriteMessage(bytes.GetPointerUnsafe(), num_bytes, NULL, 204 return dispatcher->WriteMessage(bytes, num_bytes, NULL, flags);
205 flags);
206 }
207 205
208 // We have to handle |handles| here, since we have to mark them busy in the 206 // We have to handle |handles| here, since we have to mark them busy in the
209 // global handle table. We can't delegate this to the dispatcher, since the 207 // global handle table. We can't delegate this to the dispatcher, since the
210 // handle table lock must be acquired before the dispatcher lock. 208 // handle table lock must be acquired before the dispatcher lock.
211 // 209 //
212 // (This leads to an oddity: |handles|/|num_handles| are always verified for 210 // (This leads to an oddity: |handles|/|num_handles| are always verified for
213 // validity, even for dispatchers that don't support |WriteMessage()| and will 211 // validity, even for dispatchers that don't support |WriteMessage()| and will
214 // simply return failure unconditionally. It also breaks the usual 212 // simply return failure unconditionally. It also breaks the usual
215 // left-to-right verification order of arguments.) 213 // left-to-right verification order of arguments.)
216 if (num_handles > kMaxMessageNumHandles) 214 if (num_handles > kMaxMessageNumHandles)
(...skipping 13 matching lines...) Expand all
230 // handles from the handle table. 228 // handles from the handle table.
231 { 229 {
232 base::AutoLock locker(handle_table_lock_); 230 base::AutoLock locker(handle_table_lock_);
233 MojoResult result = handle_table_.MarkBusyAndStartTransport( 231 MojoResult result = handle_table_.MarkBusyAndStartTransport(
234 message_pipe_handle, handles_reader.GetPointer(), num_handles, 232 message_pipe_handle, handles_reader.GetPointer(), num_handles,
235 &transports); 233 &transports);
236 if (result != MOJO_RESULT_OK) 234 if (result != MOJO_RESULT_OK)
237 return result; 235 return result;
238 } 236 }
239 237
240 MojoResult rv = dispatcher->WriteMessage(bytes.GetPointerUnsafe(), num_bytes, 238 MojoResult rv = dispatcher->WriteMessage(bytes, num_bytes, &transports,
241 &transports, flags); 239 flags);
242 240
243 // We need to release the dispatcher locks before we take the handle table 241 // We need to release the dispatcher locks before we take the handle table
244 // lock. 242 // lock.
245 for (uint32_t i = 0; i < num_handles; i++) 243 for (uint32_t i = 0; i < num_handles; i++)
246 transports[i].End(); 244 transports[i].End();
247 245
248 { 246 {
249 base::AutoLock locker(handle_table_lock_); 247 base::AutoLock locker(handle_table_lock_);
250 if (rv == MOJO_RESULT_OK) { 248 if (rv == MOJO_RESULT_OK) {
251 handle_table_.RemoveBusyHandles(handles_reader.GetPointer(), num_handles); 249 handle_table_.RemoveBusyHandles(handles_reader.GetPointer(), num_handles);
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after
559 // |Wait()|/|WaitMany()| call. (Only after doing this can |waiter| be 557 // |Wait()|/|WaitMany()| call. (Only after doing this can |waiter| be
560 // destroyed, but this would still be required if the waiter were in TLS.) 558 // destroyed, but this would still be required if the waiter were in TLS.)
561 for (i = 0; i < num_added; i++) 559 for (i = 0; i < num_added; i++)
562 dispatchers[i]->RemoveWaiter(&waiter); 560 dispatchers[i]->RemoveWaiter(&waiter);
563 561
564 return rv; 562 return rv;
565 } 563 }
566 564
567 } // namespace system 565 } // namespace system
568 } // namespace mojo 566 } // namespace mojo
OLDNEW
« no previous file with comments | « no previous file | mojo/system/core_test_base.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698