in pkg/profiling/task/network/analyze/buffer/buffer.go [229:271]
func (r *Buffer) OffsetPosition(offset int) *Position {
var nextElement func(e *list.Element) *list.Element
if offset == 0 {
return r.current.Clone()
} else if offset > 0 {
nextElement = func(e *list.Element) *list.Element {
return e.Next()
}
} else {
nextElement = func(e *list.Element) *list.Element {
return e.Prev()
}
}
var curEle = r.current.element
var curIndex = r.current.bufIndex
for ; curEle != nil; curEle = nextElement(curEle) {
nextOffset := curIndex + offset
bufferLen := curEle.Value.(events.SocketDataBuffer).BufferLen()
if nextOffset >= 0 && nextOffset < bufferLen {
curIndex += offset
break
}
if offset > 0 {
offset -= bufferLen - curIndex
curIndex = 0
} else {
offset += curIndex
next := nextElement(curEle)
if next == nil {
curEle = next
break
}
curIndex = curEle.Value.(events.SocketDataBuffer).BufferLen()
}
}
if curEle == nil {
return nil
}
return &Position{element: curEle, bufIndex: curIndex}
}