blob: 6c0139a9d24fcbbe114c24cbc49c738ce8b7b0e8 [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: kubernetes
* Issue or PR : https://github.com/kubernetes/kubernetes/pull/1321
* Buggy version: 9cd0fc70f1ca852c903b18b0933991036b3b2fa1
* fix commit-id: 435e0b73bb99862f9dedf56a50260ff3dfef14ff
* Flaky: 1/100
*/
package main
import (
"os"
"runtime"
"runtime/pprof"
"sync"
"time"
)
func init() {
register("Kubernetes1321", Kubernetes1321)
}
type muxWatcher_kubernetes1321 struct {
result chan struct{}
m *Mux_kubernetes1321
id int64
}
func (mw *muxWatcher_kubernetes1321) Stop() {
mw.m.stopWatching(mw.id)
}
type Mux_kubernetes1321 struct {
lock sync.Mutex
watchers map[int64]*muxWatcher_kubernetes1321
}
func NewMux_kubernetes1321() *Mux_kubernetes1321 {
m := &Mux_kubernetes1321{
watchers: map[int64]*muxWatcher_kubernetes1321{},
}
go m.loop() // G2
return m
}
func (m *Mux_kubernetes1321) Watch() *muxWatcher_kubernetes1321 {
mw := &muxWatcher_kubernetes1321{
result: make(chan struct{}),
m: m,
id: int64(len(m.watchers)),
}
m.watchers[mw.id] = mw
runtime.Gosched()
return mw
}
func (m *Mux_kubernetes1321) loop() {
for i := 0; i < 100; i++ {
m.distribute()
}
}
func (m *Mux_kubernetes1321) distribute() {
m.lock.Lock()
defer m.lock.Unlock()
for _, w := range m.watchers {
w.result <- struct{}{}
runtime.Gosched()
}
}
func (m *Mux_kubernetes1321) stopWatching(id int64) {
m.lock.Lock()
defer m.lock.Unlock()
w, ok := m.watchers[id]
if !ok {
return
}
delete(m.watchers, id)
close(w.result)
}
func testMuxWatcherClose_kubernetes1321() {
m := NewMux_kubernetes1321()
m.watchers[m.Watch().id].Stop()
}
func Kubernetes1321() {
prof := pprof.Lookup("goroutineleak")
defer func() {
time.Sleep(100 * time.Millisecond)
prof.WriteTo(os.Stdout, 2)
}()
for i := 0; i < 1000; i++ {
go testMuxWatcherClose_kubernetes1321() // G1
}
}