in pkg/tools/buffer/buffer.go [659:716]
func (r *Buffer) RemoveReadElements(includeDetails bool) bool {
r.eventLocker.Lock()
defer r.eventLocker.Unlock()
// delete until the last data id
if includeDetails && r.head.element != nil && r.current.element != nil {
firstDataID := r.head.element.Value.(SocketDataBuffer).DataID()
currentBuffer := r.current.element.Value.(SocketDataBuffer)
lastDataID := currentBuffer.DataID()
startDelete := false
for e := r.detailEvents.Front(); e != nil; {
event := e.Value.(SocketDataDetail)
if firstDataID == lastDataID && currentBuffer.BufferLen() != r.current.bufIndex {
// current buffer is not finished, so the detail cannot be deleted
break
}
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)
log.Debugf("delete detail event from readed buffer, data id: %d, ref: %p", event.DataID(), r)
e = tmp
} else {
e = e.Next()
}
}
}
// delete until to current position
next := r.head.element
stillCurrent := true
for ; next != nil && next != r.current.element; next = r.removeElement0(next) {
stillCurrent = false
}
// not enough data, then return
if !stillCurrent && next == nil {
return true
}
if next != nil && next.Value.(SocketDataBuffer).BufferLen() == r.current.bufIndex { // all buffer finished, then delete it
// the last event already read finished, then delete it
r.head.element = r.removeElement0(next)
r.head.bufIndex = 0
} else {
if !stillCurrent {
r.head.element = next
}
// still have reduced buffer, then keep reading from current index in next loop
r.head.bufIndex = r.current.bufIndex
}
return false
}