| // Copyright 2013 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "mojo/edk/system/test/test_io_thread.h" | 
 |  | 
 | #include <utility> | 
 |  | 
 | #include "base/logging.h" | 
 | #include "mojo/edk/platform/io_thread.h" | 
 | #include "mojo/edk/platform/thread.h" | 
 | #include "mojo/edk/util/waitable_event.h" | 
 |  | 
 | using mojo::platform::CreateAndStartIOThread; | 
 | using mojo::util::AutoResetWaitableEvent; | 
 | using mojo::util::MakeRefCounted; | 
 |  | 
 | namespace mojo { | 
 | namespace system { | 
 | namespace test { | 
 |  | 
 | TestIOThread::TestIOThread(StartMode start_mode) | 
 |     : io_platform_handle_watcher_(nullptr) { | 
 |   switch (start_mode) { | 
 |     case StartMode::AUTO: | 
 |       Start(); | 
 |       return; | 
 |     case StartMode::MANUAL: | 
 |       return; | 
 |   } | 
 |   CHECK(false) << "Invalid mode"; | 
 | } | 
 |  | 
 | TestIOThread::~TestIOThread() { | 
 |   Stop(); | 
 | } | 
 |  | 
 | void TestIOThread::Start() { | 
 |   CHECK(!io_thread_); | 
 |   io_thread_ = | 
 |       CreateAndStartIOThread(&io_task_runner_, &io_platform_handle_watcher_); | 
 | } | 
 |  | 
 | void TestIOThread::Stop() { | 
 |   if (!io_thread_) | 
 |     return;  // Nothing to do. | 
 |  | 
 |   io_thread_->Stop(); | 
 |   io_thread_.reset(); | 
 |   io_task_runner_ = nullptr; | 
 |   io_platform_handle_watcher_ = nullptr; | 
 | } | 
 |  | 
 | bool TestIOThread::IsCurrentAndRunning() const { | 
 |   return io_task_runner_->RunsTasksOnCurrentThread(); | 
 | } | 
 |  | 
 | void TestIOThread::PostTask(std::function<void()>&& task) { | 
 |   io_task_runner_->PostTask(std::move(task)); | 
 | } | 
 |  | 
 | void TestIOThread::PostTaskAndWait(std::function<void()>&& task) { | 
 |   AutoResetWaitableEvent event; | 
 |   io_task_runner_->PostTask([&task, &event]() { | 
 |     task(); | 
 |     event.Signal(); | 
 |   }); | 
 |   event.Wait(); | 
 | } | 
 |  | 
 | }  // namespace test | 
 | }  // namespace system | 
 | }  // namespace mojo |