blob: 541beb47d8fb03745ed65d8f4be5d5768eae735e [file] [log] [blame]
package main
func (this *SingleProducerSequencer) Next(slots int64) int64 {
current, cachedGate := this.current, this.cachedGate
next := current + slots
wrap := next - this.ringSize
if wrap > cachedGate /*|| cachedGate > current*/ {
min, last := int64(0), this.last
for wrap > min {
min = last.Load()
}
this.cachedGate = min
}
this.current = next
return next
}
func (this *SingleProducerSequencer) Publish(sequence int64) {
this.cursor[0] = sequence
}
func NewSingleProducerSequencer(cursor *Sequence, ringSize int32, last Barrier) *SingleProducerSequencer {
return &SingleProducerSequencer{
current: InitialSequenceValue,
cachedGate: InitialSequenceValue,
cursor: cursor,
ringSize: int64(ringSize),
last: last,
}
}
type SingleProducerSequencer struct {
current int64
cachedGate int64
cursor *Sequence
ringSize int64
last Barrier
}