11package bucketscache
22
3+ import (
4+ "fmt"
5+ "sync"
6+ )
7+
38type BucketsCache struct {
4- buckets map [uint32 ][]uint32
5- bucketLimit int
6- Null uint32
9+ buckets map [uint32 ][]uint32
10+ bucketLimit int
11+ bucketsMutex * sync. RWMutex
712}
813
914func (c * BucketsCache ) Init (bucketLimit int ) {
1015 c .bucketLimit = bucketLimit
1116 c .buckets = make (map [uint32 ][]uint32 )
12- c .Null = 0
17+ c .bucketsMutex = new (sync. RWMutex )
1318}
1419
1520func (c * BucketsCache ) GetBucket (key uint32 ) []uint32 {
21+ c .bucketsMutex .RLock ()
22+ defer c .bucketsMutex .RUnlock ()
1623 return c .buckets [key ]
1724}
1825
19- func (c * BucketsCache ) GetBucketItem (key uint32 , index int ) uint32 {
26+ func (c * BucketsCache ) GetBucketItem (key uint32 , index int ) (uint32 , error ) {
27+ c .bucketsMutex .RLock ()
28+ defer c .bucketsMutex .RUnlock ()
2029 b , exists := c .buckets [key ]
2130 if ! exists {
22- return c . Null
31+ return 0 , NoSuchItem ( key , index )
2332 }
2433 if index >= len (b ) {
25- return c . Null
34+ return 0 , NoSuchItem ( key , index )
2635 }
27- return b [index ]
36+ return b [index ], nil
2837}
2938
3039func (c * BucketsCache ) AddBucketItem (key uint32 , value uint32 ) {
@@ -36,10 +45,14 @@ func (c *BucketsCache) ForceAddBucketItem(key uint32, value uint32) {
3645}
3746
3847func (c * BucketsCache ) addBucketItem (key uint32 , value uint32 , force bool ) {
48+ c .bucketsMutex .RLock ()
3949 b , exists := c .buckets [key ]
50+ c .bucketsMutex .RUnlock ()
4051 if ! exists {
52+ c .bucketsMutex .Lock ()
4153 c .buckets [key ] = make ([]uint32 , 0 , c .bucketLimit )
4254 b = c .buckets [key ]
55+ c .bucketsMutex .Unlock ()
4356 }
4457 if len (b ) >= c .bucketLimit {
4558 if force {
@@ -48,6 +61,12 @@ func (c *BucketsCache) addBucketItem(key uint32, value uint32, force bool) {
4861 return
4962 }
5063 } else {
64+ c .bucketsMutex .Lock ()
5165 c .buckets [key ] = append (b , value )
66+ c .bucketsMutex .Unlock ()
5267 }
5368}
69+
70+ func NoSuchItem (key uint32 , index int ) error {
71+ return fmt .Errorf ("no such item in cache at key: %d, index: %d" , key , index )
72+ }
0 commit comments