buffer_pool.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package alloc
  2. import (
  3. "os"
  4. "strconv"
  5. "sync"
  6. )
  7. type Pool interface {
  8. Allocate() *Buffer
  9. Free(*Buffer)
  10. }
  11. type BufferPool struct {
  12. chain chan []byte
  13. allocator *sync.Pool
  14. }
  15. func NewBufferPool(bufferSize, poolSize uint32) *BufferPool {
  16. pool := &BufferPool{
  17. chain: make(chan []byte, poolSize),
  18. allocator: &sync.Pool{
  19. New: func() interface{} { return make([]byte, bufferSize) },
  20. },
  21. }
  22. for i := uint32(0); i < poolSize; i++ {
  23. pool.chain <- make([]byte, bufferSize)
  24. }
  25. return pool
  26. }
  27. func (p *BufferPool) Allocate() *Buffer {
  28. var b []byte
  29. select {
  30. case b = <-p.chain:
  31. default:
  32. b = p.allocator.Get().([]byte)
  33. }
  34. return CreateBuffer(b, p)
  35. }
  36. func (p *BufferPool) Free(buffer *Buffer) {
  37. rawBuffer := buffer.head
  38. if rawBuffer == nil {
  39. return
  40. }
  41. select {
  42. case p.chain <- rawBuffer:
  43. default:
  44. p.allocator.Put(rawBuffer)
  45. }
  46. }
  47. const (
  48. mediumBufferByteSize = 8 * 1024
  49. BufferSize = mediumBufferByteSize - defaultOffset
  50. largeBufferByteSize = 64 * 1024
  51. LargeBufferSize = largeBufferByteSize - defaultOffset
  52. PoolSizeEnvKey = "v2ray.buffer.size"
  53. )
  54. var (
  55. mediumPool *BufferPool
  56. //largePool *BufferPool
  57. )
  58. func init() {
  59. var size uint32 = 20
  60. sizeStr := os.Getenv(PoolSizeEnvKey)
  61. if len(sizeStr) > 0 {
  62. customSize, err := strconv.ParseUint(sizeStr, 10, 32)
  63. if err == nil {
  64. size = uint32(customSize)
  65. }
  66. }
  67. totalByteSize := size * 1024 * 1024
  68. mediumPool = NewBufferPool(mediumBufferByteSize, totalByteSize/mediumBufferByteSize)
  69. //largePool = NewBufferPool(largeBufferByteSize, totalByteSize/4/largeBufferByteSize)
  70. }