blob: ae02ec83040b99af845b07e7d0a0f6f4e92c531c [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.
package main
import (
"os"
"runtime/pprof"
"time"
)
func init() {
register("Kubernetes70277", Kubernetes70277)
}
type WaitFunc_kubernetes70277 func(done <-chan struct{}) <-chan struct{}
type ConditionFunc_kubernetes70277 func() (done bool, err error)
func WaitFor_kubernetes70277(wait WaitFunc_kubernetes70277, fn ConditionFunc_kubernetes70277, done <-chan struct{}) error {
c := wait(done)
for {
_, open := <-c
ok, err := fn()
if err != nil {
return err
}
if ok {
return nil
}
if !open {
break
}
}
return nil
}
func poller_kubernetes70277(interval, timeout time.Duration) WaitFunc_kubernetes70277 {
return WaitFunc_kubernetes70277(func(done <-chan struct{}) <-chan struct{} {
ch := make(chan struct{})
go func() {
defer close(ch)
tick := time.NewTicker(interval)
defer tick.Stop()
var after <-chan time.Time
if timeout != 0 {
timer := time.NewTimer(timeout)
after = timer.C
defer timer.Stop()
}
for {
select {
case <-tick.C:
select {
case ch <- struct{}{}:
default:
}
case <-after:
return
case <-done:
return
}
}
}()
return ch
})
}
func Kubernetes70277() {
prof := pprof.Lookup("goroutineleak")
defer func() {
time.Sleep(100 * time.Millisecond)
prof.WriteTo(os.Stdout, 2)
}()
for i := 0; i < 1000; i++ {
go func() {
stopCh := make(chan struct{})
defer close(stopCh)
waitFunc := poller_kubernetes70277(time.Millisecond, 80*time.Millisecond)
var doneCh <-chan struct{}
WaitFor_kubernetes70277(func(done <-chan struct{}) <-chan struct{} {
doneCh = done
return waitFunc(done)
}, func() (bool, error) {
time.Sleep(10 * time.Millisecond)
return true, nil
}, stopCh)
<-doneCh // block here
}()
}
}