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
3 // found in the LICENSE file.
5 #include "mojo/system/dispatcher.h"
7 #include "base/logging.h"
8 #include "mojo/system/constants.h"
13 // Dispatcher ------------------------------------------------------------------
16 DispatcherTransport Dispatcher::CoreImplAccess::TryStartTransport(
17 Dispatcher* dispatcher) {
20 if (!dispatcher->lock_.Try())
21 return DispatcherTransport();
23 // We shouldn't race with things that close dispatchers, since closing can
24 // only take place either under |handle_table_lock_| or when the handle is
26 DCHECK(!dispatcher->is_closed_);
28 return DispatcherTransport(dispatcher);
31 MojoResult Dispatcher::Close() {
32 base::AutoLock locker(lock_);
34 return MOJO_RESULT_INVALID_ARGUMENT;
37 return MOJO_RESULT_OK;
40 MojoResult Dispatcher::WriteMessage(
43 std::vector<DispatcherTransport>* transports,
44 MojoWriteMessageFlags flags) {
45 DCHECK(!transports || (transports->size() > 0 &&
46 transports->size() < kMaxMessageNumHandles));
48 base::AutoLock locker(lock_);
50 return MOJO_RESULT_INVALID_ARGUMENT;
52 return WriteMessageImplNoLock(bytes, num_bytes, transports, flags);
55 MojoResult Dispatcher::ReadMessage(
58 std::vector<scoped_refptr<Dispatcher> >* dispatchers,
59 uint32_t* num_dispatchers,
60 MojoReadMessageFlags flags) {
61 DCHECK(!num_dispatchers || *num_dispatchers == 0 ||
62 (dispatchers && dispatchers->empty()));
64 base::AutoLock locker(lock_);
66 return MOJO_RESULT_INVALID_ARGUMENT;
68 return ReadMessageImplNoLock(bytes, num_bytes, dispatchers, num_dispatchers,
72 MojoResult Dispatcher::WriteData(const void* elements,
74 MojoWriteDataFlags flags) {
75 base::AutoLock locker(lock_);
77 return MOJO_RESULT_INVALID_ARGUMENT;
79 return WriteDataImplNoLock(elements, num_bytes, flags);
82 MojoResult Dispatcher::BeginWriteData(void** buffer,
83 uint32_t* buffer_num_bytes,
84 MojoWriteDataFlags flags) {
85 base::AutoLock locker(lock_);
87 return MOJO_RESULT_INVALID_ARGUMENT;
89 return BeginWriteDataImplNoLock(buffer, buffer_num_bytes, flags);
92 MojoResult Dispatcher::EndWriteData(uint32_t num_bytes_written) {
93 base::AutoLock locker(lock_);
95 return MOJO_RESULT_INVALID_ARGUMENT;
97 return EndWriteDataImplNoLock(num_bytes_written);
100 MojoResult Dispatcher::ReadData(void* elements,
102 MojoReadDataFlags flags) {
103 base::AutoLock locker(lock_);
105 return MOJO_RESULT_INVALID_ARGUMENT;
107 return ReadDataImplNoLock(elements, num_bytes, flags);
110 MojoResult Dispatcher::BeginReadData(const void** buffer,
111 uint32_t* buffer_num_bytes,
112 MojoReadDataFlags flags) {
113 base::AutoLock locker(lock_);
115 return MOJO_RESULT_INVALID_ARGUMENT;
117 return BeginReadDataImplNoLock(buffer, buffer_num_bytes, flags);
120 MojoResult Dispatcher::EndReadData(uint32_t num_bytes_read) {
121 base::AutoLock locker(lock_);
123 return MOJO_RESULT_INVALID_ARGUMENT;
125 return EndReadDataImplNoLock(num_bytes_read);
128 MojoResult Dispatcher::AddWaiter(Waiter* waiter,
130 MojoResult wake_result) {
131 DCHECK_GE(wake_result, 0);
133 base::AutoLock locker(lock_);
135 return MOJO_RESULT_INVALID_ARGUMENT;
137 return AddWaiterImplNoLock(waiter, flags, wake_result);
140 void Dispatcher::RemoveWaiter(Waiter* waiter) {
141 base::AutoLock locker(lock_);
144 RemoveWaiterImplNoLock(waiter);
147 Dispatcher::Dispatcher()
148 : is_closed_(false) {
151 Dispatcher::~Dispatcher() {
152 // Make sure that |Close()| was called.
156 void Dispatcher::CancelAllWaitersNoLock() {
157 lock_.AssertAcquired();
159 // By default, waiting isn't supported. Only dispatchers that can be waited on
160 // will do something nontrivial.
163 void Dispatcher::CloseImplNoLock() {
164 lock_.AssertAcquired();
166 // This may not need to do anything. Dispatchers should override this to do
167 // any actual close-time cleanup necessary.
170 MojoResult Dispatcher::WriteMessageImplNoLock(
171 const void* /*bytes*/,
172 uint32_t /*num_bytes*/,
173 std::vector<DispatcherTransport>* /*transports*/,
174 MojoWriteMessageFlags /*flags*/) {
175 lock_.AssertAcquired();
177 // By default, not supported. Only needed for message pipe dispatchers.
178 return MOJO_RESULT_INVALID_ARGUMENT;
181 MojoResult Dispatcher::ReadMessageImplNoLock(
183 uint32_t* /*num_bytes*/,
184 std::vector<scoped_refptr<Dispatcher> >* /*dispatchers*/,
185 uint32_t* /*num_dispatchers*/,
186 MojoReadMessageFlags /*flags*/) {
187 lock_.AssertAcquired();
189 // By default, not supported. Only needed for message pipe dispatchers.
190 return MOJO_RESULT_INVALID_ARGUMENT;
193 MojoResult Dispatcher::WriteDataImplNoLock(const void* /*elements*/,
194 uint32_t* /*num_bytes*/,
195 MojoWriteDataFlags /*flags*/) {
196 lock_.AssertAcquired();
198 // By default, not supported. Only needed for data pipe dispatchers.
199 return MOJO_RESULT_INVALID_ARGUMENT;
202 MojoResult Dispatcher::BeginWriteDataImplNoLock(void** /*buffer*/,
203 uint32_t* /*buffer_num_bytes*/,
204 MojoWriteDataFlags /*flags*/) {
205 lock_.AssertAcquired();
207 // By default, not supported. Only needed for data pipe dispatchers.
208 return MOJO_RESULT_INVALID_ARGUMENT;
211 MojoResult Dispatcher::EndWriteDataImplNoLock(uint32_t /*num_bytes_written*/) {
212 lock_.AssertAcquired();
214 // By default, not supported. Only needed for data pipe dispatchers.
215 return MOJO_RESULT_INVALID_ARGUMENT;
218 MojoResult Dispatcher::ReadDataImplNoLock(void* /*elements*/,
219 uint32_t* /*num_bytes*/,
220 MojoReadDataFlags /*flags*/) {
221 lock_.AssertAcquired();
223 // By default, not supported. Only needed for data pipe dispatchers.
224 return MOJO_RESULT_INVALID_ARGUMENT;
227 MojoResult Dispatcher::BeginReadDataImplNoLock(const void** /*buffer*/,
228 uint32_t* /*buffer_num_bytes*/,
229 MojoReadDataFlags /*flags*/) {
230 lock_.AssertAcquired();
232 // By default, not supported. Only needed for data pipe dispatchers.
233 return MOJO_RESULT_INVALID_ARGUMENT;
236 MojoResult Dispatcher::EndReadDataImplNoLock(uint32_t /*num_bytes_read*/) {
237 lock_.AssertAcquired();
239 // By default, not supported. Only needed for data pipe dispatchers.
240 return MOJO_RESULT_INVALID_ARGUMENT;
243 MojoResult Dispatcher::AddWaiterImplNoLock(Waiter* /*waiter*/,
244 MojoWaitFlags /*flags*/,
245 MojoResult /*wake_result*/) {
246 lock_.AssertAcquired();
248 // By default, waiting isn't supported. Only dispatchers that can be waited on
249 // will do something nontrivial.
250 return MOJO_RESULT_FAILED_PRECONDITION;
253 void Dispatcher::RemoveWaiterImplNoLock(Waiter* /*waiter*/) {
254 lock_.AssertAcquired();
256 // By default, waiting isn't supported. Only dispatchers that can be waited on
257 // will do something nontrivial.
260 bool Dispatcher::IsBusyNoLock() const {
261 lock_.AssertAcquired();
263 // Most dispatchers support only "atomic" operations, so they are never busy
268 void Dispatcher::CloseNoLock() {
269 lock_.AssertAcquired();
273 CancelAllWaitersNoLock();
277 scoped_refptr<Dispatcher>
278 Dispatcher::CreateEquivalentDispatcherAndCloseNoLock() {
279 lock_.AssertAcquired();
283 CancelAllWaitersNoLock();
284 return CreateEquivalentDispatcherAndCloseImplNoLock();
287 // DispatcherTransport ---------------------------------------------------------
289 void DispatcherTransport::End() {
291 dispatcher_->lock_.Release();
295 } // namespace system