diff --git a/lang/mcache/mcache.go b/lang/mcache/mcache.go index 1e07472f..8fea275d 100644 --- a/lang/mcache/mcache.go +++ b/lang/mcache/mcache.go @@ -16,6 +16,7 @@ package mcache import ( "sync" + "unsafe" "github.com/bytedance/gopkg/lang/dirtmake" ) @@ -25,12 +26,19 @@ const maxSize = 46 // index contains []byte which cap is 1< 0 && capacity[0] > size { c = capacity[0] } - var ret = caches[calcIndex(c)].Get().([]byte) - ret = ret[:size] + + i := calcIndex(c) + + ret := []byte{} + h := (*bytesHeader)(unsafe.Pointer(&ret)) + h.Len = size + h.Cap = 1 << i + h.Data = caches[i].Get().(*byte) return ret } @@ -68,6 +82,6 @@ func Free(buf []byte) { if !isPowerOfTwo(size) { return } - buf = buf[:0] - caches[bsr(size)].Put(buf) + h := (*bytesHeader)(unsafe.Pointer(&buf)) + caches[bsr(size)].Put(h.Data) } diff --git a/lang/mcache/utils.go b/lang/mcache/utils.go index 71326f92..dd8698ae 100644 --- a/lang/mcache/utils.go +++ b/lang/mcache/utils.go @@ -21,5 +21,5 @@ func bsr(x int) int { } func isPowerOfTwo(x int) bool { - return (x & (-x)) == x + return (x != 0) && ((x & (-x)) == x) }