
Go 1.20 switched to uint64 to represent goroutine IDs, we can't actually follow suit because we have allowed clients to use -1 to refer to the currently selected goroutine, however we should at least switch to int64 and also update the rtype check to accept the 1.20 type.
54 lines
1.4 KiB
Go
54 lines
1.4 KiB
Go
package proc
|
|
|
|
type goroutineCache struct {
|
|
partialGCache map[int64]*G
|
|
allGCache []*G
|
|
|
|
allgentryAddr, allglenAddr uint64
|
|
}
|
|
|
|
func (gcache *goroutineCache) init(bi *BinaryInfo) {
|
|
var err error
|
|
|
|
exeimage := bi.Images[0]
|
|
rdr := exeimage.DwarfReader()
|
|
|
|
gcache.allglenAddr, _ = rdr.AddrFor("runtime.allglen", exeimage.StaticBase, bi.Arch.PtrSize())
|
|
|
|
rdr.Seek(0)
|
|
gcache.allgentryAddr, err = rdr.AddrFor("runtime.allgs", exeimage.StaticBase, bi.Arch.PtrSize())
|
|
if err != nil {
|
|
// try old name (pre Go 1.6)
|
|
gcache.allgentryAddr, _ = rdr.AddrFor("runtime.allg", exeimage.StaticBase, bi.Arch.PtrSize())
|
|
}
|
|
}
|
|
|
|
func (gcache *goroutineCache) getRuntimeAllg(bi *BinaryInfo, mem MemoryReadWriter) (uint64, uint64, error) {
|
|
if gcache.allglenAddr == 0 || gcache.allgentryAddr == 0 {
|
|
return 0, 0, ErrNoRuntimeAllG
|
|
}
|
|
allglen, err := readUintRaw(mem, gcache.allglenAddr, int64(bi.Arch.PtrSize()))
|
|
if err != nil {
|
|
return 0, 0, err
|
|
}
|
|
|
|
allgptr, err := readUintRaw(mem, gcache.allgentryAddr, int64(bi.Arch.PtrSize()))
|
|
if err != nil {
|
|
return 0, 0, err
|
|
}
|
|
return allgptr, allglen, nil
|
|
}
|
|
|
|
func (gcache *goroutineCache) addGoroutine(g *G) {
|
|
if gcache.partialGCache == nil {
|
|
gcache.partialGCache = make(map[int64]*G)
|
|
}
|
|
gcache.partialGCache[g.ID] = g
|
|
}
|
|
|
|
// Clear clears the cached contents of the cache for runtime.allgs.
|
|
func (gcache *goroutineCache) Clear() {
|
|
gcache.partialGCache = nil
|
|
gcache.allGCache = nil
|
|
}
|