57 lines
1.2 KiB
Go
57 lines
1.2 KiB
Go
|
package headbuffer
|
||
|
|
||
|
import (
|
||
|
"container/list"
|
||
|
|
||
|
"github.com/filecoin-project/lotus/api"
|
||
|
)
|
||
|
|
||
|
type HeadChangeStackBuffer struct {
|
||
|
buffer *list.List
|
||
|
size int
|
||
|
}
|
||
|
|
||
|
// NewHeadChangeStackBuffer buffer HeadChange events to avoid having to
|
||
|
// deal with revert changes. Initialized size should be the average reorg
|
||
|
// size + 1
|
||
|
func NewHeadChangeStackBuffer(size int) *HeadChangeStackBuffer {
|
||
|
buffer := list.New()
|
||
|
buffer.Init()
|
||
|
|
||
|
return &HeadChangeStackBuffer{
|
||
|
buffer: buffer,
|
||
|
size: size,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Push adds a HeadChange to stack buffer. If the length of
|
||
|
// the stack buffer grows larger than the initizlized size, the
|
||
|
// oldest HeadChange is returned.
|
||
|
func (h *HeadChangeStackBuffer) Push(hc *api.HeadChange) (rethc *api.HeadChange) {
|
||
|
if h.buffer.Len() >= h.size {
|
||
|
var ok bool
|
||
|
|
||
|
el := h.buffer.Front()
|
||
|
rethc, ok = el.Value.(*api.HeadChange)
|
||
|
if !ok {
|
||
|
// This shouldn't be possible, this method is typed and is the only place data
|
||
|
// pushed to the buffer.
|
||
|
panic("A cosmic ray made me do it")
|
||
|
}
|
||
|
|
||
|
h.buffer.Remove(el)
|
||
|
}
|
||
|
|
||
|
h.buffer.PushBack(hc)
|
||
|
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// Pop removes the last added HeadChange
|
||
|
func (h *HeadChangeStackBuffer) Pop() {
|
||
|
el := h.buffer.Back()
|
||
|
if el != nil {
|
||
|
h.buffer.Remove(el)
|
||
|
}
|
||
|
}
|