in pkg/profiling/task/network/analyze/buffer/buffer.go [86:130]
func (r *Buffer) Slice(validated bool, start, end *Position) *Buffer {
dataEvents := list.New()
detailEvents := list.New()
var firstDetailElement *list.Element
for nextElement := start.element; nextElement != end.element; nextElement = nextElement.Next() {
// found first matches detail event
if detailEvents.Len() == 0 || firstDetailElement == nil {
for e := r.detailEvents.Front(); e != nil; e = e.Next() {
if e.Value.(*events.SocketDetailEvent).DataID >= nextElement.Value.(events.SocketDataBuffer).DataID() {
detailEvents.PushBack(e.Value)
firstDetailElement = e
break
}
}
}
dataEvents.PushBack(nextElement.Value)
}
lastBuffer := end.element.Value.(events.SocketDataBuffer)
dataEvents.PushBack(&events.SocketDataEventLimited{SocketDataBuffer: lastBuffer, Size: end.bufIndex})
// if the first detail element been found, append the details until the last buffer data id
if firstDetailElement == nil {
for e := r.detailEvents.Front(); e != nil; e = e.Next() {
if e.Value.(*events.SocketDetailEvent).DataID == lastBuffer.DataID() {
detailEvents.PushBack(e.Value)
break
}
}
} else if firstDetailElement != nil && firstDetailElement.Value.(*events.SocketDetailEvent).DataID != lastBuffer.DataID() {
for tmp := firstDetailElement.Next(); tmp != nil; tmp = tmp.Next() {
if tmp.Value.(*events.SocketDetailEvent).DataID > lastBuffer.DataID() {
break
}
detailEvents.PushBack(tmp.Value)
}
}
return &Buffer{
dataEvents: dataEvents,
detailEvents: detailEvents,
validated: validated,
head: &Position{element: dataEvents.Front(), bufIndex: start.bufIndex},
current: &Position{element: dataEvents.Front(), bufIndex: start.bufIndex},
}
}