From f893f033aa01428b98b13d76911db6435d05c132 Mon Sep 17 00:00:00 2001 From: xtaci Date: Wed, 18 Dec 2019 21:44:35 +0800 Subject: [PATCH] remove allocator --- alloc.go | 69 ----------------------------------------------- alloc_test.go | 75 --------------------------------------------------- session.go | 2 +- stream.go | 9 ------- 4 files changed, 1 insertion(+), 154 deletions(-) delete mode 100644 alloc.go delete mode 100644 alloc_test.go diff --git a/alloc.go b/alloc.go deleted file mode 100644 index ac8fc18..0000000 --- a/alloc.go +++ /dev/null @@ -1,69 +0,0 @@ -package smux - -import ( - "sync" - - "github.com/pkg/errors" -) - -var defaultAllocator *Allocator - -func init() { - defaultAllocator = NewAllocator() -} - -// Allocator for incoming frames, optimized to prevent overwriting after zeroing -type Allocator struct { - buffers []sync.Pool -} - -// NewAllocator initiates a []byte allocator for frames less than 65536 bytes, -// the waste(memory fragmentation) of space allocation is guaranteed to be -// no more than 50%. -func NewAllocator() *Allocator { - alloc := new(Allocator) - alloc.buffers = make([]sync.Pool, 17) // 1B -> 64K - for k := range alloc.buffers { - i := k - alloc.buffers[k].New = func() interface{} { - return make([]byte, 1< 65536 { - return nil - } - - bits := msb(size) - if size == 1< 65536 || cap(buf) != 1<>= 1 - for size > 0 { - size >>= 1 - pos++ - } - return pos -} diff --git a/alloc_test.go b/alloc_test.go deleted file mode 100644 index 339c8a4..0000000 --- a/alloc_test.go +++ /dev/null @@ -1,75 +0,0 @@ -package smux - -import ( - "math/rand" - "testing" -) - -func TestAllocGet(t *testing.T) { - alloc := NewAllocator() - if alloc.Get(0) != nil { - t.Fatal(0) - } - if len(alloc.Get(1)) != 1 { - t.Fatal(1) - } - if len(alloc.Get(2)) != 2 { - t.Fatal(2) - } - if len(alloc.Get(3)) != 3 || cap(alloc.Get(3)) != 4 { - t.Fatal(3) - } - if len(alloc.Get(4)) != 4 { - t.Fatal(4) - } - if len(alloc.Get(1023)) != 1023 || cap(alloc.Get(1023)) != 1024 { - t.Fatal(1023) - } - if len(alloc.Get(1024)) != 1024 { - t.Fatal(1024) - } - if len(alloc.Get(65536)) != 65536 { - t.Fatal(65536) - } - if alloc.Get(65537) != nil { - t.Fatal(65537) - } -} - -func TestAllocPut(t *testing.T) { - alloc := NewAllocator() - if err := alloc.Put(nil); err == nil { - t.Fatal("put nil misbehavior") - } - if err := alloc.Put(make([]byte, 3, 3)); err == nil { - t.Fatal("put elem:3 []bytes misbehavior") - } - if err := alloc.Put(make([]byte, 4, 4)); err != nil { - t.Fatal("put elem:4 []bytes misbehavior") - } - if err := alloc.Put(make([]byte, 1023, 1024)); err != nil { - t.Fatal("put elem:1024 []bytes misbehavior") - } - if err := alloc.Put(make([]byte, 65536, 65536)); err != nil { - t.Fatal("put elem:65536 []bytes misbehavior") - } - if err := alloc.Put(make([]byte, 65537, 65537)); err == nil { - t.Fatal("put elem:65537 []bytes misbehavior") - } -} - -func TestAllocPutThenGet(t *testing.T) { - alloc := NewAllocator() - data := alloc.Get(4) - alloc.Put(data) - newData := alloc.Get(4) - if cap(data) != cap(newData) { - t.Fatal("different cap while alloc.Get()") - } -} - -func BenchmarkMSB(b *testing.B) { - for i := 0; i < b.N; i++ { - msb(rand.Int()) - } -} diff --git a/session.go b/session.go index 3c6c7f6..da31dfc 100644 --- a/session.go +++ b/session.go @@ -340,7 +340,7 @@ func (s *Session) recvLoop() { s.streamLock.Unlock() case cmdPSH: if hdr.Length() > 0 { - newbuf := defaultAllocator.Get(int(hdr.Length())) + newbuf := make([]byte, hdr.Length()) if written, err := io.ReadFull(s.conn, newbuf); err == nil { s.streamLock.Lock() if stream, ok := s.streams[sid]; ok { diff --git a/stream.go b/stream.go index d60e3e3..7a7edc8 100644 --- a/stream.go +++ b/stream.go @@ -16,7 +16,6 @@ type Stream struct { sess *Session buffers [][]byte - heads [][]byte // slice heads kept for recycle bufferLock sync.Mutex frameSize int @@ -71,9 +70,6 @@ func (s *Stream) Read(b []byte) (n int, err error) { if len(s.buffers[0]) == 0 { s.buffers[0] = nil s.buffers = s.buffers[1:] - // full recycle - defaultAllocator.Put(s.heads[0]) - s.heads = s.heads[1:] } } s.bufferLock.Unlock() @@ -97,13 +93,11 @@ func (s *Stream) WriteTo(w io.Writer) (n int64, err error) { if len(s.buffers) > 0 { buf = s.buffers[0] s.buffers = s.buffers[1:] - s.heads = s.heads[1:] } s.bufferLock.Unlock() if buf != nil { nw, ew := w.Write(buf) - defaultAllocator.Put(buf) s.sess.returnTokens(len(buf)) if nw > 0 { n += int64(nw) @@ -262,7 +256,6 @@ func (s *Stream) RemoteAddr() net.Addr { func (s *Stream) pushBytes(buf []byte) (written int, err error) { s.bufferLock.Lock() s.buffers = append(s.buffers, buf) - s.heads = append(s.heads, buf) s.bufferLock.Unlock() return } @@ -272,10 +265,8 @@ func (s *Stream) recycleTokens() (n int) { s.bufferLock.Lock() for k := range s.buffers { n += len(s.buffers[k]) - defaultAllocator.Put(s.heads[k]) } s.buffers = nil - s.heads = nil s.bufferLock.Unlock() return }