@@ -43,7 +43,7 @@ type singleSourceCache interface {
4343 getVersionsFor (Revision ) ([]UnpairedVersion , bool )
4444
4545 // Gets all the version pairs currently known to the cache.
46- getAllVersions () []PairedVersion
46+ getAllVersions () ( []PairedVersion , bool )
4747
4848 // Get the revision corresponding to the given unpaired version.
4949 getRevisionFor (UnpairedVersion ) (Revision , bool )
@@ -61,9 +61,10 @@ type singleSourceCache interface {
6161}
6262
6363type singleSourceCacheMemory struct {
64- mut sync.RWMutex // protects all maps
64+ mut sync.RWMutex // protects all fields
6565 infos map [ProjectAnalyzerInfo ]map [Revision ]projectInfo
6666 ptrees map [Revision ]pkgtree.PackageTree
67+ vList []PairedVersion // replaced, never modified
6768 vMap map [UnpairedVersion ]Revision
6869 rMap map [Revision ][]UnpairedVersion
6970}
@@ -136,13 +137,14 @@ func (c *singleSourceCacheMemory) getPackageTree(r Revision) (pkgtree.PackageTre
136137
137138func (c * singleSourceCacheMemory ) setVersionMap (versionList []PairedVersion ) {
138139 c .mut .Lock ()
140+ c .vList = versionList
139141 // TODO(sdboyer) how do we handle cache consistency here - revs that may
140142 // be out of date vis-a-vis the ptrees or infos maps?
141143 for r := range c .rMap {
142144 c .rMap [r ] = nil
143145 }
144146
145- c .vMap = make (map [UnpairedVersion ]Revision )
147+ c .vMap = make (map [UnpairedVersion ]Revision , len ( versionList ) )
146148
147149 for _ , pv := range versionList {
148150 u , r := pv .Unpair (), pv .Revision ()
@@ -167,15 +169,17 @@ func (c *singleSourceCacheMemory) getVersionsFor(r Revision) ([]UnpairedVersion,
167169 return versionList , has
168170}
169171
170- func (c * singleSourceCacheMemory ) getAllVersions () []PairedVersion {
171- if len ( c . vMap ) == 0 {
172- return nil
173- }
174- vlist := make ([] PairedVersion , 0 , len ( c . vMap ))
175- for v , r := range c . vMap {
176- vlist = append ( vlist , v . Pair ( r ))
172+ func (c * singleSourceCacheMemory ) getAllVersions () ( []PairedVersion , bool ) {
173+ c . mut . Lock ()
174+ vList := c . vList
175+ c . mut . Unlock ()
176+
177+ if vList == nil {
178+ return nil , false
177179 }
178- return vlist
180+ cp := make ([]PairedVersion , len (vList ))
181+ copy (cp , vList )
182+ return cp , true
179183}
180184
181185func (c * singleSourceCacheMemory ) getRevisionFor (uv UnpairedVersion ) (Revision , bool ) {
0 commit comments