to prevent deadlock a seperate err channel needs to be used

This commit is contained in:
Miek Gieben 2011-01-27 22:01:25 +01:00
parent 4f343a4d60
commit 1e8c2d3679
4 changed files with 7 additions and 21 deletions

View File

@ -234,8 +234,6 @@ forever:
println("Signal received, stopping")
rs <- nil // shutdown responder
break forever
case e := <-rs:
println(e.String())
}
}
close(rs)

View File

@ -121,12 +121,6 @@ forever:
ch <- nil
cht <- nil
break forever
case e := <-cht:
// last message from tcp channel
println(e.String())
case e := <-ch:
// last message from udp channel
println(e.String())
}
}
close(cht)

View File

@ -64,10 +64,6 @@ forever:
println("Signal received, stopping")
ch <- nil
break forever
case e := <-cht:
println(e.String())
case e := <-ch:
println(e.String())
}
}
close(cht)

View File

@ -64,7 +64,7 @@ type Responder interface {
func (res *Server) NewResponder(h Responder, stop chan os.Error) {
var port string
if len(res.Address) == 0 {
stop <- &dns.Error{Error: "No addresses"}
//stop <- &dns.Error{Error: "No addresses"}
return
}
if res.Port == "" {
@ -79,16 +79,15 @@ func (res *Server) NewResponder(h Responder, stop chan os.Error) {
a, _ := net.ResolveTCPAddr(res.Address + ":" + port)
go listenerTCP(a, tch, lch)
listener := <-lch
foreverTCP:
for {
select {
case <-stop:
stop <- nil
listener.Close()
break foreverTCP
return
case s := <-tch:
if s.err != nil {
stop <- s.err
// stop <- s.err seperate error channel
} else {
go h.ResponderTCP(s.tcp, s.msg)
}
@ -99,15 +98,14 @@ func (res *Server) NewResponder(h Responder, stop chan os.Error) {
uch := make(chan msg)
a, _ := net.ResolveUDPAddr(res.Address + ":" + port)
go listenerUDP(a, uch)
foreverUDP:
for {
select {
case <-stop:
stop <- nil
break foreverUDP
return
case s := <-uch:
if s.err != nil {
stop <- s.err
//stop <- s.err // seperate error channel
} else {
go h.ResponderUDP(s.udp, s.addr, s.msg)
}