mirror of
https://github.com/fleetdm/fleet
synced 2026-05-14 20:48:35 +00:00
## Addresses #15999 - [x] Added/updated tests - [ ] Manual QA for all new/changed functionality --------- Co-authored-by: Jacob Shandling <jacob@fleetdm.com>
84 lines
2.1 KiB
Go
84 lines
2.1 KiB
Go
// Copyright (c) Facebook, Inc. and its affiliates.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package cvefeed
|
|
|
|
import (
|
|
"container/heap"
|
|
"time"
|
|
)
|
|
|
|
type evictionData struct {
|
|
key string // which key in Cache.data refers to it
|
|
index int // the index of item on the heap
|
|
access time.Time // last access time
|
|
}
|
|
|
|
// evictionQueue is a priority queue for LRU cache
|
|
type evictionQueue struct {
|
|
q evictionHeap
|
|
}
|
|
|
|
// pop pops next key to evict
|
|
func (eq *evictionQueue) pop() string {
|
|
if eq.q.Len() > 0 {
|
|
return heap.Pop(&eq.q).(*evictionData).key
|
|
}
|
|
return ""
|
|
}
|
|
|
|
// push pushes a key onto heap, returns the index item ended up at.
|
|
func (eq *evictionQueue) push(key string) int {
|
|
index := eq.q.Len()
|
|
ed := &evictionData{
|
|
key: key,
|
|
index: index,
|
|
access: time.Now(),
|
|
}
|
|
heap.Push(&eq.q, ed)
|
|
return ed.index
|
|
}
|
|
|
|
// touch updates the access time of the item at index, returns the new index of that item.
|
|
func (eq *evictionQueue) touch(index int) int {
|
|
ed := eq.q[index]
|
|
ed.access = time.Now()
|
|
heap.Fix(&eq.q, index)
|
|
return ed.index
|
|
}
|
|
|
|
// evictionHeap is a slice of evictionData that implements heap.Interface
|
|
type evictionHeap []*evictionData
|
|
|
|
func (eh evictionHeap) Len() int { return len(eh) }
|
|
|
|
func (eh evictionHeap) Less(i, j int) bool { return eh[i].access.Before(eh[j].access) }
|
|
|
|
func (eh evictionHeap) Swap(i, j int) {
|
|
eh[i], eh[j] = eh[j], eh[i]
|
|
eh[i].index, eh[j].index = i, j
|
|
}
|
|
|
|
func (eh *evictionHeap) Push(x interface{}) {
|
|
ed := x.(*evictionData)
|
|
ed.index = len(*eh)
|
|
*eh = append(*eh, ed)
|
|
}
|
|
|
|
func (eh *evictionHeap) Pop() interface{} {
|
|
old := *eh
|
|
ed := old[len(old)-1]
|
|
*eh = old[:len(old)-1]
|
|
return ed
|
|
}
|