| 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();
|
| }
|
|
|