// are okay.
type messageWriter func(pp.Message) bool
+// Proxies the messageWriter's response.
func (cn *connection) request(r request, mw messageWriter) bool {
if cn.requests == nil {
cn.requests = make(map[request]struct{}, cn.nominalMaxRequests())
panic("requesting piece peer doesn't have")
}
cn.requests[r] = struct{}{}
+ if _, ok := cn.t.conns[cn]; !ok {
+ panic("requesting but not in active conns")
+ }
cn.t.pendingRequests[r]++
return mw(pp.Message{
Type: pp.Request,
defer cn.Close()
defer keepAliveTimer.Stop()
for {
+ if cn.closed.IsSet() {
+ return
+ }
buf.Write(cn.postedBuffer.Bytes())
cn.postedBuffer.Reset()
if buf.Len() == 0 {
// Returns true if connection is removed from torrent.Conns.
func (t *Torrent) deleteConnection(c *connection) (ret bool) {
+ if !c.closed.IsSet() {
+ panic("connection is not closed")
+ // There are behaviours prevented by the closed state that will fail
+ // if the connection has been deleted.
+ }
_, ret = t.conns[c]
delete(t.conns, c)
c.deleteAllRequests()