blob: 41eb3852e0ff2a08a66a3e177e21eacfc4d19a91 [file] [log] [blame]
package disruptor
const (
Gating = -2
Idling = -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,
}
}
// TODO: look at returning a "Ticket/Claim/Receipt" upon which "Commit" can be called
func (this *Reader) Receive() (int64, int64) {
lower := this.readerCursor.Load() + 1
upper := this.upstreamBarrier.LoadBarrier(lower)
if lower <= upper {
return lower, upper
} else if gate := this.writerCursor.Load(); lower <= gate {
return InitialSequenceValue, Gating
} else {
return InitialSequenceValue, Idling
}
}