// 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" "sync/atomic" ) func init() { register("Cockroach35073", Cockroach35073) } type ConsumerStatus_cockroach35073 uint32 const ( NeedMoreRows_cockroach35073 ConsumerStatus_cockroach35073 = iota DrainRequested_cockroach35073 ConsumerClosed_cockroach35073 ) const rowChannelBufSize_cockroach35073 = 16 const outboxBufRows_cockroach35073 = 16 type rowSourceBase_cockroach35073 struct { consumerStatus ConsumerStatus_cockroach35073 } func (rb *rowSourceBase_cockroach35073) consumerClosed() { atomic.StoreUint32((*uint32)(&rb.consumerStatus), uint32(ConsumerClosed_cockroach35073)) } type RowChannelMsg_cockroach35073 int type RowChannel_cockroach35073 struct { rowSourceBase_cockroach35073 dataChan chan RowChannelMsg_cockroach35073 } func (rc *RowChannel_cockroach35073) ConsumerClosed() { rc.consumerClosed() select { case <-rc.dataChan: default: } } func (rc *RowChannel_cockroach35073) Push() ConsumerStatus_cockroach35073 { consumerStatus := ConsumerStatus_cockroach35073( atomic.LoadUint32((*uint32)(&rc.consumerStatus))) switch consumerStatus { case NeedMoreRows_cockroach35073: rc.dataChan <- RowChannelMsg_cockroach35073(0) case DrainRequested_cockroach35073: case ConsumerClosed_cockroach35073: } return consumerStatus } func (rc *RowChannel_cockroach35073) InitWithNumSenders() { rc.initWithBufSizeAndNumSenders(rowChannelBufSize_cockroach35073) } func (rc *RowChannel_cockroach35073) initWithBufSizeAndNumSenders(chanBufSize int) { rc.dataChan = make(chan RowChannelMsg_cockroach35073, chanBufSize) } type outbox_cockroach35073 struct { RowChannel_cockroach35073 } func (m *outbox_cockroach35073) init() { m.RowChannel_cockroach35073.InitWithNumSenders() } func (m *outbox_cockroach35073) start(wg *sync.WaitGroup) { if wg != nil { wg.Add(1) } go m.run(wg) } func (m *outbox_cockroach35073) run(wg *sync.WaitGroup) { if wg != nil { wg.Done() } } func Cockroach35073() { prof := pprof.Lookup("goroutineleak") defer func() { // Yield several times to allow the child goroutine to run. for i := 0; i < yieldCount; i++ { runtime.Gosched() } prof.WriteTo(os.Stdout, 2) }() go func() { outbox := &outbox_cockroach35073{} outbox.init() var wg sync.WaitGroup for i := 0; i < outboxBufRows_cockroach35073; i++ { outbox.Push() } var blockedPusherWg sync.WaitGroup blockedPusherWg.Add(1) go func() { outbox.Push() blockedPusherWg.Done() }() outbox.start(&wg) wg.Wait() outbox.RowChannel_cockroach35073.Push() }() }