pool.go 553 B

12345678910111213141516171819202122232425262728293031323334353637
  1. package tango
  2. import (
  3. "sync"
  4. "reflect"
  5. )
  6. type pool struct {
  7. size int
  8. tp reflect.Type
  9. pool reflect.Value
  10. cur int
  11. lock sync.Mutex
  12. }
  13. func newPool(size int, tp reflect.Type) *pool {
  14. return &pool{
  15. size: size,
  16. cur: 0,
  17. pool: reflect.MakeSlice(reflect.SliceOf(tp), size, size),
  18. tp: reflect.SliceOf(tp),
  19. }
  20. }
  21. func (p *pool) New() reflect.Value {
  22. p.lock.Lock()
  23. defer func() {
  24. p.cur++
  25. p.lock.Unlock()
  26. }()
  27. if p.cur == p.pool.Len() {
  28. p.pool = reflect.MakeSlice(p.tp, p.size, p.size)
  29. p.cur = 0
  30. }
  31. return p.pool.Index(p.cur).Addr()
  32. }