// 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" "runtime/pprof" "sync" "time" ) func init() { register("Kubernetes26980", Kubernetes26980) } type processorListener_kubernetes26980 struct { lock sync.RWMutex cond sync.Cond pendingNotifications []interface{} } func (p *processorListener_kubernetes26980) add(notification interface{}) { p.lock.Lock() defer p.lock.Unlock() p.pendingNotifications = append(p.pendingNotifications, notification) p.cond.Broadcast() } func (p *processorListener_kubernetes26980) pop(stopCh <-chan struct{}) { p.lock.Lock() runtime.Gosched() defer p.lock.Unlock() for { for len(p.pendingNotifications) == 0 { select { case <-stopCh: return default: } p.cond.Wait() } select { case <-stopCh: return } } } func newProcessListener_kubernetes26980() *processorListener_kubernetes26980 { ret := &processorListener_kubernetes26980{ pendingNotifications: []interface{}{}, } ret.cond.L = &ret.lock return ret } func Kubernetes26980() { prof := pprof.Lookup("goroutineleak") defer func() { time.Sleep(100 * time.Millisecond) prof.WriteTo(os.Stdout, 2) }() for i := 0; i < 3000; i++ { go func() { pl := newProcessListener_kubernetes26980() stopCh := make(chan struct{}) defer close(stopCh) pl.add(1) runtime.Gosched() go pl.pop(stopCh) resultCh := make(chan struct{}) go func() { pl.lock.Lock() close(resultCh) }() runtime.Gosched() <-resultCh pl.lock.Unlock() }() } }