pool.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package handler
  2. import (
  3. "sync"
  4. "github.com/bjdgyc/anylink/base"
  5. "github.com/bjdgyc/anylink/sessdata"
  6. )
  7. // 不允许直接修改
  8. // [6] => PType
  9. var plHeader = []byte{
  10. 'S', 'T', 'F', 1,
  11. 0x00, 0x00, /* Length */
  12. 0x00, /* Type */
  13. 0x00, /* Unknown */
  14. }
  15. var plPool = sync.Pool{
  16. New: func() interface{} {
  17. b := make([]byte, BufferSize)
  18. pl := sessdata.Payload{
  19. LType: sessdata.LTypeIPData,
  20. PType: 0x00,
  21. Data: b,
  22. }
  23. // fmt.Println("plPool-init", len(pl.Data), cap(pl.Data))
  24. return &pl
  25. },
  26. }
  27. func getPayload() *sessdata.Payload {
  28. pl := plPool.Get().(*sessdata.Payload)
  29. return pl
  30. }
  31. func putPayload(pl *sessdata.Payload) {
  32. // 错误数据丢弃
  33. if cap(pl.Data) != BufferSize {
  34. base.Warn("payload cap is err", cap(pl.Data))
  35. return
  36. }
  37. pl.LType = sessdata.LTypeIPData
  38. pl.PType = 0x00
  39. pl.Data = pl.Data[:BufferSize]
  40. plPool.Put(pl)
  41. }
  42. var bytePool = sync.Pool{
  43. New: func() interface{} {
  44. b := make([]byte, BufferSize)
  45. // fmt.Println("bytePool-init")
  46. return &b
  47. },
  48. }
  49. func getByteZero() *[]byte {
  50. b := bytePool.Get().(*[]byte)
  51. *b = (*b)[:0]
  52. return b
  53. }
  54. func getByteFull() *[]byte {
  55. b := bytePool.Get().(*[]byte)
  56. return b
  57. }
  58. func putByte(b *[]byte) {
  59. *b = (*b)[:BufferSize]
  60. bytePool.Put(b)
  61. }
  62. // 长度 34 小对象
  63. var byte34Pool = sync.Pool{
  64. New: func() interface{} {
  65. b := make([]byte, 34)
  66. return &b
  67. },
  68. }
  69. func getByte34() *[]byte {
  70. b := byte34Pool.Get().(*[]byte)
  71. return b
  72. }
  73. func putByte34(b *[]byte) {
  74. *b = (*b)[:34]
  75. byte34Pool.Put(b)
  76. }