github.com/smallnest/goroutine@v1.1.1/gid_g121.go (about)

     1  // Copyright ©2023 Dan Kortschak. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  //go:build go1.21
     6  // +build go1.21
     7  
     8  package goroutine
     9  
    10  import "unsafe"
    11  
    12  // ParentID returns the runtime ID of goroutine that created the calling
    13  // goroutine.
    14  func ParentID() int64 {
    15  	return idOf(getg(), parentGoidoff)
    16  }
    17  
    18  var parentGoidoff = offset("*runtime.g", "parentGoid")
    19  
    20  // Link is a goroutine parent-child relationship.
    21  type Link struct {
    22  	Parent, Child int64
    23  }
    24  
    25  // All returns all the known goroutine parent-child relationships.
    26  func All() []Link {
    27  	var s []Link
    28  	forEachG(func(g unsafe.Pointer) {
    29  		s = append(s, Link{Parent: idOf(g, parentGoidoff), Child: idOf(g, goidoff)})
    30  	})
    31  	return s
    32  }
    33  
    34  //go:linkname forEachG runtime.forEachG
    35  //go:nosplit
    36  func forEachG(fn func(gp unsafe.Pointer))