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/dispatcher.h" | 5 #include "mojo/edk/system/dispatcher.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "mojo/edk/system/configuration.h" | 8 #include "mojo/edk/system/configuration.h" |
9 #include "mojo/edk/system/data_pipe_consumer_dispatcher.h" | 9 #include "mojo/edk/system/data_pipe_consumer_dispatcher.h" |
10 #include "mojo/edk/system/data_pipe_producer_dispatcher.h" | 10 #include "mojo/edk/system/data_pipe_producer_dispatcher.h" |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
69 } | 69 } |
70 | 70 |
71 // static | 71 // static |
72 scoped_refptr<Dispatcher> Dispatcher::TransportDataAccess::Deserialize( | 72 scoped_refptr<Dispatcher> Dispatcher::TransportDataAccess::Deserialize( |
73 int32_t type, | 73 int32_t type, |
74 const void* source, | 74 const void* source, |
75 size_t size, | 75 size_t size, |
76 PlatformHandleVector* platform_handles) { | 76 PlatformHandleVector* platform_handles) { |
77 switch (static_cast<Dispatcher::Type>(type)) { | 77 switch (static_cast<Dispatcher::Type>(type)) { |
78 case Type::UNKNOWN: | 78 case Type::UNKNOWN: |
| 79 case Type::WAIT_SET: |
79 DVLOG(2) << "Deserializing invalid handle"; | 80 DVLOG(2) << "Deserializing invalid handle"; |
80 return nullptr; | 81 return nullptr; |
81 case Type::MESSAGE_PIPE: | 82 case Type::MESSAGE_PIPE: |
82 return scoped_refptr<Dispatcher>(MessagePipeDispatcher::Deserialize( | 83 return scoped_refptr<Dispatcher>(MessagePipeDispatcher::Deserialize( |
83 source, size, platform_handles)); | 84 source, size, platform_handles)); |
84 case Type::DATA_PIPE_PRODUCER: | 85 case Type::DATA_PIPE_PRODUCER: |
85 return scoped_refptr<Dispatcher>( | 86 return scoped_refptr<Dispatcher>( |
86 DataPipeProducerDispatcher::Deserialize( | 87 DataPipeProducerDispatcher::Deserialize( |
87 source, size, platform_handles)); | 88 source, size, platform_handles)); |
88 case Type::DATA_PIPE_CONSUMER: | 89 case Type::DATA_PIPE_CONSUMER: |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
246 base::AutoLock locker(lock_); | 247 base::AutoLock locker(lock_); |
247 if (is_closed_) { | 248 if (is_closed_) { |
248 if (handle_signals_state) | 249 if (handle_signals_state) |
249 *handle_signals_state = HandleSignalsState(); | 250 *handle_signals_state = HandleSignalsState(); |
250 return; | 251 return; |
251 } | 252 } |
252 | 253 |
253 RemoveAwakableImplNoLock(awakable, handle_signals_state); | 254 RemoveAwakableImplNoLock(awakable, handle_signals_state); |
254 } | 255 } |
255 | 256 |
| 257 MojoResult Dispatcher::AddWaitingDispatcher( |
| 258 const scoped_refptr<Dispatcher>& dispatcher, |
| 259 MojoHandleSignals signals, |
| 260 uintptr_t context) { |
| 261 base::AutoLock locker(lock_); |
| 262 if (is_closed_) |
| 263 return MOJO_RESULT_INVALID_ARGUMENT; |
| 264 |
| 265 return AddWaitingDispatcherImplNoLock(dispatcher, signals, context); |
| 266 } |
| 267 |
| 268 MojoResult Dispatcher::RemoveWaitingDispatcher( |
| 269 const scoped_refptr<Dispatcher>& dispatcher) { |
| 270 base::AutoLock locker(lock_); |
| 271 if (is_closed_) |
| 272 return MOJO_RESULT_INVALID_ARGUMENT; |
| 273 |
| 274 return RemoveWaitingDispatcherImplNoLock(dispatcher); |
| 275 } |
| 276 |
| 277 MojoResult Dispatcher::GetReadyDispatchers(uint32_t* count, |
| 278 DispatcherVector* dispatchers, |
| 279 MojoResult* results, |
| 280 uintptr_t* contexts) { |
| 281 base::AutoLock locker(lock_); |
| 282 if (is_closed_) |
| 283 return MOJO_RESULT_INVALID_ARGUMENT; |
| 284 |
| 285 return GetReadyDispatchersImplNoLock(count, dispatchers, results, contexts); |
| 286 } |
| 287 |
256 Dispatcher::Dispatcher() : is_closed_(false) { | 288 Dispatcher::Dispatcher() : is_closed_(false) { |
257 } | 289 } |
258 | 290 |
259 Dispatcher::~Dispatcher() { | 291 Dispatcher::~Dispatcher() { |
260 // Make sure that |Close()| was called. | 292 // Make sure that |Close()| was called. |
261 DCHECK(is_closed_); | 293 DCHECK(is_closed_); |
262 } | 294 } |
263 | 295 |
264 void Dispatcher::CancelAllAwakablesNoLock() { | 296 void Dispatcher::CancelAllAwakablesNoLock() { |
265 lock_.AssertAcquired(); | 297 lock_.AssertAcquired(); |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
385 HandleSignalsState* signals_state) { | 417 HandleSignalsState* signals_state) { |
386 lock_.AssertAcquired(); | 418 lock_.AssertAcquired(); |
387 DCHECK(!is_closed_); | 419 DCHECK(!is_closed_); |
388 // By default, waiting isn't supported. Only dispatchers that can be waited on | 420 // By default, waiting isn't supported. Only dispatchers that can be waited on |
389 // will do something nontrivial. | 421 // will do something nontrivial. |
390 if (signals_state) | 422 if (signals_state) |
391 *signals_state = HandleSignalsState(); | 423 *signals_state = HandleSignalsState(); |
392 return MOJO_RESULT_FAILED_PRECONDITION; | 424 return MOJO_RESULT_FAILED_PRECONDITION; |
393 } | 425 } |
394 | 426 |
| 427 MojoResult Dispatcher::AddWaitingDispatcherImplNoLock( |
| 428 const scoped_refptr<Dispatcher>& /*dispatcher*/, |
| 429 MojoHandleSignals /*signals*/, |
| 430 uintptr_t /*context*/) { |
| 431 lock_.AssertAcquired(); |
| 432 DCHECK(!is_closed_); |
| 433 // By default, not supported. Only needed for wait set dispatchers. |
| 434 return MOJO_RESULT_INVALID_ARGUMENT; |
| 435 } |
| 436 |
| 437 MojoResult Dispatcher::RemoveWaitingDispatcherImplNoLock( |
| 438 const scoped_refptr<Dispatcher>& /*dispatcher*/) { |
| 439 lock_.AssertAcquired(); |
| 440 DCHECK(!is_closed_); |
| 441 // By default, not supported. Only needed for wait set dispatchers. |
| 442 return MOJO_RESULT_INVALID_ARGUMENT; |
| 443 } |
| 444 |
| 445 MojoResult Dispatcher::GetReadyDispatchersImplNoLock( |
| 446 uint32_t* /*count*/, |
| 447 DispatcherVector* /*dispatchers*/, |
| 448 MojoResult* /*results*/, |
| 449 uintptr_t* /*contexts*/) { |
| 450 lock_.AssertAcquired(); |
| 451 DCHECK(!is_closed_); |
| 452 // By default, not supported. Only needed for wait set dispatchers. |
| 453 return MOJO_RESULT_INVALID_ARGUMENT; |
| 454 } |
| 455 |
395 void Dispatcher::RemoveAwakableImplNoLock(Awakable* /*awakable*/, | 456 void Dispatcher::RemoveAwakableImplNoLock(Awakable* /*awakable*/, |
396 HandleSignalsState* signals_state) { | 457 HandleSignalsState* signals_state) { |
397 lock_.AssertAcquired(); | 458 lock_.AssertAcquired(); |
398 DCHECK(!is_closed_); | 459 DCHECK(!is_closed_); |
399 // By default, waiting isn't supported. Only dispatchers that can be waited on | 460 // By default, waiting isn't supported. Only dispatchers that can be waited on |
400 // will do something nontrivial. | 461 // will do something nontrivial. |
401 if (signals_state) | 462 if (signals_state) |
402 *signals_state = HandleSignalsState(); | 463 *signals_state = HandleSignalsState(); |
403 } | 464 } |
404 | 465 |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
477 DCHECK(dispatcher_); | 538 DCHECK(dispatcher_); |
478 dispatcher_->lock_.Release(); | 539 dispatcher_->lock_.Release(); |
479 | 540 |
480 dispatcher_->TransportEnded(); | 541 dispatcher_->TransportEnded(); |
481 | 542 |
482 dispatcher_ = nullptr; | 543 dispatcher_ = nullptr; |
483 } | 544 } |
484 | 545 |
485 } // namespace edk | 546 } // namespace edk |
486 } // namespace mojo | 547 } // namespace mojo |
OLD | NEW |