diff options
Diffstat (limited to 'libgo/go/archive/zip/register.go')
-rw-r--r-- | libgo/go/archive/zip/register.go | 47 |
1 files changed, 21 insertions, 26 deletions
diff --git a/libgo/go/archive/zip/register.go b/libgo/go/archive/zip/register.go index 2e76386b1fd..51e9c3e4d4b 100644 --- a/libgo/go/archive/zip/register.go +++ b/libgo/go/archive/zip/register.go @@ -103,51 +103,46 @@ func (r *pooledFlateReader) Close() error { } var ( - mu sync.RWMutex // guards compressor and decompressor maps + compressors sync.Map // map[uint16]Compressor + decompressors sync.Map // map[uint16]Decompressor +) - compressors = map[uint16]Compressor{ - Store: func(w io.Writer) (io.WriteCloser, error) { return &nopCloser{w}, nil }, - Deflate: func(w io.Writer) (io.WriteCloser, error) { return newFlateWriter(w), nil }, - } +func init() { + compressors.Store(Store, Compressor(func(w io.Writer) (io.WriteCloser, error) { return &nopCloser{w}, nil })) + compressors.Store(Deflate, Compressor(func(w io.Writer) (io.WriteCloser, error) { return newFlateWriter(w), nil })) - decompressors = map[uint16]Decompressor{ - Store: ioutil.NopCloser, - Deflate: newFlateReader, - } -) + decompressors.Store(Store, Decompressor(ioutil.NopCloser)) + decompressors.Store(Deflate, Decompressor(newFlateReader)) +} // RegisterDecompressor allows custom decompressors for a specified method ID. // The common methods Store and Deflate are built in. func RegisterDecompressor(method uint16, dcomp Decompressor) { - mu.Lock() - defer mu.Unlock() - - if _, ok := decompressors[method]; ok { + if _, dup := decompressors.LoadOrStore(method, dcomp); dup { panic("decompressor already registered") } - decompressors[method] = dcomp } // RegisterCompressor registers custom compressors for a specified method ID. // The common methods Store and Deflate are built in. func RegisterCompressor(method uint16, comp Compressor) { - mu.Lock() - defer mu.Unlock() - - if _, ok := compressors[method]; ok { + if _, dup := compressors.LoadOrStore(method, comp); dup { panic("compressor already registered") } - compressors[method] = comp } func compressor(method uint16) Compressor { - mu.RLock() - defer mu.RUnlock() - return compressors[method] + ci, ok := compressors.Load(method) + if !ok { + return nil + } + return ci.(Compressor) } func decompressor(method uint16) Decompressor { - mu.RLock() - defer mu.RUnlock() - return decompressors[method] + di, ok := decompressors.Load(method) + if !ok { + return nil + } + return di.(Decompressor) } |