diff options
Diffstat (limited to 'weed/util/mem/slot_pool.go')
| -rw-r--r-- | weed/util/mem/slot_pool.go | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/weed/util/mem/slot_pool.go b/weed/util/mem/slot_pool.go new file mode 100644 index 000000000..e6680d3cb --- /dev/null +++ b/weed/util/mem/slot_pool.go @@ -0,0 +1,44 @@ +package mem + +import "sync" + +var pools []*sync.Pool + +const ( + min_size = 1024 +) + +func bitCount(size int) (count int) { + for ; size > min_size; count++ { + size = size >> 1 + } + return +} + +func init() { + // 1KB ~ 256MB + pools = make([]*sync.Pool, bitCount(1024*1024*256)) + for i := 0; i < len(pools); i++ { + slotSize := 1024 << i + pools[i] = &sync.Pool{ + New: func() interface{} { + buffer := make([]byte, slotSize) + return &buffer + }, + } + } +} + +func getSlotPool(size int) *sync.Pool { + index := bitCount(size) + return pools[index] +} + +func Allocate(size int) []byte { + slab := *getSlotPool(size).Get().(*[]byte) + return slab[:size] +} + +func Free(buf []byte) { + getSlotPool(cap(buf)).Put(&buf) +} |
