in pkg/profiling/task/network/analyze/buffer/buffer.go [369:412]
func (r *Buffer) RemoveReadElements() bool {
r.eventLocker.Lock()
defer r.eventLocker.Unlock()
// delete until the last data id
if r.head.element != nil && r.current.element != nil {
firstDataID := r.head.element.Value.(events.SocketDataBuffer).DataID()
lastDataID := r.current.element.Value.(events.SocketDataBuffer).DataID()
startDelete := false
for e := r.detailEvents.Front(); e != nil; {
event := e.Value.(*events.SocketDetailEvent)
if !startDelete && event.DataID >= firstDataID && event.DataID <= lastDataID {
startDelete = true
} else if startDelete && event.DataID > lastDataID {
// out of the data id, just break
break
}
if startDelete {
tmp := e.Next()
r.detailEvents.Remove(e)
e = tmp
} else {
e = e.Next()
}
}
}
// delete until to current position
next := r.head.element
for ; next != nil && next != r.current.element; next = r.removeElement0(next) {
}
if next != nil && next.Value.(events.SocketDataBuffer).BufferLen() == r.current.bufIndex {
// the last event already read finished, then delete it
r.head.element = r.removeElement0(next)
r.head.bufIndex = 0
} else if next != nil {
// keep using the latest element
r.head.element = next
} else {
return true
}
return false
}