diff options
author | 2023-01-06 10:16:09 +0000 | |
---|---|---|
committer | 2023-01-06 11:16:09 +0100 | |
commit | adbc87700a5bc7a95883ba5b9688d8b946a8db48 (patch) | |
tree | 6030ff70d3eb0b9a0b8fc7d5fca378a77033d546 /vendor/codeberg.org/gruf/go-cache | |
parent | [chore] Update/add license headers for 2023 (#1304) (diff) | |
download | gotosocial-adbc87700a5bc7a95883ba5b9688d8b946a8db48.tar.xz |
[chore] pull in latest go-cache, go-runners versions (#1306)
Signed-off-by: kim <grufwub@gmail.com>
Signed-off-by: kim <grufwub@gmail.com>
Diffstat (limited to 'vendor/codeberg.org/gruf/go-cache')
-rw-r--r-- | vendor/codeberg.org/gruf/go-cache/v3/result/cache.go | 22 | ||||
-rw-r--r-- | vendor/codeberg.org/gruf/go-cache/v3/result/key.go | 106 | ||||
-rw-r--r-- | vendor/codeberg.org/gruf/go-cache/v3/ttl/schedule.go | 8 |
3 files changed, 74 insertions, 62 deletions
diff --git a/vendor/codeberg.org/gruf/go-cache/v3/result/cache.go b/vendor/codeberg.org/gruf/go-cache/v3/result/cache.go index 6c50e60b1..91ca2255e 100644 --- a/vendor/codeberg.org/gruf/go-cache/v3/result/cache.go +++ b/vendor/codeberg.org/gruf/go-cache/v3/result/cache.go @@ -56,8 +56,8 @@ func New[Value any](lookups []Lookup, copy func(Value) Value, cap int) *Cache[Va c.lookups = make([]structKey, len(lookups)) for i, lookup := range lookups { - // Generate keyed field info for lookup - c.lookups[i] = genStructKey(lookup, t) + // Create keyed field info for lookup + c.lookups[i] = newStructKey(lookup, t) } // Create and initialize underlying cache @@ -159,7 +159,7 @@ func (c *Cache[Value]) Load(lookup string, load func() (Value, error), keyParts keyInfo := c.lookups.get(lookup) // Generate cache key string. - ckey := genKey(keyParts...) + ckey := keyInfo.genKey(keyParts) // Acquire cache lock c.cache.Lock() @@ -248,17 +248,17 @@ func (c *Cache[Value]) Store(value Value, store func() error) error { func (c *Cache[Value]) Has(lookup string, keyParts ...any) bool { var res result[Value] - // Get lookup key type by name. - keyType := c.lookups.get(lookup) + // Get lookup key info by name. + keyInfo := c.lookups.get(lookup) // Generate cache key string. - ckey := genKey(keyParts...) + ckey := keyInfo.genKey(keyParts) // Acquire cache lock c.cache.Lock() // Look for primary key for cache key - pkey, ok := keyType.pkeys[ckey] + pkey, ok := keyInfo.pkeys[ckey] if ok { // Fetch the result for primary key @@ -275,15 +275,15 @@ func (c *Cache[Value]) Has(lookup string, keyParts ...any) bool { // Invalidate will invalidate any result from the cache found under given lookup and key parts. func (c *Cache[Value]) Invalidate(lookup string, keyParts ...any) { - // Get lookup key type by name. - keyType := c.lookups.get(lookup) + // Get lookup key info by name. + keyInfo := c.lookups.get(lookup) // Generate cache key string. - ckey := genKey(keyParts...) + ckey := keyInfo.genKey(keyParts) // Look for primary key for cache key c.cache.Lock() - pkey, ok := keyType.pkeys[ckey] + pkey, ok := keyInfo.pkeys[ckey] c.cache.Unlock() if !ok { diff --git a/vendor/codeberg.org/gruf/go-cache/v3/result/key.go b/vendor/codeberg.org/gruf/go-cache/v3/result/key.go index b7e75b6b8..6be316c2b 100644 --- a/vendor/codeberg.org/gruf/go-cache/v3/result/key.go +++ b/vendor/codeberg.org/gruf/go-cache/v3/result/key.go @@ -1,6 +1,7 @@ package result import ( + "fmt" "reflect" "strings" "sync" @@ -51,10 +52,10 @@ func (sk structKeys) generate(a any) []cacheKey { buf.B = buf.B[:0] // Append each field value to buffer. - for _, idx := range sk[i].fields { - fv := v.Field(idx) + for _, field := range sk[i].fields { + fv := v.Field(field.index) fi := fv.Interface() - buf.B = mangler.Append(buf.B, fi) + buf.B = field.mangle(buf.B, fi) buf.B = append(buf.B, '.') } @@ -123,17 +124,58 @@ type structKey struct { // fields is a slice of runtime struct field // indices, of the fields encompassed by this key. - fields []int + + fields []structField // pkeys is a lookup of stored struct key values // to the primary cache lookup key (int64). pkeys map[string]int64 } -// genStructKey will generate a structKey{} information object for user-given lookup +type structField struct { + // index is the reflect index of this struct field. + index int + + // mangle is the mangler function for + // serializing values of this struct field. + mangle mangler.Mangler +} + +// genKey generates a cache key string for given key parts (i.e. serializes them using "go-mangler"). +func (sk structKey) genKey(parts []any) string { + // Check this expected no. key parts. + if len(parts) != len(sk.fields) { + panic(fmt.Sprintf("incorrect no. key parts provided: want=%d received=%d", len(parts), len(sk.fields))) + } + + // Acquire byte buffer + buf := getBuf() + defer putBuf(buf) + buf.Reset() + + // Encode each key part + for i, part := range parts { + buf.B = sk.fields[i].mangle(buf.B, part) + buf.B = append(buf.B, '.') + } + + // Drop last '.' + buf.Truncate(1) + + // Return string copy + return string(buf.B) +} + +// newStructKey will generate a structKey{} information object for user-given lookup // key information, and the receiving generic paramter's type information. Panics on error. -func genStructKey(lk Lookup, t reflect.Type) structKey { - var zeros []any +func newStructKey(lk Lookup, t reflect.Type) structKey { + var ( + sk structKey + zeros []any + ) + + // Set the lookup name + sk.name = lk.Name // Split dot-separated lookup to get // the individual struct field names @@ -142,8 +184,8 @@ func genStructKey(lk Lookup, t reflect.Type) structKey { panic("no key fields specified") } - // Pre-allocate slice of expected length - fields := make([]int, len(names)) + // Allocate the mangler and field indices slice. + sk.fields = make([]structField, len(names)) for i, name := range names { // Get field info for given name @@ -158,60 +200,30 @@ func genStructKey(lk Lookup, t reflect.Type) structKey { } // Set the runtime field index - fields[i] = ft.Index[0] + sk.fields[i].index = ft.Index[0] // Allocate new instance of field v := reflect.New(ft.Type) v = v.Elem() + // Fetch mangler for field type. + sk.fields[i].mangle = mangler.Get(ft.Type) + if !lk.AllowZero { // Append the zero value interface zeros = append(zeros, v.Interface()) } } - var zvalue string - if len(zeros) > 0 { // Generate zero value string - zvalue = genKey(zeros...) + sk.zero = sk.genKey(zeros) } - return structKey{ - name: lk.Name, - zero: zvalue, - fields: fields, - pkeys: make(map[string]int64), - } -} + // Allocate primary lookup map + sk.pkeys = make(map[string]int64) -// genKey generates a cache key for given key values. -func genKey(parts ...any) string { - if len(parts) == 0 { - // Panic to prevent annoying usecase - // where user forgets to pass lookup - // and instead only passes a key part, - // e.g. cache.Get("key") - // which then always returns false. - panic("no key parts provided") - } - - // Acquire byte buffer - buf := getBuf() - defer putBuf(buf) - buf.Reset() - - // Encode each key part - for _, part := range parts { - buf.B = mangler.Append(buf.B, part) - buf.B = append(buf.B, '.') - } - - // Drop last '.' - buf.Truncate(1) - - // Return string copy - return string(buf.B) + return sk } // isExported checks whether function name is exported. diff --git a/vendor/codeberg.org/gruf/go-cache/v3/ttl/schedule.go b/vendor/codeberg.org/gruf/go-cache/v3/ttl/schedule.go index 111de0757..a12b33ab9 100644 --- a/vendor/codeberg.org/gruf/go-cache/v3/ttl/schedule.go +++ b/vendor/codeberg.org/gruf/go-cache/v3/ttl/schedule.go @@ -6,15 +6,15 @@ import ( "codeberg.org/gruf/go-sched" ) -// scheduler is the global cache runtime scheduler -// for handling regular cache evictions. +// scheduler is the global cache runtime +// scheduler for handling cache evictions. var scheduler sched.Scheduler // schedule will given sweep routine to the global scheduler, and start global scheduler. func schedule(sweep func(time.Time), freq time.Duration) func() { if !scheduler.Running() { - // ensure running - _ = scheduler.Start() + // ensure sched running + _ = scheduler.Start(nil) } return scheduler.Schedule(sched.NewJob(sweep).Every(freq)) } |