| Index: mojo/public/cpp/bindings/tests/associated_interface_unittest.cc
 | 
| diff --git a/mojo/public/cpp/bindings/tests/associated_interface_unittest.cc b/mojo/public/cpp/bindings/tests/associated_interface_unittest.cc
 | 
| index ac8b330f411e2eece5ed1f5c90cc390098bfd8dc..e0a10b2ddbf99d7c208e9d2f75155c1bb6b87f2f 100644
 | 
| --- a/mojo/public/cpp/bindings/tests/associated_interface_unittest.cc
 | 
| +++ b/mojo/public/cpp/bindings/tests/associated_interface_unittest.cc
 | 
| @@ -14,6 +14,7 @@
 | 
|  #include "base/message_loop/message_loop.h"
 | 
|  #include "base/run_loop.h"
 | 
|  #include "base/single_thread_task_runner.h"
 | 
| +#include "base/synchronization/waitable_event.h"
 | 
|  #include "base/threading/sequenced_task_runner_handle.h"
 | 
|  #include "base/threading/thread.h"
 | 
|  #include "base/threading/thread_task_runner_handle.h"
 | 
| @@ -1057,41 +1058,44 @@ struct ForwarderTestContext {
 | 
|  };
 | 
|  
 | 
|  TEST_F(AssociatedInterfaceTest, BindLaterThreadSafeAssociatedInterfacePtr) {
 | 
| -  // Create a ThreadSafeAssociatedPtr that we'll bind from a different thread.
 | 
| -  scoped_refptr<ThreadSafeIntegerSenderAssociatedPtr> thread_safe_ptr =
 | 
| -      ThreadSafeIntegerSenderAssociatedPtr::CreateUnbound();
 | 
| -
 | 
|    // Start the thread from where we'll bind the interface pointer.
 | 
|    base::Thread other_thread("service test thread");
 | 
|    other_thread.Start();
 | 
|    const scoped_refptr<base::SingleThreadTaskRunner>& other_thread_task_runner =
 | 
|        other_thread.message_loop()->task_runner();
 | 
|    ForwarderTestContext* context = new ForwarderTestContext();
 | 
| -  {
 | 
| -    base::RunLoop run_loop;
 | 
| -    auto run_method = base::Bind(
 | 
| -        [](const scoped_refptr<base::TaskRunner>& main_task_runner,
 | 
| -           const base::Closure& quit_closure,
 | 
| -           const scoped_refptr<ThreadSafeIntegerSenderAssociatedPtr>&
 | 
| -               thread_safe_ptr,
 | 
| -           ForwarderTestContext* context) {
 | 
| -          // We are on the background thread, create the interface ptr.
 | 
| -          context->interface_impl =
 | 
| -              base::MakeUnique<IntegerSenderConnectionImpl>(
 | 
| -                  MakeRequest(&(context->connection_ptr)));
 | 
| -          IntegerSenderAssociatedPtr sender;
 | 
| -          context->connection_ptr->GetSender(
 | 
| -              MakeRequest(&sender, context->connection_ptr.associated_group()));
 | 
| -          thread_safe_ptr->Bind(std::move(sender));
 | 
| -          main_task_runner->PostTask(FROM_HERE, quit_closure);
 | 
| -        },
 | 
| -        base::SequencedTaskRunnerHandle::Get(), run_loop.QuitClosure(),
 | 
| -        thread_safe_ptr, context);
 | 
| -
 | 
| -    other_thread_task_runner->PostTask(FROM_HERE, run_method);
 | 
| -    // Block until the associated pointer is bound.
 | 
| -    run_loop.Run();
 | 
| -  }
 | 
| +
 | 
| +  base::WaitableEvent echo_called_event(
 | 
| +      base::WaitableEvent::ResetPolicy::MANUAL,
 | 
| +      base::WaitableEvent::InitialState::NOT_SIGNALED);
 | 
| +
 | 
| +  // Create a ThreadSafeAssociatedPtr that we'll bind from a different thread.
 | 
| +  scoped_refptr<ThreadSafeIntegerSenderAssociatedPtr> thread_safe_ptr =
 | 
| +      ThreadSafeIntegerSenderAssociatedPtr::CreateUnbound(
 | 
| +          other_thread_task_runner);
 | 
| +
 | 
| +  base::RunLoop bind_run_loop;
 | 
| +  auto run_method = base::Bind(
 | 
| +      [](base::WaitableEvent* echo_called_event,
 | 
| +         const scoped_refptr<ThreadSafeIntegerSenderAssociatedPtr>&
 | 
| +             thread_safe_ptr,
 | 
| +          ForwarderTestContext* context) {
 | 
| +        // Wait for echo to be called on the main thread so the interface method
 | 
| +        // call happens before the bind.
 | 
| +        echo_called_event->Wait();
 | 
| +
 | 
| +        // We are on the background thread, create the interface ptr.
 | 
| +        context->interface_impl =
 | 
| +            base::MakeUnique<IntegerSenderConnectionImpl>(
 | 
| +                MakeRequest(&(context->connection_ptr)));
 | 
| +        IntegerSenderAssociatedPtr sender;
 | 
| +        context->connection_ptr->GetSender(
 | 
| +            MakeRequest(&sender, context->connection_ptr.associated_group()));
 | 
| +        thread_safe_ptr->Bind(std::move(sender));
 | 
| +      },
 | 
| +      &echo_called_event, thread_safe_ptr, context);
 | 
| +
 | 
| +  other_thread_task_runner->PostTask(FROM_HERE, run_method);
 | 
|  
 | 
|    {
 | 
|      // Now we can call methods on the interface from the main thread.
 | 
| @@ -1103,6 +1107,10 @@ TEST_F(AssociatedInterfaceTest, BindLaterThreadSafeAssociatedInterfacePtr) {
 | 
|      base::RunLoop run_loop;
 | 
|      (*thread_safe_ptr)
 | 
|          ->Echo(123, base::Bind(echo_callback, run_loop.QuitClosure()));
 | 
| +
 | 
| +    // Let the bind happen on the background thread.
 | 
| +    echo_called_event.Signal();
 | 
| +
 | 
|      // Block until the method callback is called.
 | 
|      run_loop.Run();
 | 
|    }
 | 
| 
 |