pp "github.com/anacrolix/torrent/peer_protocol"
)
-func (pc *PeerConn) startWriter() {
+func (pc *PeerConn) initMessageWriter() {
w := &pc.messageWriter
*w = peerConnMsgWriter{
fillWriteBuffer: func() {
logger: pc.logger,
w: pc.w,
keepAlive: func() bool {
- pc.locker().Lock()
- defer pc.locker().Unlock()
+ pc.locker().RLock()
+ defer pc.locker().RUnlock()
return pc.useful()
},
writeBuffer: new(bytes.Buffer),
}
- go func() {
- defer pc.locker().Unlock()
- defer pc.close()
- defer pc.locker().Lock()
- pc.messageWriter.run(pc.t.cl.config.KeepAliveTimeout)
- }()
+}
+
+func (pc *PeerConn) startMessageWriter() {
+ pc.initMessageWriter()
+ go pc.messageWriterRunner()
+}
+
+func (pc *PeerConn) messageWriterRunner() {
+ defer pc.locker().Unlock()
+ defer pc.close()
+ defer pc.locker().Lock()
+ pc.messageWriter.run(pc.t.cl.config.KeepAliveTimeout)
}
type peerConnMsgWriter struct {
if err == nil && n != len(next) {
panic("expected full write")
}
+ if err != nil {
+ break
+ }
}
if err != nil {
cn.logger.WithDefaultLevel(log.Debug).Printf("error writing: %v", err)