| Index: mojo/edk/system/wait_set_dispatcher.cc
|
| diff --git a/third_party/mojo/src/mojo/edk/system/wait_set_dispatcher.cc b/mojo/edk/system/wait_set_dispatcher.cc
|
| similarity index 84%
|
| copy from third_party/mojo/src/mojo/edk/system/wait_set_dispatcher.cc
|
| copy to mojo/edk/system/wait_set_dispatcher.cc
|
| index 45518e7eefd14044f2696bca00dd8fce301cfc31..3a667df2c11d10edf3bda9d3b4bc5da9a7d0d61f 100644
|
| --- a/third_party/mojo/src/mojo/edk/system/wait_set_dispatcher.cc
|
| +++ b/mojo/edk/system/wait_set_dispatcher.cc
|
| @@ -2,16 +2,16 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -#include "third_party/mojo/src/mojo/edk/system/wait_set_dispatcher.h"
|
| +#include "mojo/edk/system/wait_set_dispatcher.h"
|
|
|
| #include <algorithm>
|
| #include <utility>
|
|
|
| #include "base/logging.h"
|
| -#include "third_party/mojo/src/mojo/edk/system/awakable.h"
|
| +#include "mojo/edk/system/awakable.h"
|
|
|
| namespace mojo {
|
| -namespace system {
|
| +namespace edk {
|
|
|
| class WaitSetDispatcher::Waiter final : public Awakable {
|
| public:
|
| @@ -30,6 +30,10 @@ class WaitSetDispatcher::Waiter final : public Awakable {
|
| WaitSetDispatcher* const dispatcher_;
|
| };
|
|
|
| +WaitSetDispatcher::WaitState::WaitState() {}
|
| +
|
| +WaitSetDispatcher::WaitState::~WaitState() {}
|
| +
|
| WaitSetDispatcher::WaitSetDispatcher()
|
| : waiter_(new WaitSetDispatcher::Waiter(this)) {}
|
|
|
| @@ -44,12 +48,12 @@ Dispatcher::Type WaitSetDispatcher::GetType() const {
|
| }
|
|
|
| void WaitSetDispatcher::CloseImplNoLock() {
|
| - mutex().AssertHeld();
|
| + lock().AssertAcquired();
|
| for (const auto& entry : waiting_dispatchers_)
|
| entry.second.dispatcher->RemoveAwakable(waiter_.get(), nullptr);
|
| waiting_dispatchers_.clear();
|
|
|
| - MutexLocker locker(&awoken_mutex_);
|
| + base::AutoLock locker(awoken_lock_);
|
| awoken_queue_.clear();
|
| processed_dispatchers_.clear();
|
| }
|
| @@ -58,7 +62,7 @@ MojoResult WaitSetDispatcher::AddWaitingDispatcherImplNoLock(
|
| const scoped_refptr<Dispatcher>& dispatcher,
|
| MojoHandleSignals signals,
|
| uintptr_t context) {
|
| - mutex().AssertHeld();
|
| + lock().AssertAcquired();
|
| if (dispatcher == this)
|
| return MOJO_RESULT_INVALID_ARGUMENT;
|
|
|
| @@ -81,9 +85,8 @@ MojoResult WaitSetDispatcher::AddWaitingDispatcherImplNoLock(
|
| state.dispatcher = dispatcher;
|
| state.context = context;
|
| state.signals = signals;
|
| - bool inserted =
|
| - waiting_dispatchers_.insert(std::make_pair(dispatcher_handle, state))
|
| - .second;
|
| + bool inserted = waiting_dispatchers_.insert(
|
| + std::make_pair(dispatcher_handle, state)).second;
|
| DCHECK(inserted);
|
|
|
| return MOJO_RESULT_OK;
|
| @@ -91,7 +94,7 @@ MojoResult WaitSetDispatcher::AddWaitingDispatcherImplNoLock(
|
|
|
| MojoResult WaitSetDispatcher::RemoveWaitingDispatcherImplNoLock(
|
| const scoped_refptr<Dispatcher>& dispatcher) {
|
| - mutex().AssertHeld();
|
| + lock().AssertAcquired();
|
| uintptr_t dispatcher_handle = reinterpret_cast<uintptr_t>(dispatcher.get());
|
| auto it = waiting_dispatchers_.find(dispatcher_handle);
|
| if (it == waiting_dispatchers_.end())
|
| @@ -102,7 +105,7 @@ MojoResult WaitSetDispatcher::RemoveWaitingDispatcherImplNoLock(
|
| // |dispatcher|.
|
| waiting_dispatchers_.erase(it);
|
|
|
| - MutexLocker locker(&awoken_mutex_);
|
| + base::AutoLock locker(awoken_lock_);
|
| int num_erased = 0;
|
| for (auto it = awoken_queue_.begin(); it != awoken_queue_.end();) {
|
| if (it->first == dispatcher_handle) {
|
| @@ -123,11 +126,11 @@ MojoResult WaitSetDispatcher::RemoveWaitingDispatcherImplNoLock(
|
| }
|
|
|
| MojoResult WaitSetDispatcher::GetReadyDispatchersImplNoLock(
|
| - UserPointer<uint32_t> count,
|
| + uint32_t* count,
|
| DispatcherVector* dispatchers,
|
| - UserPointer<MojoResult> results,
|
| - UserPointer<uintptr_t> contexts) {
|
| - mutex().AssertHeld();
|
| + MojoResult* results,
|
| + uintptr_t* contexts) {
|
| + lock().AssertAcquired();
|
| dispatchers->clear();
|
|
|
| // Re-queue any already retrieved dispatchers. These should be the dispatchers
|
| @@ -138,7 +141,7 @@ MojoResult WaitSetDispatcher::GetReadyDispatchersImplNoLock(
|
| // handle/signal continues to return immediately.
|
| std::deque<uintptr_t> pending;
|
| {
|
| - MutexLocker locker(&awoken_mutex_);
|
| + base::AutoLock locker(awoken_lock_);
|
| pending.swap(processed_dispatchers_);
|
| }
|
| for (uintptr_t d : pending) {
|
| @@ -165,10 +168,10 @@ MojoResult WaitSetDispatcher::GetReadyDispatchersImplNoLock(
|
| }
|
| }
|
|
|
| - const uint32_t max_woken = count.Get();
|
| + const uint32_t max_woken = *count;
|
| uint32_t num_woken = 0;
|
|
|
| - MutexLocker locker(&awoken_mutex_);
|
| + base::AutoLock locker(awoken_lock_);
|
| while (!awoken_queue_.empty() && num_woken < max_woken) {
|
| uintptr_t d = awoken_queue_.front().first;
|
| MojoResult result = awoken_queue_.front().second;
|
| @@ -177,21 +180,23 @@ MojoResult WaitSetDispatcher::GetReadyDispatchersImplNoLock(
|
| auto it = waiting_dispatchers_.find(d);
|
| DCHECK(it != waiting_dispatchers_.end());
|
|
|
| - results.At(num_woken).Put(result);
|
| + results[num_woken] = result;
|
| dispatchers->push_back(it->second.dispatcher);
|
| - if (!contexts.IsNull())
|
| - contexts.At(num_woken).Put(it->second.context);
|
| + if (contexts)
|
| + contexts[num_woken] = it->second.context;
|
|
|
| if (result != MOJO_RESULT_CANCELLED) {
|
| processed_dispatchers_.push_back(d);
|
| } else {
|
| + // |MOJO_RESULT_CANCELLED| indicates that the dispatcher was closed.
|
| + // Return it, but also implcitly remove it from the wait set.
|
| waiting_dispatchers_.erase(it);
|
| }
|
|
|
| num_woken++;
|
| }
|
|
|
| - count.Put(num_woken);
|
| + *count = num_woken;
|
| if (!num_woken)
|
| return MOJO_RESULT_SHOULD_WAIT;
|
|
|
| @@ -199,8 +204,8 @@ MojoResult WaitSetDispatcher::GetReadyDispatchersImplNoLock(
|
| }
|
|
|
| void WaitSetDispatcher::CancelAllAwakablesNoLock() {
|
| - mutex().AssertHeld();
|
| - MutexLocker locker(&awakable_mutex_);
|
| + lock().AssertAcquired();
|
| + base::AutoLock locker(awakable_lock_);
|
| awakable_list_.CancelAll();
|
| }
|
|
|
| @@ -209,7 +214,7 @@ MojoResult WaitSetDispatcher::AddAwakableImplNoLock(
|
| MojoHandleSignals signals,
|
| uintptr_t context,
|
| HandleSignalsState* signals_state) {
|
| - mutex().AssertHeld();
|
| + lock().AssertAcquired();
|
|
|
| HandleSignalsState state(GetHandleSignalsStateImplNoLock());
|
| if (state.satisfies(signals)) {
|
| @@ -223,7 +228,7 @@ MojoResult WaitSetDispatcher::AddAwakableImplNoLock(
|
| return MOJO_RESULT_FAILED_PRECONDITION;
|
| }
|
|
|
| - MutexLocker locker(&awakable_mutex_);
|
| + base::AutoLock locker(awakable_lock_);
|
| awakable_list_.Add(awakable, signals, context);
|
| return MOJO_RESULT_OK;
|
| }
|
| @@ -231,18 +236,18 @@ MojoResult WaitSetDispatcher::AddAwakableImplNoLock(
|
| void WaitSetDispatcher::RemoveAwakableImplNoLock(
|
| Awakable* awakable,
|
| HandleSignalsState* signals_state) {
|
| - mutex().AssertHeld();
|
| - MutexLocker locker(&awakable_mutex_);
|
| + lock().AssertAcquired();
|
| + base::AutoLock locker(awakable_lock_);
|
| awakable_list_.Remove(awakable);
|
| if (signals_state)
|
| *signals_state = GetHandleSignalsStateImplNoLock();
|
| }
|
|
|
| HandleSignalsState WaitSetDispatcher::GetHandleSignalsStateImplNoLock() const {
|
| - mutex().AssertHeld();
|
| + lock().AssertAcquired();
|
| HandleSignalsState rv;
|
| rv.satisfiable_signals = MOJO_HANDLE_SIGNAL_READABLE;
|
| - MutexLocker locker(&awoken_mutex_);
|
| + base::AutoLock locker(awoken_lock_);
|
| if (!awoken_queue_.empty() || !processed_dispatchers_.empty())
|
| rv.satisfied_signals = MOJO_HANDLE_SIGNAL_READABLE;
|
| return rv;
|
| @@ -250,7 +255,7 @@ HandleSignalsState WaitSetDispatcher::GetHandleSignalsStateImplNoLock() const {
|
|
|
| scoped_refptr<Dispatcher>
|
| WaitSetDispatcher::CreateEquivalentDispatcherAndCloseImplNoLock() {
|
| - mutex().AssertHeld();
|
| + lock().AssertAcquired();
|
| LOG(ERROR) << "Attempting to serialize WaitSet";
|
| CloseImplNoLock();
|
| return new WaitSetDispatcher();
|
| @@ -258,7 +263,7 @@ WaitSetDispatcher::CreateEquivalentDispatcherAndCloseImplNoLock() {
|
|
|
| void WaitSetDispatcher::WakeDispatcher(MojoResult result, uintptr_t context) {
|
| {
|
| - MutexLocker locker(&awoken_mutex_);
|
| + base::AutoLock locker(awoken_lock_);
|
|
|
| if (result == MOJO_RESULT_ALREADY_EXISTS)
|
| result = MOJO_RESULT_OK;
|
| @@ -266,12 +271,12 @@ void WaitSetDispatcher::WakeDispatcher(MojoResult result, uintptr_t context) {
|
| awoken_queue_.push_back(std::make_pair(context, result));
|
| }
|
|
|
| - MutexLocker locker(&awakable_mutex_);
|
| + base::AutoLock locker(awakable_lock_);
|
| HandleSignalsState signals_state;
|
| signals_state.satisfiable_signals = MOJO_HANDLE_SIGNAL_READABLE;
|
| signals_state.satisfied_signals = MOJO_HANDLE_SIGNAL_READABLE;
|
| awakable_list_.AwakeForStateChange(signals_state);
|
| }
|
|
|
| -} // namespace system
|
| +} // namespace edk
|
| } // namespace mojo
|
|
|