...
1 package restful
2
3
4
5
6
7 import (
8 "compress/gzip"
9 "compress/zlib"
10 )
11
12
13
14
15 type BoundedCachedCompressors struct {
16 gzipWriters chan *gzip.Writer
17 gzipReaders chan *gzip.Reader
18 zlibWriters chan *zlib.Writer
19 writersCapacity int
20 readersCapacity int
21 }
22
23
24 func NewBoundedCachedCompressors(writersCapacity, readersCapacity int) *BoundedCachedCompressors {
25 b := &BoundedCachedCompressors{
26 gzipWriters: make(chan *gzip.Writer, writersCapacity),
27 gzipReaders: make(chan *gzip.Reader, readersCapacity),
28 zlibWriters: make(chan *zlib.Writer, writersCapacity),
29 writersCapacity: writersCapacity,
30 readersCapacity: readersCapacity,
31 }
32 for ix := 0; ix < writersCapacity; ix++ {
33 b.gzipWriters <- newGzipWriter()
34 b.zlibWriters <- newZlibWriter()
35 }
36 for ix := 0; ix < readersCapacity; ix++ {
37 b.gzipReaders <- newGzipReader()
38 }
39 return b
40 }
41
42
43 func (b *BoundedCachedCompressors) AcquireGzipWriter() *gzip.Writer {
44 var writer *gzip.Writer
45 select {
46 case writer, _ = <-b.gzipWriters:
47 default:
48
49 writer = newGzipWriter()
50 }
51 return writer
52 }
53
54
55
56 func (b *BoundedCachedCompressors) ReleaseGzipWriter(w *gzip.Writer) {
57
58 if len(b.gzipWriters) < b.writersCapacity {
59 b.gzipWriters <- w
60 }
61 }
62
63
64 func (b *BoundedCachedCompressors) AcquireGzipReader() *gzip.Reader {
65 var reader *gzip.Reader
66 select {
67 case reader, _ = <-b.gzipReaders:
68 default:
69
70 reader = newGzipReader()
71 }
72 return reader
73 }
74
75
76
77 func (b *BoundedCachedCompressors) ReleaseGzipReader(r *gzip.Reader) {
78
79 if len(b.gzipReaders) < b.readersCapacity {
80 b.gzipReaders <- r
81 }
82 }
83
84
85 func (b *BoundedCachedCompressors) AcquireZlibWriter() *zlib.Writer {
86 var writer *zlib.Writer
87 select {
88 case writer, _ = <-b.zlibWriters:
89 default:
90
91 writer = newZlibWriter()
92 }
93 return writer
94 }
95
96
97
98 func (b *BoundedCachedCompressors) ReleaseZlibWriter(w *zlib.Writer) {
99
100 if len(b.zlibWriters) < b.writersCapacity {
101 b.zlibWriters <- w
102 }
103 }
104
View as plain text