git_internal/internal/pack/
waitlist.rs

1use crate::hash::ObjectHash;
2use crate::internal::pack::cache_object::CacheObject;
3use dashmap::DashMap;
4
5/// Waitlist for Delta objects while the Base object is not ready.
6/// Easier and faster than Channels.
7#[derive(Default, Debug)]
8pub struct Waitlist {
9    //TODO Memory Control!
10    pub map_offset: DashMap<usize, Vec<CacheObject>>,
11    pub map_ref: DashMap<ObjectHash, Vec<CacheObject>>,
12}
13
14impl Waitlist {
15    pub fn new() -> Self {
16        Self::default()
17    }
18
19    pub fn insert_offset(&self, offset: usize, obj: CacheObject) {
20        self.map_offset.entry(offset).or_default().push(obj);
21    }
22
23    pub fn insert_ref(&self, hash: ObjectHash, obj: CacheObject) {
24        self.map_ref.entry(hash).or_default().push(obj);
25    }
26
27    /// Take objects out (get & remove)
28    /// <br> Return Vec::new() if None
29    pub fn take(&self, offset: usize, hash: ObjectHash) -> Vec<CacheObject> {
30        let mut res = Vec::new();
31        if let Some((_, vec)) = self.map_offset.remove(&offset) {
32            res.extend(vec);
33        }
34        if let Some((_, vec)) = self.map_ref.remove(&hash) {
35            res.extend(vec);
36        }
37        res
38    }
39}