summaryrefslogtreecommitdiff
path: root/satp/sequence-window.go
diff options
context:
space:
mode:
Diffstat (limited to 'satp/sequence-window.go')
-rw-r--r--satp/sequence-window.go39
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
}