| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- package main
- import (
- "compress/gzip"
- "io"
- "io/ioutil"
- "sync"
- )
- type gzipPool struct {
- mutex sync.Mutex
- top *gzipPoolEntry
- }
- type gzipPoolEntry struct {
- gz *gzip.Writer
- next *gzipPoolEntry
- }
- func newGzipPool(n int) *gzipPool {
- pool := new(gzipPool)
- for i := 0; i < n; i++ {
- pool.grow()
- }
- return pool
- }
- func (p *gzipPool) grow() {
- gz, err := gzip.NewWriterLevel(ioutil.Discard, conf.GZipCompression)
- if err != nil {
- logFatal("Can't init GZip compression: %s", err)
- }
- p.top = &gzipPoolEntry{
- gz: gz,
- next: p.top,
- }
- }
- func (p *gzipPool) Get(w io.Writer) *gzip.Writer {
- p.mutex.Lock()
- defer p.mutex.Unlock()
- if p.top == nil {
- p.grow()
- }
- gz := p.top.gz
- gz.Reset(w)
- p.top = p.top.next
- return gz
- }
- func (p *gzipPool) Put(gz *gzip.Writer) {
- p.mutex.Lock()
- defer p.mutex.Unlock()
- p.top = &gzipPoolEntry{gz: gz, next: p.top}
- }
|