| 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 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 299 | 299 |
| 300 HandleSignalsState Dispatcher::GetHandleSignalsState() const { | 300 HandleSignalsState Dispatcher::GetHandleSignalsState() const { |
| 301 MutexLocker locker(&mutex_); | 301 MutexLocker locker(&mutex_); |
| 302 if (is_closed_) | 302 if (is_closed_) |
| 303 return HandleSignalsState(); | 303 return HandleSignalsState(); |
| 304 | 304 |
| 305 return GetHandleSignalsStateImplNoLock(); | 305 return GetHandleSignalsStateImplNoLock(); |
| 306 } | 306 } |
| 307 | 307 |
| 308 MojoResult Dispatcher::AddAwakable(Awakable* awakable, | 308 MojoResult Dispatcher::AddAwakable(Awakable* awakable, |
| 309 uint64_t context, |
| 310 bool force, |
| 309 MojoHandleSignals signals, | 311 MojoHandleSignals signals, |
| 310 uint64_t context, | |
| 311 HandleSignalsState* signals_state) { | 312 HandleSignalsState* signals_state) { |
| 312 MutexLocker locker(&mutex_); | 313 MutexLocker locker(&mutex_); |
| 313 if (is_closed_) { | 314 if (is_closed_) { |
| 314 if (signals_state) | 315 if (signals_state) |
| 315 *signals_state = HandleSignalsState(); | 316 *signals_state = HandleSignalsState(); |
| 316 return MOJO_RESULT_INVALID_ARGUMENT; | 317 return MOJO_RESULT_INVALID_ARGUMENT; |
| 317 } | 318 } |
| 318 | 319 |
| 319 return AddAwakableImplNoLock(awakable, signals, false, context, | 320 return AddAwakableImplNoLock(awakable, context, force, signals, |
| 320 signals_state); | 321 signals_state); |
| 321 } | 322 } |
| 322 | 323 |
| 323 MojoResult Dispatcher::AddAwakableUnconditional( | 324 void Dispatcher::RemoveAwakable(bool match_context, |
| 324 Awakable* awakable, | 325 Awakable* awakable, |
| 325 MojoHandleSignals signals, | 326 uint64_t context, |
| 326 uint64_t context, | |
| 327 HandleSignalsState* signals_state) { | |
| 328 MutexLocker locker(&mutex_); | |
| 329 if (is_closed_) { | |
| 330 if (signals_state) | |
| 331 *signals_state = HandleSignalsState(); | |
| 332 return MOJO_RESULT_INVALID_ARGUMENT; | |
| 333 } | |
| 334 | |
| 335 return AddAwakableImplNoLock(awakable, signals, true, context, signals_state); | |
| 336 } | |
| 337 | |
| 338 void Dispatcher::RemoveAwakable(Awakable* awakable, | |
| 339 HandleSignalsState* signals_state) { | 327 HandleSignalsState* signals_state) { |
| 340 MutexLocker locker(&mutex_); | 328 MutexLocker locker(&mutex_); |
| 341 if (is_closed_) { | 329 if (is_closed_) { |
| 342 if (signals_state) | 330 if (signals_state) |
| 343 *signals_state = HandleSignalsState(); | 331 *signals_state = HandleSignalsState(); |
| 344 return; | 332 return; |
| 345 } | 333 } |
| 346 | 334 |
| 347 RemoveAwakableImplNoLock(awakable, signals_state); | 335 RemoveAwakableImplNoLock(match_context, awakable, context, signals_state); |
| 348 } | |
| 349 | |
| 350 void Dispatcher::RemoveAwakableWithContext(Awakable* awakable, | |
| 351 uint64_t context, | |
| 352 HandleSignalsState* signals_state) { | |
| 353 MutexLocker locker(&mutex_); | |
| 354 if (is_closed_) { | |
| 355 if (signals_state) | |
| 356 *signals_state = HandleSignalsState(); | |
| 357 return; | |
| 358 } | |
| 359 | |
| 360 RemoveAwakableWithContextImplNoLock(awakable, context, signals_state); | |
| 361 } | 336 } |
| 362 | 337 |
| 363 Dispatcher::Dispatcher() : is_closed_(false) {} | 338 Dispatcher::Dispatcher() : is_closed_(false) {} |
| 364 | 339 |
| 365 Dispatcher::~Dispatcher() { | 340 Dispatcher::~Dispatcher() { |
| 366 // Make sure that |Close()| was called. | 341 // Make sure that |Close()| was called. |
| 367 DCHECK(is_closed_); | 342 DCHECK(is_closed_); |
| 368 } | 343 } |
| 369 | 344 |
| 370 void Dispatcher::CancelAllStateNoLock() { | 345 void Dispatcher::CancelAllStateNoLock() { |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 561 HandleSignalsState Dispatcher::GetHandleSignalsStateImplNoLock() const { | 536 HandleSignalsState Dispatcher::GetHandleSignalsStateImplNoLock() const { |
| 562 mutex_.AssertHeld(); | 537 mutex_.AssertHeld(); |
| 563 DCHECK(!is_closed_); | 538 DCHECK(!is_closed_); |
| 564 // By default, waiting isn't supported. Only dispatchers that can be waited on | 539 // By default, waiting isn't supported. Only dispatchers that can be waited on |
| 565 // will do something nontrivial. | 540 // will do something nontrivial. |
| 566 return HandleSignalsState(); | 541 return HandleSignalsState(); |
| 567 } | 542 } |
| 568 | 543 |
| 569 MojoResult Dispatcher::AddAwakableImplNoLock( | 544 MojoResult Dispatcher::AddAwakableImplNoLock( |
| 570 Awakable* /*awakable*/, | 545 Awakable* /*awakable*/, |
| 546 uint64_t /*context*/, |
| 547 bool /*force*/, |
| 571 MojoHandleSignals /*signals*/, | 548 MojoHandleSignals /*signals*/, |
| 572 bool /*force*/, | |
| 573 uint64_t /*context*/, | |
| 574 HandleSignalsState* signals_state) { | 549 HandleSignalsState* signals_state) { |
| 575 mutex_.AssertHeld(); | 550 mutex_.AssertHeld(); |
| 576 DCHECK(!is_closed_); | 551 DCHECK(!is_closed_); |
| 577 // By default, waiting isn't supported. Only dispatchers that can be waited on | 552 // By default, waiting isn't supported. Only dispatchers that can be waited on |
| 578 // will do something nontrivial. | 553 // will do something nontrivial. |
| 579 if (signals_state) | 554 if (signals_state) |
| 580 *signals_state = HandleSignalsState(); | 555 *signals_state = HandleSignalsState(); |
| 581 return MOJO_RESULT_FAILED_PRECONDITION; | 556 return MOJO_RESULT_FAILED_PRECONDITION; |
| 582 } | 557 } |
| 583 | 558 |
| 584 void Dispatcher::RemoveAwakableImplNoLock(Awakable* /*awakable*/, | 559 void Dispatcher::RemoveAwakableImplNoLock(bool /*match_context*/, |
| 560 Awakable* /*awakable*/, |
| 561 uint64_t /*context*/, |
| 585 HandleSignalsState* signals_state) { | 562 HandleSignalsState* signals_state) { |
| 586 mutex_.AssertHeld(); | 563 mutex_.AssertHeld(); |
| 587 DCHECK(!is_closed_); | 564 DCHECK(!is_closed_); |
| 588 // By default, waiting isn't supported. Only dispatchers that can be waited on | 565 // By default, waiting isn't supported. Only dispatchers that can be waited on |
| 589 // will do something nontrivial. | 566 // will do something nontrivial. |
| 590 if (signals_state) | 567 if (signals_state) |
| 591 *signals_state = HandleSignalsState(); | 568 *signals_state = HandleSignalsState(); |
| 592 } | 569 } |
| 593 | 570 |
| 594 void Dispatcher::RemoveAwakableWithContextImplNoLock( | |
| 595 Awakable* /*awakable*/, | |
| 596 uint64_t /*context*/, | |
| 597 HandleSignalsState* signals_state) { | |
| 598 mutex_.AssertHeld(); | |
| 599 DCHECK(!is_closed_); | |
| 600 // By default, waiting isn't supported. Only dispatchers that can be waited on | |
| 601 // will do something nontrivial. | |
| 602 if (signals_state) | |
| 603 *signals_state = HandleSignalsState(); | |
| 604 } | |
| 605 | |
| 606 void Dispatcher::StartSerializeImplNoLock(Channel* /*channel*/, | 571 void Dispatcher::StartSerializeImplNoLock(Channel* /*channel*/, |
| 607 size_t* max_size, | 572 size_t* max_size, |
| 608 size_t* max_platform_handles) { | 573 size_t* max_platform_handles) { |
| 609 AssertHasOneRef(); // Only one ref => no need to take the lock. | 574 AssertHasOneRef(); // Only one ref => no need to take the lock. |
| 610 DCHECK(!is_closed_); | 575 DCHECK(!is_closed_); |
| 611 *max_size = 0; | 576 *max_size = 0; |
| 612 *max_platform_handles = 0; | 577 *max_platform_handles = 0; |
| 613 } | 578 } |
| 614 | 579 |
| 615 bool Dispatcher::EndSerializeAndCloseImplNoLock( | 580 bool Dispatcher::EndSerializeAndCloseImplNoLock( |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 675 // want to remove or weaken). | 640 // want to remove or weaken). |
| 676 MutexLocker locker(&mutex_); | 641 MutexLocker locker(&mutex_); |
| 677 #endif | 642 #endif |
| 678 | 643 |
| 679 return EndSerializeAndCloseImplNoLock(channel, destination, actual_size, | 644 return EndSerializeAndCloseImplNoLock(channel, destination, actual_size, |
| 680 platform_handles); | 645 platform_handles); |
| 681 } | 646 } |
| 682 | 647 |
| 683 } // namespace system | 648 } // namespace system |
| 684 } // namespace mojo | 649 } // namespace mojo |
| OLD | NEW |