@cryptotaxi247 / kubo / commits / a8069024e

cut down on allocations

Jeromy committed Oct 28, 2014 at 03:58 UTC a8069024e94fa9e4f5527a55ea51000e1f756a36
4 files changed +29 -26
Godeps/_workspace/src/github.com/jbenet/go-msgio/chan.go
+3 -8
@@ -33,7 +33,7 @@ func NewChanWithPool(chanSize int, pool *sync.Pool) *Chan {
33 func (s *Chan) ReadFrom(r io.Reader, maxMsgLen int) {
34 // new buffer per message
35 // if bottleneck, cycle around a set of buffers
36 - mr := NewReader(r)
36 + mr := NewReader(r, s.BufPool)
37 if s.BufPool == nil {
38 s.BufPool = new(sync.Pool)
39 s.BufPool.New = func() interface{} {
@@ -42,12 +42,7 @@ func (s *Chan) ReadFrom(r io.Reader, maxMsgLen int) {
42 }
43 Loop:
44 for {
45 - bufi := s.BufPool.Get()
46 - buf, ok := bufi.([]byte)
47 - if !ok {
48 - panic("Got invalid type from sync pool!")
49 - }
50 - l, err := mr.ReadMsg(buf)
45 + buf, err := mr.ReadMsg()
46 if err != nil {
47 if err == io.EOF {
48 break Loop // done
@@ -61,7 +56,7 @@ Loop:
56 select {
57 case <-s.CloseChan:
58 break Loop // told we're done
64 - case s.MsgChan <- buf[:l]:
59 + case s.MsgChan <- buf:
60 // ok seems fine. send it away
61 }
62 }
Godeps/_workspace/src/github.com/jbenet/go-msgio/msgio.go
+19 -10
@@ -3,6 +3,7 @@ package msgio
3 import (
4 "encoding/binary"
5 "io"
6 + "sync"
7 )
8
9 var NBO = binary.BigEndian
@@ -17,7 +18,7 @@ type WriteCloser interface {
18 }
19
20 type Reader interface {
20 - ReadMsg([]byte) (int, error)
21 + ReadMsg() ([]byte, error)
22 }
23
24 type ReadCloser interface {
@@ -63,22 +64,30 @@ func (s *Writer_) Close() error {
64 type Reader_ struct {
65 R io.Reader
66 lbuf []byte
67 + bp *sync.Pool
68 }
69
68 -func NewReader(r io.Reader) ReadCloser {
69 - return &Reader_{r, make([]byte, 4)}
70 +func NewReader(r io.Reader, bufpool *sync.Pool) ReadCloser {
71 + return &Reader_{R: r, lbuf: make([]byte, 4), bp: bufpool}
72 }
73
72 -func (s *Reader_) ReadMsg(msg []byte) (int, error) {
74 +func (s *Reader_) ReadMsg() ([]byte, error) {
75 if _, err := io.ReadFull(s.R, s.lbuf); err != nil {
74 - return 0, err
76 + return nil, err
77 }
78 +
79 + bufi := s.bp.Get()
80 + buf, ok := bufi.([]byte)
81 + if !ok {
82 + panic("invalid type in pool!")
83 + }
84 +
85 length := int(NBO.Uint32(s.lbuf))
77 - if length < 0 || length > len(msg) {
78 - return 0, io.ErrShortBuffer
86 + if length < 0 || length > len(buf) {
87 + return nil, io.ErrShortBuffer
88 }
80 - _, err := io.ReadFull(s.R, msg[:length])
81 - return length, err
89 + _, err := io.ReadFull(s.R, buf[:length])
90 + return buf[:length], err
91 }
92
93 func (s *Reader_) Close() error {
@@ -95,7 +104,7 @@ type ReadWriter_ struct {
104
105 func NewReadWriter(rw io.ReadWriter) ReadWriter {
106 return &ReadWriter_{
98 - Reader: NewReader(rw),
107 + Reader: NewReader(rw, nil),
108 Writer: NewWriter(rw),
109 }
110 }
crypto/spipe/handshake.go
+6 -7
@@ -303,21 +303,20 @@ func (s *SecurePipe) handleSecureIn(hashType, cipherType string, tIV, tCKey, tMK
303 }
304
305 mark := len(data) - macSize
306 - buff := make([]byte, mark)
307 -
308 - theirCipher.XORKeyStream(buff, data[0:mark])
306
307 theirMac.Write(data[0:mark])
308 expected := theirMac.Sum(nil)
309 theirMac.Reset()
310
311 hmacOk := hmac.Equal(data[mark:], expected)
315 -
316 - if hmacOk {
317 - s.Duplex.In <- buff
318 - } else {
312 + if !hmacOk {
313 s.Duplex.In <- nil
314 + continue
315 }
316 +
317 + theirCipher.XORKeyStream(data, data[0:mark])
318 +
319 + s.Duplex.In <- data[:mark]
320 }
321 }
322
net/conn/conn.go
+1 -1
@@ -41,7 +41,7 @@ func init() {
41 func ReleaseBuffer(b []byte) {
42 log.Warningf("Releasing buffer! (cap,size = %d, %d)", cap(b), len(b))
43 if cap(b) != MaxMessageSize {
44 - log.Warning("Release buffer failed.")
44 + log.Warning("Release buffer failed (cap, size = %d, %d)", cap(b), len(b))
45 return
46 }
47 BufferPool.Put(b[:cap(b)])