Chromium Code Reviews| Index: Source/platform/scheduler/AtomicRingbuffer.h |
| diff --git a/Source/platform/scheduler/AtomicRingbuffer.h b/Source/platform/scheduler/AtomicRingbuffer.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..e0c7e3d2d89677dd4e4613e09f48e531010cd73a |
| --- /dev/null |
| +++ b/Source/platform/scheduler/AtomicRingbuffer.h |
| @@ -0,0 +1,50 @@ |
| +// Copyright 2014 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. |
| + |
| +#ifndef AtomicRingbuffer_h |
| +#define AtomicRingbuffer_h |
| + |
| +#include "wtf/Atomics.h" |
| +#include "wtf/Noncopyable.h" |
| +#include "wtf/Vector.h" |
| + |
| +namespace blink { |
| + |
| +template <typename T, int size> class AtomicRingBuffer { |
| + WTF_MAKE_NONCOPYABLE(AtomicRingBuffer); |
| +public: |
| + AtomicRingBuffer() : m_writeCounter(0), m_readIndex(1) |
|
Sami
2014/08/06 10:19:52
nit: Blink has a different style for initializers,
alexclarke
2014/08/07 12:08:06
Acknowledged.
|
| + { |
| + m_values.resize(size); |
| + for (int i = 0; i < size; i++) |
| + m_values[i] = nullptr; |
| + } |
| + |
| + // May be called from any thread |
| + void pushMaySpinlock(T* value) |
| + { |
| + int pos = atomicAdd(&m_writeCounter, 1) % size; |
| + while (!atomicTestAndSwap((void* volatile*) &m_values[pos], 0, value)) { |
|
Sami
2014/08/06 10:19:52
nit: nullptr instead of 0?
alexclarke
2014/08/07 12:08:06
Acknowledged.
|
| + // spin |
| + } |
| + } |
| + |
| + // Returns null if there's nothing queued up. May only be called from the main thread. |
| + T* pop() |
| + { |
| + T* value = (T*) atomicExchange((void* volatile*) &m_values[m_readIndex], nullptr); |
|
Sami
2014/08/06 10:19:52
Please use C++-style casts instead of C ones. Is t
alexclarke
2014/08/07 12:08:06
Acknowledged.
|
| + if (value) |
| + m_readIndex = (m_readIndex + 1) % size; |
| + return value; |
| + } |
| + |
| +private: |
| + volatile int m_writeCounter; |
|
Sami
2014/08/06 10:19:52
nit: m_writeIndex to match the other var?
alexclarke
2014/08/07 12:08:06
Acknowledged.
|
| + int m_readIndex; |
| + Vector<T*> m_values; |
| +}; |
| + |
| +} // namespace blink |
| + |
| +#endif // AtomicRingbuffer_h |