func getStacks()

in testutils/goroutines/stacks.go [62:101]


func getStacks(all bool) []Stack {
	var stacks []Stack

	var curStack *Stack
	stackReader := bufio.NewReader(bytes.NewReader(getStackBuffer(all)))
	for {
		line, err := stackReader.ReadString('\n')
		if err == io.EOF {
			break
		}
		if err != nil {
			panic("stack reader failed")
		}

		// If we see the goroutine header, start a new stack.
		isFirstLine := false
		if strings.HasPrefix(line, "goroutine ") {
			// flush any previous stack
			if curStack != nil {
				stacks = append(stacks, *curStack)
			}
			id, goState := parseGoStackHeader(line)
			curStack = &Stack{
				id:        id,
				state:     goState,
				fullStack: &bytes.Buffer{},
			}
			isFirstLine = true
		}
		curStack.fullStack.WriteString(line)
		if !isFirstLine && curStack.firstFunction == "" {
			curStack.firstFunction = parseFirstFunc(line)
		}
	}

	if curStack != nil {
		stacks = append(stacks, *curStack)
	}
	return stacks
}