bufferset.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package io
  2. import(
  3. "errors"
  4. )
  5. const (
  6. SizeSmall = 16
  7. SizeMedium = 128
  8. SizeLarge = 512
  9. )
  10. var (
  11. ErrorNoChannel = errors.New("No suitable channels found.")
  12. )
  13. type VBufferSet struct {
  14. small chan []byte
  15. medium chan []byte
  16. large chan []byte
  17. }
  18. func NewVBufferSet() *VBufferSet {
  19. bSet := new(VBufferSet)
  20. bSet.small = make(chan []byte, 128)
  21. bSet.medium = make(chan []byte, 128)
  22. bSet.large = make(chan []byte, 128)
  23. return bSet
  24. }
  25. func (bSet *VBufferSet) detectBucket(size int, strict bool) (chan []byte, error) {
  26. if strict {
  27. if size == SizeSmall {
  28. return bSet.small, nil
  29. } else if size == SizeMedium {
  30. return bSet.medium, nil
  31. } else if size == SizeLarge {
  32. return bSet.large, nil
  33. }
  34. } else {
  35. if size <= SizeSmall {
  36. return bSet.small, nil
  37. } else if size <= SizeMedium {
  38. return bSet.medium, nil
  39. } else if size <= SizeLarge {
  40. return bSet.large, nil
  41. }
  42. }
  43. return nil, ErrorNoChannel
  44. }
  45. func (bSet *VBufferSet) FetchBuffer(minSize int) []byte {
  46. var buffer []byte
  47. byteChan, err := bSet.detectBucket(minSize, false)
  48. if err != nil {
  49. return make([]byte, minSize)
  50. }
  51. select {
  52. case buffer = <- byteChan:
  53. default:
  54. buffer = make([]byte, minSize)
  55. }
  56. return buffer
  57. }
  58. func (bSet *VBufferSet) ReturnBuffer(buffer []byte) {
  59. byteChan, err := bSet.detectBucket(len(buffer), true)
  60. if err != nil {
  61. return
  62. }
  63. select {
  64. case byteChan <- buffer:
  65. default:
  66. }
  67. }