blob: fefcfe93970c57ca555bb19cd2030eead9675d8f [file] [log] [blame]
package disruptor
const (
Gating = -2
Idle = -3
)
type Reader struct {
upstreamBarrier Barrier
writerCursor *Cursor
readerCursor *Cursor
}
func NewReader(upstreamBarrier Barrier, writerCursor, readerCursor *Cursor) *Reader {
return &Reader{
upstreamBarrier: upstreamBarrier,
writerCursor: writerCursor,
readerCursor: readerCursor,
}
}
func (this *Reader) Receive() (int64, int64) {
next := this.readerCursor.Load() + 1
ready := this.upstreamBarrier()
if next <= ready {
return next, ready - next
} else if next <= this.writerCursor.Load() {
return next, Gating
} else {
return next, Idle
}
}