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") println("Signal received, stopping")
rs <- nil // shutdown responder rs <- nil // shutdown responder
break forever break forever
case e := <-rs:
println(e.String())
} }
} }
close(rs) close(rs)

View File

@ -121,12 +121,6 @@ forever:
ch <- nil ch <- nil
cht <- nil cht <- nil
break forever 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) close(cht)

View File

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

View File

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