123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- // Copyright (C) 2015 The Syncthing Authors.
- //
- // This Source Code Form is subject to the terms of the Mozilla Public
- // License, v. 2.0. If a copy of the MPL was not distributed with this file,
- // You can obtain one at https://mozilla.org/MPL/2.0/.
- package discover
- import (
- stdsync "sync"
- "time"
- "github.com/thejerf/suture/v4"
- "github.com/syncthing/syncthing/lib/protocol"
- )
- // A cachedFinder is a Finder with associated cache timeouts.
- type cachedFinder struct {
- Finder
- cacheTime time.Duration
- negCacheTime time.Duration
- cache *cache
- token *suture.ServiceToken
- }
- // An error may implement cachedError, in which case it will be interrogated
- // to see how long we should cache the error. This overrides the default
- // negative cache time.
- type cachedError interface {
- CacheFor() time.Duration
- }
- // A cache can be embedded wherever useful
- type cache struct {
- entries map[protocol.DeviceID]CacheEntry
- mut stdsync.Mutex
- }
- func newCache() *cache {
- return &cache{
- entries: make(map[protocol.DeviceID]CacheEntry),
- }
- }
- func (c *cache) Set(id protocol.DeviceID, ce CacheEntry) {
- c.mut.Lock()
- c.entries[id] = ce
- c.mut.Unlock()
- }
- func (c *cache) Get(id protocol.DeviceID) (CacheEntry, bool) {
- c.mut.Lock()
- ce, ok := c.entries[id]
- c.mut.Unlock()
- return ce, ok
- }
- func (c *cache) Cache() map[protocol.DeviceID]CacheEntry {
- c.mut.Lock()
- m := make(map[protocol.DeviceID]CacheEntry, len(c.entries))
- for k, v := range c.entries {
- m[k] = v
- }
- c.mut.Unlock()
- return m
- }
|