in pkg/profiling/task/network/analyze/buffer/buffer.go [273:310]
func (r *Buffer) Read(p []byte) (n int, err error) {
if len(p) == 0 {
return 0, nil
}
if r.current == nil || r.current.element == nil {
return 0, io.EOF
}
element, n := r.ReadFromCurrent(p)
if n > 0 {
return n, nil
}
curEvent := element.Value.(events.SocketDataBuffer)
next := r.nextElement(element)
if next == nil {
return 0, io.EOF
}
nextEvent := next.Value.(events.SocketDataBuffer)
var shouldRead = false
if r.validated {
shouldRead = true
// same data id and sequence orders
} else if (curEvent.DataID() == nextEvent.DataID() && curEvent.DataSequence()+1 == nextEvent.DataSequence()) ||
// cur event is finished and next event is start
(nextEvent.IsStart() && curEvent.IsFinished()) ||
// same data id and sequence but have difference buffer index
(curEvent.DataID() == nextEvent.DataID() && curEvent.DataSequence() == nextEvent.DataSequence() &&
r.current.bufIndex <= nextEvent.BufferStartPosition()) {
shouldRead = true
}
if !shouldRead {
return 0, ErrNotComplete
}
return r.read0(next, nextEvent, p)
}