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)])