| OLD | NEW |
| 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_impl.h" | 5 #include "mojo/system/core_impl.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 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 155 if (!VerifyUserPointer<MojoHandle>(message_pipe_handle1, 1)) | 155 if (!VerifyUserPointer<MojoHandle>(message_pipe_handle1, 1)) |
| 156 return MOJO_RESULT_INVALID_ARGUMENT; | 156 return MOJO_RESULT_INVALID_ARGUMENT; |
| 157 | 157 |
| 158 scoped_refptr<MessagePipeDispatcher> dispatcher0(new MessagePipeDispatcher()); | 158 scoped_refptr<MessagePipeDispatcher> dispatcher0(new MessagePipeDispatcher()); |
| 159 scoped_refptr<MessagePipeDispatcher> dispatcher1(new MessagePipeDispatcher()); | 159 scoped_refptr<MessagePipeDispatcher> dispatcher1(new MessagePipeDispatcher()); |
| 160 | 160 |
| 161 MojoHandle h0, h1; | 161 MojoHandle h0, h1; |
| 162 { | 162 { |
| 163 base::AutoLock locker(handle_table_lock_); | 163 base::AutoLock locker(handle_table_lock_); |
| 164 | 164 |
| 165 // TODO(vtl): crbug.com/345911: On failure, we should close the dispatcher |
| 166 // (outside the table lock). |
| 165 h0 = AddDispatcherNoLock(dispatcher0); | 167 h0 = AddDispatcherNoLock(dispatcher0); |
| 166 if (h0 == MOJO_HANDLE_INVALID) | 168 if (h0 == MOJO_HANDLE_INVALID) |
| 167 return MOJO_RESULT_RESOURCE_EXHAUSTED; | 169 return MOJO_RESULT_RESOURCE_EXHAUSTED; |
| 168 | 170 |
| 171 // TODO(vtl): crbug.com/345911: On failure, we should close both dispatchers |
| 172 // (outside the table lock). |
| 169 h1 = AddDispatcherNoLock(dispatcher1); | 173 h1 = AddDispatcherNoLock(dispatcher1); |
| 170 if (h1 == MOJO_HANDLE_INVALID) { | 174 if (h1 == MOJO_HANDLE_INVALID) { |
| 171 handle_table_.erase(h0); | 175 handle_table_.erase(h0); |
| 172 return MOJO_RESULT_RESOURCE_EXHAUSTED; | 176 return MOJO_RESULT_RESOURCE_EXHAUSTED; |
| 173 } | 177 } |
| 174 } | 178 } |
| 175 | 179 |
| 176 scoped_refptr<MessagePipe> message_pipe(new MessagePipe()); | 180 scoped_refptr<MessagePipe> message_pipe(new MessagePipe()); |
| 177 dispatcher0->Init(message_pipe, 0); | 181 dispatcher0->Init(message_pipe, 0); |
| 178 dispatcher1->Init(message_pipe, 1); | 182 dispatcher1->Init(message_pipe, 1); |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 352 DCHECK_EQ(rv, MOJO_RESULT_OK); | 356 DCHECK_EQ(rv, MOJO_RESULT_OK); |
| 353 DCHECK(num_handles); | 357 DCHECK(num_handles); |
| 354 DCHECK_LE(dispatchers.size(), static_cast<size_t>(*num_handles)); | 358 DCHECK_LE(dispatchers.size(), static_cast<size_t>(*num_handles)); |
| 355 | 359 |
| 356 base::AutoLock locker(handle_table_lock_); | 360 base::AutoLock locker(handle_table_lock_); |
| 357 | 361 |
| 358 for (size_t i = 0; i < dispatchers.size(); i++) { | 362 for (size_t i = 0; i < dispatchers.size(); i++) { |
| 359 // TODO(vtl): What should we do if we hit the maximum handle table size | 363 // TODO(vtl): What should we do if we hit the maximum handle table size |
| 360 // here? Currently, we'll just fill in those handles with | 364 // here? Currently, we'll just fill in those handles with |
| 361 // |MOJO_HANDLE_INVALID| (and return success anyway). | 365 // |MOJO_HANDLE_INVALID| (and return success anyway). |
| 366 // TODO(vtl): crbug.com/345911: On failure, we should close the dispatcher |
| 367 // (outside the table lock). |
| 362 handles[i] = AddDispatcherNoLock(dispatchers[i]); | 368 handles[i] = AddDispatcherNoLock(dispatchers[i]); |
| 363 LOG_IF(ERROR, handles[i] == MOJO_HANDLE_INVALID) | 369 LOG_IF(ERROR, handles[i] == MOJO_HANDLE_INVALID) |
| 364 << "Failed to add dispatcher (" << dispatchers[i].get() << ")"; | 370 << "Failed to add dispatcher (" << dispatchers[i].get() << ")"; |
| 365 } | 371 } |
| 366 } | 372 } |
| 367 | 373 |
| 368 return rv; | 374 return rv; |
| 369 } | 375 } |
| 370 | 376 |
| 371 MojoResult CoreImpl::CreateDataPipe(const MojoCreateDataPipeOptions* options, | 377 MojoResult CoreImpl::CreateDataPipe(const MojoCreateDataPipeOptions* options, |
| (...skipping 19 matching lines...) Expand all Loading... |
| 391 | 397 |
| 392 scoped_refptr<DataPipeProducerDispatcher> producer_dispatcher( | 398 scoped_refptr<DataPipeProducerDispatcher> producer_dispatcher( |
| 393 new DataPipeProducerDispatcher()); | 399 new DataPipeProducerDispatcher()); |
| 394 scoped_refptr<DataPipeConsumerDispatcher> consumer_dispatcher( | 400 scoped_refptr<DataPipeConsumerDispatcher> consumer_dispatcher( |
| 395 new DataPipeConsumerDispatcher()); | 401 new DataPipeConsumerDispatcher()); |
| 396 | 402 |
| 397 MojoHandle producer_handle, consumer_handle; | 403 MojoHandle producer_handle, consumer_handle; |
| 398 { | 404 { |
| 399 base::AutoLock locker(handle_table_lock_); | 405 base::AutoLock locker(handle_table_lock_); |
| 400 | 406 |
| 407 // TODO(vtl): crbug.com/345911: On failure, we should close the dispatcher |
| 408 // (outside the table lock). |
| 401 producer_handle = AddDispatcherNoLock(producer_dispatcher); | 409 producer_handle = AddDispatcherNoLock(producer_dispatcher); |
| 402 if (producer_handle == MOJO_HANDLE_INVALID) | 410 if (producer_handle == MOJO_HANDLE_INVALID) |
| 403 return MOJO_RESULT_RESOURCE_EXHAUSTED; | 411 return MOJO_RESULT_RESOURCE_EXHAUSTED; |
| 404 | 412 |
| 413 // TODO(vtl): crbug.com/345911: On failure, we should close both dispatchers |
| 414 // (outside the table lock). |
| 405 consumer_handle = AddDispatcherNoLock(consumer_dispatcher); | 415 consumer_handle = AddDispatcherNoLock(consumer_dispatcher); |
| 406 if (consumer_handle == MOJO_HANDLE_INVALID) { | 416 if (consumer_handle == MOJO_HANDLE_INVALID) { |
| 407 handle_table_.erase(producer_handle); | 417 handle_table_.erase(producer_handle); |
| 408 return MOJO_RESULT_RESOURCE_EXHAUSTED; | 418 return MOJO_RESULT_RESOURCE_EXHAUSTED; |
| 409 } | 419 } |
| 410 } | 420 } |
| 411 | 421 |
| 412 scoped_refptr<DataPipe> data_pipe(new LocalDataPipe(validated_options)); | 422 scoped_refptr<DataPipe> data_pipe(new LocalDataPipe(validated_options)); |
| 413 producer_dispatcher->Init(data_pipe); | 423 producer_dispatcher->Init(data_pipe); |
| 414 consumer_dispatcher->Init(data_pipe); | 424 consumer_dispatcher->Init(data_pipe); |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 492 MojoHandle* shared_buffer_handle) { | 502 MojoHandle* shared_buffer_handle) { |
| 493 // TODO(vtl) | 503 // TODO(vtl) |
| 494 NOTIMPLEMENTED(); | 504 NOTIMPLEMENTED(); |
| 495 return MOJO_RESULT_UNIMPLEMENTED; | 505 return MOJO_RESULT_UNIMPLEMENTED; |
| 496 } | 506 } |
| 497 | 507 |
| 498 MojoResult CoreImpl::DuplicateBufferHandle( | 508 MojoResult CoreImpl::DuplicateBufferHandle( |
| 499 MojoHandle buffer_handle, | 509 MojoHandle buffer_handle, |
| 500 const MojoDuplicateBufferHandleOptions* options, | 510 const MojoDuplicateBufferHandleOptions* options, |
| 501 MojoHandle* new_buffer_handle) { | 511 MojoHandle* new_buffer_handle) { |
| 502 // TODO(vtl) | 512 scoped_refptr<Dispatcher> dispatcher(GetDispatcher(buffer_handle)); |
| 503 NOTIMPLEMENTED(); | 513 if (!dispatcher.get()) |
| 504 return MOJO_RESULT_UNIMPLEMENTED; | 514 return MOJO_RESULT_INVALID_ARGUMENT; |
| 515 |
| 516 if (!VerifyUserPointer<MojoHandle>(new_buffer_handle, 1)) |
| 517 return MOJO_RESULT_INVALID_ARGUMENT; |
| 518 |
| 519 scoped_refptr<Dispatcher> new_dispatcher; |
| 520 MojoResult result = dispatcher->DuplicateBufferHandle(options, |
| 521 &new_dispatcher); |
| 522 if (result != MOJO_RESULT_OK) |
| 523 return result; |
| 524 |
| 525 MojoHandle new_handle; |
| 526 { |
| 527 base::AutoLock locker(handle_table_lock_); |
| 528 |
| 529 // TODO(vtl): crbug.com/345911: On failure, we should close the dispatcher |
| 530 // (outside the table lock). |
| 531 new_handle = AddDispatcherNoLock(new_dispatcher); |
| 532 if (new_handle == MOJO_HANDLE_INVALID) |
| 533 return MOJO_RESULT_RESOURCE_EXHAUSTED; |
| 534 } |
| 535 |
| 536 *new_buffer_handle = new_handle; |
| 537 return MOJO_RESULT_OK; |
| 505 } | 538 } |
| 506 | 539 |
| 507 MojoResult CoreImpl::MapBuffer(MojoHandle buffer_handle, | 540 MojoResult CoreImpl::MapBuffer(MojoHandle buffer_handle, |
| 508 uint64_t offset, | 541 uint64_t offset, |
| 509 uint64_t num_bytes, | 542 uint64_t num_bytes, |
| 510 void** buffer, | 543 void** buffer, |
| 511 MojoMapBufferFlags flags) { | 544 MojoMapBufferFlags flags) { |
| 512 // TODO(vtl) | 545 scoped_refptr<Dispatcher> dispatcher(GetDispatcher(buffer_handle)); |
| 513 NOTIMPLEMENTED(); | 546 if (!dispatcher.get()) |
| 514 return MOJO_RESULT_UNIMPLEMENTED; | 547 return MOJO_RESULT_INVALID_ARGUMENT; |
| 548 |
| 549 MojoResult result = dispatcher->MapBuffer(offset, num_bytes, buffer, flags); |
| 550 if (result != MOJO_RESULT_OK) |
| 551 return result; |
| 552 |
| 553 // TODO(vtl): Record the mapping. |
| 554 |
| 555 return MOJO_RESULT_OK; |
| 515 } | 556 } |
| 516 | 557 |
| 517 MojoResult CoreImpl::UnmapBuffer(void* buffer) { | 558 MojoResult CoreImpl::UnmapBuffer(void* buffer) { |
| 518 // TODO(vtl) | 559 // TODO(vtl) |
| 519 NOTIMPLEMENTED(); | 560 NOTIMPLEMENTED(); |
| 520 return MOJO_RESULT_UNIMPLEMENTED; | 561 return MOJO_RESULT_UNIMPLEMENTED; |
| 521 } | 562 } |
| 522 | 563 |
| 523 scoped_refptr<Dispatcher> CoreImpl::GetDispatcher(MojoHandle handle) { | 564 scoped_refptr<Dispatcher> CoreImpl::GetDispatcher(MojoHandle handle) { |
| 524 if (handle == MOJO_HANDLE_INVALID) | 565 if (handle == MOJO_HANDLE_INVALID) |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 601 // |Wait()|/|WaitMany()| call. (Only after doing this can |waiter| be | 642 // |Wait()|/|WaitMany()| call. (Only after doing this can |waiter| be |
| 602 // destroyed, but this would still be required if the waiter were in TLS.) | 643 // destroyed, but this would still be required if the waiter were in TLS.) |
| 603 for (i = 0; i < num_added; i++) | 644 for (i = 0; i < num_added; i++) |
| 604 dispatchers[i]->RemoveWaiter(&waiter); | 645 dispatchers[i]->RemoveWaiter(&waiter); |
| 605 | 646 |
| 606 return rv; | 647 return rv; |
| 607 } | 648 } |
| 608 | 649 |
| 609 } // namespace system | 650 } // namespace system |
| 610 } // namespace mojo | 651 } // namespace mojo |
| OLD | NEW |