| 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 | 
|  |