This commit is contained in:
parent
3e5f05e634
commit
0af6b5283d
@ -27,7 +27,7 @@
|
|||||||
//! assert_eq!(read_bytes, 4);
|
//! assert_eq!(read_bytes, 4);
|
||||||
//! assert_eq!(read_buf[0], 42);
|
//! assert_eq!(read_buf[0], 42);
|
||||||
//! // Modify the stored data
|
//! // Modify the stored data
|
||||||
//! let res = local_pool.update(&addr, |buf| {
|
//! let res = local_pool.modify(&addr, |buf| {
|
||||||
//! buf[0] = 12;
|
//! buf[0] = 12;
|
||||||
//! });
|
//! });
|
||||||
//! assert!(res.is_ok());
|
//! assert!(res.is_ok());
|
||||||
@ -211,27 +211,32 @@ pub trait PoolProvider {
|
|||||||
/// be used to access the data stored in the pool
|
/// be used to access the data stored in the pool
|
||||||
fn add(&mut self, data: &[u8]) -> Result<StoreAddr, StoreError>;
|
fn add(&mut self, data: &[u8]) -> Result<StoreAddr, StoreError>;
|
||||||
|
|
||||||
/// The provider should attempt to reserve a free memory block with the appropriate size and
|
/// The provider should attempt to reserve a free memory block with the appropriate size first.
|
||||||
/// then return a mutable reference to it. Yields a [StoreAddr] which can be used to access
|
/// It then executes a user-provided closure and passes a mutable reference to that memory
|
||||||
/// the data stored in the pool
|
/// block to the closure. This allows the user to write data to the memory block.
|
||||||
|
/// The function should yield a [StoreAddr] which can be used to access the data stored in the
|
||||||
|
/// pool.
|
||||||
fn free_element<W: FnMut(&mut [u8])>(
|
fn free_element<W: FnMut(&mut [u8])>(
|
||||||
&mut self,
|
&mut self,
|
||||||
len: usize,
|
len: usize,
|
||||||
writer: W,
|
writer: W,
|
||||||
) -> Result<StoreAddr, StoreError>;
|
) -> Result<StoreAddr, StoreError>;
|
||||||
|
|
||||||
/// Modify data added previously using a given [StoreAddr] by yielding a mutable reference
|
/// Modify data added previously using a given [StoreAddr]. The provider should use the store
|
||||||
/// to it
|
/// address to determine if a memory block exists for that address. If it does, it should
|
||||||
fn update<U: FnMut(&mut [u8])>(
|
/// call the user-provided closure and pass a mutable reference to the memory block
|
||||||
|
/// to the closure. This allows the user to modify the memory block.
|
||||||
|
fn modify<U: FnMut(&mut [u8])>(
|
||||||
&mut self,
|
&mut self,
|
||||||
addr: &StoreAddr,
|
addr: &StoreAddr,
|
||||||
updater: U,
|
updater: U,
|
||||||
) -> Result<(), StoreError>;
|
) -> Result<(), StoreError>;
|
||||||
|
|
||||||
/// Read data by yielding a read-only reference given a [StoreAddr]
|
/// The provider should copy the data from the memory block to the user-provided buffer if
|
||||||
|
/// it exists.
|
||||||
fn read(&self, addr: &StoreAddr, buf: &mut [u8]) -> Result<usize, StoreError>;
|
fn read(&self, addr: &StoreAddr, buf: &mut [u8]) -> Result<usize, StoreError>;
|
||||||
|
|
||||||
/// Delete data inside the pool given a [StoreAddr]
|
/// Delete data inside the pool given a [StoreAddr].
|
||||||
fn delete(&mut self, addr: StoreAddr) -> Result<(), StoreError>;
|
fn delete(&mut self, addr: StoreAddr) -> Result<(), StoreError>;
|
||||||
fn has_element_at(&self, addr: &StoreAddr) -> Result<bool, StoreError>;
|
fn has_element_at(&self, addr: &StoreAddr) -> Result<bool, StoreError>;
|
||||||
|
|
||||||
@ -324,7 +329,7 @@ impl<'a, MemProvider: PoolProvider> PoolRwGuard<'a, MemProvider> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn update<U: FnMut(&mut [u8])>(&mut self, updater: &mut U) -> Result<(), StoreError> {
|
pub fn update<U: FnMut(&mut [u8])>(&mut self, updater: &mut U) -> Result<(), StoreError> {
|
||||||
self.guard.pool.update(&self.guard.addr, updater)
|
self.guard.pool.modify(&self.guard.addr, updater)
|
||||||
}
|
}
|
||||||
|
|
||||||
delegate!(
|
delegate!(
|
||||||
@ -532,7 +537,7 @@ mod alloc_mod {
|
|||||||
Ok(addr.into())
|
Ok(addr.into())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update<U: FnMut(&mut [u8])>(
|
fn modify<U: FnMut(&mut [u8])>(
|
||||||
&mut self,
|
&mut self,
|
||||||
addr: &StoreAddr,
|
addr: &StoreAddr,
|
||||||
mut updater: U,
|
mut updater: U,
|
||||||
@ -712,7 +717,7 @@ mod tests {
|
|||||||
{
|
{
|
||||||
// Verify that the slot is free by trying to get a reference to it
|
// Verify that the slot is free by trying to get a reference to it
|
||||||
local_pool
|
local_pool
|
||||||
.update(&addr, &mut |buf: &mut [u8]| {
|
.modify(&addr, &mut |buf: &mut [u8]| {
|
||||||
buf[0] = 0;
|
buf[0] = 0;
|
||||||
buf[1] = 0x42;
|
buf[1] = 0x42;
|
||||||
})
|
})
|
||||||
@ -911,22 +916,22 @@ mod tests {
|
|||||||
let addr2 = local_pool.add(&test_buf_2).expect("Adding data failed");
|
let addr2 = local_pool.add(&test_buf_2).expect("Adding data failed");
|
||||||
let addr3 = local_pool.add(&test_buf_3).expect("Adding data failed");
|
let addr3 = local_pool.add(&test_buf_3).expect("Adding data failed");
|
||||||
local_pool
|
local_pool
|
||||||
.update(&addr0, |buf| {
|
.modify(&addr0, |buf| {
|
||||||
assert_eq!(buf, test_buf_0);
|
assert_eq!(buf, test_buf_0);
|
||||||
})
|
})
|
||||||
.expect("Modifying data failed");
|
.expect("Modifying data failed");
|
||||||
local_pool
|
local_pool
|
||||||
.update(&addr1, |buf| {
|
.modify(&addr1, |buf| {
|
||||||
assert_eq!(buf, test_buf_1);
|
assert_eq!(buf, test_buf_1);
|
||||||
})
|
})
|
||||||
.expect("Modifying data failed");
|
.expect("Modifying data failed");
|
||||||
local_pool
|
local_pool
|
||||||
.update(&addr2, |buf| {
|
.modify(&addr2, |buf| {
|
||||||
assert_eq!(buf, test_buf_2);
|
assert_eq!(buf, test_buf_2);
|
||||||
})
|
})
|
||||||
.expect("Modifying data failed");
|
.expect("Modifying data failed");
|
||||||
local_pool
|
local_pool
|
||||||
.update(&addr3, |buf| {
|
.modify(&addr3, |buf| {
|
||||||
assert_eq!(buf, test_buf_3);
|
assert_eq!(buf, test_buf_3);
|
||||||
})
|
})
|
||||||
.expect("Modifying data failed");
|
.expect("Modifying data failed");
|
||||||
|
@ -104,7 +104,7 @@ impl TmFunnelStatic {
|
|||||||
let mut pool_guard = shared_pool.write().expect("Locking TM pool failed");
|
let mut pool_guard = shared_pool.write().expect("Locking TM pool failed");
|
||||||
let mut tm_copy = Vec::new();
|
let mut tm_copy = Vec::new();
|
||||||
pool_guard
|
pool_guard
|
||||||
.update(&addr, |buf| {
|
.modify(&addr, |buf| {
|
||||||
let zero_copy_writer = PusTmZeroCopyWriter::new(buf, MIN_CDS_FIELD_LEN)
|
let zero_copy_writer = PusTmZeroCopyWriter::new(buf, MIN_CDS_FIELD_LEN)
|
||||||
.expect("Creating TM zero copy writer failed");
|
.expect("Creating TM zero copy writer failed");
|
||||||
self.common.apply_packet_processing(zero_copy_writer);
|
self.common.apply_packet_processing(zero_copy_writer);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user