aboutsummaryrefslogtreecommitdiff
path: root/libgo/go/archive/zip/register.go
diff options
context:
space:
mode:
Diffstat (limited to 'libgo/go/archive/zip/register.go')
-rw-r--r--libgo/go/archive/zip/register.go47
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)
}