// 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" "time" ) func init() { register("Cockroach2448", Cockroach2448) } type Stopper_cockroach2448 struct { Done chan bool } func (s *Stopper_cockroach2448) ShouldStop() <-chan bool { return s.Done } type EventMembershipChangeCommitted_cockroach2448 struct { Callback func() } type MultiRaft_cockroach2448 struct { stopper *Stopper_cockroach2448 Events chan interface{} callbackChan chan func() } // sendEvent can be invoked many times func (m *MultiRaft_cockroach2448) sendEvent(event interface{}) { select { case m.Events <- event: // Waiting for events consumption case <-m.stopper.ShouldStop(): } } type state_cockroach2448 struct { *MultiRaft_cockroach2448 } func (s *state_cockroach2448) start() { for { select { case <-s.stopper.ShouldStop(): return case cb := <-s.callbackChan: cb() default: s.handleWriteResponse() time.Sleep(100 * time.Microsecond) } } } func (s *state_cockroach2448) handleWriteResponse() { s.sendEvent(&EventMembershipChangeCommitted_cockroach2448{ Callback: func() { select { case s.callbackChan <- func() { // Waiting for callbackChan consumption time.Sleep(time.Nanosecond) }: case <-s.stopper.ShouldStop(): } }, }) } type Store_cockroach2448 struct { multiraft *MultiRaft_cockroach2448 } func (s *Store_cockroach2448) processRaft() { for { select { case e := <-s.multiraft.Events: switch e := e.(type) { case *EventMembershipChangeCommitted_cockroach2448: callback := e.Callback runtime.Gosched() if callback != nil { callback() // Waiting for callbackChan consumption } } case <-s.multiraft.stopper.ShouldStop(): return } } } func NewStoreAndState_cockroach2448() (*Store_cockroach2448, *state_cockroach2448) { stopper := &Stopper_cockroach2448{ Done: make(chan bool), } mltrft := &MultiRaft_cockroach2448{ stopper: stopper, Events: make(chan interface{}), callbackChan: make(chan func()), } st := &state_cockroach2448{mltrft} s := &Store_cockroach2448{mltrft} return s, st } func Cockroach2448() { prof := pprof.Lookup("goroutineleak") defer func() { time.Sleep(100 * time.Millisecond) prof.WriteTo(os.Stdout, 2) }() for i := 0; i < 1000; i++ { go func() { s, st := NewStoreAndState_cockroach2448() go s.processRaft() // G1 go st.start() // G2 }() } }