// 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 }() } }