blob: 38e53cf4ad72186cd048bef44039067b7e1d1cf2 [file] [log] [blame]
// 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()
}()
}
}