diff options
Diffstat (limited to 'satp/sequence-window.go')
-rw-r--r-- | satp/sequence-window.go | 39 |
1 files changed, 35 insertions, 4 deletions
diff --git a/satp/sequence-window.go b/satp/sequence-window.go index c74ca62..94a7b0b 100644 --- a/satp/sequence-window.go +++ b/satp/sequence-window.go @@ -32,23 +32,43 @@ package satp import ( "errors" + "sync" + "sync/atomic" ) type SequenceWindow struct { - size int + size int + head uint64 + body []uint32 + mutex *sync.RWMutex +} + +func (w *SequenceWindow) Size() int { + return w.size +} + +func (w *SequenceWindow) Top() uint32 { + if w.size > 0 { + w.mutex.RLock() + defer w.mutex.RUnlock() + } + v := atomic.LoadUint64(&w.head) + return uint32(v >> 32) } func (w *SequenceWindow) Check(sequenceNumber uint32) (bool, error) { - if w.size == 0 { + if w.size <= 0 { return false, nil } + // TODO: implement this return false, nil } func (w *SequenceWindow) CheckAndSet(sequenceNumber uint32) (bool, error) { - if w.size == 0 { + if w.size <= 0 { return false, nil } + // TODO: implement this return false, nil } @@ -56,6 +76,17 @@ func NewSequenceWindow(size int) (w *SequenceWindow, err error) { if size < 0 { return nil, errors.New("invalid sequence window size") } - w = &SequenceWindow{size: size} + w = &SequenceWindow{size: size, head: 0} + if w.size > 0 { + bodyLen := (w.size / 32) + if (w.size % 32) != 0 { + bodyLen++ + } + w.body = make([]uint32, bodyLen, bodyLen) + for i := range w.body { + w.body[i] = 0 + } + w.mutex = &sync.RWMutex{} + } return } |