|  | @@ -1,75 +1,75 @@
 | 
											
												
													
														|  |  package io
 |  |  package io
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -import(
 |  | 
 | 
											
												
													
														|  | -  "errors"
 |  | 
 | 
											
												
													
														|  | 
 |  | +import (
 | 
											
												
													
														|  | 
 |  | +	"errors"
 | 
											
												
													
														|  |  )
 |  |  )
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  const (
 |  |  const (
 | 
											
												
													
														|  | -  SizeSmall = 16
 |  | 
 | 
											
												
													
														|  | -  SizeMedium = 128
 |  | 
 | 
											
												
													
														|  | -  SizeLarge = 512
 |  | 
 | 
											
												
													
														|  | 
 |  | +	SizeSmall  = 16
 | 
											
												
													
														|  | 
 |  | +	SizeMedium = 128
 | 
											
												
													
														|  | 
 |  | +	SizeLarge  = 512
 | 
											
												
													
														|  |  )
 |  |  )
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  var (
 |  |  var (
 | 
											
												
													
														|  | -  ErrorNoChannel = errors.New("No suitable channels found.")
 |  | 
 | 
											
												
													
														|  | 
 |  | +	ErrorNoChannel = errors.New("No suitable channels found.")
 | 
											
												
													
														|  |  )
 |  |  )
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  type VBufferSet struct {
 |  |  type VBufferSet struct {
 | 
											
												
													
														|  | -  small chan []byte
 |  | 
 | 
											
												
													
														|  | -  medium chan []byte
 |  | 
 | 
											
												
													
														|  | -  large chan []byte
 |  | 
 | 
											
												
													
														|  | 
 |  | +	small  chan []byte
 | 
											
												
													
														|  | 
 |  | +	medium chan []byte
 | 
											
												
													
														|  | 
 |  | +	large  chan []byte
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  func NewVBufferSet() *VBufferSet {
 |  |  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
 |  | 
 | 
											
												
													
														|  | 
 |  | +	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) {
 |  |  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
 |  | 
 | 
											
												
													
														|  | 
 |  | +	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 {
 |  |  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
 |  | 
 | 
											
												
													
														|  | 
 |  | +	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) {
 |  |  func (bSet *VBufferSet) ReturnBuffer(buffer []byte) {
 | 
											
												
													
														|  | -  byteChan, err := bSet.detectBucket(len(buffer), true)
 |  | 
 | 
											
												
													
														|  | -  if err != nil {
 |  | 
 | 
											
												
													
														|  | -    return
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | -  select {
 |  | 
 | 
											
												
													
														|  | -    case byteChan <- buffer:
 |  | 
 | 
											
												
													
														|  | -    default:
 |  | 
 | 
											
												
													
														|  | -  }
 |  | 
 | 
											
												
													
														|  | 
 |  | +	byteChan, err := bSet.detectBucket(len(buffer), true)
 | 
											
												
													
														|  | 
 |  | +	if err != nil {
 | 
											
												
													
														|  | 
 |  | +		return
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  | 
 |  | +	select {
 | 
											
												
													
														|  | 
 |  | +	case byteChan <- buffer:
 | 
											
												
													
														|  | 
 |  | +	default:
 | 
											
												
													
														|  | 
 |  | +	}
 | 
											
												
													
														|  |  }
 |  |  }
 |