blob: 1ea5ec6883f6e11cdcadfc184eee48c64c552d86 [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: performance when current (or next?) sequence is received as a parameter to Receive
// instead of reading the cursor...
func (this *Reader) Receive() (int64, int64) {
next := this.readerCursor.Load() + 1
ready := this.upstreamBarrier.LoadBarrier(next)
// fmt.Printf("\t\t\t\t\t[READER] Next: %d, Ready: %d\n", next, ready)
if next <= ready {
// fmt.Printf("\t\t\t\t\t[READER] Next Sequence: %d, Remaining: %d\n", next, ready-next)
return next, ready - next
} else if gate := this.writerCursor.Load(); next <= gate {
// fmt.Println("\t\t\t\t\t[READER] Gating at sequence:", gate)
return next, Gating
} else {
// fmt.Println("\t\t\t\t\t[READER] Gating")
return next, Idling
}
}