StoreBackend::backup_space(): add for statically allocated memory
This commit is contained in:
parent
0101a4f90a
commit
91d69474ed
13
src/lib.rs
13
src/lib.rs
@ -12,8 +12,9 @@ use iter::Iter;
|
|||||||
pub mod no_flash;
|
pub mod no_flash;
|
||||||
mod test;
|
mod test;
|
||||||
|
|
||||||
|
/// Backend interface for `Store`
|
||||||
pub trait StoreBackend {
|
pub trait StoreBackend {
|
||||||
type Data: Sized + AsRef<[u8]> + Clone;
|
type Data: Sized + AsRef<[u8]>;
|
||||||
|
|
||||||
/// Memory-mapped
|
/// Memory-mapped
|
||||||
fn data(&self) -> &Self::Data;
|
fn data(&self) -> &Self::Data;
|
||||||
@ -22,10 +23,17 @@ pub trait StoreBackend {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Error;
|
type Error;
|
||||||
|
/// erase flash
|
||||||
fn erase(&mut self) -> Result<(), Self::Error>;
|
fn erase(&mut self) -> Result<(), Self::Error>;
|
||||||
|
/// program flash
|
||||||
fn program(&mut self, offset: usize, payload: &[u8]) -> Result<(), Self::Error>;
|
fn program(&mut self, offset: usize, payload: &[u8]) -> Result<(), Self::Error>;
|
||||||
/// called after repeated `program()` invocations to allow for eg. cache flushing
|
/// called after repeated `program()` invocations to allow for eg. cache flushing
|
||||||
fn program_done(&mut self) {}
|
fn program_done(&mut self) {}
|
||||||
|
|
||||||
|
/// need for automatic compaction
|
||||||
|
///
|
||||||
|
/// leaves memory management to the implementer
|
||||||
|
fn backup_space(&self) -> &'static mut [u8];
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Simple Flash Key Value Store
|
/// Simple Flash Key Value Store
|
||||||
@ -114,7 +122,8 @@ impl<B: StoreBackend> Store<B> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn compact(&mut self) -> Result<(), Error<B::Error>> {
|
fn compact(&mut self) -> Result<(), Error<B::Error>> {
|
||||||
let old_data = self.backend.data().clone();
|
let old_data = self.backend.backup_space();
|
||||||
|
old_data.copy_from_slice(self.backend.data().as_ref());
|
||||||
|
|
||||||
self.erase()?;
|
self.erase()?;
|
||||||
|
|
||||||
|
@ -30,4 +30,8 @@ impl StoreBackend for NoFlash {
|
|||||||
fn program(&mut self, _: usize, _: &[u8]) -> Result<(), Self::Error> {
|
fn program(&mut self, _: usize, _: &[u8]) -> Result<(), Self::Error> {
|
||||||
Err(NoFlashError)
|
Err(NoFlashError)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn backup_space(&self) -> &'static mut [u8] {
|
||||||
|
&mut []
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
use crate::{Error, no_flash, Store, StoreBackend, WriteError};
|
use crate::{Error, no_flash, Store, StoreBackend, WriteError};
|
||||||
|
|
||||||
const SIZE: usize = 1024;
|
const SIZE: usize = 1024;
|
||||||
|
static mut BACKUP_SPACE: [u8; SIZE] = [0; SIZE];
|
||||||
|
|
||||||
pub struct TestBackend {
|
pub struct TestBackend {
|
||||||
data: [u8; SIZE],
|
data: [u8; SIZE],
|
||||||
@ -39,6 +40,11 @@ impl StoreBackend for TestBackend {
|
|||||||
self.data[offset..end].copy_from_slice(payload);
|
self.data[offset..end].copy_from_slice(payload);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fn backup_space(&self) -> &'static mut [u8] {
|
||||||
|
unsafe { &mut BACKUP_SPACE }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn make_store() -> Store<TestBackend> {
|
fn make_store() -> Store<TestBackend> {
|
||||||
|
Loading…
Reference in New Issue
Block a user