text: // 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/waiter_test_utils.h"
  
  #include <utility>
  
  using mojo::util::RefPtr;
  
  namespace mojo {
  namespace system {
  namespace test {
  
  SimpleWaiterThread::SimpleWaiterThread(MojoResult* result, uint32_t* context)
      : result_(result), context_(context) {
    waiter_.Init();
    *result_ = 5420734;    // Totally invalid result.
    *context_ = 23489023;  // "Random".
  }
  
  SimpleWaiterThread::~SimpleWaiterThread() {
    Join();
  }
  
  void SimpleWaiterThread::Run() {
    *result_ = waiter_.Wait(MOJO_DEADLINE_INDEFINITE, context_);
  }
  
  WaiterThread::WaiterThread(RefPtr<Dispatcher>&& dispatcher,
                             MojoHandleSignals handle_signals,
                             MojoDeadline deadline,
                             uint32_t context,
                             bool* did_wait_out,
                             MojoResult* result_out,
                             uint32_t* context_out,
                             HandleSignalsState* signals_state_out)
      : dispatcher_(std::move(dispatcher)),
        handle_signals_(handle_signals),
        deadline_(deadline),
        context_(context),
        did_wait_out_(did_wait_out),
        result_out_(result_out),
        context_out_(context_out),
        signals_state_out_(signals_state_out) {
    *did_wait_out_ = false;
    // Initialize these with invalid results (so that we'll be sure to catch any
    // case where they're not set).
    *result_out_ = 8542346;
    *context_out_ = 89023444;
    *signals_state_out_ = HandleSignalsState(~0u, ~0u);
  }
  
  WaiterThread::~WaiterThread() {
    Join();
  }
  
  void WaiterThread::Run() {
    waiter_.Init();
  
    *result_out_ = dispatcher_->AddAwakable(&waiter_, handle_signals_, context_,
                                            signals_state_out_);
    if (*result_out_ != MOJO_RESULT_OK)
      return;
  
    *did_wait_out_ = true;
    *result_out_ = waiter_.Wait(deadline_, context_out_);
    dispatcher_->RemoveAwakable(&waiter_, signals_state_out_);
  }
  
  }  // namespace test
  }  // namespace system
  }  // namespace mojo
  