[pbs-devel] applied: [PATCH proxmox-backup] pbs-tools: LruCache: implement Drop
Wolfgang Bumiller
w.bumiller at proxmox.com
Thu Jan 20 11:30:04 CET 2022
applied, thanks
On Thu, Jan 20, 2022 at 11:16:08AM +0100, Dominik Csapak wrote:
> this fixes the leaked memory for the cache, as we had only pointers
> in the map/list which were freed, not the underlying chunks
>
> moves the 'clear' implementation out of the trait bounds so that
> Drop can reuse it
>
> this is used e.g. for file download from a pxar
>
> Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
> ---
> pbs-tools/src/lru_cache.rs | 24 ++++++++++++++++--------
> 1 file changed, 16 insertions(+), 8 deletions(-)
>
> diff --git a/pbs-tools/src/lru_cache.rs b/pbs-tools/src/lru_cache.rs
> index b1c0c6ac..fbd7673a 100644
> --- a/pbs-tools/src/lru_cache.rs
> +++ b/pbs-tools/src/lru_cache.rs
> @@ -100,9 +100,25 @@ pub struct LruCache<K, V> {
> _marker: PhantomData<Box<CacheNode<K, V>>>,
> }
>
> +impl<K, V> Drop for LruCache<K, V> {
> + fn drop (&mut self) {
> + self.clear();
> + }
> +}
> +
> // trivial: if our contents are Send, the whole cache is Send
> unsafe impl<K: Send, V: Send> Send for LruCache<K, V> {}
>
> +impl<K, V> LruCache<K, V> {
> + /// Clear all the entries from the cache.
> + pub fn clear(&mut self) {
> + // This frees only the HashMap with the node pointers.
> + self.map.clear();
> + // This frees the actual nodes and resets the list head and tail.
> + self.list.clear();
> + }
> +}
> +
> impl<K: std::cmp::Eq + std::hash::Hash + Copy, V> LruCache<K, V> {
> /// Create LRU cache instance which holds up to `capacity` nodes at once.
> pub fn new(capacity: usize) -> Self {
> @@ -115,14 +131,6 @@ impl<K: std::cmp::Eq + std::hash::Hash + Copy, V> LruCache<K, V> {
> }
> }
>
> - /// Clear all the entries from the cache.
> - pub fn clear(&mut self) {
> - // This frees only the HashMap with the node pointers.
> - self.map.clear();
> - // This frees the actual nodes and resets the list head and tail.
> - self.list.clear();
> - }
> -
> /// Insert or update an entry identified by `key` with the given `value`.
> /// This entry is placed as the most recently used node at the head.
> pub fn insert(&mut self, key: K, value: V) {
> --
> 2.30.2
More information about the pbs-devel
mailing list