| package disruptor |
| |
| 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) { |
| 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 |
| } |
| } |