blob: 7d56642d5e9ed9a8dc4b025df9f4a18a5a4a2a6d [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 (
"context"
"os"
"runtime"
"runtime/pprof"
"sync"
"time"
)
func init() {
register("Etcd10492", Etcd10492)
}
type Checkpointer_etcd10492 func(ctx context.Context)
type lessor_etcd10492 struct {
mu sync.RWMutex
cp Checkpointer_etcd10492
checkpointInterval time.Duration
}
func (le *lessor_etcd10492) Checkpoint() {
le.mu.Lock() // Lock acquired twice here
defer le.mu.Unlock()
}
func (le *lessor_etcd10492) SetCheckpointer(cp Checkpointer_etcd10492) {
le.mu.Lock()
defer le.mu.Unlock()
le.cp = cp
}
func (le *lessor_etcd10492) Renew() {
le.mu.Lock()
unlock := func() { le.mu.Unlock() }
defer func() { unlock() }()
if le.cp != nil {
le.cp(context.Background())
}
}
func Etcd10492() {
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() { // G1
le := &lessor_etcd10492{
checkpointInterval: 0,
}
fakerCheckerpointer_etcd10492 := func(ctx context.Context) {
le.Checkpoint()
}
le.SetCheckpointer(fakerCheckerpointer_etcd10492)
le.mu.Lock()
le.mu.Unlock()
le.Renew()
}()
}