@@ -103,51 +103,46 @@ func (r *pooledFlateReader) Close() error {
103
103
}
104
104
105
105
var (
106
- mu sync.RWMutex // guards compressor and decompressor maps
106
+ compressors sync.Map // map[uint16]Compressor
107
+ decompressors sync.Map // map[uint16]Decompressor
108
+ )
107
109
108
- compressors = map [uint16 ]Compressor {
109
- Store : func (w io.Writer ) (io.WriteCloser , error ) { return & nopCloser {w }, nil },
110
- Deflate : func (w io.Writer ) (io.WriteCloser , error ) { return newFlateWriter (w ), nil },
111
- }
110
+ func init () {
111
+ compressors .Store (Store , Compressor (func (w io.Writer ) (io.WriteCloser , error ) { return & nopCloser {w }, nil }))
112
+ compressors .Store (Deflate , Compressor (func (w io.Writer ) (io.WriteCloser , error ) { return newFlateWriter (w ), nil }))
112
113
113
- decompressors = map [uint16 ]Decompressor {
114
- Store : ioutil .NopCloser ,
115
- Deflate : newFlateReader ,
116
- }
117
- )
114
+ decompressors .Store (Store , Decompressor (ioutil .NopCloser ))
115
+ decompressors .Store (Deflate , Decompressor (newFlateReader ))
116
+ }
118
117
119
118
// RegisterDecompressor allows custom decompressors for a specified method ID.
120
119
// The common methods Store and Deflate are built in.
121
120
func RegisterDecompressor (method uint16 , dcomp Decompressor ) {
122
- mu .Lock ()
123
- defer mu .Unlock ()
124
-
125
- if _ , ok := decompressors [method ]; ok {
121
+ if _ , dup := decompressors .LoadOrStore (method , dcomp ); dup {
126
122
panic ("decompressor already registered" )
127
123
}
128
- decompressors [method ] = dcomp
129
124
}
130
125
131
126
// RegisterCompressor registers custom compressors for a specified method ID.
132
127
// The common methods Store and Deflate are built in.
133
128
func RegisterCompressor (method uint16 , comp Compressor ) {
134
- mu .Lock ()
135
- defer mu .Unlock ()
136
-
137
- if _ , ok := compressors [method ]; ok {
129
+ if _ , dup := compressors .LoadOrStore (method , comp ); dup {
138
130
panic ("compressor already registered" )
139
131
}
140
- compressors [method ] = comp
141
132
}
142
133
143
134
func compressor (method uint16 ) Compressor {
144
- mu .RLock ()
145
- defer mu .RUnlock ()
146
- return compressors [method ]
135
+ ci , ok := compressors .Load (method )
136
+ if ! ok {
137
+ return nil
138
+ }
139
+ return ci .(Compressor )
147
140
}
148
141
149
142
func decompressor (method uint16 ) Decompressor {
150
- mu .RLock ()
151
- defer mu .RUnlock ()
152
- return decompressors [method ]
143
+ di , ok := decompressors .Load (method )
144
+ if ! ok {
145
+ return nil
146
+ }
147
+ return di .(Decompressor )
153
148
}
0 commit comments