github.com/go-asm/go@v1.21.1-0.20240213172139-40c5ead50c48/trace/v2/testdata/generators/go122-create-syscall-with-p.go (about)

     1  // Copyright 2023 The Go Authors. 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  // Tests a G being created from within a syscall.
     6  //
     7  // Specifically, it tests a scenerio wherein a C
     8  // thread is calling into Go, creating a goroutine in
     9  // a syscall (in the tracer's model). Because the actual
    10  // m can be reused, it's possible for that m to have never
    11  // had its P (in _Psyscall) stolen if the runtime doesn't
    12  // model the scenario correctly. Make sure we reject such
    13  // traces.
    14  
    15  package main
    16  
    17  import (
    18  	"github.com/go-asm/go/trace/v2"
    19  	"github.com/go-asm/go/trace/v2/event/go122"
    20  	testgen "github.com/go-asm/go/trace/v2/github.com/go-asm/go/testgen/go122"
    21  )
    22  
    23  func main() {
    24  	testgen.Main(gen)
    25  }
    26  
    27  func gen(t *testgen.Trace) {
    28  	t.ExpectFailure(".*expected a proc but didn't have one.*")
    29  
    30  	g := t.Generation(1)
    31  
    32  	// A C thread calls into Go and acquires a P. It returns
    33  	// back to C, destroying the G. It then comes back to Go
    34  	// on the same thread and again returns to C.
    35  	//
    36  	// Note: on pthread platforms this can't happen on the
    37  	// same thread because the m is stashed in TLS between
    38  	// calls into Go, until the thread dies. This is still
    39  	// possible on other platforms, however.
    40  	b0 := g.Batch(trace.ThreadID(0), 0)
    41  	b0.Event("GoCreateSyscall", trace.GoID(4))
    42  	b0.Event("ProcStatus", trace.ProcID(0), go122.ProcIdle)
    43  	b0.Event("ProcStart", trace.ProcID(0), testgen.Seq(1))
    44  	b0.Event("GoSyscallEndBlocked")
    45  	b0.Event("GoStart", trace.GoID(4), testgen.Seq(1))
    46  	b0.Event("GoSyscallBegin", testgen.Seq(2), testgen.NoStack)
    47  	b0.Event("GoDestroySyscall")
    48  	b0.Event("GoCreateSyscall", trace.GoID(4))
    49  	b0.Event("GoSyscallEnd")
    50  	b0.Event("GoSyscallBegin", testgen.Seq(3), testgen.NoStack)
    51  	b0.Event("GoDestroySyscall")
    52  }