1e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)// found in the LICENSE file. 4e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) 5e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)#ifndef DoubleBufferedDeque_h 6e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)#define DoubleBufferedDeque_h 7e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) 8e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)#include "wtf/Deque.h" 9e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)#include "wtf/Noncopyable.h" 10e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) 11e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)namespace WTF { 12e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) 13e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)// A helper class for managing double buffered deques, typically where the client locks when appending or swapping. 14e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)template <typename T> class DoubleBufferedDeque { 15e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) WTF_MAKE_NONCOPYABLE(DoubleBufferedDeque); 16e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)public: 17e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) DoubleBufferedDeque() 18e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) : m_activeIndex(0) { } 19e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) 20e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) void append(const T& value) 21e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) { 22e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) m_queue[m_activeIndex].append(value); 23e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) } 24e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) 25e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) bool isEmpty() const 26e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) { 27e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) return m_queue[m_activeIndex].isEmpty(); 28e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) } 29e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) 30e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) Deque<T>& swapBuffers() 31e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) { 32e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) int oldIndex = m_activeIndex; 33e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) m_activeIndex ^= 1; 34e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) ASSERT(m_queue[m_activeIndex].isEmpty()); 35e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) return m_queue[oldIndex]; 36e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) } 37e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) 38e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)private: 39e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) Deque<T> m_queue[2]; 40e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) int m_activeIndex; 41e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}; 42e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) 43e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)} // namespace WTF 44e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) 45e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)using WTF::DoubleBufferedDeque; 46e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) 47e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)#endif // DoubleBufferedDeque_h 48