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 |