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