//! Complete-key read-only block cache and pinned eviction guest probe. use super::*; use os_vfs_ro_cache::{Cache, Error, Key}; fn key(inode: u64, block: u64) -> Key { Key {volume: 1, mount_generation: 7, media_generation: 3, inode, block} } pub fn run(allocator: &mut memory::FrameAllocator) -> Result<(), &'static str> { let frames_before = allocator.remaining_pages(); let mut cache = Cache::new(); let first = key(2, 0); let second = key(2, 1); let third = key(3, 0); let fourth = key(4, 0); if cache.insert(first, [b'A'; 16]) != Ok(None) || cache.insert(second, [b'B'; 16]) != Ok(None) || cache.get(first) != Ok(Some([b'A'; 16])) || cache.insert(third, [b'C'; 16]) != Ok(Some(second)) || cache.get(second) != Ok(None) { return Err("k1595-lru"); } write_line("TURKOS/OS/K1595-CACHE: LRU=SECOND-EVICTED"); let stale_mount = Key {mount_generation: 8, ..first}; let changed_media = Key {media_generation: 4, ..first}; if cache.get(stale_mount) != Ok(None) || cache.get(changed_media) != Ok(None) || cache.get(first) != Ok(Some([b'A'; 16])) { return Err("k1595-key"); } write_line("TURKOS/OS/K1595-CACHE: GENERATION=MISS"); cache.pin(first).map_err(|_| "k1595-pin-first")?; cache.pin(third).map_err(|_| "k1595-pin-third")?; let before_pinned = cache; if cache.insert(fourth, [b'D'; 16]) != Err(Error::Busy) || cache.invalidate_mount(1, 7) != Err(Error::Busy) || cache != before_pinned { return Err("k1595-pinned"); } write_line("TURKOS/OS/K1595-CACHE: PINNED=RETAINED"); cache.unpin(third).map_err(|_| "k1595-unpin-third")?; if cache.insert(fourth, [b'D'; 16]) != Ok(Some(third)) || cache.get(first) != Ok(Some([b'A'; 16])) || cache.get(fourth) != Ok(Some([b'D'; 16])) { return Err("k1595-evict"); } write_line("TURKOS/OS/K1595-CACHE: UNPINNED=EVICTED"); cache.unpin(first).map_err(|_| "k1595-unpin-first")?; if cache.invalidate_mount(1, 7) != Ok(2) || cache.get(first) != Ok(None) || cache.get(fourth) != Ok(None) || allocator.remaining_pages() != frames_before { return Err("k1595-invalidate"); } write_line("TURKOS/OS/K1595-CACHE: INVALIDATE=EMPTY FRAMES=UNCHANGED"); Ok(()) }