}
defer ls.teardown()
ch := make(chan error, 1)
- handler := func(ls *localServer, ln Listener) { transponder(ln, ch) }
+ handler := func(ls *localServer, ln Listener) { ls.transponder(ln, ch) }
if err := ls.buildup(handler); err != nil {
t.Fatal(err)
}
lnmu sync.RWMutex
Listener
done chan bool // signal that indicates server stopped
+ cl []Conn // accepted connection list
}
func (ls *localServer) buildup(handler func(*localServer, Listener)) error {
func (ls *localServer) teardown() error {
ls.lnmu.Lock()
+ defer ls.lnmu.Unlock()
if ls.Listener != nil {
network := ls.Listener.Addr().Network()
address := ls.Listener.Addr().String()
ls.Listener.Close()
+ for _, c := range ls.cl {
+ if err := c.Close(); err != nil {
+ return err
+ }
+ }
<-ls.done
ls.Listener = nil
switch network {
os.Remove(address)
}
}
- ls.lnmu.Unlock()
return nil
}
}, nil
}
-func transponder(ln Listener, ch chan<- error) {
+func (ls *localServer) transponder(ln Listener, ch chan<- error) {
defer close(ch)
switch ln := ln.(type) {
ch <- err
return
}
- defer c.Close()
+ ls.cl = append(ls.cl, c)
network := ln.Addr().Network()
if c.LocalAddr().Network() != network || c.RemoteAddr().Network() != network {
t.Fatal(err)
}
ch := make(chan error, 1)
- handler := func(ls *localServer, ln Listener) { transponder(ls.Listener, ch) }
+ handler := func(ls *localServer, ln Listener) { ls.transponder(ls.Listener, ch) }
ls, err := (&streamListener{Listener: ln}).newLocalServer()
if err != nil {
t.Fatal(err)
}
for i := 0; i < N; i++ {
ch := tpchs[i]
- handler := func(ls *localServer, ln Listener) { transponder(ln, ch) }
+ handler := func(ls *localServer, ln Listener) { ls.transponder(ln, ch) }
if err := lss[i].buildup(handler); err != nil {
t.Fatal(err)
}
}
for i := 0; i < N; i++ {
ch := tpchs[i]
- handler := func(ls *localServer, ln Listener) { transponder(ln, ch) }
+ handler := func(ls *localServer, ln Listener) { ls.transponder(ln, ch) }
if err := lss[i].buildup(handler); err != nil {
t.Fatal(err)
}
}
defer ls.teardown()
ch := make(chan error, 1)
- handler := func(ls *localServer, ln Listener) { transponder(ln, ch) }
+ handler := func(ls *localServer, ln Listener) { ls.transponder(ln, ch) }
if err := ls.buildup(handler); err != nil {
t.Fatal(err)
}