func (c *connection) mainReadLoop() error {
t := c.t
cl := t.cl
+ pool := &sync.Pool{
+ New: func() interface{} {
+ return make([]byte, t.chunkSize)
+ },
+ }
+
decoder := pp.Decoder{
R: bufio.NewReader(c.rw),
MaxLength: 256 * 1024,
+ Pool: pool,
}
for {
cl.mu.Unlock()
err = c.peerSentHaveNone()
case pp.Piece:
cl.downloadedChunk(t, c, &msg)
+ if len(msg.Piece) == int(t.chunkSize) {
+ pool.Put(msg.Piece)
+ }
case pp.Extended:
switch msg.ExtendedID {
case pp.HandshakeExtendedID:
"fmt"
"io"
"io/ioutil"
+ "sync"
)
type (
type Decoder struct {
R *bufio.Reader
+ Pool *sync.Pool
MaxLength Integer // TODO: Should this include the length header or not?
}
if err != nil {
break
}
- msg.Piece, err = ioutil.ReadAll(r)
+ //msg.Piece, err = ioutil.ReadAll(r)
+ b := d.Pool.Get().([]byte)
+ n, err := io.ReadFull(r, b)
+ if err != nil {
+ if err != io.ErrUnexpectedEOF || n != int(length-9) {
+ return err
+ }
+ b = b[0:n]
+ }
+ msg.Piece = b
case Extended:
msg.ExtendedID, err = r.ReadByte()
if err != nil {