Make VmReader's several methods accept &mut self

This commit is contained in:
jiangjianfeng
2025-03-24 03:35:28 +00:00
committed by Qingsong Chen
parent 9872adaa71
commit 0e1c660225
9 changed files with 58 additions and 56 deletions

View File

@ -167,7 +167,7 @@ mod test {
BioType::Read => segment BioType::Read => segment
.inner_segment() .inner_segment()
.writer() .writer()
.write(&mut self.blocks.reader().skip(current_offset)), .write(self.blocks.reader().skip(current_offset)),
BioType::Write => self BioType::Write => self
.blocks .blocks
.writer() .writer()

View File

@ -56,7 +56,9 @@ impl TxBuffer {
} }
pub fn writer(&self) -> VmWriter<'_, Infallible> { pub fn writer(&self) -> VmWriter<'_, Infallible> {
self.dma_stream.writer().unwrap().limit(self.nbytes) let mut writer = self.dma_stream.writer().unwrap();
writer.limit(self.nbytes);
writer
} }
fn sync(&self) { fn sync(&self) {
@ -110,21 +112,18 @@ impl RxBuffer {
self.segment self.segment
.sync(self.header_len..self.header_len + self.packet_len) .sync(self.header_len..self.header_len + self.packet_len)
.unwrap(); .unwrap();
self.segment let mut reader = self.segment.reader().unwrap();
.reader() reader.skip(self.header_len).limit(self.packet_len);
.unwrap() reader
.skip(self.header_len)
.limit(self.packet_len)
} }
pub fn buf(&self) -> VmReader<'_, Infallible> { pub fn buf(&self) -> VmReader<'_, Infallible> {
self.segment self.segment
.sync(0..self.header_len + self.packet_len) .sync(0..self.header_len + self.packet_len)
.unwrap(); .unwrap();
self.segment let mut reader = self.segment.reader().unwrap();
.reader() reader.limit(self.header_len + self.packet_len);
.unwrap() reader
.limit(self.header_len + self.packet_len)
} }
pub const fn buf_len(&self) -> usize { pub const fn buf_len(&self) -> usize {

View File

@ -236,12 +236,16 @@ impl DmaSegment {
pub fn reader(&self) -> Result<VmReader<'_, Infallible>, ostd::Error> { pub fn reader(&self) -> Result<VmReader<'_, Infallible>, ostd::Error> {
let offset = self.start_addr - self.dma_stream.daddr(); let offset = self.start_addr - self.dma_stream.daddr();
Ok(self.dma_stream.reader()?.skip(offset).limit(self.size)) let mut reader = self.dma_stream.reader()?;
reader.skip(offset).limit(self.size);
Ok(reader)
} }
pub fn writer(&self) -> Result<VmWriter<'_, Infallible>, ostd::Error> { pub fn writer(&self) -> Result<VmWriter<'_, Infallible>, ostd::Error> {
let offset = self.start_addr - self.dma_stream.daddr(); let offset = self.start_addr - self.dma_stream.daddr();
Ok(self.dma_stream.writer()?.skip(offset).limit(self.size)) let mut writer = self.dma_stream.writer()?;
writer.skip(offset).limit(self.size);
Ok(writer)
} }
pub fn sync(&self, byte_range: Range<usize>) -> Result<(), ostd::Error> { pub fn sync(&self, byte_range: Range<usize>) -> Result<(), ostd::Error> {

View File

@ -151,7 +151,8 @@ impl ConsoleDevice {
let callbacks = self.callbacks.read(); let callbacks = self.callbacks.read();
for callback in callbacks.iter() { for callback in callbacks.iter() {
let reader = self.receive_buffer.reader().unwrap().limit(len as usize); let mut reader = self.receive_buffer.reader().unwrap();
reader.limit(len as usize);
callback(reader); callback(reader);
} }
drop(callbacks); drop(callbacks);

View File

@ -71,18 +71,20 @@ impl SegmentSlice {
/// Gets a reader for the slice. /// Gets a reader for the slice.
pub fn reader(&self) -> VmReader<'_, Infallible> { pub fn reader(&self) -> VmReader<'_, Infallible> {
self.inner let mut reader = self.inner.reader();
.reader() reader
.skip(self.start_paddr() - self.inner.start_paddr()) .skip(self.start_paddr() - self.inner.start_paddr())
.limit(self.nbytes()) .limit(self.nbytes());
reader
} }
/// Gets a writer for the slice. /// Gets a writer for the slice.
pub fn writer(&self) -> VmWriter<'_, Infallible> { pub fn writer(&self) -> VmWriter<'_, Infallible> {
self.inner let mut writer = self.inner.writer();
.writer() writer
.skip(self.start_paddr() - self.inner.start_paddr()) .skip(self.start_paddr() - self.inner.start_paddr())
.limit(self.nbytes()) .limit(self.nbytes());
writer
} }
fn start_frame_index(&self) -> usize { fn start_frame_index(&self) -> usize {

View File

@ -415,18 +415,16 @@ impl InitStackReader<'_> {
return_errno_with_message!(Errno::EACCES, "Page not accessible"); return_errno_with_message!(Errno::EACCES, "Page not accessible");
}; };
let mut arg_ptr_reader = frame.reader().skip(read_offset - page_base_addr); let mut arg_ptr_reader = frame.reader();
arg_ptr_reader.skip(read_offset - page_base_addr);
for _ in 0..argc { for _ in 0..argc {
let arg = { let arg = {
let arg_ptr = arg_ptr_reader.read_val::<Vaddr>()?; let arg_ptr = arg_ptr_reader.read_val::<Vaddr>()?;
let arg_offset = arg_ptr let arg_offset = arg_ptr
.checked_sub(page_base_addr) .checked_sub(page_base_addr)
.ok_or_else(|| Error::with_message(Errno::EINVAL, "arg_ptr is corrupted"))?; .ok_or_else(|| Error::with_message(Errno::EINVAL, "arg_ptr is corrupted"))?;
let mut arg_reader = frame let mut arg_reader = frame.reader().to_fallible();
.reader() arg_reader.skip(arg_offset).limit(MAX_ARG_LEN);
.skip(arg_offset)
.to_fallible()
.limit(MAX_ARG_LEN);
arg_reader.read_cstring()? arg_reader.read_cstring()?
}; };
argv.push(arg); argv.push(arg);
@ -457,7 +455,8 @@ impl InitStackReader<'_> {
return_errno_with_message!(Errno::EACCES, "Page not accessible"); return_errno_with_message!(Errno::EACCES, "Page not accessible");
}; };
let mut envp_ptr_reader = frame.reader().skip(read_offset - page_base_addr); let mut envp_ptr_reader = frame.reader();
envp_ptr_reader.skip(read_offset - page_base_addr);
for _ in 0..MAX_ENVP_NUMBER { for _ in 0..MAX_ENVP_NUMBER {
let env = { let env = {
let envp_ptr = envp_ptr_reader.read_val::<Vaddr>()?; let envp_ptr = envp_ptr_reader.read_val::<Vaddr>()?;
@ -469,11 +468,8 @@ impl InitStackReader<'_> {
let envp_offset = envp_ptr let envp_offset = envp_ptr
.checked_sub(page_base_addr) .checked_sub(page_base_addr)
.ok_or_else(|| Error::with_message(Errno::EINVAL, "envp is corrupted"))?; .ok_or_else(|| Error::with_message(Errno::EINVAL, "envp is corrupted"))?;
let mut envp_reader = frame let mut envp_reader = frame.reader().to_fallible();
.reader() envp_reader.skip(envp_offset).limit(MAX_ENV_LEN);
.skip(envp_offset)
.to_fallible()
.limit(MAX_ENV_LEN);
envp_reader.read_cstring()? envp_reader.read_cstring()?
}; };
envp.push(env); envp.push(env);

View File

@ -262,7 +262,8 @@ impl<T: Pod, R: Deref<Target = RingBuffer<T>>> Producer<T, R> {
debug_assert!(tail < rb.capacity); debug_assert!(tail < rb.capacity);
let segment_offset = tail * Self::T_SIZE; let segment_offset = tail * Self::T_SIZE;
let mut writer = rb.segment.writer().skip(segment_offset); let mut writer = rb.segment.writer();
writer.skip(segment_offset);
writer.write_val(&item).unwrap(); writer.write_val(&item).unwrap();
rb.advance_tail(tail, 1); rb.advance_tail(tail, 1);
@ -317,14 +318,17 @@ impl<R: Deref<Target = RingBuffer<u8>>> Producer<u8, R> {
let tail = rb.tail(); let tail = rb.tail();
let write_len = if tail + write_len > rb.capacity { let write_len = if tail + write_len > rb.capacity {
// Write into two separate parts // Write into two separate parts
let mut writer = rb.segment.writer().skip(tail).limit(rb.capacity - tail); let mut writer = rb.segment.writer();
writer.skip(tail).limit(rb.capacity - tail);
let mut len = reader.read(&mut writer)?; let mut len = reader.read(&mut writer)?;
let mut writer = rb.segment.writer().limit(write_len - (rb.capacity - tail)); let mut writer = rb.segment.writer();
writer.limit(write_len - (rb.capacity - tail));
len += reader.read(&mut writer)?; len += reader.read(&mut writer)?;
len len
} else { } else {
let mut writer = rb.segment.writer().skip(tail).limit(write_len); let mut writer = rb.segment.writer();
writer.skip(tail).limit(write_len);
reader.read(&mut writer)? reader.read(&mut writer)?
}; };
@ -359,7 +363,8 @@ impl<T: Pod, R: Deref<Target = RingBuffer<T>>> Consumer<T, R> {
debug_assert!(head < rb.capacity); debug_assert!(head < rb.capacity);
let segment_offset = head * Self::T_SIZE; let segment_offset = head * Self::T_SIZE;
let mut reader = rb.segment.reader().skip(segment_offset); let mut reader = rb.segment.reader();
reader.skip(segment_offset);
let item = reader.read_val::<T>().unwrap(); let item = reader.read_val::<T>().unwrap();
rb.advance_head(head, 1); rb.advance_head(head, 1);
@ -413,14 +418,17 @@ impl<R: Deref<Target = RingBuffer<u8>>> Consumer<u8, R> {
let head = rb.head(); let head = rb.head();
let read_len = if head + read_len > rb.capacity { let read_len = if head + read_len > rb.capacity {
// Read from two separate parts // Read from two separate parts
let mut reader = rb.segment.reader().skip(head).limit(rb.capacity - head); let mut reader = rb.segment.reader();
reader.skip(head).limit(rb.capacity - head);
let mut len = writer.write(&mut reader)?; let mut len = writer.write(&mut reader)?;
let mut reader = rb.segment.reader().limit(read_len - (rb.capacity - head)); let mut reader = rb.segment.reader();
reader.limit(read_len - (rb.capacity - head));
len += writer.write(&mut reader)?; len += writer.write(&mut reader)?;
len len
} else { } else {
let mut reader = rb.segment.reader().skip(head).limit(read_len); let mut reader = rb.segment.reader();
reader.skip(head).limit(read_len);
writer.write(&mut reader)? writer.write(&mut reader)?
}; };

View File

@ -305,23 +305,15 @@ impl<Dma: AsRef<DmaStream>> DmaStreamSlice<Dma> {
/// Returns a reader to read data from it. /// Returns a reader to read data from it.
pub fn reader(&self) -> Result<VmReader<Infallible>, Error> { pub fn reader(&self) -> Result<VmReader<Infallible>, Error> {
let stream_reader = self let mut stream_reader = self.stream.as_ref().reader()?;
.stream stream_reader.skip(self.offset).limit(self.len);
.as_ref()
.reader()?
.skip(self.offset)
.limit(self.len);
Ok(stream_reader) Ok(stream_reader)
} }
/// Returns a writer to write data into it. /// Returns a writer to write data into it.
pub fn writer(&self) -> Result<VmWriter<Infallible>, Error> { pub fn writer(&self) -> Result<VmWriter<Infallible>, Error> {
let stream_writer = self let mut stream_writer = self.stream.as_ref().writer()?;
.stream stream_writer.skip(self.offset).limit(self.len);
.as_ref()
.writer()?
.skip(self.offset)
.limit(self.len);
Ok(stream_writer) Ok(stream_writer)
} }
} }

View File

@ -629,7 +629,7 @@ impl<Fallibility> VmReader<'_, Fallibility> {
/// Limits the length of remaining data. /// Limits the length of remaining data.
/// ///
/// This method ensures the post condition of `self.remain() <= max_remain`. /// This method ensures the post condition of `self.remain() <= max_remain`.
pub const fn limit(mut self, max_remain: usize) -> Self { pub const fn limit(&mut self, max_remain: usize) -> &mut Self {
if max_remain < self.remain() { if max_remain < self.remain() {
// SAFETY: the new end is less than the old end. // SAFETY: the new end is less than the old end.
unsafe { self.end = self.cursor.add(max_remain) }; unsafe { self.end = self.cursor.add(max_remain) };
@ -643,7 +643,7 @@ impl<Fallibility> VmReader<'_, Fallibility> {
/// # Panics /// # Panics
/// ///
/// If `nbytes` is greater than `self.remain()`, then the method panics. /// If `nbytes` is greater than `self.remain()`, then the method panics.
pub fn skip(mut self, nbytes: usize) -> Self { pub fn skip(&mut self, nbytes: usize) -> &mut Self {
assert!(nbytes <= self.remain()); assert!(nbytes <= self.remain());
// SAFETY: the new cursor is less than or equal to the end. // SAFETY: the new cursor is less than or equal to the end.
@ -893,7 +893,7 @@ impl<Fallibility> VmWriter<'_, Fallibility> {
/// Limits the length of available space. /// Limits the length of available space.
/// ///
/// This method ensures the post condition of `self.avail() <= max_avail`. /// This method ensures the post condition of `self.avail() <= max_avail`.
pub const fn limit(mut self, max_avail: usize) -> Self { pub const fn limit(&mut self, max_avail: usize) -> &mut Self {
if max_avail < self.avail() { if max_avail < self.avail() {
// SAFETY: the new end is less than the old end. // SAFETY: the new end is less than the old end.
unsafe { self.end = self.cursor.add(max_avail) }; unsafe { self.end = self.cursor.add(max_avail) };
@ -907,7 +907,7 @@ impl<Fallibility> VmWriter<'_, Fallibility> {
/// # Panics /// # Panics
/// ///
/// If `nbytes` is greater than `self.avail()`, then the method panics. /// If `nbytes` is greater than `self.avail()`, then the method panics.
pub fn skip(mut self, nbytes: usize) -> Self { pub fn skip(&mut self, nbytes: usize) -> &mut Self {
assert!(nbytes <= self.avail()); assert!(nbytes <= self.avail());
// SAFETY: the new cursor is less than or equal to the end. // SAFETY: the new cursor is less than or equal to the end.