16 releases
new 0.0.14 | Dec 11, 2024 |
---|---|
0.0.13 | Dec 5, 2024 |
0.0.12 | Oct 19, 2024 |
0.0.11 | Aug 31, 2024 |
0.0.4 | Jul 31, 2024 |
#72 in Caching
139 downloads per month
Used in 2 crates
(via encrypt_config)
25KB
382 lines
rom-cache
A rust crate to cache ROM in RAM like CPU caches RAM.
Explore the docs »
View Demo
·
Report Bug
·
Request Feature
Table of Contents
Import
[dependencies]
rom_cache = { version = "0.0.13" }
About The Project
A rust crate to cache ROM in memory like CPU caching RAM.
(Here, ROM is a misnomer, it actually means data stored in Secondary Storage, e.g. HDD, SSD, etc.)
Trait Cacheable
is provided to enable user define how to load
and store
data in Secondary Storage.
Cache
is the main entry of this crate, which consists of CacheGroup
s. And CacheGroup
consists of CacheLine
s.
Cache::get::<T>()
and Cache::get_mut::<T>()
are provided to retrieve data from Cache and storage. LRU is used to choose the CacheLine
for T
.
- get
- cache hit: return
CacheRef
- cache busy:
CacheError::Busy
, LRU-chosenCacheLine
is still being writting or reading so that unable to be evicted. - cache locked:
CacheError::Locked
, cannot readT
while writing.
- get_mut
- cache hit: return
CacheMut
, and dereferencingCacheMut
will setCacheLine
dirty. - cache busy:
CacheError::Busy
, cannot evict LRU-chosenCacheLine
which is still being used. - cache locked:
CacheError::Locked
, cannot writeT
while reading or writing.
Any dirty CacheLine
will be written back (Cacheable::store()
) to Secondary Storage when evicted or Cache
dropped.
Features
nightly
: enable#![feature(trait_upcasting)]
to simplify theCacheable
trait. (Nightly Rust is needed)
Built With
- Rust
- Miri (Testing)
- Loom (Concurrency Testing)
Usage
Example
# use rom_cache::Cache;
// e.g 2-way set associative cache (8 sets/groups), 16 cache lines in total
let cache: Cache<8, 2> = Default::default();
cache.get::<isize>().unwrap();
cache.get::<String>().unwrap();
{
let mut s = cache.get_mut::<String>().unwrap();
cache.get::<u64>().unwrap();
cache.get::<usize>().unwrap();
*s = "".to_string(); // set dirty
}
{
let s = cache.get::<String>().unwrap(); // other threads may evict `String` and it's stored,
// this will load it back
assert_eq!(*s, ""); // The `load` result is `""`
}
For more examples, please refer to the Tests, Example or Documentation
Changelog
todo
Roadmap
- allow concurrent access
- auto load when getting
- benchmark
Contributing
Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.
If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag "enhancement". Don't forget to give the project a star! Thanks again!
- Fork the Project
- Create your Feature Branch (
git checkout -b feature/AmazingFeature
) - Commit your Changes (
git commit -m 'Add some AmazingFeature'
) - Push to the Branch (
git push origin feature/AmazingFeature
) - Open a Pull Request
License
Distributed under the MIT License. See LICENSE.txt
for more information.
Contact
Louis - 836250617@qq.com
Project Link: https://github.com/kingwingfly/rom-cache
Dependencies
~0.3–24MB
~349K SLoC