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

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

Issue 1947083003: EDK: Replace HandleTable::GetDispatcher() with GetHandle(). (Closed) Base URL: https://github.com/domokit/mojo.git@work788_edk_handle_13.2
Patch Set: Created 4 years, 7 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
« no previous file with comments | « mojo/edk/system/core.h ('k') | mojo/edk/system/handle_table.h » ('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/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 21 matching lines...) Expand all
32 using mojo::platform::PlatformSharedBufferMapping; 32 using mojo::platform::PlatformSharedBufferMapping;
33 using mojo::util::MutexLocker; 33 using mojo::util::MutexLocker;
34 using mojo::util::RefPtr; 34 using mojo::util::RefPtr;
35 35
36 namespace mojo { 36 namespace mojo {
37 namespace system { 37 namespace system {
38 38
39 // Implementation notes 39 // Implementation notes
40 // 40 //
41 // Mojo primitives are implemented by the singleton |Core| object. Most calls 41 // Mojo primitives are implemented by the singleton |Core| object. Most calls
42 // are for a "primary" handle (the first argument). |Core::GetDispatcher()| is 42 // are for a "primary" handle (the first argument). |Core::GetHandle()| is used
43 // used to look up a |Dispatcher| object for a given handle. That object 43 // to look up a |Handle| (in particular, a |Dispatcher| object) for a given
44 // implements most primitives for that object. The wait primitives are not 44 // handle value. The |Dispatcher| object implements most primitives for that
45 // attached to objects and are implemented by |Core| itself. 45 // (conceptual/logical) object. The wait primitives are not attached to objects
46 // and are implemented by |Core| itself.
46 // 47 //
47 // Some objects have multiple handles associated to them, e.g., message pipes 48 // Some objects have multiple handles associated to them, e.g., message pipes
48 // (which have two). In such a case, there is still a |Dispatcher| (e.g., 49 // (which have two). In such a case, there is still a |Dispatcher| (e.g.,
49 // |MessagePipeDispatcher|) for each handle, with each handle having a strong 50 // |MessagePipeDispatcher|) for each handle, with each handle having a strong
50 // reference to the common "secondary" object (e.g., |MessagePipe|). This 51 // reference to the common "secondary" object (e.g., |MessagePipe|). This
51 // secondary object does NOT have any references to the |Dispatcher|s (even if 52 // secondary object does NOT have any references to the |Dispatcher|s (even if
52 // it did, it wouldn't be able to do anything with them due to lock order 53 // it did, it wouldn't be able to do anything with them due to lock order
53 // requirements -- see below). 54 // requirements -- see below).
54 // 55 //
55 // Waiting is implemented by having the thread that wants to wait call the 56 // Waiting is implemented by having the thread that wants to wait call the
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
90 handle_table_(GetConfiguration().max_handle_table_size) {} 91 handle_table_(GetConfiguration().max_handle_table_size) {}
91 92
92 Core::~Core() { 93 Core::~Core() {
93 } 94 }
94 95
95 MojoHandle Core::AddHandle(Handle&& handle) { 96 MojoHandle Core::AddHandle(Handle&& handle) {
96 MutexLocker locker(&handle_table_mutex_); 97 MutexLocker locker(&handle_table_mutex_);
97 return handle_table_.AddHandle(std::move(handle)); 98 return handle_table_.AddHandle(std::move(handle));
98 } 99 }
99 100
100 MojoResult Core::GetDispatcher(MojoHandle handle, 101 MojoResult Core::GetDispatcher(MojoHandle handle_value,
101 RefPtr<Dispatcher>* dispatcher) { 102 RefPtr<Dispatcher>* dispatcher) {
102 if (handle == MOJO_HANDLE_INVALID) 103 if (handle_value == MOJO_HANDLE_INVALID)
103 return MOJO_RESULT_INVALID_ARGUMENT; 104 return MOJO_RESULT_INVALID_ARGUMENT;
104 105
105 MutexLocker locker(&handle_table_mutex_); 106 MutexLocker locker(&handle_table_mutex_);
106 return handle_table_.GetDispatcher(handle, dispatcher); 107 Handle handle;
108 MojoResult rv = handle_table_.GetHandle(handle_value, &handle);
109 if (rv == MOJO_RESULT_OK)
110 *dispatcher = std::move(handle.dispatcher);
111 return rv;
107 } 112 }
108 113
109 MojoResult Core::GetAndRemoveDispatcher(MojoHandle handle, 114 MojoResult Core::GetAndRemoveDispatcher(MojoHandle handle_value,
110 RefPtr<Dispatcher>* dispatcher) { 115 RefPtr<Dispatcher>* dispatcher) {
111 if (handle == MOJO_HANDLE_INVALID) 116 if (handle_value == MOJO_HANDLE_INVALID)
112 return MOJO_RESULT_INVALID_ARGUMENT; 117 return MOJO_RESULT_INVALID_ARGUMENT;
113 118
114 MutexLocker locker(&handle_table_mutex_); 119 MutexLocker locker(&handle_table_mutex_);
115 return handle_table_.GetAndRemoveDispatcher(handle, dispatcher); 120 return handle_table_.GetAndRemoveDispatcher(handle_value, dispatcher);
116 } 121 }
117 122
118 MojoResult Core::AsyncWait(MojoHandle handle, 123 MojoResult Core::AsyncWait(MojoHandle handle,
119 MojoHandleSignals signals, 124 MojoHandleSignals signals,
120 const std::function<void(MojoResult)>& callback) { 125 const std::function<void(MojoResult)>& callback) {
121 RefPtr<Dispatcher> dispatcher; 126 RefPtr<Dispatcher> dispatcher;
122 MojoResult result = GetDispatcher(handle, &dispatcher); 127 MojoResult result = GetDispatcher(handle, &dispatcher);
123 if (result != MOJO_RESULT_OK) 128 if (result != MOJO_RESULT_OK)
124 return result; 129 return result;
125 130
(...skipping 518 matching lines...) Expand 10 before | Expand all | Expand 10 after
644 dispatchers.reserve(num_handles); 649 dispatchers.reserve(num_handles);
645 650
646 { 651 {
647 MutexLocker locker(&handle_table_mutex_); 652 MutexLocker locker(&handle_table_mutex_);
648 for (uint32_t i = 0; i < num_handles; i++) { 653 for (uint32_t i = 0; i < num_handles; i++) {
649 if (handles[i] == MOJO_HANDLE_INVALID) { 654 if (handles[i] == MOJO_HANDLE_INVALID) {
650 *result_index = i; 655 *result_index = i;
651 return MOJO_RESULT_INVALID_ARGUMENT; 656 return MOJO_RESULT_INVALID_ARGUMENT;
652 } 657 }
653 658
654 RefPtr<Dispatcher> dispatcher; 659 Handle handle;
655 MojoResult result = handle_table_.GetDispatcher(handles[i], &dispatcher); 660 MojoResult result = handle_table_.GetHandle(handles[i], &handle);
656 if (result != MOJO_RESULT_OK) { 661 if (result != MOJO_RESULT_OK) {
657 *result_index = i; 662 *result_index = i;
658 return result; 663 return result;
659 } 664 }
660 dispatchers.push_back(std::move(dispatcher)); 665 dispatchers.push_back(std::move(handle.dispatcher));
661 } 666 }
662 } 667 }
663 668
664 // TODO(vtl): Should make the waiter live (permanently) in TLS. 669 // TODO(vtl): Should make the waiter live (permanently) in TLS.
665 Waiter waiter; 670 Waiter waiter;
666 waiter.Init(); 671 waiter.Init();
667 672
668 uint32_t i; 673 uint32_t i;
669 MojoResult result = MOJO_RESULT_OK; 674 MojoResult result = MOJO_RESULT_OK;
670 for (i = 0; i < num_handles; i++) { 675 for (i = 0; i < num_handles; i++) {
(...skipping 21 matching lines...) Expand all
692 if (signals_states) { 697 if (signals_states) {
693 for (; i < num_handles; i++) 698 for (; i < num_handles; i++)
694 signals_states[i] = dispatchers[i]->GetHandleSignalsState(); 699 signals_states[i] = dispatchers[i]->GetHandleSignalsState();
695 } 700 }
696 701
697 return result; 702 return result;
698 } 703 }
699 704
700 } // namespace system 705 } // namespace system
701 } // namespace mojo 706 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/edk/system/core.h ('k') | mojo/edk/system/handle_table.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698