blob: e25494a688dd5c65be60084ad2e3a309768954d1 [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"
"runtime/pprof"
"sync"
)
func init() {
register("Syncthing5795", Syncthing5795)
}
type message_syncthing5795 interface{}
type ClusterConfig_syncthing5795 struct{}
type Model_syncthing5795 interface {
ClusterConfig(message_syncthing5795)
}
type TestModel_syncthing5795 struct {
ccFn func()
}
func (t *TestModel_syncthing5795) ClusterConfig(msg message_syncthing5795) {
if t.ccFn != nil {
t.ccFn()
}
}
type Connection_syncthing5795 interface {
Start()
Close()
}
type rawConnection_syncthing5795 struct {
receiver Model_syncthing5795
inbox chan message_syncthing5795
dispatcherLoopStopped chan struct{}
closed chan struct{}
closeOnce sync.Once
}
func (c *rawConnection_syncthing5795) Start() {
go c.dispatcherLoop() // G2
}
func (c *rawConnection_syncthing5795) dispatcherLoop() {
defer close(c.dispatcherLoopStopped)
var msg message_syncthing5795
for {
select {
case msg = <-c.inbox:
case <-c.closed:
return
}
switch msg := msg.(type) {
case *ClusterConfig_syncthing5795:
c.receiver.ClusterConfig(msg)
default:
return
}
}
}
func (c *rawConnection_syncthing5795) Close() {
c.closeOnce.Do(func() {
close(c.closed)
<-c.dispatcherLoopStopped
})
}
func Syncthing5795() {
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
m := &TestModel_syncthing5795{}
c := &rawConnection_syncthing5795{
dispatcherLoopStopped: make(chan struct{}),
closed: make(chan struct{}),
inbox: make(chan message_syncthing5795),
receiver: m,
}
m.ccFn = c.Close
c.Start()
c.inbox <- &ClusterConfig_syncthing5795{}
<-c.dispatcherLoopStopped
}()
}