1d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// found in the LICENSE file.
4d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)//
5d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// This file contains helper classes for video accelerator unittests.
6d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
7d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#ifndef CONTENT_COMMON_GPU_MEDIA_VIDEO_ACCELERATOR_UNITTEST_HELPERS_H_
8d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#define CONTENT_COMMON_GPU_MEDIA_VIDEO_ACCELERATOR_UNITTEST_HELPERS_H_
9d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
10d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include <queue>
11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
12d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/synchronization/condition_variable.h"
13d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/synchronization/lock.h"
14d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
15d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)namespace content {
16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
17d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Helper class allowing one thread to wait on a notification from another.
18d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// If notifications come in faster than they are Wait()'d for, they are
19d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// accumulated (so exactly as many Wait() calls will unblock as Notify() calls
20d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// were made, regardless of order).
21d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)template <typename StateEnum>
22d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class ClientStateNotification {
23d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) public:
24d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ClientStateNotification();
25d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ~ClientStateNotification();
26d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
27d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Used to notify a single waiter of a ClientState.
28d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  void Notify(StateEnum state);
29d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Used by waiters to wait for the next ClientState Notification.
30d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  StateEnum Wait();
31d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
32d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) private:
33d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::Lock lock_;
34d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::ConditionVariable cv_;
35d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  std::queue<StateEnum> pending_states_for_notification_;
36d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)};
37d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
38d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)template <typename StateEnum>
39d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)ClientStateNotification<StateEnum>::ClientStateNotification() : cv_(&lock_) {}
40d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
41d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)template <typename StateEnum>
42d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)ClientStateNotification<StateEnum>::~ClientStateNotification() {}
43d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
44d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)template <typename StateEnum>
45d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void ClientStateNotification<StateEnum>::Notify(StateEnum state) {
46d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::AutoLock auto_lock(lock_);
47d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  pending_states_for_notification_.push(state);
48d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  cv_.Signal();
49d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
50d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
51d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)template <typename StateEnum>
52d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)StateEnum ClientStateNotification<StateEnum>::Wait() {
53d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::AutoLock auto_lock(lock_);
54d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  while (pending_states_for_notification_.empty())
55d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    cv_.Wait();
56d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  StateEnum ret = pending_states_for_notification_.front();
57d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  pending_states_for_notification_.pop();
58d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return ret;
59d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
60d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
61d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}  // namespace content
62d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
63d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif  // CONTENT_COMMON_GPU_MEDIA_VIDEO_ACCELERATOR_UNITTEST_HELPERS_H_
64