blob: b7da79df0d118a0aa86e4d4b0ede558f171a1c30 [file] [log] [blame]
// Copyright 2023 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package proxy
import (
"archive/zip"
"sync"
)
type modver struct {
Path string
Version string
}
// cache caches proxy info, mod and zip calls.
type cache struct {
mu sync.Mutex
infoCache map[modver]*VersionInfo
modCache map[modver][]byte
// One-element zip cache, to avoid a double download.
// See TestFetchAndUpdateStateCacheZip in internal/worker/fetch_test.go.
zipKey modver
zipReader *zip.Reader
}
func (c *cache) getInfo(modulePath, version string) *VersionInfo {
if c == nil {
return nil
}
c.mu.Lock()
defer c.mu.Unlock()
return c.infoCache[modver{Path: modulePath, Version: version}]
}
func (c *cache) putInfo(modulePath, version string, v *VersionInfo) {
if c == nil {
return
}
c.mu.Lock()
defer c.mu.Unlock()
if c.infoCache == nil {
c.infoCache = map[modver]*VersionInfo{}
}
c.infoCache[modver{Path: modulePath, Version: version}] = v
}
func (c *cache) getMod(modulePath, version string) []byte {
if c == nil {
return nil
}
c.mu.Lock()
defer c.mu.Unlock()
return c.modCache[modver{Path: modulePath, Version: version}]
}
func (c *cache) putMod(modulePath, version string, b []byte) {
if c == nil {
return
}
c.mu.Lock()
defer c.mu.Unlock()
if c.modCache == nil {
c.modCache = map[modver][]byte{}
}
c.modCache[modver{Path: modulePath, Version: version}] = b
}
func (c *cache) getZip(modulePath, version string) *zip.Reader {
if c == nil {
return nil
}
c.mu.Lock()
defer c.mu.Unlock()
if c.zipKey == (modver{Path: modulePath, Version: version}) {
return c.zipReader
}
return nil
}
func (c *cache) putZip(modulePath, version string, r *zip.Reader) {
if c == nil {
return
}
c.mu.Lock()
defer c.mu.Unlock()
c.zipKey = modver{Path: modulePath, Version: version}
c.zipReader = r
}