var msg pp.Message
err := decoder.Decode(&msg)
me.mu.Lock()
- if c.getClosed() {
+ c.lastMessageReceived = time.Now()
+ select {
+ case <-c.closing:
return nil
+ default:
}
if err != nil {
if me.stopped() || err == io.EOF {
type connection struct {
Socket net.Conn
Discovery peerSource
- closed chan struct{}
+ closing chan struct{}
mu sync.Mutex // Only for closing.
post chan pp.Message
writeCh chan []byte
PeerExtensionBytes: peb,
PeerID: peerID,
- closed: make(chan struct{}),
+ closing: make(chan struct{}),
writeCh: make(chan []byte),
post: make(chan pp.Message),
}
func (c *connection) Close() {
c.mu.Lock()
defer c.mu.Unlock()
- if c.getClosed() {
- return
- }
- close(c.closed)
- c.Socket.Close()
-}
-
-func (c *connection) getClosed() bool {
select {
- case <-c.closed:
- return true
+ case <-c.closing:
+ return
default:
- return false
}
+ close(c.closing)
+ c.Socket.Close()
}
func (c *connection) PeerHasPiece(index pp.Integer) bool {
func (c *connection) Post(msg pp.Message) {
select {
case c.post <- msg:
- case <-c.closed:
+ case <-c.closing:
}
}
conn.Close()
return
}
- case <-conn.closed:
+ case <-conn.closing:
return
}
}
if pending.Len() == 0 {
timer.Reset(keepAliveDelay)
}
- case <-conn.closed:
+ case <-conn.closing:
return
}
}