StoreBackend::backup_space(): add for statically allocated memory

This commit is contained in:
Astro 2020-12-11 19:54:49 +01:00
parent 0101a4f90a
commit 91d69474ed
3 changed files with 21 additions and 2 deletions

View File

@ -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()?;

View File

@ -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 []
}
} }

View File

@ -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> {