github.com/vmware/transport-go@v1.3.4/plank/utils/runtime.go (about)

     1  // Copyright 2019-2021 VMware, Inc.
     2  // SPDX-License-Identifier: BSD-2-Clause
     3  
     4  package utils
     5  
     6  import (
     7  	"runtime"
     8  	"strings"
     9  )
    10  
    11  func GetGoRoutineID() string {
    12  	var buf [64]byte
    13  	n := runtime.Stack(buf[:], false)
    14  	idStr := strings.Fields(strings.TrimPrefix(string(buf[:n]), "goroutine "))[0]
    15  	return idStr
    16  }
    17  
    18  func GetCurrentStackFrame() runtime.Frame {
    19  	return getFrame(1)
    20  }
    21  
    22  func GetCallerStackFrame() runtime.Frame {
    23  	return getFrame(2)
    24  }
    25  
    26  func getFrame(skipFrames int) runtime.Frame {
    27  	targetFrameIdx := skipFrames + 2
    28  	programCounters := make([]uintptr, targetFrameIdx+2)
    29  	n := runtime.Callers(0, programCounters)
    30  	frame := runtime.Frame{Function: "unknown"}
    31  
    32  	if n > 0 {
    33  		frames := runtime.CallersFrames(programCounters[:n])
    34  		for more, frameIdx := true, 0; more && frameIdx <= targetFrameIdx; frameIdx++ {
    35  			var frameIdxCandidate runtime.Frame
    36  			frameIdxCandidate, more = frames.Next()
    37  			if frameIdx == targetFrameIdx {
    38  				frame = frameIdxCandidate
    39  				break
    40  			}
    41  		}
    42  	}
    43  	return frame
    44  }