RingBuffer must always be a power of two.
diff --git a/single_sequencer.go b/single_sequencer.go
index 795f9d2..4170fa1 100644
--- a/single_sequencer.go
+++ b/single_sequencer.go
@@ -20,6 +20,10 @@
}
func NewSingleProducerSequencer(cursor *Sequence, ringSize int32, barrier Barrier) *SingleProducerSequencer {
+ if !isPowerOfTwo(ringSize) {
+ panic("The ring size must be a power of two, e.g. 2, 4, 8, 16, 32, 64, etc.")
+ }
+
return &SingleProducerSequencer{
previous: InitialSequenceValue,
gate: InitialSequenceValue,
@@ -28,6 +32,9 @@
barrier: barrier,
}
}
+func isPowerOfTwo(value int32) bool {
+ return value > 0 && (value&(value-1)) == 0
+}
type SingleProducerSequencer struct {
previous int64