Using an LruCache instead of a HashMap for loaded pages in a tag

pmeunier
Dec 10, 2021, 1:50 PM
AETYXHGO4N5PURYZT7Z5UZDGLAN7CD6JESLFAASLYFEXZKWSFE7AC

Dependencies

  • [2] N3X5YP7P Adding tag/txn.rs, now that the parser allows it

Change contents

  • edit in libpijul/src/tag/txn.rs at line 3
    [2.98][2.98:148]()
    use std::collections::{hash_map::Entry, HashMap};
  • edit in libpijul/src/tag/txn.rs at line 4
    [2.170]
    [2.170]
    /// Size of the LRU cache.
    const CACHE_SIZE: usize = 1024;
  • replacement in libpijul/src/tag/txn.rs at line 34
    [2.788][2.788:856]()
    loaded: Mutex<HashMap<u64, Box<[u8; crate::tag::BLOCK_SIZE]>>>,
    [2.788]
    [2.856]
    loaded: Mutex<lru_cache::LruCache<u64, Box<[u8; crate::tag::BLOCK_SIZE]>>>,
  • replacement in libpijul/src/tag/txn.rs at line 53
    [2.1336][2.1336:1412]()
    pub fn new<P: AsRef<std::path::Path>>(p: P) -> Result<Self, TagError> {
    [2.1336]
    [2.1412]
    pub fn new<P: AsRef<std::path::Path>>(p: P, h: &Hash) -> Result<Self, TagError> {
  • replacement in libpijul/src/tag/txn.rs at line 57
    [2.1581][2.1581:1655]()
    let header: crate::tag::FileHeader = bincode::deserialize(&off)?;
    [2.1581]
    [2.1655]
    let header: crate::tag::FileHeader = bincode::deserialize(&off).map_err(TagError::BincodeDe)?;
    let mut ch = OpenTagFile {
    file,
    header
    };
    ch.check(h)?;
    ch.file.seek(SeekFrom::Start(off.len() as u64))?;
  • replacement in libpijul/src/tag/txn.rs at line 65
    [2.1723][2.1723:1777]()
    r: file,
    off: header.channel,
    [2.1723]
    [2.1777]
    r: ch.file,
    off: ch.header.channel,
  • replacement in libpijul/src/tag/txn.rs at line 69
    [2.1811][2.1811:1879]()
    header,
    loaded: Mutex::new(HashMap::new()),
    [2.1811]
    [2.1879]
    header: ch.header,
    loaded: Mutex::new(lru_cache::LruCache::new(CACHE_SIZE)),
  • replacement in libpijul/src/tag/txn.rs at line 85
    [2.2328][2.2328:2869]()
    let p = match self.loaded.lock().unwrap().entry(off_aligned) {
    Entry::Occupied(mut e) => unsafe {
    e.get_mut().as_mut_ptr().add((off - off_aligned) as usize)
    },
    Entry::Vacant(e) => {
    let mut buf = Box::new([0; crate::tag::BLOCK_SIZE]);
    self.s
    .lock()
    .unwrap()
    .decompress(&mut buf[..], off_aligned)?;
    unsafe { e.insert(buf).as_mut_ptr().add((off - off_aligned) as usize) }
    [2.2328]
    [2.2869]
    let mut l = self.loaded.lock().unwrap();
    let p = if let Some(p) = l.get_mut(&off_aligned) {
    unsafe {
    p.as_mut_ptr().add((off - off_aligned) as usize)
  • edit in libpijul/src/tag/txn.rs at line 90
    [2.2883]
    [2.2883]
    } else {
    let mut buf = Box::new([0; crate::tag::BLOCK_SIZE]);
    self.s
    .lock()
    .unwrap()
    .decompress(&mut buf[..], off_aligned)?;
    let p = unsafe {
    buf.as_mut_ptr().add((off - off_aligned) as usize)
    };
    l.insert(off_aligned, buf);
    p