| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- package io
- import(
- "errors"
- )
- const (
- SizeSmall = 16
- SizeMedium = 128
- SizeLarge = 512
- )
- var (
- ErrorNoChannel = errors.New("No suitable channels found.")
- )
- type VBufferSet struct {
- small chan []byte
- medium chan []byte
- large chan []byte
- }
- func NewVBufferSet() *VBufferSet {
- bSet := new(VBufferSet)
- bSet.small = make(chan []byte, 128)
- bSet.medium = make(chan []byte, 128)
- bSet.large = make(chan []byte, 128)
- return bSet
- }
- func (bSet *VBufferSet) detectBucket(size int, strict bool) (chan []byte, error) {
- if strict {
- if size == SizeSmall {
- return bSet.small, nil
- } else if size == SizeMedium {
- return bSet.medium, nil
- } else if size == SizeLarge {
- return bSet.large, nil
- }
- } else {
- if size <= SizeSmall {
- return bSet.small, nil
- } else if size <= SizeMedium {
- return bSet.medium, nil
- } else if size <= SizeLarge {
- return bSet.large, nil
- }
- }
- return nil, ErrorNoChannel
- }
- func (bSet *VBufferSet) FetchBuffer(minSize int) []byte {
- var buffer []byte
- byteChan, err := bSet.detectBucket(minSize, false)
- if err != nil {
- return make([]byte, minSize)
- }
- select {
- case buffer = <- byteChan:
- default:
- buffer = make([]byte, minSize)
- }
- return buffer
- }
- func (bSet *VBufferSet) ReturnBuffer(buffer []byte) {
- byteChan, err := bSet.detectBucket(len(buffer), true)
- if err != nil {
- return
- }
- select {
- case byteChan <- buffer:
- default:
- }
- }
|