blob: 5f6201ec8062d971aafe29029028c045f5266ab6 [file] [log] [blame] [edit]
// Copyright 2025 The Go Authors. All rights reserved.
// Use of this source code is governed by a MIT
// license that can be found in the LICENSE file.
/*
* Project: grpc-go
* Issue or PR : https://github.com/grpc/grpc-go/pull/660
* Buggy version: db85417dd0de6cc6f583672c6175a7237e5b5dd2
* fix commit-id: ceacfbcbc1514e4e677932fd55938ac455d182fb
* Flaky: 100/100
*/
package main
import (
"math/rand"
"os"
"runtime"
"runtime/pprof"
)
func init() {
register("Grpc660", Grpc660)
}
type benchmarkClient_grpc660 struct {
stop chan bool
}
func (bc *benchmarkClient_grpc660) doCloseLoopUnary() {
for {
done := make(chan bool)
go func() { // G2
if rand.Intn(10) > 7 {
done <- false
return
}
done <- true
}()
select {
case <-bc.stop:
return
case <-done:
}
}
}
func Grpc660() {
prof := pprof.Lookup("goroutineleak")
defer func() {
// Yield several times to allow the child goroutine to run.
for i := 0; i < yieldCount; i++ {
runtime.Gosched()
}
prof.WriteTo(os.Stdout, 2)
}()
go func() {
bc := &benchmarkClient_grpc660{
stop: make(chan bool),
}
go bc.doCloseLoopUnary() // G1
go func() { // helper goroutine
bc.stop <- true
}()
}()
}