gzippool.go 903 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package main
  2. import (
  3. "compress/gzip"
  4. "io"
  5. "io/ioutil"
  6. "sync"
  7. )
  8. type gzipPool struct {
  9. mutex sync.Mutex
  10. top *gzipPoolEntry
  11. }
  12. type gzipPoolEntry struct {
  13. gz *gzip.Writer
  14. next *gzipPoolEntry
  15. }
  16. func newGzipPool(n int) *gzipPool {
  17. pool := new(gzipPool)
  18. for i := 0; i < n; i++ {
  19. pool.grow()
  20. }
  21. return pool
  22. }
  23. func (p *gzipPool) grow() {
  24. gz, err := gzip.NewWriterLevel(ioutil.Discard, conf.GZipCompression)
  25. if err != nil {
  26. logFatal("Can't init GZip compression: %s", err)
  27. }
  28. p.top = &gzipPoolEntry{
  29. gz: gz,
  30. next: p.top,
  31. }
  32. }
  33. func (p *gzipPool) Get(w io.Writer) *gzip.Writer {
  34. p.mutex.Lock()
  35. defer p.mutex.Unlock()
  36. if p.top == nil {
  37. p.grow()
  38. }
  39. gz := p.top.gz
  40. gz.Reset(w)
  41. p.top = p.top.next
  42. return gz
  43. }
  44. func (p *gzipPool) Put(gz *gzip.Writer) {
  45. p.mutex.Lock()
  46. defer p.mutex.Unlock()
  47. gz.Reset(ioutil.Discard)
  48. p.top = &gzipPoolEntry{gz: gz, next: p.top}
  49. }