receivedMessageTypes.Add(strconv.FormatInt(int64(msg.Type), 10), 1)
me.mu.Lock()
c.lastMessageReceived = time.Now()
- select {
- case <-c.closing:
+ if c.closed.IsSet() {
return nil
- default:
}
if err != nil {
if me.stopped() || err == io.EOF {
}
func (cl *Client) usefulConn(t *torrent, c *connection) bool {
- select {
- case <-c.closing:
+ if c.closed.IsSet() {
return false
- default:
}
if !t.haveInfo() {
return c.supportsExtension("ut_metadata")
"fmt"
"io"
"net"
- "sync"
"time"
+ "github.com/anacrolix/missinggo"
"github.com/anacrolix/torrent/bencode"
pp "github.com/anacrolix/torrent/peer_protocol"
)
encrypted bool
Discovery peerSource
uTP bool
- closing chan struct{}
- mu sync.Mutex // Only for closing.
+ closed missinggo.Event
post chan pp.Message
writeCh chan []byte
PeerChoked: true,
PeerMaxRequests: 250,
- closing: make(chan struct{}),
writeCh: make(chan []byte),
post: make(chan pp.Message),
}
}
func (c *connection) Close() {
- c.mu.Lock()
- defer c.mu.Unlock()
- select {
- case <-c.closing:
- return
- default:
- }
- close(c.closing)
+ c.closed.Set()
// TODO: This call blocks sometimes, why?
go c.conn.Close()
}
func (c *connection) Post(msg pp.Message) {
select {
case c.post <- msg:
- case <-c.closing:
+ case <-c.closed.C():
}
}
conn.Close()
return
}
- case <-conn.closing:
+ case <-conn.closed.C():
return
}
} else {
conn.Close()
return
}
- case <-conn.closing:
+ case <-conn.closed.C():
return
default:
connectionWriterFlush.Add(1)
if pending.Len() == 0 {
timer.Reset(keepAliveDelay)
}
- case <-conn.closing:
+ case <-conn.closed.C():
return
}
}