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 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
98 } | 98 } |
99 | 99 |
100 MojoResult Core::GetHandle(MojoHandle handle, Handle* h) { | 100 MojoResult Core::GetHandle(MojoHandle handle, Handle* h) { |
101 if (handle == MOJO_HANDLE_INVALID) | 101 if (handle == MOJO_HANDLE_INVALID) |
102 return MOJO_RESULT_INVALID_ARGUMENT; | 102 return MOJO_RESULT_INVALID_ARGUMENT; |
103 | 103 |
104 MutexLocker locker(&handle_table_mutex_); | 104 MutexLocker locker(&handle_table_mutex_); |
105 return handle_table_.GetHandle(handle, h); | 105 return handle_table_.GetHandle(handle, h); |
106 } | 106 } |
107 | 107 |
108 MojoResult Core::GetDispatcher(MojoHandle handle, | |
109 RefPtr<Dispatcher>* dispatcher) { | |
110 Handle h; | |
111 MojoResult result = GetHandle(handle, &h); | |
112 if (result == MOJO_RESULT_OK) | |
113 *dispatcher = std::move(h.dispatcher); | |
114 return result; | |
115 } | |
116 | |
117 MojoResult Core::GetAndRemoveDispatcher(MojoHandle handle, | 108 MojoResult Core::GetAndRemoveDispatcher(MojoHandle handle, |
118 RefPtr<Dispatcher>* dispatcher) { | 109 RefPtr<Dispatcher>* dispatcher) { |
119 if (handle == MOJO_HANDLE_INVALID) | 110 if (handle == MOJO_HANDLE_INVALID) |
120 return MOJO_RESULT_INVALID_ARGUMENT; | 111 return MOJO_RESULT_INVALID_ARGUMENT; |
121 | 112 |
122 MutexLocker locker(&handle_table_mutex_); | 113 MutexLocker locker(&handle_table_mutex_); |
123 Handle h; | 114 Handle h; |
124 MojoResult result = handle_table_.GetAndRemoveHandle(handle, &h); | 115 MojoResult result = handle_table_.GetAndRemoveHandle(handle, &h); |
125 if (result == MOJO_RESULT_OK) | 116 if (result == MOJO_RESULT_OK) |
126 *dispatcher = std::move(h.dispatcher); | 117 *dispatcher = std::move(h.dispatcher); |
127 return result; | 118 return result; |
128 } | 119 } |
129 | 120 |
130 MojoResult Core::GetDispatcherAndCheckRights( | 121 MojoResult Core::GetDispatcherAndCheckRights( |
131 MojoHandle handle, | 122 MojoHandle handle, |
132 MojoHandleRights required_handle_rights, | 123 MojoHandleRights required_handle_rights, |
133 EntrypointClass entrypoint_class, | 124 EntrypointClass entrypoint_class, |
134 util::RefPtr<Dispatcher>* dispatcher) { | 125 util::RefPtr<Dispatcher>* dispatcher) { |
135 if (handle == MOJO_HANDLE_INVALID) | 126 if (handle == MOJO_HANDLE_INVALID) |
136 return MOJO_RESULT_INVALID_ARGUMENT; | 127 return MOJO_RESULT_INVALID_ARGUMENT; |
137 | 128 |
138 Handle h; | 129 Handle h; |
139 MojoResult result = GetHandle(handle, &h); | 130 MojoResult result = GetHandle(handle, &h); |
140 if (result != MOJO_RESULT_OK) | 131 if (result != MOJO_RESULT_OK) |
141 return result; | 132 return result; |
142 | 133 |
143 if ((h.rights & required_handle_rights) != required_handle_rights) { | 134 if (!h.has_all_rights(required_handle_rights)) { |
144 return h.dispatcher->SupportsEntrypointClass(entrypoint_class) | 135 return h.dispatcher->SupportsEntrypointClass(entrypoint_class) |
145 ? MOJO_RESULT_PERMISSION_DENIED | 136 ? MOJO_RESULT_PERMISSION_DENIED |
146 : MOJO_RESULT_INVALID_ARGUMENT; | 137 : MOJO_RESULT_INVALID_ARGUMENT; |
147 } | 138 } |
148 | 139 |
149 *dispatcher = std::move(h.dispatcher); | 140 *dispatcher = std::move(h.dispatcher); |
150 return MOJO_RESULT_OK; | 141 return MOJO_RESULT_OK; |
151 } | 142 } |
152 | 143 |
153 MojoResult Core::AsyncWait(MojoHandle handle, | 144 MojoResult Core::AsyncWait(MojoHandle handle, |
(...skipping 463 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
617 MojoHandle buffer_handle, | 608 MojoHandle buffer_handle, |
618 UserPointer<const MojoDuplicateBufferHandleOptions> options, | 609 UserPointer<const MojoDuplicateBufferHandleOptions> options, |
619 UserPointer<MojoHandle> new_buffer_handle) { | 610 UserPointer<MojoHandle> new_buffer_handle) { |
620 // TODO(vtl): This is a big ugly and duplicates some code, but the plan is to | 611 // TODO(vtl): This is a big ugly and duplicates some code, but the plan is to |
621 // remove this method anyway. | 612 // remove this method anyway. |
622 Handle h; | 613 Handle h; |
623 MojoResult result = GetHandle(buffer_handle, &h); | 614 MojoResult result = GetHandle(buffer_handle, &h); |
624 if (result != MOJO_RESULT_OK) | 615 if (result != MOJO_RESULT_OK) |
625 return result; | 616 return result; |
626 | 617 |
627 if (!(h.rights & MOJO_HANDLE_RIGHT_DUPLICATE)) { | 618 if (!h.has_all_rights(MOJO_HANDLE_RIGHT_DUPLICATE)) { |
628 return h.dispatcher->SupportsEntrypointClass(EntrypointClass::BUFFER) | 619 return h.dispatcher->SupportsEntrypointClass(EntrypointClass::BUFFER) |
629 ? MOJO_RESULT_PERMISSION_DENIED | 620 ? MOJO_RESULT_PERMISSION_DENIED |
630 : MOJO_RESULT_INVALID_ARGUMENT; | 621 : MOJO_RESULT_INVALID_ARGUMENT; |
631 } | 622 } |
632 | 623 |
633 // Don't verify |options| here; that's the dispatcher's job. | 624 // Don't verify |options| here; that's the dispatcher's job. |
634 RefPtr<Dispatcher> new_dispatcher; | 625 RefPtr<Dispatcher> new_dispatcher; |
635 result = h.dispatcher->DuplicateBufferHandle(options, &new_dispatcher); | 626 result = h.dispatcher->DuplicateBufferHandle(options, &new_dispatcher); |
636 if (result != MOJO_RESULT_OK) | 627 if (result != MOJO_RESULT_OK) |
637 return result; | 628 return result; |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
762 if (signals_states) { | 753 if (signals_states) { |
763 for (; i < num_handles; i++) | 754 for (; i < num_handles; i++) |
764 signals_states[i] = dispatchers[i]->GetHandleSignalsState(); | 755 signals_states[i] = dispatchers[i]->GetHandleSignalsState(); |
765 } | 756 } |
766 | 757 |
767 return result; | 758 return result; |
768 } | 759 } |
769 | 760 |
770 } // namespace system | 761 } // namespace system |
771 } // namespace mojo | 762 } // namespace mojo |
OLD | NEW |