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