mirror of
https://github.com/miekg/dns.git
synced 2025-10-18 13:21:15 +02:00
to prevent deadlock a seperate err channel needs to be used
This commit is contained in:
parent
4f343a4d60
commit
1e8c2d3679
@ -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)
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user