blob: 839051cc64a18d7e04e59222aaca89229abb661d [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"
"sync"
"time"
)
func init() {
register("Istio16224", Istio16224)
}
type ConfigStoreCache_istio16224 interface {
RegisterEventHandler(handler func())
Run()
}
type Event_istio16224 int
type Handler_istio16224 func(Event_istio16224)
type configstoreMonitor_istio16224 struct {
handlers []Handler_istio16224
eventCh chan Event_istio16224
}
func (m *configstoreMonitor_istio16224) Run(stop <-chan struct{}) {
for {
select {
case <-stop:
// This bug is not descibed, but is a true positive (in our eyes)
// In a real run main exits when the goro is blocked here.
if _, ok := <-m.eventCh; ok {
close(m.eventCh)
}
return
case ce, ok := <-m.eventCh:
if ok {
m.processConfigEvent(ce)
}
}
}
}
func (m *configstoreMonitor_istio16224) processConfigEvent(ce Event_istio16224) {
m.applyHandlers(ce)
}
func (m *configstoreMonitor_istio16224) AppendEventHandler(h Handler_istio16224) {
m.handlers = append(m.handlers, h)
}
func (m *configstoreMonitor_istio16224) applyHandlers(e Event_istio16224) {
for _, f := range m.handlers {
f(e)
}
}
func (m *configstoreMonitor_istio16224) ScheduleProcessEvent(configEvent Event_istio16224) {
m.eventCh <- configEvent
}
type Monitor_istio16224 interface {
Run(<-chan struct{})
AppendEventHandler(Handler_istio16224)
ScheduleProcessEvent(Event_istio16224)
}
type controller_istio16224 struct {
monitor Monitor_istio16224
}
func (c *controller_istio16224) RegisterEventHandler(f func(Event_istio16224)) {
c.monitor.AppendEventHandler(f)
}
func (c *controller_istio16224) Run(stop <-chan struct{}) {
c.monitor.Run(stop)
}
func (c *controller_istio16224) Create() {
c.monitor.ScheduleProcessEvent(Event_istio16224(0))
}
func NewMonitor_istio16224() Monitor_istio16224 {
return NewBufferedMonitor_istio16224()
}
func NewBufferedMonitor_istio16224() Monitor_istio16224 {
return &configstoreMonitor_istio16224{
eventCh: make(chan Event_istio16224),
}
}
func Istio16224() {
prof := pprof.Lookup("goroutineleak")
defer func() {
time.Sleep(100 * time.Millisecond)
prof.WriteTo(os.Stdout, 2)
}()
for i := 0; i < 100; i++ {
go func() {
controller := &controller_istio16224{monitor: NewMonitor_istio16224()}
done := make(chan bool)
lock := sync.Mutex{}
controller.RegisterEventHandler(func(event Event_istio16224) {
lock.Lock()
defer lock.Unlock()
done <- true
})
stop := make(chan struct{})
go controller.Run(stop)
controller.Create()
lock.Lock() // blocks
lock.Unlock()
<-done
close(stop)
}()
}
}