blob: 0798ab23d3b5886dd07a95da7589a2fb9999ad01 [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: etcd
* Issue or PR : https://github.com/etcd-io/etcd/pull/6857
* Buggy version: 7c8f13aed7fe251e7066ed6fc1a090699c2cae0e
* fix commit-id: 7afc490c95789c408fbc256d8e790273d331c984
* Flaky: 19/100
*/
package main
import (
"os"
"runtime/pprof"
"time"
)
func init() {
register("Etcd6857", Etcd6857)
}
type Status_etcd6857 struct{}
type node_etcd6857 struct {
status chan chan Status_etcd6857
stop chan struct{}
done chan struct{}
}
func (n *node_etcd6857) Status() Status_etcd6857 {
c := make(chan Status_etcd6857)
n.status <- c
return <-c
}
func (n *node_etcd6857) run() {
for {
select {
case c := <-n.status:
c <- Status_etcd6857{}
case <-n.stop:
close(n.done)
return
}
}
}
func (n *node_etcd6857) Stop() {
select {
case n.stop <- struct{}{}:
case <-n.done:
return
}
<-n.done
}
func NewNode_etcd6857() *node_etcd6857 {
return &node_etcd6857{
status: make(chan chan Status_etcd6857),
stop: make(chan struct{}),
done: make(chan struct{}),
}
}
func Etcd6857() {
prof := pprof.Lookup("goroutineleak")
defer func() {
time.Sleep(100 * time.Millisecond)
prof.WriteTo(os.Stdout, 2)
}()
for i := 0; i <= 100; i++ {
go func() {
n := NewNode_etcd6857()
go n.run() // G1
go n.Status() // G2
go n.Stop() // G3
}()
}
}