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/edk/system/core.h" | 5 #include "mojo/edk/system/core.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 #include <utility> | 8 #include <utility> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
90 handle_table_(GetConfiguration().max_handle_table_size) {} | 90 handle_table_(GetConfiguration().max_handle_table_size) {} |
91 | 91 |
92 Core::~Core() { | 92 Core::~Core() { |
93 } | 93 } |
94 | 94 |
95 MojoHandle Core::AddHandle(Handle&& handle) { | 95 MojoHandle Core::AddHandle(Handle&& handle) { |
96 MutexLocker locker(&handle_table_mutex_); | 96 MutexLocker locker(&handle_table_mutex_); |
97 return handle_table_.AddHandle(std::move(handle)); | 97 return handle_table_.AddHandle(std::move(handle)); |
98 } | 98 } |
99 | 99 |
100 // FIXME | |
101 MojoHandle Core::AddDispatcher(Dispatcher* dispatcher) { | |
102 return AddHandle( | |
103 Handle(RefPtr<Dispatcher>(dispatcher), MOJO_HANDLE_RIGHT_TRANSFER)); | |
104 } | |
105 | |
106 MojoResult Core::GetDispatcher(MojoHandle handle, | 100 MojoResult Core::GetDispatcher(MojoHandle handle, |
107 RefPtr<Dispatcher>* dispatcher) { | 101 RefPtr<Dispatcher>* dispatcher) { |
108 if (handle == MOJO_HANDLE_INVALID) | 102 if (handle == MOJO_HANDLE_INVALID) |
109 return MOJO_RESULT_INVALID_ARGUMENT; | 103 return MOJO_RESULT_INVALID_ARGUMENT; |
110 | 104 |
111 MutexLocker locker(&handle_table_mutex_); | 105 MutexLocker locker(&handle_table_mutex_); |
112 return handle_table_.GetDispatcher(handle, dispatcher); | 106 return handle_table_.GetDispatcher(handle, dispatcher); |
113 } | 107 } |
114 | 108 |
115 MojoResult Core::GetAndRemoveDispatcher(MojoHandle handle, | 109 MojoResult Core::GetAndRemoveDispatcher(MojoHandle handle, |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
220 if (result != MOJO_RESULT_OK) | 214 if (result != MOJO_RESULT_OK) |
221 return result; | 215 return result; |
222 | 216 |
223 auto dispatcher0 = MessagePipeDispatcher::Create(validated_options); | 217 auto dispatcher0 = MessagePipeDispatcher::Create(validated_options); |
224 auto dispatcher1 = MessagePipeDispatcher::Create(validated_options); | 218 auto dispatcher1 = MessagePipeDispatcher::Create(validated_options); |
225 | 219 |
226 std::pair<MojoHandle, MojoHandle> handle_pair; | 220 std::pair<MojoHandle, MojoHandle> handle_pair; |
227 { | 221 { |
228 MutexLocker locker(&handle_table_mutex_); | 222 MutexLocker locker(&handle_table_mutex_); |
229 handle_pair = handle_table_.AddHandlePair( | 223 handle_pair = handle_table_.AddHandlePair( |
230 Handle(dispatcher0.Clone(), MOJO_HANDLE_RIGHT_TRANSFER | | 224 Handle(dispatcher0.Clone(), |
231 MOJO_HANDLE_RIGHT_READ | | 225 MessagePipeDispatcher::kDefaultHandleRights), |
232 MOJO_HANDLE_RIGHT_WRITE), | 226 Handle(dispatcher1.Clone(), |
233 Handle(dispatcher1.Clone(), MOJO_HANDLE_RIGHT_TRANSFER | | 227 MessagePipeDispatcher::kDefaultHandleRights)); |
234 MOJO_HANDLE_RIGHT_READ | | |
235 MOJO_HANDLE_RIGHT_WRITE)); | |
236 } | 228 } |
237 if (handle_pair.first == MOJO_HANDLE_INVALID) { | 229 if (handle_pair.first == MOJO_HANDLE_INVALID) { |
238 DCHECK_EQ(handle_pair.second, MOJO_HANDLE_INVALID); | 230 DCHECK_EQ(handle_pair.second, MOJO_HANDLE_INVALID); |
239 LOG(ERROR) << "Handle table full"; | 231 LOG(ERROR) << "Handle table full"; |
240 dispatcher0->Close(); | 232 dispatcher0->Close(); |
241 dispatcher1->Close(); | 233 dispatcher1->Close(); |
242 return MOJO_RESULT_RESOURCE_EXHAUSTED; | 234 return MOJO_RESULT_RESOURCE_EXHAUSTED; |
243 } | 235 } |
244 | 236 |
245 auto message_pipe = MessagePipe::CreateLocalLocal(); | 237 auto message_pipe = MessagePipe::CreateLocalLocal(); |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
391 return result; | 383 return result; |
392 | 384 |
393 auto producer_dispatcher = DataPipeProducerDispatcher::Create(); | 385 auto producer_dispatcher = DataPipeProducerDispatcher::Create(); |
394 auto consumer_dispatcher = DataPipeConsumerDispatcher::Create(); | 386 auto consumer_dispatcher = DataPipeConsumerDispatcher::Create(); |
395 | 387 |
396 std::pair<MojoHandle, MojoHandle> handle_pair; | 388 std::pair<MojoHandle, MojoHandle> handle_pair; |
397 { | 389 { |
398 MutexLocker locker(&handle_table_mutex_); | 390 MutexLocker locker(&handle_table_mutex_); |
399 handle_pair = handle_table_.AddHandlePair( | 391 handle_pair = handle_table_.AddHandlePair( |
400 Handle(producer_dispatcher.Clone(), | 392 Handle(producer_dispatcher.Clone(), |
401 MOJO_HANDLE_RIGHT_TRANSFER | MOJO_HANDLE_RIGHT_WRITE), | 393 DataPipeProducerDispatcher::kDefaultHandleRights), |
402 Handle(consumer_dispatcher.Clone(), | 394 Handle(consumer_dispatcher.Clone(), |
403 MOJO_HANDLE_RIGHT_TRANSFER | MOJO_HANDLE_RIGHT_READ)); | 395 DataPipeConsumerDispatcher::kDefaultHandleRights)); |
404 } | 396 } |
405 if (handle_pair.first == MOJO_HANDLE_INVALID) { | 397 if (handle_pair.first == MOJO_HANDLE_INVALID) { |
406 DCHECK_EQ(handle_pair.second, MOJO_HANDLE_INVALID); | 398 DCHECK_EQ(handle_pair.second, MOJO_HANDLE_INVALID); |
407 LOG(ERROR) << "Handle table full"; | 399 LOG(ERROR) << "Handle table full"; |
408 producer_dispatcher->Close(); | 400 producer_dispatcher->Close(); |
409 consumer_dispatcher->Close(); | 401 consumer_dispatcher->Close(); |
410 return MOJO_RESULT_RESOURCE_EXHAUSTED; | 402 return MOJO_RESULT_RESOURCE_EXHAUSTED; |
411 } | 403 } |
412 DCHECK_NE(handle_pair.second, MOJO_HANDLE_INVALID); | 404 DCHECK_NE(handle_pair.second, MOJO_HANDLE_INVALID); |
413 | 405 |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
544 if (result != MOJO_RESULT_OK) | 536 if (result != MOJO_RESULT_OK) |
545 return result; | 537 return result; |
546 | 538 |
547 auto dispatcher = SharedBufferDispatcher::Create( | 539 auto dispatcher = SharedBufferDispatcher::Create( |
548 platform_support_, validated_options, num_bytes, &result); | 540 platform_support_, validated_options, num_bytes, &result); |
549 if (result != MOJO_RESULT_OK) { | 541 if (result != MOJO_RESULT_OK) { |
550 DCHECK(!dispatcher); | 542 DCHECK(!dispatcher); |
551 return result; | 543 return result; |
552 } | 544 } |
553 | 545 |
554 // Note that shared buffer handles are duplicatable (by default). | 546 MojoHandle h = AddHandle( |
555 MojoHandle h = AddHandle(Handle( | 547 Handle(dispatcher.Clone(), SharedBufferDispatcher::kDefaultHandleRights)); |
556 dispatcher.Clone(), MOJO_HANDLE_RIGHT_DUPLICATE | | |
557 MOJO_HANDLE_RIGHT_TRANSFER | | |
558 MOJO_HANDLE_RIGHT_READ | MOJO_HANDLE_RIGHT_WRITE | | |
559 MOJO_HANDLE_RIGHT_EXECUTE)); | |
560 if (h == MOJO_HANDLE_INVALID) { | 548 if (h == MOJO_HANDLE_INVALID) { |
561 LOG(ERROR) << "Handle table full"; | 549 LOG(ERROR) << "Handle table full"; |
562 dispatcher->Close(); | 550 dispatcher->Close(); |
563 return MOJO_RESULT_RESOURCE_EXHAUSTED; | 551 return MOJO_RESULT_RESOURCE_EXHAUSTED; |
564 } | 552 } |
565 | 553 |
566 shared_buffer_handle.Put(h); | 554 shared_buffer_handle.Put(h); |
567 return MOJO_RESULT_OK; | 555 return MOJO_RESULT_OK; |
568 } | 556 } |
569 | 557 |
570 MojoResult Core::DuplicateBufferHandle( | 558 MojoResult Core::DuplicateBufferHandle( |
571 MojoHandle buffer_handle, | 559 MojoHandle buffer_handle, |
572 UserPointer<const MojoDuplicateBufferHandleOptions> options, | 560 UserPointer<const MojoDuplicateBufferHandleOptions> options, |
573 UserPointer<MojoHandle> new_buffer_handle) { | 561 UserPointer<MojoHandle> new_buffer_handle) { |
574 RefPtr<Dispatcher> dispatcher; | 562 RefPtr<Dispatcher> dispatcher; |
575 MojoResult result = GetDispatcher(buffer_handle, &dispatcher); | 563 MojoResult result = GetDispatcher(buffer_handle, &dispatcher); |
576 if (result != MOJO_RESULT_OK) | 564 if (result != MOJO_RESULT_OK) |
577 return result; | 565 return result; |
578 | 566 |
579 // Don't verify |options| here; that's the dispatcher's job. | 567 // Don't verify |options| here; that's the dispatcher's job. |
580 RefPtr<Dispatcher> new_dispatcher; | 568 RefPtr<Dispatcher> new_dispatcher; |
581 result = dispatcher->DuplicateBufferHandle(options, &new_dispatcher); | 569 result = dispatcher->DuplicateBufferHandle(options, &new_dispatcher); |
582 if (result != MOJO_RESULT_OK) | 570 if (result != MOJO_RESULT_OK) |
583 return result; | 571 return result; |
584 | 572 |
585 MojoHandle new_handle = AddDispatcher(new_dispatcher.get()); | 573 // TODO(vtl): This should be done with the original handle's rights. |
| 574 MojoHandle new_handle = AddHandle(Handle( |
| 575 new_dispatcher.Clone(), SharedBufferDispatcher::kDefaultHandleRights)); |
586 if (new_handle == MOJO_HANDLE_INVALID) { | 576 if (new_handle == MOJO_HANDLE_INVALID) { |
587 LOG(ERROR) << "Handle table full"; | 577 LOG(ERROR) << "Handle table full"; |
588 new_dispatcher->Close(); | 578 new_dispatcher->Close(); |
589 return MOJO_RESULT_RESOURCE_EXHAUSTED; | 579 return MOJO_RESULT_RESOURCE_EXHAUSTED; |
590 } | 580 } |
591 | 581 |
592 new_buffer_handle.Put(new_handle); | 582 new_buffer_handle.Put(new_handle); |
593 return MOJO_RESULT_OK; | 583 return MOJO_RESULT_OK; |
594 } | 584 } |
595 | 585 |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
702 if (signals_states) { | 692 if (signals_states) { |
703 for (; i < num_handles; i++) | 693 for (; i < num_handles; i++) |
704 signals_states[i] = dispatchers[i]->GetHandleSignalsState(); | 694 signals_states[i] = dispatchers[i]->GetHandleSignalsState(); |
705 } | 695 } |
706 | 696 |
707 return result; | 697 return result; |
708 } | 698 } |
709 | 699 |
710 } // namespace system | 700 } // namespace system |
711 } // namespace mojo | 701 } // namespace mojo |
OLD | NEW |