mirror of
https://github.com/ipfs/kubo.git
synced 2025-07-02 12:20:03 +08:00
cut down on allocations
This commit is contained in:
11
Godeps/_workspace/src/github.com/jbenet/go-msgio/chan.go
generated
vendored
11
Godeps/_workspace/src/github.com/jbenet/go-msgio/chan.go
generated
vendored
@ -33,7 +33,7 @@ func NewChanWithPool(chanSize int, pool *sync.Pool) *Chan {
|
|||||||
func (s *Chan) ReadFrom(r io.Reader, maxMsgLen int) {
|
func (s *Chan) ReadFrom(r io.Reader, maxMsgLen int) {
|
||||||
// new buffer per message
|
// new buffer per message
|
||||||
// if bottleneck, cycle around a set of buffers
|
// if bottleneck, cycle around a set of buffers
|
||||||
mr := NewReader(r)
|
mr := NewReader(r, s.BufPool)
|
||||||
if s.BufPool == nil {
|
if s.BufPool == nil {
|
||||||
s.BufPool = new(sync.Pool)
|
s.BufPool = new(sync.Pool)
|
||||||
s.BufPool.New = func() interface{} {
|
s.BufPool.New = func() interface{} {
|
||||||
@ -42,12 +42,7 @@ func (s *Chan) ReadFrom(r io.Reader, maxMsgLen int) {
|
|||||||
}
|
}
|
||||||
Loop:
|
Loop:
|
||||||
for {
|
for {
|
||||||
bufi := s.BufPool.Get()
|
buf, err := mr.ReadMsg()
|
||||||
buf, ok := bufi.([]byte)
|
|
||||||
if !ok {
|
|
||||||
panic("Got invalid type from sync pool!")
|
|
||||||
}
|
|
||||||
l, err := mr.ReadMsg(buf)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err == io.EOF {
|
if err == io.EOF {
|
||||||
break Loop // done
|
break Loop // done
|
||||||
@ -61,7 +56,7 @@ Loop:
|
|||||||
select {
|
select {
|
||||||
case <-s.CloseChan:
|
case <-s.CloseChan:
|
||||||
break Loop // told we're done
|
break Loop // told we're done
|
||||||
case s.MsgChan <- buf[:l]:
|
case s.MsgChan <- buf:
|
||||||
// ok seems fine. send it away
|
// ok seems fine. send it away
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
29
Godeps/_workspace/src/github.com/jbenet/go-msgio/msgio.go
generated
vendored
29
Godeps/_workspace/src/github.com/jbenet/go-msgio/msgio.go
generated
vendored
@ -3,6 +3,7 @@ package msgio
|
|||||||
import (
|
import (
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"io"
|
"io"
|
||||||
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
var NBO = binary.BigEndian
|
var NBO = binary.BigEndian
|
||||||
@ -17,7 +18,7 @@ type WriteCloser interface {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Reader interface {
|
type Reader interface {
|
||||||
ReadMsg([]byte) (int, error)
|
ReadMsg() ([]byte, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type ReadCloser interface {
|
type ReadCloser interface {
|
||||||
@ -63,22 +64,30 @@ func (s *Writer_) Close() error {
|
|||||||
type Reader_ struct {
|
type Reader_ struct {
|
||||||
R io.Reader
|
R io.Reader
|
||||||
lbuf []byte
|
lbuf []byte
|
||||||
|
bp *sync.Pool
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewReader(r io.Reader) ReadCloser {
|
func NewReader(r io.Reader, bufpool *sync.Pool) ReadCloser {
|
||||||
return &Reader_{r, make([]byte, 4)}
|
return &Reader_{R: r, lbuf: make([]byte, 4), bp: bufpool}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Reader_) ReadMsg(msg []byte) (int, error) {
|
func (s *Reader_) ReadMsg() ([]byte, error) {
|
||||||
if _, err := io.ReadFull(s.R, s.lbuf); err != nil {
|
if _, err := io.ReadFull(s.R, s.lbuf); err != nil {
|
||||||
return 0, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bufi := s.bp.Get()
|
||||||
|
buf, ok := bufi.([]byte)
|
||||||
|
if !ok {
|
||||||
|
panic("invalid type in pool!")
|
||||||
|
}
|
||||||
|
|
||||||
length := int(NBO.Uint32(s.lbuf))
|
length := int(NBO.Uint32(s.lbuf))
|
||||||
if length < 0 || length > len(msg) {
|
if length < 0 || length > len(buf) {
|
||||||
return 0, io.ErrShortBuffer
|
return nil, io.ErrShortBuffer
|
||||||
}
|
}
|
||||||
_, err := io.ReadFull(s.R, msg[:length])
|
_, err := io.ReadFull(s.R, buf[:length])
|
||||||
return length, err
|
return buf[:length], err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Reader_) Close() error {
|
func (s *Reader_) Close() error {
|
||||||
@ -95,7 +104,7 @@ type ReadWriter_ struct {
|
|||||||
|
|
||||||
func NewReadWriter(rw io.ReadWriter) ReadWriter {
|
func NewReadWriter(rw io.ReadWriter) ReadWriter {
|
||||||
return &ReadWriter_{
|
return &ReadWriter_{
|
||||||
Reader: NewReader(rw),
|
Reader: NewReader(rw, nil),
|
||||||
Writer: NewWriter(rw),
|
Writer: NewWriter(rw),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -303,21 +303,20 @@ func (s *SecurePipe) handleSecureIn(hashType, cipherType string, tIV, tCKey, tMK
|
|||||||
}
|
}
|
||||||
|
|
||||||
mark := len(data) - macSize
|
mark := len(data) - macSize
|
||||||
buff := make([]byte, mark)
|
|
||||||
|
|
||||||
theirCipher.XORKeyStream(buff, data[0:mark])
|
|
||||||
|
|
||||||
theirMac.Write(data[0:mark])
|
theirMac.Write(data[0:mark])
|
||||||
expected := theirMac.Sum(nil)
|
expected := theirMac.Sum(nil)
|
||||||
theirMac.Reset()
|
theirMac.Reset()
|
||||||
|
|
||||||
hmacOk := hmac.Equal(data[mark:], expected)
|
hmacOk := hmac.Equal(data[mark:], expected)
|
||||||
|
if !hmacOk {
|
||||||
if hmacOk {
|
|
||||||
s.Duplex.In <- buff
|
|
||||||
} else {
|
|
||||||
s.Duplex.In <- nil
|
s.Duplex.In <- nil
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
theirCipher.XORKeyStream(data, data[0:mark])
|
||||||
|
|
||||||
|
s.Duplex.In <- data[:mark]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@ func init() {
|
|||||||
func ReleaseBuffer(b []byte) {
|
func ReleaseBuffer(b []byte) {
|
||||||
log.Warningf("Releasing buffer! (cap,size = %d, %d)", cap(b), len(b))
|
log.Warningf("Releasing buffer! (cap,size = %d, %d)", cap(b), len(b))
|
||||||
if cap(b) != MaxMessageSize {
|
if cap(b) != MaxMessageSize {
|
||||||
log.Warning("Release buffer failed.")
|
log.Warning("Release buffer failed (cap, size = %d, %d)", cap(b), len(b))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
BufferPool.Put(b[:cap(b)])
|
BufferPool.Put(b[:cap(b)])
|
||||||
|
Reference in New Issue
Block a user